summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2019-06-17 17:17:04 +1000
committerDamien Zammit <damien@zamaudio.com>2019-06-17 17:17:04 +1000
commit4b3e603e529c2e0e19b50125eec01ef47b7fb477 (patch)
treeafb79a426bb0ae138aede17f874f0e39f4a347b9
parent6e87f073e147d7cf93ff6165831c7e82425a82b7 (diff)
Remove legacy code path
-rw-r--r--ptfformat.cc2073
1 files changed, 0 insertions, 2073 deletions
diff --git a/ptfformat.cc b/ptfformat.cc
index f84f3b4..5b71011 100644
--- a/ptfformat.cc
+++ b/ptfformat.cc
@@ -1315,2076 +1315,3 @@ PTFFormat::parsemidi(void) {
}
return true;
}
-
-#if 0
-int
-PTFFormat::parse(void) {
- if (version == 5) {
- parse5header();
- setrates();
- if (sessionrate < 44100 || sessionrate > 192000)
- return -1;
- parseaudio5();
- parserest5();
- parsemidi();
- } else if (version == 7) {
- parse7header();
- setrates();
- if (sessionrate < 44100 || sessionrate > 192000)
- return -1;
- parseaudio();
- parserest89();
- parsemidi();
- } else if (version == 8) {
- parse8header();
- setrates();
- if (sessionrate < 44100 || sessionrate > 192000)
- return -1;
- parseaudio();
- parserest89();
- parsemidi();
- } else if (version == 9) {
- parse9header();
- setrates();
- if (sessionrate < 44100 || sessionrate > 192000)
- return -1;
- parseaudio();
- parserest89();
- parsemidi();
- } else if (version == 10 || version == 11 || version == 12) {
- parse10header();
- setrates();
- if (sessionrate < 44100 || sessionrate > 192000)
- return -1;
- parseaudio();
- parserest12();
- parsemidi12();
- } else {
- // Should not occur
- return -1;
- }
- return 0;
-}
-void
-PTFFormat::parse5header(void) {
- uint32_t k;
-
- // Find session sample rate
- k = 0x100;
-
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x00\x02", 3)) {
- jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x03", 2);
- k--;
- }
-
- sessionrate = u_endian_read3(&ptfunxored[k+12], is_bigendian);
-}
-
-void
-PTFFormat::parse7header(void) {
- uint32_t k;
-
- // Find session sample rate
- k = 0x100;
-
- jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x00\x05", 3);
-
- sessionrate = u_endian_read3(&ptfunxored[k+12], is_bigendian);
-}
-
-void
-PTFFormat::parse8header(void) {
- uint32_t k;
-
- // Find session sample rate
- k = 0;
-
- jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x05", 2);
-
- sessionrate = u_endian_read3(&ptfunxored[k+11], is_bigendian);
-}
-
-void
-PTFFormat::parse9header(void) {
- uint32_t k;
-
- // Find session sample rate
- k = 0x100;
-
- jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x06", 2);
-
- sessionrate = u_endian_read3(&ptfunxored[k+11], is_bigendian);
-}
-
-void
-PTFFormat::parse10header(void) {
- uint32_t k;
-
- // Find session sample rate
- k = 0x100;
-
- jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x09", 2);
-
- sessionrate = u_endian_read3(&ptfunxored[k+11], is_bigendian);
-}
-
-void
-PTFFormat::parserest5(void) {
- uint32_t i, j, k;
- uint64_t regionspertrack, lengthofname, numberofregions;
- uint64_t startbytes, lengthbytes, offsetbytes, somethingbytes, skipbytes;
- uint16_t tracknumber = 0;
- uint16_t findex;
- uint16_t rindex = 0;
- unsigned char tag1[3];
- unsigned char tag2[3];
- unsigned char tag3[3];
-
- if (is_bigendian) {
- tag1[0] = tag2[0] = tag3[0] = '\x5a';
- tag1[1] = tag2[1] = tag3[1] = '\x00';
- tag1[2] = '\x01';
- tag2[2] = '\x02';
- tag3[2] = '\x03';
- } else {
- tag1[0] = tag2[0] = tag3[0] = '\x5a';
- tag1[1] = '\x01';
- tag2[1] = '\x02';
- tag3[1] = '\x03';
- tag1[2] = tag2[2] = tag3[2] = '\x00';
- }
-
- // Find Source->Region info
- k = upto;
- for (i = 0; i < 2; i++) {
- jumpto(&k, ptfunxored, len, tag3, 3);
- k++;
- }
- jumpto(&k, ptfunxored, len, tag2, 3);
-
- numberofregions = u_endian_read4(&ptfunxored[k-13], is_bigendian);
-
- i = k;
- while (numberofregions > 0 && i < len) {
- jumpto(&i, ptfunxored, len, tag2, 3);
-
- uint32_t lengthofname = u_endian_read4(&ptfunxored[i+9], is_bigendian);
-
- char name[256] = {0};
- for (j = 0; j < lengthofname; j++) {
- name[j] = ptfunxored[i+13+j];
- }
- name[j] = '\0';
- j += i+13;
- //uint8_t disabled = ptfunxored[j];
-
- if (is_bigendian) {
- offsetbytes = (ptfunxored[j+4] & 0xf0) >> 4;
- lengthbytes = (ptfunxored[j+3] & 0xf0) >> 4;
- startbytes = (ptfunxored[j+2] & 0xf0) >> 4;
- somethingbytes = (ptfunxored[j+2] & 0xf);
- skipbytes = ptfunxored[j+1];
- } else {
- offsetbytes = (ptfunxored[j+1] & 0xf0) >> 4; //3
- lengthbytes = (ptfunxored[j+2] & 0xf0) >> 4;
- startbytes = (ptfunxored[j+3] & 0xf0) >> 4; //1
- somethingbytes = (ptfunxored[j+3] & 0xf);
- skipbytes = ptfunxored[j+4];
- }
- findex = u_endian_read4(&ptfunxored[j+5
- +startbytes
- +lengthbytes
- +offsetbytes
- +somethingbytes
- +skipbytes], is_bigendian);
-
- uint32_t sampleoffset = 0;
- switch (offsetbytes) {
- case 4:
- sampleoffset = u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- sampleoffset = u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- sampleoffset = (uint32_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- sampleoffset = (uint32_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=offsetbytes;
- uint32_t length = 0;
- switch (lengthbytes) {
- case 4:
- length = u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- length = u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- length = (uint32_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- length = (uint32_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=lengthbytes;
- uint32_t start = 0;
- switch (startbytes) {
- case 4:
- start = u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- start = u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- start = (uint32_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- start = (uint32_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=startbytes;
-
- std::string filename = string(name);
- wav_t f = {
- "",
- (uint16_t)findex,
- (int64_t)(start*ratefactor),
- (int64_t)(length*ratefactor),
- };
-
- vector<wav_t>::iterator begin = actualwavs.begin();
- vector<wav_t>::iterator finish = actualwavs.end();
- vector<wav_t>::iterator found;
- if ((found = std::find(begin, finish, f)) != finish) {
- f.filename = (*found).filename;
- }
- std::vector<midi_ev_t> m;
- region_t r = {
- name,
- rindex,
- (int64_t)(start*ratefactor),
- (int64_t)(sampleoffset*ratefactor),
- (int64_t)(length*ratefactor),
- f,
- m
- };
- regions.push_back(r);
- rindex++;
- i = j + 1;
- numberofregions--;
- }
-
- // Find Region->Track info
- /*
- k = 0;
- for (i = 0; i < 4; i++) {
- jumpto(&k, ptfunxored, len, tag3, 3);
- k++;
- }
- */
- k = j = i;
- while (j < len) {
- if (jumpto(&j, ptfunxored, j+13+3, tag1, 3)) {
- j++;
- if (jumpto(&j, ptfunxored, j+13+3, tag1, 3)) {
- j++;
- if (jumpto(&j, ptfunxored, j+13+3, tag1, 3)) {
- if ((j == k+26) && (ptfunxored[j-13] == '\x5a') && (ptfunxored[j-26] == '\x5a')) {
- k = j;
- break;
- }
- }
- }
- }
- k++;
- j = k;
- }
-
- if (ptfunxored[k+13] == '\x5a') {
- k++;
- }
-
- // Start parsing track info
- rindex = 0;
- while (k < len) {
- if ( (ptfunxored[k ] == 0xff) &&
- (ptfunxored[k+1] == 0xff)) {
- break;
- }
- jumpto(&k, ptfunxored, len, tag1, 3);
-
- lengthofname = u_endian_read4(&ptfunxored[k+9], is_bigendian);
- if (ptfunxored[k+13] == 0x5a) {
- k++;
- break;
- }
- char name[256] = {0};
- for (j = 0; j < lengthofname; j++) {
- name[j] = ptfunxored[k+13+j];
- }
- name[j] = '\0';
- regionspertrack = u_endian_read4(&ptfunxored[k+13+j], is_bigendian);
- for (i = 0; i < regionspertrack; i++) {
- jumpto(&k, ptfunxored, len, tag3, 3);
- j = k + 15;
- if (is_bigendian) {
- offsetbytes = (ptfunxored[j+1] & 0xf0) >> 4;
- //somethingbytes = (ptfunxored[j+2] & 0xf);
- lengthbytes = (ptfunxored[j+3] & 0xf0) >> 4;
- startbytes = (ptfunxored[j+4] & 0xf0) >> 4;
- } else {
- offsetbytes = (ptfunxored[j+4] & 0xf0) >> 4;
- //somethingbytes = (ptfunxored[j+3] & 0xf);
- lengthbytes = (ptfunxored[j+2] & 0xf0) >> 4;
- startbytes = (ptfunxored[j+1] & 0xf0) >> 4;
- }
- rindex = u_endian_read4(&ptfunxored[k+11], is_bigendian);
- uint32_t start = 0;
- switch (startbytes) {
- case 4:
- start = u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- start = u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- start = (uint32_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- start = (uint32_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=startbytes;
- uint32_t length = 0;
- switch (lengthbytes) {
- case 4:
- length = u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- length = u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- length = (uint32_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- length = (uint32_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=lengthbytes;
- uint32_t sampleoffset = 0;
- switch (offsetbytes) {
- case 4:
- sampleoffset = u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- sampleoffset = u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- sampleoffset = (uint32_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- sampleoffset = (uint32_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=offsetbytes;
-
- track_t tr;
- tr.name = name;
-
- region_t r;
- r.index = rindex;
-
- vector<region_t>::iterator begin = regions.begin();
- vector<region_t>::iterator finish = regions.end();
- vector<region_t>::iterator found;
- if ((found = std::find(begin, finish, r)) != finish) {
- tr.reg = (*found);
- }
-
- tr.reg.startpos = (int64_t)(start*ratefactor);
- tr.reg.sampleoffset = (int64_t)(sampleoffset*ratefactor);
- tr.reg.length = (int64_t)(length*ratefactor);
- vector<track_t>::iterator ti;
- vector<track_t>::iterator bt = tracks.begin();
- vector<track_t>::iterator et = tracks.end();
- if ((ti = std::find(bt, et, tr)) != et) {
- tracknumber = (*ti).index;
- } else {
- ++tracknumber;
- }
- track_t t = {
- name,
- (uint16_t)tracknumber,
- uint8_t(0),
- tr.reg
- };
- //if (tr.reg.length > 0) {
- tracks.push_back(t);
- //}
- k++;
- }
- k++;
- }
-}
-
-void
-PTFFormat::resort(std::vector<wav_t>& ws) {
- int j = 0;
- std::sort(ws.begin(), ws.end());
- for (std::vector<wav_t>::iterator i = ws.begin(); i != ws.end(); ++i) {
- (*i).index = j;
- j++;
- }
-}
-
-void
-PTFFormat::resort(std::vector<region_t>& rs) {
- int j = 0;
- //std::sort(rs.begin(), rs.end());
- for (std::vector<region_t>::iterator i = rs.begin(); i != rs.end(); ++i) {
- (*i).index = j;
- j++;
- }
-}
-
-void
-PTFFormat::filter(std::vector<region_t>& rs) {
- for (std::vector<region_t>::iterator i = rs.begin(); i != rs.end(); ++i) {
- if (i->length == 0)
- rs.erase(i);
- }
-}
-
-void
-PTFFormat::parseaudio5(void) {
- uint32_t i,k,l;
- uint64_t lengthofname, wavnumber;
- uint32_t numberofwavs;
- unsigned char tag6_LE[3], tag5_BE[3];
- unsigned char tag2_LE[3], tag2_BE[3];
-
- // Find start of wav file list
- k = 0;
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\xff\xff\xff\xff", 4))
- return;
- numberofwavs = u_endian_read4(&ptfunxored[k-18], is_bigendian);
-
- // Find actual wav names
- char wavname[256];
- i = k;
- jumpto(&i, ptfunxored, len, (const unsigned char *)"Files", 5);
-
- wavnumber = 0;
- i+=16;
- char ext[5];
- while (i < len && numberofwavs > 0) {
- i++;
- if ( ((ptfunxored[i ] == 0x5a) &&
- (ptfunxored[i+1] == 0x00) &&
- (ptfunxored[i+2] == 0x05)) ||
- ((ptfunxored[i ] == 0x5a) &&
- (ptfunxored[i+1] == 0x06))) {
- break;
- }
- lengthofname = u_endian_read4(&ptfunxored[i-3], is_bigendian);
- i++;
- l = 0;
- while (l < lengthofname) {
- wavname[l] = ptfunxored[i+l];
- l++;
- }
- i+=lengthofname;
- ext[0] = ptfunxored[i++];
- ext[1] = ptfunxored[i++];
- ext[2] = ptfunxored[i++];
- ext[3] = ptfunxored[i++];
- ext[4] = '\0';
-
- wavname[l] = 0;
- if (foundin(wavname, ".L") || foundin(wavname, ".R")) {
- extension = string("");
- } else if (foundin(wavname, ".wav") || foundin(ext, "WAVE")) {
- extension = string(".wav");
- } else if (foundin(wavname, ".aif") || foundin(ext, "AIFF")) {
- extension = string(".aif");
- } else {
- extension = string("");
- }
-
- std::string wave = string(wavname);
-
- if (foundin(wave, string(".grp"))) {
- continue;
- }
- if (foundin(wave, string("Fade Files"))) {
- i += 7;
- continue;
- }
-
- wav_t f = { wave, (uint16_t)(wavnumber++), 0, 0 };
-
- actualwavs.push_back(f);
- audiofiles.push_back(f);
- //printf("done\n");
- numberofwavs--;
- i += 7;
- }
-
- i -= 7;
-
- tag5_BE[0] = tag6_LE[0] = tag2_BE[0] = tag2_LE[0] = '\x5a';
- tag5_BE[1] = '\x00';
- tag6_LE[1] = '\x06';
- tag2_BE[1] = '\x00';
- tag2_LE[1] = '\x02';
- tag5_BE[2] = '\x05';
- tag6_LE[2] = '\x00';
- tag2_BE[2] = '\x02';
- tag2_LE[2] = '\x00';
-
- // Loop through all the sources
- for (vector<wav_t>::iterator w = audiofiles.begin(); w != audiofiles.end(); ++w) {
- // Jump to start of source metadata for this source
- if (is_bigendian) {
- if (!jumpto(&i, ptfunxored, len, tag5_BE, 3))
- return;
- if (!jumpto(&i, ptfunxored, len, tag2_BE, 3))
- return;
- w->length = u_endian_read4(&ptfunxored[i+19], true);
- } else {
- if (!jumpto(&i, ptfunxored, len, tag6_LE, 3))
- return;
- if (!jumpto(&i, ptfunxored, len, tag2_LE, 3))
- return;
- w->length = u_endian_read4(&ptfunxored[i+15], false);
- }
- }
- upto = i;
-}
-
-void
-PTFFormat::parsemidi(void) {
- uint32_t i, k;
- uint64_t tr, 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;
-
- std::vector<mchunk> midichunks;
- midi_ev_t m;
-
- // Find MdNLB
- k = 0;
-
- // Parse all midi chunks, not 1:1 mapping to regions yet
- while (k + 35 < len) {
- max_pos = 0;
- std::vector<midi_ev_t> midi;
-
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"MdNLB", 5)) {
- break;
- }
- k += 11;
- n_midi_events = ptfunxored[k] | ptfunxored[k+1] << 8 |
- ptfunxored[k+2] << 16 | ptfunxored[k+3] << 24;
-
- k += 4;
- zero_ticks = u_endian_read5(&ptfunxored[k], is_bigendian);
- for (i = 0; i < n_midi_events && k < len; i++, k += 35) {
- midi_pos = u_endian_read5(&ptfunxored[k], is_bigendian);
- midi_pos -= zero_ticks;
- midi_note = ptfunxored[k+8];
- midi_len = u_endian_read5(&ptfunxored[k+9], is_bigendian);
- midi_velocity = ptfunxored[k+17];
-
- if (midi_pos + midi_len > max_pos) {
- max_pos = midi_pos + midi_len;
- }
-
- m.pos = midi_pos;
- m.length = midi_len;
- m.note = midi_note;
- m.velocity = midi_velocity;
-#if 1
-// stop gap measure to prevent crashes in ardour,
-// remove when decryption is fully solved for .ptx
- if ((m.velocity & 0x80) || (m.note & 0x80) ||
- (m.pos & 0xff00000000LL) || (m.length & 0xff00000000LL)) {
- continue;
- }
-#endif
- midi.push_back(m);
- }
- midichunks.push_back(mchunk (zero_ticks, max_pos, midi));
- }
-
- // Map midi chunks to regions
- while (k < len) {
- 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;
-
- 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;
- }
-
- 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);
- }
- }
-
- // Put midi regions on midi tracks
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x03", 2)) {
- return;
- }
-
- nmiditracks = u_endian_read2(&ptfunxored[k-4], is_bigendian);
-
- for (tr = 0; tr < nmiditracks; tr++) {
- char miditrackname[256];
- uint8_t namelen;
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x03", 2)) {
- return;
- }
-
- namelen = ptfunxored[k+9];
- for (i = 0; i < namelen; i++) {
- miditrackname[i] = ptfunxored[k+13+i];
- }
- miditrackname[namelen] = '\0';
- k += 13 + namelen;
- nregions = u_endian_read2(&ptfunxored[k], is_bigendian);
-
- for (i = 0; (i < nregions) && (k < len); i++) {
- k += 24;
-
- ridx = u_endian_read2(&ptfunxored[k], is_bigendian);
-
- k += 5;
-
- region_pos = u_endian_read5(&ptfunxored[k], is_bigendian);
-
- k += 20;
-
- track_t mtr;
- mtr.name = string(miditrackname);
- mtr.index = tr;
- mtr.playlist = 0;
- // Find the midi region with index 'ridx'
- std::vector<region_t>::iterator begin = midiregions.begin();
- std::vector<region_t>::iterator finish = midiregions.end();
- std::vector<region_t>::iterator mregion;
- wav_t w = { std::string(""), 0, 0, 0 };
- std::vector<midi_ev_t> m;
- region_t r = { std::string(""), ridx, 0, 0, 0, w, m};
- if ((mregion = std::find(begin, finish, r)) != finish) {
- mtr.reg = *mregion;
- mtr.reg.startpos = region_pos - mtr.reg.startpos;
- miditracks.push_back(mtr);
- }
- }
- }
-}
-
-void
-PTFFormat::parsemidi12(void) {
- uint32_t i, k;
- uint64_t tr, 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;
-
- std::vector<mchunk> midichunks;
- midi_ev_t m;
-
- k = 0;
-
- // Parse all midi chunks, not 1:1 mapping to regions yet
- while (k + 35 < len) {
- max_pos = 0;
- std::vector<midi_ev_t> midi;
-
- // Find MdNLB
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"MdNLB", 5)) {
- break;
- }
-
- k += 11;
- n_midi_events = u_endian_read4(&ptfunxored[k], is_bigendian);
-
- k += 4;
- zero_ticks = u_endian_read5(&ptfunxored[k], is_bigendian);
- for (i = 0; i < n_midi_events && k < len; i++, k += 35) {
- midi_pos = u_endian_read5(&ptfunxored[k], is_bigendian);
- midi_pos -= zero_ticks;
- midi_note = ptfunxored[k+8];
- midi_len = u_endian_read5(&ptfunxored[k+9], is_bigendian);
- midi_velocity = ptfunxored[k+17];
-
- if (midi_pos + midi_len > max_pos) {
- max_pos = midi_pos + midi_len;
- }
-
- m.pos = midi_pos;
- m.length = midi_len;
- m.note = midi_note;
- m.velocity = midi_velocity;
-#if 1
-// stop gap measure to prevent crashes in ardour,
-// remove when decryption is fully solved for .ptx
- if ((m.velocity & 0x80) || (m.note & 0x80) ||
- (m.pos & 0xff00000000LL) || (m.length & 0xff00000000LL)) {
- continue;
- }
-#endif
- midi.push_back(m);
- }
- midichunks.push_back(mchunk (zero_ticks, max_pos, midi));
- }
-
- // Map midi chunks to regions
- while (k < len) {
- 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\x01", 2)) {
- break;
- }
- k += 18;
-
- namelen = ptfunxored[k];
- for (i = 0; i < namelen; i++) {
- midiregionname[i] = ptfunxored[k+4+i];
- }
- midiregionname[namelen] = '\0';
- k += 4 + namelen;
-
- 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\x00\x00", 4)) {
- break;
- }
-
- k += 37;
-
- ridx = u_endian_read2(&ptfunxored[k], is_bigendian);
-
- k += 3;
- 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);
- }
- }
-
- // Put midi regions on midi tracks
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x03", 2)) {
- return;
- }
-
- nmiditracks = u_endian_read2(&ptfunxored[k-4], is_bigendian);
-
- for (tr = 0; tr < nmiditracks; tr++) {
- char miditrackname[256];
- uint8_t namelen;
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x03", 2)) {
- return;
- }
-
- namelen = ptfunxored[k+9];
- for (i = 0; i < namelen; i++) {
- miditrackname[i] = ptfunxored[k+13+i];
- }
- miditrackname[namelen] = '\0';
- k += 13 + namelen;
- nregions = u_endian_read2(&ptfunxored[k], is_bigendian);
-
- k += 13;
-
- for (i = 0; (i < nregions) && (k < len); i++) {
- while (k < len) {
- if ( (ptfunxored[k] == 0x5a) &&
- (ptfunxored[k+1] & 0x08)) {
- break;
- }
- k++;
- }
- k += 11;
-
- ridx = u_endian_read2(&ptfunxored[k], is_bigendian);
-
- k += 5;
-
- region_pos = u_endian_read5(&ptfunxored[k], is_bigendian);
-
- track_t mtr;
- mtr.name = string(miditrackname);
- mtr.index = tr;
- mtr.playlist = 0;
- // Find the midi region with index 'ridx'
- std::vector<region_t>::iterator begin = midiregions.begin();
- std::vector<region_t>::iterator finish = midiregions.end();
- std::vector<region_t>::iterator mregion;
- wav_t w = { std::string(""), 0, 0, 0 };
- std::vector<midi_ev_t> m;
- region_t r = { std::string(""), ridx, 0, 0, 0, w, m};
- if ((mregion = std::find(begin, finish, r)) != finish) {
- mtr.reg = *mregion;
- mtr.reg.startpos = region_pos - mtr.reg.startpos;
- miditracks.push_back(mtr);
- }
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\xff\xff\xff\xff\xff\xff\xff\xff", 8)) {
- return;
- }
- }
- }
-}
-
-void
-PTFFormat::parseaudio(void) {
- uint32_t i,j,k,l;
- std::string wave;
-
- k = 0;
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"Audio Files", 11))
- return;
-
- // Find end of wav file list
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\xff\xff\xff\xff", 4))
- return;
-
- // Find number of wave files
- uint16_t numberofwavs;
- j = k;
- if (!jumpback(&j, ptfunxored, len, (const unsigned char *)"\x5a\x01", 2))
- return;
-
- numberofwavs = u_endian_read4(&ptfunxored[j-4], is_bigendian);
- //printf("%d wavs\n", numberofwavs);
-
- // Find actual wav names
- char wavname[256];
- j = k - 2;
- for (i = 0; i < numberofwavs; i++) {
- while (j > 0) {
- if ( ((ptfunxored[j ] == 'W') || (ptfunxored[j ] == 'A') || ptfunxored[j ] == '\0') &&
- ((ptfunxored[j-1] == 'A') || (ptfunxored[j-1] == 'I') || ptfunxored[j-1] == '\0') &&
- ((ptfunxored[j-2] == 'V') || (ptfunxored[j-2] == 'F') || ptfunxored[j-2] == '\0')) {
- break;
- }
- j--;
- }
- j -= 4;
- l = 0;
- while (ptfunxored[j] != '\0') {
- wavname[l] = ptfunxored[j];
- l++;
- j--;
- }
- wavname[l] = '\0';
-
- // Must be at least "vaw.z\0"
- if (l < 6) {
- i--;
- continue;
- }
-
- // and skip "zWAVE" or "zAIFF"
- if ( ( (wavname[1] == 'W') &&
- (wavname[2] == 'A') &&
- (wavname[3] == 'V') &&
- (wavname[4] == 'E')) ||
- ( (wavname[1] == 'A') &&
- (wavname[2] == 'I') &&
- (wavname[3] == 'F') &&
- (wavname[4] == 'F'))) {
- wave = string(&wavname[5]);
- } else {
- wave = string(wavname);
- }
- //uint8_t playlist = ptfunxored[j-8];
-
- std::reverse(wave.begin(), wave.end());
- wav_t f = { wave, (uint16_t)(numberofwavs - i - 1), 0, 0 };
-
- if (foundin(wave, string("Audio Files")) ||
- foundin(wave, string("Fade Files"))) {
- i--;
- continue;
- }
-
- actualwavs.push_back(f);
- audiofiles.push_back(f);
-
- //printf(" %d:%s \n", numberofwavs - i - 1, wave.c_str());
- }
- std::reverse(audiofiles.begin(), audiofiles.end());
- std::reverse(actualwavs.begin(), actualwavs.end());
- //resort(audiofiles);
- //resort(actualwavs);
-
- // Jump to end of wav file list
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\xff\xff\xff\xff", 4))
- return;
-
- // Loop through all the sources
- for (vector<wav_t>::iterator w = audiofiles.begin(); w != audiofiles.end(); ++w) {
- // Jump to start of source metadata for this source
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x07", 2))
- return;
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x02", 2))
- return;
- k++;
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x02", 2))
- return;
-
- w->length = u_endian_read4(&ptfunxored[k-25], false);
- }
-}
-
-void
-PTFFormat::parserest89(void) {
- uint32_t i,j,k;
- uint8_t startbytes = 0;
- uint8_t lengthbytes = 0;
- uint8_t offsetbytes = 0;
- uint8_t somethingbytes = 0;
- uint8_t skipbytes = 0;
-
- // Find Regions
- k = 0;
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"Snap", 4)) {
- return;
- }
-
- uint16_t rindex = 0;
- uint32_t findex = 0;
- for (i = k; i < len-70; i++) {
- if ( (ptfunxored[i ] == 0x5a) &&
- (ptfunxored[i+1] == 0x0a)) {
- break;
- }
- if ( (ptfunxored[i ] == 0x5a) &&
- (ptfunxored[i+1] == 0x0c)) {
-
- uint8_t lengthofname = ptfunxored[i+9];
-
- char name[256] = {0};
- for (j = 0; j < lengthofname; j++) {
- name[j] = ptfunxored[i+13+j];
- }
- name[j] = '\0';
- j += i+13;
- //uint8_t disabled = ptfunxored[j];
-
- offsetbytes = (ptfunxored[j+1] & 0xf0) >> 4;
- lengthbytes = (ptfunxored[j+2] & 0xf0) >> 4;
- startbytes = (ptfunxored[j+3] & 0xf0) >> 4;
- somethingbytes = (ptfunxored[j+3] & 0xf);
- skipbytes = ptfunxored[j+4];
- findex = ptfunxored[j+5
- +startbytes
- +lengthbytes
- +offsetbytes
- +somethingbytes
- +skipbytes
- +40];
- /*rindex = ptfunxored[j+5
- +startbytes
- +lengthbytes
- +offsetbytes
- +somethingbytes
- +skipbytes
- +24];
- */
- uint32_t sampleoffset = 0;
- switch (offsetbytes) {
- case 4:
- sampleoffset = u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- sampleoffset = u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- sampleoffset = (uint32_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- sampleoffset = (uint32_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=offsetbytes;
- uint32_t length = 0;
- switch (lengthbytes) {
- case 4:
- length = u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- length = u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- length = (uint32_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- length = (uint32_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=lengthbytes;
- uint32_t start = 0;
- switch (startbytes) {
- case 4:
- start = u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- start = u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- start = (uint32_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- start = (uint32_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=startbytes;
- /*
- uint32_t something = 0;
- switch (somethingbytes) {
- case 4:
- something |= (uint32_t)(ptfunxored[j+8] << 24);
- case 3:
- something |= (uint32_t)(ptfunxored[j+7] << 16);
- case 2:
- something |= (uint32_t)(ptfunxored[j+6] << 8);
- case 1:
- something |= (uint32_t)(ptfunxored[j+5]);
- default:
- break;
- }
- j+=somethingbytes;
- */
- std::string filename = string(name);
- wav_t f = {
- filename,
- (uint16_t)findex,
- (int64_t)(start*ratefactor),
- (int64_t)(length*ratefactor),
- };
-
- //printf("something=%d\n", something);
-
- vector<wav_t>::iterator begin = actualwavs.begin();
- vector<wav_t>::iterator finish = actualwavs.end();
- vector<wav_t>::iterator found;
- // Add file to list only if it is an actual wav
- if ((found = std::find(begin, finish, f)) != finish) {
- f.filename = (*found).filename;
- // Also add plain wav as region
- std::vector<midi_ev_t> m;
- region_t r = {
- name,
- rindex,
- (int64_t)(start*ratefactor),
- (int64_t)(sampleoffset*ratefactor),
- (int64_t)(length*ratefactor),
- f,
- m
- };
- regions.push_back(r);
- // Region only
- } else {
- if (foundin(filename, string(".grp"))) {
- continue;
- }
- std::vector<midi_ev_t> m;
- region_t r = {
- name,
- rindex,
- (int64_t)(start*ratefactor),
- (int64_t)(sampleoffset*ratefactor),
- (int64_t)(length*ratefactor),
- f,
- m
- };
- regions.push_back(r);
- }
- rindex++;
- }
- }
-
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x03", 2)) {
- return;
- }
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x02", 2)) {
- return;
- }
- k++;
-
- // Tracks
- uint32_t offset;
- uint32_t tracknumber = 0;
- uint32_t regionspertrack = 0;
- for (;k < len; k++) {
- if ( (ptfunxored[k ] == 0x5a) &&
- (ptfunxored[k+1] == 0x04)) {
- break;
- }
- if ( (ptfunxored[k ] == 0x5a) &&
- (ptfunxored[k+1] == 0x02)) {
-
- uint8_t lengthofname = 0;
- lengthofname = ptfunxored[k+9];
- if (lengthofname == 0x5a) {
- continue;
- }
- track_t tr;
-
- regionspertrack = (uint8_t)(ptfunxored[k+13+lengthofname]);
-
- //printf("regions/track=%d\n", regionspertrack);
- char name[256] = {0};
- for (j = 0; j < lengthofname; j++) {
- name[j] = ptfunxored[j+k+13];
- }
- name[j] = '\0';
- tr.name = string(name);
- tr.index = tracknumber++;
-
- for (j = k; regionspertrack > 0 && j < len; j++) {
- jumpto(&j, ptfunxored, len, (const unsigned char *)"\x5a\x07", 2);
- tr.reg.index = (uint16_t)(ptfunxored[j+11] & 0xff)
- | (uint16_t)((ptfunxored[j+12] << 8) & 0xff00);
- vector<region_t>::iterator begin = regions.begin();
- vector<region_t>::iterator finish = regions.end();
- vector<region_t>::iterator found;
- if ((found = std::find(begin, finish, tr.reg)) != finish) {
- tr.reg = (*found);
- }
- i = j+16;
- offset = u_endian_read4(&ptfunxored[i], is_bigendian);
- tr.reg.startpos = (int64_t)(offset*ratefactor);
- if (tr.reg.length > 0) {
- tracks.push_back(tr);
- }
- regionspertrack--;
- }
- }
- }
-}
-
-void
-PTFFormat::parserest12(void) {
- uint32_t i,j,k,l,m,n;
- uint8_t startbytes = 0;
- uint8_t lengthbytes = 0;
- uint8_t offsetbytes = 0;
- uint8_t somethingbytes = 0;
- uint8_t skipbytes = 0;
- uint32_t maxregions = 0;
- uint32_t findex = 0;
- uint32_t findex2 = 0;
- uint32_t findex3 = 0;
- uint16_t rindex = 0;
- vector<region_t> groups;
- uint16_t groupcount, compoundcount, groupmax;
- uint16_t gindex, gindex2;
-
- m = 0;
- n = 0;
- vector<compound_t> groupmap;
- // Find region group total
- k = 0;
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"Custom 1\0\0\x5a", 11))
- goto nocustom;
-
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\xff\xff\xff\xff", 4))
- return;
-
- if (!jumpback(&k, ptfunxored, len, (const unsigned char *)"\x5a", 1))
- return;
-
- jumpto(&k, ptfunxored, k+0x2000, (const unsigned char *)"\x5a\x03", 2);
- k++;
-
- groupcount = 0;
- for (i = k; i < len; i++) {
- if (!jumpto(&i, ptfunxored, len, (const unsigned char *)"\x5a\x03", 2))
- break;
- groupcount++;
- }
- verbose_printf("groupcount=%d\n", groupcount);
-
- // Find start of group names -> group indexes
- k = 0;
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"Custom 1\0\0\x5a", 11))
- return;
-
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\xff\xff\xff\xff", 4))
- return;
-
- if (!jumpback(&k, ptfunxored, len, (const unsigned char *)"\x5a", 1))
- return;
- k++;
-
- // Skip total number of groups
- for (i = 0; i < groupcount; i++) {
- while (k < len) {
- if ( (ptfunxored[k ] == 0x5a) &&
- ((ptfunxored[k+1] == 0x03) || (ptfunxored[k+1] == 0x0a))) {
- break;
- }
- k++;
- }
- k++;
- }
-
- while (k < len) {
- if ( (ptfunxored[k ] == 0x5a) &&
- (ptfunxored[k+1] & 0x02)) {
- break;
- }
- k++;
- }
- k++;
-
- while (k < len) {
- if ( (ptfunxored[k ] == 0x5a) &&
- (ptfunxored[k+1] & 0x02)) {
- break;
- }
- k++;
- }
- k++;
-
- verbose_printf("start of groups k=0x%x\n", k);
- // Loop over all groups and associate the compound index/name
- for (i = 0; i < groupcount; i++) {
- while (k < len) {
- if ( (ptfunxored[k ] == 0x5a) &&
- (ptfunxored[k+1] & 0x02)) {
- break;
- }
- k++;
- }
- if (k > len)
- break;
- gindex = u_endian_read2(&ptfunxored[k+9], is_bigendian);
- gindex2 = u_endian_read2(&ptfunxored[k+3], is_bigendian);
-
- uint8_t lengthofname = ptfunxored[k+13];
- char name[256] = {0};
- for (l = 0; l < lengthofname; l++) {
- name[l] = ptfunxored[k+17+l];
- }
- name[l] = '\0';
-
- if (strlen(name) == 0) {
- i--;
- k++;
- continue;
- }
- compound_t c = {
- (uint16_t)i, // curr_index
- gindex, // unknown1
- 0, // level
- 0, // ontopof_index
- gindex2, // next_index
- string(name)
- };
- groupmap.push_back(c);
- k++;
- }
-
- // Sort lookup table by group index
- //std::sort(glookup.begin(), glookup.end(), regidx_compare);
-
- // print compounds as flattened tree
- j = 0;
- for (std::vector<compound_t>::iterator i = groupmap.begin(); i != groupmap.end(); ++i) {
- verbose_printf("g(%u) uk(%u) ni(%u) %s\n", i->curr_index, i->unknown1, i->next_index, i->name.c_str());
- j++;
- }
-
-nocustom:
- // Find region groups
- k = 0;
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"Snap", 4))
- return;
-
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\x5a\x06", 2))
- return;
- k++;
-
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16))
- return;
- k++;
-
- if (!jumpto(&k, ptfunxored, len, (const unsigned char *)"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16))
- return;
- k++;
-
- // Hack to find actual start of region group information
- while (k < len) {
- if ((ptfunxored[k+13] == 0x5a) && (ptfunxored[k+14] & 0xf)) {
- k += 13;
- continue;
- } else {
- if ((ptfunxored[k+9] == 0x5a) && (ptfunxored[k+10] & 0xf)) {
- k += 9;
- continue;
- }
- }
- if ((ptfunxored[k] == 0x5a) && (ptfunxored[k+1] & 0xf))
- break;
- k++;
- }
- verbose_printf("hack region groups k=0x%x\n", k);
-
- compoundcount = 0;
- j = k;
- groupmax = groupcount == 0 ? 0 : u_endian_read2(&ptfunxored[j+3], is_bigendian);
- groupcount = 0;
- for (i = k; (groupcount < groupmax) && (i < len-70); i++) {
- if ( (ptfunxored[i ] == 0x5a) &&
- (ptfunxored[i+1] == 0x03)) {
- break;
- }
- if ( (ptfunxored[i ] == 0x5a) &&
- ((ptfunxored[i+1] == 0x01) || (ptfunxored[i+1] == 0x02))) {
-
- //findex = ptfunxored[i-48] | ptfunxored[i-47] << 8;
- //rindex = ptfunxored[i+3] | ptfunxored[i+4] << 8;
-
- uint8_t lengthofname = ptfunxored[i+9];
- if (ptfunxored[i+13] == 0x5a) {
- continue;
- }
- char name[256] = {0};
- for (j = 0; j < lengthofname; j++) {
- name[j] = ptfunxored[i+13+j];
- }
- name[j] = '\0';
- j += i+13;
-
- offsetbytes = (ptfunxored[j+1] & 0xf0) >> 4;
- lengthbytes = (ptfunxored[j+2] & 0xf0) >> 4;
- startbytes = (ptfunxored[j+3] & 0xf0) >> 4;
- somethingbytes = (ptfunxored[j+3] & 0xf);
- skipbytes = ptfunxored[j+4];
- uint16_t regionsingroup = ptfunxored[j+5
- +startbytes
- +lengthbytes
- +offsetbytes
- +somethingbytes
- +skipbytes
- +12]
- | ptfunxored[j+5
- +startbytes
- +lengthbytes
- +offsetbytes
- +somethingbytes
- +skipbytes
- +13] << 8;
-
- findex = ptfunxored[j+5
- +startbytes
- +lengthbytes
- +offsetbytes
- +somethingbytes
- +skipbytes
- +37]
- | ptfunxored[j+5
- +startbytes
- +lengthbytes
- +offsetbytes
- +somethingbytes
- +skipbytes
- +38] << 8;
-
- uint64_t sampleoffset = 0;
- switch (offsetbytes) {
- case 5:
- sampleoffset = u_endian_read5(&ptfunxored[j+5], false);
- break;
- case 4:
- sampleoffset = (uint64_t)u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- sampleoffset = (uint64_t)u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- sampleoffset = (uint64_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- sampleoffset = (uint64_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=offsetbytes;
- uint64_t length = 0;
- switch (lengthbytes) {
- case 5:
- length = u_endian_read5(&ptfunxored[j+5], false);
- break;
- case 4:
- length = (uint64_t)u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- length = (uint64_t)u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- length = (uint64_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- length = (uint64_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=lengthbytes;
- uint64_t start = 0;
- switch (startbytes) {
- case 5:
- start = u_endian_read5(&ptfunxored[j+5], false);
- break;
- case 4:
- start = (uint64_t)u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- start = (uint64_t)u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- start = (uint64_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- start = (uint64_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=startbytes;
-
- if (offsetbytes == 5)
- sampleoffset -= 1000000000000ULL;
- if (startbytes == 5)
- start -= 1000000000000ULL;
-
- std::string filename = string(name);
- wav_t f = {
- filename,
- (uint16_t)findex,
- (int64_t)(start*ratefactor),
- (int64_t)(length*ratefactor),
- };
-
- if (strlen(name) == 0) {
- continue;
- }
- if (length == 0) {
- continue;
- }
- //if (foundin(filename, string(".grp")) && !regionsingroup && !findex) {
- // // Empty region group
- // verbose_printf(" EMPTY: %s\n", name);
- // continue;
- if (regionsingroup) {
- // Active region grouping
- // Iterate parsing all the regions in the group
- verbose_printf("\nGROUP\t%d %s\n", groupcount, name);
- m = j;
- n = j+16;
-
- for (l = 0; l < regionsingroup; l++) {
- if (!jumpto(&n, ptfunxored, len, (const unsigned char *)"\x5a\x02", 2)) {
- return;
- }
- n++;
- }
- n--;
- //printf("n=0x%x\n", n+112);
- //findex = ptfunxored[n+112] | (ptfunxored[n+113] << 8);
- findex = u_endian_read2(&ptfunxored[i-11], is_bigendian);
- findex2 = u_endian_read2(&ptfunxored[n+108], is_bigendian);
- //findex2= rindex; //XXX
- // Find wav with correct findex
- vector<wav_t>::iterator wave = actualwavs.end();
- for (vector<wav_t>::iterator aw = actualwavs.begin();
- aw != actualwavs.end(); ++aw) {
- if (aw->index == findex) {
- wave = aw;
- }
- }
- if (wave == actualwavs.end())
- return;
-
- if (!jumpto(&n, ptfunxored, len, (const unsigned char *)"\x5a\x02", 2))
- return;
- n += 37;
- //rindex = ptfunxored[n] | (ptfunxored[n+1] << 8);
- for (l = 0; l < regionsingroup; l++) {
- if (!jumpto(&m, ptfunxored, len, (const unsigned char *)"\x5a\x02", 2))
- return;
-
- m += 37;
- rindex = u_endian_read2(&ptfunxored[m], is_bigendian);
-
- m += 12;
- sampleoffset = 0;
- switch (offsetbytes) {
- case 5:
- sampleoffset = u_endian_read5(&ptfunxored[m], false);
- break;
- case 4:
- sampleoffset = (uint64_t)u_endian_read4(&ptfunxored[m], false);
- break;
- case 3:
- sampleoffset = (uint64_t)u_endian_read3(&ptfunxored[m], false);
- break;
- case 2:
- sampleoffset = (uint64_t)u_endian_read2(&ptfunxored[m], false);
- break;
- case 1:
- sampleoffset = (uint64_t)(ptfunxored[m]);
- break;
- default:
- break;
- }
- m+=offsetbytes+3;
- start = 0;
- switch (offsetbytes) {
- case 5:
- start = u_endian_read5(&ptfunxored[m], false);
- break;
- case 4:
- start = (uint64_t)u_endian_read4(&ptfunxored[m], false);
- break;
- case 3:
- start = (uint64_t)u_endian_read3(&ptfunxored[m], false);
- break;
- case 2:
- start = (uint64_t)u_endian_read2(&ptfunxored[m], false);
- break;
- case 1:
- start = (uint64_t)(ptfunxored[m]);
- break;
- default:
- break;
- }
- m+=offsetbytes+3;
- length = 0;
- switch (lengthbytes) {
- case 5:
- length = u_endian_read5(&ptfunxored[m], false);
- break;
- case 4:
- length = (uint64_t)u_endian_read4(&ptfunxored[m], false);
- break;
- case 3:
- length = (uint64_t)u_endian_read3(&ptfunxored[m], false);
- break;
- case 2:
- length = (uint64_t)u_endian_read2(&ptfunxored[m], false);
- break;
- case 1:
- length = (uint64_t)(ptfunxored[m]);
- break;
- default:
- break;
- }
- m+=8;
- findex3 = ptfunxored[m] | (ptfunxored[m+1] << 8);
- sampleoffset -= 1000000000000ULL;
- start -= 1000000000000ULL;
-
- /*
- // Find wav with correct findex
- vector<wav_t>::iterator wave = actualwavs.end();
- for (vector<wav_t>::iterator aw = actualwavs.begin();
- aw != actualwavs.end(); ++aw) {
- if (aw->index == (glookup.begin()+findex2)->startpos) {
- wave = aw;
- }
- }
- if (wave == actualwavs.end())
- return;
- // findex is the true source
- std::vector<midi_ev_t> md;
- region_t r = {
- name,
- (uint16_t)rindex,
- (int64_t)findex, //(start*ratefactor),
- (int64_t)findex2, //(sampleoffset*ratefactor),
- (int64_t)findex3, //(length*ratefactor),
- *wave,
- md
- };
- groups.push_back(r);
- */
- vector<compound_t>::iterator g = groupmap.begin()+findex2;
- if (g >= groupmap.end())
- continue;
- compound_t c;
- c.name = string(g->name);
- c.curr_index = compoundcount;
- c.level = findex;
- c.ontopof_index = findex3;
- c.next_index = g->next_index;
- c.unknown1 = g->unknown1;
- compounds.push_back(c);
- verbose_printf("COMPOUND\tc(%d) %s (%d %d) -> c(%u) %s\n", c.curr_index, c.name.c_str(), c.level, c.ontopof_index, c.next_index, name);
- compoundcount++;
- }
- groupcount++;
- }
- }
- }
- j = 0;
-
- // Start pure regions
- k = m != 0 ? m : k - 1;
- if (!jumpto(&k, ptfunxored, k+64, (const unsigned char *)"\x5a\x05", 2))
- jumpto(&k, ptfunxored, k+0x400, (const unsigned char *)"\x5a\x02", 2);
-
- verbose_printf("pure regions k=0x%x\n", k);
-
- maxregions = u_endian_read4(&ptfunxored[k-4], is_bigendian);
-
- verbose_printf("maxregions=%u\n", maxregions);
- rindex = 0;
- for (i = k; rindex < maxregions && i < len; i++) {
- if ( (ptfunxored[i ] == 0xff) &&
- (ptfunxored[i+1] == 0x5a) &&
- (ptfunxored[i+2] == 0x01)) {
- break;
- }
- //if ( (ptfunxored[i ] == 0x5a) &&
- // (ptfunxored[i+1] == 0x03)) {
- // break;
- //}
- if ( (ptfunxored[i ] == 0x5a) &&
- ((ptfunxored[i+1] == 0x01) || (ptfunxored[i+1] == 0x02))) {
-
- //findex = ptfunxored[i-48] | ptfunxored[i-47] << 8;
- //rindex = ptfunxored[i+3] | ptfunxored[i+4] << 8;
-
- uint8_t lengthofname = ptfunxored[i+9];
- if (ptfunxored[i+13] == 0x5a) {
- continue;
- }
- char name[256] = {0};
- for (j = 0; j < lengthofname; j++) {
- name[j] = ptfunxored[i+13+j];
- }
- name[j] = '\0';
- j += i+13;
-
- offsetbytes = (ptfunxored[j+1] & 0xf0) >> 4;
- lengthbytes = (ptfunxored[j+2] & 0xf0) >> 4;
- startbytes = (ptfunxored[j+3] & 0xf0) >> 4;
- somethingbytes = (ptfunxored[j+3] & 0xf);
- skipbytes = ptfunxored[j+4];
- findex = ptfunxored[j+5
- +startbytes
- +lengthbytes
- +offsetbytes
- +somethingbytes
- +skipbytes
- +37]
- | ptfunxored[j+5
- +startbytes
- +lengthbytes
- +offsetbytes
- +somethingbytes
- +skipbytes
- +38] << 8;
-
- uint64_t sampleoffset = 0;
- switch (offsetbytes) {
- case 5:
- sampleoffset = u_endian_read5(&ptfunxored[j+5], false);
- break;
- case 4:
- sampleoffset = (uint64_t)u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- sampleoffset = (uint64_t)u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- sampleoffset = (uint64_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- sampleoffset = (uint64_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=offsetbytes;
- uint64_t length = 0;
- switch (lengthbytes) {
- case 5:
- length = u_endian_read5(&ptfunxored[j+5], false);
- break;
- case 4:
- length = (uint64_t)u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- length = (uint64_t)u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- length = (uint64_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- length = (uint64_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=lengthbytes;
- uint64_t start = 0;
- switch (startbytes) {
- case 5:
- start = u_endian_read5(&ptfunxored[j+5], false);
- break;
- case 4:
- start = (uint64_t)u_endian_read4(&ptfunxored[j+5], false);
- break;
- case 3:
- start = (uint64_t)u_endian_read3(&ptfunxored[j+5], false);
- break;
- case 2:
- start = (uint64_t)u_endian_read2(&ptfunxored[j+5], false);
- break;
- case 1:
- start = (uint64_t)(ptfunxored[j+5]);
- break;
- default:
- break;
- }
- j+=startbytes;
-
- if (offsetbytes == 5)
- sampleoffset -= 1000000000000ULL;
- if (startbytes == 5)
- start -= 1000000000000ULL;
-
- std::string filename = string(name);
- wav_t f = {
- filename,
- (uint16_t)findex,
- (int64_t)(start*ratefactor),
- (int64_t)(length*ratefactor),
- };
-
- if (strlen(name) == 0) {
- continue;
- }
- if (length == 0) {
- continue;
- }
- // Regular region mapping to a source
- uint32_t n = j;
- if (!jumpto(&n, ptfunxored, len, (const unsigned char *)"\x5a\x01", 2))
- return;
- //printf("XXX=%d\n", ptfunxored[n+12] | ptfunxored[n+13]<<8);
-
- // Find wav with correct findex
- vector<wav_t>::iterator wave = actualwavs.end();
- for (vector<wav_t>::iterator aw = actualwavs.begin();
- aw != actualwavs.end(); ++aw) {
- if (aw->index == findex) {
- wave = aw;
- }
- }
- if (wave == actualwavs.end()) {
- verbose_printf("missing source with findex\n");
- continue;
- }
- //verbose_printf("\n+r(%d) w(%d) REGION: %s st(%lx)x%u of(%lx)x%u ln(%lx)x%u\n", rindex, findex, name, start, startbytes, sampleoffset, offsetbytes, length, lengthbytes);
- verbose_printf("REGION\tg(NA)\tr(%d)\tw(%d) %s(%s)\n", rindex, findex, name, wave->filename.c_str());
- std::vector<midi_ev_t> md;
- region_t r = {
- name,
- rindex,
- (int64_t)(start*ratefactor),
- (int64_t)(sampleoffset*ratefactor),
- (int64_t)(length*ratefactor),
- *wave,
- md
- };
- regions.push_back(r);
- rindex++;
- }
- }
-
- // print compounds
- vector<uint16_t> rootnodes;
- bool found = false;
-
- j = 0;
- for (vector<compound_t>::iterator cmp = compounds.begin();
- cmp != compounds.end(); ++cmp) {
- found = false;
- for (vector<compound_t>::iterator tmp = compounds.begin();
- tmp != compounds.end(); ++tmp) {
- if (tmp == cmp)
- continue;
- if (tmp->ontopof_index == cmp->curr_index)
- found = true;
- }
- // Collect a vector of all the root nodes (no others point to)
- if (!found)
- rootnodes.push_back(cmp->curr_index);
- }
-
- for (vector<uint16_t>::iterator rt = rootnodes.begin();
- rt != rootnodes.end(); ++rt) {
- vector<compound_t>::iterator cmp = compounds.begin()+(*rt);
- // Now we are at a root node, follow to leaf
- if (cmp >= compounds.end())
- continue;
-
- verbose_printf("----\n");
-
- for (; cmp < compounds.end() && cmp->curr_index != cmp->next_index;
- cmp = compounds.begin()+cmp->next_index) {
-
- // Find region
- vector<region_t>::iterator r = regions.end();
- for (vector<region_t>::iterator rs = regions.begin();
- rs != regions.end(); rs++) {
- if (rs->index == cmp->unknown1 + cmp->level) {
- r = rs;
- }
- }
- if (r == regions.end())
- continue;
- verbose_printf("\t->cidx(%u) pl(%u)+ridx(%u) cflags(0x%x) ?(%u) grp(%s) reg(%s)\n", cmp->curr_index, cmp->level, cmp->unknown1, cmp->ontopof_index, cmp->next_index, cmp->name.c_str(), r->name.c_str());
- }
- // Find region
- vector<region_t>::iterator r = regions.end();
- for (vector<region_t>::iterator rs = regions.begin();
- rs != regions.end(); rs++) {
- if (rs->index == cmp->unknown1 + cmp->level) {
- r = rs;
- }
- }
- if (r == regions.end())
- continue;
- verbose_printf("\tLEAF->cidx(%u) pl(%u)+ridx(%u) cflags(0x%x) ?(%u) grp(%s) reg(%s)\n", cmp->curr_index, cmp->level, cmp->unknown1, cmp->ontopof_index, cmp->next_index, cmp->name.c_str(), r->name.c_str());
- }
-
- // Start grouped regions
-
- // Print region groups mapped to sources
- for (vector<region_t>::iterator a = groups.begin(); a != groups.end(); ++a) {
- // Find wav with findex
- vector<wav_t>::iterator wav = audiofiles.end();
- for (vector<wav_t>::iterator ws = audiofiles.begin();
- ws != audiofiles.end(); ws++) {
- if (ws->index == a->startpos) {
- wav = ws;
- }
- }
- if (wav == audiofiles.end())
- continue;
-
- // Find wav with findex2
- vector<wav_t>::iterator wav2 = audiofiles.end();
- for (vector<wav_t>::iterator ws = audiofiles.begin();
- ws != audiofiles.end(); ws++) {
- if (ws->index == a->sampleoffset) {
- wav2 = ws;
- }
- }
- if (wav2 == audiofiles.end())
- continue;
-
- verbose_printf("Group: %s -> %s OR %s\n", a->name.c_str(), wav->filename.c_str(), wav2->filename.c_str());
- }
-
- //filter(regions);
- //resort(regions);
-
- // Tracks
- uint32_t offset;
- uint32_t tracknumber = 0;
- uint32_t regionspertrack = 0;
-
- // Total tracks
- j = k;
- if (!jumpto(&j, ptfunxored, len, (const unsigned char *)"\x5a\x03\x00", 3))
- return;
- //maxtracks = u_endian_read4(&ptfunxored[j-4]);
-
- // Jump to start of region -> track mappings
- if (jumpto(&k, ptfunxored, k + regions.size() * 0x400, (const unsigned char *)"\x5a\x08", 2)) {
- if (!jumpback(&k, ptfunxored, len, (const unsigned char *)"\x5a\x02", 2))
- return;
- } else if (jumpto(&k, ptfunxored, k + regions.size() * 0x400, (const unsigned char *)"\x5a\x0a", 2)) {
- if (!jumpback(&k, ptfunxored, len, (const unsigned char *)"\x5a\x01", 2))
- return;
- } else {
- return;
- }
- verbose_printf("tracks k=0x%x\n", k);
-
- for (;k < len; k++) {
- if ( (ptfunxored[k ] == 0x5a) &&
- (ptfunxored[k+1] & 0x04)) {
- break;
- }
- if ( (ptfunxored[k ] == 0x5a) &&
- (ptfunxored[k+1] & 0x02)) {
-
- uint8_t lengthofname = 0;
- lengthofname = ptfunxored[k+9];
- if (lengthofname == 0x5a) {
- continue;
- }
- track_t tr;
-
- regionspertrack = (uint8_t)(ptfunxored[k+13+lengthofname]);
-
- //printf("regions/track=%d\n", regionspertrack);
- char name[256] = {0};
- for (j = 0; j < lengthofname; j++) {
- name[j] = ptfunxored[j+k+13];
- }
- name[j] = '\0';
- tr.name = string(name);
- tr.index = tracknumber++;
-
- for (j = k+18+lengthofname; regionspertrack > 0 && j < len; j++) {
- jumpto(&j, ptfunxored, len, (const unsigned char *)"\x5a", 1);
- bool isgroup = ptfunxored[j+27] > 0;
- if (isgroup) {
- tr.reg.name = string("");
- tr.reg.length = 0;
- //tr.reg.index = 0xffff;
- verbose_printf("TRACK: t(%d) g(%d) G(%s) -> T(%s)\n",
- tracknumber, tr.reg.index, tr.reg.name.c_str(), tr.name.c_str());
- } else {
- tr.reg.index = ((uint16_t)(ptfunxored[j+11]) & 0xff)
- | (((uint16_t)(ptfunxored[j+12]) << 8) & 0xff00);
- vector<region_t>::iterator begin = regions.begin();
- vector<region_t>::iterator finish = regions.end();
- vector<region_t>::iterator found;
- if ((found = std::find(begin, finish, tr.reg)) != finish) {
- tr.reg = *found;
- }
- verbose_printf("TRACK: t(%d) r(%d) R(%s) -> T(%s)\n",
- tracknumber, tr.reg.index, tr.reg.name.c_str(), tr.name.c_str());
- }
- i = j+16;
- offset = u_endian_read4(&ptfunxored[i], is_bigendian);
- tr.reg.startpos = (int64_t)(offset*ratefactor);
- if (tr.reg.length > 0) {
- tracks.push_back(tr);
- }
- regionspertrack--;
-
- jumpto(&j, ptfunxored, len, (const unsigned char *)"\xff\xff\xff\xff\xff\xff\xff\xff", 8);
- j += 12;
- }
- }
- }
-}
-
-#endif