@modplayjs/fmt-prowizard 0.0.0-stage → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +42 -2
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +7 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/prowiz.d.ts +44 -0
  7. package/dist/prowiz.d.ts.map +1 -0
  8. package/dist/prowiz.js +157 -0
  9. package/dist/prowiz.js.map +1 -0
  10. package/dist/ptktable.d.ts +5 -0
  11. package/dist/ptktable.d.ts.map +1 -0
  12. package/dist/ptktable.js +49 -0
  13. package/dist/ptktable.js.map +1 -0
  14. package/dist/pw-ac1d.d.ts +4 -0
  15. package/dist/pw-ac1d.d.ts.map +1 -0
  16. package/dist/pw-ac1d.js +133 -0
  17. package/dist/pw-ac1d.js.map +1 -0
  18. package/dist/pw-di.d.ts +4 -0
  19. package/dist/pw-di.d.ts.map +1 -0
  20. package/dist/pw-di.js +177 -0
  21. package/dist/pw-di.js.map +1 -0
  22. package/dist/pw-eureka.d.ts +4 -0
  23. package/dist/pw-eureka.d.ts.map +1 -0
  24. package/dist/pw-eureka.js +171 -0
  25. package/dist/pw-eureka.js.map +1 -0
  26. package/dist/pw-fcm.d.ts +4 -0
  27. package/dist/pw-fcm.d.ts.map +1 -0
  28. package/dist/pw-fcm.js +102 -0
  29. package/dist/pw-fcm.js.map +1 -0
  30. package/dist/pw-fuchs.d.ts +4 -0
  31. package/dist/pw-fuchs.d.ts.map +1 -0
  32. package/dist/pw-fuchs.js +139 -0
  33. package/dist/pw-fuchs.js.map +1 -0
  34. package/dist/pw-heatseek.d.ts +4 -0
  35. package/dist/pw-heatseek.d.ts.map +1 -0
  36. package/dist/pw-heatseek.js +197 -0
  37. package/dist/pw-heatseek.js.map +1 -0
  38. package/dist/pw-hrt.d.ts +4 -0
  39. package/dist/pw-hrt.d.ts.map +1 -0
  40. package/dist/pw-hrt.js +104 -0
  41. package/dist/pw-hrt.js.map +1 -0
  42. package/dist/pw-ksm.d.ts +4 -0
  43. package/dist/pw-ksm.d.ts.map +1 -0
  44. package/dist/pw-ksm.js +212 -0
  45. package/dist/pw-ksm.js.map +1 -0
  46. package/dist/pw-mp.d.ts +6 -0
  47. package/dist/pw-mp.d.ts.map +1 -0
  48. package/dist/pw-mp.js +171 -0
  49. package/dist/pw-mp.js.map +1 -0
  50. package/dist/pw-np12.d.ts +6 -0
  51. package/dist/pw-np12.d.ts.map +1 -0
  52. package/dist/pw-np12.js +234 -0
  53. package/dist/pw-np12.js.map +1 -0
  54. package/dist/pw-np3.d.ts +4 -0
  55. package/dist/pw-np3.d.ts.map +1 -0
  56. package/dist/pw-np3.js +218 -0
  57. package/dist/pw-np3.js.map +1 -0
  58. package/dist/pw-p40.d.ts +4 -0
  59. package/dist/pw-p40.d.ts.map +1 -0
  60. package/dist/pw-p40.js +221 -0
  61. package/dist/pw-p40.js.map +1 -0
  62. package/dist/pw-plugin.d.ts +8 -0
  63. package/dist/pw-plugin.d.ts.map +1 -0
  64. package/dist/pw-plugin.js +27 -0
  65. package/dist/pw-plugin.js.map +1 -0
  66. package/dist/pw-pp.d.ts +8 -0
  67. package/dist/pw-pp.d.ts.map +1 -0
  68. package/dist/pw-pp.js +341 -0
  69. package/dist/pw-pp.js.map +1 -0
  70. package/dist/pw-skyt.d.ts +4 -0
  71. package/dist/pw-skyt.d.ts.map +1 -0
  72. package/dist/pw-skyt.js +116 -0
  73. package/dist/pw-skyt.js.map +1 -0
  74. package/dist/pw-starpack.d.ts +4 -0
  75. package/dist/pw-starpack.d.ts.map +1 -0
  76. package/dist/pw-starpack.js +253 -0
  77. package/dist/pw-starpack.js.map +1 -0
  78. package/dist/pw-theplayer.d.ts +6 -0
  79. package/dist/pw-theplayer.d.ts.map +1 -0
  80. package/dist/pw-theplayer.js +367 -0
  81. package/dist/pw-theplayer.js.map +1 -0
  82. package/dist/pw-tp1.d.ts +4 -0
  83. package/dist/pw-tp1.d.ts.map +1 -0
  84. package/dist/pw-tp1.js +162 -0
  85. package/dist/pw-tp1.js.map +1 -0
  86. package/dist/pw-tp3.d.ts +6 -0
  87. package/dist/pw-tp3.d.ts.map +1 -0
  88. package/dist/pw-tp3.js +217 -0
  89. package/dist/pw-tp3.js.map +1 -0
  90. package/dist/pw-unic.d.ts +8 -0
  91. package/dist/pw-unic.d.ts.map +1 -0
  92. package/dist/pw-unic.js +285 -0
  93. package/dist/pw-unic.js.map +1 -0
  94. package/dist/pw-unic2.d.ts +4 -0
  95. package/dist/pw-unic2.d.ts.map +1 -0
  96. package/dist/pw-unic2.js +173 -0
  97. package/dist/pw-unic2.js.map +1 -0
  98. package/dist/pw-wn.d.ts +4 -0
  99. package/dist/pw-wn.d.ts.map +1 -0
  100. package/dist/pw-wn.js +82 -0
  101. package/dist/pw-wn.js.map +1 -0
  102. package/dist/pw-xann.d.ts +4 -0
  103. package/dist/pw-xann.d.ts.map +1 -0
  104. package/dist/pw-xann.js +220 -0
  105. package/dist/pw-xann.js.map +1 -0
  106. package/dist/pw-zen.d.ts +4 -0
  107. package/dist/pw-zen.d.ts.map +1 -0
  108. package/dist/pw-zen.js +162 -0
  109. package/dist/pw-zen.js.map +1 -0
  110. package/package.json +49 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw-np3.js","sourceRoot":"","sources":["../src/pw-np3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type PwFormat } from './prowiz.js';
2
+ /** pw_p4x (p40.c:313-317): "The Player 4.x". */
3
+ export declare const pwP4x: PwFormat;
4
+ //# sourceMappingURL=pw-p40.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw-p40.d.ts","sourceRoot":"","sources":["../src/pw-p40.ts"],"names":[],"mappings":"AAMA,OAAO,EAA4D,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAwOtG,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,QAInB,CAAC"}
package/dist/pw-p40.js ADDED
@@ -0,0 +1,221 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: libxmp src/loaders/prowizard/p40.c (The Player 4.0a/4.0b/
4
+ // 4.1a depacker) — depack_p4x :69-262, set_event :34-54, test_p4x :264-285.
5
+ import { ptkTable, ptkIsValidNote } from './ptktable.js';
6
+ import { readmem16b, readmem32b, moveData, writeZero, pwReadTitle } from './prowiz.js';
7
+ const MAGIC_P40A = 0x50343041; // 'P40A'
8
+ const MAGIC_P40B = 0x50343042; // 'P40B'
9
+ const MAGIC_P41A = 0x50343141; // 'P41A'
10
+ const PW_MOD_MAGIC = 0x4d2e4b2e; // 'M.K.'
11
+ function put8(out, b) { out.push(b & 0xff); }
12
+ function put16b(out, v) { out.push((v >> 8) & 0xff, v & 0xff); }
13
+ function put32b(out, v) {
14
+ out.push((v >>> 24) & 0xff, (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff);
15
+ }
16
+ /**
17
+ * set_event (p40.c:34-54): translate a 3-byte Player-4.x cell into a
18
+ * 4-byte Protracker cell. Junk after Dxx is dummied out. Returns void —
19
+ * the caller reads effect nibbles from the raw bytes.
20
+ */
21
+ function setEvent(out, c1, c2, c3) {
22
+ let mynote = c1 & 0x7f;
23
+ if (!ptkIsValidNote(Math.trunc(mynote / 2))) {
24
+ mynote = c1 = c2 = c3 = 0;
25
+ }
26
+ out.push(((c1 << 4) & 0x10) | ptkTable[Math.trunc(mynote / 2)][0]);
27
+ out.push(ptkTable[Math.trunc(mynote / 2)][1]);
28
+ const b = c2 & 0x0f;
29
+ if (b === 0x08)
30
+ c2 -= 0x08;
31
+ out.push(c2 & 0xff);
32
+ if (b === 0x05 || b === 0x06 || b === 0x0a) {
33
+ c3 = c3 > 0x7f ? (c3 << 4) & 0xf0 : c3;
34
+ }
35
+ out.push(c3 & 0xff);
36
+ }
37
+ /** track(p,c,r) = tdata[(p * 4 + c) * 256 + r * 4] (p40.c:56). */
38
+ function trackOff(p, c, r) {
39
+ return (p * 4 + c) * 256 + r * 4;
40
+ }
41
+ /**
42
+ * depack_p4x (p40.c:69-262).
43
+ */
44
+ function depackP4x(data, start) {
45
+ const inSize = data.length - start;
46
+ let pos = start;
47
+ const u8 = () => data[pos++] ?? 0;
48
+ const u16 = () => { const v = readmem16b(data, pos); pos += 2; return v; };
49
+ const u32 = () => { const v = readmem32b(data, pos); pos += 4; return v; };
50
+ const seek = (n) => { pos = start + n; };
51
+ const id = u32();
52
+ u8(); // real number of patterns
53
+ const len = u8(); // number of patterns in list
54
+ if (len >= 128)
55
+ throw new Error('p4x: pattern list too long');
56
+ const nsmp = u8(); // number of samples
57
+ if (nsmp > 31)
58
+ throw new Error('p4x: too many samples');
59
+ u8(); // bypass empty byte
60
+ const trkdatOfs = u32() + 4; // track data address
61
+ const trktabOfs = u32() + 4; // track table address
62
+ const smpOfs = u32() + 4; // sample data address
63
+ // Addresses count from after the magic string (p40.c:105-115)
64
+ if (trkdatOfs < 4 || trktabOfs < 4 || smpOfs < 4 ||
65
+ trkdatOfs >= inSize || trktabOfs >= inSize || smpOfs >= inSize) {
66
+ throw new Error('p4x: bad addresses');
67
+ }
68
+ const out = [];
69
+ writeZero(out, 20); // title
70
+ // Sample headers (p40.c:122-160)
71
+ const sampleAddress = [];
72
+ const sampleSize = [];
73
+ for (let i = 0; i < nsmp; i++) {
74
+ const addr = u32();
75
+ sampleAddress.push(addr);
76
+ const size = u16();
77
+ sampleSize.push(size * 2);
78
+ const loopAddr = u32();
79
+ const loopSize = u16();
80
+ let fine = 0;
81
+ if (id === MAGIC_P40A || id === MAGIC_P40B)
82
+ fine = u16();
83
+ u8(); // bypass 00h
84
+ const vol = u8();
85
+ if (id === MAGIC_P41A)
86
+ fine = u16();
87
+ // Sanity (p40.c:144-149)
88
+ if (addr < 0 || loopAddr < 0 || loopAddr < addr || addr > inSize - smpOfs) {
89
+ throw new Error('p4x: bad sample addresses');
90
+ }
91
+ writeZero(out, 22); // sample name
92
+ put16b(out, size);
93
+ put8(out, Math.trunc(fine / 74));
94
+ put8(out, vol);
95
+ put16b(out, Math.trunc((loopAddr - addr) / 2));
96
+ put16b(out, loopSize);
97
+ }
98
+ // Pad to 31 samples (p40.c:163-166): zeros with a 0x01 loop-size flag.
99
+ {
100
+ const pad = new Array(30).fill(0);
101
+ pad[29] = 0x01;
102
+ for (let i = nsmp; i < 31; i++)
103
+ out.push(...pad);
104
+ }
105
+ put8(out, len); // size of pattern list
106
+ put8(out, 0x7f); // noisetracker byte
107
+ seek(trktabOfs);
108
+ // Pattern list (p40.c:171-176)
109
+ for (let c1 = 0; c1 < len; c1++)
110
+ put8(out, c1);
111
+ for (let c1 = len; c1 < 128; c1++)
112
+ put8(out, 0);
113
+ put32b(out, PW_MOD_MAGIC);
114
+ // Track addresses per pattern (p40.c:178-182)
115
+ const trackAddr = [];
116
+ for (let i = 0; i < len; i++) {
117
+ const row = [];
118
+ for (let j = 0; j < 4; j++)
119
+ row.push(u16() + trkdatOfs);
120
+ trackAddr.push(row);
121
+ }
122
+ // Track data expansion (p40.c:184-262): tdata holds 512 tracks × 256.
123
+ const tdata = new Uint8Array(512 * 256);
124
+ const read4 = () => {
125
+ const v = [data[pos] ?? 0, data[pos + 1] ?? 0, data[pos + 2] ?? 0, data[pos + 3] ?? 0];
126
+ pos += 4;
127
+ return v;
128
+ };
129
+ const trySet = (p, j, k, c1, c2, c3) => {
130
+ const tmp = [];
131
+ setEvent(tmp, c1, c2, c3);
132
+ const base = trackOff(p, j, k);
133
+ for (let b = 0; b < 4; b++)
134
+ tdata[base + b] = tmp[b] ?? 0;
135
+ };
136
+ for (let i = 0; i < len; i++) {
137
+ for (let j = 0; j < 4; j++) {
138
+ pos = trackAddr[i][j]; // hio_seek once per (pattern, channel) — p40.c:189
139
+ for (let k = 0; k < 64; k++) {
140
+ let [c1, c2, c3, c4] = read4();
141
+ if (c1 !== 0x80) {
142
+ if (pos > data.length)
143
+ throw new Error('p4x: track read error');
144
+ trySet(i, j, k, c1, c2, c3);
145
+ if (c4 > 0x00 && c4 < 0x80)
146
+ k += c4;
147
+ if (c4 > 0x7f) {
148
+ k++;
149
+ for (let l = 256; l > c4; l--) {
150
+ if (k >= 64)
151
+ break;
152
+ trySet(i, j, k, c1, c2, c3);
153
+ k++;
154
+ }
155
+ k--;
156
+ }
157
+ continue;
158
+ }
159
+ // Case 0x80: repeat block (p40.c:210-246)
160
+ const a = pos; // position after the 0x80 marker
161
+ const c5 = c2;
162
+ const b = (c3 << 8) + c4 + trkdatOfs;
163
+ pos = start + b;
164
+ for (let c = 0; c <= c5; c++) {
165
+ if (k >= 64)
166
+ break;
167
+ [c1, c2, c3, c4] = read4();
168
+ trySet(i, j, k, c1, c2, c3);
169
+ if (c4 > 0x00 && c4 < 0x80)
170
+ k += c4;
171
+ if (c4 > 0x7f) {
172
+ k++;
173
+ for (let l = 256; l > c4; l--) {
174
+ if (k >= 64)
175
+ break;
176
+ trySet(i, j, k, c1, c2, c3);
177
+ k++;
178
+ }
179
+ k--;
180
+ }
181
+ k++;
182
+ }
183
+ k--;
184
+ pos = a;
185
+ }
186
+ }
187
+ }
188
+ // Write pattern data (p40.c:264-277)
189
+ for (let i = 0; i < len; i++) {
190
+ for (let j = 0; j < 64; j++) {
191
+ for (let k = 0; k < 4; k++) {
192
+ const base = trackOff(i, k, j);
193
+ for (let b = 0; b < 4; b++)
194
+ out.push(tdata[base + b]);
195
+ }
196
+ }
197
+ }
198
+ // Sample data (p40.c:280-284); Lost Vikings p4x.ingame2 has a sample at EOF.
199
+ for (let i = 0; i < nsmp; i++) {
200
+ moveData(data, start + sampleAddress[i] + smpOfs, out, sampleSize[i]);
201
+ }
202
+ return Uint8Array.from(out);
203
+ }
204
+ /** test_p4x (p40.c:287-311) — magic-only probe. */
205
+ function testP4x(data, start) {
206
+ const s = data.length - start;
207
+ if (s < 8)
208
+ return 8 - s;
209
+ const id = readmem32b(data, start);
210
+ if (id !== MAGIC_P40A && id !== MAGIC_P40B && id !== MAGIC_P41A)
211
+ return -1;
212
+ pwReadTitle(null, 0);
213
+ return 0;
214
+ }
215
+ /** pw_p4x (p40.c:313-317): "The Player 4.x". */
216
+ export const pwP4x = {
217
+ name: 'The Player 4.x',
218
+ test: testP4x,
219
+ depack: depackP4x,
220
+ };
221
+ //# sourceMappingURL=pw-p40.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw-p40.js","sourceRoot":"","sources":["../src/pw-p40.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FormatPlugin, LoadCtx, ModuleData } from '@modplayjs/core';
2
+ /** pw_test (pw_load.c:44-56): pw_check-based probe. */
3
+ export declare function pwTest(bytes: Uint8Array): boolean;
4
+ /** pw_load (pw_load.c:58-190): depack then parse the M.K. result. */
5
+ export declare function pwLoad(bytes: Uint8Array, ctx: LoadCtx): ModuleData;
6
+ /** ProWizard format plugin (libxmp loaders/pw_load.c + MOD reader). */
7
+ export declare const pwPlugin: FormatPlugin;
8
+ //# sourceMappingURL=pw-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw-plugin.d.ts","sourceRoot":"","sources":["../src/pw-plugin.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAQ,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI/E,uDAAuD;AACvD,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAEjD;AAED,qEAAqE;AACrE,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAG,UAAU,CAKlE;AAED,uEAAuE;AACvE,eAAO,MAAM,QAAQ,EAAE,YAOtB,CAAC"}
@@ -0,0 +1,27 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: libxmp src/loaders/pw_load.c (pw_test :44-56,
4
+ // pw_load :58-190).
5
+ import { pwCheck, pwWizardry } from './prowiz.js';
6
+ import { loadDepackedMod, readEvent } from '@modplayjs/fmt-mod';
7
+ /** pw_test (pw_load.c:44-56): pw_check-based probe. */
8
+ export function pwTest(bytes) {
9
+ return pwCheck(bytes, 0) !== null;
10
+ }
11
+ /** pw_load (pw_load.c:58-190): depack then parse the M.K. result. */
12
+ export function pwLoad(bytes, ctx) {
13
+ const nameBox = {};
14
+ const depacked = pwWizardry(bytes, 0, nameBox);
15
+ const name = nameBox.name ?? 'prowizard';
16
+ return loadDepackedMod(depacked, ctx, name);
17
+ }
18
+ /** ProWizard format plugin (libxmp loaders/pw_load.c + MOD reader). */
19
+ export const pwPlugin = {
20
+ name: 'prowizard',
21
+ test: pwTest,
22
+ load: pwLoad,
23
+ readEvent(core, chn, row) {
24
+ readEvent(core, chn, row);
25
+ },
26
+ };
27
+ //# sourceMappingURL=pw-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw-plugin.js","sourceRoot":"","sources":["../src/pw-plugin.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,6DAA6D;AAC7D,oBAAoB;AAGpB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEhE,uDAAuD;AACvD,MAAM,UAAU,MAAM,CAAC,KAAiB;IACtC,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;AACpC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,MAAM,CAAC,KAAiB,EAAE,GAAY;IACpD,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IACzC,OAAO,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,QAAQ,GAAiB;IACpC,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,SAAS,CAAC,IAAU,EAAE,GAAW,EAAE,GAAW;QAC5C,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type PwFormat } from './prowiz.js';
2
+ /** pw_pp10 (pp10.c:177-181): "ProPacker 1.0". */
3
+ export declare const pwPp10: PwFormat;
4
+ /** pw_pp21 (pp21.c:249-253): "ProPacker 2.1". */
5
+ export declare const pwPp21: PwFormat;
6
+ /** pw_pp30 (pp21.c:255-259): "ProPacker 3.0". */
7
+ export declare const pwPp30: PwFormat;
8
+ //# sourceMappingURL=pw-pp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw-pp.d.ts","sourceRoot":"","sources":["../src/pw-pp.ts"],"names":[],"mappings":"AAMA,OAAO,EAA4D,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAoJtG,iDAAiD;AACjD,eAAO,MAAM,MAAM,EAAE,QAIpB,CAAC;AAqLF,iDAAiD;AACjD,eAAO,MAAM,MAAM,EAAE,QAIpB,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,MAAM,EAAE,QAIpB,CAAC"}
package/dist/pw-pp.js ADDED
@@ -0,0 +1,341 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: libxmp src/loaders/prowizard/pp10.c (ProPacker 1.0) and
4
+ // pp21.c (ProPacker 2.1 + 3.0, shared depack_pp21_pp30).
5
+ import { ParseError } from '@modplayjs/core';
6
+ import { readmem16b, readmem32b, moveData, writeZero, pwReadTitle } from './prowiz.js';
7
+ /** write8/write16b/write32b helpers — output accumulates as a byte array. */
8
+ function put8(out, b) {
9
+ out.push(b & 0xff);
10
+ }
11
+ function put16b(out, v) {
12
+ out.push((v >> 8) & 0xff, v & 0xff);
13
+ }
14
+ function put32b(out, v) {
15
+ out.push((v >>> 24) & 0xff, (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff);
16
+ }
17
+ // ---------------------------------------------------------------------------
18
+ // ProPacker 1.0 (pp10.c)
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * depack_pp10 (pp10.c:41-120).
22
+ * Input: 31×8-byte sample headers, len @248, noisetracker byte @249,
23
+ * 4×128 track-number table @250, (ntrk+1)*256-byte track bank @762,
24
+ * then sample data.
25
+ */
26
+ function depackPp10(data, start) {
27
+ const out = [];
28
+ const trkNum = [[], [], [], []];
29
+ writeZero(out, 20); // title
30
+ // Sample descriptions (pp10.c:48-66): 8 bytes each → 22 zero + 8.
31
+ let ssize = 0;
32
+ for (let i = 0; i < 31; i++) {
33
+ const pos = start + i * 8;
34
+ if (pos + 8 > data.length)
35
+ throw new ParseError('pp10: truncated sample headers');
36
+ const tmp = data.slice(pos, pos + 8);
37
+ writeZero(out, 22); // sample name
38
+ const size = readmem16b(tmp, 0);
39
+ ssize += size * 2;
40
+ if (tmp[4] === 0 && tmp[5] === 0) {
41
+ tmp[5] = 1; // loop size 0,0 → 0,1 (pp10.c:58-60)
42
+ }
43
+ for (let k = 0; k < 8; k++)
44
+ out.push(tmp[k]);
45
+ }
46
+ const len = data[start + 248]; // pattern table length
47
+ put8(out, len);
48
+ const c1 = data[start + 249]; // noisetracker byte
49
+ put8(out, c1);
50
+ // Track list, 4×128 (pp10.c:75-84); find highest track number.
51
+ let ntrk = 0;
52
+ for (let j = 0; j < 4; j++) {
53
+ for (let i = 0; i < 128; i++) {
54
+ const t = data[start + 250 + j * 128 + i];
55
+ trkNum[j].push(t);
56
+ if (t > ntrk)
57
+ ntrk = t;
58
+ }
59
+ }
60
+ // Pattern table "as is" (pp10.c:87-94): 0..len-1, zero-pad to 128, M.K.
61
+ let i = 0;
62
+ for (; i < len; i++)
63
+ put8(out, i);
64
+ writeZero(out, 128 - i);
65
+ put32b(out, 0x4d2e4b2e); // write32b(out, PW_MOD_MAGIC) → "M.K." BE bytes
66
+ // Track/pattern data (pp10.c:97-112): interleave 4 tracks per pattern.
67
+ const pdata = new Uint8Array(1024);
68
+ for (i = 0; i < len; i++) {
69
+ pdata.fill(0);
70
+ for (let j = 0; j < 4; j++) {
71
+ const trackOff = start + 762 + (trkNum[j][i] << 8);
72
+ for (let k = 0; k < 64; k++) {
73
+ const src = trackOff + k * 4;
74
+ const dst = k * 16 + j * 4;
75
+ for (let b = 0; b < 4; b++) {
76
+ pdata[dst + b] = src + b < data.length ? data[src + b] : 0;
77
+ }
78
+ }
79
+ }
80
+ for (let b = 0; b < 1024; b++)
81
+ out.push(pdata[b]);
82
+ }
83
+ // Sample data (pp10.c:115-119): relocate to 762 + (ntrk+1)*256.
84
+ const smpOff = start + 762 + ((ntrk + 1) << 8);
85
+ moveData(data, smpOff, out, ssize);
86
+ return Uint8Array.from(out);
87
+ }
88
+ /**
89
+ * test_pp10 (pp10.c:123-175).
90
+ * Returns 0 match / -1 no match / N request-more-bytes.
91
+ */
92
+ function testPp10(data, start) {
93
+ const s = data.length - start;
94
+ // PW_REQUEST_DATA(s, 1024)
95
+ if (s < 1024)
96
+ return 1024 - s;
97
+ // Noisetracker byte (pp10.c:131-134).
98
+ if (data[start + 249] > 0x7f)
99
+ return -1;
100
+ // Test #2 (pp10.c:136-172): 31 sample headers, 8 bytes each @0.
101
+ let ssize = 0;
102
+ for (let i = 0; i < 31; i++) {
103
+ const d = start + i * 8;
104
+ const size = readmem16b(data, d) << 1;
105
+ const lstart = readmem16b(data, d + 4) << 1;
106
+ const lsize = readmem16b(data, d + 6) << 1;
107
+ ssize += size;
108
+ if (lsize === 0)
109
+ return -1;
110
+ if (lstart !== 0 && lsize <= 2)
111
+ return -1;
112
+ if (lstart + lsize > size + 2)
113
+ return -1;
114
+ if (data[d + 2] > 0x0f)
115
+ return -1; // finetune > 0x0f
116
+ if (data[d + 3] > 0x40)
117
+ return -1; // volume > 0x40
118
+ if (lstart > size)
119
+ return -1; // loop start > size
120
+ if (size > 0xffff)
121
+ return -1; // size > 0xffff
122
+ }
123
+ if (ssize <= 2)
124
+ return -1;
125
+ // Test #3 (pp10.c:174-178): pattern list size.
126
+ if (data[start + 248] === 0 || data[start + 248] > 127)
127
+ return -1;
128
+ // Highest track value (pp10.c:180-188).
129
+ let ntrk = 0;
130
+ for (let i = 0; i < 512; i++) {
131
+ const t = data[start + 250 + i];
132
+ if (t > ntrk)
133
+ ntrk = t;
134
+ }
135
+ ntrk++;
136
+ // PW_REQUEST_DATA(s, 762 + ntrk * 256)
137
+ const need = 762 + ntrk * 256;
138
+ if (s < need)
139
+ return need - s;
140
+ // Track data sanity (pp10.c:190-195): sample nibble <= 0x13.
141
+ for (let i = 0; i < ntrk * 64; i++) {
142
+ if (data[start + 762 + i * 4] > 0x13)
143
+ return -1;
144
+ }
145
+ return 0;
146
+ }
147
+ /** pw_pp10 (pp10.c:177-181): "ProPacker 1.0". */
148
+ export const pwPp10 = {
149
+ name: 'ProPacker 1.0',
150
+ test: testPp10,
151
+ depack: depackPp10,
152
+ };
153
+ // ---------------------------------------------------------------------------
154
+ // ProPacker 2.1 / 3.0 (pp21.c, shared depack_pp21_pp30)
155
+ // ---------------------------------------------------------------------------
156
+ /**
157
+ * depack_pp21_pp30 (pp21.c:37-121): sample headers, numpat, restart,
158
+ * 4×128 track table, M.K., per-track 64 u16 offsets into a reference
159
+ * table, reference-table-reconstructed patterns, then sample data.
160
+ */
161
+ function depackPp21Pp30(data, start, is30) {
162
+ const out = [];
163
+ writeZero(out, 20); // title
164
+ // Sample descriptions (pp21.c:48-59)
165
+ let ssize = 0;
166
+ for (let i = 0; i < 31; i++) {
167
+ writeZero(out, 22); // sample name
168
+ const size = readmem16b(data, start + i * 8);
169
+ ssize += size * 2;
170
+ put16b(out, size);
171
+ put8(out, data[start + i * 8 + 2]); // finetune
172
+ put8(out, data[start + i * 8 + 3]); // volume
173
+ put16b(out, readmem16b(data, start + i * 8 + 4)); // loop start
174
+ put16b(out, readmem16b(data, start + i * 8 + 6)); // loop size
175
+ }
176
+ const numpat = data[start + 248];
177
+ if (numpat > 128)
178
+ throw new ParseError('pp21: too many patterns');
179
+ put8(out, numpat);
180
+ put8(out, data[start + 249]); // NoiseTracker restart byte
181
+ const trk = [[], [], [], []];
182
+ let max = 0;
183
+ for (let j = 0; j < 4; j++) {
184
+ for (let i = 0; i < 128; i++) {
185
+ const t = data[start + 250 + j * 128 + i];
186
+ trk[j].push(t);
187
+ if (t > max)
188
+ max = t;
189
+ }
190
+ }
191
+ // Pattern table without optimizing (pp21.c:78-81)
192
+ let i = 0;
193
+ for (; i < numpat; i++)
194
+ put8(out, i);
195
+ writeZero(out, 128 - i);
196
+ put32b(out, 0x4d2e4b2e); // "M.K."
197
+ // Per-track 64 u16 reference-table offsets (pp21.c:86-96)
198
+ const tptr = [];
199
+ for (let j = 0; j <= max; j++) {
200
+ const row = [];
201
+ for (let k = 0; k < 64; k++) {
202
+ let v = readmem16b(data, start + 762 + (j * 64 + k) * 2);
203
+ if (is30)
204
+ v >>= 2;
205
+ row.push(v);
206
+ }
207
+ tptr.push(row);
208
+ }
209
+ // Reference table (pp21.c:99-108)
210
+ const tabOff = start + 762 + (max + 1) * 128;
211
+ const tabsize = readmem32b(data, tabOff);
212
+ if (tabsize === 0)
213
+ throw new ParseError('pp21: zero reference table size');
214
+ const tab = data.subarray(tabOff + 4, tabOff + 4 + tabsize);
215
+ if (tab.length < tabsize)
216
+ throw new ParseError('pp21: reference table truncated');
217
+ // Pattern reconstruction (pp21.c:110-121): each row is 4×4 bytes copied
218
+ // from tab[tptr[trk[j][i]][row] * 4].
219
+ for (i = 0; i < numpat; i++) {
220
+ for (let j = 0; j < 64; j++) {
221
+ for (let c = 0; c < 4; c++) {
222
+ const off = tptr[trk[c][i]][j] * 4;
223
+ for (let b = 0; b < 4; b++) {
224
+ out.push(tab[off + b] ?? 0);
225
+ }
226
+ }
227
+ }
228
+ }
229
+ // Sample data (pp21.c:126-128)
230
+ moveData(data, tabOff + 4 + tabsize, out, ssize);
231
+ return Uint8Array.from(out);
232
+ }
233
+ /** Shared pp21/pp30 test body (pp21.c:124-176 vs :178-247). */
234
+ function testPp21Pp30(data, start, is30) {
235
+ const s = data.length - start;
236
+ if (s < 762)
237
+ return 762 - s;
238
+ let ssize = 0;
239
+ for (let i = 0; i < 31; i++) {
240
+ const d = start + i * 8;
241
+ const len = readmem16b(data, d) << 1;
242
+ const lstart = readmem16b(data, d + 4) << 1;
243
+ ssize += len;
244
+ if (data[d + 2] > 0x0f)
245
+ return -1; // finetune
246
+ if (data[d + 3] > 0x40)
247
+ return -1; // volume
248
+ if (lstart > len)
249
+ return -1; // loop start > size
250
+ }
251
+ if (ssize <= 2)
252
+ return -1;
253
+ // Pattern list size
254
+ const npat = data[start + 248];
255
+ if (npat === 0 || npat > 127)
256
+ return -1;
257
+ // Highest track value
258
+ let tsize = 0;
259
+ for (let i = 0; i < 512; i++) {
260
+ const trk = data[start + 250 + i];
261
+ if (trk > tsize)
262
+ tsize = trk;
263
+ }
264
+ tsize++;
265
+ tsize <<= 6;
266
+ // PW_REQUEST_DATA(s, tsize * 2 + 4 + 762)
267
+ const need = tsize * 2 + 4 + 762;
268
+ if (s < need)
269
+ return need - s;
270
+ let maxRef = 0;
271
+ if (!is30) {
272
+ // test #4 (pp21.c:194-203): track data value > $4000?
273
+ for (let i = 0; i < tsize; i++) {
274
+ const ref = readmem16b(data, start + i * 2 + 762);
275
+ if (ref > 0x4000)
276
+ return -1;
277
+ if (ref > maxRef)
278
+ maxRef = ref;
279
+ }
280
+ // test #5 (pp21.c:206-209): reference table size *4?
281
+ if (readmem32b(data, start + tsize * 2 + 762) !== (maxRef + 1) * 4)
282
+ return -1;
283
+ }
284
+ else {
285
+ // test #4 (pp21.c:211-230): track data value *4?
286
+ for (let i = 0; i < tsize; i++) {
287
+ const ref = readmem16b(data, start + i * 2 + 762);
288
+ if (ref > maxRef)
289
+ maxRef = ref;
290
+ if ((ref & 0x0003) !== 0)
291
+ return -1;
292
+ }
293
+ maxRef >>= 2;
294
+ // test #5 (pp21.c:233-243)
295
+ let refSize = readmem32b(data, start + tsize * 2 + 762);
296
+ if (refSize > 0xffff)
297
+ return -1;
298
+ if (refSize !== (maxRef + 1) << 2)
299
+ return -1;
300
+ refSize >>= 2;
301
+ // PW_REQUEST_DATA(s, (ref_size * 4) + (tsize * 2) + 4 + 762)
302
+ const need2 = refSize * 4 + tsize * 2 + 4 + 762;
303
+ if (s < need2)
304
+ return need2 - s;
305
+ // test #6 (pp21.c:245-...): reference table sanity
306
+ for (let i = 0; i < refSize; i++) {
307
+ const d = start + tsize * 2 + 766 + i * 4;
308
+ const fxt = data[d + 2] & 0x0f;
309
+ const fxp = data[d + 3];
310
+ if (fxt === 0x0c && fxp > 0x41)
311
+ return -1; // volume > 41
312
+ if (fxt === 0x0d && (fxp > 0x64 || (fxp & 0xf) > 9))
313
+ return -1; // break
314
+ if (fxt === 0x0b && fxp > 0x7f)
315
+ return -1; // jump > 128
316
+ if ((data[d] & 0xf0) > 0x10)
317
+ return -1; // sample > 1f
318
+ }
319
+ }
320
+ pwReadTitle(null, 0);
321
+ return 0;
322
+ }
323
+ function testPp21(data, start) {
324
+ return testPp21Pp30(data, start, false);
325
+ }
326
+ function testPp30(data, start) {
327
+ return testPp21Pp30(data, start, true);
328
+ }
329
+ /** pw_pp21 (pp21.c:249-253): "ProPacker 2.1". */
330
+ export const pwPp21 = {
331
+ name: 'ProPacker 2.1',
332
+ test: testPp21,
333
+ depack: (data, start) => depackPp21Pp30(data, start, false),
334
+ };
335
+ /** pw_pp30 (pp21.c:255-259): "ProPacker 3.0". */
336
+ export const pwPp30 = {
337
+ name: 'ProPacker 3.0',
338
+ test: testPp30,
339
+ depack: (data, start) => depackPp21Pp30(data, start, true),
340
+ };
341
+ //# sourceMappingURL=pw-pp.js.map