Files
Work/midiseq/mididata.hpp
2024-08-07 09:16:27 -04:00

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