Chris@301
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@301
|
2
|
Chris@301
|
3 /*
|
Chris@301
|
4 Sonic Visualiser
|
Chris@301
|
5 An audio file viewer and annotation editor.
|
Chris@301
|
6 Centre for Digital Music, Queen Mary, University of London.
|
Chris@301
|
7
|
Chris@301
|
8 This program is free software; you can redistribute it and/or
|
Chris@301
|
9 modify it under the terms of the GNU General Public License as
|
Chris@301
|
10 published by the Free Software Foundation; either version 2 of the
|
Chris@301
|
11 License, or (at your option) any later version. See the file
|
Chris@301
|
12 COPYING included with this distribution for more information.
|
Chris@301
|
13 */
|
Chris@301
|
14
|
Chris@301
|
15
|
Chris@301
|
16 /*
|
Chris@301
|
17 This is a modified version of a source file from the
|
Chris@301
|
18 Rosegarden MIDI and audio sequencer and notation editor.
|
Chris@301
|
19 This file copyright 2000-2007 Richard Bown and Chris Cannam
|
Chris@301
|
20 and copyright 2007 QMUL.
|
Chris@301
|
21 */
|
Chris@301
|
22
|
Chris@301
|
23 #ifndef _MIDI_FILE_WRITER_H_
|
Chris@301
|
24 #define _MIDI_FILE_WRITER_H_
|
Chris@301
|
25
|
Chris@301
|
26 #include "base/RealTime.h"
|
Chris@301
|
27
|
Chris@301
|
28 #include <QString>
|
Chris@301
|
29
|
Chris@301
|
30 #include <vector>
|
Chris@301
|
31 #include <map>
|
Chris@301
|
32 #include <fstream>
|
Chris@301
|
33
|
Chris@301
|
34 class MIDIEvent;
|
Chris@852
|
35 class NoteExportable;
|
Chris@301
|
36
|
Chris@301
|
37 /**
|
Chris@301
|
38 * Write a MIDI file. This includes file write code for generic
|
Chris@301
|
39 * simultaneous-track MIDI files, but the conversion stage only
|
Chris@301
|
40 * supports a single-track MIDI file with fixed tempo, time signature
|
Chris@301
|
41 * and timing division.
|
Chris@301
|
42 */
|
Chris@301
|
43 class MIDIFileWriter
|
Chris@301
|
44 {
|
Chris@301
|
45 public:
|
Chris@852
|
46 MIDIFileWriter(QString path,
|
Chris@852
|
47 const NoteExportable *exportable,
|
Chris@852
|
48 int sampleRate, // used to convert exportable sample timings
|
Chris@852
|
49 float tempo = 120.f);
|
Chris@301
|
50 virtual ~MIDIFileWriter();
|
Chris@301
|
51
|
Chris@301
|
52 virtual bool isOK() const;
|
Chris@301
|
53 virtual QString getError() const;
|
Chris@301
|
54
|
Chris@301
|
55 virtual void write();
|
Chris@301
|
56
|
Chris@301
|
57 protected:
|
Chris@301
|
58 typedef std::vector<MIDIEvent *> MIDITrack;
|
Chris@301
|
59 typedef std::map<unsigned int, MIDITrack> MIDIComposition;
|
Chris@301
|
60
|
Chris@301
|
61 typedef enum {
|
Chris@301
|
62 MIDI_SINGLE_TRACK_FILE = 0x00,
|
Chris@301
|
63 MIDI_SIMULTANEOUS_TRACK_FILE = 0x01,
|
Chris@301
|
64 MIDI_SEQUENTIAL_TRACK_FILE = 0x02,
|
Chris@301
|
65 MIDI_FILE_BAD_FORMAT = 0xFF
|
Chris@301
|
66 } MIDIFileFormatType;
|
Chris@301
|
67
|
Chris@301
|
68 std::string intToMIDIBytes(int number) const;
|
Chris@301
|
69 std::string longToMIDIBytes(unsigned long number) const;
|
Chris@301
|
70 std::string longToVarBuffer(unsigned long number) const;
|
Chris@301
|
71
|
Chris@301
|
72 unsigned long getMIDITimeForTime(RealTime t) const;
|
Chris@301
|
73
|
Chris@301
|
74 bool writeHeader();
|
Chris@301
|
75 bool writeTrack(int track);
|
Chris@301
|
76 bool writeComposition();
|
Chris@301
|
77
|
Chris@301
|
78 bool convert();
|
Chris@301
|
79
|
Chris@852
|
80 QString m_path;
|
Chris@852
|
81 const NoteExportable *m_exportable;
|
Chris@852
|
82 int m_sampleRate;
|
Chris@852
|
83 float m_tempo;
|
Chris@852
|
84 int m_timingDivision; // pulses per quarter note
|
Chris@852
|
85 MIDIFileFormatType m_format;
|
Chris@852
|
86 unsigned int m_numberOfTracks;
|
Chris@301
|
87
|
Chris@852
|
88 MIDIComposition m_midiComposition;
|
Chris@301
|
89
|
Chris@852
|
90 std::ofstream *m_midiFile;
|
Chris@852
|
91 QString m_error;
|
Chris@301
|
92 };
|
Chris@301
|
93
|
Chris@301
|
94 #endif
|