annotate data/fileio/MIDIFileReader.h @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fc9323a41f5a
children
rev   line source
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_