#ifndef _MIDISEQ_MIDIDATA_HPP_ #define _MIDISEQ_MIDIDATA_HPP_ #ifndef _COMMON_WINDOWS_HPP_ #include #endif #ifndef _COMMON_BLOCK_HPP_ #include #endif #ifndef _COMMON_PUREVECTOR_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 class String; class MidiData : public MidiHeader, public MidiTrack, public EventTimer { public: MidiData(const String &midiPathFileName); virtual ~MidiData(); WORD play(WORD blocking=TRUE); WORD stop(void); WORD isInPlay(void)const; 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); WORD readTrack(void); WORD makeRealTime(void); void operator=(const MidiData &someMidiData); CallbackData::ReturnType timerEvent(CallbackData &someCallbackData); CallbackData::ReturnType closeDevice(void); Callback mTimerCallback; PureVector mMIDIEventVector; Block mTempoChange; MIDIBlock mMIDIEvents; MIDIOutputDevice mMIDIOutDevice; FileIO mMidiFile; SMPTEFormat mSMPTEFormat; DWORD mPlayIndex; }; inline void MidiData::operator=(const MidiData &/*someMidiData*/) { return; } inline WORD MidiData::readTrack(void) { return MidiTrack::readTrack(); } inline WORD MidiData::stop(void) { if(!isRunning())return TRUE; return stopTimer(); } inline WORD MidiData::isInPlay(void)const { return isRunning(); } #endif