|
- //*****************************************//
- // 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(__WINDOWS_MM__)
- #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>\n";
- std::cout << " where port = the device to use (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 > 2 ) usage();
-
- // RtMidiIn constructor
- try {
- midiin = new RtMidiIn();
- }
- catch ( RtError &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 ( RtError &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 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;
- }
|