00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __UT_Midi__
00023 #define __UT_Midi__
00024
00025 #include "UT_API.h"
00026 #include <string.h>
00027
00028 #include "UT_Endian.h"
00029 #include "UT_RefArray.h"
00030 #include "UT_PtrArray.h"
00031 #include "UT_IntArray.h"
00032
00033 class UT_MidiFile;
00034
00035 #ifdef WIN32
00036 #define MIDI_IN_DEVICE_BASE 128
00037 #define MIDI_OUT_DEVICE_BASE 256
00038 #else
00039 #define MIDI_IN_DEVICE_BASE 4096
00040 #define MIDI_OUT_DEVICE_BASE 8192
00041 #endif
00042 #define MIDI_IN_FILE_BASE 12288
00043 #define MIDI_OUT_FILE_BASE 16384
00044 #define MIDI_NUM_DEVICES 4095
00045
00046
00047 #define MD_NOSTAMP 1
00048 #define MD_DELTASTAMP 2
00049 #define MD_RELATIVESTAMP 3
00050 #define MD_DELTATICKS 4
00051 #define MD_RELATIVETICKS 5
00052
00053 #define MD_STAMPING_MASK 0xf
00054
00055 #define MD_CHANNELMASK 0x0F
00056 #define MD_STATUSMASK 0xF0
00057
00058 #define MD_CHANNELVOICE 0x80
00059 #define MD_NOTEOFF 0x80
00060 #define MD_NOTEON 0x90
00061 #define MD_POLYKEYPRESSURE 0xA0
00062 #define MD_CONTROLCHANGE 0xB0
00063 #define MD_CHANNELMODESELECT 0xB0
00064 #define MD_PROGRAMCHANGE 0xC0
00065 #define MD_CHANNELPRESSURE 0xD0
00066 #define MD_PITCHBENDCHANGE 0xE0
00067
00068 #ifdef MD_SYSEX
00069 #undef MD_SYSEX
00070 #endif
00071 #define MD_SYSEX 0xF0
00072 #define MD_SYSTEMREALTIME 0xF8
00073 #define MD_TIMINGCLOCK 0xF8
00074 #define MD_UNDEFINED3 0xF9
00075 #define MD_START 0xFA
00076 #define MD_CONTINUE 0xFB
00077 #define MD_STOP 0xFC
00078 #define MD_UNDEFINED4 0xFD
00079 #define MD_ACTIVESENSING 0xFE
00080 #define MD_SYSTEMRESET 0xFF
00081 #define MD_META 0xFF
00082 #define MD_SYSTEMCOMMON 0xF1
00083 #define MD_TIMECODEQUARTERFRAME 0xF1
00084 #define MD_SONGPOSITIONPOINTER 0xF2
00085 #define MD_SONGSELECT 0xF3
00086 #define MD_UNDEFINED1 0xF4
00087 #define MD_UNDEFINED2 0xF5
00088 #define MD_TUNEREQUEST 0xF6
00089 #define MD_EOX 0xF7
00090
00091 #define MAX_SYSEXMSG_LEN 128
00092
00093 #define SYSEX_TYPE_NONE (0)
00094 #define SYSEX_TYPE_BARMARKER (1)
00095
00096 #define MESSAGE_VALUE_RAW (-1)
00097 #define MESSAGE_VALUE_NORM (-2)
00098 #define MESSAGE_DONTCARE (-3)
00099 #define MESSAGE_STOP (-4)
00100
00101
00102 class UT_API midiEvent
00103 {
00104 public:
00105
00106 char msg[3];
00107 uint64 time;
00108 char bar;
00109 float barvalue;
00110 int trackNum;
00111 char sysexmsg[MAX_SYSEXMSG_LEN];
00112 int sysexlen;
00113
00114
00115 midiEvent() { sysexlen = 0; trackNum=-1; }
00116 explicit midiEvent(const int) { sysexlen = 0; trackNum=-1; }
00117
00118 midiEvent(const midiEvent &mdv)
00119 {
00120 msg[0] = mdv.msg[0];
00121 msg[1] = mdv.msg[1];
00122 msg[2] = mdv.msg[2];
00123 time = mdv.time;
00124 bar = mdv.bar;
00125 barvalue = mdv.barvalue;
00126 trackNum = -1;
00127
00128 memcpy(sysexmsg, mdv.sysexmsg, mdv.sysexlen);
00129 sysexlen = mdv.sysexlen;
00130 }
00131
00132 ~midiEvent()
00133 { };
00134
00135 midiEvent &operator=(const midiEvent &mdv)
00136 {
00137 msg[0] = mdv.msg[0];
00138 msg[1] = mdv.msg[1];
00139 msg[2] = mdv.msg[2];
00140
00141 time = mdv.time;
00142 bar = mdv.bar;
00143 barvalue = mdv.barvalue;
00144 trackNum = mdv.trackNum;
00145
00146 memcpy(sysexmsg, mdv.sysexmsg, mdv.sysexlen);
00147 sysexlen = mdv.sysexlen;
00148
00149 return *this;
00150 }
00151
00152 int operator==(const midiEvent &mdv)
00153 {
00154 if (msg[0] == mdv.msg[0] &&
00155 msg[1] == mdv.msg[1] &&
00156 msg[2] == mdv.msg[2] &&
00157 time == mdv.time &&
00158 sysexlen == mdv.sysexlen)
00159 {
00160 return 1;
00161 }
00162 else
00163 {
00164 return 0;
00165 }
00166 }
00167 };
00168
00169 class UT_API UT_Midi
00170 {
00171
00172 public:
00173
00174 UT_Midi();
00175 virtual ~UT_Midi();
00176
00177 virtual int numInterfaces(int indevices);
00178 virtual const char *interfaceName(int n, int indevices);
00179
00180 virtual int openPort(const char *portname, int read);
00181 virtual int openFile(const char *filename, int read,
00182 fpreal start, fpreal end);
00183 virtual int openFile(const char *filename,
00184 UT_RefArray<midiEvent> &events);
00185
00186
00187
00188
00189
00190 void closePort(int port);
00191
00192 int hasMidiInput(int port, uint64 up_to_time,
00193 UT_IntArray &channel);
00194
00195 void getMidiInput(int port,
00196 uint64 up_to_time,
00197 UT_RefArray<midiEvent> &midi_input,
00198 UT_IntArray &channel);
00199
00200 int sendMidiOutput(int port,
00201 UT_RefArray<midiEvent> &midi_output,
00202 int channel);
00203
00204 void clearQueue(int port);
00205
00206
00207 uint64 getLastFileTime(int port);
00208
00209 virtual uint64 getTime(int port);
00210 virtual void setTimerCallback(void (*callback)(void *));
00211
00212 virtual void startRecordTimer(void *, int time);
00213 virtual void stopRecordTimer(void *);
00214 void setPrintMessage(int);
00215
00216 virtual uint64 markOffsetTime(int port);
00217
00218 int identifySysex(const char *, int len, float *value=0);
00219
00220 void printMessage(midiEvent *);
00221 int printMessages() { return myPrintMessageFlag; }
00222
00223 void setBarMarkerMessage(const int *a)
00224 { myBarMarkerMessage = a; }
00225
00226 protected:
00227
00228
00229
00230 virtual int hasDeviceInput(int port,uint64 up_to_time,
00231 UT_IntArray &channel);
00232 int hasFileInput(int port,uint64 up_to_time,
00233 UT_IntArray &channel);
00234
00235 virtual void getDeviceInput(int port,
00236 uint64 up_to_time,
00237 UT_RefArray<midiEvent> &midi_input,
00238 UT_IntArray &channel);
00239 void getFileInput(int port,
00240 uint64 up_to_time,
00241 UT_RefArray<midiEvent> &midi_input,
00242 UT_IntArray &channel);
00243 virtual int sendDeviceOutput(int port,
00244 UT_RefArray<midiEvent> &midi_output,
00245 int channel);
00246
00247 int sendFileOutput(int port,
00248 UT_RefArray<midiEvent> &midi_output,
00249 int channel);
00250
00251 virtual void clearDeviceQueue(int port);
00252 void clearFileQueue(int port);
00253
00254 virtual void closeDevice(int port);
00255 void closeFile(int port);
00256
00257 int myPrintMessageFlag;
00258
00259 uint64 myLastTime;
00260 private:
00261
00262 UT_PtrArray<UT_MidiFile *> myInputFiles;
00263 UT_PtrArray<UT_MidiFile *> myOutputFiles;
00264 const int *myBarMarkerMessage;
00265 void printSysexMessage(int *array);
00266
00267
00268 };
00269
00270 UT_API extern UT_Midi *UTgetMidi();
00271 UT_API extern void UTsetMidi(UT_Midi *);
00272
00273
00274 #endif
00275