@modplayjs/fmt-ice 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,23 @@
1
- # Temporary Holding Version
1
+ # @modplayjs/fmt-ice
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
+ **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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ice.js","sourceRoot":"","sources":["../src/ice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { iceTest, iceLoad, plugin } from './ice.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-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.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.2",
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.2",
23
+ "@modplayjs/fmt-mod": "^0.2.2"
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
+ }