BASS.NET API for the Un4seen BASS Audio LibraryMidiMIDI_OutOpen Method BASS.NET API for the Un4seen BASS Audio Library
Opens a MIDI output device for playback.

Namespace: radio42.Multimedia.Midi
Assembly: Bass.Net (in Bass.Net.dll) Version: 2.4.12.0
Syntax

public static MIDIError MIDI_OutOpen(
	ref IntPtr handle,
	int deviceID,
	MIDIOUTPROC proc,
	IntPtr user
)

Parameters

handle
Type: SystemIntPtr
Returns the MIDI output handle. The handle is used to identify the device in calls to other MIDI output functions.
deviceID
Type: SystemInt32
Identifier of the MIDI output device to be opened (see MIDI_OutGetDevCaps(Int32, MIDI_OUTCAPS) for details).
proc
Type: radio42.Multimedia.MidiMIDIOUTPROC
The MIDIOUTPROC callback delegate to use. Called during MIDI playback to process messages related to the progress of the playback. If no callback is desired, specify for this parameter. For more information on the callback function, see MIDIOUTPROC.
user
Type: SystemIntPtr
User instance data passed to the callback function.

Return Value

Type: MIDIError
Returns 0 if successful or an error code otherwise. For possible error values see MIDIError.
Remarks

The flags are automatically set according to the given proc (thats why this method does not contain any flags parameter).

To determine the number of MIDI output devices present in the system, use the MIDI_OutGetNumDevs function. The device identifier specified by deviceID varies from zero to one less than the number of devices present.

If a function is chosen to receive callback information, the following messages are sent to the function to indicate the progress of MIDI output: MOM_OPEN, MOM_CLOSE, and MOM_DONE.

Examples

VB
Private _midiProc As MIDIOUTPROC
Private _midiOutHandle As IntPtr
...
' Open the Midi device #2
_midiProc = New MIDIOUTPROC(MyMidiProc)
Dim ret As MIDIError = Midi.MIDI_OutOpen(_midiOutHandle, 2, _midiProc, 0)
If ret = MIDIError.MIDI_OK Then
  ' device opened and ready
End If
...
' when not needed anymore...stop the device
Midi.MIDI_OutReset(_midiOutHandle)
' and close the device
Midi.MIDI_OutClose(_midiOutHandle)
...
Private Sub SendShortMessage(message As Integer)
  MIDI_OutShortMsg(_midiOutHandle, message)
End Sub

Private Sub SendSysExMessage(data() As Byte)
  Dim header As New MIDI_HEADER(data)
  header.Prepare(False, _midiOutHandle)
  ' If the header was perpared successfully.
  If header.HeaderPtr <> IntPtr.Zero Then
    ' send a system-exclusive message to the output device
    Midi.MIDI_OutLongMsg(_midiOutHandle, header.HeaderPtr)
  End If
End Sub

Public Sub MyMidiProc(handle As IntPtr, msg As MIDIMessage, instance As IntPtr, param1 As IntPtr, param2 As IntPtr)
  ' handle all Midi messages here
  If msg = MIDIMessage.MOM_OPEN Then
    ' nothing to do
  Else
    If msg = MIDIMessage.MOM_CLOSE Then
      ' handle is from now on invalid
    Else
      If msg = MIDIMessage.MOM_DONE Then
        ' process the message...
        ' param1 will contain the pointer to the MIDI_HEADER
        Dim header As New MIDI_HEADER(param1)
        ' process the header if needed
        ...
        ' and finally unprepare the header
        header.Unprepare(False, handle)
      End If
    End If
  End If
End Sub
private MIDIOUTPROC _midiProc;
private IntPtr _midiOutHandle;
...
// Open the Midi device #2
_midiProc = new MIDIOUTPROC(MyMidiProc);
MIDIError ret = Midi.MIDI_OutOpen(ref _midiOutHandle, 2, _midiProc, 0);
if (ret == MIDIError.MIDI_OK)
{
  // device opened and ready
}
...
// When not needed anymore...stop the device
Midi.MIDI_OutReset(_midiOutHandle);
// and close the device
Midi.MIDI_OutClose(_midiOutHandle);
...
private void SendShortMessage(int message)
{
  MIDI_OutShortMsg(_midiOutHandle, message);
}

private void SendSysExMessage(byte[] data)
{
  MIDI_HEADER header = new MIDI_HEADER(data);
  header.Prepare(false, _midiOutHandle);
  // If the header was perpared successfully.
  if (header.HeaderPtr != IntPtr.Zero)
  {
    // send a system-exclusive message to the output device
    Midi.MIDI_OutLongMsg(_midiOutHandle, header.HeaderPtr);
  }
}

public void MyMidiProc(IntPtr handle, MIDIMessage msg, IntPtr instance, IntPtr param1, IntPtr param2)
{
  // handle all Midi messages here
  if (msg == MIDIMessage.MOM_OPEN)
  {
    // nothing to do
  }
  else if (msg == MIDIMessage.MOM_CLOSE)
  {
    // handle is from now on invalid
  }
  else if (msg == MIDIMessage.MOM_DONE)
  {
    // process the message...
    // param1 will contain the pointer to the MIDI_HEADER
    MIDI_HEADER header = new MIDI_HEADER(param1);
    // process the header if needed
    ...
    // and finally unprepare the header
    header.Unprepare(false, handle);
  }
}
See Also

Reference