#include #include #ifndef RTMIDI_C_H #define RTMIDI_C_H #if defined(RTMIDI_EXPORT) #define RTMIDIAPI __declspec(dllexport) #else #define RTMIDIAPI //__declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif //! Wraps an RtMidi object for C function return statuses. struct RtMidiWrapper { //! The wrapped RtMidi object. void* ptr; void* data; //! True when the last function call was OK. bool ok; //! If an error occured (ok != true), set to an error message. const char* msg; }; //! Typedef for a generic RtMidi pointer. typedef struct RtMidiWrapper* RtMidiPtr; //! Typedef for a generic RtMidiIn pointer. typedef struct RtMidiWrapper* RtMidiInPtr; //! Typedef for a generic RtMidiOut pointer. typedef struct RtMidiWrapper* RtMidiOutPtr; enum RtMidiApi { RT_MIDI_API_UNSPECIFIED, /*!< Search for a working compiled API. */ RT_MIDI_API_MACOSX_CORE, /*!< Macintosh OS-X Core Midi API. */ RT_MIDI_API_LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */ RT_MIDI_API_UNIX_JACK, /*!< The Jack Low-Latency MIDI Server API. */ RT_MIDI_API_WINDOWS_MM, /*!< The Microsoft Multimedia MIDI API. */ RT_MIDI_API_RTMIDI_DUMMY /*!< A compilable but non-functional API. */ }; enum RtMidiErrorType { RT_ERROR_WARNING, RT_ERROR_DEBUG_WARNING, RT_ERROR_UNSPECIFIED, RT_ERROR_NO_DEVICES_FOUND, RT_ERROR_INVALID_DEVICE, RT_ERROR_MEMORY_ERROR, RT_ERROR_INVALID_PARAMETER, RT_ERROR_INVALID_USE, RT_ERROR_DRIVER_ERROR, RT_ERROR_SYSTEM_ERROR, RT_ERROR_THREAD_ERROR }; /*! The type of a RtMidi callback function. * \param timeStamp The time at which the message has been received. * \param message The midi message. * \param userData Additional user data for the callback. */ typedef void(* RtMidiCCallback) (double timeStamp, const unsigned char* message, size_t messageSize, void *userData); /* RtMidi API */ /*! Determine the available compiled MIDI APIs. * If the given `apis` parameter is null, returns the number of available APIs. * Otherwise, fill the given apis array with the RtMidi::Api values. * * \param apis An array or a null value. */ RTMIDIAPI int rtmidi_get_compiled_api (enum RtMidiApi *apis); // return length for NULL argument. //! Report an error. RTMIDIAPI void rtmidi_error (enum RtMidiErrorType type, const char* errorString); /*! Open a MIDI port. * * \param port Must be greater than 0 * \param portName Name for the application port. */ RTMIDIAPI void rtmidi_open_port (RtMidiPtr device, unsigned int portNumber, const char *portName); /*! Creates a virtual MIDI port to which other software applications can * connect. * * \param portName Name for the application port. */ RTMIDIAPI void rtmidi_open_virtual_port (RtMidiPtr device, const char *portName); /*! Close a MIDI connection. */ RTMIDIAPI void rtmidi_close_port (RtMidiPtr device); /*! Return the number of available MIDI ports. */ RTMIDIAPI unsigned int rtmidi_get_port_count (RtMidiPtr device); /*! Return a string identifier for the specified MIDI input port number. */ RTMIDIAPI const char* rtmidi_get_port_name (RtMidiPtr device, unsigned int portNumber); /* RtMidiIn API */ //! Create a default RtMidiInPtr value, with no initialization. RTMIDIAPI RtMidiInPtr rtmidi_in_create_default (); /*! Create a RtMidiInPtr value, with given api, clientName and queueSizeLimit. * * \param api An optional API id can be specified. * \param clientName An optional client name can be specified. This * will be used to group the ports that are created * by the application. * \param queueSizeLimit An optional size of the MIDI input queue can be * specified. */ RTMIDIAPI RtMidiInPtr rtmidi_in_create (enum RtMidiApi api, const char *clientName, unsigned int queueSizeLimit); //! Deallocate the given pointer. RTMIDIAPI void rtmidi_in_free (RtMidiInPtr device); //! Returns the MIDI API specifier for the given instance of RtMidiIn. RTMIDIAPI enum RtMidiApi rtmidi_in_get_current_api (RtMidiPtr device); //! Set a callback function to be invoked for incoming MIDI messages. RTMIDIAPI void rtmidi_in_set_callback (RtMidiInPtr device, RtMidiCCallback callback, void *userData); //! Cancel use of the current callback function (if one exists). RTMIDIAPI void rtmidi_in_cancel_callback (RtMidiInPtr device); //! Specify whether certain MIDI message types should be queued or ignored during input. RTMIDIAPI void rtmidi_in_ignore_types (RtMidiInPtr device, bool midiSysex, bool midiTime, bool midiSense); /*! Fill the user-provided array with the data bytes for the next available * MIDI message in the input queue and return the event delta-time in seconds. * * \param message Must point to a char* that is already allocated. * SYSEX messages maximum size being 1024, a statically * allocated array could * be sufficient. * \param size Is used to return the size of the message obtained. */ RTMIDIAPI double rtmidi_in_get_message (RtMidiInPtr device, unsigned char *message, size_t *size); /* RtMidiOut API */ //! Create a default RtMidiInPtr value, with no initialization. RTMIDIAPI RtMidiOutPtr rtmidi_out_create_default (); /*! Create a RtMidiOutPtr value, with given and clientName. * * \param api An optional API id can be specified. * \param clientName An optional client name can be specified. This * will be used to group the ports that are created * by the application. */ RTMIDIAPI RtMidiOutPtr rtmidi_out_create (enum RtMidiApi api, const char *clientName); //! Deallocate the given pointer. RTMIDIAPI void rtmidi_out_free (RtMidiOutPtr device); //! Returns the MIDI API specifier for the given instance of RtMidiOut. RTMIDIAPI enum RtMidiApi rtmidi_out_get_current_api (RtMidiPtr device); //! Immediately send a single message out an open MIDI output port. RTMIDIAPI int rtmidi_out_send_message (RtMidiOutPtr device, const unsigned char *message, int length); #ifdef __cplusplus } #endif #endif