Plaing MIDI events

[ Follow Ups ] [ The MIDIWORLD Forum ]

Posted by Jerome Siot on March 01, 2001 at 04:47:40:


Hi,
I use the MIDI stream API on Win NT in order to play MIDI events stored in such a buffer:

...
0, 0, 0x007F4390, //note on
48, 0, 0x00004390, //note off

0, 0, 0x007F4390,
48, 0, 0x00004390,
...

with first field as delta-time, second one as reserved and third one as MIDI message.

I want to reproduce such a buffer using relative timestamp, that is to say passing the elapsed time
since the MIDI device was started, instead of deltatime between the current event and the previous one

I think is possible, using the MidiStreamPosition function with an appropriate MMTIME format(TIME_MS or TIME_MIDI)
This solution would allow me to write this kind of buffer:
...
0, 0, 0x007F4390, //note on
48, 0, 0x00004390, //note off

48, 0, 0x007F4390,
996, 0, 0x00004390,
...

Is this really possible ?
Can you give me a short sample code ?
Regards, Jérome SIOT (France)

Here is a piece of my code : (original code was written by J. Glatt, www.borg.com/~jglatt)

//first I declare the buffer

int main(int argc, char **argv)
{
HMIDISTRM handle;
MIDIHDR midiHdr;
unsigned long err, tempo;
MIDIPROPTIMEDIV prop;
MMTIME time;


/* Open default MIDI Out stream device */
err = 0;
if (!(err = midiStreamOpen(&handle, &err, 1, 0, 0, CALLBACK_NULL)))
{
time.wType = TIME_MS; //define the time division type
/* Set the stream device's Time Division to milliseconds*/
prop.cbStruct = sizeof(MIDIPROPTIMEDIV);
prop.dwTimeDiv = 0xE728; //millisecondes : voir midi file spec (key word : E7 28)
midiStreamProperty(handle, (LPBYTE)&prop, MIDIPROP_SET|MIDIPROP_TIMEDIV);

/* Store pointer to our stream (ie, buffer) of messages in MIDIHDR */
midiHdr.lpData = (LPBYTE)&Phrase[0];

/* Store its size in the MIDIHDR */
midiHdr.dwBufferLength = midiHdr.dwBytesRecorded = sizeof(Phrase);

/* Flags must be set to 0 */
midiHdr.dwFlags = 0;

/* Prepare the buffer and MIDIHDR */
midiOutPrepareHeader((HMIDIOUT)handle, &midiHdr, sizeof(MIDIHDR));

midiStreamOut(handle, &midiHdr, sizeof(MIDIHDR));
midiStreamRestart(handle); // actually play MIDIevents

midiOutUnprepareHeader((HMIDIOUT)handle, &midiHdr, sizeof(MIDIHDR));
midiStreamClose(handle);

Follow Ups: