46 #define RTMIDI_VERSION "3.0.0"
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;
215 typedef void (*RtMidiCallback)(
double timeStamp, std::vector<unsigned char> *message,
void *userData);
236 const std::string& clientName =
"RtMidi Input Client",
237 unsigned int queueSizeLimit = 100 );
243 RtMidi::
Api getCurrentApi(
void ) throw();
251 void openPort(
unsigned int portNumber = 0, const std::
string &portName = std::
string( "RtMidi Input" ) );
263 void openVirtualPort( const std::
string &portName = std::
string( "RtMidi Input" ) );
276 void setCallback( RtMidiCallback callback,
void *userData = 0 );
283 void cancelCallback();
299 unsigned int getPortCount();
307 std::
string getPortName(
unsigned int portNumber = 0 );
317 void ignoreTypes(
bool midiSysex = true,
bool midiTime = true,
bool midiSense = true );
327 double getMessage( std::vector<
unsigned char> *message );
337 void openMidiApi( RtMidi::
Api api, const std::
string &clientName,
unsigned int queueSizeLimit );
370 const std::string& clientName =
"RtMidi Output Client" );
385 void openPort(
unsigned int portNumber = 0,
const std::string &portName = std::string(
"RtMidi Output" ) );
406 void openVirtualPort(
const std::string &portName = std::string(
"RtMidi Output" ) );
417 std::string
getPortName(
unsigned int portNumber = 0 );
424 void sendMessage(
const std::vector<unsigned char> *message );
434 void sendMessage(
const unsigned char *message,
size_t size );
444 void openMidiApi(
RtMidi::Api api,
const std::string &clientName );
468 virtual void openPort(
unsigned int portNumber,
const std::string &portName ) = 0;
473 virtual std::string
getPortName(
unsigned int portNumber ) = 0;
475 inline bool isPortOpen()
const {
return connected_; }
482 virtual void initialize(
const std::string& clientName ) = 0;
486 std::string errorString_;
488 bool firstErrorOccurred_;
489 void *errorCallbackUserData_;
492 class MidiInApi :
public MidiApi
496 MidiInApi(
unsigned int queueSizeLimit );
497 virtual ~MidiInApi(
void );
499 void cancelCallback(
void );
500 virtual void ignoreTypes(
bool midiSysex,
bool midiTime,
bool midiSense );
501 double getMessage( std::vector<unsigned char> *message );
506 std::vector<unsigned char> bytes;
513 :bytes(0), timeStamp(0.0) {}
519 unsigned int ringSize;
524 :front(0), back(0), ringSize(0), ring(0) {}
525 bool push(
const MidiMessage&);
526 bool pop(std::vector<unsigned char>*,
double*);
527 unsigned int size(
unsigned int *back=0,
528 unsigned int *front=0);
533 struct RtMidiInData {
536 unsigned char ignoreFlags;
547 : ignoreFlags(7), doInput(false), firstMessage(true),
548 apiData(0), usingCallback(false), userCallback(0), userData(0),
549 continueSysex(false) {}
553 RtMidiInData inputData_;
556 class MidiOutApi :
public MidiApi
561 virtual ~MidiOutApi(
void );
562 virtual void sendMessage(
const unsigned char *message,
size_t size ) = 0;
572 inline void RtMidiIn :: openPort(
unsigned int portNumber,
const std::string &portName ) { rtapi_->openPort( portNumber, portName ); }
576 inline void RtMidiIn :: setCallback( RtMidiCallback callback,
void *userData ) { ((MidiInApi *)rtapi_)->setCallback( callback, userData ); }
580 inline void RtMidiIn :: ignoreTypes(
bool midiSysex,
bool midiTime,
bool midiSense ) { ((MidiInApi *)rtapi_)->ignoreTypes( midiSysex, midiTime, midiSense ); }
581 inline double RtMidiIn :: getMessage( std::vector<unsigned char> *message ) {
return ((MidiInApi *)rtapi_)->getMessage( message ); }
585 inline void RtMidiOut :: openPort(
unsigned int portNumber,
const std::string &portName ) { rtapi_->openPort( portNumber, portName ); }
591 inline void RtMidiOut :: sendMessage(
const std::vector<unsigned char> *message ) { ((MidiOutApi *)rtapi_)->sendMessage( &message->at(0), message->size() ); }
592 inline void RtMidiOut :: sendMessage(
const unsigned char *message,
size_t size ) { ((MidiOutApi *)rtapi_)->sendMessage( message, size ); }
601 #if !defined(__LINUX_ALSA__) && !defined(__UNIX_JACK__) && !defined(__MACOSX_CORE__) && !defined(__WINDOWS_MM__)
602 #define __RTMIDI_DUMMY__
605 #if defined(__MACOSX_CORE__)
607 class MidiInCore:
public MidiInApi
610 MidiInCore(
const std::string &clientName,
unsigned int queueSizeLimit );
613 void openPort(
unsigned int portNumber,
const std::string &portName );
617 std::string
getPortName(
unsigned int portNumber );
620 void initialize(
const std::string& clientName );
623 class MidiOutCore:
public MidiOutApi
626 MidiOutCore(
const std::string &clientName );
627 ~MidiOutCore(
void );
629 void openPort(
unsigned int portNumber,
const std::string &portName );
633 std::string
getPortName(
unsigned int portNumber );
634 void sendMessage(
const unsigned char *message,
size_t size );
637 void initialize(
const std::string& clientName );
642 #if defined(__UNIX_JACK__)
644 class MidiInJack:
public MidiInApi
647 MidiInJack(
const std::string &clientName,
unsigned int queueSizeLimit );
650 void openPort(
unsigned int portNumber,
const std::string &portName );
654 std::string
getPortName(
unsigned int portNumber );
657 std::string clientName;
659 void connect(
void );
660 void initialize(
const std::string& clientName );
663 class MidiOutJack:
public MidiOutApi
666 MidiOutJack(
const std::string &clientName );
667 ~MidiOutJack(
void );
669 void openPort(
unsigned int portNumber,
const std::string &portName );
673 std::string
getPortName(
unsigned int portNumber );
674 void sendMessage(
const unsigned char *message,
size_t size );
677 std::string clientName;
679 void connect(
void );
680 void initialize(
const std::string& clientName );
685 #if defined(__LINUX_ALSA__)
687 class MidiInAlsa:
public MidiInApi
690 MidiInAlsa(
const std::string &clientName,
unsigned int queueSizeLimit );
693 void openPort(
unsigned int portNumber,
const std::string &portName );
697 std::string
getPortName(
unsigned int portNumber );
700 void initialize(
const std::string& clientName );
703 class MidiOutAlsa:
public MidiOutApi
706 MidiOutAlsa(
const std::string &clientName );
707 ~MidiOutAlsa(
void );
709 void openPort(
unsigned int portNumber,
const std::string &portName );
713 std::string
getPortName(
unsigned int portNumber );
714 void sendMessage(
const unsigned char *message,
size_t size );
717 void initialize(
const std::string& clientName );
722 #if defined(__WINDOWS_MM__)
724 class MidiInWinMM:
public MidiInApi
727 MidiInWinMM(
const std::string &clientName,
unsigned int queueSizeLimit );
728 ~MidiInWinMM(
void );
730 void openPort(
unsigned int portNumber,
const std::string &portName );
734 std::string
getPortName(
unsigned int portNumber );
737 void initialize(
const std::string& clientName );
740 class MidiOutWinMM:
public MidiOutApi
743 MidiOutWinMM(
const std::string &clientName );
744 ~MidiOutWinMM(
void );
746 void openPort(
unsigned int portNumber,
const std::string &portName );
750 std::string
getPortName(
unsigned int portNumber );
751 void sendMessage(
const unsigned char *message,
size_t size );
754 void initialize(
const std::string& clientName );
759 #if defined(__RTMIDI_DUMMY__)
761 class MidiInDummy:
public MidiInApi
764 MidiInDummy(
const std::string &,
unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { errorString_ =
"MidiInDummy: This class provides no functionality."; error(
RtMidiError::WARNING, errorString_ ); }
766 void openPort(
unsigned int ,
const std::string & ) {}
770 std::string
getPortName(
unsigned int ) {
return ""; }
773 void initialize(
const std::string& ) {}
776 class MidiOutDummy:
public MidiOutApi
779 MidiOutDummy(
const std::string & ) { errorString_ =
"MidiOutDummy: This class provides no functionality."; error(
RtMidiError::WARNING, errorString_ ); }
781 void openPort(
unsigned int ,
const std::string & ) {}
785 std::string
getPortName(
unsigned int ) {
return ""; }
786 void sendMessage(
const unsigned char * ,
size_t ) {}
789 void initialize(
const std::string& ) {}