@modplayjs/fmt-asylum 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-asylum
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
+ **Asylum Music Format v1.0 (.amf/.asylum) plugin** for `@modplayjs/core`,
4
+ ported 1:1 from libxmp's `asylum_load.c`.
5
+
6
+ ## Install
7
+
8
+ ```sh
9
+ npm install @modplayjs/fmt-asylum
10
+ ```
11
+
12
+ ## Usage
13
+
14
+ ```ts
15
+ import { CorePlayer } from '@modplayjs/core';
16
+ import { plugin as asylumPlugin } from '@modplayjs/fmt-asylum';
17
+
18
+ const core = new CorePlayer();
19
+ core.registries.registerFormat(asylumPlugin);
20
+ core.loadModule(bytes);
21
+ ```
22
+
23
+ Part of the [modplayjs monorepo](../../README.md). BSD-3-Clause.
@@ -0,0 +1,6 @@
1
+ import type { FormatPlugin, LoadCtx, ModuleData } from '@modplayjs/core';
2
+ export declare function asylumTest(bytes: Uint8Array): boolean;
3
+ export declare function asylumLoad(bytes: Uint8Array, ctx: LoadCtx): ModuleData;
4
+ /** Asylum format plugin (libxmp loaders/asylum_load.c + read_event MOD). */
5
+ export declare const plugin: FormatPlugin;
6
+ //# sourceMappingURL=asylum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asylum.d.ts","sourceRoot":"","sources":["../src/asylum.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAQ,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA4B/E,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAUrD;AAMD,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAG,UAAU,CAwLtE;AAMD,4EAA4E;AAC5E,eAAO,MAAM,MAAM,EAAE,YAUpB,CAAC"}
package/dist/asylum.js ADDED
@@ -0,0 +1,227 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: libxmp src/loaders/asylum_load.c (asylum_test :31-45,
4
+ // asylum_load :47-183). Based on the AMF->MOD converter by Mr. P /
5
+ // Powersource, 1995.
6
+ import { SampleFlags } from '@modplayjs/core';
7
+ import { ParseError } from '@modplayjs/core';
8
+ import { FX_MULTI_RETRIG } from '@modplayjs/core';
9
+ import { readEventMod } from '@modplayjs/fmt-mod';
10
+ function readmem32l(m, off) {
11
+ return (m[off] | (m[off + 1] << 8) | (m[off + 2] << 16) | (m[off + 3] << 24)) >>> 0;
12
+ }
13
+ /** libxmp_copy_adjust (common.c:237-253): printable ASCII, trim. */
14
+ function copyAdjust(r, n) {
15
+ let s = '';
16
+ for (let i = 0; i < n && i < r.length; i++) {
17
+ const c = r[i];
18
+ if (c === 0)
19
+ break; // strncpy stops at NUL (common.c:244)
20
+ s += c > 127 || c < 0x20 || c === 0x7f ? '.' : String.fromCharCode(c);
21
+ }
22
+ return s.replace(/ +$/, '');
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ // asylum_test (asylum_load.c:31-45)
26
+ // ---------------------------------------------------------------------------
27
+ const MAGIC = 'ASYLUM Music Format V1.0';
28
+ export function asylumTest(bytes) {
29
+ if (bytes.length < 32)
30
+ return false;
31
+ for (let i = 0; i < 24; i++) {
32
+ if (bytes[i] !== MAGIC.charCodeAt(i))
33
+ return false;
34
+ }
35
+ // Trailing 8 NULs (\0\0\0\0\0\0\0\0)
36
+ for (let i = 24; i < 32; i++) {
37
+ if (bytes[i] !== 0)
38
+ return false;
39
+ }
40
+ return true;
41
+ }
42
+ // ---------------------------------------------------------------------------
43
+ // asylum_load (asylum_load.c:47-183)
44
+ // ---------------------------------------------------------------------------
45
+ export function asylumLoad(bytes, ctx) {
46
+ let pos = 32; // skip magic (asylum_load.c:56)
47
+ const u8 = () => bytes[pos++];
48
+ const raw = (n) => { const s = bytes.subarray(pos, pos + n); pos += n; return s; };
49
+ const spd = u8(); // initial speed
50
+ const bpm = u8(); // initial BPM
51
+ const ins = u8(); // number of instruments
52
+ const pat = u8(); // number of patterns
53
+ const len = u8(); // module length
54
+ const rst = u8(); // restart byte
55
+ // Sanity (asylum_load.c:68-73): 64 sample structures max.
56
+ if (ins > 64)
57
+ throw new ParseError(`ASYLUM: invalid sample count ${ins}`);
58
+ const xxoRaw = raw(len); // orders
59
+ pos = 294; // hio_seek(start + 294)
60
+ const chn = 8;
61
+ // Instruments (asylum_load.c:82-124): 37-byte structs.
62
+ const instruments = [];
63
+ const rawSamples = [];
64
+ for (let i = 0; i < ins; i++) {
65
+ const insbuf = raw(37);
66
+ if (insbuf.length < 37)
67
+ throw new ParseError(`ASYLUM: instrument ${i} truncated`);
68
+ // libxmp_instrument_name → copy_adjust(22)
69
+ const nameStr = copyAdjust(insbuf.subarray(0, 22), 22);
70
+ const fin = (((insbuf[22] << 4) & 0xff) << 24) >> 24; // (int8)(insbuf[22] << 4)
71
+ const vol = insbuf[23];
72
+ const xpo = (insbuf[24] << 24) >> 24; // (int8)insbuf[24]
73
+ const xlen = readmem32l(insbuf, 25);
74
+ const lps = readmem32l(insbuf, 29);
75
+ const lpe = lps + readmem32l(insbuf, 33);
76
+ // Sanity (asylum_load.c:111-117): converted from MODs, len < 0x20000.
77
+ if (xlen >= 0x20000)
78
+ throw new ParseError(`ASYLUM: invalid sample ${i} length ${xlen}`);
79
+ const xflg = lpe > 2 ? SampleFlags.LOOP : 0;
80
+ const sub = {
81
+ vol,
82
+ gvl: 0x40, // no QUIRK_INSVOL: load_epilogue sets gvl = volbase (load_helpers.c:377-383)
83
+ pan: -1, // XMP_INST_NO_DEFAULT_PAN
84
+ xpo,
85
+ fin,
86
+ vwf: 0, vde: 0, vra: 0, vsw: 0,
87
+ sid: i,
88
+ rvv: 0, nna: 0, dct: 0, dca: 0, ifc: 0, ifr: 0,
89
+ };
90
+ const xi = {
91
+ name: nameStr,
92
+ volume: 0x40,
93
+ nsm: 0, // set to 1 only after sample load succeeds (:176-180)
94
+ rls: 0,
95
+ map: new Array(121).fill(0),
96
+ mapXpo: new Array(121).fill(0),
97
+ sub: [sub],
98
+ aei: { flags: 0, npt: 0, scl: 0, sus: 0, sue: 0, lps: 0, lpe: 0, x: [], y: [] },
99
+ fei: { flags: 0, npt: 0, scl: 0, sus: 0, sue: 0, lps: 0, lpe: 0, x: [], y: [] },
100
+ pei: { flags: 0, npt: 0, scl: 0, sus: 0, sue: 0, lps: 0, lpe: 0, x: [], y: [] },
101
+ };
102
+ instruments.push(xi);
103
+ rawSamples.push({
104
+ // The C loader names only the INSTRUMENT — xxs->name stays empty.
105
+ name: '',
106
+ data: new Uint8Array(0),
107
+ length: xlen,
108
+ loopStart: lps,
109
+ loopEnd: lpe,
110
+ sustainStart: 0,
111
+ sustainEnd: 0,
112
+ finetune: fin,
113
+ volume: vol,
114
+ flags: xflg,
115
+ c5spd: 8287, // prologue PAL default
116
+ });
117
+ }
118
+ // Skip unused sample slots (asylum_load.c:127): 37 * (64 - ins).
119
+ pos += 37 * (64 - ins);
120
+ // Patterns (asylum_load.c:136-172): 2048-byte blocks, 64 rows × 8 ch,
121
+ // 4 bytes per cell: note (0 = none, else +13), ins, fxt, fxp.
122
+ const patterns = [];
123
+ for (let i = 0; i < pat; i++) {
124
+ const buf = raw(2048);
125
+ if (buf.length < 2048)
126
+ throw new ParseError(`ASYLUM: pattern ${i} truncated`);
127
+ const tracksArr = [];
128
+ for (let k = 0; k < chn; k++) {
129
+ const events = [];
130
+ for (let j = 0; j < 64; j++) {
131
+ events.push({ note: 0, ins: 0, vol: 0, fxt: 0, fxp: 0, f2t: 0, f2p: 0 });
132
+ }
133
+ tracksArr.push({ rows: 64, event: events });
134
+ }
135
+ const pattern = { rows: 64, tracks: tracksArr };
136
+ let p = 0;
137
+ for (let j = 0; j < 64 * 8; j++) {
138
+ const e = pattern.tracks[j % 8].event[Math.trunc(j / 8)];
139
+ const note = buf[p++];
140
+ if (note !== 0) {
141
+ e.note = note + 13;
142
+ }
143
+ e.ins = buf[p++];
144
+ e.fxt = buf[p++];
145
+ e.fxp = buf[p++];
146
+ // Effects >= 0x10 are unknown except the plausible 0x1b retrig
147
+ // (asylum_load.c:163-169).
148
+ if (e.fxt >= 0x10 && e.fxt !== FX_MULTI_RETRIG) {
149
+ e.fxt = 0;
150
+ e.fxp = 0;
151
+ }
152
+ }
153
+ patterns.push(pattern);
154
+ }
155
+ // Samples (asylum_load.c:175-182): signed PCM, sequential; len > 1 only;
156
+ // nsm = 1 set AFTER successful load.
157
+ let samplePos = pos;
158
+ for (let i = 0; i < ins; i++) {
159
+ const rawS = rawSamples[i];
160
+ if (rawS.length > 1) {
161
+ const take = Math.min(rawS.length, Math.max(0, bytes.length - samplePos));
162
+ rawS.data = bytes.subarray(samplePos, samplePos + take);
163
+ samplePos += rawS.length;
164
+ instruments[i].nsm = 1;
165
+ }
166
+ ctx.addSample(rawS);
167
+ }
168
+ // Channel defaults: prologue LRLR
169
+ const chan = [];
170
+ for (let k = 0; k < chn; k++) {
171
+ const pan = Math.floor((k + 1) / 2) % 2 * 0xff;
172
+ chan.push({ pan: Math.min(255, Math.max(0, 0x80 + (pan - 0x80))), vol: 0x40, flg: 0 });
173
+ }
174
+ const xxo = [];
175
+ for (let i = 0; i < len; i++)
176
+ xxo.push(xxoRaw[i]);
177
+ const mod = {
178
+ title: '',
179
+ format: 'amf',
180
+ comment: '',
181
+ chn,
182
+ pat,
183
+ ins,
184
+ len,
185
+ restart: rst,
186
+ xxo,
187
+ channels: chan,
188
+ patterns,
189
+ instruments,
190
+ samples: rawSamples,
191
+ num_sequences: 0,
192
+ sequences: [],
193
+ speed: spd,
194
+ bpm,
195
+ volbase: 0x40,
196
+ gvolbase: 0x40,
197
+ gvol: 0x40,
198
+ quirks: 0,
199
+ flowMode: 0,
200
+ readEventType: 0, // READ_EVENT_MOD
201
+ periodType: 0, // PERIOD_AMIGA (prologue default)
202
+ defpan: 0x80,
203
+ time_factor: 10,
204
+ rrate: 250,
205
+ c4rate: 8287, // PAL prologue default — asylum never sets c4rate
206
+ compare_vblank: false,
207
+ tracker: 'Asylum Music Format v1.0',
208
+ };
209
+ void ctx.sampleRate;
210
+ void ctx.outputRate;
211
+ return mod;
212
+ }
213
+ // ---------------------------------------------------------------------------
214
+ // Plugin
215
+ // ---------------------------------------------------------------------------
216
+ /** Asylum format plugin (libxmp loaders/asylum_load.c + read_event MOD). */
217
+ export const plugin = {
218
+ name: 'asylum',
219
+ test: asylumTest,
220
+ load: asylumLoad,
221
+ readEvent(core, chn, row) {
222
+ const mod = core.module;
223
+ const e = core.readEventScratch(chn) ?? core.readEventAt(mod.xxo[core.ctx.p.ord] ?? 0, chn, row);
224
+ readEventMod(core, e, chn);
225
+ },
226
+ };
227
+ //# sourceMappingURL=asylum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asylum.js","sourceRoot":"","sources":["../src/asylum.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { asylumTest, asylumLoad, plugin } from './asylum.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,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,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-asylum — Asylum Music Format v1.0 loader + event reader.
5
+ export { asylumTest, asylumLoad, plugin } from './asylum.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,0EAA0E;AAE1E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,49 @@
1
1
  {
2
2
  "name": "@modplayjs/fmt-asylum",
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": "Asylum Music Format v1.0 (AMF) plugin for modplayjs (libxmp asylum_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
+ "amf",
28
+ "asylum",
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-asylum"
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
+ }