46 for (
int i = 0;
i < 8; ++
i)
72 data += bytesRemaining;
82 return time / (-(timeFormat >> 8) * (timeFormat & 0xff));
84 double lastTime = 0.0, correctedTime = 0.0;
85 const double tickLen = 1.0 / (timeFormat & 0x7fff);
86 double secsPerTick = 0.5 * tickLen;
89 for (
int i = 0;
i < numEvents; ++
i)
92 const double eventTime =
m.getTimeStamp();
94 if (eventTime >= time)
97 correctedTime += (eventTime - lastTime) * secsPerTick;
100 if (
m.isTempoMetaEvent())
101 secsPerTick = tickLen *
m.getTempoSecondsPerQuarterNote();
103 while (
i + 1 < numEvents)
117 return correctedTime + (time - lastTime) * secsPerTick;
126 const double diff = (first->message.getTimeStamp() - second->message.getTimeStamp());
128 if (
diff > 0)
return 1;
129 if (
diff < 0)
return -1;
130 if (first->message.isNoteOff() && second->message.isNoteOn())
return -1;
131 if (first->message.isNoteOn() && second->message.isNoteOff())
return 1;
137 template <
typename MethodType>
142 for (
size_t i = 0;
i < tracks.
size(); ++
i)
147 for (
int j = 0;
j < numEvents; ++
j)
160 :
timeFormat ((short) (unsigned short) 0xe728)
216 const int subframeResolution)
noexcept
218 timeFormat = (short) (((-framesPerSecond) << 8) | subframeResolution);
253 const int maxSensibleMidiFileSize = 200 * 1024 * 1024;
260 short fileType, expectedTracks;
264 size -= (size_t) (
d -
static_cast<const uint8*
> (
data.getData()));
268 while (
size > 0 && track < expectedTracks)
281 size -= (size_t) chunkSize + 8;
296 uint8 lastStatusByte = 0;
319 const uint8 firstByte = *(
mm.getRawData());
320 if ((firstByte & 0xf0) != 0xf0)
321 lastStatusByte = firstByte;
326 result.list.sort (sorter,
true);
329 tracks.getLast()->updateMatchedPairs();
341 for (
size_t i = 0;
i <
tracks.size(); ++
i)
#define noexcept
Definition DistrhoDefines.h:72
static uint16 bigEndianShort(const void *bytes) noexcept
Definition ByteOrder.h:241
static uint32 bigEndianInt(const void *bytes) noexcept
Definition ByteOrder.h:239
Definition MemoryBlock.h:39
bool readFrom(InputStream &sourceStream)
Definition MidiFile.cpp:248
void convertTimestampTicksToSeconds()
Definition MidiFile.cpp:333
double getLastTimestamp() const
Definition MidiFile.cpp:237
void clear()
Definition MidiFile.cpp:183
void findAllTimeSigEvents(MidiMessageSequence &timeSigEvents) const
Definition MidiFile.cpp:227
size_t getNumTracks() const noexcept
Definition MidiFile.cpp:189
MidiFile & operator=(const MidiFile &other)
Definition MidiFile.cpp:174
MidiFile()
Definition MidiFile.cpp:159
void readNextTrack(const uint8 *, int size)
Definition MidiFile.cpp:293
const MidiMessageSequence * getTrack(size_t index) const noexcept
Definition MidiFile.cpp:194
void setTicksPerQuarterNote(int ticksPerQuarterNote) noexcept
Definition MidiFile.cpp:210
void findAllKeySigEvents(MidiMessageSequence &keySigEvents) const
Definition MidiFile.cpp:232
void findAllTempoEvents(MidiMessageSequence &tempoChangeEvents) const
Definition MidiFile.cpp:222
short getTimeFormat() const noexcept
Definition MidiFile.cpp:205
void addTrack(const MidiMessageSequence &trackSequence)
Definition MidiFile.cpp:199
short timeFormat
Definition MidiFile.h:170
void setSmpteTimeFormat(int framesPerSecond, int subframeResolution) noexcept
Definition MidiFile.cpp:215
~MidiFile()
Definition MidiFile.cpp:164
OwnedArray< MidiMessageSequence > tracks
Definition MidiFile.h:169
Definition MidiMessage.h:40
bool isTimeSignatureMetaEvent() const noexcept
Definition MidiMessage.cpp:719
bool isTempoMetaEvent() const noexcept
Definition MidiMessage.cpp:660
bool isKeySignatureMetaEvent() const noexcept
Definition MidiMessage.cpp:761
double getTimeStamp() const noexcept
Definition MidiMessage.h:144
static int readVariableLengthVal(const uint8 *data, int &numBytesUsed) noexcept
Definition MidiMessage.cpp:63
double getTempoSecondsPerQuarterNote() const noexcept
Definition MidiMessage.cpp:669
Definition MidiMessageSequence.h:69
MidiMessage message
Definition MidiMessageSequence.h:76
Definition MidiMessageSequence.h:45
int getNumEvents() const noexcept
Definition MidiMessageSequence.cpp:61
MidiEventHolder * addEvent(const MidiMessage &newMessage, double timeAdjustment=0)
Definition MidiMessageSequence.cpp:91
MidiEventHolder * getEventPointer(int index) const noexcept
Definition MidiMessageSequence.cpp:66
Definition OwnedArray.h:57
ObjectClass * getUnchecked(const int index) const noexcept
Definition OwnedArray.h:136
size_t size() const noexcept
Definition OwnedArray.h:101
unsigned * m
Definition inflate.c:1559
struct huft * t
Definition inflate.c:943
register unsigned j
Definition inflate.c:1576
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
JSAMPIMAGE data
Definition jpeglib.h:945
Definition MidiFile.cpp:34
static void findAllMatchingEvents(const OwnedArray< MidiMessageSequence > &tracks, MidiMessageSequence &results, MethodType method)
Definition MidiFile.cpp:138
static double convertTicksToSeconds(const double time, const MidiMessageSequence &tempoEvents, const int timeFormat)
Definition MidiFile.cpp:77
static bool parseMidiHeader(const uint8 *&data, short &timeFormat, short &fileType, short &numberOfTracks) noexcept
Definition MidiFile.cpp:35
Definition AudioSampleBuffer.h:33
unsigned char uint8
Definition water.h:90
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
static bool diff(const std::string fn1, const std::string fn2)
Definition playertest.cpp:161
Definition MidiFile.cpp:122
static int compareElements(const MidiMessageSequence::MidiEventHolder *const first, const MidiMessageSequence::MidiEventHolder *const second) noexcept
Definition MidiFile.cpp:123
int result
Definition process.c:1455
typedef int(UZ_EXP MsgFn)()
static ZCONST char Far * method[NUM_METHODS]
Definition zipinfo.c:1008
mm
Definition zipinfo.c:2291
#define const
Definition zconf.h:137