77 lines
2.3 KiB
C++
77 lines
2.3 KiB
C++
#include <common/string.hpp>
|
|
#include <common/qsort.hpp>
|
|
#include <common/openfile.hpp>
|
|
#include <midiseq/timeblck.hpp>
|
|
#include <midiseq/midimsg.hpp>
|
|
#include <midiseq/midiblck.hpp>
|
|
|
|
void TimeBlock::fixTimeBlock(MIDIBlock &midiEventBlocks,PureVector<PureEvent> &sortedEvents)
|
|
{
|
|
for(short index=0;index<MIDIBlock::MaxChannels;index++)fixTimeBlock(midiEventBlocks[index]);
|
|
sortBlocks(midiEventBlocks,sortedEvents);
|
|
calculateRealTime(sortedEvents);
|
|
}
|
|
|
|
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,PureVector<PureEvent> &sortedEvents)
|
|
{
|
|
DWORD maxEvents(0L);
|
|
DWORD runningCount(0L);
|
|
DWORD eventCount;
|
|
QuickSort<PureEvent> eventSorter;
|
|
|
|
for(DWORD index=0;index<MIDIBlock::MaxChannels;index++)maxEvents+=midiEventBlocks[(WORD)index].size();
|
|
sortedEvents.size(maxEvents);
|
|
for(index=0;index<MIDIBlock::MaxChannels;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(PureVector<PureEvent> &eventBlock)
|
|
{
|
|
DWORD numEvents(eventBlock.size());
|
|
DWORD playTime;
|
|
double realTime;
|
|
|
|
if(!numEvents)return;
|
|
for(DWORD eventIndex=0;eventIndex<numEvents;eventIndex++)
|
|
{
|
|
playTime=eventBlock[eventIndex].playTime();
|
|
realTime=((((double)mTempo*(double)playTime)/(double)mDivision)/1000.00)+(double)mStartTime;
|
|
eventBlock[eventIndex].playTime((DWORD)realTime);
|
|
}
|
|
}
|
|
|
|
void TimeBlock::printBlock(String pathFileName,PureVector<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((String)eventVector[itemIndex]);
|
|
writeFile.writeLine(eventString);
|
|
}
|
|
}
|