79 lines
2.3 KiB
C++
79 lines
2.3 KiB
C++
#include <common/string.hpp>
|
|
#include <common/qsort.hpp>
|
|
#include <common/openfile.hpp>
|
|
#include <common/array.hpp>
|
|
#include <midiseq/timeblck.hpp>
|
|
#include <midiseq/midimsg.hpp>
|
|
#include <midiseq/midiblck.hpp>
|
|
|
|
void TimeBlock::fixTimeBlock(MIDIBlock &midiEventBlocks)
|
|
{
|
|
for(short index=0;index<MIDIBlock::MaxTracks;index++)fixTimeBlock(midiEventBlocks[index]);
|
|
calculateRealTime(midiEventBlocks);
|
|
// midiEventBlocks.printBlock("TIMEBLOCK.DAT");
|
|
}
|
|
|
|
void TimeBlock::fixTimeBlock(EventBlock &midiEventBlock)
|
|
{
|
|
size_t eventCount((size_t)midiEventBlock.size());
|
|
DWORD eventTime(0L);
|
|
|
|
if(!eventCount)return;
|
|
for(short index=0;index<eventCount;index++)
|
|
{
|
|
eventTime+=(midiEventBlock[index].deltaTime());
|
|
midiEventBlock[index].playTime(eventTime);
|
|
}
|
|
}
|
|
|
|
void TimeBlock::sortBlocks(MIDIBlock &midiEventBlocks,Array<PureEvent> &sortedEvents)
|
|
{
|
|
DWORD maxEvents(0L);
|
|
DWORD runningCount(0L);
|
|
DWORD eventCount;
|
|
QuickSort<PureEvent> eventSorter;
|
|
|
|
for(DWORD index=0;index<MIDIBlock::MaxTracks;index++)maxEvents+=midiEventBlocks[(WORD)index].size();
|
|
sortedEvents.size(maxEvents);
|
|
for(index=0;index<MIDIBlock::MaxTracks;index++)
|
|
{
|
|
eventCount=midiEventBlocks[(WORD)index].size();
|
|
if(!eventCount)continue;
|
|
for(DWORD eventIndex=0;eventIndex<eventCount;eventIndex++)
|
|
sortedEvents[runningCount++]=(midiEventBlocks[(WORD)index])[eventIndex];
|
|
}
|
|
if(!sortedEvents.size())return;
|
|
eventSorter.sortItems(sortedEvents);
|
|
}
|
|
|
|
void TimeBlock::calculateRealTime(MIDIBlock &midiEventBlocks)
|
|
{
|
|
double realTime;
|
|
|
|
for(int track=0;track<MIDIBlock::MaxTracks;track++)
|
|
{
|
|
EventBlock &eventBlock=midiEventBlocks[track];
|
|
for(int index=0;index<eventBlock.size();index++)
|
|
{
|
|
PureEvent &midiEvent=eventBlock[index];
|
|
realTime=((((double)midiEvent.tempo()/(double)mDivision)/1000.00)*(double)midiEvent.playTime())+mStartTime;
|
|
midiEvent.playTime(realTime);
|
|
}
|
|
}
|
|
}
|
|
|
|
void TimeBlock::printBlock(String pathFileName,Array<PureEvent> &eventVector)
|
|
{
|
|
FileHandle writeFile(pathFileName,FileHandle::Write,FileHandle::ShareRead,FileHandle::Overwrite);
|
|
WORD eventCount((WORD)eventVector.size());
|
|
String lineBuffer;
|
|
|
|
::sprintf(lineBuffer,"start time:%ld",mStartTime);
|
|
writeFile.writeLine(lineBuffer);
|
|
for(short itemIndex=0;itemIndex<eventCount;itemIndex++)
|
|
{
|
|
String eventString(eventVector[itemIndex].toString());
|
|
writeFile.writeLine(eventString);
|
|
}
|
|
}
|