Sends an input buffer to a specified opened MIDI input device. This function is used for system-exclusive messages.
Namespace: radio42.Multimedia.Midi
Assembly: Bass.Net (in Bass.Net.dll) Version: 2.4.17.2
Syntax
Parameters
- handle
- Type: SystemIntPtr
Handle to the MIDI input device. - headerPtr
- Type: SystemIntPtr
Pointer to a MIDI_HEADER structure that identifies the buffer.
Return Value
Type: MIDIErrorReturns 0 if successful or an error code otherwise. For possible error values see MIDIError.
Remarks
When the buffer is filled, it is sent back to the application (see MIM_LONGDATA).
The buffer must be prepared by using the MIDI_InPrepareHeader(IntPtr, IntPtr) function before it is passed to this function.
For convenience the Prepare(Boolean, IntPtr) might also be used, which calls MIDI_InPrepareHeader(IntPtr, IntPtr) internally and provides the prepared header pointer in it's HeaderPtr member. In order to convert an IntPtr (e.g. as given in the MIDIINPROC with the MIM_LONGDATA or MIM_LONGERROR as param1) back to a MIDI_HEADER structure use the appropriate constructor overload of the MIDI_HEADER class taking a headerPtr.
Examples
C#
private MIDIINPROC _midiInProc; private IntPtr _midiInHandle; ... private void StartRecording() { _midiInProc = new MIDIINPROC(MyMidiInProc); MIDIError ret = Midi.MIDI_InOpen(ref _midiInHandle, 1, _midiInProc, 0, MIDIFlags.MIDI_IO_STATUS); if (ret == MIDIError.MIDI_OK) { // supply the device with 2 buffers AddSysExBuffer(_midiInHandle, 1024); AddSysExBuffer(_midiInHandle, 1024); ret = Midi.MIDI_InStart(_midiInHandle); } } // prepare receiving system-exclusive messages public void AddSysExBuffer(IntPtr handle, int size) { // prepare a empty midi header MIDI_HEADER header = new MIDI_HEADER(size); header.Prepare(true, handle); // If the header was perpared successfully. if (header.HeaderPtr != IntPtr.Zero) { // Add the buffer to the InputDevice. Midi.MIDI_InAddBuffer(handle, header.HeaderPtr); } } private void MyMidiInProc(IntPtr handle, MIDIMessage msg, IntPtr instance, IntPtr param1, IntPtr param2) { // handle all Midi messages here if (msg == MIDIMessage.MIM_DATA) { // process the short message... // on Win32 system the param1 and param2 values might be converted like this: int p1 = param1.ToInt32(); int p2 = param2.ToInt32(); Console.WriteLine( "Msg={0}\r\nParam1={1}\r\nParam2={2}" , msg, p1, p2); } else if (msg == MIDIMessage.MIM_LONGDATA) { // process the system-exclusive message... MIDI_HEADER header = new MIDI_HEADER(param1); if (header.IsDone) { byte[] data = header.Data; ... Console.WriteLine( header.ToString() ); } header.Unprepare(true, handle); // add a new buffer // since we should constantly provide new buffers until we finished recording AddSysExBuffer(handle, 1024); } ... }
See Also