MIDIデバイスに直接メッセージを送る
<これでシーケンサソフトが作れる(かもしれない)>
midiOutShortMsgというAPIを使うことで例えば「ピアノのドの音」を鳴らすという事がMIDIファイルなどがなくても可能になります。
宣言(準備としてまず次のMciSendStringの宣言を追加します) |
(Private) Declare Function midiOutOpen Lib "winmm.dll" (lphMidiOut
As Long, ByVal uDeviceID As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As
Long (Private) Declare Function midiOutShortMsg Lib "winmm.dll" (ByVal hMidiOut As Long, ByVal dwMsg As Long) As Long (Private) Declare Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As Long) As Long |
※Privateは必要に応じて削除またはPublicに変更
引 数 説 明 |
lphMidiOut |
Long |
出力デバイスのハンドルを取得する変数 |
||||||
uDeviceID |
Long |
デバイスID(通常は-1、つまりMIDI MAPPERでよい) |
||||||
dwCallback |
Long |
コールバックプロシージャのアドレス。または通知するウィンドウのハンドル(AddressOfを使用、VB5以上が必要)。使用しない場合は0。 |
||||||
dwInstance |
Long |
調査中。通常は0でよい。 |
||||||
dwFlags |
Long |
以下の値。
|
・midiOutClose
hMidiOut |
出力デバイスのハンドル(midiOutOpenで得られたもの) |
・midiOutShortMsg
hMidiOut |
出力デバイスのハンドル(midiOutOpenで得られたもの) |
dwMsg |
送るMIDIメッセージ(下記参考) |
<midiOutShortMsgのdwMsgの設定>
midiOutShortMsgのdwMsgの設定 |
nにはチャンネル番号を入れる。ただし9はドラムセット。0〜Fで指定。
1ビット目 |
2ビット目 |
3ビット目 |
内容 |
&H9n |
Key:音階(0-127) |
Vol:ボリューム(0-127) |
nチャンネル,音程Key,音量Volで音を出す。 |
&H8n |
Key:音階(0-127) |
0 |
nチャンネルの音程Keyを消音。 |
&HCn |
Prog:音色番号 |
なし |
nチャンネルの音色をProgにする。 |
例:グランドピアノ(番号1)音階60音量127(最大)チャンネル1で音を鳴らす
midiOutShortMsg hMid, &HC0
+ 1 * 256
midiOutShortMsg hMid, &H90 + 60 * 256 + 127 * 256 * 256
操 作 設 定 |
1.midiOutOpenでMIDIデバイスを開く
↓
2.midiOutShortMsgで演奏する楽器を指定
↓
3.音程、音量などを決めmidiOutShortMsgで音を鳴らす
↓
4.適当な時間が経過したらmidiOutShortMsgで消音
↓
5.3,4または2,3,4を繰り返す。
↓
6.midiOutCloseでMIDIデバイスを閉じる
サ ン プ ル プ ロ グ ラ ム |
VisualBasic4以上で動作するサンプルプログラムです。
出来るだけ簡単に作ったので、応用も簡単に出来ると思います。
このAPIの場合は文章で読むよりサンプルを見たほうがわかりやすいと思います。