MIPI - Physical Interface for MIDI Files
Loading...
Searching...
No Matches
MidiFile.h
Go to the documentation of this file.
1//
2// Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu>
3// Creation Date: Fri Nov 26 14:12:01 PST 1999
4// Last Modified: Mon Jan 18 20:54:04 PST 2021 Added readSmf().
5// Filename: midifile/include/MidiFile.h
6// Website: http://midifile.sapp.org
7// Syntax: C++11
8// vim: ts=3 noexpandtab
9//
10// Description: A class that can read/write Standard MIDI files.
11// MIDI data is stored by track in an array.
12//
13
14#ifndef _MIDIFILE_H_INCLUDED
15#define _MIDIFILE_H_INCLUDED
16
17#include "MidiEventList.h"
18
19#include <fstream>
20#include <istream>
21#include <string>
22#include <vector>
23
24
25namespace smf {
26
27enum {
28 TRACK_STATE_SPLIT = 0, // Tracks are separated into separate vector postions.
29 TRACK_STATE_JOINED = 1 // Tracks are merged into a single vector position,
30}; // like a Type-0 MIDI file, but reversible.
31
32enum {
33 TIME_STATE_DELTA = 0, // MidiMessage::ticks are in delta time format (like MIDI file).
34 TIME_STATE_ABSOLUTE = 1 // MidiMessage::ticks are in absolute time format (0=start time).
35};
36
37class _TickTime {
38 public:
39 int tick;
40 double seconds;
41};
42
43
44class MidiFile {
45 public:
46 MidiFile (void);
47 MidiFile (const std::string& filename);
48 MidiFile (std::istream& input);
49 MidiFile (const MidiFile& other);
50 MidiFile (MidiFile&& other);
51
52 ~MidiFile ();
53
54 MidiFile& operator= (const MidiFile& other);
56
57 // Reading/writing functions:
58
59 // Auto-detected SMF or ASCII-encoded SMF (decoded with Binasc class):
60 bool read (const std::string& filename);
61 bool read (std::istream& instream);
62 bool readBase64 (const std::string& base64data);
63 bool readBase64 (std::istream& instream);
64
65 // Only allow Standard MIDI File input:
66 bool readSmf (const std::string& filename);
67 bool readSmf (std::istream& instream);
68
69 bool write (const std::string& filename);
70 bool write (std::ostream& out);
71 bool writeBase64 (const std::string& out, int width = 0);
72 bool writeBase64 (std::ostream& out, int width = 0);
73 std::string getBase64 (int width = 0);
74 bool writeHex (const std::string& filename, int width = 25);
75 bool writeHex (std::ostream& out, int width = 25);
76 bool writeBinasc (const std::string& filename);
77 bool writeBinasc (std::ostream& out);
78 bool writeBinascWithComments (const std::string& filename);
79 bool writeBinascWithComments (std::ostream& out);
80 bool status (void) const;
81
82 // track-related functions:
83 const MidiEventList& operator[] (int aTrack) const;
84 MidiEventList& operator[] (int aTrack);
85 int getTrackCount (void) const;
86 int getNumTracks (void) const;
87 int size (void) const;
88 void removeEmpties (void);
89
90 // tick-related functions:
91 void makeDeltaTicks (void);
92 void setDeltaTicks (void) { makeDeltaTicks(); }
93 void deltaTicks (void);
94 void makeAbsoluteTicks (void);
96 void absoluteTicks (void);
97 int getTickState (void) const;
98 bool isDeltaTicks (void) const;
99 bool isAbsoluteTicks (void) const;
100
101 // join/split track functionality:
102 void joinTracks (void);
103 void splitTracks (void);
104 void splitTracksByChannel (void);
105 int getTrackState (void) const;
106 int hasJoinedTracks (void) const;
107 int hasSplitTracks (void) const;
108 int getSplitTrack (int track, int index) const;
109 int getSplitTrack (int index) const;
110
111 // track sorting funcionality:
112 void sortTrack (int track) { sortTrackNoteOnsBeforeOffs(track); }
113 void sortTrackNoteOnsBeforeOffs (int track);
114 void sortTrackNoteOffsBeforeOns (int track);
118 void markSequence (void);
119 void markSequence (int track, int sequence = 1);
120 void clearSequence (void);
121 void clearSequence (int track);
122
123 // track manipulation functionality:
124 int addTrack (void);
125 int addTrack (int count);
126 int addTracks (int count);
127 void deleteTrack (int aTrack);
128 void mergeTracks (int aTrack1, int aTrack2);
129 int getTrackCountAsType1 (void);
130
131 // ticks-per-quarter related functions:
132 void setMillisecondTicks (void);
133 int getTicksPerQuarterNote (void) const;
134 int getTPQ (void) const;
135 void setTicksPerQuarterNote (int ticks);
136 void setTPQ (int ticks);
137
138 // physical-time analysis functions:
139 void doTimeAnalysis (void);
140 double getTimeInSeconds (int aTrack, int anIndex);
141 double getTimeInSeconds (int tickvalue);
142 double getAbsoluteTickTime (double starttime);
143 int getFileDurationInTicks (void);
144 double getFileDurationInQuarters (void);
145 double getFileDurationInSeconds (void);
146
147 // note-analysis functions:
148 int linkNotePairsFIFO (void);
149 int linkNotePairsLIFO (void);
150 int linkNotePairs (void) { return linkNotePairsFIFO(); }
151 int linkEventPairs (void);
152 void clearLinks (void);
153
154 // filename functions:
155 void setFilename (const std::string& aname);
156 const char* getFilename (void) const;
157
158 // event functionality:
159 MidiEvent* addEvent (int aTrack, int aTick,
160 std::vector<uchar>& midiData);
161 MidiEvent* addEvent (MidiEvent& mfevent);
162 MidiEvent* addEvent (int aTrack, MidiEvent& mfevent);
163 MidiEvent& getEvent (int aTrack, int anIndex);
164 const MidiEvent& getEvent (int aTrack, int anIndex) const;
165 int getEventCount (int aTrack) const;
166 int getNumEvents (int aTrack) const;
167 void allocateEvents (int track, int aSize);
168 void erase (void);
169 void clear (void);
170 void clear_no_deallocate (void);
171
172 // MIDI message adding convenience functions:
173 MidiEvent* addNoteOn (int aTrack, int aTick,
174 int aChannel, int key,
175 int vel);
176 MidiEvent* addNoteOff (int aTrack, int aTick,
177 int aChannel, int key,
178 int vel);
179 MidiEvent* addNoteOff (int aTrack, int aTick,
180 int aChannel, int key);
181 MidiEvent* addController (int aTrack, int aTick,
182 int aChannel, int num,
183 int value);
184 MidiEvent* addPatchChange (int aTrack, int aTick,
185 int aChannel, int patchnum);
186 MidiEvent* addTimbre (int aTrack, int aTick,
187 int aChannel, int patchnum);
188 MidiEvent* addPitchBend (int aTrack, int aTick,
189 int aChannel, double amount);
190
191 // RPN settings:
192 void setPitchBendRange (int aTrack, int aTick,
193 int aChannel, double range);
194
195 // Controller message adding convenience functions:
196 MidiEvent* addSustain (int aTrack, int aTick,
197 int aChannel, int value);
198 MidiEvent* addSustainPedal (int aTrack, int aTick,
199 int aChannel, int value);
200 MidiEvent* addSustainOn (int aTrack, int aTick,
201 int aChannel);
202 MidiEvent* addSustainPedalOn (int aTrack, int aTick,
203 int aChannel);
204 MidiEvent* addSustainOff (int aTrack, int aTick,
205 int aChannel);
206 MidiEvent* addSustainPedalOff (int aTrack, int aTick,
207 int aChannel);
208
209 // Meta-event adding convenience functions:
210 MidiEvent* addMetaEvent (int aTrack, int aTick,
211 int aType,
212 std::vector<uchar>& metaData);
213 MidiEvent* addMetaEvent (int aTrack, int aTick,
214 int aType,
215 const std::string& metaData);
216 MidiEvent* addText (int aTrack, int aTick,
217 const std::string& text);
218 MidiEvent* addCopyright (int aTrack, int aTick,
219 const std::string& text);
220 MidiEvent* addTrackName (int aTrack, int aTick,
221 const std::string& name);
222 MidiEvent* addInstrumentName (int aTrack, int aTick,
223 const std::string& name);
224 MidiEvent* addLyric (int aTrack, int aTick,
225 const std::string& text);
226 MidiEvent* addMarker (int aTrack, int aTick,
227 const std::string& text);
228 MidiEvent* addCue (int aTrack, int aTick,
229 const std::string& text);
230 MidiEvent* addTempo (int aTrack, int aTick,
231 double aTempo);
232 MidiEvent* addKeySignature (int aTrack, int aTick,
233 int fifths, bool mode = 0);
234 MidiEvent* addTimeSignature (int aTrack, int aTick,
235 int top, int bottom,
236 int clocksPerClick = 24,
237 int num32dsPerQuarter = 8);
238 MidiEvent* addCompoundTimeSignature(int aTrack, int aTick,
239 int top, int bottom,
240 int clocksPerClick = 36,
241 int num32dsPerQuarter = 8);
242
243 uchar readByte (std::istream& input);
244
245 // static functions:
246 static ushort readLittleEndian2Bytes (std::istream& input);
247 static ulong readLittleEndian4Bytes (std::istream& input);
248 static std::ostream& writeLittleEndianUShort (std::ostream& out,
249 ushort value);
250 static std::ostream& writeBigEndianUShort (std::ostream& out,
251 ushort value);
252 static std::ostream& writeLittleEndianShort (std::ostream& out,
253 short value);
254 static std::ostream& writeBigEndianShort (std::ostream& out,
255 short value);
256 static std::ostream& writeLittleEndianULong (std::ostream& out,
257 ulong value);
258 static std::ostream& writeBigEndianULong (std::ostream& out,
259 ulong value);
260 static std::ostream& writeLittleEndianLong (std::ostream& out,
261 long value);
262 static std::ostream& writeBigEndianLong (std::ostream& out,
263 long value);
264 static std::ostream& writeLittleEndianFloat (std::ostream& out,
265 float value);
266 static std::ostream& writeBigEndianFloat (std::ostream& out,
267 float value);
268 static std::ostream& writeLittleEndianDouble (std::ostream& out,
269 double value);
270 static std::ostream& writeBigEndianDouble (std::ostream& out,
271 double value);
272 static std::string getGMInstrumentName (int patchIndex);
273
274 protected:
275 // m_events == Lists of MidiEvents for each MIDI file track.
276 std::vector<MidiEventList*> m_events;
277
278 // m_ticksPerQuarterNote == A value for the MIDI file header
279 // which represents the number of ticks in a quarter note
280 // that are used as units for the delta times for MIDI events
281 // in MIDI file track data.
283
284 // m_theTrackState == state variable for whether the tracks
285 // are joined or split.
287
288 // m_theTimeState == state variable for whether the MidiEvent::tick
289 // variable contain absolute ticks since the start of the file's
290 // time, or delta ticks since the last MIDI event in the track.
292
293 // m_readFileName == the filename of the last file read into
294 // the object.
295 std::string m_readFileName;
296
297 // m_timemapvalid ==
298 bool m_timemapvalid = false;
299
300 // m_timemap ==
301 std::vector<_TickTime> m_timemap;
302
303 // m_rwstatus == True if last read was successful, false if a problem.
304 bool m_rwstatus = true;
305
306 // m_linkedEventQ == True if link analysis has been done.
307 bool m_linkedEventsQ = false;
308
309 private:
310 int extractMidiData (std::istream& inputfile,
311 std::vector<uchar>& array,
312 uchar& runningCommand);
313 ulong readVLValue (std::istream& inputfile);
314 ulong unpackVLV (uchar a = 0, uchar b = 0,
315 uchar c = 0, uchar d = 0,
316 uchar e = 0);
317 void writeVLValue (long aValue,
318 std::vector<uchar>& data);
319 int makeVLV (uchar *buffer, int number);
320 static int ticksearch (const void* A, const void* B);
321 static int secondsearch (const void* A, const void* B);
322 void buildTimeMap (void);
323 double linearTickInterpolationAtSecond (double seconds);
324 double linearSecondInterpolationAtTick (int ticktime);
325 std::string base64Encode (const std::string &input);
326 std::string base64Decode (const std::string &input);
327
328 static const std::string encodeLookup;
329 static const std::vector<int> decodeLookup;
330 static const char *GMinstrument[128];
331};
332
333} // end of namespace smf
334
335std::ostream& operator<<(std::ostream& out, smf::MidiFile& aMidiFile);
336
337#endif /* _MIDIFILE_H_INCLUDED */
338
339
340
std::ostream & operator<<(std::ostream &out, smf::MidiFile &aMidiFile)
Definition MidiFile.cpp:3501
Definition MidiEventList.h:23
Definition MidiEvent.h:25
Definition MidiFile.h:44
void setPitchBendRange(int aTrack, int aTick, int aChannel, double range)
Definition MidiFile.cpp:2154
void deleteTrack(int aTrack)
Definition MidiFile.cpp:2298
int getTrackCount(void) const
Definition MidiFile.cpp:922
void setDeltaTicks(void)
Definition MidiFile.h:92
int hasSplitTracks(void) const
Definition MidiFile.cpp:1225
static std::ostream & writeBigEndianULong(std::ostream &out, ulong value)
Definition MidiFile.cpp:3288
MidiEvent * addLyric(int aTrack, int aTick, const std::string &text)
Definition MidiFile.cpp:1815
void sortTrackNoteOffsBeforeOns(int track)
Definition MidiFile.cpp:2512
static std::ostream & writeLittleEndianShort(std::ostream &out, short value)
Definition MidiFile.cpp:3241
MidiEvent * addTempo(int aTrack, int aTick, double aTempo)
Definition MidiFile.cpp:1860
std::string base64Encode(const std::string &input)
Definition MidiFile.cpp:3434
MidiEvent * addPitchBend(int aTrack, int aTick, int aChannel, double amount)
Definition MidiFile.cpp:2109
int size(void) const
Definition MidiFile.cpp:938
void setFilename(const std::string &aname)
Definition MidiFile.cpp:1633
void clearLinks(void)
Definition MidiFile.cpp:2579
MidiEvent * addSustainPedalOff(int aTrack, int aTick, int aChannel)
Definition MidiFile.cpp:2233
int getTicksPerQuarterNote(void) const
Definition MidiFile.cpp:2367
MidiEvent * addKeySignature(int aTrack, int aTick, int fifths, bool mode=0)
Definition MidiFile.cpp:1884
double getFileDurationInSeconds(void)
Definition MidiFile.cpp:1453
void clear_no_deallocate(void)
Definition MidiFile.cpp:3090
static const char * GMinstrument[128]
Definition MidiFile.h:330
static std::ostream & writeLittleEndianUShort(std::ostream &out, ushort value)
Definition MidiFile.cpp:3211
void splitTracksByChannel(void)
Definition MidiFile.cpp:1132
void erase(void)
Definition MidiFile.cpp:2338
void setTPQ(int ticks)
Definition MidiFile.cpp:2468
void doTimeAnalysis(void)
Definition MidiFile.cpp:1491
static std::ostream & writeLittleEndianULong(std::ostream &out, ulong value)
Definition MidiFile.cpp:3271
MidiFile(void)
Definition MidiFile.cpp:77
void makeAbsoluteTicks(void)
Definition MidiFile.cpp:1327
int linkNotePairsFIFO(void)
Definition MidiFile.cpp:1586
void sortTrackNoteOnsBeforeOffs(int track)
Definition MidiFile.cpp:2504
ulong readVLValue(std::istream &inputfile)
Definition MidiFile.cpp:2998
MidiFile & operator=(const MidiFile &other)
Definition MidiFile.cpp:141
void mergeTracks(int aTrack1, int aTrack2)
Definition MidiFile.cpp:2416
void setTicksPerQuarterNote(int ticks)
Definition MidiFile.cpp:2460
int makeVLV(uchar *buffer, int number)
Definition MidiFile.cpp:1956
MidiEvent * addMarker(int aTrack, int aTick, const std::string &text)
Definition MidiFile.cpp:1830
static std::ostream & writeBigEndianLong(std::ostream &out, long value)
Definition MidiFile.cpp:3322
MidiEvent * addSustainPedalOn(int aTrack, int aTick, int aChannel)
Definition MidiFile.cpp:2214
MidiEvent * addTimeSignature(int aTrack, int aTick, int top, int bottom, int clocksPerClick=24, int num32dsPerQuarter=8)
Definition MidiFile.cpp:1917
MidiEvent * addCompoundTimeSignature(int aTrack, int aTick, int top, int bottom, int clocksPerClick=36, int num32dsPerQuarter=8)
Definition MidiFile.cpp:1940
bool m_rwstatus
Definition MidiFile.h:304
int getNumTracks(void) const
Definition MidiFile.cpp:930
ulong unpackVLV(uchar a=0, uchar b=0, uchar c=0, uchar d=0, uchar e=0)
Definition MidiFile.cpp:3024
double linearTickInterpolationAtSecond(double seconds)
Definition MidiFile.cpp:2602
int linkNotePairs(void)
Definition MidiFile.h:150
bool write(const std::string &filename)
Definition MidiFile.cpp:556
MidiEvent * addNoteOn(int aTrack, int aTick, int aChannel, int key, int vel)
Definition MidiFile.cpp:2010
bool m_timemapvalid
Definition MidiFile.h:298
bool read(const std::string &filename)
Definition MidiFile.cpp:195
MidiEvent * addPatchChange(int aTrack, int aTick, int aChannel, int patchnum)
Definition MidiFile.cpp:2075
void makeDeltaTicks(void)
Definition MidiFile.cpp:1276
int getTickState(void) const
Definition MidiFile.cpp:1366
MidiEvent * addSustainOff(int aTrack, int aTick, int aChannel)
Definition MidiFile.cpp:2225
void removeEmpties(void)
Definition MidiFile.cpp:950
bool isDeltaTicks(void) const
Definition MidiFile.cpp:1378
int getFileDurationInTicks(void)
Definition MidiFile.cpp:1407
static std::ostream & writeBigEndianShort(std::ostream &out, short value)
Definition MidiFile.cpp:3256
std::string m_readFileName
Definition MidiFile.h:295
static const std::vector< int > decodeLookup
Definition MidiFile.h:329
void sortTracksNoteOnsBeforeOffs(void)
Definition MidiFile.cpp:2527
MidiEvent * addTimbre(int aTrack, int aTick, int aChannel, int patchnum)
Definition MidiFile.cpp:2093
void clear(void)
Definition MidiFile.cpp:2323
std::string getBase64(int width=0)
Definition MidiFile.cpp:742
double getFileDurationInQuarters(void)
Definition MidiFile.cpp:1437
std::vector< _TickTime > m_timemap
Definition MidiFile.h:301
bool writeHex(const std::string &filename, int width=25)
Definition MidiFile.cpp:764
MidiEvent * addNoteOff(int aTrack, int aTick, int aChannel, int key, int vel)
Definition MidiFile.cpp:2025
static std::ostream & writeLittleEndianFloat(std::ostream &out, float value)
Definition MidiFile.cpp:3357
int getSplitTrack(int track, int index) const
Definition MidiFile.cpp:1240
void deltaTicks(void)
Definition MidiFile.cpp:1311
static int ticksearch(const void *A, const void *B)
Definition MidiFile.cpp:3110
MidiEvent * addTrackName(int aTrack, int aTick, const std::string &name)
Definition MidiFile.cpp:1784
int linkNotePairsLIFO(void)
Definition MidiFile.cpp:1600
static std::ostream & writeBigEndianDouble(std::ostream &out, double value)
Definition MidiFile.cpp:3374
MidiEvent * addController(int aTrack, int aTick, int aChannel, int num, int value)
Definition MidiFile.cpp:2058
double getAbsoluteTickTime(double starttime)
Definition MidiFile.cpp:1545
void setMillisecondTicks(void)
Definition MidiFile.cpp:2488
void buildTimeMap(void)
Definition MidiFile.cpp:2750
bool isAbsoluteTicks(void) const
Definition MidiFile.cpp:1390
bool writeBinasc(const std::string &filename)
Definition MidiFile.cpp:814
int hasJoinedTracks(void) const
Definition MidiFile.cpp:1213
void absoluteTicks(void)
Definition MidiFile.cpp:1354
static std::ostream & writeLittleEndianDouble(std::ostream &out, double value)
Definition MidiFile.cpp:3395
bool writeBinascWithComments(const std::string &filename)
Definition MidiFile.cpp:853
void sortTracks(void)
Definition MidiFile.h:115
MidiEvent * addSustain(int aTrack, int aTick, int aChannel, int value)
Definition MidiFile.cpp:2187
void writeVLValue(long aValue, std::vector< uchar > &data)
Definition MidiFile.cpp:3056
MidiEvent * addEvent(int aTrack, int aTick, std::vector< uchar > &midiData)
Definition MidiFile.cpp:1661
void sortTrack(int track)
Definition MidiFile.h:112
static std::ostream & writeBigEndianFloat(std::ostream &out, float value)
Definition MidiFile.cpp:3340
MidiEvent * addSustainPedal(int aTrack, int aTick, int aChannel, int value)
Definition MidiFile.cpp:2195
void clearSequence(void)
Definition MidiFile.cpp:1000
void splitTracks(void)
Definition MidiFile.cpp:1079
MidiEvent * addCue(int aTrack, int aTick, const std::string &text)
Definition MidiFile.cpp:1845
~MidiFile()
Definition MidiFile.cpp:121
const MidiEventList & operator[](int aTrack) const
Definition MidiFile.cpp:911
int addTrack(void)
Definition MidiFile.cpp:2246
int m_ticksPerQuarterNote
Definition MidiFile.h:282
static std::string getGMInstrumentName(int patchIndex)
Definition MidiFile.cpp:3417
bool writeBase64(const std::string &out, int width=0)
Definition MidiFile.cpp:697
void allocateEvents(int track, int aSize)
Definition MidiFile.cpp:2283
bool readBase64(const std::string &base64data)
Definition MidiFile.cpp:249
int extractMidiData(std::istream &inputfile, std::vector< uchar > &array, uchar &runningCommand)
Definition MidiFile.cpp:2823
int getTrackState(void) const
Definition MidiFile.cpp:1201
static const std::string encodeLookup
Definition MidiFile.h:328
int getTrackCountAsType1(void)
Definition MidiFile.cpp:2557
std::string base64Decode(const std::string &input)
Definition MidiFile.cpp:3463
int m_theTrackState
Definition MidiFile.h:286
double linearSecondInterpolationAtTick(int ticktime)
Definition MidiFile.cpp:2670
void markSequence(void)
Definition MidiFile.cpp:971
int getNumEvents(int aTrack) const
Definition MidiFile.cpp:2400
bool readSmf(const std::string &filename)
Definition MidiFile.cpp:271
const char * getFilename(void) const
Definition MidiFile.cpp:1650
uchar readByte(std::istream &input)
Definition MidiFile.cpp:3193
static std::ostream & writeBigEndianUShort(std::ostream &out, ushort value)
Definition MidiFile.cpp:3226
void sortTracksNoteOffsBeforeOns(void)
Definition MidiFile.cpp:2537
static ushort readLittleEndian2Bytes(std::istream &input)
Definition MidiFile.cpp:3174
MidiEvent * addSustainOn(int aTrack, int aTick, int aChannel)
Definition MidiFile.cpp:2206
bool status(void) const
Definition MidiFile.cpp:892
double getTimeInSeconds(int aTrack, int anIndex)
Definition MidiFile.cpp:1503
static std::ostream & writeLittleEndianLong(std::ostream &out, long value)
Definition MidiFile.cpp:3305
void setAbsoluteTicks(void)
Definition MidiFile.h:95
bool m_linkedEventsQ
Definition MidiFile.h:307
MidiEvent * addCopyright(int aTrack, int aTick, const std::string &text)
Definition MidiFile.cpp:1769
MidiEvent & getEvent(int aTrack, int anIndex)
Definition MidiFile.cpp:2350
int addTracks(int count)
Definition MidiFile.cpp:2271
int linkEventPairs(void)
Definition MidiFile.cpp:1617
int getTPQ(void) const
Definition MidiFile.cpp:2383
static ulong readLittleEndian4Bytes(std::istream &input)
Definition MidiFile.cpp:3155
void joinTracks(void)
Definition MidiFile.cpp:1028
std::vector< MidiEventList * > m_events
Definition MidiFile.h:276
int getEventCount(int aTrack) const
Definition MidiFile.cpp:2395
int m_theTimeState
Definition MidiFile.h:291
MidiEvent * addText(int aTrack, int aTick, const std::string &text)
Definition MidiFile.cpp:1754
static int secondsearch(const void *A, const void *B)
Definition MidiFile.cpp:3129
MidiEvent * addInstrumentName(int aTrack, int aTick, const std::string &name)
Definition MidiFile.cpp:1799
MidiEvent * addMetaEvent(int aTrack, int aTick, int aType, std::vector< uchar > &metaData)
Definition MidiFile.cpp:1712
Definition MidiFile.h:37
int tick
Definition MidiFile.h:39
double seconds
Definition MidiFile.h:40
Definition Binasc.h:22
@ TIME_STATE_ABSOLUTE
Definition MidiFile.h:34
@ TIME_STATE_DELTA
Definition MidiFile.h:33
unsigned short ushort
Definition Binasc.h:25
unsigned char uchar
Definition Binasc.h:24
unsigned long ulong
Definition Binasc.h:26
@ TRACK_STATE_JOINED
Definition MidiFile.h:29
@ TRACK_STATE_SPLIT
Definition MidiFile.h:28