annotate data/fileio/MIDIFileWriter.h @ 1008:d9e0e59a1581

When using an aggregate model to pass data to a transform, zero-pad the shorter input to the duration of the longer rather than truncating the longer. (This is better behaviour for e.g. MATCH, and in any case the code was previously truncating incorrectly and ending up with garbage data at the end.)
author Chris Cannam
date Fri, 14 Nov 2014 13:51:33 +0000
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