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_;
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 );
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" ) );
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;
469 virtual void openVirtualPort(
const std::string &portName ) = 0;
470 virtual void closePort(
void ) = 0;
472 virtual unsigned int getPortCount(
void ) = 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_;
496 MidiInApi(
unsigned int queueSizeLimit );
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;
519 unsigned int ringSize;
524 :front(0), back(0), ringSize(0), ring(0) {}
526 bool pop(std::vector<unsigned char>*,
double*);
527 unsigned int size(
unsigned int *back=0,
528 unsigned int *front=0);
536 unsigned char ignoreFlags;
547 : ignoreFlags(7), doInput(
false), firstMessage(
true),
548 apiData(0), usingCallback(
false), userCallback(0), userData(0),
549 continueSysex(
false) {}
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 ); }
585 inline void RtMidiOut :: openPort(
unsigned int portNumber,
const std::string &portName ) { rtapi_->openPort( portNumber, portName ); }
601 #if !defined(__LINUX_ALSA__) && !defined(__UNIX_JACK__) && !defined(__MACOSX_CORE__) && !defined(__WINDOWS_MM__)
602 #define __RTMIDI_DUMMY__
605 #if defined(__MACOSX_CORE__)
610 MidiInCore(
const std::string &clientName,
unsigned int queueSizeLimit );
613 void openPort(
unsigned int portNumber,
const std::string &portName );
614 void openVirtualPort(
const std::string &portName );
615 void closePort(
void );
616 unsigned int getPortCount(
void );
617 std::string getPortName(
unsigned int portNumber );
620 void initialize(
const std::string& clientName );
629 void openPort(
unsigned int portNumber,
const std::string &portName );
630 void openVirtualPort(
const std::string &portName );
631 void closePort(
void );
632 unsigned int getPortCount(
void );
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__)
647 MidiInJack(
const std::string &clientName,
unsigned int queueSizeLimit );
650 void openPort(
unsigned int portNumber,
const std::string &portName );
651 void openVirtualPort(
const std::string &portName );
652 void closePort(
void );
653 unsigned int getPortCount(
void );
654 std::string getPortName(
unsigned int portNumber );
657 std::string clientName;
659 void connect(
void );
660 void initialize(
const std::string& clientName );
669 void openPort(
unsigned int portNumber,
const std::string &portName );
670 void openVirtualPort(
const std::string &portName );
671 void closePort(
void );
672 unsigned int getPortCount(
void );
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__)
690 MidiInAlsa(
const std::string &clientName,
unsigned int queueSizeLimit );
693 void openPort(
unsigned int portNumber,
const std::string &portName );
694 void openVirtualPort(
const std::string &portName );
695 void closePort(
void );
696 unsigned int getPortCount(
void );
697 std::string getPortName(
unsigned int portNumber );
700 void initialize(
const std::string& clientName );
709 void openPort(
unsigned int portNumber,
const std::string &portName );
710 void openVirtualPort(
const std::string &portName );
711 void closePort(
void );
712 unsigned int getPortCount(
void );
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__)
727 MidiInWinMM(
const std::string &clientName,
unsigned int queueSizeLimit );
730 void openPort(
unsigned int portNumber,
const std::string &portName );
731 void openVirtualPort(
const std::string &portName );
732 void closePort(
void );
733 unsigned int getPortCount(
void );
734 std::string getPortName(
unsigned int portNumber );
737 void initialize(
const std::string& clientName );
746 void openPort(
unsigned int portNumber,
const std::string &portName );
747 void openVirtualPort(
const std::string &portName );
748 void closePort(
void );
749 unsigned int getPortCount(
void );
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__)
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 & ) {}
767 void openVirtualPort(
const std::string & ) {}
768 void closePort(
void ) {}
769 unsigned int getPortCount(
void ) {
return 0; }
770 std::string getPortName(
unsigned int ) {
return ""; }
773 void initialize(
const std::string& ) {}
779 MidiOutDummy(
const std::string & ) { errorString_ =
"MidiOutDummy: This class provides no functionality.";
error(
RtMidiError::WARNING, errorString_ ); }
781 void openPort(
unsigned int ,
const std::string & ) {}
782 void openVirtualPort(
const std::string & ) {}
783 void closePort(
void ) {}
784 unsigned int getPortCount(
void ) {
return 0; }
785 std::string getPortName(
unsigned int ) {
return ""; }
786 void sendMessage(
const unsigned char * ,
size_t ) {}
789 void initialize(
const std::string& ) {}
void(* RtMidiErrorCallback)(RtMidiError::Type type, const std::string &errorText, void *userData)
RtMidi error callback function prototype.
Definition: RtMidi.h:112
void error(RtMidiError::Type type, std::string errorString)
A basic error reporting function for RtMidi classes.
Exception handling class for RtMidi.
Definition: RtMidi.h:64
virtual const std::string & getMessage(void) const
Returns the thrown error message string.
Definition: RtMidi.h:94
virtual const char * what(void) const
Returns the thrown error message as a c-style string.
Definition: RtMidi.h:97
virtual void printMessage(void) const
Prints thrown error message to stderr.
Definition: RtMidi.h:88
Type
Defined RtMidiError types.
Definition: RtMidi.h:67
@ INVALID_USE
Definition: RtMidi.h:75
@ NO_DEVICES_FOUND
Definition: RtMidi.h:71
@ MEMORY_ERROR
Definition: RtMidi.h:73
@ INVALID_PARAMETER
Definition: RtMidi.h:74
@ WARNING
Definition: RtMidi.h:68
@ INVALID_DEVICE
Definition: RtMidi.h:72
@ THREAD_ERROR
Definition: RtMidi.h:78
@ DRIVER_ERROR
Definition: RtMidi.h:76
@ UNSPECIFIED
Definition: RtMidi.h:70
@ DEBUG_WARNING
Definition: RtMidi.h:69
@ SYSTEM_ERROR
Definition: RtMidi.h:77
virtual const Type & getType(void) const
Returns the thrown error message type.
Definition: RtMidi.h:91
virtual ~RtMidiError(void)
The destructor.
Definition: RtMidi.h:85
RtMidiError(const std::string &message, Type type=RtMidiError::UNSPECIFIED)
The constructor.
Definition: RtMidi.h:82
A realtime MIDI input class.
Definition: RtMidi.h:211
double getMessage(std::vector< unsigned char > *message)
Fill the user-provided vector with the data bytes for the next available MIDI message in the input qu...
Definition: RtMidi.h:581
void openPort(unsigned int portNumber=0, const std::string &portName=std::string("RtMidi Input"))
Open a MIDI input connection given by enumeration number.
Definition: RtMidi.h:572
void closePort(void)
Close an open MIDI connection (if one exists).
Definition: RtMidi.h:574
unsigned int getPortCount()
Return the number of available MIDI input ports.
Definition: RtMidi.h:578
RtMidi::Api getCurrentApi(void)
Returns the MIDI API specifier for the current instance of RtMidiIn.
Definition: RtMidi.h:571
void setCallback(RtMidiCallback callback, void *userData=0)
Set a callback function to be invoked for incoming MIDI messages.
Definition: RtMidi.h:576
void openVirtualPort(const std::string &portName=std::string("RtMidi Input"))
Create a virtual input port, with optional name, to allow software connections (OS X,...
Definition: RtMidi.h:573
RtMidiIn(RtMidi::Api api=UNSPECIFIED, const std::string &clientName="RtMidi Input Client", unsigned int queueSizeLimit=100)
Default constructor that allows an optional api, client name and queue size.
virtual bool isPortOpen() const
Returns true if a port is open and false if not.
Definition: RtMidi.h:575
void(* RtMidiCallback)(double timeStamp, std::vector< unsigned char > *message, void *userData)
User callback function type definition.
Definition: RtMidi.h:215
virtual void setErrorCallback(RtMidiErrorCallback errorCallback=NULL, void *userData=0)
Set an error callback function to be invoked when an error has occured.
Definition: RtMidi.h:582
void cancelCallback()
Cancel use of the current callback function (if one exists).
Definition: RtMidi.h:577
~RtMidiIn(void)
If a MIDI connection is still open, it will be closed by the destructor.
std::string getPortName(unsigned int portNumber=0)
Return a string identifier for the specified MIDI input port number.
Definition: RtMidi.h:579
void ignoreTypes(bool midiSysex=true, bool midiTime=true, bool midiSense=true)
Specify whether certain MIDI message types should be queued or ignored during input.
Definition: RtMidi.h:580
A realtime MIDI output class.
Definition: RtMidi.h:358
unsigned int getPortCount(void)
Return the number of available MIDI output ports.
Definition: RtMidi.h:589
void sendMessage(const std::vector< unsigned char > *message)
Immediately send a single message out an open MIDI output port.
Definition: RtMidi.h:591
void openPort(unsigned int portNumber=0, const std::string &portName=std::string("RtMidi Output"))
Open a MIDI output connection.
Definition: RtMidi.h:585
RtMidi::Api getCurrentApi(void)
Returns the MIDI API specifier for the current instance of RtMidiOut.
Definition: RtMidi.h:584
void closePort(void)
Close an open MIDI connection (if one exists).
Definition: RtMidi.h:587
RtMidiOut(RtMidi::Api api=UNSPECIFIED, const std::string &clientName="RtMidi Output Client")
Default constructor that allows an optional client name.
void openVirtualPort(const std::string &portName=std::string("RtMidi Output"))
Create a virtual output port, with optional name, to allow software connections (OS X,...
Definition: RtMidi.h:586
virtual bool isPortOpen() const
Returns true if a port is open and false if not.
Definition: RtMidi.h:588
virtual void setErrorCallback(RtMidiErrorCallback errorCallback=NULL, void *userData=0)
Set an error callback function to be invoked when an error has occured.
Definition: RtMidi.h:593
std::string getPortName(unsigned int portNumber=0)
Return a string identifier for the specified MIDI port type and number.
Definition: RtMidi.h:590
~RtMidiOut(void)
The destructor closes any open MIDI connections.
An abstract base class for realtime MIDI input/output.
Definition: RtMidi.h:117
static void getCompiledApi(std::vector< RtMidi::Api > &apis)
A static function to determine the available compiled MIDI APIs.
virtual void openVirtualPort(const std::string &portName=std::string("RtMidi"))=0
Pure virtual openVirtualPort() function.
virtual void closePort(void)=0
Pure virtual closePort() function.
virtual void openPort(unsigned int portNumber=0, const std::string &portName=std::string("RtMidi"))=0
Pure virtual openPort() function.
virtual bool isPortOpen(void) const =0
Returns true if a port is open and false if not.
virtual std::string getPortName(unsigned int portNumber=0)=0
Pure virtual getPortName() function.
static std::string getVersion(void)
A static function to determine the current RtMidi version.
virtual unsigned int getPortCount()=0
Pure virtual getPortCount() function.
virtual void setErrorCallback(RtMidiErrorCallback errorCallback=NULL, void *userData=0)=0
Set an error callback function to be invoked when an error has occured.
Api
MIDI API specifier arguments.
Definition: RtMidi.h:121
@ UNIX_JACK
Definition: RtMidi.h:125
@ LINUX_ALSA
Definition: RtMidi.h:124
@ MACOSX_CORE
Definition: RtMidi.h:123
@ UNSPECIFIED
Definition: RtMidi.h:122
@ RTMIDI_DUMMY
Definition: RtMidi.h:127
@ WINDOWS_MM
Definition: RtMidi.h:126
double timeStamp
Time in seconds elapsed since the previous message.
Definition: RtMidi.h:509