midiout.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. //*****************************************//
  2. // midiout.cpp
  3. // by Gary Scavone, 2003-2004.
  4. //
  5. // Simple program to test MIDI output.
  6. //
  7. //*****************************************//
  8. #include <iostream>
  9. #include "RtMidi.h"
  10. // Platform-dependent sleep routines.
  11. #if defined(__WINDOWS_MM__)
  12. #include <windows.h>
  13. #define SLEEP( milliseconds ) Sleep( (DWORD) milliseconds )
  14. #else // Unix variants
  15. #include <unistd.h>
  16. #define SLEEP( milliseconds ) usleep( (unsigned long) (milliseconds * 1000.0) )
  17. #endif
  18. void usage(void) {
  19. // Error function in case of incorrect command-line
  20. // argument specifications.
  21. std::cout << "\nuseage: midiout <port>\n";
  22. std::cout << " where port = the device to use (default = 0).\n\n";
  23. exit(0);
  24. }
  25. int main(int argc, char *argv[])
  26. {
  27. RtMidiOut *midiout = 0;
  28. std::vector<unsigned char> message;
  29. // Minimal command-line check.
  30. if ( argc > 2 ) usage();
  31. // RtMidiOut constructor
  32. try {
  33. midiout = new RtMidiOut();
  34. }
  35. catch (RtError &error) {
  36. error.printMessage();
  37. exit(EXIT_FAILURE);
  38. }
  39. // Check available ports vs. specified.
  40. unsigned int port = 0;
  41. unsigned int nPorts = midiout->getPortCount();
  42. if ( argc == 2 ) port = (unsigned int) atoi( argv[1] );
  43. if ( port >= nPorts ) {
  44. delete midiout;
  45. std::cout << "Invalid port specifier!\n";
  46. usage();
  47. }
  48. try {
  49. midiout->openPort( port );
  50. //midiout->openVirtualPort();
  51. }
  52. catch (RtError &error) {
  53. error.printMessage();
  54. goto cleanup;
  55. }
  56. // Send out a series of MIDI messages.
  57. // Program change: 192, 5
  58. message.push_back( 192 );
  59. message.push_back( 5 );
  60. midiout->sendMessage( &message );
  61. // Control Change: 176, 7, 100 (volume)
  62. message[0] = 176;
  63. message[1] = 7;
  64. message.push_back( 100 );
  65. midiout->sendMessage( &message );
  66. // Note On: 144, 64, 90
  67. message[0] = 144;
  68. message[1] = 64;
  69. message[2] = 90;
  70. midiout->sendMessage( &message );
  71. SLEEP( 500 );
  72. // Note Off: 128, 64, 40
  73. message[0] = 128;
  74. message[1] = 64;
  75. message[2] = 40;
  76. midiout->sendMessage( &message );
  77. // Sysex: 240, 67, 16, 4, 3, 2, 247
  78. message[0] = 240;
  79. message[1] = 67;
  80. message[2] = 4;
  81. message.push_back( 3 );
  82. message.push_back( 2 );
  83. message.push_back( 247 );
  84. midiout->sendMessage( &message );
  85. // Clean up
  86. cleanup:
  87. delete midiout;
  88. return 0;
  89. }