@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,173 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: libxmp src/loaders/prowizard/unic2.c (Unic Tracker 2) —
4
+ // depack_unic2 :40-131, test_unic2 :134-239.
5
+ import { ptkTable, ptkIsValidNote } from './ptktable.js';
6
+ import { readmem16b, readmem32b, moveData, writeZero, pwReadTitle } from './prowiz.js';
7
+ function put8(out, b) { out.push(b & 0xff); }
8
+ function put16b(out, v) { out.push((v >> 8) & 0xff, v & 0xff); }
9
+ function put32b(out, v) {
10
+ out.push((v >>> 24) & 0xff, (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff);
11
+ }
12
+ /** depack_unic2 (unic2.c:40-131). */
13
+ function depackUnic2(data, start) {
14
+ let pos = start;
15
+ const out = [];
16
+ const u8 = () => data[pos++] ?? 0;
17
+ const u16 = () => { const v = readmem16b(data, pos); pos += 2; return v; };
18
+ writeZero(out, 20); // title (unic2.c:44)
19
+ // Sample headers (unic2.c:47-86) — same finetune scheme as unic.c.
20
+ let ssize = 0;
21
+ for (let i = 0; i < 31; i++) {
22
+ // sample name (unic2.c:48): move 20 bytes verbatim
23
+ for (let k = 0; k < 20; k++)
24
+ out.push(data[pos++] ?? 0);
25
+ put8(out, 0);
26
+ put8(out, 0);
27
+ // fine on? (unic2.c:51-62)
28
+ const c1 = u8();
29
+ const c2 = u8();
30
+ const j = (c1 << 8) + c2;
31
+ let fine = 0;
32
+ if (j !== 0) {
33
+ fine = j < 256 ? 0x10 - c2 : 0x100 - c2;
34
+ }
35
+ const len = u16();
36
+ put16b(out, len);
37
+ ssize += len << 1;
38
+ u8();
39
+ put8(out, fine);
40
+ put8(out, u8()); // vol
41
+ let lstart = u16();
42
+ const lsize = u16();
43
+ if (lstart * 2 + lsize <= len && lstart !== 0) {
44
+ lstart <<= 1;
45
+ }
46
+ put16b(out, lstart);
47
+ put16b(out, lsize);
48
+ }
49
+ const npat = u8();
50
+ put8(out, npat);
51
+ put8(out, 0x7f);
52
+ u8();
53
+ // Pattern table (unic2.c:92-94)
54
+ const tmp = [];
55
+ for (let i = 0; i < 128; i++)
56
+ tmp.push(u8());
57
+ for (let i = 0; i < 128; i++)
58
+ put8(out, tmp[i]);
59
+ // Highest pattern (unic2.c:96-100)
60
+ let maxpat = 0;
61
+ for (let i = 0; i < 128; i++) {
62
+ if (tmp[i] > maxpat)
63
+ maxpat = tmp[i];
64
+ }
65
+ maxpat++;
66
+ put32b(out, 0x4d2e4b2e); // M.K.
67
+ // Pattern data (unic2.c:103-128): 3-byte cells.
68
+ for (let i = 0; i < maxpat; i++) {
69
+ for (let j = 0; j < 256; j++) {
70
+ const c1 = u8();
71
+ const c2 = u8();
72
+ const c3 = u8();
73
+ const ins = ((c1 >> 2) & 0x10) | ((c2 >> 4) & 0x0f);
74
+ const note = c1 & 0x3f;
75
+ if (!ptkIsValidNote(note))
76
+ throw new Error('unic2: invalid note');
77
+ const fxt = c2 & 0x0f;
78
+ let fxp = c3;
79
+ if (fxt === 0x0d) {
80
+ const ones = fxp % 10;
81
+ const tens = Math.trunc(fxp / 10);
82
+ fxp = 16 * tens + ones;
83
+ }
84
+ out.push((ins & 0xf0) | ptkTable[note][0]);
85
+ out.push(ptkTable[note][1]);
86
+ out.push(((ins << 4) & 0xf0) | fxt);
87
+ out.push(fxp);
88
+ }
89
+ }
90
+ // Sample data (unic2.c:131)
91
+ moveData(data, pos, out, ssize);
92
+ return Uint8Array.from(out);
93
+ }
94
+ /** test_unic2 (unic2.c:134-239). */
95
+ function testUnic2(data, start) {
96
+ const s = data.length - start;
97
+ if (s < 1084)
98
+ return 1084 - s;
99
+ if (readmem32b(data, start + 1080) === 0x00000000)
100
+ return -1;
101
+ // Samples (unic2.c:146-176) — note the d+22/26/28 field offsets.
102
+ let ssize = 0;
103
+ let maxIns = 0;
104
+ for (let i = 0; i < 31; i++) {
105
+ const d = start + i * 30;
106
+ const size = readmem16b(data, d + 22) << 1;
107
+ const lstart = readmem16b(data, d + 26) << 1;
108
+ const lsize = readmem16b(data, d + 28) << 1;
109
+ ssize += size;
110
+ if (size + 2 < lstart + lsize)
111
+ return -1;
112
+ if (size > 0xffff || lstart > 0xffff || lsize > 0xffff)
113
+ return -1;
114
+ if (data[d + 25] > 0x40)
115
+ return -1;
116
+ if ((readmem16b(data, d + 20) !== 0) && size === 0)
117
+ return -1;
118
+ if (data[d + 25] !== 0 && size === 0)
119
+ return -1;
120
+ if (size !== 0)
121
+ maxIns = i + 1;
122
+ }
123
+ if (ssize <= 2)
124
+ return -1;
125
+ // Pattern list size (unic2.c:179-198) at 930/932.
126
+ const len = data[start + 930];
127
+ if (len === 0 || len > 127)
128
+ return -1;
129
+ let psize = 0;
130
+ let i = 0;
131
+ for (; i < len; i++) {
132
+ const x = data[start + 932 + i];
133
+ if (x > 127)
134
+ return -1;
135
+ if (x > psize)
136
+ psize = x;
137
+ }
138
+ for (i += 2; i !== 128; i++) {
139
+ if (data[start + 932 + i] !== 0)
140
+ return -1;
141
+ }
142
+ psize++;
143
+ psize <<= 8;
144
+ // PW_REQUEST_DATA(s, 1060 + psize * 3 + 2)
145
+ if (s < 1060 + psize * 3 + 2)
146
+ return 1060 + psize * 3 + 2 - s;
147
+ // Pattern data sanity (unic2.c:204-231)
148
+ for (i = 0; i < psize; i++) {
149
+ const d = start + 1060 + i * 3;
150
+ if (data[d] > 0x74)
151
+ return -1;
152
+ if ((data[d] & 0x3f) > 0x24)
153
+ return -1;
154
+ if ((data[d + 1] & 0x0f) === 0x0c && data[d + 2] > 0x40)
155
+ return -1;
156
+ if ((data[d + 1] & 0x0f) === 0x0b && data[d + 2] > 0x7f)
157
+ return -1;
158
+ if ((data[d + 1] & 0x0f) === 0x0d && data[d + 2] > 0x40)
159
+ return -1;
160
+ const ins = ((data[d] >> 2) & 0x30) | ((data[d + 2] >> 4) & 0x0f);
161
+ if (ins > maxIns)
162
+ return -1;
163
+ }
164
+ pwReadTitle(null, 0);
165
+ return 0;
166
+ }
167
+ /** pw_unic2: "Unic Tracker 2". */
168
+ export const pwUnic2 = {
169
+ name: 'Unic Tracker 2',
170
+ test: testUnic2,
171
+ depack: depackUnic2,
172
+ };
173
+ //# sourceMappingURL=pw-unic2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw-unic2.js","sourceRoot":"","sources":["../src/pw-unic2.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,uEAAuE;AACvE,6CAA6C;AAE7C,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AAEtG,SAAS,IAAI,CAAC,GAAa,EAAE,CAAS,IAAU,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACrE,SAAS,MAAM,CAAC,GAAa,EAAE,CAAS,IAAU,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACxF,SAAS,MAAM,CAAC,GAAa,EAAE,CAAS;IACtC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,qCAAqC;AACrC,SAAS,WAAW,CAAC,IAAgB,EAAE,KAAa;IAClD,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3E,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB;IAEzC,mEAAmE;IACnE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,mDAAmD;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAEb,2BAA2B;QAC3B,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAChB,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QAC1C,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjB,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;QAElB,EAAE,EAAE,CAAC;QACL,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;QAEvB,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC;QACpB,IAAI,MAAM,GAAG,CAAC,GAAG,KAAK,IAAI,GAAG,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,KAAK,CAAC,CAAC;QACf,CAAC;QACD,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC;IAClB,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAChB,EAAE,EAAE,CAAC;IAEL,gCAAgC;IAChC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC;IAEjD,mCAAmC;IACnC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,GAAG,CAAC,CAAC,CAAE,GAAG,MAAM;YAAE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;IACzC,CAAC;IACD,MAAM,EAAE,CAAC;IAET,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO;IAEhC,gDAAgD;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;YAEhB,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAElE,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;YACtB,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;gBAClC,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;YACzB,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAEhC,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,oCAAoC;AACpC,SAAS,SAAS,CAAC,IAAgB,EAAE,KAAa;IAChD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IAC9B,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,IAAI,GAAG,CAAC,CAAC;IAE9B,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,CAAC;IAE7D,iEAAiE;IACjE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5C,KAAK,IAAI,IAAI,CAAC;QAEd,IAAI,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK;YAAE,OAAO,CAAC,CAAC,CAAC;QACzC,IAAI,IAAI,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,IAAI,KAAK,GAAG,MAAM;YAAE,OAAO,CAAC,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,CAAE,GAAG,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,CAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QACjD,IAAI,IAAI,KAAK,CAAC;YAAE,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IAE1B,kDAAkD;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAE,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,GAAG,GAAG;QAAE,OAAO,CAAC,CAAC,CAAC;IAEtC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAE,CAAC;QACjC,IAAI,CAAC,GAAG,GAAG;YAAE,OAAO,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,GAAG,KAAK;YAAE,KAAK,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,EAAE,CAAC;IACR,KAAK,KAAK,CAAC,CAAC;IAEZ,2CAA2C;IAC3C,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAE9D,wCAAwC;IACxC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,CAAC,CAAE,GAAG,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QAErE,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACpE,IAAI,GAAG,GAAG,MAAM;YAAE,OAAO,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAErB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,kCAAkC;AAClC,MAAM,CAAC,MAAM,OAAO,GAAa;IAC/B,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,WAAW;CACpB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type PwFormat } from './prowiz.js';
2
+ /** pw_wn: "Wanton Packer". */
3
+ export declare const pwWn: PwFormat;
4
+ //# sourceMappingURL=pw-wn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw-wn.d.ts","sourceRoot":"","sources":["../src/pw-wn.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAmFnE,8BAA8B;AAC9B,eAAO,MAAM,IAAI,EAAE,QAIlB,CAAC"}
package/dist/pw-wn.js ADDED
@@ -0,0 +1,82 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: libxmp src/loaders/prowizard/wn.c (Wanton Packer) —
4
+ // depack_wn :32-88, test_wn :90-113.
5
+ import { ptkTable, ptkIsValidNote } from './ptktable.js';
6
+ import { moveData, pwReadTitle } from './prowiz.js';
7
+ const PW_MOD_MAGIC = 0x4d2e4b2e; // 'M.K.'
8
+ function put8(out, b) { out.push(b & 0xff); }
9
+ function put32b(out, v) {
10
+ out.push((v >>> 24) & 0xff, (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff);
11
+ }
12
+ /** depack_wn (wn.c:32-88) — nearly a straight MOD copy with cell rewrite. */
13
+ function depackWn(data, start) {
14
+ let pos = start;
15
+ const out = [];
16
+ // header: move 950 bytes verbatim (wn.c:36)
17
+ for (let i = 0; i < 950; i++)
18
+ out.push(data[pos++] ?? 0);
19
+ // whole sample size (wn.c:38-42): sizes at 42 + i*30
20
+ let ssize = 0;
21
+ for (let i = 0; i < 31; i++) {
22
+ ssize += ((data[start + 42 + i * 30] << 8) | data[start + 43 + i * 30]) * 2;
23
+ }
24
+ // pattern list size (wn.c:45-47)
25
+ const npat = data[start + 950];
26
+ put8(out, npat);
27
+ // order table + ntk byte (wn.c:48-50): 129 bytes (128 orders + 0x7f)
28
+ for (let i = 0; i < 129; i++)
29
+ out.push(data[start + 951 + i] ?? 0);
30
+ // ptk ID (wn.c:52)
31
+ put32b(out, PW_MOD_MAGIC);
32
+ // highest pattern number (wn.c:54-59): from tmp[i+1] = orders at 952+
33
+ let max = 0;
34
+ for (let i = 0; i < 128; i++) {
35
+ if (data[start + 951 + i + 1] > max)
36
+ max = data[start + 951 + i + 1];
37
+ }
38
+ max++;
39
+ // pattern data (wn.c:61-83): 4-byte cells with note nibble rewrite
40
+ pos = start + 1084;
41
+ for (let i = 0; i < max; i++) {
42
+ for (let j = 0; j < 256; j++) {
43
+ const c1 = data[pos++] ?? 0;
44
+ const c2 = data[pos++] ?? 0;
45
+ const c3 = data[pos++] ?? 0;
46
+ const c4 = data[pos++] ?? 0;
47
+ if (!ptkIsValidNote(Math.trunc(c1 / 2)))
48
+ throw new Error('wn: invalid note');
49
+ put8(out, (c2 & 0xf0) | ptkTable[Math.trunc(c1 / 2)][0]);
50
+ put8(out, ptkTable[Math.trunc(c1 / 2)][1]);
51
+ put8(out, ((c2 << 4) & 0xf0) | c3);
52
+ put8(out, c4);
53
+ }
54
+ }
55
+ // sample data (wn.c:86)
56
+ moveData(data, pos, out, ssize);
57
+ return Uint8Array.from(out);
58
+ }
59
+ /** test_wn (wn.c:90-113). */
60
+ function testWn(data, start) {
61
+ const s = data.length - start;
62
+ if (s < 1082)
63
+ return 1082 - s;
64
+ // test 1 (wn.c:94-97): 'WN' at 1080
65
+ if (data[start + 1080] !== 0x57 || data[start + 1081] !== 0x4e)
66
+ return -1;
67
+ // test 2 (wn.c:99-102): ntk byte
68
+ if (data[start + 951] !== 0x7f)
69
+ return -1;
70
+ // test 3 (wn.c:104-107)
71
+ if (data[start + 950] > 0x7f)
72
+ return -1;
73
+ pwReadTitle(data.subarray(start), 20);
74
+ return 0;
75
+ }
76
+ /** pw_wn: "Wanton Packer". */
77
+ export const pwWn = {
78
+ name: 'Wanton Packer',
79
+ test: testWn,
80
+ depack: depackWn,
81
+ };
82
+ //# sourceMappingURL=pw-wn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw-wn.js","sourceRoot":"","sources":["../src/pw-wn.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,mEAAmE;AACnE,qCAAqC;AAErC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AAEnE,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,SAAS;AAE1C,SAAS,IAAI,CAAC,GAAa,EAAE,CAAS,IAAU,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACrE,SAAS,MAAM,CAAC,GAAa,EAAE,CAAS;IACtC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,6EAA6E;AAC7E,SAAS,QAAQ,CAAC,IAAgB,EAAE,KAAa;IAC/C,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,4CAA4C;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEzD,qDAAqD;IACrD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAE,CAAC,GAAG,CAAC,CAAC;IAChF,CAAC;IAED,iCAAiC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAE,CAAC;IAChC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEhB,qEAAqE;IACrE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnE,mBAAmB;IACnB,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAE1B,sEAAsE;IACtE,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAE,GAAG,GAAG;YAAE,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;IACzE,CAAC;IACD,GAAG,EAAE,CAAC;IAEN,mEAAmE;IACnE,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAE5B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAE7E,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAEhC,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,6BAA6B;AAC7B,SAAS,MAAM,CAAC,IAAgB,EAAE,KAAa;IAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IAC9B,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,IAAI,GAAG,CAAC,CAAC;IAE9B,oCAAoC;IACpC,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IAE1E,iCAAiC;IACjC,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IAE1C,wBAAwB;IACxB,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,CAAE,GAAG,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IAEzC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAEtC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,MAAM,IAAI,GAAa;IAC5B,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;CACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type PwFormat } from './prowiz.js';
2
+ /** pw_xann: "XANN Packer". */
3
+ export declare const pwXann: PwFormat;
4
+ //# sourceMappingURL=pw-xann.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw-xann.d.ts","sourceRoot":"","sources":["../src/pw-xann.ts"],"names":[],"mappings":"AAMA,OAAO,EAA4D,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAsKtG,8BAA8B;AAC9B,eAAO,MAAM,MAAM,EAAE,QAIpB,CAAC"}
@@ -0,0 +1,220 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: libxmp src/loaders/prowizard/xann.c (XANN Packer) —
4
+ // depack_xann :34-240, test_xann :243-296.
5
+ import { ptkTable, ptkIsValidNote } from './ptktable.js';
6
+ import { readmem16b, readmem32b, moveData, writeZero, pwReadTitle } from './prowiz.js';
7
+ /** SMP_DESC_ADDRESS (xann.c:24) / PAT_DATA_ADDRESS (xann.c:25). */
8
+ const SMP_DESC_ADDRESS = 0x206;
9
+ const PAT_DATA_ADDRESS = 0x43c;
10
+ function put8(out, b) { out.push(b & 0xff); }
11
+ function put16b(out, v) { out.push((v >> 8) & 0xff, v & 0xff); }
12
+ function put32b(out, v) {
13
+ out.push((v >>> 24) & 0xff, (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff);
14
+ }
15
+ /** depack_xann (xann.c:34-240). */
16
+ function depackXann(data, start) {
17
+ let pos = start;
18
+ const out = [];
19
+ const u8 = () => data[pos++] ?? 0;
20
+ const u16 = () => { const v = readmem16b(data, pos); pos += 2; return v; };
21
+ const u32 = () => { const v = readmem32b(data, pos); pos += 4; return v; };
22
+ writeZero(out, 20); // title
23
+ // 31 sample headers (xann.c:41-63) at SMP_DESC_ADDRESS
24
+ pos = start + SMP_DESC_ADDRESS;
25
+ let ssize = 0;
26
+ for (let i = 0; i < 31; i++) {
27
+ writeZero(out, 22); // sample name
28
+ const fine = u8();
29
+ const vol = u8();
30
+ let j = u32(); // loop start address
31
+ const lsize = u16();
32
+ const k = u32(); // sample address
33
+ const size = u16();
34
+ ssize += size * 2;
35
+ j = j - k; // loop start value (xann.c:56)
36
+ put16b(out, size);
37
+ put8(out, fine);
38
+ put8(out, vol);
39
+ put16b(out, Math.trunc(j / 2));
40
+ put16b(out, lsize);
41
+ u16(); // bypass two unknown bytes
42
+ }
43
+ // Pattern table (xann.c:66-81) from offset 0
44
+ pos = start;
45
+ const ptable = new Array(128).fill(0);
46
+ let pat = 0;
47
+ let c5 = 0;
48
+ for (; c5 < 128; c5++) {
49
+ const k = u32();
50
+ if (k === 0)
51
+ break;
52
+ ptable[c5] = Math.trunc((k - 0x3c) / 1024) - 1;
53
+ if (ptable[c5] > pat)
54
+ pat = ptable[c5];
55
+ }
56
+ pat++; // starts at $00 (xann.c:80)
57
+ put8(out, c5); // number of patterns
58
+ put8(out, 0x7f); // noisetracker byte
59
+ for (let i = 0; i < 128; i++)
60
+ put8(out, ptable[i]);
61
+ put32b(out, 0x4d2e4b2e); // M.K.
62
+ // Pattern data (xann.c:86-236) with the XANN effect translation table
63
+ pos = start + PAT_DATA_ADDRESS;
64
+ for (let i = 0; i < pat; i++) {
65
+ for (let j = 0; j < 256; j++) {
66
+ const ins = Math.trunc((u8() >> 3) & 0x1f);
67
+ const note = u8();
68
+ let fxt = u8();
69
+ let fxp = u8();
70
+ if (!ptkIsValidNote(note >> 1))
71
+ throw new Error('xann: invalid note');
72
+ switch (fxt) {
73
+ case 0x00:
74
+ fxt = 0x00;
75
+ break; // no fxt
76
+ case 0x04:
77
+ fxt = 0x00;
78
+ break; // arpeggio
79
+ case 0x08:
80
+ fxt = 0x01;
81
+ break; // portamento up
82
+ case 0x0c:
83
+ fxt = 0x02;
84
+ break; // portamento down
85
+ case 0x10:
86
+ fxt = 0x03;
87
+ break; // tone porta, no fxp
88
+ case 0x14:
89
+ fxt = 0x03;
90
+ break; // tone portamento
91
+ case 0x18:
92
+ fxt = 0x04;
93
+ break; // vibrato, no fxp
94
+ case 0x1c:
95
+ fxt = 0x04;
96
+ break; // vibrato
97
+ case 0x24:
98
+ fxt = 0x05;
99
+ break; // tone porta + vol down
100
+ case 0x28: // vibrato + vol UP
101
+ fxt = 0x06;
102
+ fxp = (((fxp << 4) & 0xf0) | ((fxp >> 4) & 0x0f)) & 0xff;
103
+ break;
104
+ case 0x2c:
105
+ fxt = 0x06;
106
+ break; // vibrato + vol DOWN
107
+ case 0x38:
108
+ fxt = 0x09;
109
+ break; // sample offset
110
+ case 0x3c: // volume slide up
111
+ fxt = 0x0a;
112
+ fxp = (((fxp << 4) & 0xf0) | ((fxp >> 4) & 0x0f)) & 0xff;
113
+ break;
114
+ case 0x40:
115
+ fxt = 0x0a;
116
+ break; // volume slide down
117
+ case 0x44:
118
+ fxt = 0x0b;
119
+ break; // position jump
120
+ case 0x48:
121
+ fxt = 0x0c;
122
+ break; // set volume
123
+ case 0x4c:
124
+ fxt = 0x0d;
125
+ break; // pattern break
126
+ case 0x50:
127
+ fxt = 0x0f;
128
+ break; // set speed
129
+ case 0x58:
130
+ fxt = 0x0e;
131
+ fxp = 0x01;
132
+ break; // set filter
133
+ case 0x5c:
134
+ fxt = 0x0e;
135
+ fxp |= 0x10;
136
+ break; // fine slide up
137
+ case 0x60:
138
+ fxt = 0x0e;
139
+ fxp |= 0x20;
140
+ break; // fine slide down
141
+ case 0x84:
142
+ fxt = 0x0e;
143
+ fxp |= 0x90;
144
+ break; // retrigger
145
+ case 0x88:
146
+ fxt = 0x0e;
147
+ fxp |= 0xa0;
148
+ break; // fine vol slide up
149
+ case 0x8c:
150
+ fxt = 0x0e;
151
+ fxp |= 0xb0;
152
+ break; // fine vol slide down
153
+ case 0x94:
154
+ fxt = 0x0e;
155
+ fxp |= 0xd0;
156
+ break; // note delay
157
+ case 0x98:
158
+ fxt = 0x0e;
159
+ fxp |= 0xe0;
160
+ break; // pattern delay
161
+ default:
162
+ fxt = 0;
163
+ fxp = 0;
164
+ break;
165
+ }
166
+ out.push((ins & 0xf0) | ptkTable[note >> 1][0]);
167
+ out.push(ptkTable[note >> 1][1]);
168
+ out.push(((ins << 4) & 0xf0) | fxt);
169
+ out.push(fxp);
170
+ }
171
+ }
172
+ // Sample data (xann.c:239): sequential after the pattern data.
173
+ moveData(data, pos, out, ssize);
174
+ return Uint8Array.from(out);
175
+ }
176
+ /** test_xann (xann.c:243-296). */
177
+ function testXann(data, start) {
178
+ const s = data.length - start;
179
+ if (s < 2048)
180
+ return 2048 - s;
181
+ // test 1 (xann.c:250-253)
182
+ if (data[start + 3] !== 0x3c)
183
+ return -1;
184
+ // test 2 (xann.c:255-262)
185
+ for (let i = 0; i < 128; i++) {
186
+ const j = readmem32b(data, start + i * 4);
187
+ const k = j & ~3;
188
+ if (k !== j || j > 132156)
189
+ return -1;
190
+ }
191
+ // test 4 (xann.c:270-277)
192
+ for (let i = 0; i < 64; i++) {
193
+ if (data[start + 3 + i * 4] !== 0x3c && data[start + 3 + i * 4] !== 0) {
194
+ return -1;
195
+ }
196
+ }
197
+ // test 5 (xann.c:279-283)
198
+ for (let i = 0; i < 31; i++) {
199
+ if (data[start + 519 + 16 * i] > 0x40)
200
+ return -1;
201
+ }
202
+ // test 6 (xann.c:285-296): sample addresses ascending and >= 2108
203
+ for (let i = 0; i < 30; i++) {
204
+ const j = readmem32b(data, start + 526 + 16 * i);
205
+ const k = readmem32b(data, start + 520 + 16 * (i + 1));
206
+ if (j < 2108 || k < 2108)
207
+ return -1;
208
+ if (j > k)
209
+ return -1;
210
+ }
211
+ pwReadTitle(null, 0);
212
+ return 0;
213
+ }
214
+ /** pw_xann: "XANN Packer". */
215
+ export const pwXann = {
216
+ name: 'XANN Packer',
217
+ test: testXann,
218
+ depack: depackXann,
219
+ };
220
+ //# sourceMappingURL=pw-xann.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw-xann.js","sourceRoot":"","sources":["../src/pw-xann.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type PwFormat } from './prowiz.js';
2
+ /** pw_zen: "Zen Packer". */
3
+ export declare const pwZen: PwFormat;
4
+ //# sourceMappingURL=pw-zen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw-zen.d.ts","sourceRoot":"","sources":["../src/pw-zen.ts"],"names":[],"mappings":"AAMA,OAAO,EAA4D,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2KtG,4BAA4B;AAC5B,eAAO,MAAM,KAAK,EAAE,QAInB,CAAC"}