summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2019-06-17 00:06:16 +1000
committerDamien Zammit <damien@zamaudio.com>2019-06-17 00:06:16 +1000
commit37f69e394cbb2baa538ae4a8386e2ccef9347ef3 (patch)
tree0c2c645cbd8bc56b370710acff1a4d0b3ef06ae6
parent83ef828c28d33645e0204e119dc5cc469d02e21e (diff)
Almost fixed MIDI
-rw-r--r--ptfformat.cc64
-rw-r--r--ptformat/ptfformat.h34
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();