diff options
author | Damien Zammit <damien@zamaudio.com> | 2017-02-17 19:17:05 +1100 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2017-02-17 19:17:05 +1100 |
commit | 35069083398b90e68856348cfd401e8943da9394 (patch) | |
tree | 23731acd689a4831d9059adbf4e8b3d0baac8d70 | |
parent | 317b19b0657fd9bc3bb0157dd504e1d7d27cde89 (diff) |
Add MIDI region support for all MIDI regions
We still don't know how to parse the offset of the
start of each MIDI region. Therefore we will make
Ardour import to region list, not to tracks.
Offsets within each region seem to be okay.
Tempo map does not seem to affect MIDI notes within
each region.
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r-- | ptfformat.cc | 147 | ||||
-rw-r--r-- | ptfformat.h | 2 |
2 files changed, 68 insertions, 81 deletions
diff --git a/ptfformat.cc b/ptfformat.cc index 9e6e505..0b9e873 100644 --- a/ptfformat.cc +++ b/ptfformat.cc @@ -30,7 +30,7 @@ static void hexdump(uint8_t *data, int len) { int i,j,end,step=16; - + for (i = 0; i < len; i += step) { printf("0x%02X: ", i); end = i + step; @@ -698,104 +698,91 @@ PTFFormat::parseaudio5(void) { resort(audiofiles); } -bool +void PTFFormat::parsemidi(void) { uint64_t i, k, n_midi_events, sample_time_zero; - uint64_t midi_pos, midi_len, max_pos = 0, min_pos = 0xffffffffffffffff; + uint64_t midi_pos, midi_len, max_pos; uint8_t midi_velocity, midi_note; uint16_t rsize; std::vector<midi_ev_t> midi; midi_ev_t m; bool found = false; + int max_regions = regions.size(); + char midiname[26] = { 0 }; // Find MdNLB k = 0; - while (k < len) { - if ( (ptfunxored[k ] == 'M') && - (ptfunxored[k+1] == 'd') && - (ptfunxored[k+2] == 'N') && - (ptfunxored[k+3] == 'L') && - (ptfunxored[k+4] == 'B')) { - found = true; - break; - } - k++; - } - if (!found) { - return false; - } + // Parse all midi tracks, treat each group of midi bytes as a track + while (k < len) { + max_pos = 0; - k += 11; - n_midi_events = ptfunxored[k] | ptfunxored[k+1] << 8 | - ptfunxored[k+2] << 16 | ptfunxored[k+3] << 24; - - k += 4; - sample_time_zero = 0xe8d4a51000; - for (i = 0; i < n_midi_events; i++, k += 35) { - midi_pos = (uint64_t)ptfunxored[k] | - (uint64_t)ptfunxored[k+1] << 8 | - (uint64_t)ptfunxored[k+2] << 16 | - (uint64_t)ptfunxored[k+3] << 24 | - (uint64_t)ptfunxored[k+4] << 32; - midi_pos -= sample_time_zero; - midi_pos /= 40; - midi_note = ptfunxored[k+8]; - midi_len = (uint64_t)ptfunxored[k+9] | - (uint64_t)ptfunxored[k+10] << 8 | - (uint64_t)ptfunxored[k+11] << 16 | - (uint64_t)ptfunxored[k+12] << 24 | - (uint64_t)ptfunxored[k+13] << 32; - midi_len /= 40; - midi_velocity = ptfunxored[k+17]; - - if (midi_pos + midi_len > max_pos) { - max_pos = midi_pos + midi_len; + while (k < len) { + if ( (ptfunxored[k ] == 'M') && + (ptfunxored[k+1] == 'd') && + (ptfunxored[k+2] == 'N') && + (ptfunxored[k+3] == 'L') && + (ptfunxored[k+4] == 'B')) { + found = true; + break; + } + k++; } - if (midi_pos < min_pos) { - min_pos = midi_pos; + + if (!found) { + return; } - m.pos = midi_pos; - m.length = midi_len; - m.note = midi_note; - m.velocity = midi_velocity; - midi.push_back(m); + k += 11; + n_midi_events = ptfunxored[k] | ptfunxored[k+1] << 8 | + ptfunxored[k+2] << 16 | ptfunxored[k+3] << 24; + + k += 4; + sample_time_zero = 0xe8d4a51000; + for (i = 0; i < n_midi_events; i++, k += 35) { + midi_pos = (uint64_t)ptfunxored[k] | + (uint64_t)ptfunxored[k+1] << 8 | + (uint64_t)ptfunxored[k+2] << 16 | + (uint64_t)ptfunxored[k+3] << 24 | + (uint64_t)ptfunxored[k+4] << 32; + midi_pos -= sample_time_zero; + midi_pos /= 40; + midi_note = ptfunxored[k+8]; + midi_len = (uint64_t)ptfunxored[k+9] | + (uint64_t)ptfunxored[k+10] << 8 | + (uint64_t)ptfunxored[k+11] << 16 | + (uint64_t)ptfunxored[k+12] << 24 | + (uint64_t)ptfunxored[k+13] << 32; + midi_len /= 40; + midi_velocity = ptfunxored[k+17]; + + if (midi_pos + midi_len > max_pos) { + max_pos = midi_pos + midi_len; + } - //fprintf(stderr, "MIDI: Note=%d Vel=%d Start=%d(samples) Len=%d(samples)\n", midi_note, midi_velocity, midi_pos, midi_len); - } + m.pos = midi_pos; + m.length = midi_len; + m.note = midi_note; + m.velocity = midi_velocity; + midi.push_back(m); - rsize = (uint16_t)regions.size(); - wav_t w = { std::string(""), 0, 0, 0 }; - region_t r = { - "MIDI", - rsize, - (int64_t)(min_pos*ratefactor), - (int64_t)(0), - (int64_t)(max_pos*ratefactor), - w, - midi, - }; - regions.push_back(r); - - uint16_t trmax = 0; - for (vector<track_t>::iterator - a = tracks.begin(); - a != tracks.end(); ++a) { - if (a->index + 1 > trmax) { - trmax = a->index + 1; + //fprintf(stderr, "MIDI: Note=%d Vel=%d Start=%d(samples) Len=%d(samples)\n", midi_note, midi_velocity, midi_pos, midi_len); } - } - track_t tr = { - "MIDI", - trmax, - 0, - r - }; - tracks.push_back(tr); - - return true; + rsize = (uint16_t)regions.size(); + snprintf(midiname, 20, "MIDI-%d", rsize - max_regions + 1); + wav_t w = { std::string(""), 0, 0, 0 }; + region_t r = { + midiname, + rsize, + (int64_t)(0), + (int64_t)(0), + (int64_t)(max_pos*ratefactor), + w, + midi, + }; + regions.push_back(r); + } } void diff --git a/ptfformat.h b/ptfformat.h index 17977c8..e5f4ed9 100644 --- a/ptfformat.h +++ b/ptfformat.h @@ -142,7 +142,7 @@ private: void parserest10(void); void parseaudio5(void); void parseaudio(void); - bool parsemidi(void); + void parsemidi(void); void resort(std::vector<wav_t>& ws); std::vector<wav_t> actualwavs; float ratefactor; |