To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / CollidoscopeApp / include / MIDI.h @ 2:dd889fff8423
History | View | Annotate | Download (1.63 KB)
| 1 |
#pragma once
|
|---|---|
| 2 |
|
| 3 |
#include "RtMidi.h" |
| 4 |
#include <memory> |
| 5 |
#include <mutex> |
| 6 |
#include <array> |
| 7 |
|
| 8 |
class Config; |
| 9 |
|
| 10 |
|
| 11 |
namespace collidoscope {
|
| 12 |
|
| 13 |
|
| 14 |
class MIDIException : public std::exception |
| 15 |
{
|
| 16 |
public:
|
| 17 |
|
| 18 |
MIDIException( std::string message ) : mMessage( message ) {}
|
| 19 |
|
| 20 |
virtual const std::string& getMessage( void ) const { return mMessage; } |
| 21 |
|
| 22 |
#ifdef _WINDOWS
|
| 23 |
const char* what() const override { return mMessage.c_str(); } |
| 24 |
#else
|
| 25 |
const char* what() const noexcept override { return mMessage.c_str(); } |
| 26 |
#endif
|
| 27 |
|
| 28 |
protected:
|
| 29 |
std::string mMessage; |
| 30 |
}; |
| 31 |
|
| 32 |
class MIDIMessage |
| 33 |
{
|
| 34 |
friend class MIDI; |
| 35 |
public:
|
| 36 |
|
| 37 |
enum class Voice { eNoteOn, eNoteOff, ePitchBend, eControlChange, eIgnore };
|
| 38 |
|
| 39 |
Voice getVoice() { return mVoice; }
|
| 40 |
|
| 41 |
unsigned char getChannel() { return mChannel; } |
| 42 |
|
| 43 |
unsigned char getData_1() { return mData1; } |
| 44 |
|
| 45 |
unsigned char getData_2() { return mData2; } |
| 46 |
|
| 47 |
private:
|
| 48 |
|
| 49 |
Voice mVoice = Voice::eIgnore; |
| 50 |
unsigned char mChannel; |
| 51 |
unsigned char mData1; |
| 52 |
unsigned char mData2; |
| 53 |
|
| 54 |
|
| 55 |
}; |
| 56 |
|
| 57 |
|
| 58 |
class MIDI |
| 59 |
{
|
| 60 |
|
| 61 |
public:
|
| 62 |
|
| 63 |
MIDI(); |
| 64 |
~MIDI(); |
| 65 |
|
| 66 |
void setup( const Config& ); |
| 67 |
|
| 68 |
void checkMessages( std::vector< MIDIMessage >& );
|
| 69 |
|
| 70 |
private:
|
| 71 |
|
| 72 |
static void RtMidiInCallback( double deltatime, std::vector<unsigned char> *message, void *userData ); |
| 73 |
|
| 74 |
MIDIMessage parseRtMidiMessage( std::vector<unsigned char> *message ); |
| 75 |
|
| 76 |
// messages to pass to checkMessages caller
|
| 77 |
std::vector< MIDIMessage > mMIDIMessages; |
| 78 |
std::array< MIDIMessage, NUM_WAVES > mPitchBendMessages; |
| 79 |
std::array< MIDIMessage, NUM_WAVES > mFilterMessages; |
| 80 |
|
| 81 |
|
| 82 |
|
| 83 |
std::vector< std::unique_ptr <RtMidiIn> > mInputs; |
| 84 |
std::mutex mMutex; |
| 85 |
}; |
| 86 |
|
| 87 |
|
| 88 |
|
| 89 |
} // collidsocope }
|