とてもとてもめんどくさい、VBAでコールバック
- カテゴリ:日記
- 2012/01/11 23:25:51
WaveOutとマルチバッファを使って、とてもとても滑らかでレガートなピッチベンドは再現できる事が判明しました。Windows7でも動作確認した。
でも、すぐにエクセルが飛んでしまう~。orz Windows7でも飛んでしまう~。コーディングに問題は無さげなんだけどな、いっぱいいっぱい調べると、どうやら
・エクセルVBAはスレッドセーフではない
・WaveOutのコールバック関数はマルチメディアタイマーと同じく
別スレッドで動いてる
のが、原因のもよう。コールバック関数の利用例が皆無に近かったのはこのせいなのか。初めからそう言う資料に当たってればと思うけど、上の原因だって色んな情報をかき集めた結果の判断だからな~。そんな都合の良い情報は、インターネット上には無いみたいだな~。
コールバック関数を EnterCriticalSection で囲んでやれば問題解決するとも思うんだけど、VBAとしてはとても歪な感じ。コールバックを関数ではなく、ウインドウイベントで受ければ、スレッドの事を気にしなくてもよさげ。当初イベントではなくてコールバック関数で処理する事を目指してたけど、あきらめた。今回のプログラムはウインドウイベントを使った方が可読性が少し落ちると思うけども、大した違いでもないので、もう少し手直ししてみよう。
しかし、VBAでコールバックを使うのは、別に稀な事ではないんだがな。たぶん、WaveOutやマルティメディアタイマーの方が特殊なんだろうな。どちらもタイムクリティカルだから、OSの一番深いところと繋げる為に、別スレッドになっちゃうんだろうな~。
ようやく、Windwos2k~Windwos7上のエクセルだけで動くテルミンもどきは実現可能な雰囲気になって来た。早くて一週間、長くても一ヶ月くらいでいけるかと思ってたのに、長かったな~。