@modplayjs/fmt-ice 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/ice.d.ts +6 -0
- package/dist/ice.d.ts.map +1 -0
- package/dist/ice.js +236 -0
- package/dist/ice.js.map +1 -0
- 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/package.json +48 -4
package/README.md
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @modplayjs/fmt-ice
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Soundtracker 2.6 / Ice Tracker (.mod with MTN/IT10 signatures) plugin**
|
|
4
|
+
for `@modplayjs/core`, ported 1:1 from libxmp's `ice_load.c`.
|
|
5
|
+
|
|
6
|
+
## Install
|
|
7
|
+
|
|
8
|
+
```sh
|
|
9
|
+
npm install @modplayjs/fmt-ice
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { CorePlayer } from '@modplayjs/core';
|
|
16
|
+
import { plugin as icePlugin } from '@modplayjs/fmt-ice';
|
|
17
|
+
|
|
18
|
+
const core = new CorePlayer();
|
|
19
|
+
core.registries.registerFormat(icePlugin);
|
|
20
|
+
core.loadModule(bytes);
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Part of the [modplayjs monorepo](../../README.md). BSD-3-Clause.
|
package/dist/ice.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FormatPlugin, LoadCtx, ModuleData } from '@modplayjs/core';
|
|
2
|
+
export declare function iceTest(bytes: Uint8Array): boolean;
|
|
3
|
+
export declare function iceLoad(bytes: Uint8Array, ctx: LoadCtx): ModuleData;
|
|
4
|
+
/** Ice format plugin (libxmp loaders/ice_load.c + read_event MOD). */
|
|
5
|
+
export declare const plugin: FormatPlugin;
|
|
6
|
+
//# sourceMappingURL=ice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ice.d.ts","sourceRoot":"","sources":["../src/ice.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAQ,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAwC/E,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAIlD;AASD,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAG,UAAU,CAgMnE;AAMD,sEAAsE;AACtE,eAAO,MAAM,MAAM,EAAE,YAUpB,CAAC"}
|
package/dist/ice.js
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
// Copyright (c) 2026 Bitti09 — modplayjs contributors
|
|
3
|
+
// Ported from: libxmp src/loaders/ice_load.c (ice_test :33-45, ice_load
|
|
4
|
+
// :47-204). Loader for Soundtracker 2.6 / Ice Tracker modules (MTN\0 / IT10).
|
|
5
|
+
import { SampleFlags } from '@modplayjs/core';
|
|
6
|
+
import { ParseError } from '@modplayjs/core';
|
|
7
|
+
import { FX_ICE_SPEED, FX_SPEED } from '@modplayjs/core';
|
|
8
|
+
import { readEventMod, decodeEvent } from '@modplayjs/fmt-mod';
|
|
9
|
+
/** MAGIC4('M','T','N',0) / MAGIC4('I','T','1','0') (ice_load.c:20-21). */
|
|
10
|
+
const MAGIC_MTN_ = 0x4d544e00;
|
|
11
|
+
const MAGIC_IT10 = 0x49543130;
|
|
12
|
+
/** readmem32b (dataio.c:190-198) — big-endian. */
|
|
13
|
+
function readmem32b(m, off) {
|
|
14
|
+
return ((m[off] << 24) | (m[off + 1] << 16) | (m[off + 2] << 8) | m[off + 3]) >>> 0;
|
|
15
|
+
}
|
|
16
|
+
/** Zeroed envelope (libxmp_init_instrument calloc semantics). */
|
|
17
|
+
function zeroEnvelope() {
|
|
18
|
+
return { flags: 0, npt: 0, scl: 0, sus: 0, sue: 0, lps: 0, lpe: 0, x: [], y: [] };
|
|
19
|
+
}
|
|
20
|
+
function zeroInstrument(name, sub) {
|
|
21
|
+
return {
|
|
22
|
+
name,
|
|
23
|
+
volume: 0x40,
|
|
24
|
+
nsm: 0,
|
|
25
|
+
rls: 0,
|
|
26
|
+
map: new Array(121).fill(0),
|
|
27
|
+
mapXpo: new Array(121).fill(0),
|
|
28
|
+
sub,
|
|
29
|
+
aei: zeroEnvelope(),
|
|
30
|
+
fei: zeroEnvelope(),
|
|
31
|
+
pei: zeroEnvelope(),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// ice_test (ice_load.c:33-45)
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
export function iceTest(bytes) {
|
|
38
|
+
if (bytes.length < 1468)
|
|
39
|
+
return false;
|
|
40
|
+
const magic = readmem32b(bytes, 1464);
|
|
41
|
+
return magic === MAGIC_MTN_ || magic === MAGIC_IT10;
|
|
42
|
+
}
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// ice_load (ice_load.c:47-204)
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
/** Tracker id for decodeEvent: protracker variant (fx 0x08 skipped). */
|
|
47
|
+
const TRACKER_PROTRACKER = 0;
|
|
48
|
+
export function iceLoad(bytes, ctx) {
|
|
49
|
+
let pos = 0;
|
|
50
|
+
const u8 = () => bytes[pos++];
|
|
51
|
+
const u16 = () => { const v = (bytes[pos] << 8) | bytes[pos + 1]; pos += 2; return v; };
|
|
52
|
+
const raw = (n) => { const s = bytes.subarray(pos, pos + n); pos += n; return s; };
|
|
53
|
+
const title = raw(20);
|
|
54
|
+
const insHeaders = [];
|
|
55
|
+
for (let i = 0; i < 31; i++) {
|
|
56
|
+
insHeaders.push({
|
|
57
|
+
name: raw(22),
|
|
58
|
+
len: u16(),
|
|
59
|
+
finetune: u8(),
|
|
60
|
+
volume: u8(),
|
|
61
|
+
loopStart: u16(),
|
|
62
|
+
loopSize: u16(),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const len = u8(); // size of the pattern list
|
|
66
|
+
const trk = u8(); // number of tracks
|
|
67
|
+
const ord = [];
|
|
68
|
+
for (let i = 0; i < 128; i++) {
|
|
69
|
+
ord.push(Array.from(raw(4)));
|
|
70
|
+
}
|
|
71
|
+
const magic = readmem32b(bytes, pos);
|
|
72
|
+
pos += 4;
|
|
73
|
+
// Sanity (ice_load.c:96-104)
|
|
74
|
+
if (len > 128)
|
|
75
|
+
throw new ParseError('ICE: pattern list too long');
|
|
76
|
+
for (let i = 0; i < len; i++) {
|
|
77
|
+
for (let j = 0; j < 4; j++) {
|
|
78
|
+
if (ord[i][j] >= trk)
|
|
79
|
+
throw new ParseError('ICE: track number out of range');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
let typeStr;
|
|
83
|
+
if (magic === MAGIC_IT10) {
|
|
84
|
+
typeStr = 'Ice Tracker';
|
|
85
|
+
}
|
|
86
|
+
else if (magic === MAGIC_MTN_) {
|
|
87
|
+
typeStr = 'Soundtracker 2.6';
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
throw new ParseError('ICE: bad magic');
|
|
91
|
+
}
|
|
92
|
+
const chn = 4; // trk count per pattern = 4 (mod->chn default; ice uses 4
|
|
93
|
+
// track references per pattern — see ord[i][4])
|
|
94
|
+
// Instruments (ice_load.c:107-141): note finetune is COMMENTED OUT in C.
|
|
95
|
+
const instruments = [];
|
|
96
|
+
const rawSamples = [];
|
|
97
|
+
for (let i = 0; i < 31; i++) {
|
|
98
|
+
const h = insHeaders[i];
|
|
99
|
+
const xlen = 2 * h.len;
|
|
100
|
+
const lps = 2 * h.loopStart;
|
|
101
|
+
const lpe = lps + 2 * h.loopSize;
|
|
102
|
+
const xflg = h.loopSize > 1 ? SampleFlags.LOOP : 0;
|
|
103
|
+
const sub = {
|
|
104
|
+
vol: h.volume,
|
|
105
|
+
gvl: 0,
|
|
106
|
+
pan: -1, // XMP_INST_NO_DEFAULT_PAN
|
|
107
|
+
xpo: 0,
|
|
108
|
+
fin: 0, // finetune assignment commented out upstream
|
|
109
|
+
vwf: 0, vde: 0, vra: 0, vsw: 0,
|
|
110
|
+
sid: i,
|
|
111
|
+
rvv: 0, nna: 0, dct: 0, dca: 0, ifc: 0, ifr: 0,
|
|
112
|
+
};
|
|
113
|
+
// C ice_load.c never calls libxmp_instrument_name — names stay empty.
|
|
114
|
+
const nameStr = '';
|
|
115
|
+
const xi = zeroInstrument(nameStr, [sub]);
|
|
116
|
+
if (xlen > 0)
|
|
117
|
+
xi.nsm = 1;
|
|
118
|
+
instruments.push(xi);
|
|
119
|
+
rawSamples.push({
|
|
120
|
+
name: nameStr,
|
|
121
|
+
data: new Uint8Array(0),
|
|
122
|
+
length: xlen,
|
|
123
|
+
loopStart: lps,
|
|
124
|
+
loopEnd: lpe,
|
|
125
|
+
sustainStart: 0,
|
|
126
|
+
sustainEnd: 0,
|
|
127
|
+
finetune: 0,
|
|
128
|
+
volume: h.volume,
|
|
129
|
+
flags: xflg,
|
|
130
|
+
c5spd: 8287, // prologue PAL default
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
// Patterns via shared track bank (ice_load.c:144-158): pattern i channel j
|
|
134
|
+
// references track ord[i][j]; mod->xxo[i] = i.
|
|
135
|
+
const trackBank = [];
|
|
136
|
+
for (let t = 0; t < trk; t++) {
|
|
137
|
+
const events = [];
|
|
138
|
+
for (let j = 0; j < 64; j++) {
|
|
139
|
+
const ev = raw(4);
|
|
140
|
+
if (ev.length < 4)
|
|
141
|
+
throw new ParseError(`ICE: read error at track ${t}`);
|
|
142
|
+
const e = { note: 0, ins: 0, vol: 0, fxt: 0, fxp: 0, f2t: 0, f2p: 0 };
|
|
143
|
+
decodeEvent(e, ev, 0, TRACKER_PROTRACKER);
|
|
144
|
+
// Fxx with both nibbles set → FX_ICE_SPEED (ice_load.c:177-182)
|
|
145
|
+
if (e.fxt === FX_SPEED) {
|
|
146
|
+
if (((e.fxp & 0xf0) >> 4) !== 0 && (e.fxp & 0x0f) !== 0) {
|
|
147
|
+
e.fxt = FX_ICE_SPEED;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
events.push(e);
|
|
151
|
+
}
|
|
152
|
+
trackBank.push(events);
|
|
153
|
+
}
|
|
154
|
+
const patterns = [];
|
|
155
|
+
const xxo = [];
|
|
156
|
+
for (let i = 0; i < len; i++) {
|
|
157
|
+
const tracksArr = [];
|
|
158
|
+
for (let j = 0; j < chn; j++) {
|
|
159
|
+
tracksArr.push({ rows: 64, event: trackBank[ord[i][j]] });
|
|
160
|
+
}
|
|
161
|
+
patterns.push({ rows: 64, tracks: tracksArr });
|
|
162
|
+
xxo.push(i);
|
|
163
|
+
}
|
|
164
|
+
// m->period_type = PERIOD_MODRNG (ice_load.c:187)
|
|
165
|
+
const periodType = 1; // MODRNG
|
|
166
|
+
// Samples (ice_load.c:192-199): skip len <= 4; signed PCM.
|
|
167
|
+
let samplePos = pos;
|
|
168
|
+
for (let i = 0; i < 31; i++) {
|
|
169
|
+
const rawS = rawSamples[i];
|
|
170
|
+
if (rawS.length <= 4) {
|
|
171
|
+
ctx.addSample(rawS);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const take = Math.min(rawS.length, Math.max(0, bytes.length - samplePos));
|
|
175
|
+
rawS.data = bytes.subarray(samplePos, samplePos + take);
|
|
176
|
+
samplePos += rawS.length;
|
|
177
|
+
ctx.addSample(rawS);
|
|
178
|
+
}
|
|
179
|
+
// Channel defaults: prologue LRLR
|
|
180
|
+
const chan = [];
|
|
181
|
+
for (let k = 0; k < chn; k++) {
|
|
182
|
+
const pan = Math.floor((k + 1) / 2) % 2 * 0xff;
|
|
183
|
+
chan.push({ pan: Math.min(255, Math.max(0, 0x80 + (pan - 0x80))), vol: 0x40, flg: 0 });
|
|
184
|
+
}
|
|
185
|
+
const mod = {
|
|
186
|
+
// strncpy(mod->name, ih.title, 20): NUL-terminated C string semantics.
|
|
187
|
+
title: String.fromCharCode(...title).replace(/\0.*$/, ''),
|
|
188
|
+
format: 'ice',
|
|
189
|
+
comment: '',
|
|
190
|
+
chn,
|
|
191
|
+
pat: len,
|
|
192
|
+
ins: 31,
|
|
193
|
+
len,
|
|
194
|
+
restart: 0,
|
|
195
|
+
xxo,
|
|
196
|
+
channels: chan,
|
|
197
|
+
patterns,
|
|
198
|
+
instruments,
|
|
199
|
+
samples: rawSamples,
|
|
200
|
+
num_sequences: 0,
|
|
201
|
+
sequences: [],
|
|
202
|
+
speed: 6,
|
|
203
|
+
bpm: 125,
|
|
204
|
+
volbase: 0x40,
|
|
205
|
+
gvolbase: 0x40,
|
|
206
|
+
gvol: 0x40,
|
|
207
|
+
quirks: 0,
|
|
208
|
+
flowMode: 0,
|
|
209
|
+
readEventType: 0, // READ_EVENT_MOD
|
|
210
|
+
periodType,
|
|
211
|
+
defpan: 0x80,
|
|
212
|
+
time_factor: 10,
|
|
213
|
+
rrate: 250,
|
|
214
|
+
c4rate: 8287, // PAL prologue default
|
|
215
|
+
compare_vblank: false,
|
|
216
|
+
tracker: typeStr,
|
|
217
|
+
};
|
|
218
|
+
void ctx.sampleRate;
|
|
219
|
+
void ctx.outputRate;
|
|
220
|
+
return mod;
|
|
221
|
+
}
|
|
222
|
+
// ---------------------------------------------------------------------------
|
|
223
|
+
// Plugin
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
/** Ice format plugin (libxmp loaders/ice_load.c + read_event MOD). */
|
|
226
|
+
export const plugin = {
|
|
227
|
+
name: 'ice',
|
|
228
|
+
test: iceTest,
|
|
229
|
+
load: iceLoad,
|
|
230
|
+
readEvent(core, chn, row) {
|
|
231
|
+
const mod = core.module;
|
|
232
|
+
const e = core.readEventScratch(chn) ?? core.readEventAt(mod.xxo[core.ctx.p.ord] ?? 0, chn, row);
|
|
233
|
+
readEventMod(core, e, chn);
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
//# sourceMappingURL=ice.js.map
|
package/dist/ice.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../src/ice.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,wEAAwE;AACxE,8EAA8E;AAI9E,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/D,0EAA0E;AAC1E,MAAM,UAAU,GAAG,UAAU,CAAC;AAC9B,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,kDAAkD;AAClD,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,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,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,MAAM,UAAU,OAAO,CAAC,KAAiB;IACvC,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACtC,OAAO,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,UAAU,CAAC;AACtD,CAAC;AAED,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E,wEAAwE;AACxE,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,UAAU,OAAO,CAAC,KAAiB,EAAE,GAAY;IACrD,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,CAAC,KAAK,CAAC,GAAG,CAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,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;IAE3F,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAWtB,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACb,GAAG,EAAE,GAAG,EAAE;YACV,QAAQ,EAAE,EAAE,EAAE;YACd,MAAM,EAAE,EAAE,EAAE;YACZ,SAAS,EAAE,GAAG,EAAE;YAChB,QAAQ,EAAE,GAAG,EAAE;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,2BAA2B;IAC7C,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,mBAAmB;IACrC,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrC,GAAG,IAAI,CAAC,CAAC;IAET,6BAA6B;IAC7B,IAAI,GAAG,GAAG,GAAG;QAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,CAAC;IAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,IAAI,GAAG;gBAAE,MAAM,IAAI,UAAU,CAAC,gCAAgC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,IAAI,OAAe,CAAC;IACpB,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,OAAO,GAAG,aAAa,CAAC;IAC1B,CAAC;SAAM,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,GAAG,kBAAkB,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,0DAA0D;IACzE,gDAAgD;IAEhD,yEAAyE;IACzE,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QACjC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnD,MAAM,GAAG,GAAkB;YACzB,GAAG,EAAE,CAAC,CAAC,MAAM;YACb,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC,CAAC,EAAE,0BAA0B;YACnC,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC,EAAE,6CAA6C;YACrD,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,sEAAsE;QACtE,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,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,IAAI,EAAE,OAAO;YACb,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,CAAC;YACX,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,IAAI,EAAE,uBAAuB;SACrC,CAAC,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,+CAA+C;IAC/C,MAAM,SAAS,GAAc,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;YACzE,MAAM,CAAC,GAAU,EAAE,IAAI,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;YAC7E,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAC1C,gEAAgE;YAChE,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvB,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACxD,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,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,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAE,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IAED,kDAAkD;IAClD,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,SAAS;IAE/B,2DAA2D;IAC3D,IAAI,SAAS,GAAG,GAAG,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QACD,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;QAC1E,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC;QACxD,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC;QACzB,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,uEAAuE;QACvE,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACzD,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,EAAE;QACX,GAAG;QACH,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,EAAE;QACP,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,sEAAsE;AACtE,MAAM,CAAC,MAAM,MAAM,GAAiB;IAClC,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,OAAO;IACb,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"}
|
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-ice — Soundtracker 2.6 / Ice Tracker loader + event reader.
|
|
5
|
+
export { iceTest, iceLoad, plugin } from './ice.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,6EAA6E;AAE7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,50 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@modplayjs/fmt-ice",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Soundtracker 2.6 / Ice Tracker (.mod MTN/IT10) plugin for modplayjs (libxmp ice_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
|
+
"mtn",
|
|
28
|
+
"ice tracker",
|
|
29
|
+
"soundtracker",
|
|
30
|
+
"libxmp",
|
|
31
|
+
"chiptune",
|
|
32
|
+
"audio",
|
|
33
|
+
"music"
|
|
34
|
+
],
|
|
35
|
+
"sideEffects": false,
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18"
|
|
38
|
+
},
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/modplayjs/modplayjs.git",
|
|
42
|
+
"directory": "packages/fmt-ice"
|
|
43
|
+
},
|
|
44
|
+
"bugs": "https://github.com/modplayjs/modplayjs/issues",
|
|
45
|
+
"homepage": "https://github.com/modplayjs/modplayjs#readme",
|
|
46
|
+
"license": "BSD-3-Clause",
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"registry": "https://npm.pkg.github.com"
|
|
49
|
+
}
|
|
50
|
+
}
|