Androidなんて知らねぇよwwwという状態はどうかと思ったので、
震災最中に入手したIS05を最近触っています。
そんな行き当たりばったりなので、なんとなく成果忘記録メモ
本日のお題。
高級ライブラリで音楽を鳴らしてもツマランなので、デバイスへ直接送る波形データをリアルタイムで送るテスト。
テスト条件として、NDKを使わずあくまでJavaの話。
ネイティブだと出来て当たり前な処理なのや、Androidというプラットフォームが推奨する環境であるワケだし。
あとワンショット系もリアルタイムでする意味がないのでストリームで音をいじりたい。
延長したらシーケンサだけども、そういうロジカルな話は今までやってたのでどうでもいい。
あくまでリアルタイム性が必要とするテストということで。。
で、サウンドエフェクト系となるとお約束となる次の3点。
「リングバッファ」「再生ポインタ」「再生済みポインタ」等の機構があるかを調べる。
リングバッファは自前実装でよいとして、プレイポインタ系はハードウェアというかAPIで用意されていないと話にならない。・・・が、(どこかにあるだろうけど)見当たらない。。
あるぇ・・・。
仕方がないので、リングバッファを出したい音の1周期分のみ確保し、再生中はリングバッファ1周前のデータを減衰させることにする。つまり再生周波を1周期ごとに減衰。
とりあえず、リニアデータを直接触るのは android.media.AudioTrack とからしい。
リングバッファを使う場合のプレイヤーは、決まったバッファを永久ループをするように再生してもらわないと困るので、AudioTrack.MODE_STREAM を指定してやればいいのかな?すべて手探りww
適当にデータを突っ込んで再生。とりあえず矩形波が好きですが、処理負荷を想定としてサイン波を逐次計算。
おや、、意外と普通に鳴った。。
・・・が、プレイポインタを取ってないので、環境により減衰速度が無茶苦茶な気はする。
成果物として野良アプリとして公開
・Android2.1~
・タップのみ操作
・押している間のみ発音
・画面左端になるほど減衰力多く(=すぐ音が消える)
・画面右端になるほど減衰力少く(=音が長く鳴る)
・画面上部は低音/下部にむかって高音。スライドもおk
・画面回転も多分対応
・下の選択で波形パターン変更
PS
とりあえず、余力はありそうなので(IS05/CPU1GHz)普通にシーケンサ作れるかもね。
実際マーケにはあるけど。
―――――――――――――――――――――――――――――――――――――――――――
追記2011/4/13 19:10
P.S.2
本文と間違ったアプリを晒していたので、ついでに音色5パターン設定を追加し、Androidのバージョンを2.2→2.1に変更。1.6とかレイアウタの使い方分からなかったので放置!
音色パターンは、左から矩形・サイン・三角・ノコギリ・ノイズのお約束シリーズ。
ノイズは他のと同様に短い周波1周期分と、非常に短くなるため、ホワイトノイズというよりギターに近い音色かも
―――――――――――――――――――――――――――――――――――――――――――
追記2011/4/14 6:23
アップデート。Ver2.1
・レイアウト弄って対応Androidを2.1→1.5以上
・終了時にスレッドが審でなくて高負荷だったのを解消
・アプリ名を変更 transA-test