BASS_MIDI_StreamEvents


Applies any number of events to a MIDI stream.

DWORD BASS_MIDI_StreamEvents(
    HSTREAM handle,
    DWORD mode,
    void *events,
    DWORD length
);

Parameters

handleThe MIDI stream to apply the events to.
modeThe type of event data to apply. One of the following, with optional flags.
BASS_MIDI_EVENTS_RAWRaw MIDI event data, as would be sent to a MIDI device. Running status is supported. To overcome the 16 channel limit, the event data's channel information can optionally be overridden by adding the new channel number to this parameter, where +1 = the 1st channel.
BASS_MIDI_EVENTS_STRUCTAn array of BASS_MIDI_EVENT structures.
BASS_MIDI_EVENTS_SYNCFlag: Trigger BASS_SYNC_MIDI_EVENT syncs for the processed events.
eventsThe event data.
lengthThe length of the event data. The number of bytes or BASS_MIDI_EVENT structures, depending on the type of event data.

Return value

If successful, the number of events processed is returned, else -1 is returned. Use BASS_ErrorGetCode to get the error code.

Error codes

BASS_ERROR_HANDLEhandle is not valid.
BASS_ERROR_ILLPARAMmode is not valid.

Remarks

Events applied to a MIDI file stream can subsequently be overridden by events in the file itself, and will also be overridden when seeking or looping. That can be avoided by using additional channels, allocated via the BASS_ATTRIB_MIDI_CHANS attribute.

If the MIDI stream is being played (it is not a decoding channel), then there will be some delay in the effect of the event being heard. This latency can be reduced by making use of the BASS_CONFIG_BUFFER and BASS_CONFIG_UPDATEPERIOD config options when creating the stream.

Example

Play a C major chord with a velocity of 100, on channel 1 for 2 seconds.
BASS_MIDI_EVENT events[3];
events[0].event=MIDI_EVENT_NOTE;
events[0].param=MAKEWORD(60, 100); // C
events[0].chan=0;
events[1].event=MIDI_EVENT_NOTE;
events[1].param=MAKEWORD(64, 100); // E
events[1].chan=0;
events[2].event=MIDI_EVENT_NOTE;
events[2].param=MAKEWORD(67, 100); // G
events[2].chan=0;
BASS_MIDI_StreamEvents(handle, BASS_MIDI_EVENTS_STRUCT, events, 3); // process the events
Sleep(2000); // wait 2 seconds
// modify the event data to release the keys
events[0].param=60; // release C
events[1].param=64; // release E
events[2].param=67; // release G
BASS_MIDI_StreamEvents(handle, BASS_MIDI_EVENTS_STRUCT, events, 3); // process the events

The same thing using raw MIDI event data.

BYTE events[7]={0x90, 60, 100, 64, 100, 67, 100}; // the event data
BASS_MIDI_StreamEvents(handle, BASS_MIDI_EVENTS_RAW, events, 7); // process the events
Sleep(2000); // wait 2 seconds
// modify the event data to release the keys
events[2]=0; // release C
events[4]=0; // release E
events[6]=0; // release G
BASS_MIDI_StreamEvents(handle, BASS_MIDI_EVENTS_RAW, events, 7); // process the events

See also

BASS_MIDI_StreamCreate, BASS_MIDI_StreamEvent, BASS_MIDI_StreamGetEvent