| 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 |