MIDIファイルの多機能な操作
<MIDIファイルの多機能な操作>
ここでは以下のことを取り上げました
・MIDIファイルのテンポを変えて再生
・MIDIファイルの時間を得る
・MIDIファイルのテンポを得る
・演奏する機器(ソフトシンセ、FM音源など)を変えて再生
宣言(準備としてまず次のMciSendStringの宣言を追加します) |
Private Declare Function mciSendString Lib "WINMM" Alias "mciSendStringA" (ByVal CMD$, ByVal RET$, ByVal RETLEN&, ByVal HwndBack&) As Long |
使 用 方 法 |
MCISendString CMD$,RET$,RETLEN&,HwndBack& |
引 数 説 明 |
CMD |
String |
処理内容。 書式:コマンド名 ファイル名またはAlias名 パラメータ |
RET |
Long |
実行結果をこの変数に入れる(mciGetErrorString使用時に使う) |
RETLEN |
String |
RET$の大きさ |
HwndBack |
Long(HWND) |
ファイルの再生終了などを通知するウィンドウのハンドル。VB5でAddressOfが使用できるようになって使用できるようになった。SetWindowLongを使用しメッセージをフックして使用する。CMDにnotifyが指定されている場合のみ有効。 |
以下にいくつかのMIDIファイルの操作について説明します。
プログラムがあるディレクトリに「test.mid」というファイルを用意しておいてください。またmciSendStringの宣言部を追加しておいてください。またForm_Loadプロシージャなどに「chdir
app.path」という1行を追加しておいてください。
また再生を停止させるときは、
mciSendString "stop test.mid", "", 0, 0
mciSendString "close test.mid", "", 0, 0
というコードを張りつけてください。
1 MIDIファイルをテンポを変えて再生 |
mciSendString "open test.mid", "", 0, 0
mciSendString "set test.mid tempo 200", "", 0, 0
mciSendString "play test.mid", "", 0, 0
※MIDIファイル内部でテンポの設定が変わると設定は無効になります
2 MIDIファイルの時間を得る |
Dim ret As String * 255
Dim tmp As Long
Dim min, sec As Integer
mciSendString "open test.mid", "", 0, 0
mciSendString "set test.mid time format ms", "", 0, 0
mciSendString "status test.mid length", ret, 255, 0
tmp = Val(ret)
min = Int(tmp / 1000 / 60)
sec = Int(tmp / 1000 - min * 60)
MsgBox "このMIDIファイルの長さは" + Str(min) + "分" + Str(sec) + "秒です"
mciSendString "close test.mid", "", 0, 0
3 MIDIファイルをテンポを得る |
Dim ret As String * 255
Dim tempo As Integer
mciSendString "open test.mid", "", 0, 0
mciSendString "status test.mid tempo", ret, 255, 0
mciSendString "close test.mid", "", 0, 0
tempo = Val(ret)
MsgBox "このファイルのテンポは" + Str(tempo) + "です"
※あくまでもこのテンポは「mciSendString "status test.mid tempo", ret, 255, 0」を実行したときのテンポであり、テンポが変わる場合があります。
4 MIDIファイルを再生する機器を変えて演奏 |
Dim Port As Integer
Port = 0 '演奏するポート番号を設定(1,2,3・・・・)
mciSendString "open test.mid", "", 0, 0
mciSendString "set test.mid port" + Str(Port), "", 0, 0
mciSendString "play test.mid", "", 0, 0
※外部機器の情報を得るのにはmidiOutGetDevCapsなどのAPIを使用します。