//
// Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu>
// 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 <iostream>
#include <iomanip>
using namespace std;
#else
#include <iostream.h>
#include <iomanip.h>
#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<sysexsize; i++) {
cout << hex << (int)sysexdata[i] << " ";
if ((i + 1) % 30 == 0) {
cout << endl;
}
}
cout << endl;
// Now echo the messages to MIDI output (as a demo
// for how to send Sysex outputs)
midiout.rawsend(sysexdata, sysexsize);
// As a courtesy, mark the midiin sysex buffer free
// but this is not necessay (it will be erased when
// more space is needed for storing a sysex.
midiin.clearSysex(sysexloc);
} else if ((message.p0() & 0xf0) == 0x90) {
// Exit the program when a middle C note is pressed.
if (message.p1() == 60 && message.p2() > 0) {
running = 0;
}
}
}
}
return 0;
}
// md5sum: 039d02d9762c1876ba5ec1d1a3da7fe5 sysexio.cpp [20050403]