エス&アドエスキーボード作成課題7(SoundAPIでWAVE再生) | objective-cをちょい研究!ブログ

objective-cをちょい研究!ブログ

WILLCOMを卒業してiOS開発者に転身しました。。
コメント&トラックバック大歓迎です。

WAVE波形を生成してSoundAPIで音が鳴るようにしてみました。
アドエスメロディキーボードではWM6のMIDI再生機能を使っていたので、アドエスでしか使えなかったんですが、従来からのSoundAPIを使っているのでエスでも音が鳴るようになりました。


1~9キーで、ド~ド~レの音が鳴ります。
SoundAPIの部分だけですが、ソース付きです。
http://www.ne.jp/asahi/phs/phs/blog/midi080309.lzh


基本的には、次の3つの関数で再生させてます。
waveOutOpen
waveOutPrepareHeader
waveOutWrite


waveOutWriteはWAVEブロックデータを渡して音を鳴らすんですが、複数渡すと再生予約されて順番に鳴らしてくれます。
リアルタイムに音を鳴らすために1ブロックを短い音(24ms)に分割してストリーミング再生させています。
キーが押された場合、今再生中の次のブロックから音階データを書き換えるという具合。


<課題1 音が鳴るまでのタイムラグ>
ブロックデータを順番に再生させているので、どうしてもタイムラグが出てしまいます。1ブロックを短くしすぎると、データ生成が追いつかず音が途切れてしまう…。
waveOutWriteで再生予約後でもデータの書き換えができるようなので、キーが押された場合は随時データを書き換えることでだいぶタイムラグが改善されたと思う。


<課題2 音階データを作る>
周波数が440Hzの音を「ラ」として、周波数が2倍するごとに1オクターブ上がるそうです。
計算するのは面倒そうなので、周波数対応表を見つけたので利用させてもらいました。


http://homepage1.nifty.com/toshio-k/inspi/interval.html
音程について(KID's World様)

http://www.yk.rim.or.jp/~kamide/music/notes.html
音階と周波数の対応表(JavaScript)(Kamide's page様)