138 lines
3.1 KiB
C++
138 lines
3.1 KiB
C++
#ifndef _MIDISEQ_MIDIDATA_HPP_
|
|
#define _MIDISEQ_MIDIDATA_HPP_
|
|
#ifndef _COMMON_WINDOWS_HPP_
|
|
#include <common/windows.hpp>
|
|
#endif
|
|
#ifndef _COMMON_BLOCK_HPP_
|
|
#include <common/block.hpp>
|
|
#endif
|
|
#ifndef _COMMON_ARRAY_HPP_
|
|
#include <common/array.hpp>
|
|
#endif
|
|
#ifndef _COMMON_CALLBACK_HPP_
|
|
#include <common/callback.hpp>
|
|
#endif
|
|
#ifndef _MIDISEQ_MIDIOUTDEVICE_HPP_
|
|
#include <midiseq/midiout.hpp>
|
|
#endif
|
|
#ifndef _MIDISEQ_MIDIHEADER_HPP_
|
|
#include <midiseq/midihdr.hpp>
|
|
#endif
|
|
#ifndef _MIDISEQ_MIDITRACK_HPP_
|
|
#include <midiseq/miditrck.hpp>
|
|
#endif
|
|
#ifndef _MIDISEQ_PUREEVENT_HPP_
|
|
#include <midiseq/pureevnt.hpp>
|
|
#endif
|
|
#ifndef _MIDISEQ_TIMEBLOCK_HPP_
|
|
#include <midiseq/timeblck.hpp>
|
|
#endif
|
|
#ifndef _MIDISEQ_TIMEINFO_HPP_
|
|
#include <midiseq/timeinfo.hpp>
|
|
#endif
|
|
#ifndef _MIDISEQ_TEMPOCHANGE_HPP_
|
|
#include <midiseq/tempo.hpp>
|
|
#endif
|
|
#ifndef _MIDISEQ_SMPTEFORMAT_HPP_
|
|
#include <midiseq/smpte.hpp>
|
|
#endif
|
|
#ifndef _MIDISEQ_MIDIBLOCK_HPP_
|
|
#include <midiseq/midiblck.hpp>
|
|
#endif
|
|
#ifndef _MIDISEQ_EVENTTIMER_HPP_
|
|
#include <midiseq/evnttmr.hpp>
|
|
#endif
|
|
#ifndef _MIDISEQ_SEQUENCER_HPP_
|
|
#include <midiseq/MIDISequencer.hpp>
|
|
#endif
|
|
#ifndef _MIDISEQ_TRACKINFO_HPP_
|
|
#include <midiseq/trackinfo.hpp>
|
|
#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<PureEvent> &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<MidiData> 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<PureEvent> &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
|
|
|