@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 +22 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/mtm.d.ts +6 -0
- package/dist/mtm.d.ts.map +1 -0
- package/dist/mtm.js +380 -0
- package/dist/mtm.js.map +1 -0
- package/package.json +47 -4
package/README.md
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @modplayjs/fmt-mtm
|
|
2
2
|
|
|
3
|
-
|
|
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.
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
package/dist/mtm.js.map
ADDED
|
@@ -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.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
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
|
+
}
|