@modplayjs/fmt-med 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/dist/mmd3.js ADDED
@@ -0,0 +1,440 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: libxmp src/loaders/mmd3_load.c (mmd3_test :48-72,
4
+ // mmd3_load :74-597). MMD2/MMD3 = OctaMED / OctaMED Soundstudio.
5
+ import { C4_NTSC_RATE, ParseError, Quirk, ReadEventType, } from '@modplayjs/core';
6
+ import { FLAG2_BMASK, FLAG2_BPM, FLAG_8CHANNEL, FLAG_STSLIDE, FLAG_VOLHEX, MMD_NUM_OCT, MED_TIME_FACTOR, mmdSetBpm, mmdTrackerVersion, mmdXlatFx, readInstrExtArray, readInstrInfoArray, zeroExpData, zeroInstrExt, } from './mmdCommon.js';
7
+ import { mmdLoadInstrument, } from './instr.js';
8
+ const XMP_MAX_KEYS = 121;
9
+ /** mmd3_test (mmd3_load.c:48-72). */
10
+ export function mmd3Test(bytes) {
11
+ if (bytes.length < 4)
12
+ return false;
13
+ const id = String.fromCharCode(bytes[0], bytes[1], bytes[2], bytes[3]);
14
+ return id === 'MMD2' || id === 'MMD3';
15
+ }
16
+ /** Title read shared with mmd1 (mmd3_test). */
17
+ export { mmdReadTitle } from './mmd1.js';
18
+ /**
19
+ * mmd3_load (mmd3_load.c:74-597).
20
+ */
21
+ export function mmd3Load(bytes, ctx) {
22
+ const start = 0;
23
+ let pos = start;
24
+ // hio_read8/16b/32b return all-ones on EOF (dataio.c read8/read16b/
25
+ // read32b error returns) — a truncated header must be seen as 0xffff...,
26
+ // not as zeros (load_mmd0_truncated.med).
27
+ const u8 = () => {
28
+ const v = pos < bytes.length ? bytes[pos] : 0xff;
29
+ pos++;
30
+ return v;
31
+ };
32
+ const s8 = () => ((u8() << 24) >> 24);
33
+ const u16 = () => {
34
+ if (pos + 2 > bytes.length) {
35
+ pos += 2;
36
+ return 0xffff;
37
+ }
38
+ const v = (bytes[pos] << 8) | bytes[pos + 1];
39
+ pos += 2;
40
+ return v;
41
+ };
42
+ const s16 = () => (u16() << 16) >> 16;
43
+ const u32 = () => {
44
+ if (pos + 4 > bytes.length) {
45
+ pos += 4;
46
+ return 0xffffffff;
47
+ }
48
+ const v = ((bytes[pos] << 24) | (bytes[pos + 1] << 16) |
49
+ (bytes[pos + 2] << 8) | bytes[pos + 3]) >>> 0;
50
+ pos += 4;
51
+ return v;
52
+ };
53
+ /** C `int` read of a 32-bit field (offset fields are signed ints). */
54
+ const s32 = () => u32() | 0;
55
+ const seek = (p) => {
56
+ // hio_seek fails for negative targets; offsets are C `int`.
57
+ if (p < 0)
58
+ throw new ParseError('MED: seek error');
59
+ pos = p;
60
+ };
61
+ const skip = (n) => { pos += n; };
62
+ const raw = (n) => { const s = bytes.subarray(pos, pos + n); pos += n; return s; };
63
+ const id = String.fromCharCode(bytes[0], bytes[1], bytes[2], bytes[3]);
64
+ void id;
65
+ const ver = bytes[3] - '1'.charCodeAt(0) + 1;
66
+ // Header (mmd3_load.c:117-123).
67
+ seek(start + 4);
68
+ u32(); // modlen
69
+ const songOffset = s32();
70
+ skip(4); // psecnum + pseq
71
+ const blockarrOffset = s32();
72
+ u32(); // reserved
73
+ const smplarrOffset = s32();
74
+ u32(); // reserved2
75
+ const expdataOffset = s32();
76
+ u32(); // reserved3
77
+ skip(10); // pstate/pblock/pline/pseqnum/actplayline
78
+ u8(); // counter
79
+ u8(); // extra_songs
80
+ // Song structure — MMD2song (mmd3_load.c:128-171).
81
+ seek(start + songOffset);
82
+ const song = [];
83
+ for (let i = 0; i < 63; i++) {
84
+ song.push({
85
+ rep: u16(), replen: u16(), midich: u8(), midipreset: u8(),
86
+ svol: u8(), strans: s8(),
87
+ });
88
+ }
89
+ const numblocks = u16();
90
+ const songlen = u16(); // NOTE: number of sections in MMD2
91
+ void songlen;
92
+ const seqtableOffset = u32();
93
+ u32(); // reserved
94
+ const trackvolsOffset = u32();
95
+ const numtracks = u16();
96
+ const numpseqs = u16();
97
+ const trackpansOffset = u32();
98
+ u32(); // flags3
99
+ u16(); // voladj
100
+ u16(); // channels
101
+ u8(); // mix_echotype
102
+ u8(); // mix_echodepth
103
+ u16(); // mix_echolen
104
+ s8(); // mix_stereosep
105
+ skip(223); // pad0
106
+ const deftempo = u16();
107
+ const playtransp = s8();
108
+ const flags = u8();
109
+ const flags2 = u8();
110
+ const tempo2 = u8();
111
+ skip(16); // pad1 (used to be trackvols)
112
+ u8(); // mastervol
113
+ const numsamples = u8();
114
+ if (numsamples > 63) {
115
+ throw new ParseError(`MED: invalid instrument count ${numsamples}`);
116
+ }
117
+ // Read sequence (mmd3_load.c:174-192).
118
+ seek(start + seqtableOffset);
119
+ const playseqOffset = u32();
120
+ seek(start + playseqOffset);
121
+ skip(32); // skip name
122
+ u32();
123
+ u32();
124
+ const len = u16();
125
+ if (len > 255) {
126
+ throw new ParseError(`MED: unsupported song length ${len}`);
127
+ }
128
+ const xxo = [];
129
+ for (let i = 0; i < len; i++)
130
+ xxo.push(u16());
131
+ // Convert header (mmd3_load.c:195-213).
132
+ let quirks = Quirk.RTONCE;
133
+ const stslide = (flags & FLAG_STSLIDE) !== 0;
134
+ if (!stslide)
135
+ quirks |= Quirk.VSALL | Quirk.PBALL;
136
+ const hexvol = (flags & FLAG_VOLHEX) !== 0 ? 1 : 0;
137
+ const med8ch = (flags & FLAG_8CHANNEL) !== 0 ? 1 : 0;
138
+ const bpmOn = (flags2 & FLAG2_BPM) !== 0 ? 1 : 0;
139
+ const bpmlen = 1 + (flags2 & FLAG2_BMASK);
140
+ const { bpm, timeFactor } = mmdSetBpm(med8ch, deftempo, bpmOn, bpmlen);
141
+ void timeFactor;
142
+ const pat = numblocks;
143
+ const ins = numsamples;
144
+ // Read smplarr (mmd3_load.c:218-233).
145
+ const smplarr = [];
146
+ seek(start + smplarrOffset);
147
+ for (let i = 0; i < ins; i++) {
148
+ if (pos >= bytes.length)
149
+ throw new ParseError(`MED: read error at smplarr pos ${i}`);
150
+ smplarr.push(s32());
151
+ }
152
+ // Sample count scan (mmd3_load.c:238-258).
153
+ let smp = 0;
154
+ for (let i = 0; i < ins; i++) {
155
+ if (smplarr[i] === 0)
156
+ continue;
157
+ seek(start + smplarr[i]);
158
+ u32(); // length
159
+ const type = s16();
160
+ if (type === -1 || type === -2) {
161
+ skip(14);
162
+ smp += u16(); // wforms
163
+ }
164
+ else if (type >= 1 && type <= 6) {
165
+ smp += MMD_NUM_OCT[type - 1];
166
+ }
167
+ else {
168
+ smp++;
169
+ }
170
+ if (pos > bytes.length)
171
+ throw new ParseError(`MED: read error at sample ${i}`);
172
+ }
173
+ // Sample count sanity (libxmp_init_instrument, loaders/common.c:46-52).
174
+ if (smp > 1024 /* MAX_SAMPLES */) {
175
+ throw new ParseError(`MED: too many samples (${smp})`);
176
+ }
177
+ // Expdata (mmd3_load.c:263-322).
178
+ const expdata = zeroExpData();
179
+ let expsmpOffset = 0;
180
+ let iinfoOffset = 0;
181
+ let songnameOffset = 0;
182
+ let mmdinfoOffset = 0;
183
+ let title = '';
184
+ let comment = '';
185
+ if (expdataOffset) {
186
+ seek(start + expdataOffset);
187
+ u32(); // nextmod
188
+ expsmpOffset = s32();
189
+ expdata.s_ext_entries = u16();
190
+ expdata.s_ext_entrsz = u16();
191
+ u32(); // annotxt
192
+ u32(); // annolen
193
+ iinfoOffset = s32();
194
+ expdata.i_ext_entries = u16();
195
+ expdata.i_ext_entrsz = u16();
196
+ if (expsmpOffset < 0 || iinfoOffset < 0) {
197
+ throw new ParseError('MED: invalid expdata');
198
+ }
199
+ u32(); // jumpmask
200
+ u32(); // rgbtable
201
+ u32(); // channelsplit
202
+ u32(); // n_info
203
+ songnameOffset = s32();
204
+ expdata.songnamelen = u32();
205
+ u32(); // dumps
206
+ mmdinfoOffset = u32();
207
+ if (pos > bytes.length)
208
+ throw new ParseError('MED: read error in expdata');
209
+ seek(start + songnameOffset);
210
+ let s = '';
211
+ for (let i = 0; i < expdata.songnamelen; i++) {
212
+ if (i >= 64)
213
+ break; // XMP_NAME_SIZE
214
+ const c = u8();
215
+ if (c === 0)
216
+ break;
217
+ s += String.fromCharCode(c);
218
+ }
219
+ title = s;
220
+ if (mmdinfoOffset !== 0) {
221
+ // mmd_info_text (mmd_common.c:1056-1076): only ASCII type 1.
222
+ seek(start + mmdinfoOffset);
223
+ u32(); // skip next
224
+ u16(); // skip reserved
225
+ const type = u16();
226
+ if (type === 1) {
227
+ const infoLen = u32();
228
+ if (infoLen > 0 && infoLen < bytes.length) {
229
+ const buf = raw(infoLen);
230
+ let c = '';
231
+ for (let i = 0; i < buf.length; i++) {
232
+ const ch = buf[i];
233
+ if (ch === 0)
234
+ break;
235
+ c += String.fromCharCode(ch);
236
+ }
237
+ comment = c;
238
+ }
239
+ }
240
+ }
241
+ }
242
+ // Read blockarr (mmd3_load.c:326-342).
243
+ const blockarr = [];
244
+ seek(start + blockarrOffset);
245
+ for (let i = 0; i < pat; i++) {
246
+ if (pos > bytes.length)
247
+ throw new ParseError(`MED: read error at blockarr pos ${i}`);
248
+ blockarr.push(u32());
249
+ }
250
+ // Scan patterns for channel count (mmd3_load.c:347-384).
251
+ let chn = 0;
252
+ let maxLines = 1;
253
+ for (let i = 0; i < pat; i++) {
254
+ if (blockarr[i] === 0)
255
+ continue;
256
+ seek(start + blockarr[i]);
257
+ const blockNumtracks = u16();
258
+ const blockLines = u16();
259
+ if (pos > bytes.length)
260
+ throw new ParseError(`MED: read error at block ${i}`);
261
+ // MED Soundstudio for Windows allows up to 9999 lines.
262
+ if (blockLines + 1 > 9999) {
263
+ throw new ParseError(`MED: invalid line count ${blockLines + 1} in block ${i}`);
264
+ }
265
+ if (blockNumtracks > chn)
266
+ chn = blockNumtracks;
267
+ if (blockLines + 1 > maxLines)
268
+ maxLines = blockLines + 1;
269
+ }
270
+ if (chn <= 0 || chn > 64) {
271
+ throw new ParseError(`MED: invalid channel count ${chn}`);
272
+ }
273
+ void numtracks;
274
+ void numpseqs;
275
+ const { medver, type } = mmdTrackerVersion(ver, 0, med8ch, expdataOffset ? expdata : null);
276
+ void maxLines;
277
+ // Patterns (mmd3_load.c:399-452).
278
+ const patterns = [];
279
+ for (let i = 0; i < pat; i++) {
280
+ if (blockarr[i] === 0) {
281
+ const tracks = [];
282
+ for (let k = 0; k < chn; k++) {
283
+ const ev = [];
284
+ for (let j = 0; j < 64; j++)
285
+ ev.push({ note: 0, ins: 0, vol: 0, fxt: 0, fxp: 0, f2t: 0, f2p: 0 });
286
+ tracks.push({ rows: 64, event: ev });
287
+ }
288
+ patterns.push({ rows: 64, tracks });
289
+ continue;
290
+ }
291
+ seek(start + blockarr[i]);
292
+ const blockNumtracks = u16();
293
+ const blockLines = u16();
294
+ u32(); // FIXME: should try to load extra command pages when they exist.
295
+ const rows = blockLines + 1;
296
+ const size = blockNumtracks * rows * 4;
297
+ if (pos + size > bytes.length) {
298
+ throw new ParseError(`MED: read error in block ${i}`);
299
+ }
300
+ const patbuf = bytes.subarray(pos, pos + size);
301
+ pos += size;
302
+ const perTrack = [];
303
+ for (let k = 0; k < chn; k++) {
304
+ const evs = [];
305
+ for (let j = 0; j < rows; j++)
306
+ evs.push({ note: 0, ins: 0, vol: 0, fxt: 0, fxp: 0, f2t: 0, f2p: 0 });
307
+ perTrack.push(evs);
308
+ }
309
+ let p = 0;
310
+ for (let j = 0; j < rows; j++) {
311
+ for (let k = 0; k < blockNumtracks; k++) {
312
+ const e = { note: 0, ins: 0, vol: 0, fxt: 0, fxp: 0, f2t: 0, f2p: 0 };
313
+ e.note = patbuf[p] & 0x7f;
314
+ if (e.note)
315
+ e.note += 12 + playtransp;
316
+ if (e.note >= XMP_MAX_KEYS)
317
+ e.note = 0;
318
+ e.ins = patbuf[p + 1] & 0x3f;
319
+ e.fxt = patbuf[p + 2];
320
+ e.fxp = patbuf[p + 3];
321
+ mmdXlatFx(e, bpmOn, bpmlen, med8ch, hexvol);
322
+ perTrack[k][j] = e;
323
+ p += 4;
324
+ }
325
+ }
326
+ const tracksArr = [];
327
+ for (let k = 0; k < chn; k++)
328
+ tracksArr.push({ rows, event: perTrack[k] });
329
+ patterns.push({ rows, tracks: tracksArr });
330
+ }
331
+ // Instruments (mmd3_load.c:462-551).
332
+ const instruments = [];
333
+ for (let i = 0; i < ins; i++) {
334
+ instruments.push({
335
+ name: '',
336
+ volume: 0x40,
337
+ nsm: 0,
338
+ rls: 0,
339
+ map: new Array(121).fill(0),
340
+ mapXpo: new Array(121).fill(0),
341
+ sub: [],
342
+ aei: { flags: 0, npt: 0, scl: 0, sus: 0, sue: 0, lps: 0, lpe: 0, x: [], y: [] },
343
+ fei: { flags: 0, npt: 0, scl: 0, sus: 0, sue: 0, lps: 0, lpe: 0, x: [], y: [] },
344
+ pei: { flags: 0, npt: 0, scl: 0, sus: 0, sue: 0, lps: 0, lpe: 0, x: [], y: [] },
345
+ });
346
+ }
347
+ const expSmp = new Array(ins);
348
+ for (let i = 0; i < ins; i++)
349
+ expSmp[i] = zeroInstrExt();
350
+ if (expsmpOffset) {
351
+ seek(start + expsmpOffset);
352
+ const list = readInstrExtArray((n) => { if (n)
353
+ skip(n); return u8(); }, () => u16(), () => u32(), (d) => skip(d), ins, expdata, true);
354
+ // hio_error(f) after each entry read (mmd3_load.c:492-495).
355
+ if (pos > bytes.length)
356
+ throw new ParseError('MED: read error at expsmp');
357
+ for (let i = 0; i < list.length; i++)
358
+ expSmp[i] = list[i];
359
+ }
360
+ // Instrument names.
361
+ if (iinfoOffset) {
362
+ seek(start + iinfoOffset);
363
+ const names = readInstrInfoArray((n) => raw(n), (d) => skip(d), ins, expdata);
364
+ for (let i = 0; i < names.length && i < ins; i++) {
365
+ // libxmp_instrument_name (common.c:230-234) clamps to 31 chars.
366
+ instruments[i].name = names[i].slice(0, 31);
367
+ }
368
+ }
369
+ // Sample data (mmd3_load.c:553-571).
370
+ const samples = new Array(smp);
371
+ const st = {
372
+ bytes, start, pos, ver, samples, instruments, expdata, expSmp, song,
373
+ };
374
+ let smpIdx = 0;
375
+ for (let i = 0; i < ins; i++) {
376
+ if (smplarr[i] === 0)
377
+ continue;
378
+ st.pos = start + smplarr[i];
379
+ smpIdx = mmdLoadInstrument(st, i, smpIdx);
380
+ }
381
+ void smpIdx;
382
+ for (const raw of samples) {
383
+ if (raw)
384
+ ctx.addSample(raw);
385
+ }
386
+ // Track volumes + pans (mmd3_load.c:573-590).
387
+ const channels = [];
388
+ seek(start + trackvolsOffset);
389
+ for (let i = 0; i < chn; i++) {
390
+ channels.push({ vol: u8(), pan: 0x80, flg: 0 });
391
+ }
392
+ if (trackpansOffset) {
393
+ seek(start + trackpansOffset);
394
+ for (let i = 0; i < chn; i++) {
395
+ const p = 8 * s8();
396
+ channels[i].pan = 0x80 + (p > 127 ? 127 : p);
397
+ }
398
+ }
399
+ else {
400
+ for (let i = 0; i < chn; i++)
401
+ channels[i].pan = 0x80;
402
+ }
403
+ const mod = {
404
+ title,
405
+ format: 'med',
406
+ comment,
407
+ chn,
408
+ pat,
409
+ ins,
410
+ len,
411
+ restart: 0,
412
+ xxo,
413
+ channels,
414
+ patterns,
415
+ instruments,
416
+ samples: samples.map((s) => s ?? { name: '', data: new Uint8Array(0), length: 0, loopStart: 0, loopEnd: 0, sustainStart: 0, sustainEnd: 0, finetune: 0, volume: 0, flags: 0, c5spd: 8363 }),
417
+ num_sequences: 0,
418
+ sequences: [],
419
+ speed: tempo2,
420
+ bpm,
421
+ volbase: 0x40,
422
+ gvolbase: 0x40,
423
+ gvol: 0x40,
424
+ quirks,
425
+ flowMode: 0,
426
+ readEventType: ReadEventType.MED,
427
+ periodType: 0,
428
+ defpan: 0x80,
429
+ time_factor: MED_TIME_FACTOR,
430
+ rrate: 250,
431
+ c4rate: C4_NTSC_RATE,
432
+ compare_vblank: false,
433
+ tracker: type,
434
+ extras: { kind: 'med', trackerVersion: medver },
435
+ };
436
+ void ctx.sampleRate;
437
+ void ctx.outputRate;
438
+ return mod;
439
+ }
440
+ //# sourceMappingURL=mmd3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mmd3.js","sourceRoot":"","sources":["../src/mmd3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import type { Event } from '@modplayjs/core';
2
+ /** MED_VER constants (loaders/med.h:9-19), re-exported for the loaders. */
3
+ export declare const MED_VER_210 = 528;
4
+ export declare const MED_VER_300 = 768;
5
+ export declare const MED_VER_320 = 800;
6
+ export declare const MED_VER_OCTAMED_100 = 4096;
7
+ export declare const MED_VER_OCTAMED_200 = 8192;
8
+ export declare const MED_VER_OCTAMED_300 = 12288;
9
+ export declare const MED_VER_OCTAMED_500 = 20480;
10
+ export declare const MED_VER_OCTAMED_502 = 20482;
11
+ export declare const MED_VER_OCTAMED_SS_1 = 24576;
12
+ export declare const MED_VER_OCTAMED_SS_2 = 28672;
13
+ /** DEFAULT_TIME_FACTOR (common.h:454) and MED_TIME_FACTOR (common.h:455). */
14
+ export declare const DEFAULT_TIME_FACTOR = 10;
15
+ export declare const MED_TIME_FACTOR = 2.64;
16
+ /** MMD song flags (med.h:49-56). */
17
+ export declare const FLAG_FILTERON = 1;
18
+ export declare const FLAG_JUMPINGON = 2;
19
+ export declare const FLAG_JUMP8TH = 4;
20
+ export declare const FLAG_INSTRSATT = 8;
21
+ export declare const FLAG_VOLHEX = 16;
22
+ export declare const FLAG_STSLIDE = 32;
23
+ export declare const FLAG_8CHANNEL = 64;
24
+ export declare const FLAG_SLOWHQ = 128;
25
+ /** MMD song flags2 (med.h:58-60). */
26
+ export declare const FLAG2_BMASK = 31;
27
+ export declare const FLAG2_BPM = 32;
28
+ export declare const FLAG2_MIX = 128;
29
+ /** InstrExt instr_flags (med.h:219-222). */
30
+ export declare const SSFLG_LOOP = 1;
31
+ export declare const SSFLG_EXTPSET = 2;
32
+ export declare const SSFLG_DISABLED = 4;
33
+ export declare const SSFLG_PINGPONG = 8;
34
+ /** MMD3_DEFAULT_NOTE (med.h:210). */
35
+ export declare const MMD3_DEFAULT_NOTE = 53;
36
+ /** InstrHdr type bits (med.h:161-163). */
37
+ export declare const S_16 = 16;
38
+ export declare const MD16 = 24;
39
+ export declare const STEREO = 32;
40
+ /** Number of octaves in IFFOCT samples (mmd_common.c:910). */
41
+ export declare const MMD_NUM_OCT: readonly number[];
42
+ /** struct MMD0sample (med.h:33-39). */
43
+ export interface MedSample {
44
+ rep: number;
45
+ replen: number;
46
+ midich: number;
47
+ midipreset: number;
48
+ svol: number;
49
+ /** int8. */
50
+ strans: number;
51
+ }
52
+ /** struct InstrExt (med.h:212-231), only the fields the loaders consume. */
53
+ export interface MedInstrExt {
54
+ hold: number;
55
+ decay: number;
56
+ suppress_midi_off: number;
57
+ /** int8. */
58
+ finetune: number;
59
+ default_pitch: number;
60
+ instr_flags: number;
61
+ long_repeat: number;
62
+ long_replen: number;
63
+ }
64
+ export declare function zeroInstrExt(): MedInstrExt;
65
+ /** struct MMD0exp (med.h:279-301), only the fields the loaders consume. */
66
+ export interface MedExpData {
67
+ s_ext_entries: number;
68
+ s_ext_entrsz: number;
69
+ i_ext_entries: number;
70
+ i_ext_entrsz: number;
71
+ annolen: number;
72
+ songnamelen: number;
73
+ }
74
+ export declare function zeroExpData(): MedExpData;
75
+ /** mmd_convert_tempo (mmd_common.c:48-82). */
76
+ export declare function mmdConvertTempo(tempo: number, bpmOn: number, med8ch: number): number;
77
+ /** mmd_xlat_fx (mmd_common.c:84-397). */
78
+ export declare function mmdXlatFx(event: Event, bpmOn: number, bpmlen: number, med8ch: number, hexvol: number): void;
79
+ /** mmd_set_bpm (mmd_common.c:1038-1053). Returns the effective time_factor
80
+ * (C sets m->time_factor) and writes mod.bpm. */
81
+ export declare function mmdSetBpm(med8ch: number, deftempo: number, bpmOn: number, bpmlen: number): {
82
+ bpm: number;
83
+ timeFactor: number;
84
+ };
85
+ /** mmd_tracker_version (mmd_common.c:1092-1162). Returns the MED version
86
+ * constant plus the tracker type string (libxmp_set_type). */
87
+ export declare function mmdTrackerVersion(mmdver: number, mmdc: number, med8ch: number, expdata: MedExpData | null): {
88
+ medver: number;
89
+ type: string;
90
+ };
91
+ /** Read a MMD0/MMD1-style InstrExt array (mmd1_load.c:538-563 /
92
+ * mmd3_load.c:483-523). ver2plus adds the OctaMED V5/V5.02/V7 fields. */
93
+ export declare function readInstrExtArray(u8: (n?: number) => number, u16: () => number, u32: () => number, seek: (delta: number) => void, count: number, expdata: MedExpData, ver2plus: boolean): MedInstrExt[];
94
+ /** Read MMDInstrInfo names (mmd1_load.c:567-591). */
95
+ export declare function readInstrInfoArray(raw: (n: number) => Uint8Array, seek: (delta: number) => void, count: number, expdata: MedExpData): string[];
96
+ /** libxmp_copy_adjust-style name (printable ASCII, trim, stop at NUL). */
97
+ export declare function copyAdjustName(r: Uint8Array, n: number): string;
98
+ //# sourceMappingURL=mmdCommon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mmdCommon.d.ts","sourceRoot":"","sources":["../src/mmdCommon.ts"],"names":[],"mappings":"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"}