Mercurial > hg > svcore
comparison data/fileio/MIDIFileWriter.cpp @ 1069:32ab6c48efaa
Merge from branch tonioni
| author | Chris Cannam |
|---|---|
| date | Mon, 20 Apr 2015 09:11:34 +0100 |
| parents | c7e9afcbf070 |
| children | 50210da3997c |
comparison
equal
deleted
inserted
replaced
| 1036:682d64f05e72 | 1069:32ab6c48efaa |
|---|---|
| 35 using std::ios; | 35 using std::ios; |
| 36 | 36 |
| 37 using namespace MIDIConstants; | 37 using namespace MIDIConstants; |
| 38 | 38 |
| 39 MIDIFileWriter::MIDIFileWriter(QString path, const NoteExportable *exportable, | 39 MIDIFileWriter::MIDIFileWriter(QString path, const NoteExportable *exportable, |
| 40 int sampleRate, float tempo) : | 40 sv_samplerate_t sampleRate, float tempo) : |
| 41 m_path(path), | 41 m_path(path), |
| 42 m_exportable(exportable), | 42 m_exportable(exportable), |
| 43 m_sampleRate(sampleRate), | 43 m_sampleRate(sampleRate), |
| 44 m_tempo(tempo), | 44 m_tempo(tempo), |
| 45 m_midiFile(0) | 45 m_midiFile(0) |
| 87 MIDIFileWriter::intToMIDIBytes(int number) const | 87 MIDIFileWriter::intToMIDIBytes(int number) const |
| 88 { | 88 { |
| 89 MIDIByte upper; | 89 MIDIByte upper; |
| 90 MIDIByte lower; | 90 MIDIByte lower; |
| 91 | 91 |
| 92 upper = (number & 0xFF00) >> 8; | 92 upper = MIDIByte((number & 0xFF00) >> 8); |
| 93 lower = (number & 0x00FF); | 93 lower = MIDIByte( number & 0x00FF); |
| 94 | 94 |
| 95 string rv; | 95 string rv; |
| 96 rv += upper; | 96 rv += upper; |
| 97 rv += lower; | 97 rv += lower; |
| 98 return rv; | 98 return rv; |
| 104 MIDIByte upper1; | 104 MIDIByte upper1; |
| 105 MIDIByte lower1; | 105 MIDIByte lower1; |
| 106 MIDIByte upper2; | 106 MIDIByte upper2; |
| 107 MIDIByte lower2; | 107 MIDIByte lower2; |
| 108 | 108 |
| 109 upper1 = (number & 0xff000000) >> 24; | 109 upper1 = MIDIByte((number & 0xff000000) >> 24); |
| 110 lower1 = (number & 0x00ff0000) >> 16; | 110 lower1 = MIDIByte((number & 0x00ff0000) >> 16); |
| 111 upper2 = (number & 0x0000ff00) >> 8; | 111 upper2 = MIDIByte((number & 0x0000ff00) >> 8); |
| 112 lower2 = (number & 0x000000ff); | 112 lower2 = MIDIByte((number & 0x000000ff)); |
| 113 | 113 |
| 114 string rv; | 114 string rv; |
| 115 rv += upper1; | 115 rv += upper1; |
| 116 rv += lower1; | 116 rv += lower1; |
| 117 rv += upper2; | 117 rv += upper2; |
| 342 | 342 |
| 343 NoteList notes = m_exportable->getNotes(); | 343 NoteList notes = m_exportable->getNotes(); |
| 344 | 344 |
| 345 for (NoteList::const_iterator i = notes.begin(); i != notes.end(); ++i) { | 345 for (NoteList::const_iterator i = notes.begin(); i != notes.end(); ++i) { |
| 346 | 346 |
| 347 int frame = i->start; | 347 sv_frame_t frame = i->start; |
| 348 int duration = i->duration; | 348 sv_frame_t duration = i->duration; |
| 349 int pitch = i->midiPitch; | 349 int pitch = i->midiPitch; |
| 350 int velocity = i->velocity; | 350 int velocity = i->velocity; |
| 351 int channel = i->channel; | 351 int channel = i->channel; |
| 352 | 352 |
| 353 if (pitch < 0) pitch = 0; | 353 if (pitch < 0) pitch = 0; |
| 356 if (channel < 0) channel = 0; | 356 if (channel < 0) channel = 0; |
| 357 if (channel > 15) channel = 0; | 357 if (channel > 15) channel = 0; |
| 358 | 358 |
| 359 // Convert frame to MIDI time | 359 // Convert frame to MIDI time |
| 360 | 360 |
| 361 double seconds = double(frame) / double(m_sampleRate); | 361 double seconds = double(frame) / m_sampleRate; |
| 362 double quarters = (seconds * m_tempo) / 60.0; | 362 double quarters = (seconds * m_tempo) / 60.0; |
| 363 unsigned long midiTime = int(quarters * m_timingDivision + 0.5); | 363 unsigned long midiTime = int(quarters * m_timingDivision + 0.5); |
| 364 | 364 |
| 365 // Get the sounding time for the matching NOTE_OFF | 365 // Get the sounding time for the matching NOTE_OFF |
| 366 seconds = double(frame + duration) / double(m_sampleRate); | 366 seconds = double(frame + duration) / m_sampleRate; |
| 367 quarters = (seconds * m_tempo) / 60.0; | 367 quarters = (seconds * m_tempo) / 60.0; |
| 368 unsigned long endTime = int(quarters * m_timingDivision + 0.5); | 368 unsigned long endTime = int(quarters * m_timingDivision + 0.5); |
| 369 | 369 |
| 370 // At this point all the notes we insert have absolute times | 370 // At this point all the notes we insert have absolute times |
| 371 // in the delta time fields. We resolve these into delta | 371 // in the delta time fields. We resolve these into delta |
