diff options
author | Damien Zammit <damien@zamaudio.com> | 2019-06-17 00:06:16 +1000 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2019-06-17 00:06:16 +1000 |
commit | 37f69e394cbb2baa538ae4a8386e2ccef9347ef3 (patch) | |
tree | 0c2c645cbd8bc56b370710acff1a4d0b3ef06ae6 | |
parent | 83ef828c28d33645e0204e119dc5cc469d02e21e (diff) |
Almost fixed MIDI
-rw-r--r-- | ptfformat.cc | 64 | ||||
-rw-r--r-- | ptformat/ptfformat.h | 34 |
2 files changed, 91 insertions, 7 deletions
diff --git a/ptfformat.cc b/ptfformat.cc index 42da81d..1512d09 100644 --- a/ptfformat.cc +++ b/ptfformat.cc @@ -943,8 +943,6 @@ PTFFormat::parserest(void) { } } } - } -#if 0 // MIDI ? } else if (b->content_type == 0x2519) { tindex = 0; //ntracks = u_endian_read4(&ptfunxored[b->offset+2], is_bigendian); @@ -962,7 +960,7 @@ PTFFormat::parserest(void) { // Add a dummy region for now wav_t w = { std::string(""), 0, 0, 0 }; std::vector<midi_ev_t> m; - region_t r = { std::string(""), 0, 0, 0, 0, w, m}; + region_t r = { std::string(""), 65535, 0, 0, 0, w, m}; track_t t = { trackname, @@ -975,7 +973,6 @@ PTFFormat::parserest(void) { } } } -#endif } // Parse regions->tracks @@ -1117,8 +1114,8 @@ struct mchunk { bool PTFFormat::parsemidi(void) { - uint32_t i, j, k, rindex; - uint64_t n_midi_events, zero_ticks; + uint32_t i, j, k, rindex, tindex, count, rawindex; + uint64_t n_midi_events, zero_ticks, start; uint64_t midi_pos, midi_len, max_pos, region_pos; uint8_t midi_velocity, midi_note; uint16_t regionnumber = 0; @@ -1192,7 +1189,7 @@ PTFFormat::parsemidi(void) { region_t r = { midiregionname, regionnumber++, - (int64_t)zero_ticks, + (int64_t)0xe8d4a51000ULL, (int64_t)0, //(int64_t)(max_pos*sessionrate*60/(960000*120)), (int64_t)mc.maxlen, @@ -1206,6 +1203,59 @@ PTFFormat::parsemidi(void) { } } } + // Put midi regions onto midi tracks + } else if (b->content_type == 0x1058) { + //nregions = u_endian_read4(&ptfunxored[b->offset+2], is_bigendian); + count = 0; + for (vector<PTFFormat::block_t>::iterator c = b->child.begin(); + c != b->child.end(); ++c) { + if (c->content_type == 0x1057) { + str = parsestring(c->offset + 2); + regionname = std::string(str); + for (vector<PTFFormat::block_t>::iterator d = c->child.begin(); + d != c->child.end(); ++d) { + if (d->content_type == 0x1056) { + for (vector<PTFFormat::block_t>::iterator e = d->child.begin(); + e != d->child.end(); ++e) { + if (e->content_type == 0x104f) { + // MIDI region->MIDI track + std::vector<track_t>::iterator ti; + std::vector<region_t>::iterator ri; + j = e->offset + 4; + rawindex = u_endian_read4(&ptfunxored[j], is_bigendian); + j += 4 + 1; + start = u_endian_read5(&ptfunxored[j], is_bigendian); + tindex = count; + if (!find_midiregion(rawindex, ri)) { + printf("XXX dropped region\n"); + continue; + } + if (!find_miditrack(tindex, ti)) { + printf("XXX dropped t(%d) r(%d)\n", tindex, rawindex); + continue; + } + //printf("XXX MIDI : %s : t(%d) r(%d) %llu(%llu)\n", (*ti).name.c_str(), tindex, rawindex, start, (*ri).startpos); + (*ri).startpos = start - 0xe8d4a51000ULL; + if ((*ti).reg.index == 65535) { + (*ti).reg = *ri; + } else { + track_t t = *ti; + t.reg = *ri; + miditracks.push_back(t); + } + } + } + } + } + count++; + } + } + } + } + for (std::vector<track_t>::iterator tr = miditracks.begin(); + tr != miditracks.end(); ++tr) { + if ((*tr).reg.index == 65535) { + miditracks.erase(tr--); } } return true; diff --git a/ptformat/ptfformat.h b/ptformat/ptfformat.h index 5bda5de..136df5a 100644 --- a/ptformat/ptfformat.h +++ b/ptformat/ptfformat.h @@ -169,6 +169,40 @@ public: } return false; } + + bool find_miditrack(uint16_t index, std::vector<track_t>::iterator& ti) { + std::vector<track_t>::iterator begin = miditracks.begin(); + std::vector<track_t>::iterator finish = miditracks.end(); + std::vector<track_t>::iterator found; + + // Create dummy track with index + wav_t w = { std::string(""), 0, 0, 0 }; + std::vector<midi_ev_t> m; + region_t r = { std::string(""), 0, 0, 0, 0, w, m}; + track_t t = { std::string(""), index, 0, r}; + + if ((found = std::find(begin, finish, t)) != finish) { + ti = found; + return true; + } + return false; + } + + bool find_midiregion(uint16_t index, std::vector<region_t>::iterator& ri) { + std::vector<region_t>::iterator begin = midiregions.begin(); + std::vector<region_t>::iterator finish = midiregions.end(); + std::vector<region_t>::iterator found; + + wav_t w = { std::string(""), 0, 0, 0 }; + std::vector<midi_ev_t> m; + region_t r = { std::string(""), index, 0, 0, 0, w, m}; + + if ((found = std::find(begin, finish, r)) != finish) { + ri = found; + return true; + } + return false; + } bool find_wav(uint16_t index, std::vector<wav_t>::iterator& wi) { std::vector<wav_t>::iterator begin = audiofiles.begin(); |