@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,232 @@
1
+ // Structured events are enabled by default. The legacy opt-out environment
2
+ // variable (`BEATBAX_PEGGY_EVENTS`) has been removed as part of the Peggy
3
+ // migration; downstream code should assume structured fields exist when
4
+ // present on the AST.
5
+ export const patternEventsToTokens = (events) => {
6
+ if (!events)
7
+ return [];
8
+ const out = [];
9
+ for (const ev of events) {
10
+ if (!ev)
11
+ continue;
12
+ const raw = ev.raw;
13
+ switch (ev.kind) {
14
+ case 'note': {
15
+ const base = ev.value ?? raw ?? '';
16
+ const token = ev.effects && ev.effects.length > 0 ? base + ev.effects.map(e => `<${e}>`).join('') : base;
17
+ const dur = ev.duration && ev.duration > 0 ? ev.duration : 1;
18
+ out.push(token);
19
+ for (let i = 1; i < dur; i++)
20
+ out.push('_');
21
+ break;
22
+ }
23
+ case 'rest': {
24
+ const token = ev.value ?? raw ?? '.';
25
+ const dur = ev.duration && ev.duration > 0 ? ev.duration : 1;
26
+ out.push(token);
27
+ for (let i = 1; i < dur; i++)
28
+ out.push('_');
29
+ break;
30
+ }
31
+ case 'inline-inst': {
32
+ const name = ev.name ?? raw ?? '';
33
+ out.push(`inst ${name}`.trim());
34
+ break;
35
+ }
36
+ case 'temp-inst': {
37
+ const name = ev.name ?? '';
38
+ const dur = ev.duration && ev.duration > 0 ? ev.duration : undefined;
39
+ const suffix = dur ? `,${dur}` : '';
40
+ out.push(`inst(${name}${suffix})`);
41
+ break;
42
+ }
43
+ case 'token': {
44
+ const token = ev.value ?? raw ?? '';
45
+ if (Array.isArray(token)) {
46
+ out.push(...token);
47
+ }
48
+ else if (token) {
49
+ out.push(token);
50
+ }
51
+ break;
52
+ }
53
+ default:
54
+ if (raw)
55
+ out.push(raw);
56
+ break;
57
+ }
58
+ }
59
+ return out;
60
+ };
61
+ export const parseSeqTransforms = (mods) => {
62
+ const out = [];
63
+ for (const m of mods || []) {
64
+ const raw = (m.raw || '').trim();
65
+ const loc = m.loc;
66
+ if (!raw)
67
+ continue;
68
+ const mOct = raw.match(/^oct\(([+-]?\d+)\)$/i);
69
+ if (mOct) {
70
+ out.push({ kind: 'oct', value: parseInt(mOct[1], 10), raw, loc });
71
+ continue;
72
+ }
73
+ if (/^rev$/i.test(raw)) {
74
+ out.push({ kind: 'rev', raw, loc });
75
+ continue;
76
+ }
77
+ const mSlow = raw.match(/^slow(?:\((\d+)\))?$/i);
78
+ if (mSlow) {
79
+ out.push({ kind: 'slow', value: mSlow[1] ? parseInt(mSlow[1], 10) : 2, raw, loc });
80
+ continue;
81
+ }
82
+ const mFast = raw.match(/^fast(?:\((\d+)\))?$/i);
83
+ if (mFast) {
84
+ out.push({ kind: 'fast', value: mFast[1] ? parseInt(mFast[1], 10) : 2, raw, loc });
85
+ continue;
86
+ }
87
+ const mInst = raw.match(/^inst\(([^)]*)\)$/i);
88
+ if (mInst) {
89
+ out.push({ kind: 'inst', value: mInst[1], raw, loc });
90
+ continue;
91
+ }
92
+ const mPan = raw.match(/^pan\(([^)]*)\)$/i);
93
+ if (mPan) {
94
+ out.push({ kind: 'pan', value: mPan[1].trim(), raw, loc });
95
+ continue;
96
+ }
97
+ const mTrans = raw.match(/^([+-]?\d+)$/);
98
+ if (mTrans) {
99
+ out.push({ kind: 'transpose', value: parseInt(mTrans[1], 10), raw, loc });
100
+ continue;
101
+ }
102
+ const mSem = raw.match(/^semitone\((-?\d+)\)$/i) || raw.match(/^st\((-?\d+)\)$/i) || raw.match(/^trans\((-?\d+)\)$/i);
103
+ if (mSem) {
104
+ out.push({ kind: 'transpose', value: parseInt(mSem[1], 10), raw, loc });
105
+ continue;
106
+ }
107
+ out.push({ kind: 'unknown', raw, loc });
108
+ }
109
+ return out;
110
+ };
111
+ const sequenceTransformToString = (tr) => {
112
+ if (!tr)
113
+ return '';
114
+ if (tr.raw)
115
+ return tr.raw;
116
+ switch (tr.kind) {
117
+ case 'oct': return `oct(${tr.value ?? 0})`;
118
+ case 'rev': return 'rev';
119
+ case 'slow': return `slow(${tr.value ?? 2})`;
120
+ case 'fast': return `fast(${tr.value ?? 2})`;
121
+ case 'inst': return `inst(${tr.value ?? ''})`;
122
+ case 'pan': return `pan(${tr.value ?? ''})`;
123
+ case 'transpose': {
124
+ const v = typeof tr.value === 'number' ? tr.value : 0;
125
+ return v >= 0 ? `+${v}` : `${v}`;
126
+ }
127
+ default:
128
+ return tr.raw ?? '';
129
+ }
130
+ };
131
+ const tokenizeSeqRhs = (rhs) => {
132
+ const tokenize = (s) => {
133
+ const out = [];
134
+ let i = 0;
135
+ let cur = '';
136
+ let inS = false;
137
+ let inD = false;
138
+ while (i < s.length) {
139
+ const ch = s[i];
140
+ if (ch === "'" && !inD) {
141
+ inS = !inS;
142
+ cur += ch;
143
+ i++;
144
+ continue;
145
+ }
146
+ if (ch === '"' && !inS) {
147
+ inD = !inD;
148
+ cur += ch;
149
+ i++;
150
+ continue;
151
+ }
152
+ if (inS || inD) {
153
+ cur += ch;
154
+ i++;
155
+ continue;
156
+ }
157
+ if (ch === '(') {
158
+ let depth = 1;
159
+ let j = i + 1;
160
+ let group = '(';
161
+ while (j < s.length && depth > 0) {
162
+ const c2 = s[j];
163
+ group += c2;
164
+ if (c2 === '(')
165
+ depth++;
166
+ else if (c2 === ')')
167
+ depth--;
168
+ j++;
169
+ }
170
+ cur += group;
171
+ i = j;
172
+ continue;
173
+ }
174
+ if (/\s/.test(ch) || ch === ',') {
175
+ if (cur.trim()) {
176
+ out.push(cur.trim());
177
+ cur = '';
178
+ }
179
+ i++;
180
+ continue;
181
+ }
182
+ cur += ch;
183
+ i++;
184
+ }
185
+ if (cur.trim())
186
+ out.push(cur.trim());
187
+ return out;
188
+ };
189
+ const rawParts = tokenize(rhs);
190
+ const parts = [];
191
+ for (let i = 0; i < rawParts.length; i++) {
192
+ const p = rawParts[i];
193
+ if (p === '*' && i > 0 && i + 1 < rawParts.length && /^\d+$/.test(rawParts[i + 1])) {
194
+ const prev = parts.pop();
195
+ if (prev)
196
+ parts.push(`${prev}*${rawParts[i + 1]}`);
197
+ i++;
198
+ continue;
199
+ }
200
+ if (/^\*\d+$/.test(p) && parts.length > 0) {
201
+ const prev = parts.pop();
202
+ parts.push(`${prev}${p}`);
203
+ continue;
204
+ }
205
+ parts.push(p);
206
+ }
207
+ return parts;
208
+ };
209
+ export const normalizeSeqItems = (items, rhs, rhsTokens) => {
210
+ if (items && items.length > 0) {
211
+ return items.map(it => ({ name: it.name, transforms: parseSeqTransforms(it.modifiers || []), loc: it.loc, raw: it.raw }));
212
+ }
213
+ const tokens = rhsTokens && rhsTokens.length > 0 ? rhsTokens.slice() : rhs ? tokenizeSeqRhs(rhs) : [];
214
+ return tokens.map(tok => {
215
+ const parts = tok.split(':');
216
+ const base = parts.shift() || tok;
217
+ const modifiers = parts.map(p => ({ raw: p }));
218
+ return { name: base, transforms: parseSeqTransforms(modifiers), raw: tok };
219
+ });
220
+ };
221
+ export const materializeSequenceItems = (items) => {
222
+ const out = [];
223
+ for (const it of items || []) {
224
+ const mods = (it.transforms || []).map(t => sequenceTransformToString(t)).filter(Boolean);
225
+ const repeat = it.repeat && it.repeat > 1 ? it.repeat : 1;
226
+ const token = mods.length > 0 ? `${it.name}${mods.map(m => `:${m}`).join('')}` : it.name;
227
+ for (let r = 0; r < repeat; r++)
228
+ out.push(token);
229
+ }
230
+ return out;
231
+ };
232
+ //# sourceMappingURL=structured.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured.js","sourceRoot":"","sources":["../../src/parser/structured.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare function tokenize(_input: string): Token[];
2
+ export declare class Tokenizer {
3
+ constructor(_source?: string);
4
+ }
5
+ export declare const TokenType: any;
6
+ export type Token = {
7
+ type: string;
8
+ value?: string;
9
+ line: number;
10
+ col: number;
11
+ };
12
+ //# sourceMappingURL=tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/parser/tokenizer.ts"],"names":[],"mappings":"AAUA,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAAqB;AAEtE,qBAAa,SAAS;gBACR,OAAO,CAAC,EAAE,MAAM;CAC7B;AAED,eAAO,MAAM,SAAS,EAAS,GAAG,CAAC;AAGnC,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ // Lazy-proxy to legacy tokenizer to avoid statically importing it into
2
+ // browser bundles. Callers can use `tokenize` or `Tokenizer` as before;
3
+ // the actual implementation is required at runtime only when first used.
4
+ // Legacy tokenizer support was removed as part of the Peggy migration.
5
+ // Callers should use the Peggy parser and structured tokenizers instead.
6
+ function legacyRemoved() {
7
+ throw new Error('Legacy tokenizer has been removed after the Peggy migration. Use the Peggy parser and structured events instead.');
8
+ }
9
+ export function tokenize(_input) { legacyRemoved(); }
10
+ export class Tokenizer {
11
+ constructor(_source) { legacyRemoved(); }
12
+ }
13
+ export const TokenType = {};
14
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/parser/tokenizer.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,wEAAwE;AACxE,yEAAyE;AAEzE,uEAAuE;AACvE,yEAAyE;AACzE,SAAS,aAAa;IACrB,MAAM,IAAI,KAAK,CAAC,kHAAkH,CAAC,CAAC;AACrI,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc,IAAa,aAAa,EAAE,CAAC,CAAC,CAAC;AAEtE,MAAM,OAAO,SAAS;IACpB,YAAY,OAAgB,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC;CACnD;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,EAAS,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Pattern expansion utilities.
3
+ *
4
+ * Supported features:
5
+ * - Notes like C3, G#4, Bb2
6
+ * - Rests as `.`
7
+ * - Element repeat: `C4*3` repeats C4 three times
8
+ * - Group repeat: `(C4 E4 G4)*2` repeats the group twice
9
+ * - Transpose by semitones or octaves via helper functions
10
+ */
11
+ export declare function noteToMidi(note: string): number | null;
12
+ export declare function midiToNote(n: number): string;
13
+ /** Expand a pattern string into an array of tokens.
14
+ * Grammar (informal):
15
+ * pattern := item (WS item)*
16
+ * item := group ('*' number)? | token ('*' number)?
17
+ * group := '(' pattern ')'
18
+ * token := NOTE | '.' | IDENT
19
+ */
20
+ export declare function expandPattern(text: string): string[];
21
+ export declare function transposePattern(tokens: string[], opts: {
22
+ semitones?: number;
23
+ octaves?: number;
24
+ }): string[];
25
+ declare const _default: {
26
+ expandPattern: typeof expandPattern;
27
+ transposePattern: typeof transposePattern;
28
+ noteToMidi: typeof noteToMidi;
29
+ midiToNote: typeof midiToNote;
30
+ };
31
+ export default _default;
32
+ //# sourceMappingURL=expand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../src/patterns/expand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA+BH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAStD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAkB5C;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqEpD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,EAAE,CAwB3G;;;;;;;AAED,wBAKE"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Pattern expansion utilities.
3
+ *
4
+ * Supported features:
5
+ * - Notes like C3, G#4, Bb2
6
+ * - Rests as `.`
7
+ * - Element repeat: `C4*3` repeats C4 three times
8
+ * - Group repeat: `(C4 E4 G4)*2` repeats the group twice
9
+ * - Transpose by semitones or octaves via helper functions
10
+ */
11
+ const NOTE_BASE = {
12
+ C: 0,
13
+ 'C#': 1,
14
+ DB: 1,
15
+ D: 2,
16
+ 'D#': 3,
17
+ EB: 3,
18
+ E: 4,
19
+ F: 5,
20
+ 'F#': 6,
21
+ GB: 6,
22
+ G: 7,
23
+ 'G#': 8,
24
+ AB: 8,
25
+ A: 9,
26
+ 'A#': 10,
27
+ BB: 10,
28
+ B: 11,
29
+ };
30
+ function normalizeNoteName(name) {
31
+ const m = name.match(/^([A-Ga-g])([#b]?)(-?\d+)$/);
32
+ if (!m)
33
+ return null;
34
+ const letter = m[1].toUpperCase();
35
+ const accidental = m[2] || null;
36
+ const octave = parseInt(m[3], 10);
37
+ return { letter, accidental, octave };
38
+ }
39
+ export function noteToMidi(note) {
40
+ const p = normalizeNoteName(note);
41
+ if (!p)
42
+ return null;
43
+ const key = p.letter + (p.accidental ? (p.accidental === 'b' ? 'B' : '#') : '');
44
+ const semitone = NOTE_BASE[key];
45
+ if (semitone === undefined)
46
+ return null;
47
+ // MIDI: C4 = 60. So calculate from octave.
48
+ // octave numbers follow scientific pitch: C4=60
49
+ return (p.octave + 1) * 12 + semitone; // because octave -1 would be MIDI starting at C-1 = 0
50
+ }
51
+ export function midiToNote(n) {
52
+ const octave = Math.floor(n / 12) - 1;
53
+ const pitch = n % 12;
54
+ const names = {
55
+ 0: 'C',
56
+ 1: 'C#',
57
+ 2: 'D',
58
+ 3: 'D#',
59
+ 4: 'E',
60
+ 5: 'F',
61
+ 6: 'F#',
62
+ 7: 'G',
63
+ 8: 'G#',
64
+ 9: 'A',
65
+ 10: 'A#',
66
+ 11: 'B',
67
+ };
68
+ return `${names[pitch]}${octave}`;
69
+ }
70
+ /** Expand a pattern string into an array of tokens.
71
+ * Grammar (informal):
72
+ * pattern := item (WS item)*
73
+ * item := group ('*' number)? | token ('*' number)?
74
+ * group := '(' pattern ')'
75
+ * token := NOTE | '.' | IDENT
76
+ */
77
+ export function expandPattern(text) {
78
+ // Preprocess to normalize spaces around * operators
79
+ text = text.replace(/\)\s*\*\s*(\d+)/g, ')*$1');
80
+ text = text.replace(/([^\s\(\)])\s*\*\s*(\d+)/g, '$1*$2');
81
+ // Tokenize by spaces but keep parentheses and *number attached
82
+ const tokens = [];
83
+ let i = 0;
84
+ while (i < text.length) {
85
+ const ch = text[i];
86
+ if (ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r') {
87
+ i++;
88
+ continue;
89
+ }
90
+ if (ch === '(') {
91
+ // find matching ')'
92
+ let depth = 1;
93
+ let j = i + 1;
94
+ while (j < text.length && depth > 0) {
95
+ if (text[j] === '(')
96
+ depth++;
97
+ else if (text[j] === ')')
98
+ depth--;
99
+ j++;
100
+ }
101
+ const group = text.slice(i + 1, j - 1);
102
+ // check for *N (skip whitespace first)
103
+ let k = j;
104
+ while (k < text.length && /\s/.test(text[k]))
105
+ k++;
106
+ let repeat = 1;
107
+ if (k < text.length && text[k] === '*') {
108
+ k++;
109
+ const m = text.slice(k).match(/^\d+/);
110
+ if (m) {
111
+ repeat = parseInt(m[0], 10);
112
+ k += m[0].length;
113
+ }
114
+ }
115
+ // expand group recursively repeat times
116
+ const expandedGroup = expandPattern(group);
117
+ for (let r = 0; r < repeat; r++)
118
+ tokens.push(...expandedGroup);
119
+ i = k;
120
+ continue;
121
+ }
122
+ // read until whitespace
123
+ let j = i;
124
+ while (j < text.length && !/\s/.test(text[j]))
125
+ j++;
126
+ let atom = text.slice(i, j);
127
+ // check for :duration suffix (e.g. C5:4 -> C5 _ _ _)
128
+ const mDur = atom.match(/^(.*):(\d+)$/);
129
+ if (mDur) {
130
+ const base = mDur[1];
131
+ const count = parseInt(mDur[2], 10);
132
+ tokens.push(base);
133
+ for (let r = 1; r < count; r++)
134
+ tokens.push('_');
135
+ }
136
+ else {
137
+ // check for *N repeat suffix
138
+ const m = atom.match(/^(.*)\*(\d+)$/);
139
+ if (m) {
140
+ const base = m[1];
141
+ const count = parseInt(m[2], 10);
142
+ for (let r = 0; r < count; r++)
143
+ tokens.push(base);
144
+ }
145
+ else {
146
+ tokens.push(atom);
147
+ }
148
+ }
149
+ i = j;
150
+ }
151
+ return tokens;
152
+ }
153
+ export function transposePattern(tokens, opts) {
154
+ const semitones = (opts.semitones || 0) + (opts.octaves || 0) * 12;
155
+ if (semitones === 0)
156
+ return tokens.slice();
157
+ return tokens.map(t => {
158
+ if (t === '.' || t === '_' || t === '-')
159
+ return t;
160
+ // Extract note from tokens with effects: E3<port:8> -> E3, <port:8>
161
+ const effectMatch = t.match(/^([^<]+)(<.+>)?$/);
162
+ if (effectMatch) {
163
+ const notePart = effectMatch[1];
164
+ const effectPart = effectMatch[2] || '';
165
+ const midi = noteToMidi(notePart);
166
+ if (midi === null)
167
+ return t; // Not a note, return unchanged
168
+ const transposedNote = midiToNote(midi + semitones);
169
+ return transposedNote + effectPart; // Reconstruct with effects
170
+ }
171
+ // Fallback: try direct transpose
172
+ const midi = noteToMidi(t);
173
+ if (midi === null)
174
+ return t;
175
+ return midiToNote(midi + semitones);
176
+ });
177
+ }
178
+ export default {
179
+ expandPattern,
180
+ transposePattern,
181
+ noteToMidi,
182
+ midiToNote,
183
+ };
184
+ //# sourceMappingURL=expand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand.js","sourceRoot":"","sources":["../../src/patterns/expand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './expand.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/patterns/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './expand.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/patterns/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ import TickScheduler, { TickSchedulerOptions } from './tickScheduler.js';
2
+ export declare function createScheduler(ctx: any, opts?: TickSchedulerOptions): TickScheduler;
3
+ export { TickScheduler };
4
+ export default createScheduler;
5
+ export type { TickSchedulerOptions };
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,EAAE,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEzE,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,GAAE,oBAAyB,iBAIxE;AAED,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,eAAe,eAAe,CAAC;AAE/B,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import TickScheduler from './tickScheduler.js';
2
+ export function createScheduler(ctx, opts = {}) {
3
+ const isBrowser = typeof globalThis.requestAnimationFrame === 'function';
4
+ const useRaf = typeof opts.useRaf === 'boolean' ? opts.useRaf : isBrowser;
5
+ return new TickScheduler(ctx, { ...opts, useRaf });
6
+ }
7
+ export { TickScheduler };
8
+ export default createScheduler;
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAuC,MAAM,oBAAoB,CAAC;AAEzE,MAAM,UAAU,eAAe,CAAC,GAAQ,EAAE,OAA6B,EAAE;IACvE,MAAM,SAAS,GAAG,OAAQ,UAAkB,CAAC,qBAAqB,KAAK,UAAU,CAAC;IAClF,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,OAAO,IAAI,aAAa,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,eAAe,eAAe,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface TickSchedulerOptions {
2
+ useRaf?: boolean;
3
+ interval?: number;
4
+ lookahead?: number;
5
+ raf?: (cb: FrameRequestCallback) => number;
6
+ cancelRaf?: (id: number) => void;
7
+ setInterval?: (handler: (...args: any[]) => void, timeout?: number, ...args: any[]) => any;
8
+ clearInterval?: (id: any) => void;
9
+ }
10
+ export declare class TickScheduler {
11
+ private ctx;
12
+ private lookahead;
13
+ private interval;
14
+ private timer;
15
+ private rafId;
16
+ private queue;
17
+ private opts;
18
+ constructor(ctx: any, opts?: TickSchedulerOptions);
19
+ schedule(time: number, fn: () => void): void;
20
+ scheduleAligned(time: number, fn: () => void, frameHz?: number): void;
21
+ start(): void;
22
+ stop(): void;
23
+ clear(): void;
24
+ private tick;
25
+ }
26
+ export default TickScheduler;
27
+ //# sourceMappingURL=tickScheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickScheduler.d.ts","sourceRoot":"","sources":["../../src/scheduler/tickScheduler.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,oBAAoB,KAAK,MAAM,CAAC;IAC3C,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAC3F,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;CACnC;AAGD,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,IAAI,CAAuB;gBAEvB,GAAG,EAAE,GAAG,EAAE,IAAI,GAAE,oBAAyB;IAOrD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI;IAKrC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,EAAE,OAAO,SAAM;IAO3D,KAAK;IAiBL,IAAI;IAaJ,KAAK;IAIL,OAAO,CAAC,IAAI;CAQb;AAED,eAAe,aAAa,CAAC"}