Files
Work/midiseq/timeblck.cpp
2024-08-07 09:16:27 -04:00

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);
}
}