// // Programmer: Craig Stuart Sapp // Creation Date: Thu Jan 27 19:49:32 PST 2000 // Last Modified: Sun Jan 30 13:27:31 PST 2000 // Filename: sysexio.cpp // Syntax: C++ // // Description: This program is an example program for // handling SYSEX messages with the improv library. // // System Exclusive messages are stored in a separate buffer from // regular MIDI input messages. They are stored in a Circular Buffer // which has a length of 128 (or 256?). The MidiInPort class will // collect a system exclusive message. When it has finished receiving // the sysex message, it will store it into the sysex circular buffer // and then place a regular MIDI message into the regular MIDI input // buffer. The format of the MIDI input message for the sysex is: // parameter 0 = 0xf0 (the command for the start of a sysex) // parameter 1 = the sysex buffer index for the data of the sysex // // If you extract a MIDI message from a MidiInPort and the // MIDI command byte is 0xf0, then you know you have a system // exclusive message available in the MIDI input's sysex buffer // // Here is the basic code to check for sysex messages, and how // to determine the length of the sysex message and how to get the // actual data: // // MidiInput midiinput; // MidiMessage message; // int sysexSize; // int bufferNum; // unsigned char *sysexData; // // if (midiinput.getCount() > 0) { // message = midiinput.extract(); // if (message.p0() == 0xf0) { // // we have a system exclusive message // bufferNum = message.p1(); // sysexData = midiinput.getSysex(bufferNum); // sysexSize = midiinput.getSysexSize(bufferNum); // } // } // // Sending a System Exclusive message through MIDI output is more // simple. The starting 0xf0 byte and the ending command 0xf7 // should be present in the sysex data. // // unsigned char *sysexData; // int sysexLength; // MidiOutput midiout; // // //fill the sysex array and set the size variable, then to send: // midiout.sysex(sysexData, sysexLength); // midiout.rawsend(sysexData, sysexLength); // equivalent to last line // #include "improv.h" #ifndef OLDCPP #include #include using namespace std; #else #include #include #endif int main(void) { MidiInput midiin; MidiOutput midiout; midiout.setPort(0); midiout.open(); midiin.setPort(0); midiin.open(); MidiMessage message; int sysexloc; unsigned char *sysexdata = NULL; int sysexsize = 0; int i; int running = 1; cout << "sysexio -- display and echo SYSEX messages from MIDI input" << endl; cout << "Press Middle C to quit." << endl; while (running) { if (midiin.getCount() > 0) { message = midiin.extract(); if (message.p0() == 0xf0) { sysexloc = message.p1(); sysexdata = midiin.getSysex(sysexloc); sysexsize = midiin.getSysexSize(sysexloc); // print out the sysex data to the screen: for (i=0; i 0) { running = 0; } } } } return 0; } // md5sum: 039d02d9762c1876ba5ec1d1a3da7fe5 sysexio.cpp [20050403]