lbajardsilogic@0
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
lbajardsilogic@0
|
2
|
lbajardsilogic@0
|
3 /*
|
lbajardsilogic@0
|
4 Sonic Visualiser
|
lbajardsilogic@0
|
5 An audio file viewer and annotation editor.
|
lbajardsilogic@0
|
6 Centre for Digital Music, Queen Mary, University of London.
|
lbajardsilogic@0
|
7
|
lbajardsilogic@0
|
8 This program is free software; you can redistribute it and/or
|
lbajardsilogic@0
|
9 modify it under the terms of the GNU General Public License as
|
lbajardsilogic@0
|
10 published by the Free Software Foundation; either version 2 of the
|
lbajardsilogic@0
|
11 License, or (at your option) any later version. See the file
|
lbajardsilogic@0
|
12 COPYING included with this distribution for more information.
|
lbajardsilogic@0
|
13 */
|
lbajardsilogic@0
|
14
|
lbajardsilogic@0
|
15
|
lbajardsilogic@0
|
16 /*
|
lbajardsilogic@0
|
17 This is a modified version of a source file from the
|
lbajardsilogic@0
|
18 Rosegarden MIDI and audio sequencer and notation editor.
|
lbajardsilogic@0
|
19 This file copyright 2000-2006 Richard Bown and Chris Cannam.
|
lbajardsilogic@0
|
20 */
|
lbajardsilogic@0
|
21
|
lbajardsilogic@0
|
22 #ifndef _MIDI_FILE_READER_H_
|
lbajardsilogic@0
|
23 #define _MIDI_FILE_READER_H_
|
lbajardsilogic@0
|
24
|
lbajardsilogic@0
|
25 #include "DataFileReader.h"
|
lbajardsilogic@0
|
26 #include "base/RealTime.h"
|
lbajardsilogic@0
|
27
|
lbajardsilogic@0
|
28 #include <map>
|
lbajardsilogic@0
|
29 #include <set>
|
lbajardsilogic@0
|
30 #include <vector>
|
lbajardsilogic@0
|
31
|
lbajardsilogic@0
|
32 #include <QObject>
|
lbajardsilogic@0
|
33
|
lbajardsilogic@0
|
34 class MIDIEvent;
|
lbajardsilogic@0
|
35
|
lbajardsilogic@0
|
36 class MIDIFileReader : public DataFileReader
|
lbajardsilogic@0
|
37 {
|
lbajardsilogic@0
|
38 Q_OBJECT
|
lbajardsilogic@0
|
39
|
lbajardsilogic@0
|
40 public:
|
lbajardsilogic@0
|
41 MIDIFileReader(QString path, size_t mainModelSampleRate);
|
lbajardsilogic@0
|
42 virtual ~MIDIFileReader();
|
lbajardsilogic@0
|
43
|
lbajardsilogic@0
|
44 virtual bool isOK() const;
|
lbajardsilogic@0
|
45 virtual QString getError() const;
|
lbajardsilogic@0
|
46 virtual Model *load() const;
|
lbajardsilogic@0
|
47
|
lbajardsilogic@0
|
48 typedef unsigned char MIDIByte;
|
lbajardsilogic@0
|
49
|
lbajardsilogic@0
|
50 protected:
|
lbajardsilogic@0
|
51 typedef std::vector<MIDIEvent *> MIDITrack;
|
lbajardsilogic@0
|
52 typedef std::map<unsigned int, MIDITrack> MIDIComposition;
|
lbajardsilogic@0
|
53 typedef std::pair<RealTime, double> TempoChange; // time, qpm
|
lbajardsilogic@0
|
54 typedef std::map<unsigned long, TempoChange> TempoMap; // key is MIDI time
|
lbajardsilogic@0
|
55
|
lbajardsilogic@0
|
56 typedef enum {
|
lbajardsilogic@0
|
57 MIDI_SINGLE_TRACK_FILE = 0x00,
|
lbajardsilogic@0
|
58 MIDI_SIMULTANEOUS_TRACK_FILE = 0x01,
|
lbajardsilogic@0
|
59 MIDI_SEQUENTIAL_TRACK_FILE = 0x02,
|
lbajardsilogic@0
|
60 MIDI_FILE_BAD_FORMAT = 0xFF
|
lbajardsilogic@0
|
61 } MIDIFileFormatType;
|
lbajardsilogic@0
|
62
|
lbajardsilogic@0
|
63 bool parseFile();
|
lbajardsilogic@0
|
64 bool parseHeader(const std::string &midiHeader);
|
lbajardsilogic@0
|
65 bool parseTrack(unsigned int &trackNum);
|
lbajardsilogic@0
|
66
|
lbajardsilogic@0
|
67 Model *loadTrack(unsigned int trackNum,
|
lbajardsilogic@0
|
68 Model *existingModel = 0,
|
lbajardsilogic@0
|
69 int minProgress = 0,
|
lbajardsilogic@0
|
70 int progressAmount = 100) const;
|
lbajardsilogic@0
|
71
|
lbajardsilogic@0
|
72 bool consolidateNoteOffEvents(unsigned int track);
|
lbajardsilogic@0
|
73 void updateTempoMap(unsigned int track);
|
lbajardsilogic@0
|
74 void calculateTempoTimestamps();
|
lbajardsilogic@0
|
75 RealTime getTimeForMIDITime(unsigned long midiTime) const;
|
lbajardsilogic@0
|
76
|
lbajardsilogic@0
|
77 // Internal convenience functions
|
lbajardsilogic@0
|
78 //
|
lbajardsilogic@0
|
79 int midiBytesToInt(const std::string &bytes);
|
lbajardsilogic@0
|
80 long midiBytesToLong(const std::string &bytes);
|
lbajardsilogic@0
|
81
|
lbajardsilogic@0
|
82 long getNumberFromMIDIBytes(int firstByte = -1);
|
lbajardsilogic@0
|
83
|
lbajardsilogic@0
|
84 MIDIByte getMIDIByte();
|
lbajardsilogic@0
|
85 std::string getMIDIBytes(unsigned long bytes);
|
lbajardsilogic@0
|
86
|
lbajardsilogic@0
|
87 bool skipToNextTrack();
|
lbajardsilogic@0
|
88
|
lbajardsilogic@0
|
89 int m_timingDivision; // pulses per quarter note
|
lbajardsilogic@0
|
90 MIDIFileFormatType m_format;
|
lbajardsilogic@0
|
91 unsigned int m_numberOfTracks;
|
lbajardsilogic@0
|
92
|
lbajardsilogic@0
|
93 long m_trackByteCount;
|
lbajardsilogic@0
|
94 bool m_decrementCount;
|
lbajardsilogic@0
|
95
|
lbajardsilogic@0
|
96 std::map<int, QString> m_trackNames;
|
lbajardsilogic@0
|
97 std::set<unsigned int> m_loadableTracks;
|
lbajardsilogic@0
|
98 std::set<unsigned int> m_percussionTracks;
|
lbajardsilogic@0
|
99 MIDIComposition m_midiComposition;
|
lbajardsilogic@0
|
100 TempoMap m_tempoMap;
|
lbajardsilogic@0
|
101
|
lbajardsilogic@0
|
102 QString m_path;
|
lbajardsilogic@0
|
103 std::ifstream *m_midiFile;
|
lbajardsilogic@0
|
104 size_t m_fileSize;
|
lbajardsilogic@0
|
105 QString m_error;
|
lbajardsilogic@0
|
106 size_t m_mainModelSampleRate;
|
lbajardsilogic@0
|
107 };
|
lbajardsilogic@0
|
108
|
lbajardsilogic@0
|
109
|
lbajardsilogic@0
|
110 #endif // _MIDI_FILE_READER_H_
|