1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
//*****************************************//
// qmidiin.cpp
// by Gary Scavone, 2003-2004.
//
// Simple program to test MIDI input and
// retrieval from the queue.
//
//*****************************************//
#include <iostream>
#include <cstdlib>
#include <signal.h>
#include "RtMidi.h"
// Platform-dependent sleep routines.
#if defined(_WIN32)
#include <windows.h>
#define SLEEP( milliseconds ) Sleep( (DWORD) milliseconds )
#else // Unix variants
#include <unistd.h>
#define SLEEP( milliseconds ) usleep( (unsigned long) (milliseconds * 1000.0) )
#endif
bool done;
static void finish( int /*ignore*/ ){ done = true; }
void usage( void ) {
// Error function in case of incorrect command-line
// argument specifications.
std::cout << "\nusage: qmidiin <port> <api>\n";
std::cout << " where port = the device to use (first / default = 0).\n";
std::cout << " where api = the API to use (unspecified / default = 0).\n\n";
exit( 0 );
}
int main( int argc, char *argv[] )
{
RtMidiIn *midiin = 0;
std::vector<unsigned char> message;
int nBytes, i;
double stamp;
// Minimal command-line check.
if ( argc > 3 ) usage();
// RtMidiIn constructor
try {
if (argc <= 2)
midiin = new RtMidiIn();
else
midiin = new RtMidiIn(static_cast<RtMidiIn::Api>(atoi(argv[2])));
}
catch ( RtMidiError &error ) {
error.printMessage();
exit( EXIT_FAILURE );
}
// Check available ports vs. specified.
unsigned int port = 0;
unsigned int nPorts = midiin->getPortCount();
if ( argc >= 2 ) port = (unsigned int) atoi( argv[1] );
if ( port >= nPorts ) {
delete midiin;
std::cout << "Invalid port specifier!\n";
usage();
}
try {
midiin->openPort( port );
}
catch ( RtMidiError &error ) {
error.printMessage();
goto cleanup;
}
// Don't ignore sysex, timing, or active sensing messages.
midiin->ignoreTypes( false, false, false );
// Install an interrupt handler function.
done = false;
(void) signal(SIGINT, finish);
// Periodically check input queue.
std::cout << "Reading MIDI from API " << midiin->getApiDisplayName(midiin->getCurrentApi()) << ", port " << midiin->getPortName(port) << " ... quit with Ctrl-C.\n";
while ( !done ) {
stamp = midiin->getMessage( &message );
nBytes = message.size();
for ( i=0; i<nBytes; i++ )
std::cout << "Byte " << i << " = " << (int)message[i] << ", ";
if ( nBytes > 0 )
std::cout << "stamp = " << stamp << std::endl;
// Sleep for 10 milliseconds.
SLEEP( 10 );
}
// Clean up
cleanup:
delete midiin;
return 0;
}
|