Mercurial > hg > svcore
diff data/fileio/MIDIFileWriter.h @ 301:73537d900d4b
* Add MIDI file export (closes FR#1643721)
author | Chris Cannam |
---|---|
date | Thu, 04 Oct 2007 11:52:38 +0000 |
parents | |
children | d6bd5751b8f6 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/data/fileio/MIDIFileWriter.h Thu Oct 04 11:52:38 2007 +0000 @@ -0,0 +1,91 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + + +/* + This is a modified version of a source file from the + Rosegarden MIDI and audio sequencer and notation editor. + This file copyright 2000-2007 Richard Bown and Chris Cannam + and copyright 2007 QMUL. +*/ + +#ifndef _MIDI_FILE_WRITER_H_ +#define _MIDI_FILE_WRITER_H_ + +#include "base/RealTime.h" + +#include <QString> + +#include <vector> +#include <map> +#include <fstream> + +class MIDIEvent; +class NoteModel; + +/** + * Write a MIDI file. This includes file write code for generic + * simultaneous-track MIDI files, but the conversion stage only + * supports a single-track MIDI file with fixed tempo, time signature + * and timing division. + */ +class MIDIFileWriter +{ +public: + MIDIFileWriter(QString path, NoteModel *model, float tempo = 120.f); + virtual ~MIDIFileWriter(); + + virtual bool isOK() const; + virtual QString getError() const; + + virtual void write(); + +protected: + typedef std::vector<MIDIEvent *> MIDITrack; + typedef std::map<unsigned int, MIDITrack> MIDIComposition; + + typedef enum { + MIDI_SINGLE_TRACK_FILE = 0x00, + MIDI_SIMULTANEOUS_TRACK_FILE = 0x01, + MIDI_SEQUENTIAL_TRACK_FILE = 0x02, + MIDI_FILE_BAD_FORMAT = 0xFF + } MIDIFileFormatType; + + std::string intToMIDIBytes(int number) const; + std::string longToMIDIBytes(unsigned long number) const; + std::string longToVarBuffer(unsigned long number) const; + + unsigned long getMIDITimeForTime(RealTime t) const; + + bool writeHeader(); + bool writeTrack(int track); + bool writeComposition(); + + bool convert(); + + QString m_path; + NoteModel *m_model; + bool m_modelUsesHz; + float m_tempo; + int m_timingDivision; // pulses per quarter note + MIDIFileFormatType m_format; + unsigned int m_numberOfTracks; + + MIDIComposition m_midiComposition; + + std::ofstream *m_midiFile; + QString m_error; +}; + +#endif