#ifndef _MIDISEQ_MIDIDATA_HPP_ #define _MIDISEQ_MIDIDATA_HPP_ #ifndef _COMMON_WINDOWS_HPP_ #include #endif #ifndef _COMMON_BLOCK_HPP_ #include #endif #ifndef _COMMON_ARRAY_HPP_ #include #endif #ifndef _COMMON_CALLBACK_HPP_ #include #endif #ifndef _MIDISEQ_MIDIOUTDEVICE_HPP_ #include #endif #ifndef _MIDISEQ_MIDIHEADER_HPP_ #include #endif #ifndef _MIDISEQ_MIDITRACK_HPP_ #include #endif #ifndef _MIDISEQ_PUREEVENT_HPP_ #include #endif #ifndef _MIDISEQ_TIMEBLOCK_HPP_ #include #endif #ifndef _MIDISEQ_TIMEINFO_HPP_ #include #endif #ifndef _MIDISEQ_TEMPOCHANGE_HPP_ #include #endif #ifndef _MIDISEQ_SMPTEFORMAT_HPP_ #include #endif #ifndef _MIDISEQ_MIDIBLOCK_HPP_ #include #endif #ifndef _MIDISEQ_EVENTTIMER_HPP_ #include #endif #ifndef _MIDISEQ_SEQUENCER_HPP_ #include #endif #ifndef _MIDISEQ_TRACKINFO_HPP_ #include #endif class String; class MidiData : public MidiHeader, public MidiTrack, public EventTimer { public: MidiData(const String &midiPathFileName); virtual ~MidiData(); bool play(WORD blocking=TRUE); bool stop(void); bool isInPlay(void)const; bool makeRealTime(void); PureEvent &getEventAt(int track,int index); bool getTrackInfo(TrackInfos &trackInfos); bool combineTracks(Array &eventBlock); protected: void setTempo(DWORD microsecsPerQtrNote); void midiChannelMessage(PureEvent &channelEvent); void smpteFormat(const SMPTEFormat &someSMPTEFormat); void timeSignature(const TimeInfo &someTimeInfo); private: enum {TimerDelay=10,ThreeSecs=3000,TwoSecs=2000,OneSec=1000}; WORD timerEvent(void); bool readTrack(void); void operator=(const MidiData &someMidiData); CallbackData::ReturnType timerEvent(CallbackData &someCallbackData); CallbackData::ReturnType closeDevice(void); Callback mTimerCallback; TempoChange mCurrentTempo; WORD mCurrentTrack; MIDIBlock mMIDIEvents; MIDIOutputDevice mMIDIOutDevice; FileIO mMidiFile; DWORD mStartOfTracks; SMPTEFormat mSMPTEFormat; MIDISequencer mMIDISequencer; }; inline void MidiData::operator=(const MidiData &/*someMidiData*/) { return; } inline bool MidiData::readTrack(void) { return MidiTrack::readTrack(); } inline PureEvent &MidiData::getEventAt(int track,int eventIndex) { return (mMIDIEvents[track])[eventIndex]; } inline bool MidiData::stop(void) { if(!isRunning())return true; return stopTimer(); } inline bool MidiData::isInPlay(void)const { return isRunning(); } inline bool MidiData::combineTracks(Array &eventBlock) { TimeBlock timeBlock; timeBlock.fixTimeBlock(mMIDIEvents); timeBlock.sortBlocks(mMIDIEvents,eventBlock); return eventBlock.size()?true:false; } inline bool MidiData::getTrackInfo(TrackInfos &trackInfos) { if(!makeRealTime())return false; return mMIDIEvents.getTrackInfo(trackInfos); } #endif