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