40 int sampleRate,
float tempo) :
42 m_exportable(exportable),
43 m_sampleRate(sampleRate),
48 m_error =
"Conversion from model to internal MIDI format failed";
57 for (MIDITrack::iterator j = i->second.begin();
58 j != i->second.end(); ++j) {
92 upper = (number & 0xFF00) >> 8;
93 lower = (number & 0x00FF);
109 upper1 = (number & 0xff000000) >> 24;
110 lower1 = (number & 0x00ff0000) >> 16;
111 upper2 = (number & 0x0000ff00) >> 8;
112 lower2 = (number & 0x000000ff);
131 long inNumber = number;
135 outNumber = number & 0x7f;
141 while ((inNumber >>= 7 ) > 0) {
144 outNumber += (inNumber & 0x7f);
151 if (outNumber & 0x80)
187 MIDITrack::iterator midiEvent;
201 if ((*midiEvent)->isMeta()) {
203 trackBuffer += (*midiEvent)->getMetaEventCode();
207 getMetaMessage().length());
209 trackBuffer += (*midiEvent)->getMetaMessage();
212 if (((*midiEvent)->getEventCode() != eventCode) ||
214 trackBuffer += (*midiEvent)->getEventCode();
215 eventCode = (*midiEvent)->getEventCode();
220 switch ((*midiEvent)->getMessageType()) {
224 trackBuffer += (*midiEvent)->getData1();
225 trackBuffer += (*midiEvent)->getData2();
229 trackBuffer += (*midiEvent)->getData1();
230 trackBuffer += (*midiEvent)->getData2();
234 trackBuffer += (*midiEvent)->getData1();
238 trackBuffer += (*midiEvent)->getData1();
242 trackBuffer += (*midiEvent)->getData1();
243 trackBuffer += (*midiEvent)->getData2();
252 trackBuffer += (*midiEvent)->getMetaMessage();
282 new ofstream(
m_path.toLocal8Bit().data(), ios::out | ios::binary);
285 m_error =
"Can't open file for writing.";
306 m_error =
"MIDI file write failed";
325 "Exported from Sonic Visualiser");
329 "http://www.sonicvisualiser.org/");
332 long tempoValue = long(60000000.0 /
m_tempo + 0.01);
334 tempoString += (
MIDIByte)(tempoValue >> 16 & 0xFF);
335 tempoString += (
MIDIByte)(tempoValue >> 8 & 0xFF);
336 tempoString += (
MIDIByte)(tempoValue & 0xFF);
346 for (NoteList::const_iterator i =
notes.begin(); i !=
notes.end(); ++i) {
348 int frame = i->start;
349 int duration = i->duration;
350 int pitch = i->midiPitch;
351 int velocity = i->velocity;
353 if (pitch < 0) pitch = 0;
354 if (pitch > 127) pitch = 127;
359 double quarters = (seconds *
m_tempo) / 60.0;
363 seconds = double(frame + duration) / double(
m_sampleRate);
364 quarters = (seconds *
m_tempo) / 60.0;
391 unsigned long lastMidiTime = 0;
403 unsigned long deltaTime = (*it)->getTime() - lastMidiTime;
404 lastMidiTime = (*it)->getTime();
405 (*it)->setTime(deltaTime);
std::string longToVarBuffer(unsigned long number) const
std::string longToMIDIBytes(unsigned long number) const
unsigned int m_numberOfTracks
static const MIDIByte MIDI_END_OF_TRACK
MIDIFileWriter(QString path, const NoteExportable *exportable, int sampleRate, float tempo=120.f)
MIDIComposition m_midiComposition
static const char *const MIDI_TRACK_HEADER
bool writeTrack(int track)
static const MIDIByte MIDI_CUE_POINT
static const MIDIByte MIDI_FILE_META_EVENT
static const MIDIByte MIDI_SET_TEMPO
std::ofstream * m_midiFile
MIDIFileFormatType m_format
std::string intToMIDIBytes(int number) const
static const MIDIByte MIDI_PITCH_BEND
virtual NoteList getNotes() const =0
virtual QString getError() const
const NoteExportable * m_exportable
std::vector< NoteData > NoteList
virtual ~MIDIFileWriter()
static const MIDIByte MIDI_CTRL_CHANGE
static const MIDIByte MIDI_POLY_AFTERTOUCH
static const MIDIByte MIDI_SYSTEM_EXCLUSIVE
static const MIDIByte MIDI_NOTE_OFF
static const char *const MIDI_FILE_HEADER
static const MIDIByte MIDI_PROG_CHANGE
virtual bool isOK() const
static const MIDIByte MIDI_NOTE_ON
static const MIDIByte MIDI_CHNL_AFTERTOUCH