Files
Work/midiseq/safe/TIMEBLCK.CPP
2024-08-07 09:16:27 -04:00

84 lines
2.4 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,Array<PureEvent> &sortedEvents)
{
midiEventBlocks.printBlock("MIDIEvents.DAT");
for(short index=0;index<MIDIBlock::MaxChannels;index++)
{
fixTimeBlock(midiEventBlocks[index]);
}
midiEventBlocks.printBlock("MIDIEvents2.DAT");
sortBlocks(midiEventBlocks,sortedEvents);
calculateRealTime(sortedEvents);
printBlock("MIDITimeEvents.DAT",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,Array<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(Array<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,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);
}
}