annotate data/fileio/MIDIFileWriter.h @ 999:694301cc71cc

Add MIDI destinations tests and fix feature writer bugs resulting from them
author Chris Cannam
date Tue, 14 Oct 2014 10:07:02 +0100
parents d6bd5751b8f6
children c7e9afcbf070
rev   line source
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