前回のCore Dataのエントリから2週間強。なかなか進まなかったCora Audioですが、ようやくゴールが見えたので、ざっくりレベルでまとめておきます。
1.目的:Core Audioを使って何をしたいのか?
まずCore Audioって何?という話ですが、簡単に書くとiOSやOS X上でオーディオ処理を行う為のフレームワークの事です。データベースを扱うフレームワークがCore Dataですから、それのオーディオ版という解釈で良いと思います。
Core Audioを使うとオーディオに関する様々なことができます。サウンドファイルの再生、録音から波形編集、iPodライブラリの操作まで・・・。ただ、今回すべての機能を理解するということではなく、ある目的を実現する為にはどのような機能をどう使ったらよいか?を実際にコーディングしながら調べたいと思います。(要は技術検証です。)
で、「ある目的」なんですが、ぶっちゃけて書くと「iPodライブラリの曲でDJプレイをしたい」です。・・・いきなりネタバレ的な事を書いていますが(^^;、DJアプリは優秀なアプリがいくつもリリースされてますし、最終的に作りたいアプリとはちょっと違うので、まぁ、いいかと。
で、今回やりたいことをまとめるとこんな感じです。
・iPhone/iPod touchの中のiPodライブラリに登録している曲を再生できること[A]
・iPodライブラリの曲が2曲同時に再生できること[B]
・2曲それぞれのボリュームが変更できること[C]
つまり、2曲を同時再生しながらそれぞれのボリュームを変更すること→Mixプレイができること=これが今回のゴールです。
2.調査:3つのPlayerクラス
今回の教科書は以前購入したiPhone Core Audioプログラミング(永野 哲久 著)。この本+ネット上で公開されているノウハウを調査しました。
調べていくとCore AudioにはxxxxPlayerクラスと呼ばれるクラスがいくつかあり、そのクラスに曲を設定し、PlayメソッドやStopメソッドで再生・停止をするということが分かりました。それぞれ用途が違うので簡単にまとめます。
[1]AVAudioPlayerクラス(AVFoundationフレームワーク)
概要:サウンドファイル(またはメモリ上のデータ)を読みこんで再生する
長所:ボリューム調整ができる。複数のAVAudioPlayerクラスを起動して同時に再生できる(B、C→○)
短所:iPodライブラリに登録している曲を再生できない(A→×)
[2]MPMusicPlayerControllerクラス(MediaPlayerフレームワーク)
概要:iPodライブラリに登録している曲を再生する
長所:iPodライブラリに登録している曲が再生できる(A→○)
短所:複数の曲を同時に再生できない(B、C→×)
[3]AVPlayerクラス(AVFoundationフレームワーク)
概要:iOS4.0から追加されたクラス。サウンドファイルだけでなくムービーファイルも再生できる
長所:iPodライブラリに登録している曲が再生できる。複数の曲を同時に再生できる(A、B→○)
短所:ボリューム調整ができない(C→×)
・・・調べてみてわかったのですが、3つのPlayerクラスそれぞれにできる事とできない事があって、先にあげたA、B、Cの要件を満たしているPlayerクラスが存在しないのです。まさに「帯に短し襷に長し」。困りました(^^;。
3.結果:DJアプリ完成!
で、ここからが本題です。
3つの中で一番使えそうなのが[3]AVPlayerクラスなのですが、このクラスはハードウェアのボリュームを使用しており、個別にボリュームが調整できないので、今回は使えません。[2]MPMusicPlayerControllerクラスは同時再生ができないのでこれもアウトです。
では、残りの[1]AVAudioPlayerクラスとなるのですが、こちらはiPodライブラリの曲が再生できません。何とか再生する方法がないものか・・・と、ネットを調べたら次のような記事がありました。
iPodライブラリからのファイル書き出し その1、その2(Yasoshimaさんのブログより)
iPodライブラリ内の曲をopenFrameworksで読み込んでサウンドレベルを取得する(田所 淳さんのブログより)
共に素晴らしい記事ですね。iPodライブラリからAVAssetExportSessionを使ってオーディオファイルを一時的に書き出します。このファイルをAVAudioPlayerクラスに設定してやれば・・・できました!。iPodライブラリの曲を同時再生しながらそれぞれのボリュームを変更することが。
あとは、MediaPlayerフレームワークのMPMediaPickerControllerでライブラリ内の曲を選択する機能を追加したり、一時ファイルの削除機能を追加したりして・・・こんな感じになりました↓。
Selectボタンで曲を選択して、Startボタンで再生。真ん中のクロスフェーダーを右に動かしたり左に動かしたりすると2曲のボリュームが変わります。UIはともかく、DJアプリっぽくなりました(^^)。
・・・もちろん、ちゃんとしたアプリを作ろうと思ったらこれだけでは全然ダメで、色んな細かい処理を追加したりテストしたりしないといけないのですけど、アプリの核となる部分はこんな感じでいいのかな、と思います。
これで、最初の頃のエントリ「iPhoneアプリを設計する」で書いた「画面遷移」、「Core Data」、「Core Audio」の3つの課題がようやくクリアできました。3日で終わるなんて書いていて1ヶ月半かかってますけど・・・(^^;。
後は、今まで調べた内容を当初の設計に反映して、ひたすらコーディングしていくだけですね。・・・って、これからがまた色々と大変なんでしょうけど、完成を目指して一歩一歩やっていきたいと思います。
※勉強中の為、間違っているところや説明が足りないところがあると思います。その場合はご指摘いただくと助かります。