If you want to play a MIDI file from VB you have to use MCI functions. The main MCI function is mciSendString
, that sends command strings to the system and execute them:
Declare Function mciSendString Lib "winmm" Alias "mciSendStringA" (ByVal _
lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
The first argument is the command string, lpstrReturnString
receives return information (if needed), uReturnLength
indicates the size, in characters, of lpstrReturnString, and hwndCallback
is used for system notification. Remember that every command string described in this tip must be sent to the system with:
CommandString = "Your MCI command here"
RetVal = mciSendString(CommandString, vbNullString, 0, 0)
First you must open the MIDI device with
CommandString = "Open " + FileName + " type sequencer alias MidiFile"
Notice that FileName
must be in the short format 8.3 characters; lpstrReturnString
is null because you don't need any return information. "MidiFile" is an arbitrary name that you'll use in the next command strings as an alias of the filename. Finally you can play the MIDI file:
CommandString = "Play MidiFile wait"
The execution is synchronous, but you can play the file asynchronously and receive notifications with
CommandString = "Play MidiFile notify"
RetVal = mciSendString(CommandString, vbNullString, 0, MyForm.hWnd)
where MyForm is the form you are using. The system will send to your form a MM_MCINOTIFY message when the playback is finished. To intercept this message you have to create a custom window procedure and use subclassing.
By default playback begins at the current position and stops at the end of the content, but you can play only a part of the file with this statement
where X and Y are two different positions. It's often useful to specify X and Y in milliseconds, so before Play command you must set the time format with this command:
CommandString = "Play MidiFile from X to Y"
With asynchronous executions, you can pause / resume and stop playback with
' pause playback
CommandString = "Pause MidiFile"
' resume a paused playback
CommandString = "Resume MidiFile"
' stop playback
CommandString = "Stop MidiFile"
When you have finished to use the MIDI device, remember to close it with
CommandString = "Set MidiFile time format milliseconds"
CommandString = "Close MidiFile"