Initial
This commit is contained in:
78
midiseq/timeblck.cpp
Normal file
78
midiseq/timeblck.cpp
Normal file
@@ -0,0 +1,78 @@
|
||||
#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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user