@modplayjs/fmt-digi 0.0.0-stage → 0.2.2

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,24 @@
1
- # Temporary Holding Version
1
+ # @modplayjs/fmt-digi
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
+ **DIGI Booster (.digi) plugin** for `@modplayjs/core`, ported 1:1 from
4
+ libxmp's `digi_load.c` (4/8-channel tracker with per-sample volume
5
+ envelopes).
6
+
7
+ ## Install
8
+
9
+ ```sh
10
+ npm install @modplayjs/fmt-digi
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```ts
16
+ import { CorePlayer } from '@modplayjs/core';
17
+ import { plugin as digiPlugin } from '@modplayjs/fmt-digi';
18
+
19
+ const core = new CorePlayer();
20
+ core.registries.registerFormat(digiPlugin);
21
+ core.loadModule(bytes);
22
+ ```
23
+
24
+ Part of the [modplayjs monorepo](../../README.md). BSD-3-Clause.
package/dist/digi.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { FormatPlugin, LoadCtx, ModuleData } from '@modplayjs/core';
2
+ export declare function digiTest(bytes: Uint8Array): boolean;
3
+ export declare function digiLoad(bytes: Uint8Array, ctx: LoadCtx): ModuleData;
4
+ /** DIGI Booster format plugin (libxmp loaders/digi_load.c + read_event MOD). */
5
+ export declare const plugin: FormatPlugin;
6
+ //# sourceMappingURL=digi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digi.d.ts","sourceRoot":"","sources":["../src/digi.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAQ,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAmD/E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAcnD;AAOD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAG,UAAU,CAgNpE;AAMD,gFAAgF;AAChF,eAAO,MAAM,MAAM,EAAE,YAUpB,CAAC"}
package/dist/digi.js ADDED
@@ -0,0 +1,290 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: libxmp src/loaders/digi_load.c (digi_test :36-56,
4
+ // digi_load :91-247).
5
+ //
6
+ // Based on the DIGI Booster player v1.6 by Tap (Tomasz Piasta). Unrecognized
7
+ // effects (C header comment): 8xx robot, e00/e01 filter, e30/e31 backward
8
+ // play, e50/e51 channel on/off, e8x sample offset 2, e9x retrace.
9
+ import { SampleFlags } from '@modplayjs/core';
10
+ import { LSN, MSN, EMPTY_EVENT } from '@modplayjs/core';
11
+ import { ParseError } from '@modplayjs/core';
12
+ import { FX_VOLSET } from '@modplayjs/core';
13
+ import { readEventMod, decodeEvent, periodToNote } from '@modplayjs/fmt-mod';
14
+ /** Zeroed envelope (libxmp_init_instrument calloc semantics). */
15
+ function zeroEnvelope() {
16
+ return { flags: 0, npt: 0, scl: 0, sus: 0, sue: 0, lps: 0, lpe: 0, x: [], y: [] };
17
+ }
18
+ function zeroInstrument(name, sub) {
19
+ return {
20
+ name,
21
+ volume: 0x40,
22
+ nsm: 0,
23
+ rls: 0,
24
+ map: new Array(121).fill(0),
25
+ mapXpo: new Array(121).fill(0),
26
+ sub,
27
+ aei: zeroEnvelope(),
28
+ fei: zeroEnvelope(),
29
+ pei: zeroEnvelope(),
30
+ };
31
+ }
32
+ function readmem32b(m, off) {
33
+ return ((m[off] << 24) | (m[off + 1] << 16) | (m[off + 2] << 8) | m[off + 3]) >>> 0;
34
+ }
35
+ function readmem16b(m, off) {
36
+ return (m[off] << 8) | m[off + 1];
37
+ }
38
+ /** libxmp_copy_adjust (common.c:237-253): printable ASCII, trim. */
39
+ function copyAdjust(r, n) {
40
+ let s = '';
41
+ for (let i = 0; i < n && i < r.length; i++) {
42
+ const c = r[i];
43
+ if (c === 0)
44
+ break; // strncpy stops at NUL (common.c:244)
45
+ s += c > 127 || c < 0x20 || c === 0x7f ? '.' : String.fromCharCode(c);
46
+ }
47
+ return s.replace(/ +$/, '');
48
+ }
49
+ // ---------------------------------------------------------------------------
50
+ // digi_test (digi_load.c:36-56)
51
+ // ---------------------------------------------------------------------------
52
+ export function digiTest(bytes) {
53
+ if (bytes.length < 20)
54
+ return false;
55
+ // "DIGI Booster module\0" (19 bytes + NUL)
56
+ const id = 'DIGI Booster module';
57
+ for (let i = 0; i < 19; i++) {
58
+ if (bytes[i] !== id.charCodeAt(i))
59
+ return false;
60
+ }
61
+ // Skip: vstr(4)+ver(1)+chn(1)+pack(1)+unknown(19) = 26? C seeks 156 from
62
+ // offset 20 → 176; then 3*4*32 = 384 → 560; then 2*1*32 = 64 → 624.
63
+ // C: hio_seek(156, SEEK_CUR) after reading 20 → offset 176. That skips
64
+ // vstr..ord (26) + 128 orders + ... let's just mirror the seeks: from
65
+ // current position (20), +156 → 176, +384 → 560, +64 → 624 (title).
66
+ // Title read of 32 bytes needs file >= 656.
67
+ return bytes.length >= 624 + 32;
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // digi_load (digi_load.c:91-247)
71
+ // ---------------------------------------------------------------------------
72
+ // digi_load (digi_load.c:91-247):
73
+ export function digiLoad(bytes, ctx) {
74
+ let pos = 0;
75
+ const u8 = () => bytes[pos++];
76
+ const u16 = () => { const v = readmem16b(bytes, pos); pos += 2; return v; };
77
+ const u32 = () => { const v = readmem32b(bytes, pos); pos += 4; return v; };
78
+ const raw = (n) => { const s = bytes.subarray(pos, pos + n); pos += n; return s; };
79
+ const s8 = () => { const v = (bytes[pos++] << 24) >> 24; return v; };
80
+ raw(20); // id
81
+ const vstr = raw(4);
82
+ const ver = u8();
83
+ void ver;
84
+ const chn = u8();
85
+ const pack = u8();
86
+ raw(19); // unknown
87
+ const patStored = u8();
88
+ const lenStored = u8();
89
+ if (lenStored > 127)
90
+ throw new ParseError('DIGI: song length > 127');
91
+ const ord = raw(128);
92
+ const slen = [];
93
+ const sloop = [];
94
+ const sllen = [];
95
+ const vol = [];
96
+ const fin = [];
97
+ for (let i = 0; i < 31; i++)
98
+ slen.push(u32());
99
+ for (let i = 0; i < 31; i++)
100
+ sloop.push(u32());
101
+ for (let i = 0; i < 31; i++)
102
+ sllen.push(u32());
103
+ for (let i = 0; i < 31; i++)
104
+ vol.push(u8());
105
+ for (let i = 0; i < 31; i++)
106
+ fin.push(s8());
107
+ const title = raw(32);
108
+ const insNames = [];
109
+ for (let i = 0; i < 31; i++)
110
+ insNames.push(raw(30));
111
+ const ins = 31;
112
+ const pat = patStored + 1;
113
+ const len = lenStored + 1;
114
+ // m->period_type = PERIOD_MODRNG (digi_load.c:135)
115
+ const periodType = 1; // MODRNG
116
+ const typeStr = `DIGI Booster ${String.fromCharCode(...vstr).slice(0, 4)}`;
117
+ const xxo = [];
118
+ for (let i = 0; i < len; i++)
119
+ xxo.push(ord[i]);
120
+ // Instruments (digi_load.c:146-174)
121
+ const instruments = [];
122
+ const rawSamples = [];
123
+ for (let i = 0; i < ins; i++) {
124
+ const xlen = slen[i];
125
+ const lps = sloop[i];
126
+ const lpe = sloop[i] + sllen[i];
127
+ const xflg = lpe > 0 ? SampleFlags.LOOP : 0;
128
+ const sub = {
129
+ vol: vol[i],
130
+ gvl: 0x40, // no QUIRK_INSVOL: load_epilogue sets gvl = volbase (load_helpers.c:377-383)
131
+ pan: -1, // XMP_INST_NO_DEFAULT_PAN
132
+ xpo: 0,
133
+ fin: fin[i],
134
+ vwf: 0, vde: 0, vra: 0, vsw: 0,
135
+ sid: i,
136
+ rvv: 0, nna: 0, dct: 0, dca: 0, ifc: 0, ifr: 0,
137
+ };
138
+ const nameStr = copyAdjust(insNames[i], 30);
139
+ const xi = zeroInstrument(nameStr, [sub]);
140
+ if (xlen > 0)
141
+ xi.nsm = 1;
142
+ instruments.push(xi);
143
+ rawSamples.push({
144
+ // The C loader names only the INSTRUMENT — xxs->name stays empty.
145
+ name: '',
146
+ data: new Uint8Array(0),
147
+ length: xlen,
148
+ loopStart: lps,
149
+ loopEnd: lpe,
150
+ sustainStart: 0,
151
+ sustainEnd: 0,
152
+ finetune: fin[i],
153
+ volume: vol[i],
154
+ flags: xflg,
155
+ c5spd: 8287, // prologue PAL default — DIGI never sets c4rate
156
+ });
157
+ }
158
+ // Patterns (digi_load.c:180-232)
159
+ const patterns = [];
160
+ for (let i = 0; i < pat; i++) {
161
+ const tracksArr = [];
162
+ for (let k = 0; k < chn; k++) {
163
+ const events = [];
164
+ for (let j = 0; j < 64; j++)
165
+ events.push({ ...EMPTY_EVENT });
166
+ tracksArr.push({ rows: 64, event: events });
167
+ }
168
+ const pattern = { rows: 64, tracks: tracksArr };
169
+ let w;
170
+ const chnTable = new Uint8Array(64);
171
+ if (pack !== 0) {
172
+ w = (u16() - 64) >> 2;
173
+ const tbl = raw(64);
174
+ if (tbl.length < 64)
175
+ throw new ParseError(`DIGI: channel table ${i} truncated`);
176
+ chnTable.set(tbl);
177
+ }
178
+ else {
179
+ w = 64 * chn;
180
+ chnTable.fill(0xff);
181
+ }
182
+ for (let j = 0; j < 64; j++) {
183
+ for (let c = 0, k = 0x80; c < chn; c++, k >>= 1) {
184
+ if ((chnTable[j] & k) !== 0) {
185
+ const ev4 = raw(4);
186
+ if (ev4.length < 4)
187
+ throw new ParseError(`DIGI: read error at pattern ${i}`);
188
+ const e = pattern.tracks[c].event[j];
189
+ // libxmp_decode_protracker_event — reuse fmt-mod's decoder with the
190
+ // PROTRACKER tracker id (skips fx 0x08, then we re-zero it anyway).
191
+ decodeEvent(e, ev4, 0, 0 /* TrackerId.PROTRACKER */);
192
+ e.note = periodToNote((LSN(ev4[0]) << 8) | ev4[1]);
193
+ switch (e.fxt) {
194
+ case 0x08: // Robot — unrecognized (digi_load.c:220-223)
195
+ e.fxt = 0;
196
+ e.fxp = 0;
197
+ break;
198
+ case 0x0e:
199
+ switch (MSN(e.fxp)) {
200
+ case 0x00:
201
+ case 0x03:
202
+ case 0x08:
203
+ case 0x09:
204
+ e.fxt = 0;
205
+ e.fxp = 0;
206
+ break;
207
+ case 0x04:
208
+ e.fxt = FX_VOLSET; // 0x0c
209
+ e.fxp = 0x00;
210
+ break;
211
+ }
212
+ break;
213
+ }
214
+ w--;
215
+ }
216
+ }
217
+ }
218
+ if (w !== 0) {
219
+ // C logs "Corrupted file" and continues (digi_load.c:234-237).
220
+ }
221
+ patterns.push(pattern);
222
+ }
223
+ // Samples (digi_load.c:237-243): signed PCM, sequential.
224
+ let samplePos = pos;
225
+ for (let i = 0; i < ins; i++) {
226
+ const rawS = rawSamples[i];
227
+ if (rawS.length > 0) {
228
+ const take = Math.min(rawS.length, Math.max(0, bytes.length - samplePos));
229
+ rawS.data = bytes.subarray(samplePos, samplePos + take);
230
+ samplePos += rawS.length;
231
+ }
232
+ ctx.addSample(rawS);
233
+ }
234
+ // Channel defaults: prologue LRLR
235
+ const chan = [];
236
+ for (let k = 0; k < chn; k++) {
237
+ const pan = Math.floor((k + 1) / 2) % 2 * 0xff;
238
+ chan.push({ pan: Math.min(255, Math.max(0, 0x80 + (pan - 0x80))), vol: 0x40, flg: 0 });
239
+ }
240
+ const mod = {
241
+ title: copyAdjust(title, 32),
242
+ format: 'digi',
243
+ comment: '',
244
+ chn,
245
+ pat,
246
+ ins,
247
+ len,
248
+ restart: 0,
249
+ xxo,
250
+ channels: chan,
251
+ patterns,
252
+ instruments,
253
+ samples: rawSamples,
254
+ num_sequences: 0,
255
+ sequences: [],
256
+ speed: 6,
257
+ bpm: 125,
258
+ volbase: 0x40,
259
+ gvolbase: 0x40,
260
+ gvol: 0x40,
261
+ quirks: 0,
262
+ flowMode: 0,
263
+ readEventType: 0, // READ_EVENT_MOD
264
+ periodType,
265
+ defpan: 0x80,
266
+ time_factor: 10,
267
+ rrate: 250,
268
+ c4rate: 8287, // PAL prologue default
269
+ compare_vblank: false,
270
+ tracker: typeStr,
271
+ };
272
+ void ctx.sampleRate;
273
+ void ctx.outputRate;
274
+ return mod;
275
+ }
276
+ // ---------------------------------------------------------------------------
277
+ // Plugin
278
+ // ---------------------------------------------------------------------------
279
+ /** DIGI Booster format plugin (libxmp loaders/digi_load.c + read_event MOD). */
280
+ export const plugin = {
281
+ name: 'digi',
282
+ test: digiTest,
283
+ load: digiLoad,
284
+ readEvent(core, chn, row) {
285
+ const mod = core.module;
286
+ const e = core.readEventScratch(chn) ?? core.readEventAt(mod.xxo[core.ctx.p.ord] ?? 0, chn, row);
287
+ readEventMod(core, e, chn);
288
+ },
289
+ };
290
+ //# sourceMappingURL=digi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digi.js","sourceRoot":"","sources":["../src/digi.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,iEAAiE;AACjE,sBAAsB;AACtB,EAAE;AACF,6EAA6E;AAC7E,0EAA0E;AAC1E,kEAAkE;AAIlE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE7E,iEAAiE;AACjE,SAAS,YAAY;IACnB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,GAAoB;IACxD,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,IAAI,KAAK,CAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,MAAM,EAAE,IAAI,KAAK,CAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,GAAG;QACH,GAAG,EAAE,YAAY,EAAE;QACnB,GAAG,EAAE,YAAY,EAAE;QACnB,GAAG,EAAE,YAAY,EAAE;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,CAAa,EAAE,GAAW;IAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,UAAU,CAAC,CAAa,EAAE,GAAW;IAC5C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC;AACtC,CAAC;AAED,oEAAoE;AACpE,SAAS,UAAU,CAAC,CAAa,EAAE,CAAS;IAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC;YAAE,MAAM,CAAC,sCAAsC;QAC1D,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,MAAM,UAAU,QAAQ,CAAC,KAAiB;IACxC,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IACpC,2CAA2C;IAC3C,MAAM,EAAE,GAAG,qBAAqB,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAClD,CAAC;IACD,yEAAyE;IACzE,oEAAoE;IACpE,uEAAuE;IACvE,sEAAsE;IACtE,oEAAoE;IACpE,4CAA4C;IAC5C,OAAO,KAAK,CAAC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC;AAClC,CAAC;AAED,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E,kCAAkC;AAClC,MAAM,UAAU,QAAQ,CAAC,KAAiB,EAAE,GAAY;IACtD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,EAAE,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK;IACd,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC;IACjB,KAAK,GAAG,CAAC;IACT,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC;IACjB,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;IACnB,MAAM,SAAS,GAAG,EAAE,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,EAAE,EAAE,CAAC;IACvB,IAAI,SAAS,GAAG,GAAG;QAAE,MAAM,IAAI,UAAU,CAAC,yBAAyB,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAErB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACtB,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpD,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,GAAG,GAAG,SAAS,GAAG,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,SAAS,GAAG,CAAC,CAAC;IAE1B,mDAAmD;IACnD,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,SAAS;IAE/B,MAAM,OAAO,GAAG,gBAAgB,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAE3E,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC;IAEhD,oCAAoC;IACpC,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACtB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACtB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QAClC,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5C,MAAM,GAAG,GAAkB;YACzB,GAAG,EAAE,GAAG,CAAC,CAAC,CAAE;YACZ,GAAG,EAAE,IAAI,EAAE,6EAA6E;YACxF,GAAG,EAAE,CAAC,CAAC,EAAE,0BAA0B;YACnC,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,GAAG,CAAC,CAAC,CAAE;YACZ,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;YAC9B,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;SAC/C,CAAC;QACF,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,IAAI,IAAI,GAAG,CAAC;YAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QACzB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAErB,UAAU,CAAC,IAAI,CAAC;YACd,kEAAkE;YAClE,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC;YACvB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,GAAG;YACd,OAAO,EAAE,GAAG;YACZ,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAE;YACjB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAE;YACf,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,IAAI,EAAE,gDAAgD;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,iCAAiC;IACjC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAsB,EAAE,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAY,EAAE,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;YAC7D,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,OAAO,GAAY,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAEzD,IAAI,CAAS,CAAC;QACd,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;YACpB,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE;gBAAE,MAAM,IAAI,UAAU,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;YAChF,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;oBACnB,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;wBAAE,MAAM,IAAI,UAAU,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;oBAC7E,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;oBACvC,oEAAoE;oBACpE,oEAAoE;oBACpE,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,0BAA0B,CAAC,CAAC;oBACrD,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC;oBACrD,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;wBACd,KAAK,IAAI,EAAE,6CAA6C;4BACtD,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;4BACV,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;4BACV,MAAM;wBACR,KAAK,IAAI;4BACP,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gCACnB,KAAK,IAAI,CAAC;gCACV,KAAK,IAAI,CAAC;gCACV,KAAK,IAAI,CAAC;gCACV,KAAK,IAAI;oCACP,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;oCACV,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;oCACV,MAAM;gCACR,KAAK,IAAI;oCACP,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,OAAO;oCAC1B,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC;oCACb,MAAM;4BACV,CAAC;4BACD,MAAM;oBACV,CAAC;oBACD,CAAC,EAAE,CAAC;gBACN,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,+DAA+D;QACjE,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,yDAAyD;IACzD,IAAI,SAAS,GAAG,GAAG,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;YAC1E,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC;YACxD,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC;QAC3B,CAAC;QACD,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,kCAAkC;IAClC,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,GAAG,GAAe;QACtB,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE;QACX,GAAG;QACH,GAAG;QACH,GAAG;QACH,GAAG;QACH,OAAO,EAAE,CAAC;QACV,GAAG;QACH,QAAQ,EAAE,IAAI;QACd,QAAQ;QACR,WAAW;QACX,OAAO,EAAE,UAAU;QACnB,aAAa,EAAE,CAAC;QAChB,SAAS,EAAE,EAAE;QACb,KAAK,EAAE,CAAC;QACR,GAAG,EAAE,GAAG;QACR,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,CAAC;QACX,aAAa,EAAE,CAAC,EAAE,iBAAiB;QACnC,UAAU;QACV,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,IAAI,EAAE,uBAAuB;QACrC,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,OAAO;KACjB,CAAC;IAEF,KAAK,GAAG,CAAC,UAAU,CAAC;IACpB,KAAK,GAAG,CAAC,UAAU,CAAC;IACpB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,gFAAgF;AAChF,MAAM,CAAC,MAAM,MAAM,GAAiB;IAClC,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,SAAS,CAAC,IAAU,EAAE,GAAW,EAAE,GAAW;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAoB,CAAC;QACtC,MAAM,CAAC,GACL,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACzF,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { digiTest, digiLoad, plugin } from './digi.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,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,WAAW,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-digi — DIGI Booster loader + event reader.
5
+ export { digiTest, digiLoad, plugin } from './digi.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,4DAA4D;AAE5D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,49 @@
1
1
  {
2
2
  "name": "@modplayjs/fmt-digi",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.2",
4
+ "description": "DIGI Booster format plugin for modplayjs (libxmp digi_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.2",
23
+ "@modplayjs/fmt-mod": "^0.2.2"
24
+ },
25
+ "keywords": [
26
+ "tracker",
27
+ "digi",
28
+ "digi booster",
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-digi"
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
+ }