MIDIIOJ.h

Go to the documentation of this file.
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 }   // csl namespace
00204 
00205 #endif

Generated on Sat Oct 17 14:12:31 2009 for CSL by  doxygen 1.4.5-20051010