99 lines
2.3 KiB
C++
99 lines
2.3 KiB
C++
![]() |
//*****************************************//
|
||
|
// 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>\n";
|
||
|
std::cout << " where port = the device to use (first / 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 ( 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 port " << midiin->getPortName() << " ... 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;
|
||
|
}
|