@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.
Files changed (174) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/audio/bufferedRenderer.d.ts +32 -0
  3. package/dist/audio/bufferedRenderer.d.ts.map +1 -0
  4. package/dist/audio/bufferedRenderer.js +309 -0
  5. package/dist/audio/bufferedRenderer.js.map +1 -0
  6. package/dist/audio/pcmRenderer.d.ts +25 -0
  7. package/dist/audio/pcmRenderer.d.ts.map +1 -0
  8. package/dist/audio/pcmRenderer.js +1288 -0
  9. package/dist/audio/pcmRenderer.js.map +1 -0
  10. package/dist/audio/playback.d.ts +57 -0
  11. package/dist/audio/playback.d.ts.map +1 -0
  12. package/dist/audio/playback.js +794 -0
  13. package/dist/audio/playback.js.map +1 -0
  14. package/dist/chips/gameboy/apu.d.ts +9 -0
  15. package/dist/chips/gameboy/apu.d.ts.map +1 -0
  16. package/dist/chips/gameboy/apu.js +27 -0
  17. package/dist/chips/gameboy/apu.js.map +1 -0
  18. package/dist/chips/gameboy/noise.d.ts +6 -0
  19. package/dist/chips/gameboy/noise.d.ts.map +1 -0
  20. package/dist/chips/gameboy/noise.js +155 -0
  21. package/dist/chips/gameboy/noise.js.map +1 -0
  22. package/dist/chips/gameboy/packet.d.ts +3 -0
  23. package/dist/chips/gameboy/packet.d.ts.map +1 -0
  24. package/dist/chips/gameboy/packet.js +3 -0
  25. package/dist/chips/gameboy/packet.js.map +1 -0
  26. package/dist/chips/gameboy/periodTables.d.ts +16 -0
  27. package/dist/chips/gameboy/periodTables.d.ts.map +1 -0
  28. package/dist/chips/gameboy/periodTables.js +29 -0
  29. package/dist/chips/gameboy/periodTables.js.map +1 -0
  30. package/dist/chips/gameboy/pulse.d.ts +12 -0
  31. package/dist/chips/gameboy/pulse.d.ts.map +1 -0
  32. package/dist/chips/gameboy/pulse.js +275 -0
  33. package/dist/chips/gameboy/pulse.js.map +1 -0
  34. package/dist/chips/gameboy/wave.d.ts +8 -0
  35. package/dist/chips/gameboy/wave.d.ts.map +1 -0
  36. package/dist/chips/gameboy/wave.js +146 -0
  37. package/dist/chips/gameboy/wave.js.map +1 -0
  38. package/dist/effects/index.d.ts +7 -0
  39. package/dist/effects/index.d.ts.map +1 -0
  40. package/dist/effects/index.js +1028 -0
  41. package/dist/effects/index.js.map +1 -0
  42. package/dist/effects/types.d.ts +8 -0
  43. package/dist/effects/types.d.ts.map +1 -0
  44. package/dist/effects/types.js +2 -0
  45. package/dist/effects/types.js.map +1 -0
  46. package/dist/expand/refExpander.d.ts +14 -0
  47. package/dist/expand/refExpander.d.ts.map +1 -0
  48. package/dist/expand/refExpander.js +130 -0
  49. package/dist/expand/refExpander.js.map +1 -0
  50. package/dist/export/index.d.ts +5 -0
  51. package/dist/export/index.d.ts.map +1 -0
  52. package/dist/export/index.js +5 -0
  53. package/dist/export/index.js.map +1 -0
  54. package/dist/export/jsonExport.d.ts +9 -0
  55. package/dist/export/jsonExport.d.ts.map +1 -0
  56. package/dist/export/jsonExport.js +184 -0
  57. package/dist/export/jsonExport.js.map +1 -0
  58. package/dist/export/midiExport.d.ts +9 -0
  59. package/dist/export/midiExport.d.ts.map +1 -0
  60. package/dist/export/midiExport.js +390 -0
  61. package/dist/export/midiExport.js.map +1 -0
  62. package/dist/export/ugeWriter.d.ts +33 -0
  63. package/dist/export/ugeWriter.d.ts.map +1 -0
  64. package/dist/export/ugeWriter.js +1997 -0
  65. package/dist/export/ugeWriter.js.map +1 -0
  66. package/dist/export/wavWriter.d.ts +24 -0
  67. package/dist/export/wavWriter.d.ts.map +1 -0
  68. package/dist/export/wavWriter.js +126 -0
  69. package/dist/export/wavWriter.js.map +1 -0
  70. package/dist/import/index.d.ts +5 -0
  71. package/dist/import/index.d.ts.map +1 -0
  72. package/dist/import/index.js +8 -0
  73. package/dist/import/index.js.map +1 -0
  74. package/dist/import/remoteCache.d.ts +60 -0
  75. package/dist/import/remoteCache.d.ts.map +1 -0
  76. package/dist/import/remoteCache.js +194 -0
  77. package/dist/import/remoteCache.js.map +1 -0
  78. package/dist/import/uge/uge.reader.d.ts +27 -0
  79. package/dist/import/uge/uge.reader.d.ts.map +1 -0
  80. package/dist/import/uge/uge.reader.js +545 -0
  81. package/dist/import/uge/uge.reader.js.map +1 -0
  82. package/dist/import/urlUtils.d.ts +50 -0
  83. package/dist/import/urlUtils.d.ts.map +1 -0
  84. package/dist/import/urlUtils.js +87 -0
  85. package/dist/import/urlUtils.js.map +1 -0
  86. package/dist/index.d.ts +18 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +318 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/instruments/instrumentState.d.ts +15 -0
  91. package/dist/instruments/instrumentState.d.ts.map +1 -0
  92. package/dist/instruments/instrumentState.js +24 -0
  93. package/dist/instruments/instrumentState.js.map +1 -0
  94. package/dist/parser/ast.d.ts +22 -0
  95. package/dist/parser/ast.d.ts.map +1 -0
  96. package/dist/parser/ast.js +5 -0
  97. package/dist/parser/ast.js.map +1 -0
  98. package/dist/parser/index.d.ts +14 -0
  99. package/dist/parser/index.d.ts.map +1 -0
  100. package/dist/parser/index.js +10 -0
  101. package/dist/parser/index.js.map +1 -0
  102. package/dist/parser/peggy/generated/parser.d.ts +8 -0
  103. package/dist/parser/peggy/generated/parser.d.ts.map +1 -0
  104. package/dist/parser/peggy/generated/parser.js +6269 -0
  105. package/dist/parser/peggy/generated/parser.js.map +1 -0
  106. package/dist/parser/peggy/index.d.ts +3 -0
  107. package/dist/parser/peggy/index.d.ts.map +1 -0
  108. package/dist/parser/peggy/index.js +555 -0
  109. package/dist/parser/peggy/index.js.map +1 -0
  110. package/dist/parser/structured.d.ts +16 -0
  111. package/dist/parser/structured.d.ts.map +1 -0
  112. package/dist/parser/structured.js +232 -0
  113. package/dist/parser/structured.js.map +1 -0
  114. package/dist/parser/tokenizer.d.ts +12 -0
  115. package/dist/parser/tokenizer.d.ts.map +1 -0
  116. package/dist/parser/tokenizer.js +14 -0
  117. package/dist/parser/tokenizer.js.map +1 -0
  118. package/dist/patterns/expand.d.ts +32 -0
  119. package/dist/patterns/expand.d.ts.map +1 -0
  120. package/dist/patterns/expand.js +184 -0
  121. package/dist/patterns/expand.js.map +1 -0
  122. package/dist/patterns/index.d.ts +2 -0
  123. package/dist/patterns/index.d.ts.map +1 -0
  124. package/dist/patterns/index.js +2 -0
  125. package/dist/patterns/index.js.map +1 -0
  126. package/dist/scheduler/index.d.ts +6 -0
  127. package/dist/scheduler/index.d.ts.map +1 -0
  128. package/dist/scheduler/index.js +9 -0
  129. package/dist/scheduler/index.js.map +1 -0
  130. package/dist/scheduler/tickScheduler.d.ts +27 -0
  131. package/dist/scheduler/tickScheduler.d.ts.map +1 -0
  132. package/dist/scheduler/tickScheduler.js +74 -0
  133. package/dist/scheduler/tickScheduler.js.map +1 -0
  134. package/dist/sequences/expand.d.ts +14 -0
  135. package/dist/sequences/expand.d.ts.map +1 -0
  136. package/dist/sequences/expand.js +137 -0
  137. package/dist/sequences/expand.js.map +1 -0
  138. package/dist/song/importResolver.browser.d.ts +29 -0
  139. package/dist/song/importResolver.browser.d.ts.map +1 -0
  140. package/dist/song/importResolver.browser.js +168 -0
  141. package/dist/song/importResolver.browser.js.map +1 -0
  142. package/dist/song/importResolver.d.ts +40 -0
  143. package/dist/song/importResolver.d.ts.map +1 -0
  144. package/dist/song/importResolver.js +445 -0
  145. package/dist/song/importResolver.js.map +1 -0
  146. package/dist/song/index.browser.d.ts +9 -0
  147. package/dist/song/index.browser.d.ts.map +1 -0
  148. package/dist/song/index.browser.js +7 -0
  149. package/dist/song/index.browser.js.map +1 -0
  150. package/dist/song/index.d.ts +8 -0
  151. package/dist/song/index.d.ts.map +1 -0
  152. package/dist/song/index.js +6 -0
  153. package/dist/song/index.js.map +1 -0
  154. package/dist/song/resolver.browser.d.ts +50 -0
  155. package/dist/song/resolver.browser.d.ts.map +1 -0
  156. package/dist/song/resolver.browser.js +536 -0
  157. package/dist/song/resolver.browser.js.map +1 -0
  158. package/dist/song/resolver.d.ts +20 -0
  159. package/dist/song/resolver.d.ts.map +1 -0
  160. package/dist/song/resolver.js +540 -0
  161. package/dist/song/resolver.js.map +1 -0
  162. package/dist/song/songModel.d.ts +34 -0
  163. package/dist/song/songModel.d.ts.map +1 -0
  164. package/dist/song/songModel.js +2 -0
  165. package/dist/song/songModel.js.map +1 -0
  166. package/dist/tests/refExpander.test.d.ts +2 -0
  167. package/dist/tests/refExpander.test.d.ts.map +1 -0
  168. package/dist/tests/refExpander.test.js +37 -0
  169. package/dist/tests/refExpander.test.js.map +1 -0
  170. package/dist/util/diag.d.ts +16 -0
  171. package/dist/util/diag.d.ts.map +1 -0
  172. package/dist/util/diag.js +29 -0
  173. package/dist/util/diag.js.map +1 -0
  174. 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"}