@modplayjs/fmt-st 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.
- package/README.md +23 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/st.d.ts +8 -0
- package/dist/st.d.ts.map +1 -0
- package/dist/st.js +488 -0
- package/dist/st.js.map +1 -0
- package/package.json +47 -4
package/README.md
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @modplayjs/fmt-st
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Ultimate Soundtracker (ST/UST) plugin** for `@modplayjs/core` — the
|
|
4
|
+
original 15-instrument MOD family, ported 1:1 from libxmp's `st_load.c`
|
|
5
|
+
with The Ultimate Soundtracker quirk handling.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install @modplayjs/fmt-st
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { CorePlayer } from '@modplayjs/core';
|
|
17
|
+
import { plugin as stPlugin } from '@modplayjs/fmt-st';
|
|
18
|
+
|
|
19
|
+
const core = new CorePlayer();
|
|
20
|
+
core.registries.registerFormat(stPlugin);
|
|
21
|
+
core.loadModule(bytes);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Part of the [modplayjs monorepo](../../README.md). BSD-3-Clause.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,wEAAwE;AAExE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/st.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FormatPlugin, LoadCtx, ModuleData } from '@modplayjs/core';
|
|
2
|
+
/** st_test (st_load.c:62-249). */
|
|
3
|
+
export declare function stTest(bytes: Uint8Array): boolean;
|
|
4
|
+
/** st_load (st_load.c:251-517). */
|
|
5
|
+
export declare function stLoad(bytes: Uint8Array, ctx: LoadCtx): ModuleData;
|
|
6
|
+
/** ST format plugin (libxmp loaders/st_load.c + read_event MOD family). */
|
|
7
|
+
export declare const plugin: FormatPlugin;
|
|
8
|
+
//# sourceMappingURL=st.d.ts.map
|
package/dist/st.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"st.d.ts","sourceRoot":"","sources":["../src/st.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAQ,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA4F/E,kCAAkC;AAClC,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAwHjD;AA4CD,mCAAmC;AACnC,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAG,UAAU,CAwOlE;AAED,2EAA2E;AAC3E,eAAO,MAAM,MAAM,EAAE,YAOpB,CAAC"}
|
package/dist/st.js
ADDED
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
// Copyright (c) 2026 Bitti09 — modplayjs contributors
|
|
3
|
+
// Ported from: libxmp src/loaders/st_load.c (st_test :62-249, st_load
|
|
4
|
+
// :251-517), the Ultimate Soundtracker / D.O.C Soundtracker family
|
|
5
|
+
// (15 instruments, no magic).
|
|
6
|
+
import { C4_PAL_RATE, PeriodType, Quirk, ReadEventType, SampleFlags } from '@modplayjs/core';
|
|
7
|
+
import { LSN, MSN, ParseError } from '@modplayjs/core';
|
|
8
|
+
import { readEvent as readEventDispatch, decodeEvent, TrackerId } from '@modplayjs/fmt-mod';
|
|
9
|
+
/** musanx.mod contains 22 period and instrument errors (st_load.c:40). */
|
|
10
|
+
const ST_MAX_PATTERN_ERRORS = 22;
|
|
11
|
+
/** Worst known truncation is u2.mod with 7% (st_load.c:43). */
|
|
12
|
+
const ST_TRUNCATION_LIMIT = 93;
|
|
13
|
+
/** ST period table (st_load.c:46-54) incl. the off-by-one values. */
|
|
14
|
+
const PERIOD = [
|
|
15
|
+
856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453,
|
|
16
|
+
428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226,
|
|
17
|
+
214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113,
|
|
18
|
+
// Off-by-one period values found in blueberry.mod, snd.mod,
|
|
19
|
+
// quite a lot.mod, sweet dreams.mod, and bar----fringdus.mod
|
|
20
|
+
763, 679, 641, 571, 539, 509, 429, 340, 321, 300, 286, 270,
|
|
21
|
+
227, 191, 162,
|
|
22
|
+
-1,
|
|
23
|
+
];
|
|
24
|
+
/** st_expected_size (st_load.c:56-60). */
|
|
25
|
+
function stExpectedSize(smpSize, pat) {
|
|
26
|
+
return 600 + smpSize + 1024 * pat;
|
|
27
|
+
}
|
|
28
|
+
/** libxmp_test_name (common.c:274-296) with TEST_NAME_* flags. */
|
|
29
|
+
function testName(s, n, flags) {
|
|
30
|
+
const IGNORE_AFTER_0 = 0x0001;
|
|
31
|
+
const IGNORE_AFTER_CR = 0x0002;
|
|
32
|
+
for (let i = 0; i < n && i < s.length; i++) {
|
|
33
|
+
const c = s[i];
|
|
34
|
+
if (c === 0 && (flags & IGNORE_AFTER_0) !== 0)
|
|
35
|
+
break;
|
|
36
|
+
if (c === 0x0d && (flags & IGNORE_AFTER_CR) !== 0)
|
|
37
|
+
break;
|
|
38
|
+
if (c > 0x7f)
|
|
39
|
+
return false;
|
|
40
|
+
// ACS_Team2.mod has a backspace in instrument name
|
|
41
|
+
// Numerous ST modules from Music Channel BBS have char 14.
|
|
42
|
+
if (c > 0 && c < 32 && c !== 0x08 && c !== 0x0e)
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
/** Read the 600-byte ST header. */
|
|
48
|
+
function readHeader(bytes) {
|
|
49
|
+
const name = bytes.slice(0, 20);
|
|
50
|
+
// The Super Ski 2 modules have unusual "SONG\x13\x88" names.
|
|
51
|
+
if (name[5] === 0x88) {
|
|
52
|
+
name[5] = 0x58; // 'X'
|
|
53
|
+
if (name[4] === 0x13)
|
|
54
|
+
name[4] = 0x58; // 'X'
|
|
55
|
+
}
|
|
56
|
+
const ins = [];
|
|
57
|
+
for (let i = 0; i < 15; i++) {
|
|
58
|
+
const pos = 20 + i * 30;
|
|
59
|
+
ins.push({
|
|
60
|
+
name: bytes.slice(pos, pos + 22),
|
|
61
|
+
size: (bytes[pos + 22] << 8) | bytes[pos + 23],
|
|
62
|
+
finetune: bytes[pos + 24],
|
|
63
|
+
volume: bytes[pos + 25],
|
|
64
|
+
loop_start: (bytes[pos + 26] << 8) | bytes[pos + 27],
|
|
65
|
+
loop_size: (bytes[pos + 28] << 8) | bytes[pos + 29],
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
name,
|
|
70
|
+
ins,
|
|
71
|
+
len: bytes[470],
|
|
72
|
+
restart: bytes[471],
|
|
73
|
+
order: bytes.slice(472, 600),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** st_test (st_load.c:62-249). */
|
|
77
|
+
export function stTest(bytes) {
|
|
78
|
+
const size = bytes.length;
|
|
79
|
+
if (size < 600)
|
|
80
|
+
return false;
|
|
81
|
+
let smpSize = 0;
|
|
82
|
+
const mh = readHeader(bytes);
|
|
83
|
+
const TEST_NAME_IGNORE_AFTER_CR = 0x0002;
|
|
84
|
+
let testFlags = TEST_NAME_IGNORE_AFTER_CR;
|
|
85
|
+
if (!testName(mh.name, 20, testFlags))
|
|
86
|
+
return false;
|
|
87
|
+
for (let i = 0; i < 15; i++) {
|
|
88
|
+
const ins = mh.ins[i];
|
|
89
|
+
smpSize += 2 * ins.size;
|
|
90
|
+
// pennylane.mod and heymusic-sssexremix.mod have unusual
|
|
91
|
+
// values after the \0.
|
|
92
|
+
if (i === 0) {
|
|
93
|
+
const n = ins.name;
|
|
94
|
+
const eq = (arr) => {
|
|
95
|
+
if (n.length < arr.length)
|
|
96
|
+
return false;
|
|
97
|
+
for (let k = 0; k < arr.length; k++) {
|
|
98
|
+
if (n[k] !== arr[k])
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
};
|
|
103
|
+
if (eq([0x66, 0x75, 0x6e, 0x62, 0x61, 0x73, 0x73, 0x00, 0x0d]) || // "funbass\0\r"
|
|
104
|
+
eq([0x73, 0x74, 0x2d, 0x36, 0x39, 0x3a, 0x62, 0x61, 0x73, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x00, 0x52, 0x00, 0x00, 0xa5]) // "st-69:baseline\0R\0\0\xA5"
|
|
105
|
+
) {
|
|
106
|
+
testFlags |= 0x0001; // TEST_NAME_IGNORE_AFTER_0
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Crepequs.mod has random values in first byte
|
|
110
|
+
ins.name[0] = 0x58; // 'X'
|
|
111
|
+
if (!testName(ins.name, 22, testFlags))
|
|
112
|
+
return false;
|
|
113
|
+
if (ins.volume > 0x40)
|
|
114
|
+
return false;
|
|
115
|
+
if ((ins.finetune & 0xf0) !== 0)
|
|
116
|
+
return false;
|
|
117
|
+
if (ins.size > 0x8000)
|
|
118
|
+
return false;
|
|
119
|
+
// This test is always false, disable it
|
|
120
|
+
// if ((loop_start >> 1) > 0x8000) return -1;
|
|
121
|
+
if (ins.loop_size > 0x8000)
|
|
122
|
+
return false;
|
|
123
|
+
// This test fails in atmosfer.mod, disable it
|
|
124
|
+
// if (loop_size > 1 && loop_size > size) return -1;
|
|
125
|
+
// Bad rip of fin-nv1.mod has this unused instrument.
|
|
126
|
+
if (ins.size === 0 && ins.loop_start === 4462 && ins.loop_size === 2078) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if ((ins.loop_start >> 1) > ins.size)
|
|
130
|
+
return false;
|
|
131
|
+
if (ins.size !== 0 && (ins.loop_start >> 1) === ins.size)
|
|
132
|
+
return false;
|
|
133
|
+
if (ins.size === 0 && ins.loop_start > 0)
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
if (smpSize < 8)
|
|
137
|
+
return false;
|
|
138
|
+
// Pattern count from the order table.
|
|
139
|
+
let pat = 0;
|
|
140
|
+
let patShort = 0;
|
|
141
|
+
for (let i = 0; i < 128; i++) {
|
|
142
|
+
const x = mh.order[i];
|
|
143
|
+
if (x > 0x7f)
|
|
144
|
+
return false;
|
|
145
|
+
if (x > pat) {
|
|
146
|
+
pat = x;
|
|
147
|
+
if (i < mh.len)
|
|
148
|
+
patShort = x;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
pat++;
|
|
152
|
+
patShort++;
|
|
153
|
+
if (pat > 0x7f || mh.len === 0 || mh.len > 0x80)
|
|
154
|
+
return false;
|
|
155
|
+
// ST pattern-list quirk (razor-1911.mod, Operation Wolf, Bad Dudes).
|
|
156
|
+
if (size < stExpectedSize(smpSize, pat) && size === stExpectedSize(smpSize, patShort)) {
|
|
157
|
+
pat = patShort;
|
|
158
|
+
}
|
|
159
|
+
// Pattern data sanity (st_load.c:208-249): sample numbers > 15 and
|
|
160
|
+
// periods outside the ST table count as errors.
|
|
161
|
+
let patternErrors = 0;
|
|
162
|
+
let ins0 = 0;
|
|
163
|
+
for (let i = 0; i < pat; i++) {
|
|
164
|
+
const base = 600 + i * 1024;
|
|
165
|
+
if (base + 1024 > size)
|
|
166
|
+
return false; // hio_read short → not ST
|
|
167
|
+
for (let j = 0; j < 64 * 4; j++) {
|
|
168
|
+
const off = base + j * 4;
|
|
169
|
+
const s = (bytes[off] & 0xf0) | MSN(bytes[off + 2]);
|
|
170
|
+
if (s > 15) {
|
|
171
|
+
if (++patternErrors > ST_MAX_PATTERN_ERRORS)
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
if (s > ins0)
|
|
175
|
+
ins0 = s;
|
|
176
|
+
const p = 256 * LSN(bytes[off]) + bytes[off + 1];
|
|
177
|
+
if (p === 0)
|
|
178
|
+
continue;
|
|
179
|
+
let k = 0;
|
|
180
|
+
for (; PERIOD[k] >= 0; k++) {
|
|
181
|
+
if (p === PERIOD[k])
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
if (PERIOD[k] < 0) {
|
|
185
|
+
if (++patternErrors > ST_MAX_PATTERN_ERRORS)
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Check if file was cut before any unused samples (st_load.c:250-266).
|
|
191
|
+
if (size < stExpectedSize(smpSize, pat)) {
|
|
192
|
+
let ss = 0;
|
|
193
|
+
for (let i = 0; i < 15 && i < ins0; i++) {
|
|
194
|
+
ss += 2 * mh.ins[i].size;
|
|
195
|
+
}
|
|
196
|
+
const limit = Math.trunc((stExpectedSize(ss, pat) * ST_TRUNCATION_LIMIT) / 100);
|
|
197
|
+
if (size < limit)
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
/** Zeroed envelope (libxmp_init_instrument calloc semantics). */
|
|
203
|
+
function zeroEnvelope() {
|
|
204
|
+
return { flags: 0, npt: 0, scl: 0, sus: 0, sue: 0, lps: 0, lpe: 0, x: [], y: [] };
|
|
205
|
+
}
|
|
206
|
+
function zeroInstrument(name, sub) {
|
|
207
|
+
return {
|
|
208
|
+
name,
|
|
209
|
+
volume: 0x40,
|
|
210
|
+
nsm: 0,
|
|
211
|
+
rls: 0,
|
|
212
|
+
map: new Array(121).fill(0),
|
|
213
|
+
mapXpo: new Array(121).fill(0),
|
|
214
|
+
sub,
|
|
215
|
+
aei: zeroEnvelope(),
|
|
216
|
+
fei: zeroEnvelope(),
|
|
217
|
+
pei: zeroEnvelope(),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function copyTitleName(r, n) {
|
|
221
|
+
// C: strncpy(mod->name, mh.name, 20) is RAW — the control→' ' mapping
|
|
222
|
+
// happens later in libxmp_adjust_string (load.c:298). Only instrument/
|
|
223
|
+
// sample names go through libxmp_copy_adjust's dot substitution.
|
|
224
|
+
let s = '';
|
|
225
|
+
for (let i = 0; i < n && i < r.length; i++) {
|
|
226
|
+
const c = r[i];
|
|
227
|
+
if (c === 0)
|
|
228
|
+
break;
|
|
229
|
+
s += String.fromCharCode(c);
|
|
230
|
+
}
|
|
231
|
+
return s.replace(/ +$/, '');
|
|
232
|
+
}
|
|
233
|
+
function copyAdjustName(r, n) {
|
|
234
|
+
let s = '';
|
|
235
|
+
for (let i = 0; i < n && i < r.length; i++) {
|
|
236
|
+
const c = r[i];
|
|
237
|
+
if (c === 0)
|
|
238
|
+
break;
|
|
239
|
+
s += c > 127 || c < 0x20 || c === 0x7f ? '.' : String.fromCharCode(c);
|
|
240
|
+
}
|
|
241
|
+
return s;
|
|
242
|
+
}
|
|
243
|
+
/** st_load (st_load.c:251-517). */
|
|
244
|
+
export function stLoad(bytes, ctx) {
|
|
245
|
+
const size = bytes.length;
|
|
246
|
+
const fail = (msg) => {
|
|
247
|
+
throw new ParseError(msg);
|
|
248
|
+
};
|
|
249
|
+
const mh = readHeader(bytes);
|
|
250
|
+
let ust = 1;
|
|
251
|
+
let smpSize = 0;
|
|
252
|
+
for (let i = 0; i < 15; i++) {
|
|
253
|
+
smpSize += 2 * mh.ins[i].size;
|
|
254
|
+
}
|
|
255
|
+
const len = mh.len;
|
|
256
|
+
let rst = mh.restart;
|
|
257
|
+
// UST: The byte at module offset 471 is BPM, not the song restart.
|
|
258
|
+
// The default for UST modules is 0x78 = 120 BPM = 48 Hz.
|
|
259
|
+
if (rst < 0x40)
|
|
260
|
+
ust = 0;
|
|
261
|
+
const xxo = Array.from(mh.order);
|
|
262
|
+
let pat = 0;
|
|
263
|
+
let patShort = 0;
|
|
264
|
+
for (let i = 0; i < 128; i++) {
|
|
265
|
+
if (xxo[i] > pat) {
|
|
266
|
+
pat = xxo[i];
|
|
267
|
+
if (i < len)
|
|
268
|
+
patShort = pat;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
pat++;
|
|
272
|
+
patShort++;
|
|
273
|
+
// ST pattern-list quirk.
|
|
274
|
+
if (size < stExpectedSize(smpSize, pat) && size === stExpectedSize(smpSize, patShort)) {
|
|
275
|
+
pat = patShort;
|
|
276
|
+
}
|
|
277
|
+
// UST heuristics (st_load.c:328-355).
|
|
278
|
+
for (let i = 0; i < 15; i++) {
|
|
279
|
+
const ins = mh.ins[i];
|
|
280
|
+
if (ins.finetune !== 0)
|
|
281
|
+
ust = 0;
|
|
282
|
+
if (ins.size > 0x1387 || ins.loop_start > 9999 || ins.loop_size > 0x1387)
|
|
283
|
+
ust = 0;
|
|
284
|
+
}
|
|
285
|
+
// Instruments (st_load.c:357-397): ST loop points are BYTE offsets from
|
|
286
|
+
// the sample start — xxs->len = 2*size - loop_start, lps = 0.
|
|
287
|
+
const instruments = [];
|
|
288
|
+
const rawSamples = [];
|
|
289
|
+
for (let i = 0; i < 15; i++) {
|
|
290
|
+
const ins = mh.ins[i];
|
|
291
|
+
const xlen = 2 * ins.size - ins.loop_start;
|
|
292
|
+
const lps = 0;
|
|
293
|
+
const lpe = lps + 2 * ins.loop_size;
|
|
294
|
+
const xflg = ins.loop_size > 1 ? SampleFlags.LOOP : 0;
|
|
295
|
+
const fin = (((ins.finetune << 4) & 0xff) << 24) >> 24; // (int8)((uint8)finetune << 4)
|
|
296
|
+
const sub = {
|
|
297
|
+
vol: ins.volume,
|
|
298
|
+
gvl: 0x40, // no QUIRK_INSVOL: load_epilogue sets gvl = volbase
|
|
299
|
+
pan: -1, // XMP_INST_NO_DEFAULT_PAN
|
|
300
|
+
xpo: 0,
|
|
301
|
+
fin,
|
|
302
|
+
vwf: 0,
|
|
303
|
+
vde: 0,
|
|
304
|
+
vra: 0,
|
|
305
|
+
vsw: 0,
|
|
306
|
+
sid: i,
|
|
307
|
+
rvv: 0,
|
|
308
|
+
nna: 0,
|
|
309
|
+
dct: 0,
|
|
310
|
+
dca: 0,
|
|
311
|
+
ifc: 0,
|
|
312
|
+
ifr: 0,
|
|
313
|
+
};
|
|
314
|
+
const iname = copyAdjustName(ins.name, 22);
|
|
315
|
+
const xxi = zeroInstrument(iname, [sub]);
|
|
316
|
+
if (xlen > 0)
|
|
317
|
+
xxi.nsm = 1;
|
|
318
|
+
instruments.push(xxi);
|
|
319
|
+
rawSamples.push({
|
|
320
|
+
name: '', // st_load never writes xxs->name
|
|
321
|
+
data: new Uint8Array(0),
|
|
322
|
+
length: xlen,
|
|
323
|
+
loopStart: lps,
|
|
324
|
+
loopEnd: lpe,
|
|
325
|
+
sustainStart: 0,
|
|
326
|
+
sustainEnd: 0,
|
|
327
|
+
finetune: fin,
|
|
328
|
+
volume: ins.volume,
|
|
329
|
+
flags: xflg,
|
|
330
|
+
c5spd: C4_PAL_RATE,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
// Patterns (st_load.c:402-433): decode + tracker detection in one pass.
|
|
334
|
+
const chn = 4;
|
|
335
|
+
const patlen = 64 * 4 * chn;
|
|
336
|
+
const patterns = [];
|
|
337
|
+
let fxused = 0;
|
|
338
|
+
const events = []; // [pat][row][chn]
|
|
339
|
+
for (let i = 0; i < pat; i++) {
|
|
340
|
+
const base = 600 + i * 1024;
|
|
341
|
+
if (base + 1024 > size)
|
|
342
|
+
fail('ST: read error at pattern');
|
|
343
|
+
const patEvents = [];
|
|
344
|
+
const tracks = [];
|
|
345
|
+
for (let k = 0; k < chn; k++)
|
|
346
|
+
tracks.push({ rows: 64, event: [] });
|
|
347
|
+
for (let j = 0; j < 64 * 4; j++) {
|
|
348
|
+
const row = Math.floor(j / 4);
|
|
349
|
+
const c = j % 4;
|
|
350
|
+
const ev = {
|
|
351
|
+
note: 0, ins: 0, vol: 0, fxt: 0, fxp: 0, f2t: 0, f2p: 0,
|
|
352
|
+
};
|
|
353
|
+
decodeEvent(ev, bytes, base + j * 4, TrackerId.PROTRACKER);
|
|
354
|
+
if (ev.fxt)
|
|
355
|
+
fxused |= 1 << ev.fxt;
|
|
356
|
+
else if (ev.fxp)
|
|
357
|
+
fxused |= 1;
|
|
358
|
+
// UST: Only effects 1 (arpeggio) and 2 (pitchbend) are available.
|
|
359
|
+
if (ev.fxt && ev.fxt !== 1 && ev.fxt !== 2)
|
|
360
|
+
ust = 0;
|
|
361
|
+
// Karsten Obarski's sleepwalk uses arpeggio 30 and 40.
|
|
362
|
+
if (ev.fxt === 1) {
|
|
363
|
+
if (ev.fxp === 0x00)
|
|
364
|
+
ust = 0;
|
|
365
|
+
}
|
|
366
|
+
if (ev.fxt === 2) {
|
|
367
|
+
// bend up and down at same time?
|
|
368
|
+
if ((ev.fxp & 0x0f) !== 0 && (ev.fxp & 0xf0) !== 0)
|
|
369
|
+
ust = 0;
|
|
370
|
+
}
|
|
371
|
+
while (patEvents.length <= row)
|
|
372
|
+
patEvents.push([]);
|
|
373
|
+
patEvents[row][c] = ev;
|
|
374
|
+
tracks[c].event[row] = ev;
|
|
375
|
+
}
|
|
376
|
+
patterns.push({ rows: 64, tracks });
|
|
377
|
+
events.push(patEvents);
|
|
378
|
+
}
|
|
379
|
+
// Tracker type (st_load.c:435-447).
|
|
380
|
+
let modtype;
|
|
381
|
+
if ((fxused & ~0x0006) !== 0)
|
|
382
|
+
ust = 0;
|
|
383
|
+
if (ust !== 0) {
|
|
384
|
+
modtype = 'Ultimate Soundtracker';
|
|
385
|
+
}
|
|
386
|
+
else if ((fxused & ~0xd007) === 0) {
|
|
387
|
+
modtype = 'Soundtracker IX'; // or MasterSoundtracker?
|
|
388
|
+
}
|
|
389
|
+
else if ((fxused & ~0xf807) === 0) {
|
|
390
|
+
modtype = 'D.O.C Soundtracker 2.0';
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
modtype = 'unknown tracker 15 instrument';
|
|
394
|
+
}
|
|
395
|
+
// UST conversions (st_load.c:482-511).
|
|
396
|
+
let bpm = 125;
|
|
397
|
+
if (ust !== 0) {
|
|
398
|
+
// Fix restart & bpm.
|
|
399
|
+
bpm = rst;
|
|
400
|
+
rst = 0;
|
|
401
|
+
// Fix effects (arpeggio and pitchbending).
|
|
402
|
+
for (let i = 0; i < pat; i++) {
|
|
403
|
+
for (let j = 0; j < 64 * 4; j++) {
|
|
404
|
+
const row = Math.floor(j / 4);
|
|
405
|
+
const c = j % 4;
|
|
406
|
+
const ev = events[i][row][c];
|
|
407
|
+
if (ev.fxt === 1)
|
|
408
|
+
ev.fxt = 0;
|
|
409
|
+
else if (ev.fxt === 2 && (ev.fxp & 0xf0) === 0)
|
|
410
|
+
ev.fxt = 1;
|
|
411
|
+
else if (ev.fxt === 2 && (ev.fxp & 0x0f) === 0)
|
|
412
|
+
ev.fxp >>= 4;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
if (rst >= len)
|
|
418
|
+
rst = 0;
|
|
419
|
+
}
|
|
420
|
+
// Samples (st_load.c:513-517): skip the transient pre-loop part
|
|
421
|
+
// (hio_seek(loop_start, SEEK_CUR)), then libxmp_load_sample.
|
|
422
|
+
let filePos = 600 + pat * patlen;
|
|
423
|
+
for (let i = 0; i < 15; i++) {
|
|
424
|
+
const raw = rawSamples[i];
|
|
425
|
+
if (raw.length === 0) {
|
|
426
|
+
ctx.addSample(raw);
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
// Skip transient part of sample (st_load.c:528-543).
|
|
430
|
+
filePos += mh.ins[i].loop_start;
|
|
431
|
+
const remaining = Math.max(0, size - filePos);
|
|
432
|
+
const take = Math.min(raw.length, remaining);
|
|
433
|
+
raw.data = bytes.subarray(filePos, filePos + take);
|
|
434
|
+
filePos += raw.length; // hio_read advances by requested count
|
|
435
|
+
ctx.addSample(raw);
|
|
436
|
+
}
|
|
437
|
+
// Channel defaults (load_helpers.c:334-339): pan LRLR, vol 0x40, flg 0.
|
|
438
|
+
const channels = [];
|
|
439
|
+
for (let i = 0; i < chn; i++) {
|
|
440
|
+
const pan = Math.floor((i + 1) / 2) % 2 * 0xff;
|
|
441
|
+
channels.push({ pan: Math.min(255, Math.max(0, 0x80 + (pan - 0x80))), vol: 0x40, flg: 0 });
|
|
442
|
+
}
|
|
443
|
+
const mod = {
|
|
444
|
+
title: copyTitleName(mh.name, 20),
|
|
445
|
+
format: 'mod',
|
|
446
|
+
comment: '',
|
|
447
|
+
chn,
|
|
448
|
+
pat,
|
|
449
|
+
ins: 15,
|
|
450
|
+
len,
|
|
451
|
+
restart: rst,
|
|
452
|
+
xxo,
|
|
453
|
+
channels,
|
|
454
|
+
patterns,
|
|
455
|
+
instruments,
|
|
456
|
+
samples: rawSamples,
|
|
457
|
+
num_sequences: 0,
|
|
458
|
+
sequences: [],
|
|
459
|
+
speed: 6,
|
|
460
|
+
bpm,
|
|
461
|
+
volbase: 0x40,
|
|
462
|
+
gvolbase: 0x40,
|
|
463
|
+
gvol: 0x40,
|
|
464
|
+
quirks: Quirk.NOBPM,
|
|
465
|
+
flowMode: 0,
|
|
466
|
+
readEventType: ReadEventType.MOD,
|
|
467
|
+
periodType: PeriodType.MODRNG,
|
|
468
|
+
defpan: 0x80,
|
|
469
|
+
time_factor: 10,
|
|
470
|
+
rrate: 250,
|
|
471
|
+
c4rate: C4_PAL_RATE,
|
|
472
|
+
compare_vblank: false,
|
|
473
|
+
tracker: modtype,
|
|
474
|
+
};
|
|
475
|
+
void ctx.sampleRate;
|
|
476
|
+
void ctx.outputRate;
|
|
477
|
+
return mod;
|
|
478
|
+
}
|
|
479
|
+
/** ST format plugin (libxmp loaders/st_load.c + read_event MOD family). */
|
|
480
|
+
export const plugin = {
|
|
481
|
+
name: 'st',
|
|
482
|
+
test: stTest,
|
|
483
|
+
load: stLoad,
|
|
484
|
+
readEvent(core, chn, row) {
|
|
485
|
+
readEventDispatch(core, chn, row);
|
|
486
|
+
},
|
|
487
|
+
};
|
|
488
|
+
//# sourceMappingURL=st.js.map
|
package/dist/st.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"st.js","sourceRoot":"","sources":["../src/st.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@modplayjs/fmt-st",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Ultimate Soundtracker (ST/UST 15-instrument MOD family) format plugin for modplayjs (libxmp st_load.c port).",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc -p tsconfig.build.json",
|
|
19
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@modplayjs/core": "^0.2.1",
|
|
23
|
+
"@modplayjs/fmt-mod": "^0.2.1"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"tracker",
|
|
27
|
+
"stm",
|
|
28
|
+
"scream tracker",
|
|
29
|
+
"libxmp",
|
|
30
|
+
"chiptune",
|
|
31
|
+
"audio",
|
|
32
|
+
"music"
|
|
33
|
+
],
|
|
34
|
+
"sideEffects": false,
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18"
|
|
37
|
+
},
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "git+https://github.com/modplayjs/modplayjs.git",
|
|
41
|
+
"directory": "packages/fmt-st"
|
|
42
|
+
},
|
|
43
|
+
"bugs": "https://github.com/modplayjs/modplayjs/issues",
|
|
44
|
+
"homepage": "https://github.com/modplayjs/modplayjs#readme",
|
|
45
|
+
"license": "BSD-3-Clause",
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"registry": "https://npm.pkg.github.com"
|
|
48
|
+
}
|
|
49
|
+
}
|