// // Programmer: Craig Stuart Sapp // Creation Date: Mon Dec 1 22:01:22 PST 1997 // Last Modified: Tue Jan 27 21:10:05 GMT-0800 1998 // Filename: ...sig/doc/examples/improv/improv/mplay/mplay.cpp // Syntax: C++; improv // // Description: Plays the specified note on a MIDI synthesizer. // most MIDI drivers will automatically turn the note // off when the program is exited. // #include "sigControl.h" #include #include #ifndef OLDCPP #include using namespace std; #else #include #endif int atohd(const char* aNumber); void exitUsage(const char* command); int main(int argc, char* argv[]) { int port = 0; int channel = 0; int keyno = 0; int velocity = 0; if (argc == 5) { port = atohd(argv[1]); channel = atohd(argv[2]); keyno = atohd(argv[3]); velocity = atohd(argv[4]); } else { exitUsage(argv[0]); } if (channel < 0 || channel > 15) exitUsage(argv[0]); if (keyno < 0 || keyno > 127) exitUsage(argv[0]); if (velocity < 0 || velocity > 127) exitUsage(argv[0]); MidiOutput midi; if (midi.getNumPorts() <= port) { cout << "Error: highest available port is: " << midi.getNumPorts()-1 << endl; exit(1); } midi.setPort(port); midi.open(); midi.setTrace(1); midi.play(channel, keyno, velocity); midi.close(); cout << endl; return 0; } int atohd(const char* aNumber) { if (aNumber[0] == '0' && tolower(aNumber[1]) == 'x') { return (int)strtol(aNumber, (char**)NULL, 16); } else { return atoi(aNumber); } } void exitUsage(const char* command) { cout << endl; cout << "Sends a MIDI note message to a synthesizer.\n"; cout << endl; cout << "Usage: " << command << " port channel keyNumber velocity" << endl; cout << endl; cout << " port = MIDI output port (usually 0)\n"; cout << " channel = [0..15] the MIDI channel to play note on.\n"; cout << " default is 0.\n"; cout << " keyNumber = [0..127] MIDI key, Middle C = 60, C# = 61, ...\n"; cout << " velocity = [0..127] attack velocity of the note, 0 = off.\n"; cout << " default is 127.\n"; cout << endl; exit(1); } // md5sum: d420fcbaeacd7b45a1338f536462ade2 mplay.cpp [20050403]