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

※Privateは必要に応じて削除またはPublicに変更

使 用 方 法

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を使用します。

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

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル