@beatbax/engine 0.1.0
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/.tsbuildinfo +1 -0
- package/dist/audio/bufferedRenderer.d.ts +32 -0
- package/dist/audio/bufferedRenderer.d.ts.map +1 -0
- package/dist/audio/bufferedRenderer.js +309 -0
- package/dist/audio/bufferedRenderer.js.map +1 -0
- package/dist/audio/pcmRenderer.d.ts +25 -0
- package/dist/audio/pcmRenderer.d.ts.map +1 -0
- package/dist/audio/pcmRenderer.js +1288 -0
- package/dist/audio/pcmRenderer.js.map +1 -0
- package/dist/audio/playback.d.ts +57 -0
- package/dist/audio/playback.d.ts.map +1 -0
- package/dist/audio/playback.js +794 -0
- package/dist/audio/playback.js.map +1 -0
- package/dist/chips/gameboy/apu.d.ts +9 -0
- package/dist/chips/gameboy/apu.d.ts.map +1 -0
- package/dist/chips/gameboy/apu.js +27 -0
- package/dist/chips/gameboy/apu.js.map +1 -0
- package/dist/chips/gameboy/noise.d.ts +6 -0
- package/dist/chips/gameboy/noise.d.ts.map +1 -0
- package/dist/chips/gameboy/noise.js +155 -0
- package/dist/chips/gameboy/noise.js.map +1 -0
- package/dist/chips/gameboy/packet.d.ts +3 -0
- package/dist/chips/gameboy/packet.d.ts.map +1 -0
- package/dist/chips/gameboy/packet.js +3 -0
- package/dist/chips/gameboy/packet.js.map +1 -0
- package/dist/chips/gameboy/periodTables.d.ts +16 -0
- package/dist/chips/gameboy/periodTables.d.ts.map +1 -0
- package/dist/chips/gameboy/periodTables.js +29 -0
- package/dist/chips/gameboy/periodTables.js.map +1 -0
- package/dist/chips/gameboy/pulse.d.ts +12 -0
- package/dist/chips/gameboy/pulse.d.ts.map +1 -0
- package/dist/chips/gameboy/pulse.js +275 -0
- package/dist/chips/gameboy/pulse.js.map +1 -0
- package/dist/chips/gameboy/wave.d.ts +8 -0
- package/dist/chips/gameboy/wave.d.ts.map +1 -0
- package/dist/chips/gameboy/wave.js +146 -0
- package/dist/chips/gameboy/wave.js.map +1 -0
- package/dist/effects/index.d.ts +7 -0
- package/dist/effects/index.d.ts.map +1 -0
- package/dist/effects/index.js +1028 -0
- package/dist/effects/index.js.map +1 -0
- package/dist/effects/types.d.ts +8 -0
- package/dist/effects/types.d.ts.map +1 -0
- package/dist/effects/types.js +2 -0
- package/dist/effects/types.js.map +1 -0
- package/dist/expand/refExpander.d.ts +14 -0
- package/dist/expand/refExpander.d.ts.map +1 -0
- package/dist/expand/refExpander.js +130 -0
- package/dist/expand/refExpander.js.map +1 -0
- package/dist/export/index.d.ts +5 -0
- package/dist/export/index.d.ts.map +1 -0
- package/dist/export/index.js +5 -0
- package/dist/export/index.js.map +1 -0
- package/dist/export/jsonExport.d.ts +9 -0
- package/dist/export/jsonExport.d.ts.map +1 -0
- package/dist/export/jsonExport.js +184 -0
- package/dist/export/jsonExport.js.map +1 -0
- package/dist/export/midiExport.d.ts +9 -0
- package/dist/export/midiExport.d.ts.map +1 -0
- package/dist/export/midiExport.js +390 -0
- package/dist/export/midiExport.js.map +1 -0
- package/dist/export/ugeWriter.d.ts +33 -0
- package/dist/export/ugeWriter.d.ts.map +1 -0
- package/dist/export/ugeWriter.js +1997 -0
- package/dist/export/ugeWriter.js.map +1 -0
- package/dist/export/wavWriter.d.ts +24 -0
- package/dist/export/wavWriter.d.ts.map +1 -0
- package/dist/export/wavWriter.js +126 -0
- package/dist/export/wavWriter.js.map +1 -0
- package/dist/import/index.d.ts +5 -0
- package/dist/import/index.d.ts.map +1 -0
- package/dist/import/index.js +8 -0
- package/dist/import/index.js.map +1 -0
- package/dist/import/remoteCache.d.ts +60 -0
- package/dist/import/remoteCache.d.ts.map +1 -0
- package/dist/import/remoteCache.js +194 -0
- package/dist/import/remoteCache.js.map +1 -0
- package/dist/import/uge/uge.reader.d.ts +27 -0
- package/dist/import/uge/uge.reader.d.ts.map +1 -0
- package/dist/import/uge/uge.reader.js +545 -0
- package/dist/import/uge/uge.reader.js.map +1 -0
- package/dist/import/urlUtils.d.ts +50 -0
- package/dist/import/urlUtils.d.ts.map +1 -0
- package/dist/import/urlUtils.js +87 -0
- package/dist/import/urlUtils.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +318 -0
- package/dist/index.js.map +1 -0
- package/dist/instruments/instrumentState.d.ts +15 -0
- package/dist/instruments/instrumentState.d.ts.map +1 -0
- package/dist/instruments/instrumentState.js +24 -0
- package/dist/instruments/instrumentState.js.map +1 -0
- package/dist/parser/ast.d.ts +22 -0
- package/dist/parser/ast.d.ts.map +1 -0
- package/dist/parser/ast.js +5 -0
- package/dist/parser/ast.js.map +1 -0
- package/dist/parser/index.d.ts +14 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +10 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/peggy/generated/parser.d.ts +8 -0
- package/dist/parser/peggy/generated/parser.d.ts.map +1 -0
- package/dist/parser/peggy/generated/parser.js +6269 -0
- package/dist/parser/peggy/generated/parser.js.map +1 -0
- package/dist/parser/peggy/index.d.ts +3 -0
- package/dist/parser/peggy/index.d.ts.map +1 -0
- package/dist/parser/peggy/index.js +555 -0
- package/dist/parser/peggy/index.js.map +1 -0
- package/dist/parser/structured.d.ts +16 -0
- package/dist/parser/structured.d.ts.map +1 -0
- package/dist/parser/structured.js +232 -0
- package/dist/parser/structured.js.map +1 -0
- package/dist/parser/tokenizer.d.ts +12 -0
- package/dist/parser/tokenizer.d.ts.map +1 -0
- package/dist/parser/tokenizer.js +14 -0
- package/dist/parser/tokenizer.js.map +1 -0
- package/dist/patterns/expand.d.ts +32 -0
- package/dist/patterns/expand.d.ts.map +1 -0
- package/dist/patterns/expand.js +184 -0
- package/dist/patterns/expand.js.map +1 -0
- package/dist/patterns/index.d.ts +2 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +2 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/scheduler/index.d.ts +6 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +9 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/tickScheduler.d.ts +27 -0
- package/dist/scheduler/tickScheduler.d.ts.map +1 -0
- package/dist/scheduler/tickScheduler.js +74 -0
- package/dist/scheduler/tickScheduler.js.map +1 -0
- package/dist/sequences/expand.d.ts +14 -0
- package/dist/sequences/expand.d.ts.map +1 -0
- package/dist/sequences/expand.js +137 -0
- package/dist/sequences/expand.js.map +1 -0
- package/dist/song/importResolver.browser.d.ts +29 -0
- package/dist/song/importResolver.browser.d.ts.map +1 -0
- package/dist/song/importResolver.browser.js +168 -0
- package/dist/song/importResolver.browser.js.map +1 -0
- package/dist/song/importResolver.d.ts +40 -0
- package/dist/song/importResolver.d.ts.map +1 -0
- package/dist/song/importResolver.js +445 -0
- package/dist/song/importResolver.js.map +1 -0
- package/dist/song/index.browser.d.ts +9 -0
- package/dist/song/index.browser.d.ts.map +1 -0
- package/dist/song/index.browser.js +7 -0
- package/dist/song/index.browser.js.map +1 -0
- package/dist/song/index.d.ts +8 -0
- package/dist/song/index.d.ts.map +1 -0
- package/dist/song/index.js +6 -0
- package/dist/song/index.js.map +1 -0
- package/dist/song/resolver.browser.d.ts +50 -0
- package/dist/song/resolver.browser.d.ts.map +1 -0
- package/dist/song/resolver.browser.js +536 -0
- package/dist/song/resolver.browser.js.map +1 -0
- package/dist/song/resolver.d.ts +20 -0
- package/dist/song/resolver.d.ts.map +1 -0
- package/dist/song/resolver.js +540 -0
- package/dist/song/resolver.js.map +1 -0
- package/dist/song/songModel.d.ts +34 -0
- package/dist/song/songModel.d.ts.map +1 -0
- package/dist/song/songModel.js +2 -0
- package/dist/song/songModel.js.map +1 -0
- package/dist/tests/refExpander.test.d.ts +2 -0
- package/dist/tests/refExpander.test.d.ts.map +1 -0
- package/dist/tests/refExpander.test.js +37 -0
- package/dist/tests/refExpander.test.js.map +1 -0
- package/dist/util/diag.d.ts +16 -0
- package/dist/util/diag.d.ts.map +1 -0
- package/dist/util/diag.js +29 -0
- package/dist/util/diag.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
import { warn as diagWarn } from '../util/diag.js';
|
|
2
|
+
import { expandAllSequences } from '../sequences/expand.js';
|
|
3
|
+
import { applyInstrumentToEvent } from '../instruments/instrumentState.js';
|
|
4
|
+
import { patternEventsToTokens, } from '../parser/structured.js';
|
|
5
|
+
import { expandRefToTokens } from '../expand/refExpander.js';
|
|
6
|
+
import { resolveImports, resolveImportsSync } from './importResolver.browser.js';
|
|
7
|
+
import { isRemoteImport } from '../import/urlUtils.js';
|
|
8
|
+
// Helpers for parsing inline effects and pan specifications
|
|
9
|
+
function parsePanSpec(val, ns) {
|
|
10
|
+
if (val === undefined || val === null)
|
|
11
|
+
return undefined;
|
|
12
|
+
const s = String(val).trim();
|
|
13
|
+
const up = s.toUpperCase();
|
|
14
|
+
if (up === 'L' || up === 'R' || up === 'C') {
|
|
15
|
+
return { enum: up, sourceNamespace: ns };
|
|
16
|
+
}
|
|
17
|
+
// Numeric value
|
|
18
|
+
const n = Number(s);
|
|
19
|
+
if (!Number.isNaN(n)) {
|
|
20
|
+
return { value: Math.max(-1, Math.min(1, n)), sourceNamespace: ns };
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
// Helper: determine whether a parsed pan value is effectively empty.
|
|
25
|
+
// We only consider an object "non-empty" if it has its own `enum` or `value` property.
|
|
26
|
+
export function isPanEmpty(pan) {
|
|
27
|
+
if (pan === undefined || pan === null)
|
|
28
|
+
return true;
|
|
29
|
+
if (typeof pan === 'object') {
|
|
30
|
+
const hasEnum = Object.prototype.hasOwnProperty.call(pan, 'enum');
|
|
31
|
+
const hasValue = Object.prototype.hasOwnProperty.call(pan, 'value');
|
|
32
|
+
return !(hasEnum || hasValue);
|
|
33
|
+
}
|
|
34
|
+
// strings or numbers are considered non-empty pan specifications
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
export function parseEffectParams(paramsStr) {
|
|
38
|
+
if (!paramsStr || !paramsStr.length)
|
|
39
|
+
return [];
|
|
40
|
+
return paramsStr
|
|
41
|
+
.split(',')
|
|
42
|
+
.map(s => s.trim())
|
|
43
|
+
.filter(s => s !== '')
|
|
44
|
+
.map(s => (isNaN(Number(s)) ? s : Number(s)));
|
|
45
|
+
}
|
|
46
|
+
export function parseEffectsInline(str) {
|
|
47
|
+
// Keep empty parts so positional empty parameters are preserved (e.g. "vib:3,6,,8")
|
|
48
|
+
const rawParts = str.split(',').map(s => s.trim());
|
|
49
|
+
const effects = [];
|
|
50
|
+
let pan = undefined;
|
|
51
|
+
// Group parts so that effect parameters following a `type:...` are attached
|
|
52
|
+
// to that effect until the next part that contains a colon (start of next effect).
|
|
53
|
+
let currentEffect = null;
|
|
54
|
+
for (const p of rawParts) {
|
|
55
|
+
// Detect namespaced pan tokens first: gb:pan:L, pan:L, pan=-0.5
|
|
56
|
+
const panMatch = p.match(/^(?:(gb):)?pan[:=](-?\d*\.?\d+|L|R|C)$/i);
|
|
57
|
+
if (panMatch) {
|
|
58
|
+
const [, ns, val] = panMatch;
|
|
59
|
+
const up = String(val).toUpperCase();
|
|
60
|
+
if (up === 'L' || up === 'R' || up === 'C') {
|
|
61
|
+
pan = { enum: up, sourceNamespace: ns || undefined };
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const num = Number(val);
|
|
65
|
+
if (!Number.isNaN(num))
|
|
66
|
+
pan = { value: Math.max(-1, Math.min(1, num)), sourceNamespace: ns || undefined };
|
|
67
|
+
}
|
|
68
|
+
// finalize any pending effect before continuing
|
|
69
|
+
if (currentEffect) {
|
|
70
|
+
effects.push({ type: currentEffect.type, params: parseEffectParams(currentEffect.paramsStr) });
|
|
71
|
+
currentEffect = null;
|
|
72
|
+
}
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
// Check if this part starts a new effect (contains a colon)
|
|
76
|
+
const m = p.match(/^([a-zA-Z_][a-zA-Z0-9_-]*):(.*)$/);
|
|
77
|
+
if (m && m[1]) {
|
|
78
|
+
// This part has a colon, so it's a new effect type:params
|
|
79
|
+
if (currentEffect) {
|
|
80
|
+
effects.push({ type: currentEffect.type, params: parseEffectParams(currentEffect.paramsStr), paramsStr: currentEffect.paramsStr });
|
|
81
|
+
}
|
|
82
|
+
currentEffect = { type: m[1], paramsStr: m[2] };
|
|
83
|
+
}
|
|
84
|
+
else if (currentEffect) {
|
|
85
|
+
// This part is an additional parameter for the current effect
|
|
86
|
+
currentEffect.paramsStr = (currentEffect.paramsStr ? (currentEffect.paramsStr + ',' + p) : p);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Bare identifier with no colon - treat as an effect type with no params (preset name)
|
|
90
|
+
const bareMatch = p.match(/^[a-zA-Z_][a-zA-Z0-9_-]*$/);
|
|
91
|
+
if (bareMatch) {
|
|
92
|
+
currentEffect = { type: p, paramsStr: '' };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Otherwise orphaned - ignore it
|
|
96
|
+
}
|
|
97
|
+
if (currentEffect) {
|
|
98
|
+
effects.push({ type: currentEffect.type, params: parseEffectParams(currentEffect.paramsStr), paramsStr: currentEffect.paramsStr });
|
|
99
|
+
}
|
|
100
|
+
return { effects, pan };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Resolve an AST into a SongModel (ISM), expanding sequences and resolving
|
|
104
|
+
* instrument overrides according to the language expansion pipeline.
|
|
105
|
+
*
|
|
106
|
+
* Note: This function does not support remote imports in the browser.
|
|
107
|
+
* Use resolveSongAsync() instead for remote imports.
|
|
108
|
+
*/
|
|
109
|
+
export function resolveSong(ast, opts) {
|
|
110
|
+
// Check for remote imports
|
|
111
|
+
if (ast.imports && ast.imports.some(imp => isRemoteImport(imp.source))) {
|
|
112
|
+
throw new Error('Remote imports (http://, https://, github:) are not supported in synchronous mode. ' +
|
|
113
|
+
'Use resolveSongAsync() instead.');
|
|
114
|
+
}
|
|
115
|
+
// Resolve imports first if present
|
|
116
|
+
if (ast.imports && ast.imports.length > 0) {
|
|
117
|
+
ast = resolveImportsSync(ast, {
|
|
118
|
+
strictMode: opts?.strictInstruments,
|
|
119
|
+
onWarn: (message, loc) => {
|
|
120
|
+
if (opts?.onWarn) {
|
|
121
|
+
opts.onWarn({ component: 'import-resolver', message, file: opts.filename, loc });
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return resolveSongInternal(ast, opts);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Async version of resolveSong that supports remote imports.
|
|
130
|
+
* Use this when your AST may contain remote imports (http://, https://, github:).
|
|
131
|
+
*/
|
|
132
|
+
export async function resolveSongAsync(ast, opts) {
|
|
133
|
+
// Resolve imports first if present (supports remote imports only in browser)
|
|
134
|
+
if (ast.imports && ast.imports.length > 0) {
|
|
135
|
+
ast = await resolveImports(ast, {
|
|
136
|
+
strictMode: opts?.strictInstruments,
|
|
137
|
+
onWarn: (message, loc) => {
|
|
138
|
+
if (opts?.onWarn) {
|
|
139
|
+
opts.onWarn({ component: 'import-resolver', message, file: opts.filename, loc });
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return resolveSongInternal(ast, opts);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Internal implementation shared by resolveSong and resolveSongAsync.
|
|
148
|
+
* Assumes imports have already been resolved.
|
|
149
|
+
*/
|
|
150
|
+
function resolveSongInternal(ast, opts) {
|
|
151
|
+
let pats = ast.pats || {};
|
|
152
|
+
const insts = ast.insts || {};
|
|
153
|
+
let seqs = { ...(ast.seqs || {}) };
|
|
154
|
+
let bpm = ast.bpm;
|
|
155
|
+
if (ast.patternEvents) {
|
|
156
|
+
const materialized = {};
|
|
157
|
+
for (const [name, events] of Object.entries(ast.patternEvents)) {
|
|
158
|
+
materialized[name] = patternEventsToTokens(events);
|
|
159
|
+
}
|
|
160
|
+
pats = { ...pats, ...materialized }; // structured takes precedence on key collision
|
|
161
|
+
}
|
|
162
|
+
// Prefer structured `sequenceItems` (if present) so downstream expanders
|
|
163
|
+
// can handle structured transforms/tokens directly. We don't fully
|
|
164
|
+
// materialize them here; expanders accept either string[] or
|
|
165
|
+
// structured SequenceItem[] and will materialize as needed.
|
|
166
|
+
if (ast.sequenceItems) {
|
|
167
|
+
// `ast.sequenceItems` contains structured `SequenceItem[]` entries.
|
|
168
|
+
// Merge into `seqs` while preserving the possibility that values
|
|
169
|
+
// may be either `string[]` (expanded) or `SequenceItem[]` (structured).
|
|
170
|
+
seqs = { ...seqs, ...ast.sequenceItems };
|
|
171
|
+
}
|
|
172
|
+
// Expand all sequences into flattened token arrays
|
|
173
|
+
const expandedSeqs = expandAllSequences(seqs, pats, insts, ast.effects);
|
|
174
|
+
// Helper: expand inline effect presets found inside `<...>` by looking up
|
|
175
|
+
// named presets from `ast.effects`. If an inline effect is a bare name
|
|
176
|
+
// that matches a preset and has no explicit params, replace it with the
|
|
177
|
+
// preset's parsed effects (but do not override other explicit inline
|
|
178
|
+
// effects of the same type — explicit inline params take precedence).
|
|
179
|
+
const expandInlinePresets = (effectsArr) => {
|
|
180
|
+
if (!effectsArr || !ast.effects)
|
|
181
|
+
return effectsArr || [];
|
|
182
|
+
const presets = ast.effects;
|
|
183
|
+
// Collect types that were explicitly provided with params in the inline list
|
|
184
|
+
const explicitTypes = new Set();
|
|
185
|
+
for (const e of effectsArr) {
|
|
186
|
+
if (e.params && e.params.length > 0)
|
|
187
|
+
explicitTypes.add(e.type);
|
|
188
|
+
}
|
|
189
|
+
const out = [];
|
|
190
|
+
for (const e of effectsArr) {
|
|
191
|
+
// If this effect name matches a preset and has no params, expand it
|
|
192
|
+
if (presets[e.type] && (!e.params || e.params.length === 0)) {
|
|
193
|
+
const presetParsed = parseEffectsInline(presets[e.type]);
|
|
194
|
+
for (const pe of presetParsed.effects) {
|
|
195
|
+
if (!explicitTypes.has(pe.type))
|
|
196
|
+
out.push(pe);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
out.push(e);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return out;
|
|
204
|
+
};
|
|
205
|
+
// Helper: normalize effect durations (especially vibrato/tremolo rows-to-seconds conversion)
|
|
206
|
+
const normalizeEffectDurations = (effects, bpm, ticksPerStep = 16) => {
|
|
207
|
+
if (!effects || !effects.length)
|
|
208
|
+
return effects;
|
|
209
|
+
return effects.map(effect => {
|
|
210
|
+
// Both vibrato and tremolo support durationRows as params[3]
|
|
211
|
+
if ((effect.type === 'vib' || effect.type === 'trem') && effect.params && effect.params.length >= 4) {
|
|
212
|
+
try {
|
|
213
|
+
const durationRows = Number(effect.params[3]);
|
|
214
|
+
if (!Number.isNaN(durationRows) && durationRows > 0) {
|
|
215
|
+
// Convert rows to seconds: (rows / stepsPerRow) / (bpm / 60)
|
|
216
|
+
const stepsPerRow = ticksPerStep / 4; // assuming 4/4 time
|
|
217
|
+
const beatsPerSecond = bpm / 60;
|
|
218
|
+
const durationSec = (durationRows / stepsPerRow) / beatsPerSecond;
|
|
219
|
+
return {
|
|
220
|
+
...effect,
|
|
221
|
+
params: [...effect.params.slice(0, 3), effect.params[3]],
|
|
222
|
+
durationSec
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (e) {
|
|
227
|
+
// If conversion fails, keep original params
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return effect;
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
// Helper to consistently emit resolver warnings via opts.onWarn if it's a
|
|
234
|
+
// function, otherwise fall back to the diagnostic helper.
|
|
235
|
+
const emitResolverWarn = (message, loc) => {
|
|
236
|
+
const meta = { file: opts && opts.filename ? opts.filename : undefined, loc };
|
|
237
|
+
if (opts && typeof opts.onWarn === 'function') {
|
|
238
|
+
opts.onWarn({ component: 'resolver', message, file: meta.file, loc: meta.loc });
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
diagWarn('resolver', message, meta);
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
const channels = [];
|
|
245
|
+
// use shared expander
|
|
246
|
+
// Support `arrange` AST: if present prefer it over channel mappings.
|
|
247
|
+
const channelSources = (() => {
|
|
248
|
+
if (ast.arranges && Object.keys(ast.arranges).length > 0) {
|
|
249
|
+
if (ast.channels && ast.channels.length > 0) {
|
|
250
|
+
emitResolverWarn('Both `arrange` and `channel` mappings present; using `arrange` and ignoring `channel` mappings.', undefined);
|
|
251
|
+
}
|
|
252
|
+
// choose 'main' arrange if present, otherwise first arrange
|
|
253
|
+
const keys = Object.keys(ast.arranges);
|
|
254
|
+
const selected = keys.includes('main') ? 'main' : keys[0];
|
|
255
|
+
const arr = ast.arranges[selected];
|
|
256
|
+
// If the arrange supplies a bpm default, prefer it for this resolved song
|
|
257
|
+
if (arr.defaults && arr.defaults.bpm != null) {
|
|
258
|
+
const nb = Number(arr.defaults.bpm);
|
|
259
|
+
if (!Number.isNaN(nb))
|
|
260
|
+
bpm = nb;
|
|
261
|
+
}
|
|
262
|
+
const rows = arr.arrangements || [];
|
|
263
|
+
// support per-column instrument defaults encoded as a '|' separated string
|
|
264
|
+
let arrangeInstList = null;
|
|
265
|
+
if (arr.defaults && arr.defaults.inst && typeof arr.defaults.inst === 'string' && arr.defaults.inst.indexOf('|') >= 0) {
|
|
266
|
+
arrangeInstList = String(arr.defaults.inst).split('|').map(s => s.trim());
|
|
267
|
+
}
|
|
268
|
+
const maxSlots = rows.reduce((m, r) => Math.max(m, r.length), 0);
|
|
269
|
+
const channelNodes = [];
|
|
270
|
+
for (let i = 0; i < maxSlots; i++) {
|
|
271
|
+
const concatenated = [];
|
|
272
|
+
for (const row of rows) {
|
|
273
|
+
const slot = row[i];
|
|
274
|
+
if (!slot)
|
|
275
|
+
continue;
|
|
276
|
+
// do not insert inline `inst(...)` tokens here; per-column defaults are applied
|
|
277
|
+
// via the synthesized channel's `inst` property (handled below)
|
|
278
|
+
// expand the referenced sequence into tokens (if available), supporting transforms
|
|
279
|
+
const toks = expandRefToTokens(slot, expandedSeqs, pats, ast.effects);
|
|
280
|
+
const base = String(slot).split(':')[0];
|
|
281
|
+
// If expansion produced a single raw token equal to the slot and the base
|
|
282
|
+
// name doesn't exist as a sequence or pattern, emit a warning.
|
|
283
|
+
if (toks.length === 1 && toks[0] === slot && !expandedSeqs[base] && !pats[base]) {
|
|
284
|
+
emitResolverWarn(`arrange: sequence '${slot}' not found while expanding arrange '${selected}'.`, arr.loc);
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
concatenated.push(...toks);
|
|
288
|
+
}
|
|
289
|
+
const instForCol = arrangeInstList ? (arrangeInstList[i] || undefined) : (arr.defaults && arr.defaults.inst ? arr.defaults.inst : undefined);
|
|
290
|
+
const speedForCol = arr.defaults && arr.defaults.speed ? arr.defaults.speed : undefined;
|
|
291
|
+
channelNodes.push({ id: i + 1, pat: concatenated, inst: instForCol, speed: speedForCol });
|
|
292
|
+
}
|
|
293
|
+
return channelNodes;
|
|
294
|
+
}
|
|
295
|
+
return ast.channels || [];
|
|
296
|
+
})();
|
|
297
|
+
for (const ch of channelSources) {
|
|
298
|
+
const chModel = { id: ch.id, speed: ch.speed, events: [], defaultInstrument: ch.inst };
|
|
299
|
+
// Determine source tokens: channel may reference a pattern name, sequence name, or already have token array
|
|
300
|
+
let tokens = [];
|
|
301
|
+
if (Array.isArray(ch.pat)) {
|
|
302
|
+
tokens = ch.pat.slice();
|
|
303
|
+
}
|
|
304
|
+
else if (typeof ch.pat === 'string') {
|
|
305
|
+
const ref = ch.pat;
|
|
306
|
+
// A channel `seq` spec may contain multiple sequence names separated by
|
|
307
|
+
// commas and repetition syntax like `name * 2`. We support two forms:
|
|
308
|
+
// - comma-separated: "lead,lead2"
|
|
309
|
+
// - repetition: "lead * 2" or "lead*2"
|
|
310
|
+
let items;
|
|
311
|
+
if (ch.seqSpecTokens) {
|
|
312
|
+
const raw = ch.seqSpecTokens;
|
|
313
|
+
const joined = raw.join(' ');
|
|
314
|
+
// split on commas first, then split whitespace-only groups into multiple items
|
|
315
|
+
items = [];
|
|
316
|
+
for (const group of joined.split(',')) {
|
|
317
|
+
const g = group.trim();
|
|
318
|
+
if (!g)
|
|
319
|
+
continue;
|
|
320
|
+
if (g.indexOf('*') >= 0) {
|
|
321
|
+
// keep repetition syntax intact (e.g. "lead * 2" or "lead*2")
|
|
322
|
+
items.push(g);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
// split whitespace-separated names (e.g. "lead lead2")
|
|
326
|
+
const parts = g.split(/\s+/).map(s => s.trim()).filter(Boolean);
|
|
327
|
+
items.push(...parts);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
items = ref.indexOf(',') >= 0 ? ref.split(',').map((s) => s.trim()).filter(Boolean) : [ref.trim()];
|
|
333
|
+
}
|
|
334
|
+
const outTokens = [];
|
|
335
|
+
for (const item of items) {
|
|
336
|
+
// check repetition like "name * 2" or "name*2"
|
|
337
|
+
const mRep = item.match(/^(.+?)\s*\*\s*(\d+)$/);
|
|
338
|
+
const repeat = mRep ? parseInt(mRep[2], 10) : 1;
|
|
339
|
+
const itemRef = mRep ? mRep[1].trim() : item;
|
|
340
|
+
for (let r = 0; r < repeat; r++) {
|
|
341
|
+
const toks = expandRefToTokens(itemRef, expandedSeqs, pats, ast.effects, ch.loc);
|
|
342
|
+
outTokens.push(...toks);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
tokens = outTokens;
|
|
346
|
+
}
|
|
347
|
+
// Instrument state
|
|
348
|
+
let currentInstName = ch.inst;
|
|
349
|
+
let tempInstName = undefined;
|
|
350
|
+
let tempRemaining = 0;
|
|
351
|
+
// Sequence-level pan override (applies until reset via pan() token)
|
|
352
|
+
let sequencePanOverride = undefined;
|
|
353
|
+
function resolveInstName(name) {
|
|
354
|
+
if (!name)
|
|
355
|
+
return undefined;
|
|
356
|
+
return name in insts ? name : name; // keep string name; consumer can map to insts
|
|
357
|
+
}
|
|
358
|
+
for (let ti = 0; ti < tokens.length; ti++) {
|
|
359
|
+
const token = tokens[ti];
|
|
360
|
+
// inst(name) or inst(name,N)
|
|
361
|
+
const mInstInline = typeof token === 'string' && token.match(/^inst\(([^,()\s]+)(?:,(\d+))?\)$/i);
|
|
362
|
+
if (mInstInline) {
|
|
363
|
+
const name = mInstInline[1];
|
|
364
|
+
const count = mInstInline[2] ? parseInt(mInstInline[2], 10) : null;
|
|
365
|
+
if (count && count > 0) {
|
|
366
|
+
// Look ahead to determine if any future token will produce an event
|
|
367
|
+
let hasFutureEvent = false;
|
|
368
|
+
for (let j = ti + 1; j < tokens.length; j++) {
|
|
369
|
+
const fut = tokens[j];
|
|
370
|
+
if (!fut)
|
|
371
|
+
continue;
|
|
372
|
+
if (typeof fut === 'string' && /^inst\(/i.test(fut))
|
|
373
|
+
continue;
|
|
374
|
+
if (typeof fut === 'string' && fut === '.')
|
|
375
|
+
continue;
|
|
376
|
+
// any other token is assumed to produce an event
|
|
377
|
+
hasFutureEvent = true;
|
|
378
|
+
break;
|
|
379
|
+
}
|
|
380
|
+
if (!hasFutureEvent) {
|
|
381
|
+
// Emit `count` immediate named hits on successive ticks
|
|
382
|
+
for (let k = 0; k < count; k++) {
|
|
383
|
+
const ev = { type: 'named', token: name, instrument: name };
|
|
384
|
+
const evWithProps = applyInstrumentToEvent(insts, ev);
|
|
385
|
+
chModel.events.push(evWithProps);
|
|
386
|
+
}
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
// Otherwise behave as temporary override
|
|
390
|
+
tempInstName = resolveInstName(name);
|
|
391
|
+
tempRemaining = count;
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
// permanent inline change
|
|
395
|
+
currentInstName = resolveInstName(name);
|
|
396
|
+
}
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
// pan(spec) sets a sequence-level pan override for the following tokens in this occurrence
|
|
400
|
+
const mPanInline = typeof token === 'string' && token.match(/^pan\(([^)]*)\)$/i);
|
|
401
|
+
const mPanReset = typeof token === 'string' && token.match(/^pan\(\s*\)$/i);
|
|
402
|
+
if (mPanReset) {
|
|
403
|
+
sequencePanOverride = undefined;
|
|
404
|
+
continue;
|
|
405
|
+
}
|
|
406
|
+
if (mPanInline) {
|
|
407
|
+
const specRaw = (mPanInline[1] || '').trim();
|
|
408
|
+
if (specRaw) {
|
|
409
|
+
// support 'gb:R' or 'R' or numeric
|
|
410
|
+
const mNs = specRaw.match(/^(gb)[:]?(.+)$/i);
|
|
411
|
+
if (mNs)
|
|
412
|
+
sequencePanOverride = parsePanSpec(mNs[2], mNs[1]);
|
|
413
|
+
else
|
|
414
|
+
sequencePanOverride = parsePanSpec(specRaw);
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
sequencePanOverride = undefined;
|
|
418
|
+
}
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
// Immediate hit syntax: hit(name,N)
|
|
422
|
+
const mHit = typeof token === 'string' && token.match(/^hit\(([^,()\s]+)(?:,(\d+))?\)$/i);
|
|
423
|
+
if (mHit) {
|
|
424
|
+
const name = mHit[1];
|
|
425
|
+
const count = mHit[2] ? parseInt(mHit[2], 10) : 1;
|
|
426
|
+
for (let k = 0; k < count; k++) {
|
|
427
|
+
const ev = { type: 'named', token: name, instrument: name };
|
|
428
|
+
const evWithProps = applyInstrumentToEvent(insts, ev);
|
|
429
|
+
chModel.events.push(evWithProps);
|
|
430
|
+
}
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
if (token === '.' || token === 'rest' || token === 'R') {
|
|
434
|
+
chModel.events.push({ type: 'rest' });
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
if (token === '_' || token === '-' || token === 'sustain') {
|
|
438
|
+
chModel.events.push({ type: 'sustain' });
|
|
439
|
+
continue;
|
|
440
|
+
}
|
|
441
|
+
// named instrument token (e.g. 'snare') — if it matches an inst name
|
|
442
|
+
if (typeof token === 'string' && insts[token]) {
|
|
443
|
+
const inst = insts[token];
|
|
444
|
+
let ev = { type: 'named', token, instrument: token };
|
|
445
|
+
ev = applyInstrumentToEvent(insts, ev);
|
|
446
|
+
// Pass instrument's default note if specified (after applyInstrumentToEvent)
|
|
447
|
+
if (inst.note) {
|
|
448
|
+
ev.defaultNote = inst.note;
|
|
449
|
+
}
|
|
450
|
+
chModel.events.push(ev);
|
|
451
|
+
// Update current instrument so subsequent notes use this instrument
|
|
452
|
+
currentInstName = token;
|
|
453
|
+
// decrement temp only for non-rest
|
|
454
|
+
if (tempRemaining > 0) {
|
|
455
|
+
tempRemaining -= 1;
|
|
456
|
+
if (tempRemaining <= 0) {
|
|
457
|
+
tempInstName = undefined;
|
|
458
|
+
tempRemaining = 0;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
// assume token is a note like C4 or a note with inline effects: C4<pan:-0.5,vib:4>
|
|
464
|
+
if (typeof token === 'string') {
|
|
465
|
+
// Extract inline effect block if present
|
|
466
|
+
const inlineMatch = token.match(/^([^<]+)<(.+)>$/);
|
|
467
|
+
let baseToken = token;
|
|
468
|
+
let parsedPan = undefined;
|
|
469
|
+
let parsedEffects = [];
|
|
470
|
+
if (inlineMatch) {
|
|
471
|
+
baseToken = inlineMatch[1];
|
|
472
|
+
const inner = inlineMatch[2];
|
|
473
|
+
const parsed = parseEffectsInline(inner);
|
|
474
|
+
parsedPan = parsed.pan;
|
|
475
|
+
parsedEffects = expandInlinePresets(parsed.effects || []);
|
|
476
|
+
}
|
|
477
|
+
const useInst = tempInstName || currentInstName;
|
|
478
|
+
let ev = { type: 'note', token: baseToken, instrument: useInst };
|
|
479
|
+
// attach parsed inline pan/effects to event object
|
|
480
|
+
if (parsedPan)
|
|
481
|
+
ev.pan = parsedPan;
|
|
482
|
+
if (parsedEffects && parsedEffects.length) {
|
|
483
|
+
ev.effects = normalizeEffectDurations(parsedEffects, bpm || 120, 16);
|
|
484
|
+
// Set legato=true if note has portamento effect (prevents envelope retrigger)
|
|
485
|
+
const hasPortamento = ev.effects.some((fx) => fx && (fx.type === 'port' || (typeof fx === 'string' && fx.toLowerCase() === 'port')));
|
|
486
|
+
if (hasPortamento) {
|
|
487
|
+
ev.legato = true;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
ev = applyInstrumentToEvent(insts, ev);
|
|
491
|
+
// Sequence-level pan override (from :pan() modifier on seq items)
|
|
492
|
+
if (isPanEmpty(ev.pan) && sequencePanOverride) {
|
|
493
|
+
ev.pan = sequencePanOverride;
|
|
494
|
+
}
|
|
495
|
+
// If no inline/sequence pan, but instrument has a pan property, use it as default
|
|
496
|
+
if (isPanEmpty(ev.pan) && ev.instProps) {
|
|
497
|
+
const ip = ev.instProps;
|
|
498
|
+
if (ip['gb:pan']) {
|
|
499
|
+
ev.pan = parsePanSpec(ip['gb:pan'], 'gb');
|
|
500
|
+
}
|
|
501
|
+
else if (ip['pan']) {
|
|
502
|
+
ev.pan = parsePanSpec(ip['pan']);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
chModel.events.push(ev);
|
|
506
|
+
if (tempRemaining > 0) {
|
|
507
|
+
tempRemaining -= 1;
|
|
508
|
+
if (tempRemaining <= 0) {
|
|
509
|
+
tempInstName = undefined;
|
|
510
|
+
tempRemaining = 0;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
continue;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
channels.push(chModel);
|
|
517
|
+
}
|
|
518
|
+
// Also populate `pat` on each channel with the resolved event list for
|
|
519
|
+
// backward-compatible playback (Player expects `ch.pat` to hold tokens
|
|
520
|
+
// or event objects). This keeps both `events` and `pat` available.
|
|
521
|
+
const channelsOut = channels.map(c => ({ id: c.id, events: c.events, defaultInstrument: c.defaultInstrument, pat: c.events }));
|
|
522
|
+
// Preserve top-level playback directives and metadata so consumers can honor them.
|
|
523
|
+
return {
|
|
524
|
+
pats,
|
|
525
|
+
insts,
|
|
526
|
+
seqs: expandedSeqs,
|
|
527
|
+
channels: channelsOut,
|
|
528
|
+
bpm,
|
|
529
|
+
chip: ast.chip,
|
|
530
|
+
volume: ast.volume,
|
|
531
|
+
play: ast.play,
|
|
532
|
+
metadata: ast.metadata
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
export default { resolveSong };
|
|
536
|
+
//# sourceMappingURL=resolver.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.browser.js","sourceRoot":"","sources":["../../src/song/resolver.browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AST } from '../parser/ast.js';
|
|
2
|
+
import { SongModel } from './songModel.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve an AST into a SongModel (ISM), expanding sequences and resolving
|
|
5
|
+
* instrument overrides according to the language expansion pipeline.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveSong(ast: AST, opts?: {
|
|
8
|
+
filename?: string;
|
|
9
|
+
onWarn?: (d: {
|
|
10
|
+
component: string;
|
|
11
|
+
message: string;
|
|
12
|
+
file?: string;
|
|
13
|
+
loc?: any;
|
|
14
|
+
}) => void;
|
|
15
|
+
}): SongModel;
|
|
16
|
+
declare const _default: {
|
|
17
|
+
resolveSong: typeof resolveSong;
|
|
18
|
+
};
|
|
19
|
+
export default _default;
|
|
20
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/song/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAgB,MAAM,kBAAkB,CAAC;AAIrD,OAAO,EAAE,SAAS,EAAoD,MAAM,gBAAgB,CAAC;AA4B7F,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAS5C;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAOvF;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM;;cAGf,MAAM;gBAAU,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;oBAAc,MAAM;;;EAkDxF;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,KAAK,IAAI,CAAA;CAAE,GAAG,SAAS,CAwB1N;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,KAAK,IAAI,CAAA;CAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAgB9O;;;;AAgZD,wBAA+B"}
|