読者です 読者をやめる 読者になる 読者になる

改めて、ハロプロの(音楽的な)良さについて語ろうと思う。

アイドル ハロプロ

ハロー!プロジェクトの音楽的な良さについて、最も的確に表現してるのはプロデューサー・つんく♂自身が語ったこのコメントだろう。

僕が手がけるハロープロジェクトは、一見よくあるJ-POPと見せかけておいて、中身は音楽ファンの魂を掴んで離さない、マニアックな要素にあると思 っています 。
この、本気な部分がなくなったら、ただのその辺のアイドルサウンドと同じ。
音楽的に何か濃い部分が、今のハロプロオタクの皆さんの心に知らぬ間にある種のポイズン状態として染みこんでおり、禁断症状が現れ、また聞きたく なる、見たくなる、現場に行きたくなる、というような症状に出ているんだと思います。
ラーメンでいう“秘伝のタレ”がつんくイズム。 このタレ部分を元に、いろんなジャンルの音楽を投影し、個性豊かなハロープロジェクトのメンバーが歌うことによって、パッと華やかな見栄えになっ て、老若男女受け入れやすい、そういうサウンドになってるんじゃないかなって思います。


モーニング娘。 『LOVEマシーン』 (MV)

ハロプロとはまさにこの通りで、一聴すると普通のJ-POPに聴こえる。音楽が好きな人はかなりしっかり作られていることにも気付くかもしれない。 しかし同時に何かひっかかりを、つんくが言う「何か濃い部分」を感じずにはいられない。

例えばモーニング娘。の最大のヒット曲「LOVEマシーン」は、「不景気な日本」と「恋愛」を歌った大衆的なポップソングに聴こえるが、派手なディスコファンクサウンドで、ど頭の歌詞が「あんたにゃ」という奇妙さ。
そもそも「つんく♂」「シャ乱Q」という文字列が違和感とともに入ってくる。

そして、よく聞けばこの曲がEarth,Wind & FireやJackson5を元ネタに作られてることも分かる。これがつんくの言う「ポイズン」となってリスナーを虜にしていく。 

この地球の平和を本気で願ってるんだよ!


モーニング娘。 『この地球の平和を本気で願ってるんだよ!』 (Another Ver.)

個人的に最も毒に侵されたのは、モーニング娘。2011年のシングル「この地球の平和を本気で願ってるんだよ!」。おそらく元ネタはQuincy Jones愛のコリーダ」で80'sのディスコサウンド。
「試験勉強した日も きのう寝ちゃったと言っちゃおう」「スキな人は居るけど 絶対教えない」と、きて「この世界の平和を本気で願ってる」という、世界の平和と私の恋がリンクするセカイ系的な歌詞。
MVビデオはメンバーが宇宙でファラオのドレスを着て踊る、"アフロ・フューチャリズム"的モチーフ。

それを個性的かつ実力のあるメンバーが歌いこなし、さらには歌詞にそのパートを歌うメンバーの名前が入る小ネタもありライブでは盛り上がり、この大団円感。


この地球の平和を本気で願ってるんだよ! (2011 LIVE)

つんくイズムと「赤羽橋ファンク」

スカッとMy Heart


モーニング娘。'15『スカッとMy Heart』(Morning Musume。'15[Refresh My Heart]) (Promotion Edit)

ハロプロ楽曲の中で、ファンクテイストを盛り込んだ作品は、ファンの間で“赤羽橋ファンク”と呼ばれている。

スカッとMy Heart』は2015年のシングル曲。
これこそ普通のJ-POPましてアイドルサウンドと一線を画したハロプロ楽曲。シンプルなコードにグルービーなブラスとカッティングギター、「スカッとMy Heart」で「ほめまくりだよparadice」「寂しいparadice」、MVはなぜかディスコで海兵の衣装、ダンスも意味不明だがこのダサさがハロプロイズムであり、とにかくかっこいい。

The 摩天楼ショー


モーニング娘。- The 摩天楼ショー (Dance Shot Ver.)

7, 80年代のファンクミュージックをベースにつんくのメロディーと歌詞がハマって、歌えて踊れるメンバーが歌いこの完成度、こんな曲は他にない。

ロマンスの途中


Juice=Juice 『ロマンスの途中』 [Romance is on its way] (MV)

宮本佳林ちゃんさんには誰もがひれ伏す他ない。

つんく後のハロプロ

2015年以後、つんくハロー!プロジェクトの総合プロデューサーを退いたことにより結果的に多くのミュージシャンがハロプロに関わることになり、星部ショウなど新人が素晴らしい楽曲を作っている。

大器晩成


アンジュルム『大器晩成』 (ANGERME[A Late Bloomer]) (Dance promotion edit)

泥舟だったスマイレージを蘇らせた中島卓偉の名曲。

チョット愚直に!猪突猛進


こぶしファクトリー『チョット愚直に!猪突猛進』(Magnolia Factory [Foolishly Honest! Impulsive Actions!]) (Promotion Edit)

ヒャダイン×鈴木俊介の赤羽橋ファンク。

泡沫サタデーナイト!


モーニング娘。'16『泡沫サタデーナイト!』(Morning Musume。'16[Ephemeral Saturday Night]) (Promotion Edit)

f:id:aminaura:20170210155432j:plain

2016年、印象に残ったアイドルソングベスト20 (11位〜20位)

11位 『RUN and RUN』 lyrical school

スマホジャックMV。

vimeo.com

花火シンクロMVもよかった。

サマーファンデーション/lyrical school【Sync with fireworks MV】#SummerFoundation - YouTube

12位 『次々続々アンジュルム

作詞:児玉雨子 作曲・編曲:平田祥一郎

www.youtube.com

13位『ゼッテーアナーキー私立恵比寿中学

名盤「穴空」から。

www.youtube.com

14位 「君の知らない物語」アイドルネッサンス

次のアルバムが楽しみ。

www.youtube.com

15位 『夢幻クライマックス』℃-ute

作詞・作曲:大森靖子 編曲:大久保薫

www.youtube.com

解散発表した℃-ute大森靖子の初提供曲。

絶対無双の女子力で、最強で、セクシーで、女として誰も勝負する気にもならないような、 かっこいい℃-uteが大好きです。 なので、踊りも歌も香りもオーラも顔面も、全てのレベルアップしまくった武器をフル活用 できるような曲をつくりたいと思いました。 例えば女性として、何もかもを得ても感じてしまう渇望を楽曲で描ければ、まだみたことのない彼女達の顔がみれるのでは…!と奮闘したので、この曲が、最後まで貧欲に成長し続ける ℃-uteのガソリンになることができれば幸いです。 解散が楽曲完成後に決まったので、歌詞を描きなおしました。 隠しコマンド的に、メンバーの名前も入っているのでみつけてくださると嬉しいです。 別れの歌ですが、クライマックスに向けての加速装置です。 魂だけ側において、強く生きていこう!と、私は大好きなメンバーがハロプロを卒業しても なお、がんばるモチベーションをもらい続けています。 こんな風に、永遠に良き方向に未来を運んでくれる彼女たちの煌めきに感謝して。

大森靖子

16位 『KARATE』BABYMETAL

www.youtube.com

YUIMETALのちょこっとLOVEがおすすめ。

www.youtube.com

17位『そうじゃない』 モーニング娘。'16

作詞:つんく 作曲:つんく 編曲:平田祥一郎

つんくにしか書けないやつ。

www.youtube.com

18位 『Dream Road~心が躍り出してる~』Juice=Juice

作詞:つんく 作曲:つんく 編曲:江上浩太郎

アンジュルム次々続々』といい、EDMは終わってるけどアイドルEDMはこれから始まりそう。

www.youtube.com

19位 『雨と涙と乙女とたい焼き』乙女新党

作詞:高橋久美子(ex.チャットモンチ―) 作曲:日高央(THE STARBEMS/ex.BEAT CRUSADERS) 編曲:ヤマモトショウ(ex.ふぇのたす

解散発表した乙女新党

www.youtube.com

思えば、中3の冬から 「乙女新党」としてアイドル活動をはじめて 4年になります。 私の青春そのもである乙女新党が解散しても 「乙女新党は私のなかでも不滅です!みんな大好きです!」 今まで応援してきてくれた党員の方々とともに この幕はひきますが、 次の高橋優里花もどうぞよろしくお願いいたします!

高橋優里花

20位 Peach sugar snow 私キミに恋してる

作詞・作曲 小林清美 編曲 長谷泰宏

山梨の桃をPRしながら全曲ウイスパーボイスで歌うグループ、Peach sugar snow

www.youtube.com

2016年、印象に残ったアイドルソングベスト20 (1位〜10位)

メジャーインディーズ問わず印象に残った20曲

1位 『チョット愚直に!猪突猛進こぶしファクトリー

作詞・作曲:前山田健一 編曲:鈴木俊介

1月発売、鈴木俊介アレンジ、ヒャダインハロプロつんくリスペクト、赤羽橋ファンク。

www.youtube.com

同時リリースシングルのダンス☆マンとの対談もかなり面白い。

www.youtube.com

2位 『サイレントマジョリティー』 欅坂46

作詞 秋元康 作曲 バグベア

曲、映像、制服、ダンス、アートワーク全て揃った名曲J-POP。 2020年に向けて再開発まっただ中の渋谷駅、東急東横線改札口跡でのMV、渋谷川での『ラブ&ポップ』オマージュぽいジャケットが特に良い。

www.youtube.com

3位 『KEEP ON 上昇志向!!』Juice=Juice

作詞・作曲:前山田健一 編曲:ダンス☆マン

ヒャダイン×ダンス☆マン。 チョット愚直に!と曲構成はかなり似てるけど良いので3位。 あからさまな元ネタもブラスアレンジも良い。

www.youtube.com

Juice=Juiceは全員歌えてレコーディングが面白い。

www.youtube.com

4位 『 参枚目のタフガキ』私立恵比寿中学

作詞・作曲:前山田健一 編曲:CMJK

エビ中の間違いなく過去最高アルバム「穴空」から。 「ゼッテーアナーキ」、まんま乃木坂46の「全力ランナー」も素晴らしいんだけど、あえてアルバムの最後に収録されたこの曲です。

タイトルはUnderworldの「弐番目のタフガキ(second toughest in the infants)」から。 イントロはBorn Slippyっぽい。 変な詞に本気の曲作り、お金をかけたガチアルバムの最後にこの曲を持ってこれるのがエビ中の良さだと思う。

www.youtube.com

vimeo.com

www.sonymusic.co.jp

5位 「Savior」Especia

「堀江系ガールズグルーブ」という肩書で、衣装は大阪のおばちゃん風。洗練されたネオソウル、80年代フュージョンを20歳前後の普通の子たちがやっていたEspecia。 今年から上京して発足当時10人いたのが2人になり、新人ブラジル人が加入して、完全別グループに。 そんなEspeciaのニューアルバム『Mirage』から。 PVはSuchmos、Yogee New Wavesも手がける、yahyel、dutch_tokyo(山田健人)。 とにかくかっこいい。

www.youtube.com

6位 『泡沫サタデーナイト!モーニング娘。'16

作詞・作曲:津野米咲  編曲:鈴木俊介

ハロオタ、津野米咲(赤い公園)の初提供曲。 良くも悪くもハロプロつんくに縛られまくってる、けど良い曲。

www.youtube.com

7位 Lil Tomte / 校庭カメラガールツヴァイ

名前は略してコウテカ、オウテカっぽい名前にしようと決められた。 2014年から(当時は校庭カメラガール)から始まったが、とにかくメンバーが辞める、グループ名が変わる。 そしてとうとう今年限りで解散を発表、ラストアルバム"Night on Verse"からこの曲「Lil Tomte」。 クラブミュージックベースとラップで曲はずっとかっこよかったので終わらないで欲しかった。

www.youtube.com

8位 夢みるアドレセンス 『おしえてシュレディンガー

作詞・作曲: 志磨 遼平(ドレズコーズ)

www.youtube.com

「ふわふわ!」で、『SEXY BOY~そよ風に寄り添って~』を思い出した。

www.youtube.com

9位 僕だけのハッピーエンド 3776

説明不要の富士山ご当地アイドル3776。

知らない方はとりあえず1stアルバム (3776を聴かない理由があるとすれば)を聴こう。

ototoy.jp

そんな3776が新宿LOFTで行ったワンマンライブで、1stアルバムの曲をほぼやらずに、もともと一人なのにソロデビュー発表をして、さらに3776新メンバー募集をした時に歌った曲。

www.youtube.com

10位 『ひゃくぱーせんと』 生ハムと焼うどん

作詞 東理紗 作曲 東理紗

www.youtube.com

aminaura.hatenablog.com

Functional Swift 4章 "Map Filter Reduce" まとめ

Swift iOS

引数に関数を取る関数を高階関数と呼びます。本章ではSwiftの標準ライブラリに実装されている高階関数を紹介します。

Map, Generic

Int型の配列を受け取り、全ての要素に1を加えて返す関数はfor文を使って簡単に書くことができます。

func incrementArray(xs: [Int]) -> [Int] {
    var result: [Int] = []
    for x in xs {
        result.append(x + 1)
    }
    return result
}

全ての要素を2倍にする関数も同様に書くことができるでしょう。

しかし、これらの関数をより汎用性のあるものにするためには、配列の各要素をとって計算し、Int型を返す関数を第二引数として受けとる必要があります。

func computeIntArray(xs: [Int], transform: Int -> Int) -> [Int] {
    var result: [Int] = []
    for x in xs {
        result.append(transform(x))
    }
    return result
}

しかし、このコードはまだ最も柔軟であるとは言えません。 例えば、配列の各要素を偶数であるか判定し、真偽値の値を配列に入れて返したい場合はどうすれば良いでしょうか。

この問題を解決してくれるのがジェネリクスです。

func genericComputeArray<T>(xs: [Int], transform: Int -> T) -> [T] {
    var result: [T] = []
    for x in xs {
        result.append(transform(x))
    }
    return result
}

これで任意の型で動作する関数を書くことができました。

この関数はさらに抽象化することができます。入力される配列は[Int]である必要はありません。

func map<Element, T>(xs: [Element], transform: Element -> T) -> [T] {
    var result: [T] = []
    for x in xs {
        result.append(transform(x))
    }
    return result
}

グローバルレベルでmap関数を定義するのではなく、Arrayの拡張として定義することでSwiftにうまくフィットします。

extension Array {
    func map<T>(transform: Element -> T) -> [T] {
        var result: [T] = []
        for x in self {
            result.append(transform(x))
        }
        return result
    }
}

map関数はSwiftの標準ライブラリに含まれているので自分で実装する必要はありませんが、map関数はやろうと思えば簡単に実装できることは示したのです。

Filter

あるディレクトリにこんなファイルがあるとします。

let exampleFiles = ["README.md", "HelloWorld.swift", "FlappyBird.swift"]

この中からSwiftファイルだけを取り出したい場合、シンプルな配列で書くことができます。

func getSwiftFiles(files: [String]) -> [String] {
    var result: [String] = []
    for file in files {
        if file.hasSuffix(".swift") {
            result.append(file)
        }
    }
    return result
}

これを抽象化するとFilter関数ができます。

extension Array {
    func filter(includElement: Element -> Bool) -> [Element] {
        var result: [Element] = []
        for x in self where includElement(x) {
            result.append(x)
        }
        return result
    }
}

Reduce

配列内の合計を計算する関数を作るのは簡単です。

func sum(xs: [Int]) -> Int {
    var result: Int = 0
    for x in xs {
        result += x
    }
    return result
}

抽象化してReduce関数ができます。

extension Array {
    func reduce<T>(initial: T, combine: (T, Element) -> T) -> T {
        var result = initial
        for x in self {
            result = combine(result, x)
        }
        return result
    }
}

Putting It All Together

締めとして、map, filter, reduceを使ったささやかな例を紹介します。

都市名と人口を持つ構造体があります。

struct City {
    let name: String
    let population: Int
}

都市をいくつか定義します。

let paris = City(name: "Paris", population: 2241)
let madrid = City(name: "Madrid", population: 3165)
let amsterdam = City(name: "Amsterdam", population: 827)
let berlin = City(name: "Berlin", population: 3562)

let cities = [paris, madrid, amsterdam, berlin]

ここで、100万人以上の人口を持つ都市を人口と一緒に出力したいと思います。

まず、人口の単位を返還するヘルパー関数を定義します。

extension City {
    func cityByScalingPopulation() -> City {
        return City(name: name, population: population * 1000)
    }
}

ここで本章で紹介したすべてのパーツを使って、次のようなコードが書けます。

cities.filter { $0.population > 1000 }
    .map { $0.cityByScalingPopulation() }
    .reduce("") { result, c in
        result + "\n" + "\(c.name): \(c.population)"
    }
Paris: 2241000
Madrid: 3165000
Berlin: 3562000

Swift標準ライブラリの持つmap, filter, reduceをうまくチェーンできました。

Functional Swift 3章 "Wrapping Core Image" まとめ

iOS Swift

この章ではCore ImageをfunctionalにラッピングするAPIを構築することで、より実戦的に高階関数と関数合成を利用する方法を学びます。

Filter型

typealias Filter = CIImage -> CIImage

オリジナルの let filter = CIFilter(name: "CIVignette") などのkey値で初期化するCIFilterをカプセル化するためにFilter型を関数として定義。

フィルタの構築

Filter型を定義したので、個別のFilterを定義していく

全て func myFilter("パラメータ") -> Filter の形

Blur

func blur(radius: Double) -> Filter {
        return { image in
            let parameters = [
                kCIInputRadiusKey: radius,
                kCIInputImageKey: image
            ]
            guard let filter = CIFilter(name: "CIGaussianBlur", withInputParameters: parameters) else { fatalError() }
            guard let outputImage = filter.outputImage else { fatalError() }
            return outputImage
        }
    }

引数はぼかしの半径のみです。 CIImage型のimageをとり、新しいCIImageを返す関数(先ほど定義したFilter(CIImage -> CIImage))を返します。 同じパターンで様々なフィルタ関数を定義できます。

Chrome

func chrome() -> Filter {
        return { image in
            let parameters = [
                kCIInputImageKey: image
            ]
            guard let filter = CIFilter(name: "CIPhotoEffectChrome", withInputParameters: parameters) else { fatalError() }
            guard let outputImage = filter.outputImage else { fatalError() }
            return outputImage
        }
    }

*1

フィルタを合成

ここまで作成したぼかしとクロームのフィルタ関数を合成していきます。

let url = NSURL(string: "http://www.objc.io/images/covers/16.jpg")
let image = CIImage(contentsOfURL: url!)!
        
let blurredImage = blur(5.0)(image)
let chromedImage = chrome()(blurredImage)

一度ブラーをかけたimageに新たにクロームフィルタをかけて画像を生成しています。 もちろん一つにまとめることもできますが、括弧が増え途端に読めなくなってしまいます。

let result = chrome()(blur(5.0)(image))

そこで、カスタムオペレーションを定義することで読みやすさを保つことができます。

infix operator >>> { associativity left }

func >>>(filter1: Filter, filter2: Filter) -> Filter {
    return { image in filter2(filter1(image)) }
}


let filter = chrome() >>> blur(5.0)
let result = filter(image)

高階関数、関数合成を使用することによって、安全性、モジュール性、明瞭性を保ったAPIをデザインすることができます。

*1:本書では別のフィルタ関数を使っていますが、複雑になるので引数なしのChromeに変更

SwiftBondでAPIからデータバインディング

iOS Swift

データバインディングのライブラリとしてBondを初めてつかってみました。

github.com

いろいろやってみるうちに、MVVM風にViewModelからデータをバインディングする設計が良い感じで気に入りました

サンプルコードはgithubを参照

github.com

実装

iTuens search apiを使って、アーティストと曲名をTableViewに表示します

Model

import SwiftyJSON

struct List {

    let trackName: String
    let artistName: String
    
    init(json: JSON) {
        self.trackName = json["trackName"].stringValue
        self.artistName = json["artistName"].stringValue
    }

}

View Model

モデルをObservableArrayで保持し、apiコールで更新します。

import UIKit
import Bond
import Alamofire
import SwiftyJSON

class ListViewModel {

    internal let lists = ObservableArray<List>()
    
    private let urlString = "https://itunes.apple.com/search"
    private let parameters = ["term":"Swift",
                              "entity":"musicTrack",
                              "limit":"15"]

    internal func reload() {
        Alamofire.request(.GET, urlString, parameters: parameters).validate().responseJSON { response in
            switch response.result {
            case .Success:
                if let value = response.result.value {
                    let jsons = JSON(value)
                    for i in 0...jsons["results"].count {
                        let list = List(json: jsons["results"][i])
                        self.lists.append(list)
                    }
                }
            case .Failure(let error):
                print(error)
            }
        }
    }
    
}

View Controller

ObservableArray<List>をtableViewにBindします

import UIKit
import Bond

class ListViewController: UIViewController {
    
    @IBOutlet var tableView: UITableView!

    private let listViewModel = ListViewModel()
    private var list = ObservableArray<ObservableArray<List>>()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.list = [listViewModel.lists]
        listViewModel.reload()
        
        list.bindTo(tableView) { indexPath, dataSources, tableView in
            let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
            let dataSource = dataSources[indexPath.section][indexPath.row]
            cell.textLabel?.text = dataSource.trackName
            cell.detailTextLabel?.text = dataSource.artistName

            return cell
        }

    }

}

f:id:aminaura:20160604154910p:plain

Fabricでtwitter認証

Twitterが提供しているモバイルアプリの開発プラットフォームのFabricで簡単にtwitter認証してみた。

Fabric - Twitter's Mobile Development Platform

Fabricが提供している機能

Twitter Twitter へのサインイン, Twitter API の呼び出し, View の提供, SMS 認証

Crashlytics クラッシュ統計, リアルタイム分析, テスト配信

MoPub 広告配信による収益化

SDKインポート

SDKと今回はtwitter認証だけなのでその辺をサポートしているTwitter Kitをインポート。

pod 'TwitterKit'
pod 'Fabric'

セットアップ

application didFinishLaunchingWithOptions:Twitter Kitをイニシャライズします

import Fabric
import TwitterKit

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        Twitter.sharedInstance().startWithConsumerKey("your_key", consumerSecret: "your_secret")
        Fabric.with([Twitter.self()])
        
        return true
    }

この際、Twitterデベロッパー登録をして、自分のアプリの ConsumerKeyconsumerSecretを取得しておく必要があります

TwitterのAPIを使用するために必要なキーを取得する手順 - Hello API

アカウント認証

デフォルトで用意されてるボタンを使いたい時

let logInButton = TWTRLogInButton(logInCompletion: { session, error in
    if (session != nil) {
        println("signed in as \(session.userName)");
    } else {
        println("error: \(error.localizedDescription)");
    }
})
logInButton.center = self.view.center
self.view.addSubview(logInButton)

カスタムでメソッドを使いたいとき

Twitter.sharedInstance().logInWithCompletion { session, error in
                    if let session = session {
                        print(session.userName)
                    } else {
                        print(error)
                    }
 }

これで完了。