あの楽器じゃないけどC#で楽器作ってみた

普通のPCを使ってガチ演奏って出来ないかなぁと思って色々試してみました。

途中経過はmixiで全体に公開の設定で書いたので、アカウントをお持ちの方はそっちで。

http://mixi.jp/view_diary.pl?id=1264945935&owner_id=2620995

http://mixi.jp/view_diary.pl?id=1265825769&owner_id=2620995

http://mixi.jp/view_diary.pl?id=1265873603&owner_id=2620995

http://mixi.jp/view_diary.pl?id=1267163178&owner_id=2620995

http://mixi.jp/view_diary.pl?id=1270510815&owner_id=2620995

つまりはソフトウェアキーボードを作ろうってことです。あれはMIDIというプロトコルで音源にメッセージを送ることで音を出しているようです。音源はWindowsに標準で付いています。MIDI規格で通信する為のWindowsAPIがあることもわかりました。

作り方を超簡単に書くと、midiOutOpen関数でMIDIデバイスを開いてmidiOutShortMsg関数で音を出す等のメッセージを送って、使い終わったらmidiOutResetしてmidiOutCloseで後始末完了です。”MIDI プログラミング”とかで検索してもDTM関連ばかりで使える情報にはなかなか辿り着けないけど、上記の関数名で検索すると詳しい情報がHITします。

結果出来たのがこれ

http://www.k4.dion.ne.jp/~anis7742/anogakki.zip

実験と称して汚いコード書いてるので実行ファイルのみの公開です。

操作方法は以下の通り

・左手のキーで対応した音階が鳴る。

・↑↓キーで音色が切り替わる。

・マウスホイールでオクターブが切り替わる。

・左ボタンを押しながらマウスを縦方向に動かすとピッチが変わる。

・右ボタンを押しながらマウスと横方向に動かすとビブラートがかかる。

僕の下手クソな演奏。こんな感じの表現が出来ます。

http://www.k4.dion.ne.jp/~anis7742/wavemode20090828224419.wav

※規定のMIDIデバイスがMicrosoft GS Wavetable SW Synth以外になってると音が鳴らない不具合があって原因を調査中です。←直った

ここまでやってみて、次の問題があることがわかった。

1.デバイスから得られるフィードバックが、その操作の結果として出る音しかない。通常の楽器は身体と楽器の接点の感触から色々な情報を得て演奏している。画面を工夫することで若干の改善は可能だが、限界がある。

2.キーボードのストロークの深さが正確なタイミングでの操作を妨げる。ストロークが浅いキーボードや、Realforceの様な奥まで押し切らなくても反応するキーボードで改善されるかも。

3.操作してから音が鳴るまでのタイムラグがある。音源や出力デバイス、その他ソフトウェア等でどこまで改善出来るか。

マウスとキーボードを本来の目的以外に使うわけだから色々無理があるわけですね。