XX CMake Package
Loading...
Searching...
No Matches
XXMidiFile.h
Go to the documentation of this file.
1#ifndef XXMidiFileH
2#define XXMidiFileH
3
4#include "XXMusicExportDef.h"
5
6#include <QList>
7#include <QMap>
8
9#include "XXMidiCommon.h"
10#include "XXTimeCode.h"
11
12namespace XX
13{
14 namespace Midi
15 {
18
20 {
21 public:
22 using Tick = uint64_t;
23 using TimeMessageMap = QMap<Tick, MessageList>;
24
25 struct Info
26 {
28 uint64_t barCounter = 0;
29 uint16_t bpm = 0;
30 uint32_t minutes = 0;
31 uchar seconds = 0;
32 };
33
34 struct Track
35 {
37 std::string name;
38 bool isMonophonic = false;
39
41
42 using List = QList<Track>;
43 };
44
45 public:
47
48 public:
50 const Track::List& getTrackList() const;
51 uint64_t compileBarCounter(uint64_t trackIndex) const;
52
54 Tick toTick(const TimeCode::Duration& duration, const double& precentageToNextBeat = 0);
55
56 protected:
57 uint16_t ticksPer16;
58 uint64_t uSecsPerQuarter; // only relevant to get file bpm
60 };
61
62 namespace File
63 {
64 // see http://www.music.mcgill.ca/~ich/classes/mumt306/StandardMIDIfileformat.html
65
68
70 {
71 public:
72 Reader(const Bytes& content);
73
74 private:
75 struct Chunk
76 {
77 std::string id;
78 Bytes data;
79
80 using List = QList<Chunk>;
81 };
82
83 private:
84 // workflow
85 void readHeader(const Chunk& headerChunk);
86 void readTrack(const Chunk& trackChunk);
87 MetaEvent readMetaEventAndAdvanceCursor(const Bytes& trackChunkData, uint64_t& cursor, Track* track);
88 uchar compileMidiEventLength(const uchar marker) const;
89
90 uint64_t variableLength(const Bytes& data, uint64_t& cursor) const;
91 };
92 } // namespace File
93 } // namespace Midi
94} // namespace XX
95
96#endif // NOT XXMidiFileH
#define XXMUSIC_DECLSPEC
Definition XXMusicExportDef.h:11
Reader(const Bytes &content)
Info compileInfo() const
uint16_t ticksPer16
Definition XXMidiFile.h:57
uint64_t Tick
Definition XXMidiFile.h:22
uint64_t compileBarCounter(uint64_t trackIndex) const
QMap< Tick, MessageList > TimeMessageMap
Definition XXMidiFile.h:23
TimeCode::Duration fromTick(const Tick &tick)
Track::List trackList
Definition XXMidiFile.h:59
const Track::List & getTrackList() const
uint64_t uSecsPerQuarter
Definition XXMidiFile.h:58
Tick toTick(const TimeCode::Duration &duration, const double &precentageToNextBeat=0)
uint16_t Duration
Definition XXTimeCode.h:18
MetaEvent
midi meta events
Definition XXMidiCommon.h:76
QList< uchar > Bytes
Definition XXMidiCommon.h:11
Definition XXMidiFile.h:63
Definition XXMidiCommon.h:17
Definition XXPopulatedAbstract.h:11
Definition XXMidiFile.h:26
uchar seconds
Definition XXMidiFile.h:31
uint16_t bpm
Definition XXMidiFile.h:29
uint32_t minutes
Definition XXMidiFile.h:30
Tick maxTick
Definition XXMidiFile.h:27
uint64_t barCounter
Definition XXMidiFile.h:28
Definition XXMidiFile.h:35
TimeMessageMap messageMap
Definition XXMidiFile.h:40
QList< Track > List
Definition XXMidiFile.h:42
Tick maxTick
Definition XXMidiFile.h:36
std::string name
Definition XXMidiFile.h:37
bool isMonophonic
Definition XXMidiFile.h:38