summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2019-06-16 23:05:34 +1000
committerDamien Zammit <damien@zamaudio.com>2019-06-16 23:05:34 +1000
commit5e68c5872e52806139bfa7dda9f2c8a9915cfe25 (patch)
treee83d14ee8bd774585acce1c389676967317a941d
parent47ef79afe1947c14d72f65d8296f87445c249105 (diff)
Fixing MIDI
-rw-r--r--ptfformat.cc120
1 files changed, 49 insertions, 71 deletions
diff --git a/ptfformat.cc b/ptfformat.cc
index 0cf19d3..a2a1afa 100644
--- a/ptfformat.cc
+++ b/ptfformat.cc
@@ -775,6 +775,9 @@ PTFFormat::parse_three_point(uint32_t j, uint64_t& start, uint64_t& offset, uint
}
switch (offsetbytes) {
+ case 5:
+ offset = u_endian_read5(&ptfunxored[j+5], false);
+ break;
case 4:
offset = u_endian_read4(&ptfunxored[j+5], false);
break;
@@ -793,6 +796,9 @@ PTFFormat::parse_three_point(uint32_t j, uint64_t& start, uint64_t& offset, uint
}
j+=offsetbytes;
switch (lengthbytes) {
+ case 5:
+ length = u_endian_read5(&ptfunxored[j+5], false);
+ break;
case 4:
length = u_endian_read4(&ptfunxored[j+5], false);
break;
@@ -811,6 +817,9 @@ PTFFormat::parse_three_point(uint32_t j, uint64_t& start, uint64_t& offset, uint
}
j+=lengthbytes;
switch (startbytes) {
+ case 5:
+ start = u_endian_read5(&ptfunxored[j+5], false);
+ break;
case 4:
start = u_endian_read4(&ptfunxored[j+5], false);
break;
@@ -858,8 +867,8 @@ PTFFormat::parse_region_info(uint32_t j, block_t& blk, region_t& r) {
bool
PTFFormat::parserest(void) {
- uint32_t i, j, findex, count, n;
- uint64_t start, offset, length;
+ uint32_t i, j, count, n;
+ uint64_t start;
uint16_t rindex, rawindex, tindex;
uint32_t nch;
uint16_t ch_map[MAX_CHANNELS_PER_TRACK];
@@ -915,7 +924,7 @@ PTFFormat::parserest(void) {
ch_map[i] = u_endian_read2(&ptfunxored[j], is_bigendian);
std::vector<track_t>::iterator ti;
- if (!find_track(tindex, ti)) {
+ if (!find_track(ch_map[i], ti)) {
// Add a dummy region for now
wav_t w = { std::string(""), 0, 0, 0 };
std::vector<midi_ev_t> m;
@@ -1108,18 +1117,16 @@ struct mchunk {
bool
PTFFormat::parsemidi(void) {
- uint32_t i, j, k, rindex, count;
- uint64_t tr, n_midi_events, zero_ticks;
+ uint32_t i, j, k, rindex;
+ uint64_t n_midi_events, zero_ticks;
uint64_t midi_pos, midi_len, max_pos, region_pos;
uint8_t midi_velocity, midi_note;
- uint16_t ridx;
- uint16_t nmiditracks, regionnumber = 0;
- uint32_t nregions, mr;
+ uint16_t regionnumber = 0;
+ std::string midiregionname;
std::vector<mchunk> midichunks;
midi_ev_t m;
- bool found = false;
char *str;
std::string regionname, trackname;
rindex = 0;
@@ -1164,70 +1171,41 @@ PTFFormat::parsemidi(void) {
midichunks.push_back(mchunk (zero_ticks, max_pos, midi));
}
- // Map midi chunks to regions
- while (k < b->block_size + b->offset) {
- char midiregionname[256];
- uint8_t namelen;
-
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"MdTEL", 5)) {
- break;
- }
-
- k += 41;
-
- nregions = u_endian_read2(&ptfunxored[k], is_bigendian);
-
- for (mr = 0; mr < nregions; mr++) {
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x0c", 2)) {
- break;
- }
-
- k += 9;
-
- namelen = ptfunxored[k];
- for (i = 0; i < namelen; i++) {
- midiregionname[i] = ptfunxored[k+4+i];
- }
- midiregionname[namelen] = '\0';
- k += 4 + namelen;
+ // Put chunks onto regions
+ } else if (b->content_type == 0x2002) {
+ for (vector<PTFFormat::block_t>::iterator c = b->child.begin();
+ c != b->child.end(); ++c) {
+ if (c->content_type == 0x2001) {
+ for (vector<PTFFormat::block_t>::iterator d = c->child.begin();
+ d != c->child.end(); ++d) {
+ if (d->content_type == 0x1007) {
+ j = d->offset + 2;
+ str = parsestring(d->offset + 2);
+ midiregionname = std::string(str);
+ j += 4 + midiregionname.size();
+ parse_three_point(j, region_pos, zero_ticks, midi_len);
+ j = d->offset + d->block_size;
+ rindex = u_endian_read4(&ptfunxored[j], is_bigendian);
+ struct mchunk mc = *(midichunks.begin()+rindex);
- k += 5;
- /*
- region_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;
- */
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\xfe\xff\xff\xff", 4)) {
- break;
+ wav_t w = { std::string(""), 0, 0, 0 };
+ region_t r = {
+ midiregionname,
+ regionnumber++,
+ (int64_t)zero_ticks,
+ (int64_t)0,
+ //(int64_t)(max_pos*sessionrate*60/(960000*120)),
+ (int64_t)mc.maxlen,
+ w,
+ mc.chunk,
+ };
+ midiregions.push_back(r);
+ //printf("XXX MIDI %s : r(%d) (%llu, %llu, %llu)\n", str, rindex, zero_ticks, region_pos, midi_len);
+ //dump_block(*d, 1);
+ }
}
-
- k += 40;
-
- ridx = ptfunxored[k];
- ridx |= ptfunxored[k+1] << 8;
-
- struct mchunk mc = *(midichunks.begin()+ridx);
-
- wav_t w = { std::string(""), 0, 0, 0 };
- region_t r = {
- midiregionname,
- regionnumber++,
- //(int64_t)mc.zero,
- (int64_t)0xe8d4a51000ULL,
- (int64_t)(0),
- //(int64_t)(max_pos*sessionrate*60/(960000*120)),
- (int64_t)mc.maxlen,
- w,
- mc.chunk,
- };
- midiregions.push_back(r);
- //printf("XXX MIDI: %s: r(%d)\n", midiregionname, regionnumber-1);
}
}
- } else if (b->content_type == 0x2002) {
- dump_block(*b, 1);
}
}
return true;
@@ -1851,7 +1829,7 @@ PTFFormat::parsemidi(void) {
}
midichunks.push_back(mchunk (zero_ticks, max_pos, midi));
}
-{
+
// Map midi chunks to regions
while (k < len) {
char midiregionname[256];
@@ -1913,7 +1891,7 @@ PTFFormat::parsemidi(void) {
midiregions.push_back(r);
}
}
-}
+
// Put midi regions on midi tracks
if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x03", 2)) {
return;