46 #define RTMIDI_VERSION "2.1.1"
88 virtual void printMessage(
void )
const throw() { std::cerr <<
'\n' << message_ <<
"\n\n"; }
91 virtual const Type&
getType(
void)
const throw() {
return type_; }
94 virtual const std::string&
getMessage(
void)
const throw() {
return message_; }
97 virtual const char*
what(
void )
const throw() {
return message_.c_str(); }
100 std::string message_;
131 static std::string
getVersion(
void ) throw();
142 virtual
void openPort(
unsigned int portNumber = 0, const std::
string portName = std::
string( "
RtMidi" ) ) = 0;
145 virtual
void openVirtualPort( const std::
string portName = std::
string( "RtMidi" ) ) = 0;
151 virtual std::
string getPortName(
unsigned int portNumber = 0 ) = 0;
211 typedef void (*RtMidiCallback)(
double timeStamp, std::vector<unsigned char> *message,
void *userData);
232 const std::string clientName = std::string(
"RtMidi Input Client"),
233 unsigned int queueSizeLimit = 100 );
239 RtMidi::
Api getCurrentApi(
void ) throw();
247 void openPort(
unsigned int portNumber = 0, const std::
string portName = std::
string( "RtMidi Input" ) );
259 void openVirtualPort( const std::
string portName = std::
string( "RtMidi Input" ) );
272 void setCallback( RtMidiCallback callback,
void *userData = 0 );
279 void cancelCallback();
291 unsigned int getPortCount();
298 std::
string getPortName(
unsigned int portNumber = 0 );
308 void ignoreTypes(
bool midiSysex = true,
bool midiTime = true,
bool midiSense = true );
318 double getMessage( std::vector<
unsigned char> *message );
328 void openMidiApi( RtMidi::
Api api, const std::
string clientName,
unsigned int queueSizeLimit );
361 const std::string clientName = std::string(
"RtMidi Output Client") );
376 void openPort(
unsigned int portNumber = 0,
const std::string portName = std::string(
"RtMidi Output" ) );
393 void openVirtualPort(
const std::string portName = std::string(
"RtMidi Output" ) );
402 std::string
getPortName(
unsigned int portNumber = 0 );
409 void sendMessage( std::vector<unsigned char> *message );
419 void openMidiApi(
RtMidi::Api api,
const std::string clientName );
443 virtual void openPort(
unsigned int portNumber,
const std::string portName ) = 0;
448 virtual std::string
getPortName(
unsigned int portNumber ) = 0;
450 inline bool isPortOpen()
const {
return connected_; }
457 virtual void initialize(
const std::string& clientName ) = 0;
461 std::string errorString_;
463 bool firstErrorOccurred_;
464 void *errorCallbackUserData_;
467 class MidiInApi :
public MidiApi
471 MidiInApi(
unsigned int queueSizeLimit );
472 virtual ~MidiInApi(
void );
474 void cancelCallback(
void );
475 virtual void ignoreTypes(
bool midiSysex,
bool midiTime,
bool midiSense );
476 double getMessage( std::vector<unsigned char> *message );
481 std::vector<unsigned char> bytes;
486 :bytes(0), timeStamp(0.0) {}
493 unsigned int ringSize;
498 :front(0), back(0), size(0), ringSize(0) {}
503 struct RtMidiInData {
506 unsigned char ignoreFlags;
517 : ignoreFlags(7), doInput(false), firstMessage(true),
518 apiData(0), usingCallback(false), userCallback(0), userData(0),
519 continueSysex(false) {}
523 RtMidiInData inputData_;
526 class MidiOutApi :
public MidiApi
531 virtual ~MidiOutApi(
void );
532 virtual void sendMessage( std::vector<unsigned char> *message ) = 0;
542 inline void RtMidiIn :: openPort(
unsigned int portNumber,
const std::string portName ) { rtapi_->openPort( portNumber, portName ); }
546 inline void RtMidiIn :: setCallback( RtMidiCallback callback,
void *userData ) { ((MidiInApi *)rtapi_)->setCallback( callback, userData ); }
550 inline void RtMidiIn :: ignoreTypes(
bool midiSysex,
bool midiTime,
bool midiSense ) { ((MidiInApi *)rtapi_)->ignoreTypes( midiSysex, midiTime, midiSense ); }
551 inline double RtMidiIn :: getMessage( std::vector<unsigned char> *message ) {
return ((MidiInApi *)rtapi_)->getMessage( message ); }
555 inline void RtMidiOut :: openPort(
unsigned int portNumber,
const std::string portName ) { rtapi_->openPort( portNumber, portName ); }
570 #if !defined(__LINUX_ALSA__) && !defined(__UNIX_JACK__) && !defined(__MACOSX_CORE__) && !defined(__WINDOWS_MM__)
571 #define __RTMIDI_DUMMY__
574 #if defined(__MACOSX_CORE__)
576 class MidiInCore:
public MidiInApi
579 MidiInCore(
const std::string clientName,
unsigned int queueSizeLimit );
582 void openPort(
unsigned int portNumber,
const std::string portName );
586 std::string
getPortName(
unsigned int portNumber );
589 void initialize(
const std::string& clientName );
592 class MidiOutCore:
public MidiOutApi
595 MidiOutCore(
const std::string clientName );
596 ~MidiOutCore(
void );
598 void openPort(
unsigned int portNumber,
const std::string portName );
602 std::string
getPortName(
unsigned int portNumber );
603 void sendMessage( std::vector<unsigned char> *message );
606 void initialize(
const std::string& clientName );
611 #if defined(__UNIX_JACK__)
613 class MidiInJack:
public MidiInApi
616 MidiInJack(
const std::string clientName,
unsigned int queueSizeLimit );
619 void openPort(
unsigned int portNumber,
const std::string portName );
623 std::string
getPortName(
unsigned int portNumber );
626 std::string clientName;
628 void connect(
void );
629 void initialize(
const std::string& clientName );
632 class MidiOutJack:
public MidiOutApi
635 MidiOutJack(
const std::string clientName );
636 ~MidiOutJack(
void );
638 void openPort(
unsigned int portNumber,
const std::string portName );
642 std::string
getPortName(
unsigned int portNumber );
643 void sendMessage( std::vector<unsigned char> *message );
646 std::string clientName;
648 void connect(
void );
649 void initialize(
const std::string& clientName );
654 #if defined(__LINUX_ALSA__)
656 class MidiInAlsa:
public MidiInApi
659 MidiInAlsa(
const std::string clientName,
unsigned int queueSizeLimit );
662 void openPort(
unsigned int portNumber,
const std::string portName );
666 std::string
getPortName(
unsigned int portNumber );
669 void initialize(
const std::string& clientName );
672 class MidiOutAlsa:
public MidiOutApi
675 MidiOutAlsa(
const std::string clientName );
676 ~MidiOutAlsa(
void );
678 void openPort(
unsigned int portNumber,
const std::string portName );
682 std::string
getPortName(
unsigned int portNumber );
683 void sendMessage( std::vector<unsigned char> *message );
686 void initialize(
const std::string& clientName );
691 #if defined(__WINDOWS_MM__)
693 class MidiInWinMM:
public MidiInApi
696 MidiInWinMM(
const std::string clientName,
unsigned int queueSizeLimit );
697 ~MidiInWinMM(
void );
699 void openPort(
unsigned int portNumber,
const std::string portName );
703 std::string
getPortName(
unsigned int portNumber );
706 void initialize(
const std::string& clientName );
709 class MidiOutWinMM:
public MidiOutApi
712 MidiOutWinMM(
const std::string clientName );
713 ~MidiOutWinMM(
void );
715 void openPort(
unsigned int portNumber,
const std::string portName );
719 std::string
getPortName(
unsigned int portNumber );
720 void sendMessage( std::vector<unsigned char> *message );
723 void initialize(
const std::string& clientName );
728 #if defined(__RTMIDI_DUMMY__)
730 class MidiInDummy:
public MidiInApi
733 MidiInDummy(
const std::string ,
unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { errorString_ =
"MidiInDummy: This class provides no functionality."; error(
RtMidiError::WARNING, errorString_ ); }
735 void openPort(
unsigned int ,
const std::string ) {}
739 std::string
getPortName(
unsigned int portNumber ) {
return ""; }
742 void initialize(
const std::string& ) {}
745 class MidiOutDummy:
public MidiOutApi
748 MidiOutDummy(
const std::string ) { errorString_ =
"MidiOutDummy: This class provides no functionality."; error(
RtMidiError::WARNING, errorString_ ); }
750 void openPort(
unsigned int ,
const std::string ) {}
754 std::string
getPortName(
unsigned int ) {
return ""; }
755 void sendMessage( std::vector<unsigned char> * ) {}
758 void initialize(
const std::string& ) {}