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に変更

引 数 説 明

・midiOutOpen

lphMidiOut

Long

出力デバイスのハンドルを取得する変数

uDeviceID

Long

デバイスID(通常は-1、つまりMIDI MAPPERでよい)

dwCallback

Long

コールバックプロシージャのアドレス。または通知するウィンドウのハンドル(AddressOfを使用、VB5以上が必要)。使用しない場合は0。

dwInstance

Long

調査中。通常は0でよい。

dwFlags

Long

以下の値。

CALLBACK_WINDOW

dwCallbackがウィンドウハンドル

CALLBACK_FUNCTION

dwCallbackがコールバックプロシージャのアドレス

CALLBACK_NULL

コールバックを使用しない。


・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の場合は文章で読むよりサンプルを見たほうがわかりやすいと思います。

Sample Program Download (6KB)

トップに戻る
Visual Basicワンポイントテクニック目次に戻る

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル