00001
00002
00003
00004
00005
00006
00007 #ifndef CSL_MIDIIO_H
00008 #define CSL_MIDIIO_H
00009
00010 #include "CSL_Types.h"
00011 #include "CGestalt.h"
00012 #include "Instrument.h"
00013 #include "juce.h"
00014
00015 namespace csl {
00016
00018
00019 typedef enum {
00020 kNone = 0,
00021 kNoteOff = 8,
00022 kNoteOn = 9,
00023 kPolyTouch = 10,
00024 kControlChange = 11,
00025 kProgramChange = 12,
00026 kAftertouch = 13,
00027 kPitchWheel = 14,
00028 kSysEX = 15
00029 } CMIDIMessageType;
00030
00032
00033 #define MessageChannelToStatus(message, channel) ((unsigned) message << 4) + channel)
00034
00038
00039 class CMIDIMessage {
00040 public:
00041 CMIDIMessage();
00042 CMIDIMessage(CMIDIMessageType t, unsigned ch, unsigned d1, unsigned d2);
00043
00044 bool isNoteOn();
00045 bool isNoteOff();
00046 bool isPolyTouch();
00047 bool isControlChange();
00048 bool isProgramChange();
00049 bool isAftertouch();
00050 bool isPitchWheel();
00051 bool isSysEX();
00052
00053 unsigned getCommand();
00054 unsigned getNote();
00055 unsigned getVelocity();
00056 unsigned getPolyAftertouch();
00057 unsigned getControlFunction();
00058 unsigned getControlValue();
00059 unsigned getProgramNumber();
00060 unsigned getAftertouch();
00061 unsigned getPitchWheel();
00062 float getFrequency();
00063 float getVelocityFloat();
00064
00065 CMIDIMessageType message;
00066 unsigned command;
00067 unsigned channel;
00068 unsigned data1;
00069 unsigned data2;
00070 float time;
00071 };
00072
00073
00077
00078 class MIDIIO: public Model {
00079 public:
00080 MIDIIO();
00081 virtual ~MIDIIO();
00082
00083 static int countDevices();
00084 static void dumpDevices();
00085
00086 void open();
00087 virtual void open(int devID) = 0;
00088 bool isOpen();
00089 virtual void close();
00090 virtual void start() { };
00091 virtual void stop() { };
00092 virtual void clear();
00093 void dumpBuffer();
00094
00095 int mDeviceID;
00096 CMIDIMessage mMsg;
00097 CMIDIMessage mMsg2;
00098 MidiBuffer mBuffer;
00099
00100 protected:
00101 static bool mIsInitialized;
00102
00103 juce::MidiMessage * mJMsg;
00104
00105 bool mIsOpen;
00106 long mBufferSize;
00107 long mFilterFlag;
00109 void handleError(CException * err);
00110
00112 void copyMessage(CMIDIMessage& source, CMIDIMessage& dest);
00113 void copyMessage(CMIDIMessage& source, MidiMessage* dest);
00114 void copyMessage(const MidiMessage& source, CMIDIMessage& dest);
00115 };
00116
00117
00121
00122 class MIDIIn : public MIDIIO, public MidiInputCallback {
00123 public:
00124 MIDIIn();
00125
00126 unsigned bufferSize();
00127 void setBufferSize(unsigned bufferSize );
00128 virtual void open(int deviceID);
00129 bool poll();
00130 void nextEvent();
00131 void dumpMessage();
00132 virtual void start();
00133 virtual void stop();
00134 int evaluate(void * arg);
00135
00137 void handleIncomingMidiMessage(MidiInput * source, const MidiMessage & message);
00138
00139 MidiInput * mDevice;
00140 double mStartTime;
00141 };
00142
00143
00147
00148 class MIDIOut : public MIDIIO {
00149 public:
00150 MIDIOut();
00151 ~MIDIOut();
00152
00153 MidiOutput * mOut;
00154
00155 virtual void open(int deviceID );
00156 void write(CMIDIMessage & msg);
00157 void writeNoteOn(unsigned channel, unsigned pitch, unsigned velocity );
00158 void writeNoteOn(unsigned channel, float frequency, float amplitude );
00159 void writeNoteOff(unsigned channel, unsigned pitch, unsigned velocity );
00160 void writeNoteOff(unsigned channel, float frequency, float amplitude );
00161 void writePolyTouch(unsigned channel, unsigned pitch, unsigned amount );
00162 void writeControlChange(unsigned channel, unsigned function, unsigned value );
00163 void writeProgramChange(unsigned channel, unsigned programNum );
00164 void writeAftertouch(unsigned channel, unsigned amount );
00165 void writePitchWheel(unsigned channel, unsigned amount );
00166 void writeSysEX(long when, unsigned char *msg );
00167
00168 protected:
00169 long mBufferSize;
00170 long mLatency;
00171
00172 };
00173
00174
00178
00179 class MIDIPlayer: public MIDIIO {
00180 public:
00181 MIDIPlayer(string nam, InstrumentLibrary * lib);
00182 MIDIPlayer(string folder, string nam, InstrumentLibrary * lib);
00183 ~MIDIPlayer() { }
00184
00185 void open(int devID) { };
00186 void start(int index);
00187 void stop();
00188
00189 MidiFile mFile;
00190 int mNumTrax;
00191 MidiMessageSequence * mTrak;
00192 bool mIsOn;
00193
00194 InstrumentLibrary * mLibrary;
00195 float mTempoScale;
00196
00197 protected:
00198 void init(String namS);
00199 MidiMessageSequence * mergeTrax();
00200
00201 };
00202
00203 }
00204
00205 #endif