@modplayjs/fmt-sfx 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 CHANGED
@@ -1,3 +1,23 @@
1
- # Temporary Holding Version
1
+ # @modplayjs/fmt-sfx
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **SoundFX (.sfx) format plugin** for `@modplayjs/core`, ported 1:1 from
4
+ libxmp's `sfx_load.c` (4/8-channel SoundFX 1.x/2.0 modules).
5
+
6
+ ## Install
7
+
8
+ ```sh
9
+ npm install @modplayjs/fmt-sfx
10
+ ```
11
+
12
+ ## Usage
13
+
14
+ ```ts
15
+ import { CorePlayer } from '@modplayjs/core';
16
+ import { plugin as sfxPlugin } from '@modplayjs/fmt-sfx';
17
+
18
+ const core = new CorePlayer();
19
+ core.registries.registerFormat(sfxPlugin);
20
+ core.loadModule(bytes);
21
+ ```
22
+
23
+ Part of the [modplayjs monorepo](../../README.md). BSD-3-Clause.
@@ -0,0 +1,2 @@
1
+ export { sfxTest, sfxLoad, plugin } from './sfx.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Project-original code.
4
+ // @modplayjs/fmt-sfx — SoundFX 1.3/2.0 loader + event reader.
5
+ export { sfxTest, sfxLoad, plugin } from './sfx.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,yBAAyB;AACzB,8DAA8D;AAE9D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
package/dist/sfx.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { FormatPlugin, LoadCtx, ModuleData } from '@modplayjs/core';
2
+ export declare function sfxTest(bytes: Uint8Array): boolean;
3
+ export declare function sfxLoad(bytes: Uint8Array, ctx: LoadCtx): ModuleData;
4
+ /** SoundFX format plugin (libxmp loaders/sfx_load.c + read_event MOD). */
5
+ export declare const plugin: FormatPlugin;
6
+ //# sourceMappingURL=sfx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sfx.d.ts","sourceRoot":"","sources":["../src/sfx.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAQ,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAuE/E,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAKlD;AAkPD,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAG,UAAU,CAMnE;AAMD,0EAA0E;AAC1E,eAAO,MAAM,MAAM,EAAE,YAUpB,CAAC"}
package/dist/sfx.js ADDED
@@ -0,0 +1,306 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: libxmp src/loaders/sfx_load.c (sfx_test :39-53,
4
+ // sfx_13_20_load :96-258, sfx_translate_effect :66-94, sfx_load :260-265).
5
+ //
6
+ // Reverse engineered from Delitracker mods disk + Future Wars / Twinworld /
7
+ // Operation Stealth music (C header comment). SoundFX 2.0 = 1.3 with 31
8
+ // samples instead of 15 (ExoticRipper docs).
9
+ import { SampleFlags } from '@modplayjs/core';
10
+ import { LSN, MSN, PERIOD_BASE, EMPTY_EVENT } from '@modplayjs/core';
11
+ import { ParseError } from '@modplayjs/core';
12
+ import { FX_ARPEGGIO, FX_PORTA_DN, FX_PORTA_UP, FX_PITCH_ADD, FX_PITCH_SUB, FX_VOL_ADD, FX_VOL_SUB, } from '@modplayjs/core';
13
+ import { Quirk } from '@modplayjs/core';
14
+ import { readEventMod } from '@modplayjs/fmt-mod';
15
+ /** MAGIC_SONG (sfx_load.c:24). */
16
+ const MAGIC_SONG = 0x534f4e47; // 'SONG'
17
+ /** libxmp_period_to_note (period.c:213-220). */
18
+ function periodToNote(p) {
19
+ if (p <= 0)
20
+ return 0;
21
+ return Math.round(12.0 * Math.log(PERIOD_BASE / p) / Math.LN2) + 1;
22
+ }
23
+ /** Zeroed envelope (libxmp_init_instrument calloc semantics). */
24
+ function zeroEnvelope() {
25
+ return { flags: 0, npt: 0, scl: 0, sus: 0, sue: 0, lps: 0, lpe: 0, x: [], y: [] };
26
+ }
27
+ function zeroInstrument(name, sub) {
28
+ return {
29
+ name,
30
+ volume: 0x40,
31
+ nsm: 0,
32
+ rls: 0,
33
+ map: new Array(121).fill(0),
34
+ mapXpo: new Array(121).fill(0),
35
+ sub,
36
+ aei: zeroEnvelope(),
37
+ fei: zeroEnvelope(),
38
+ pei: zeroEnvelope(),
39
+ };
40
+ }
41
+ /** libxmp_copy_adjust (common.c:237-253): printable ASCII, trim. */
42
+ function copyAdjust(r, n) {
43
+ let s = '';
44
+ for (let i = 0; i < n && i < r.length; i++) {
45
+ const c = r[i];
46
+ if (c === 0)
47
+ break; // strncpy stops at NUL (common.c:244)
48
+ s += c > 127 || c < 0x20 || c === 0x7f ? '.' : String.fromCharCode(c);
49
+ }
50
+ return s.replace(/ +$/, '');
51
+ }
52
+ /** readmem32b (dataio.c:190-198) — big-endian. */
53
+ function readmem32b(m, off) {
54
+ return ((m[off] << 24) | (m[off + 1] << 16) | (m[off + 2] << 8) | m[off + 3]) >>> 0;
55
+ }
56
+ /** readmem16b (dataio.c:168-175) — big-endian. */
57
+ function readmem16b(m, off) {
58
+ return (m[off] << 8) | m[off + 1];
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // sfx_test (sfx_load.c:39-53): 'SONG' at 4*15+4 or 4*31+4.
62
+ // ---------------------------------------------------------------------------
63
+ export function sfxTest(bytes) {
64
+ if (bytes.length < 136)
65
+ return false;
66
+ const a = readmem32b(bytes, 4 * 15);
67
+ const b = readmem32b(bytes, 4 * 31);
68
+ return a === MAGIC_SONG || b === MAGIC_SONG;
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // sfx_translate_effect (sfx_load.c:66-94)
72
+ // ---------------------------------------------------------------------------
73
+ function sfxTranslateEffect(e, fxt, fxp) {
74
+ e.fxp = fxp;
75
+ switch (fxt) {
76
+ case 0x01: // Arpeggio
77
+ e.fxt = FX_ARPEGGIO;
78
+ break;
79
+ case 0x02: // Pitch bend
80
+ if (e.fxp >> 4) {
81
+ e.fxt = FX_PORTA_DN;
82
+ e.fxp >>= 4;
83
+ }
84
+ else if (e.fxp & 0x0f) {
85
+ e.fxt = FX_PORTA_UP;
86
+ e.fxp &= 0x0f;
87
+ }
88
+ break;
89
+ case 0x5: // Add to volume
90
+ e.fxt = FX_VOL_ADD;
91
+ break;
92
+ case 0x6: // Subtract from volume
93
+ e.fxt = FX_VOL_SUB;
94
+ break;
95
+ case 0x7: // Add semitones to period
96
+ e.fxt = FX_PITCH_ADD;
97
+ break;
98
+ case 0x8: // Subtract semitones from period
99
+ e.fxt = FX_PITCH_SUB;
100
+ break;
101
+ default: // 0x03 LED on, 0x04 LED off, anything else
102
+ e.fxt = 0;
103
+ e.fxp = 0;
104
+ break;
105
+ }
106
+ }
107
+ // ---------------------------------------------------------------------------
108
+ // sfx_13_20_load (sfx_load.c:96-258)
109
+ // ---------------------------------------------------------------------------
110
+ function sfx1320Load(bytes, ctx, nins) {
111
+ let pos = 0;
112
+ const u8 = () => bytes[pos++];
113
+ const u16 = () => { const v = readmem16b(bytes, pos); pos += 2; return v; };
114
+ const u32 = () => { const v = readmem32b(bytes, pos); pos += 4; return v; };
115
+ const raw = (n) => { const s = bytes.subarray(pos, pos + n); pos += n; return s; };
116
+ // Sample sizes precede the header (sfx_load.c:126-127)
117
+ const insSize = [];
118
+ for (let i = 0; i < nins; i++)
119
+ insSize.push(u32());
120
+ const magic = u32();
121
+ const delay = u16();
122
+ if (delay < 178)
123
+ throw new ParseError('SFX: delay < 178'); // min for 10000bpm
124
+ raw(14); // unknown[7]
125
+ if (magic !== MAGIC_SONG)
126
+ throw new ParseError('SFX: bad magic');
127
+ const chn = 4;
128
+ const ins = nins;
129
+ // mod->bpm = 14565 * 122 / delay (sfx_load.c:136)
130
+ const bpm = Math.trunc((14565 * 122) / delay);
131
+ const insHeaders = [];
132
+ for (let i = 0; i < ins; i++) {
133
+ insHeaders.push({
134
+ name: raw(22),
135
+ len: u16(),
136
+ finetune: u8(),
137
+ volume: u8(),
138
+ loopStart: u16(),
139
+ loopLength: u16(),
140
+ });
141
+ }
142
+ // header2 (sfx_load.c:148-152)
143
+ const songLen = u8();
144
+ const restart = u8();
145
+ const order = raw(128);
146
+ if (order.length < 128)
147
+ throw new ParseError('SFX: order truncated');
148
+ if (songLen > 0x7f)
149
+ throw new ParseError('SFX: song length > 0x7f');
150
+ const len = songLen;
151
+ const xxo = [];
152
+ for (let i = 0; i < len; i++)
153
+ xxo.push(order[i]);
154
+ // pat = max(xxo)+1 (sfx_load.c:155-158)
155
+ let pat = 0;
156
+ for (let i = 0; i < len; i++) {
157
+ if (xxo[i] > pat)
158
+ pat = xxo[i];
159
+ }
160
+ pat++;
161
+ const typeStr = ins === 15 ? 'SoundFX 1.3' : 'SoundFX 2.0';
162
+ // Instruments + samples (sfx_load.c:169-201)
163
+ const instruments = [];
164
+ const rawSamples = [];
165
+ for (let i = 0; i < ins; i++) {
166
+ const h = insHeaders[i];
167
+ const xlen = insSize[i];
168
+ const lps = h.loopStart;
169
+ const lpe = lps + 2 * h.loopLength;
170
+ const xflg = h.loopLength > 1 ? SampleFlags.LOOP : 0;
171
+ const sub = {
172
+ vol: h.volume,
173
+ gvl: 0x40, // no QUIRK_INSVOL: load_epilogue sets gvl = volbase (load_helpers.c:377-383)
174
+ pan: -1, // XMP_INST_NO_DEFAULT_PAN
175
+ xpo: 0,
176
+ fin: (((h.finetune << 4) & 0xff) << 24) >> 24, // (int8)(finetune << 4) — "unsure"
177
+ vwf: 0, vde: 0, vra: 0, vsw: 0,
178
+ sid: i,
179
+ rvv: 0, nna: 0, dct: 0, dca: 0, ifc: 0, ifr: 0,
180
+ };
181
+ const nameStr = copyAdjust(h.name, 22);
182
+ const xi = zeroInstrument(nameStr, [sub]);
183
+ xi.nsm = 1; // sfx_load.c:182 — unconditionally
184
+ instruments.push(xi);
185
+ rawSamples.push({
186
+ // The C loader names only the INSTRUMENT — xxs->name stays empty.
187
+ name: '',
188
+ data: new Uint8Array(0),
189
+ length: xlen,
190
+ loopStart: lps,
191
+ loopEnd: lpe,
192
+ sustainStart: 0,
193
+ sustainEnd: 0,
194
+ finetune: sub.fin,
195
+ volume: h.volume,
196
+ flags: xflg,
197
+ c5spd: 8363,
198
+ });
199
+ }
200
+ // Patterns (sfx_load.c:206-237): 4-byte cells, MOD-style period.
201
+ const patterns = [];
202
+ for (let i = 0; i < pat; i++) {
203
+ const tracksArr = [];
204
+ for (let k = 0; k < chn; k++) {
205
+ const events = [];
206
+ for (let j = 0; j < 64; j++)
207
+ events.push({ ...EMPTY_EVENT });
208
+ tracksArr.push({ rows: 64, event: events });
209
+ }
210
+ const pattern = { rows: 64, tracks: tracksArr };
211
+ for (let j = 0; j < 64; j++) {
212
+ for (let k = 0; k < chn; k++) {
213
+ const e = pattern.tracks[k].event[j];
214
+ const ev = raw(4);
215
+ if (ev.length < 4)
216
+ throw new ParseError(`SFX: read error at pattern ${i}`);
217
+ e.note = periodToNote((LSN(ev[0]) << 8) | ev[1]);
218
+ e.ins = (MSN(ev[0]) << 4) | MSN(ev[2]);
219
+ sfxTranslateEffect(e, LSN(ev[2]), ev[3]);
220
+ }
221
+ }
222
+ patterns.push(pattern);
223
+ }
224
+ // Samples (sfx_load.c:244-252): skip len <= 2; no flags (signed PCM).
225
+ let samplePos = pos;
226
+ for (let i = 0; i < ins; i++) {
227
+ const rawS = rawSamples[i];
228
+ if (rawS.length <= 2) {
229
+ ctx.addSample(rawS);
230
+ continue;
231
+ }
232
+ const take = Math.min(rawS.length, Math.max(0, bytes.length - samplePos));
233
+ rawS.data = bytes.subarray(samplePos, samplePos + take);
234
+ samplePos += rawS.length;
235
+ ctx.addSample(rawS);
236
+ }
237
+ // m->quirk |= QUIRK_PBALL; m->period_type = PERIOD_MODRNG (:239-240)
238
+ const quirkFlags = Quirk.PBALL;
239
+ // Channel defaults: prologue LRLR
240
+ const chan = [];
241
+ for (let k = 0; k < chn; k++) {
242
+ const pan = Math.floor((k + 1) / 2) % 2 * 0xff;
243
+ chan.push({ pan: Math.min(255, Math.max(0, 0x80 + (pan - 0x80))), vol: 0x40, flg: 0 });
244
+ }
245
+ const mod = {
246
+ title: '',
247
+ format: 'sfx',
248
+ comment: '',
249
+ chn,
250
+ pat,
251
+ ins,
252
+ len,
253
+ restart,
254
+ xxo,
255
+ channels: chan,
256
+ patterns,
257
+ instruments,
258
+ samples: rawSamples,
259
+ num_sequences: 0,
260
+ sequences: [],
261
+ speed: 6,
262
+ bpm,
263
+ volbase: 0x40,
264
+ gvolbase: 0x40,
265
+ gvol: 0x40,
266
+ quirks: quirkFlags,
267
+ flowMode: 0,
268
+ readEventType: 0, // READ_EVENT_MOD
269
+ periodType: 1, // PERIOD_MODRNG
270
+ defpan: 0x80,
271
+ time_factor: 10,
272
+ rrate: 250,
273
+ c4rate: 8363, // prologue PAL default (sfx_load.c never sets c4rate)
274
+ compare_vblank: false,
275
+ tracker: typeStr,
276
+ };
277
+ void ctx.sampleRate;
278
+ void ctx.outputRate;
279
+ return mod;
280
+ }
281
+ // ---------------------------------------------------------------------------
282
+ // sfx_load (sfx_load.c:260-265): try 15, then 31 instruments.
283
+ // ---------------------------------------------------------------------------
284
+ export function sfxLoad(bytes, ctx) {
285
+ try {
286
+ return sfx1320Load(bytes, ctx, 15);
287
+ }
288
+ catch {
289
+ return sfx1320Load(bytes, ctx, 31);
290
+ }
291
+ }
292
+ // ---------------------------------------------------------------------------
293
+ // Plugin
294
+ // ---------------------------------------------------------------------------
295
+ /** SoundFX format plugin (libxmp loaders/sfx_load.c + read_event MOD). */
296
+ export const plugin = {
297
+ name: 'sfx',
298
+ test: sfxTest,
299
+ load: sfxLoad,
300
+ readEvent(core, chn, row) {
301
+ const mod = core.module;
302
+ const e = core.readEventScratch(chn) ?? core.readEventAt(mod.xxo[core.ctx.p.ord] ?? 0, chn, row);
303
+ readEventMod(core, e, chn);
304
+ },
305
+ };
306
+ //# sourceMappingURL=sfx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sfx.js","sourceRoot":"","sources":["../src/sfx.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,49 @@
1
1
  {
2
2
  "name": "@modplayjs/fmt-sfx",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.1",
4
+ "description": "SoundFX 1.3/2.0 format plugin for modplayjs (libxmp sfx_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
+ "sfx",
28
+ "soundfx",
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-sfx"
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
+ }