2012/08/09 (2012年08月 のアーカイブ)
Webシンセの発音タイミングをまともにする
WebMidiLinkの発音タイミングの精度を上げるためにメッセージにタイムスタンプを付けようとしていたのだが、それ以前にシンセ側の手抜きによるタイミングのブレを対策したら、まあまあいい感じになってしまった。タイムスタンプどうしようかな。もっと精度を求めるには必要なんだけど、ちょっと迷う。
下の図は上段が今の所未対策のWebBeeper、下段が補正対策済みのGMPlayerで BPM150の16分つまり0.1秒周期の音。上段は見ただけでもかなりひどい感じだけど、下段はまあそれなりになっている。
音としてはこんな感じ。
発音タイミングテスト: 前半、補正未対応 WebBeeper / 後半、補正対応済み GMPlayer
発音タイミングテスト
でまあ、何が問題だったかというとWebAudioAPIなりAudioDataAPIなりで音を吐き出す時のバッファを1024サンプルくらい取っていて、これは44.1KHzで23mSecくらいあるので、この途中で受け取った発音情報を参照しながらデータを作らないといけなかったのだけど、面倒だったんで、
1024サンプル作成⇒発音情報更新⇒1024サンプル作成⇒発音情報更新
みたいになってたのだよね。これじゃ最大23mSecブレますな。Javascriptはシングルスレッドなんでバッファ作成ループの中でメッセージ受け取りのハンドラが走らないという面倒な事情もあるんだけどね。やっぱり一度発音情報をキューにいれて音データを作りながらなめないといかんです。
Posted by g200kg : 2012/08/09 19:48:28