@modplayjs/fmt-mtm 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-mtm
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
+ **Multitracker (.mtm) format plugin** for `@modplayjs/core`, ported 1:1
4
+ from libxmp's `mtm_load.c`.
5
+
6
+ ## Install
7
+
8
+ ```sh
9
+ npm install @modplayjs/fmt-mtm
10
+ ```
11
+
12
+ ## Usage
13
+
14
+ ```ts
15
+ import { CorePlayer } from '@modplayjs/core';
16
+ import { plugin as mtmPlugin } from '@modplayjs/fmt-mtm';
17
+
18
+ const core = new CorePlayer();
19
+ core.registries.registerFormat(mtmPlugin);
20
+ core.loadModule(bytes);
21
+ ```
22
+
23
+ Part of the [modplayjs monorepo](../../README.md). BSD-3-Clause.
@@ -0,0 +1,2 @@
1
+ export { mtmTest, mtmLoad, plugin } from './mtm.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-mtm — Multitracker (.mtm) loader + event reader.
5
+ export { mtmTest, mtmLoad, plugin } from './mtm.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,kEAAkE;AAElE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
package/dist/mtm.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { FormatPlugin, LoadCtx, ModuleData } from '@modplayjs/core';
2
+ export declare function mtmTest(bytes: Uint8Array): boolean;
3
+ export declare function mtmLoad(bytes: Uint8Array, ctx: LoadCtx): ModuleData;
4
+ /** MTM format plugin (libxmp loaders/mtm_load.c + read_event MOD). */
5
+ export declare const plugin: FormatPlugin;
6
+ //# sourceMappingURL=mtm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mtm.d.ts","sourceRoot":"","sources":["../src/mtm.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAQ,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA8E/E,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAKlD;AAMD,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAG,UAAU,CAuRnE;AAMD,sEAAsE;AACtE,eAAO,MAAM,MAAM,EAAE,YAYpB,CAAC"}
package/dist/mtm.js ADDED
@@ -0,0 +1,380 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: libxmp src/loaders/mtm_load.c (mtm_test :65-82,
4
+ // mtm_load :84-345).
5
+ //
6
+ // Multitracker (.mtm): row format is 3 bytes/note; one shared track bank
7
+ // (track 0 = empty) referenced by per-pattern per-channel track numbers.
8
+ import { SampleFlags } from '@modplayjs/core';
9
+ import { LSN, MSN } from '@modplayjs/core';
10
+ import { ParseError } from '@modplayjs/core';
11
+ import { FX_BREAK, FX_EXTENDED, FX_IT_BREAK, FX_SETPAN, FX_SPEED, } from '@modplayjs/core';
12
+ import { readEventMod } from '@modplayjs/fmt-mod';
13
+ /** MAX_SAMPLE_SIZE (common.h:460). */
14
+ const MAX_SAMPLE_SIZE = 0x10000000;
15
+ /** XMP_MAX_CHANNELS (xmp.h:132). */
16
+ const XMP_MAX_CHANNELS = 64;
17
+ /** SAMPLE_FLAG_UNS parity (loader.h; DecodeFlag.UNSIGNED). */
18
+ const SAMPLE_FLAG_UNS = 1 << 10;
19
+ /** Zeroed envelope (libxmp_init_instrument calloc semantics). */
20
+ function zeroEnvelope() {
21
+ return { flags: 0, npt: 0, scl: 0, sus: 0, sue: 0, lps: 0, lpe: 0, x: [], y: [] };
22
+ }
23
+ function zeroInstrument(name, sub) {
24
+ return {
25
+ name,
26
+ volume: 0x40,
27
+ nsm: 0,
28
+ rls: 0,
29
+ map: new Array(121).fill(0),
30
+ mapXpo: new Array(121).fill(0),
31
+ sub,
32
+ aei: zeroEnvelope(),
33
+ fei: zeroEnvelope(),
34
+ pei: zeroEnvelope(),
35
+ };
36
+ }
37
+ function readmem16l(m, off) {
38
+ return m[off] | (m[off + 1] << 8);
39
+ }
40
+ function readmem32l(m, off) {
41
+ return (m[off] | (m[off + 1] << 8) | (m[off + 2] << 16) | (m[off + 3] << 24)) >>> 0;
42
+ }
43
+ /** libxmp_copy_adjust-style name (printable ASCII, trim). */
44
+ function copyTitle(r, n) {
45
+ // C: strncpy(mod->name, name, n) is RAW — the control→' ' mapping happens
46
+ // later in libxmp_adjust_string (load.c:298). Only instrument/sample names
47
+ // go through libxmp_copy_adjust's dot substitution.
48
+ let s = '';
49
+ for (let i = 0; i < n && i < r.length; i++) {
50
+ const c = r[i];
51
+ if (c === 0)
52
+ break;
53
+ s += String.fromCharCode(c);
54
+ }
55
+ return s.replace(/ +$/, '');
56
+ }
57
+ function copyAdjust(r, n) {
58
+ let s = '';
59
+ for (let i = 0; i < n && i < r.length; i++) {
60
+ const c = r[i];
61
+ if (c === 0)
62
+ break; // strncpy stops at NUL (common.c:244)
63
+ s += c > 127 || c < 0x20 || c === 0x7f ? '.' : String.fromCharCode(c);
64
+ }
65
+ return s.replace(/ +$/, '');
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // mtm_test (mtm_load.c:65-82)
69
+ // ---------------------------------------------------------------------------
70
+ export function mtmTest(bytes) {
71
+ if (bytes.length < 4)
72
+ return false;
73
+ if (bytes[0] !== 0x4d || bytes[1] !== 0x54 || bytes[2] !== 0x4d)
74
+ return false; // "MTM"
75
+ if (bytes[3] !== 0x10)
76
+ return false; // version 1.0 only
77
+ return true;
78
+ }
79
+ // ---------------------------------------------------------------------------
80
+ // mtm_load (mtm_load.c:84-345)
81
+ // ---------------------------------------------------------------------------
82
+ export function mtmLoad(bytes, ctx) {
83
+ let pos = 0;
84
+ const u8 = () => bytes[pos++];
85
+ const u16 = () => { const v = readmem16l(bytes, pos); pos += 2; return v; };
86
+ const u32 = () => { const v = readmem32l(bytes, pos); pos += 4; return v; };
87
+ const raw = (n) => { const s = bytes.subarray(pos, pos + n); pos += n; return s; };
88
+ // Header (mtm_load.c:90-123)
89
+ const magic = raw(3);
90
+ if (magic[0] !== 0x4d || magic[1] !== 0x54 || magic[2] !== 0x4d) {
91
+ throw new ParseError('MTM: bad magic');
92
+ }
93
+ const version = u8();
94
+ const name = raw(20);
95
+ const tracks = u16(); // number of tracks saved
96
+ const patternCount = u8(); // number of patterns saved
97
+ const modlen = u8(); // module length
98
+ const extralen = u16(); // comment field length
99
+ const samples = u8();
100
+ if (samples > 63)
101
+ throw new ParseError('MTM: too many samples');
102
+ const attr = u8(); // always zero
103
+ void attr;
104
+ const rows = u8();
105
+ if (rows !== 64)
106
+ throw new ParseError('MTM: rows != 64');
107
+ const channels = u8();
108
+ if (channels > Math.min(32, XMP_MAX_CHANNELS))
109
+ throw new ParseError('MTM: too many channels');
110
+ const pan = raw(32);
111
+ // mtm_load.c:127-137 — counts are stored -1.
112
+ const trk = tracks + 1; // + shared empty track 0
113
+ const patCount = patternCount + 1;
114
+ const len = modlen + 1;
115
+ const ins = samples;
116
+ // Instruments (mtm_load.c:145-183)
117
+ const instruments = [];
118
+ const rawSamples = [];
119
+ for (let i = 0; i < ins; i++) {
120
+ const iname = raw(22);
121
+ const ilength = u32(); // length in bytes
122
+ if (ilength > MAX_SAMPLE_SIZE)
123
+ throw new ParseError('MTM: sample too large');
124
+ const loopStart = u32();
125
+ const loopend = u32();
126
+ const finetune = u8();
127
+ const volume = u8();
128
+ const iattr = u8(); // &0x01: 16-bit sample
129
+ let xlen = ilength;
130
+ let lps = loopStart;
131
+ let lpe = loopend;
132
+ let xflg = lpe > 2 ? SampleFlags.LOOP : 0;
133
+ if ((iattr & 1) !== 0) {
134
+ xflg |= SampleFlags.BITS16;
135
+ xlen >>= 1;
136
+ lps >>= 1;
137
+ lpe >>= 1;
138
+ }
139
+ const sub = {
140
+ vol: volume,
141
+ gvl: 0x40, // no QUIRK_INSVOL: load_epilogue sets gvl = volbase (load_helpers.c:377-383)
142
+ pan: -1, // XMP_INST_NO_DEFAULT_PAN
143
+ xpo: 0,
144
+ fin: (((finetune << 4) & 0xff) << 24) >> 24, // (int8)(finetune << 4)
145
+ vwf: 0,
146
+ vde: 0,
147
+ vra: 0,
148
+ vsw: 0,
149
+ sid: i,
150
+ rvv: 0,
151
+ nna: 0,
152
+ dct: 0,
153
+ dca: 0,
154
+ ifc: 0,
155
+ ifr: 0,
156
+ };
157
+ const nameStr = copyAdjust(iname, 22);
158
+ const xi = zeroInstrument(nameStr, [sub]);
159
+ if (xlen > 0)
160
+ xi.nsm = 1;
161
+ instruments.push(xi);
162
+ rawSamples.push({
163
+ // mtm_load.c names only the INSTRUMENT (libxmp_instrument_name,
164
+ // mtm_load.c:178) — xxs->name stays empty in C.
165
+ name: '',
166
+ data: new Uint8Array(0), // filled below
167
+ length: xlen,
168
+ loopStart: lps,
169
+ loopEnd: lpe,
170
+ sustainStart: 0,
171
+ sustainEnd: 0,
172
+ finetune: sub.fin,
173
+ volume,
174
+ flags: xflg,
175
+ // libxmp_init_instrument (loaders/common.c:63): xtra[i].c5spd = m->c4rate.
176
+ // MTM never overrides c4rate → PAL prologue default (8287).
177
+ c5spd: 8287,
178
+ });
179
+ }
180
+ // Order table (mtm_load.c:186): 128 bytes.
181
+ const xxoRaw = raw(128);
182
+ const xxo = [];
183
+ for (let i = 0; i < len && i < 128; i++)
184
+ xxo.push(xxoRaw[i]);
185
+ const trackBank = [];
186
+ // Track 0: all empty.
187
+ {
188
+ const ev = [];
189
+ for (let j = 0; j < rows; j++)
190
+ ev.push({ note: 0, ins: 0, vol: 0, fxt: 0, fxp: 0, f2t: 0, f2p: 0 });
191
+ trackBank.push(ev);
192
+ }
193
+ // Tempo-mode detection markers (mtm_load.c:199).
194
+ let fxxLow = 0;
195
+ let fxxHigh = 0;
196
+ for (let i = 1; i < trk; i++) {
197
+ const mt = raw(3 * 64);
198
+ if (mt.length < 3 * 64)
199
+ throw new ParseError('MTM: track data truncated');
200
+ const ev = [];
201
+ for (let j = 0; j < 64; j++) {
202
+ const d = j * 3;
203
+ const e = { note: 0, ins: 0, vol: 0, fxt: 0, fxp: 0, f2t: 0, f2p: 0 };
204
+ e.note = mt[d] >> 2;
205
+ if (e.note !== 0)
206
+ e.note += 37;
207
+ e.ins = ((mt[d] & 0x3) << 4) | MSN(mt[d + 1]);
208
+ e.fxt = LSN(mt[d + 1]);
209
+ e.fxp = mt[d + 2];
210
+ if (e.fxt > FX_SPEED) {
211
+ e.fxt = 0;
212
+ e.fxp = 0;
213
+ }
214
+ // Break is hex (mtm_load.c:226-229).
215
+ if (e.fxt === FX_BREAK)
216
+ e.fxt = FX_IT_BREAK;
217
+ // Tempo-mode detection markers (mtm_load.c:232-235).
218
+ if (e.fxt === FX_SPEED) {
219
+ if (e.fxp >= 0x20)
220
+ fxxHigh = 1;
221
+ else
222
+ fxxLow = 1;
223
+ }
224
+ // Set pan effect translation (mtm_load.c:238-242).
225
+ if (e.fxt === FX_EXTENDED && MSN(e.fxp) === 0x8) {
226
+ e.fxt = FX_SETPAN;
227
+ e.fxp <<= 4;
228
+ }
229
+ ev.push(e);
230
+ }
231
+ trackBank.push(ev);
232
+ }
233
+ // Patterns (mtm_load.c:237-258): 32 track numbers per pattern, u16 each.
234
+ const patterns = [];
235
+ for (let i = 0; i < patCount; i++) {
236
+ const index = [];
237
+ for (let j = 0; j < 32; j++) {
238
+ let track = u16();
239
+ if (track >= trk)
240
+ track = 0;
241
+ if (j < channels)
242
+ index.push(track);
243
+ }
244
+ const tracksArr = [];
245
+ for (let j = 0; j < channels; j++) {
246
+ tracksArr.push({ rows, event: trackBank[index[j]] });
247
+ }
248
+ patterns.push({ rows, tracks: tracksArr });
249
+ }
250
+ // Tempo mode detection (mtm_load.c:261-318).
251
+ if (fxxLow !== 0 && fxxHigh !== 0) {
252
+ // Both used — check for same-row usage (DMP-style, no injection needed).
253
+ let dmp = false;
254
+ outer: for (let i = 0; i < patCount; i++) {
255
+ for (let j = 0; j < rows; j++) {
256
+ let lo = 0;
257
+ let hi = 0;
258
+ for (let k = 0; k < channels; k++) {
259
+ const e2 = patterns[i].tracks[k].event[j];
260
+ if (e2.fxt === FX_SPEED) {
261
+ if (e2.fxp >= 0x20)
262
+ hi = 1;
263
+ else
264
+ lo = 1;
265
+ }
266
+ }
267
+ if (lo !== 0 && hi !== 0) {
268
+ // Same row, no change required (mtm_load.c:289-294).
269
+ dmp = true;
270
+ break outer;
271
+ }
272
+ }
273
+ }
274
+ if (!dmp) {
275
+ // Probably MT; inject speed/BPM reset effects into the secondary slot
276
+ // (mtm_load.c:296-315): speed set → tempo 125; tempo set → speed 6.
277
+ for (let i = 0; i < patCount; i++) {
278
+ for (let j = 0; j < channels; j++) {
279
+ for (const e of patterns[i].tracks[j].event) {
280
+ if (e.fxt === FX_SPEED) {
281
+ e.f2t = FX_SPEED;
282
+ e.f2p = e.fxp < 0x20 ? 125 : 6;
283
+ }
284
+ }
285
+ }
286
+ }
287
+ }
288
+ }
289
+ // Comments (mtm_load.c:320-341): 40-byte ASCIIZ lines.
290
+ let comment = '';
291
+ if (extralen !== 0) {
292
+ const cbuf = raw(extralen);
293
+ let lastLine = 0;
294
+ for (let i = 0; i + 40 <= cbuf.length; i += 40) {
295
+ if (cbuf[i] !== 0)
296
+ lastLine = i + 40;
297
+ }
298
+ for (let line = 0; line < lastLine; line += 40) {
299
+ for (let i = 0; i < 39; i++) {
300
+ const c = cbuf[line + i];
301
+ if (c === 0)
302
+ break;
303
+ comment += String.fromCharCode(c);
304
+ }
305
+ comment += '\n';
306
+ }
307
+ }
308
+ // Samples (mtm_load.c:344-347): SAMPLE_FLAG_UNS (unsigned PCM).
309
+ let sampleDataPos = pos;
310
+ for (let i = 0; i < ins; i++) {
311
+ const rawS = rawSamples[i];
312
+ const is16bit = (rawS.flags & SampleFlags.BITS16) !== 0;
313
+ const bytelen = rawS.length * (is16bit ? 2 : 1);
314
+ const remaining = bytes.length - sampleDataPos;
315
+ const take = Math.min(bytelen, Math.max(0, remaining));
316
+ rawS.data = bytes.subarray(sampleDataPos, sampleDataPos + take);
317
+ rawS.flags |= SAMPLE_FLAG_UNS;
318
+ sampleDataPos += bytelen; // hio_read advances by requested count
319
+ ctx.addSample(rawS);
320
+ }
321
+ // Channel pans (mtm_load.c:349-350): pan[i] << 4.
322
+ const chan = [];
323
+ for (let i = 0; i < channels; i++) {
324
+ chan.push({ pan: pan[i] << 4, vol: 0x40, flg: 0 });
325
+ }
326
+ const mod = {
327
+ title: copyTitle(name, 20),
328
+ format: 'mtm',
329
+ comment,
330
+ chn: channels,
331
+ pat: patCount,
332
+ ins,
333
+ len,
334
+ restart: 0,
335
+ xxo,
336
+ channels: chan,
337
+ patterns,
338
+ instruments,
339
+ samples: rawSamples,
340
+ num_sequences: 0,
341
+ sequences: [],
342
+ speed: 6,
343
+ bpm: 125,
344
+ volbase: 0x40,
345
+ gvolbase: 0x40,
346
+ gvol: 0x40,
347
+ quirks: 0,
348
+ flowMode: 0,
349
+ readEventType: 0, // READ_EVENT_MOD
350
+ periodType: 0,
351
+ defpan: 0x80,
352
+ time_factor: 10,
353
+ rrate: 250,
354
+ // mtm_load.c never sets c4rate — libxmp_load_prologue default applies
355
+ // (load_helpers.c:302): m->c4rate = C4_PAL_RATE (8287).
356
+ c4rate: 8287,
357
+ compare_vblank: false,
358
+ tracker: `MultiTracker ${(version >> 4)}.${String(version & 0xf).padStart(2, '0')} MTM`,
359
+ };
360
+ void ctx.sampleRate;
361
+ void ctx.outputRate;
362
+ return mod;
363
+ }
364
+ // ---------------------------------------------------------------------------
365
+ // Plugin
366
+ // ---------------------------------------------------------------------------
367
+ /** MTM format plugin (libxmp loaders/mtm_load.c + read_event MOD). */
368
+ export const plugin = {
369
+ name: 'mtm',
370
+ test: mtmTest,
371
+ load: mtmLoad,
372
+ readEvent(core, chn, row) {
373
+ // MTM dispatches READ_EVENT_MOD (mtm_load.c leaves read_event_type at
374
+ // the prologue default).
375
+ const mod = core.module;
376
+ const e = core.readEventScratch(chn) ?? core.readEventAt(mod.xxo[core.ctx.p.ord] ?? 0, chn, row);
377
+ readEventMod(core, e, chn);
378
+ },
379
+ };
380
+ //# sourceMappingURL=mtm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mtm.js","sourceRoot":"","sources":["../src/mtm.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,49 @@
1
1
  {
2
2
  "name": "@modplayjs/fmt-mtm",
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": "Multitracker (.mtm) format plugin for modplayjs (libxmp mtm_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
+ "mtm",
28
+ "multitracker",
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-mtm"
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
+ }