iPod Touchだとほとんどタイムラグは感じられないので、この差は何なんだろうと気になった。Androidの仕様上の制限なのか、アプリに原因があるのか。。。
自分でも音楽関係のアプリはいつか作ってみたいリストに入っているので、Androidで任意の音を自由なタイミングで鳴らす方法を調べて見た。Google検索で一応大雑把な所は分かったので、とりあえずメモしておこう。
以下、自分でコーディングして試した結果ではないので「~らしい」「~みたい」ばかりになって恐縮ですが。
Androidで音を鳴らす方法
下の4つの方法があるとの事。それぞれ向き不向きがあるみたいだが、「リアルタイムで任意の音を鳴らす」という用途にはどれもいま一つらしい。(少なくともタイムラグを無くすのは困難みたい。)
1. MediaPlayer
予め作成された音楽を鳴らすのに向いている。
MIDIファイルの演奏も可能。ただしメモリ上に動的に生成されたMIDIデータを演奏させる事は出来ない。一旦一時ファイルに保存する必要がある。
2. JetPlayer
「JetCreator」というツールを使って予めMIDIデータから「JETファイル」という形式に変換しておくと、そのファイルの任意の部分を演奏させる事が出来る。ゲームの効果音などを出すのに向いている様だが、楽器アプリとして自由な演奏をするのにどこまで向いているかは、試して見ないと何とも言えない。
hidecheckの日記 - AndroidでmidiとかJetCreatorとかで鍵盤アプリとか作成3. SoundPool
MIDIではなくOGGやWAVなどのサウンドファイルを使った効果音を再生出来る。
しずくくんのAndroidでゲームプログラミングしてみたいなblog4. AudioTrack
むずかしいことはわかりません。
(2011/05/11 追加)
SoundPool使用上の注意点 - Hacking My Way ~ itogのhack日記
PCMデータを直に操作して音を鳴らす場合に使う。(実は良く分からない。^^;)下のソースコードとかを見ると面白そうではあるけど、楽器の音を作るのはかなり大変かも。
にュウさいと - AudioTrackを使う
Androidアプリ開発 / 夢見る少女の開発メモ - 音を作ってみる
(2011/05/11 追加)
たいてい自宅で迷想中 AudioTrackをAudioQueueのように使う
さらに英語でも検索して見た。
英語だと結構核心に踏み込んだ(と思われる)情報があった。
Umito - The state of MIDI support on AndroidやっぱりMIDI音源に対して直接リアルタイムでコマンドを送信する為のAPIが用意されていないというのが致命的なようだ。
Stack Overflow - Dynamic Midi generation and playback on Android: Possible?
Google Code - Expose Midi Streaming capability of Sonivox Synthesizer.
Pragmatic Bookshelf - Java SE5 javax.sound (MIDI) classes removed from Android libraries?
現時点での結論(Android 2.2以下の場合)
で結局、今の所はこちらに書いてある通りAndroidの仕様上の理由からiPhoneに匹敵するようなレスポンスの良い楽器アプリを作るのはかなり厳しいようだ。
【combuのDTM & ミキシング 】 脱初心者を目指す音楽制作 - DTMやるならAndroidを買ってはいけない
2/21/2011 追記:
Android2.3, 2.4とか3.0が出てきたので、現在は状況が変わっているかも知れない。
変化がめまぐるしいので最新情報を追いかけるのも大変だ。。。
10/21/2011 追記:
Android 4.0でもまだ改善されていないみたいだ。
Android 4.0で反応の良い楽器アプリは可能になるのか
11/20/2012 追記:
4.2になって少し改善されたみたいだ。
Android 4.2で今度こそ反応の良い楽器アプリは可能になるのか!?
10/25/2013 追記:
最近はこんな感じらしい。
このレイテンシー、Nexus10はDTM用途に使えるかも!? : 藤本健の“DTMステーション”