summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2019-06-17 17:16:30 +1000
committerDamien Zammit <damien@zamaudio.com>2019-06-17 17:16:30 +1000
commit6e87f073e147d7cf93ff6165831c7e82425a82b7 (patch)
tree7ef67bcfeb4377e69f64a64ba34758367fe233a1
parent6c1642468f34dd5bc08bcef1ebb57e4be026a8ae (diff)
Fixes for >= pt10
-rw-r--r--ptfformat.cc166
1 files changed, 109 insertions, 57 deletions
diff --git a/ptfformat.cc b/ptfformat.cc
index fa17834..f84f3b4 100644
--- a/ptfformat.cc
+++ b/ptfformat.cc
@@ -31,7 +31,11 @@
#include "ptformat/ptfformat.h"
#if 0
-#define verbose_printf(...) printf(__VA_ARGS__)
+#define DEBUG
+#endif
+
+#ifdef DEBUG
+#define verbose_printf(...) printf("XXX PTFORMAT XXX: " __VA_ARGS__)
#else
#define verbose_printf(...)
#endif
@@ -613,13 +617,7 @@ void
PTFFormat::dump(void) {
for (vector<PTFFormat::block_t>::iterator b = blocks.begin();
b != blocks.end(); ++b) {
- switch (b->content_type) {
- case 0x1054:
- dump_block(*b, 0);
- break;
- default:
- break;
- }
+ dump_block(*b, 0);
}
}
@@ -639,7 +637,9 @@ PTFFormat::parseblocks(void) {
int
PTFFormat::parse(void) {
parseblocks();
- //dump();
+#ifdef DEBUG
+ dump();
+#endif
if (!parseheader())
return -1;
setrates();
@@ -714,7 +714,7 @@ PTFFormat::parseaudio(void) {
if (foundin(wavname, std::string("Fade Files"))) {
continue;
}
- if (!( foundin(wavtype, std::string("WAVE")) ||
+ if ((wavtype.size() != 0) && !(foundin(wavtype, std::string("WAVE")) ||
foundin(wavtype, std::string("EVAW")) ||
foundin(wavtype, std::string("AIFF")) ||
foundin(wavtype, std::string("FFIA"))) ) {
@@ -867,14 +867,14 @@ PTFFormat::parse_region_info(uint32_t j, block_t& blk, region_t& r) {
bool
PTFFormat::parserest(void) {
- uint32_t i, j, count, n;
+ uint32_t i, j, count;
uint64_t start;
uint16_t rindex, rawindex, tindex;
uint32_t nch;
uint16_t ch_map[MAX_CHANNELS_PER_TRACK];
bool found = false;
char *reg;
- std::string regionname, trackname;
+ std::string regionname, trackname, midiregionname;
rindex = 0;
// Parse sources->regions
@@ -938,7 +938,7 @@ PTFFormat::parserest(void) {
};
tracks.push_back(t);
}
- //printf("XXX %s : %d(%d)\n", reg, nch, ch_map[0]);
+ //verbose_printf("%s : %d(%d)\n", reg, nch, ch_map[0]);
j += 2;
}
}
@@ -1040,11 +1040,11 @@ PTFFormat::parserest(void) {
start = u_endian_read4(&ptfunxored[j], is_bigendian);
tindex = count;
if (!find_region(rawindex, ri)) {
- printf("XXX dropped region\n");
+ verbose_printf("dropped region %d\n", rawindex);
continue;
}
if (!find_track(tindex, ti)) {
- printf("XXX dropped track %d\n", tindex);
+ verbose_printf("dropped track %d\n", tindex);
continue;
}
(*ri).startpos = start;
@@ -1063,39 +1063,12 @@ PTFFormat::parserest(void) {
count++;
}
}
- } else if (b->content_type == 0x262c) {
- tindex = 0;
- for (vector<PTFFormat::block_t>::iterator c = b->child.begin();
- c != b->child.end(); ++c) {
- if (c->content_type == 0x262b) {
- for (vector<PTFFormat::block_t>::iterator d = c->child.begin();
- d != c->child.end(); ++d) {
- if (d->content_type == 0x2628) {
- count = 0;
- reg = parsestring(d->offset + 2);
- regionname = std::string(reg);
- j = d->offset + d->block_size + 1;
- n = u_endian_read4(&ptfunxored[j], is_bigendian);
- for (vector<PTFFormat::block_t>::iterator e = d->child.begin();
- e != d->child.end(); ++e) {
- if (e->content_type == 0x2523) {
- // Real region
- j = e->offset + 39;
- rawindex = u_endian_read4(&ptfunxored[j], is_bigendian);
- printf("XXX %s : %d %d %d (%d)\n", reg, rawindex, tindex, n, rawindex-n);
- count++;
- }
- }
- if (!count) {
- // Compound region
- printf("XXX %s : compound region %d (%d)\n", reg, tindex, n);
- }
- }
- found = true;
- }
- tindex++;
- }
- }
+ }
+ }
+ for (std::vector<track_t>::iterator tr = tracks.begin();
+ tr != tracks.end(); ++tr) {
+ if ((*tr).reg.index == 65535) {
+ tracks.erase(tr--);
}
}
return found;
@@ -1114,8 +1087,8 @@ struct mchunk {
bool
PTFFormat::parsemidi(void) {
- uint32_t i, j, k, rindex, tindex, count, rawindex;
- uint64_t n_midi_events, zero_ticks, start;
+ uint32_t i, j, k, n, rindex, tindex, mindex, count, rawindex;
+ uint64_t n_midi_events, zero_ticks, start, offset, length, start2, stop2;
uint64_t midi_pos, midi_len, max_pos, region_pos;
uint8_t midi_velocity, midi_note;
uint16_t regionnumber = 0;
@@ -1177,7 +1150,7 @@ PTFFormat::parsemidi(void) {
d != c->child.end(); ++d) {
if (d->content_type == 0x1007) {
j = d->offset + 2;
- str = parsestring(d->offset + 2);
+ str = parsestring(j);
midiregionname = std::string(str);
j += 4 + midiregionname.size();
parse_three_point(j, region_pos, zero_ticks, midi_len);
@@ -1197,14 +1170,93 @@ PTFFormat::parsemidi(void) {
mc.chunk,
};
midiregions.push_back(r);
- //printf("XXX MIDI %s : r(%d) (%llu, %llu, %llu)\n", str, rindex, zero_ticks, region_pos, midi_len);
+ //verbose_printf("MIDI %s : r(%d) (%llu, %llu, %llu)\n", str, rindex, zero_ticks, region_pos, midi_len);
//dump_block(*d, 1);
}
}
}
}
- // Put midi regions onto midi tracks
- } else if (b->content_type == 0x1058) {
+ }
+ }
+
+ // COMPOUND MIDI regions
+ for (vector<PTFFormat::block_t>::iterator b = blocks.begin();
+ b != blocks.end(); ++b) {
+ if (b->content_type == 0x262c) {
+ mindex = 0;
+ for (vector<PTFFormat::block_t>::iterator c = b->child.begin();
+ c != b->child.end(); ++c) {
+ if (c->content_type == 0x262b) {
+ for (vector<PTFFormat::block_t>::iterator d = c->child.begin();
+ d != c->child.end(); ++d) {
+ if (d->content_type == 0x2628) {
+ count = 0;
+ j = d->offset + 2;
+ str = parsestring(j);
+ regionname = std::string(str);
+ j += 4 + regionname.size();
+ parse_three_point(j, start, offset, length);
+ j = d->offset + d->block_size + 2;
+ n = u_endian_read2(&ptfunxored[j], is_bigendian);
+
+ for (vector<PTFFormat::block_t>::iterator e = d->child.begin();
+ e != d->child.end(); ++e) {
+ if (e->content_type == 0x2523) {
+ // FIXME Compound MIDI region
+ j = e->offset + 39;
+ rawindex = u_endian_read4(&ptfunxored[j], is_bigendian);
+ j += 12;
+ start2 = u_endian_read5(&ptfunxored[j], is_bigendian);
+ int64_t signedval = (int64_t)start2;
+ signedval -= ZERO_TICKS;
+ if (signedval < 0) {
+ signedval = -signedval;
+ }
+ start2 = signedval;
+ j += 8;
+ stop2 = u_endian_read5(&ptfunxored[j], is_bigendian);
+ signedval = (int64_t)stop2;
+ signedval -= ZERO_TICKS;
+ if (signedval < 0) {
+ signedval = -signedval;
+ }
+ stop2 = signedval;
+ j += 16;
+ //nn = u_endian_read4(&ptfunxored[j], is_bigendian);
+ //verbose_printf("COMPOUND %s : c(%d) r(%d) ?(%d) ?(%d) (%llu %llu)(%llu %llu %llu)\n", str, mindex, rawindex, n, nn, start2, stop2, start, offset, length);
+ count++;
+ }
+ }
+ if (!count) {
+ // Plain MIDI region
+ struct mchunk mc = *(midichunks.begin()+n);
+
+ wav_t w = { std::string(""), 0, 0, 0 };
+ region_t r = {
+ midiregionname,
+ (uint16_t)n,
+ (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);
+ verbose_printf("%s : MIDI region mr(%d) ?(%d) (%llu %llu %llu)\n", str, mindex, n, start, offset, length);
+ mindex++;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Put midi regions onto midi tracks
+ for (vector<PTFFormat::block_t>::iterator b = blocks.begin();
+ b != blocks.end(); ++b) {
+ 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();
@@ -1227,14 +1279,14 @@ PTFFormat::parsemidi(void) {
start = u_endian_read5(&ptfunxored[j], is_bigendian);
tindex = count;
if (!find_midiregion(rawindex, ri)) {
- printf("XXX dropped region\n");
+ verbose_printf("dropped midiregion\n");
continue;
}
if (!find_miditrack(tindex, ti)) {
- printf("XXX dropped t(%d) r(%d)\n", tindex, rawindex);
+ verbose_printf("dropped midi 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);
+ //verbose_printf("MIDI : %s : t(%d) r(%d) %llu(%llu)\n", (*ti).name.c_str(), tindex, rawindex, start, (*ri).startpos);
int64_t signedstart = (int64_t)(start - ZERO_TICKS);
if (signedstart < 0)
signedstart = -signedstart;