summaryrefslogtreecommitdiff
path: root/tests/qmidiin.cpp
diff options
context:
space:
mode:
authorGary Scavone <gary@music.mcgill.ca>2013-10-11 14:49:10 +0200
committerStephen Sinclair <sinclair@music.mcgill.ca>2013-10-11 14:49:10 +0200
commiteeca35408122b9fc020139a20255f3c1ad8254cd (patch)
tree1cd66b9cf28691271c67a3ed1a424d1ccf407065 /tests/qmidiin.cpp
Version 1.0.0
Diffstat (limited to 'tests/qmidiin.cpp')
-rw-r--r--tests/qmidiin.cpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/tests/qmidiin.cpp b/tests/qmidiin.cpp
new file mode 100644
index 0000000..639820a
--- /dev/null
+++ b/tests/qmidiin.cpp
@@ -0,0 +1,97 @@
+//*****************************************//
+// qmidiin.cpp
+// by Gary Scavone, 2003-2004.
+//
+// Simple program to test MIDI input and
+// retrieval from the queue.
+//
+//*****************************************//
+
+#include <iostream>
+#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 << "\nuseage: 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 << '\n';
+
+ // Sleep for 10 milliseconds.
+ SLEEP( 10 );
+ }
+
+ // Clean up
+ cleanup:
+ delete midiin;
+
+ return 0;
+}