遅延のない音を求めて

PCは、何でもできる箱である。
スピーカーとキーボードが付いているのだから、楽器になるはず。

まずMIDIで音を鳴らしてみる。色々な音色が使えるのは嬉しいが、遅延が酷い。
これはこれで楽しいが、演奏するという用途で考えると論外。

そこで、WAVファイルを用意してPlaySoundで再生してみる。
あるいは、waveOut系のAPIを使って、リアルタイムで波形を作ってみる。
これも、MIDIよりはうんとマシだが、確かに遅延が存在する。
キーボードを押すと音が出るようにして、ちょっと連打してみると、
どの音がどの打鍵に対応しているのか、わからなくなってしまう。

これらも演奏用途としてはギリギリ許容範囲外。
waveOutほどの低レベルなことをやってダメなのだから、これに関しては諦めていた。
このスペックのハードウェアを使って、原理的には可能であろうことが、
現状のWindows環境(当時XP)ではできない。悔しいが仕方ない。

が、最近になって、Windows Vistaで音量を変えるAPIを調べていたときに、
Core Audio APIsの存在を知った。EndpointVolume APIで音量の設定ができる。
そしてWASAPIが、自分が求めていた神APIだった(Vista以降で使える)。

これを排他モード(他ソフトから音が出なくなる)で使うと、遅延を感じない。
キーボードの打鍵音に、はり付くように鳴ってくれて非常に気持ちがいい。
共有モードでは遅延を感じるが、まあ許容範囲である(Vista環境)。
この共有モードの遅延はWindows 7で改善されているらしい。

以下、リンク集。

楽しいハック講座 (4) Windows7 オーディオアーキテクチャの概要 - Windows Multimedia Hacks - Site Home - MSDN Blogs
わかりやすい解説記事。

Google Code Archive - Long-term storage for Google Code Project Hosting.
ここは必見。ソースも公開されている。他のページも勉強になる。

Download: Windows SDK Update for Windows Vista - Microsoft Download Center - Download Details
少し古いSDK。サンプルだけならすぐインストールできる。
"WinAudio"というサンプルがあって、共有モードで音を鳴らすことができる。