pixi-effects 0.27.2 → 0.28.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 (63) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +6 -6
  3. package/ai/chat-template.html +3 -3
  4. package/ai/tools/check.mjs +30 -0
  5. package/dist/{Base-CKGl6jCo.d.ts → Base-C6f0fE8j.d.ts} +1 -1
  6. package/dist/{Base-DjhdL8B1.d.cts → Base-DI1FCGcH.d.cts} +1 -1
  7. package/dist/Composition-HFEVIYHN.js +7 -0
  8. package/dist/{Composition-TZHVYIGH.js.map → Composition-HFEVIYHN.js.map} +1 -1
  9. package/dist/Composition-NI74UJT3.cjs +16 -0
  10. package/dist/{Composition-DRCTWIYH.cjs.map → Composition-NI74UJT3.cjs.map} +1 -1
  11. package/dist/Controller.d.cts +2 -2
  12. package/dist/Controller.d.ts +2 -2
  13. package/dist/{Movie-CbYwTs6U.d.cts → Movie-CHcM8HNB.d.ts} +3 -1
  14. package/dist/{Movie-ILKq2fw_.d.ts → Movie-Cx5ozUGb.d.cts} +3 -1
  15. package/dist/Presenter.d.cts +2 -2
  16. package/dist/Presenter.d.ts +2 -2
  17. package/dist/chunk-4LEX3G3M.cjs +259 -0
  18. package/dist/chunk-4LEX3G3M.cjs.map +1 -0
  19. package/dist/{chunk-BQNNZEAX.js → chunk-AK54FIWM.js} +7 -4
  20. package/dist/chunk-AK54FIWM.js.map +1 -0
  21. package/dist/{chunk-YOV6MEXH.cjs → chunk-MZCDBRTY.cjs} +7 -4
  22. package/dist/chunk-MZCDBRTY.cjs.map +1 -0
  23. package/dist/{chunk-C7HJJ7MZ.cjs → chunk-SBOVUZZY.cjs} +61 -61
  24. package/dist/{chunk-C7HJJ7MZ.cjs.map → chunk-SBOVUZZY.cjs.map} +1 -1
  25. package/dist/{chunk-K3F2YKL4.js → chunk-WEJAQAFX.js} +3 -3
  26. package/dist/{chunk-K3F2YKL4.js.map → chunk-WEJAQAFX.js.map} +1 -1
  27. package/dist/chunk-ZHUUIF6A.js +250 -0
  28. package/dist/chunk-ZHUUIF6A.js.map +1 -0
  29. package/dist/events-EE3SM5LM.cjs +16 -0
  30. package/dist/events-EE3SM5LM.cjs.map +1 -0
  31. package/dist/events-KXBWR4IV.js +3 -0
  32. package/dist/events-KXBWR4IV.js.map +1 -0
  33. package/dist/index.cjs +49 -33
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +19 -5
  36. package/dist/index.d.ts +19 -5
  37. package/dist/index.js +18 -7
  38. package/dist/index.js.map +1 -1
  39. package/dist/loader.css +1 -1
  40. package/dist/{music-6MTHQEXS.cjs → music-6WFTPVHU.cjs} +43 -202
  41. package/dist/music-6WFTPVHU.cjs.map +1 -0
  42. package/dist/{music-72YJAMXH.js → music-JKOM5YK6.js} +8 -192
  43. package/dist/music-JKOM5YK6.js.map +1 -0
  44. package/dist/three.cjs +5 -5
  45. package/dist/three.d.cts +2 -2
  46. package/dist/three.d.ts +2 -2
  47. package/dist/three.js +1 -1
  48. package/dist/{types-BNVsBBZf.d.ts → types-DpK1vwcl.d.cts} +79 -1
  49. package/dist/{types-BNVsBBZf.d.cts → types-DpK1vwcl.d.ts} +79 -1
  50. package/docs/api.md +28 -0
  51. package/docs/dsl.md +8 -4
  52. package/llms-full.txt +39 -6
  53. package/package.json +1 -1
  54. package/skills/pixi-effects/SKILL.md +1 -1
  55. package/skills/pixi-effects/reference/cheatsheet.md +1 -1
  56. package/skills/pixi-effects/reference/pitfalls.md +1 -0
  57. package/skills/pixi-effects/template.html +6 -6
  58. package/dist/Composition-DRCTWIYH.cjs +0 -16
  59. package/dist/Composition-TZHVYIGH.js +0 -7
  60. package/dist/chunk-BQNNZEAX.js.map +0 -1
  61. package/dist/chunk-YOV6MEXH.cjs.map +0 -1
  62. package/dist/music-6MTHQEXS.cjs.map +0 -1
  63. package/dist/music-72YJAMXH.js.map +0 -1
@@ -1,4 +1,6 @@
1
1
  import { warnUnknownOptions, suggestName } from './chunk-BXOCEZ4U.js';
2
+ import { parseNotes, parseDrumGrid, TempoMap } from './chunk-ZHUUIF6A.js';
3
+ export { CHORD_KINDS, TempoMap, chordToMidi, describeEvents, noteToMidi, parseDrumGrid, parseNotes, summarizeMusic } from './chunk-ZHUUIF6A.js';
2
4
 
3
5
  // src/audio/music/instruments.ts
4
6
  var TAU = Math.PI * 2;
@@ -413,199 +415,12 @@ function runFlat(x, ch) {
413
415
  return y;
414
416
  }
415
417
 
416
- // src/audio/music/notation.ts
417
- var SEMI = { c: 0, d: 2, e: 4, f: 5, g: 7, a: 9, b: 11 };
418
- var accidental = (s) => s === "#" ? 1 : s === "b" ? -1 : 0;
419
- var CHORD_KINDS = {
420
- "": [0, 4, 7],
421
- m: [0, 3, 7],
422
- 5: [0, 7],
423
- aug: [0, 4, 8],
424
- dim: [0, 3, 6],
425
- sus2: [0, 2, 7],
426
- sus4: [0, 5, 7],
427
- 6: [0, 4, 7, 9],
428
- m6: [0, 3, 7, 9],
429
- add9: [0, 4, 7, 14],
430
- madd9: [0, 3, 7, 14],
431
- add11: [0, 4, 7, 17],
432
- 7: [0, 4, 7, 10],
433
- maj7: [0, 4, 7, 11],
434
- m7: [0, 3, 7, 10],
435
- mMaj7: [0, 3, 7, 11],
436
- dim7: [0, 3, 6, 9],
437
- m7b5: [0, 3, 6, 10],
438
- "7sus4": [0, 5, 7, 10],
439
- "7b9": [0, 4, 7, 10, 13],
440
- "7#9": [0, 4, 7, 10, 15],
441
- 9: [0, 4, 7, 10, 14],
442
- maj9: [0, 4, 7, 11, 14],
443
- m9: [0, 3, 7, 10, 14],
444
- 11: [0, 4, 7, 10, 14, 17],
445
- m11: [0, 3, 7, 10, 14, 17],
446
- 13: [0, 4, 7, 10, 14, 21],
447
- maj13: [0, 4, 7, 11, 14, 21],
448
- m13: [0, 3, 7, 10, 14, 21],
449
- "maj7#11": [0, 4, 7, 11, 18]
450
- };
451
- var NOTE_FORMS = "a note in lowercase like c4, f#3, bb2; a chord starting with a capital like Am7, G7, C@4, Am7/e; [c4 e4 g4]; _ for a rest; ~ to hold";
452
- var KIND_SPELLINGS = {
453
- maj: "",
454
- M: "",
455
- major: "",
456
- min: "m",
457
- minor: "m",
458
- mi: "m",
459
- "-": "m",
460
- min7: "m7",
461
- mi7: "m7",
462
- "-7": "m7",
463
- minor7: "m7",
464
- min9: "m9",
465
- min6: "m6",
466
- min11: "m11",
467
- M7: "maj7",
468
- Maj7: "maj7",
469
- ma7: "maj7",
470
- major7: "maj7",
471
- M9: "maj9",
472
- Maj9: "maj9",
473
- sus: "sus4",
474
- dom7: "7",
475
- dom: "7",
476
- "+": "aug",
477
- o: "dim",
478
- o7: "dim7",
479
- "\xF8": "m7b5",
480
- "m7-5": "m7b5",
481
- add: "add9",
482
- "7sus": "7sus4",
483
- "sus7": "7sus4",
484
- "9sus4": "7sus4",
485
- "6/9": "6",
486
- "69": "6"
487
- };
488
- function capitalHint(tok) {
489
- if (/^[A-G][#b]?-?\d$/.test(tok)) return `it starts with a capital letter, so it is read as a chord; write the note in lowercase: ${tok.toLowerCase()}`;
490
- const m = /^([A-G][#b]?)([^@/\s]*)((?:@\d)?(?:\/[a-gA-G][#b]?)?)$/.exec(tok);
491
- if (!m) return null;
492
- const fix = KIND_SPELLINGS[m[2]];
493
- return fix === void 0 ? null : `the chord kind "${m[2]}" is not known; did you mean "${m[1]}${fix}${m[3]}"?`;
494
- }
495
- function noteToMidi(name) {
496
- const m = /^([a-gA-G])([#b]?)(-?\d)$/.exec(name);
497
- if (!m) return null;
498
- return 12 * (Number(m[3]) + 1) + SEMI[m[1].toLowerCase()] + accidental(m[2]);
499
- }
500
- function chordToMidi(sym) {
501
- const m = /^([A-G])([#b]?)([^@/\s]*)(?:@(\d))?(?:\/([a-gA-G][#b]?))?$/.exec(sym);
502
- if (!m) return null;
503
- const kind = CHORD_KINDS[m[3]];
504
- if (!kind) return null;
505
- const root = SEMI[m[1].toLowerCase()] + accidental(m[2]);
506
- const oct = m[4] !== void 0 ? Number(m[4]) : 3;
507
- const notes = kind.map((i) => 12 * (oct + 1) + root + i);
508
- if (m[5]) notes.unshift(12 * oct + SEMI[m[5][0].toLowerCase()] + accidental(m[5][1] ?? ""));
509
- return notes;
510
- }
511
- function parseNotes(str, step = 1) {
512
- const events = [];
513
- let t = 0;
514
- for (const raw of String(str).replace(/\|/g, " ").match(/\[[^\]]*\](?::[\d.]+)?[!,]?|\S+/g) ?? []) {
515
- let tok = raw, vel = 0.8;
516
- const mark = (c) => {
517
- vel = c === "!" ? 1 : 0.55;
518
- };
519
- if (/[!,]$/.test(tok)) {
520
- mark(tok.slice(-1));
521
- tok = tok.slice(0, -1);
522
- }
523
- let dur = step;
524
- const dm = /:([\d.]+)$/.exec(tok);
525
- if (dm) {
526
- dur = Number(dm[1]);
527
- tok = tok.slice(0, dm.index);
528
- }
529
- if (/[!,]$/.test(tok)) {
530
- mark(tok.slice(-1));
531
- tok = tok.slice(0, -1);
532
- }
533
- if (!(dur > 0) || !Number.isFinite(dur)) throw new Error(`"${raw}" has a length of ${dm?.[1]} beats; a length must be a positive number of beats (c4:2)`);
534
- if (tok === "_") {
535
- t += dur;
536
- continue;
537
- }
538
- if (tok === "~") {
539
- if (events.length) events[events.length - 1].dur += dur;
540
- t += dur;
541
- continue;
542
- }
543
- let midi;
544
- if (tok.startsWith("[")) midi = tok.slice(1, -1).trim().split(/\s+/).map(noteToMidi);
545
- else if (/^[A-G]/.test(tok)) midi = chordToMidi(tok);
546
- else midi = [noteToMidi(tok)];
547
- if (!midi || midi.length === 0 || midi.some((x) => x === null)) {
548
- const hint = /^[A-G]/.test(tok) && !tok.startsWith("[") ? capitalHint(tok) : null;
549
- throw new Error(`cannot read "${raw}"${hint ? `: ${hint}` : ""} (${NOTE_FORMS})`);
550
- }
551
- events.push({ t, dur, midi, vel });
552
- t += dur;
553
- }
554
- return { events, length: t };
555
- }
556
- function parseDrumGrid(grid) {
557
- const hits = [];
558
- let i = 0;
559
- for (const ch of String(grid).replace(/[\s|]/g, "")) {
560
- if (ch === "x" || ch === "X") hits.push({ i, vel: 1 });
561
- else if (ch === "o" || ch === "O") hits.push({ i, vel: 0.5 });
562
- else if (ch !== "." && ch !== "-" && ch !== "_") throw new Error(`"${ch}" in the drum pattern "${grid}": use x (hit), o (soft hit), . (nothing)`);
563
- i++;
564
- }
565
- return { hits, steps: i };
566
- }
567
- var TempoMap = class _TempoMap {
568
- points;
569
- secAt = [0];
570
- constructor(bpm) {
571
- this.points = typeof bpm === "number" ? [[0, bpm]] : [...bpm].sort((a, b) => a[0] - b[0]);
572
- if (this.points[0][0] > 0) this.points.unshift([0, this.points[0][1]]);
573
- for (let i = 1; i < this.points.length; i++) {
574
- const [b0, t0] = this.points[i - 1], [b1, t1] = this.points[i];
575
- this.secAt.push(this.secAt[i - 1] + _TempoMap.span(b1 - b0, t0, t1));
576
- }
577
- }
578
- /** Seconds taken by `db` beats while the tempo goes from `t0` to `t1` bpm. */
579
- static span(db, t0, t1) {
580
- return Math.abs(t1 - t0) < 1e-9 ? 60 * db / t0 : 60 * db * Math.log(t1 / t0) / (t1 - t0);
581
- }
582
- seconds(beat) {
583
- if (beat <= 0) return 60 * beat / this.points[0][1];
584
- let i = this.points.length - 1;
585
- while (i > 0 && this.points[i][0] > beat) i--;
586
- const [b0, t0] = this.points[i];
587
- const next = this.points[i + 1];
588
- if (!next) return this.secAt[i] + 60 * (beat - b0) / t0;
589
- const t = t0 + (next[1] - t0) * (beat - b0) / (next[0] - b0);
590
- return this.secAt[i] + _TempoMap.span(beat - b0, t0, t);
591
- }
592
- /** The tempo at a beat. */
593
- bpmAt(beat) {
594
- if (beat <= this.points[0][0]) return this.points[0][1];
595
- for (let i = 1; i < this.points.length; i++) {
596
- const [b0, t0] = this.points[i - 1], [b1, t1] = this.points[i];
597
- if (beat < b1) return t0 + (t1 - t0) * (beat - b0) / (b1 - b0);
598
- }
599
- return this.points[this.points.length - 1][1];
600
- }
601
- };
602
-
603
418
  // src/audio/music/resolve.ts
604
419
  var MAX_TRACKS = 16;
605
420
  var MAX_SECONDS = 180;
606
421
  var MAX_NOTES = 2e4;
607
422
  var DEFAULT_TAIL = 2.5;
608
- var OPTION_KEYS = ["bpm", "tracks", "drums", "grid", "swing", "reverb", "humanize", "drumVol", "transpose", "tail", "seed"];
423
+ var OPTION_KEYS = ["bpm", "meter", "tracks", "drums", "grid", "swing", "reverb", "humanize", "drumVol", "transpose", "tail", "seed"];
609
424
  var TRACK_KEYS = ["inst", "notes", "vol", "pan", "step", "strum", "legato", "tone", "reverb", "attack", "release", "ring", "transpose"];
610
425
  var LAYER_KEYS = ["duration", "length", "volume", "at", "loop"];
611
426
  var INSTRUMENT_ALIASES = {
@@ -686,6 +501,7 @@ function resolveMusic(music, who, warn = defaultWarn) {
686
501
  return null;
687
502
  }
688
503
  if (finite(o.bpm) && (o.bpm < 20 || o.bpm > 400)) warn(`pixi-effects: ${who}: music.bpm ${o.bpm} is outside 20\u2013400; using ${tempo[0][1]}`);
504
+ const meter = num("meter", 1, 16, 4);
689
505
  const swing = num("swing", 0, 0.4, 0);
690
506
  const reverbAmount = num("reverb", 0, 0.6, 0.22);
691
507
  const humanize = num("humanize", 0, 0.06, 0.012);
@@ -813,7 +629,7 @@ function resolveMusic(music, who, warn = defaultWarn) {
813
629
  warn(`pixi-effects: ${who}: the music lasts ${Math.round(seconds)} s; the limit is ${MAX_SECONDS} s. The layer is silent.`);
814
630
  return null;
815
631
  }
816
- return { tempo, swing, reverb: reverbAmount, humanize, drumVol, grid, tail, seed, tracks, drums: sections, beats, seconds };
632
+ return { tempo, meter, meterSet: finite(o.meter), swing, reverb: reverbAmount, humanize, drumVol, grid, tail, seed, tracks, drums: sections, beats, seconds };
817
633
  }
818
634
  function musicKey(m, length, loop) {
819
635
  return `music|${JSON.stringify([m.tempo, m.swing, m.reverb, m.humanize, m.drumVol, m.grid, m.tail, m.seed, m.tracks, m.drums, length, loop])}`;
@@ -1047,6 +863,6 @@ async function renderMusicAsync(m, sampleRate, length, loop = false, pace) {
1047
863
  }
1048
864
  }
1049
865
 
1050
- export { CHORD_KINDS, DEFAULT_TAIL, DRUMS, INSTRUMENTS, MAX_SECONDS, MUSIC_PEAK, TempoMap, chordToMidi, musicBeatTimes, musicKey, musicLength, noteToMidi, parseDrumGrid, parseNotes, renderMusic, renderMusicAsync, resolveMusic };
1051
- //# sourceMappingURL=music-72YJAMXH.js.map
1052
- //# sourceMappingURL=music-72YJAMXH.js.map
866
+ export { DEFAULT_TAIL, DRUMS, INSTRUMENTS, MAX_SECONDS, MUSIC_PEAK, musicBeatTimes, musicKey, musicLength, renderMusic, renderMusicAsync, resolveMusic };
867
+ //# sourceMappingURL=music-JKOM5YK6.js.map
868
+ //# sourceMappingURL=music-JKOM5YK6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/audio/music/instruments.ts","../src/audio/music/resolve.ts","../src/audio/music/render.ts"],"names":[],"mappings":"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","file":"music-JKOM5YK6.js","sourcesContent":["/**\n * The voices of `music`: a handful of small synthesisers and drums, each rendering ONE note into a stereo buffer.\n * Pure DSP over Float32Array, seeded noise only, so the same score always gives the same samples. Ported from the\n * spike the owner approved by ear; the sample rate is set once per render (renders are synchronous).\n */\n\nexport interface Bus { L: Float32Array; R: Float32Array }\nexport type Rand = () => number;\n\n/** Per-track knobs an instrument may use. */\nexport interface VoiceOptions {\n /** Seconds the sound fades in (pad, lead). */\n attack?: number;\n /** Seconds the sound fades out after the written length. */\n release?: number;\n /** Seconds a bell / music box keeps ringing. */\n ring?: number;\n}\n\ntype Voice = (midi: number, dur: number, vel: number, out: Bus, start: number, rnd: Rand, o: VoiceOptions) => void;\n\nconst TAU = Math.PI * 2;\nlet SR = 44100;\n/** Set the sample rate for the render that follows. */\nexport function setSampleRate(sr: number): void { if (sr !== SR) clearVoiceTables(); SR = sr; }\n/** The tables the voices share within a render (see `keysTables`): let go of them when a render is over, they are tens of MB for a long piece. */\nexport function clearVoiceTables(): void { KEYS_TABLES.clear(); BELL_TABLES.clear(); }\ninterface BellTables { s35: Float64Array; e5: Float64Array; ek: Float64Array; s276: Float64Array; e4: Float64Array; n: number }\nconst BELL_TABLES = new Map<string, BellTables>();\nfunction bellTables(f: number, k: number, n: number): BellTables {\n const key = f + '/' + k;\n let tb = BELL_TABLES.get(key);\n if (tb && tb.n >= n) return tb;\n const len = Math.max(n, tb ? tb.n * 2 : 0);\n const s35 = new Float64Array(len), e5 = new Float64Array(len), ek = new Float64Array(len), s276 = new Float64Array(len), e4 = new Float64Array(len);\n for (let i = 0; i < len; i++) { const t = i / SR; s35[i] = Math.sin(TAU * f * 3.5 * t); e5[i] = Math.exp(-t * 5); ek[i] = Math.exp(-t * k); s276[i] = Math.sin(TAU * f * 2.76 * t); e4[i] = Math.exp(-t * 4); }\n tb = { s35, e5, ek, s276, e4, n: len };\n BELL_TABLES.set(key, tb);\n return tb;\n}\n\n\ninterface KeysTables { decay: Float64Array; s14: Float64Array; s1: Float64Array; e18: Float64Array; e32: Float64Array; n: number }\nconst KEYS_TABLES = new Map<number, KeysTables>();\n/** Tables of exp(-t*(1.1+f/1500)), sin(TAU*f*14*t), sin(TAU*f*t) for this pitch and exp(-t*18), exp(-t*3.2) for t = i/SR, at least `n` long (grown when a longer note comes). */\nfunction keysTables(f: number, n: number): KeysTables {\n let tb = KEYS_TABLES.get(f);\n if (tb && tb.n >= n) return tb;\n const len = Math.max(n, tb ? tb.n * 2 : 0);\n const decay = new Float64Array(len), s14 = new Float64Array(len), s1 = new Float64Array(len), e18 = new Float64Array(len), e32 = new Float64Array(len);\n for (let i = 0; i < len; i++) {\n const t = i / SR;\n decay[i] = Math.exp(-t * (1.1 + f / 1500)); s14[i] = Math.sin(TAU * f * 14 * t); s1[i] = Math.sin(TAU * f * t); e18[i] = Math.exp(-t * 18); e32[i] = Math.exp(-t * 3.2);\n }\n tb = { decay, s14, s1, e18, e32, n: len };\n KEYS_TABLES.set(f, tb);\n return tb;\n}\n\n\nconst mtof = (m: number): number => 440 * 2 ** ((m - 69) / 12);\n\nclass Biquad {\n b0 = 1; b1 = 0; b2 = 0; a1 = 0; a2 = 0;\n x1 = 0; x2 = 0; y1 = 0; y2 = 0;\n constructor(type: 'lp' | 'hp' | 'bp', fc: number, q = 0.707) { this.set(type, fc, q); }\n /** Change the cutoff without clearing the state (so it can move while a sound plays). */\n set(type: 'lp' | 'hp' | 'bp', fc: number, q = 0.707): void {\n const w = (TAU * Math.min(fc, SR * 0.45)) / SR, c = Math.cos(w), s = Math.sin(w), al = s / (2 * q);\n const a0 = 1 + al;\n let b0: number, b1: number, b2: number;\n if (type === 'lp') { b0 = (1 - c) / 2; b1 = 1 - c; b2 = b0; }\n else if (type === 'hp') { b0 = (1 + c) / 2; b1 = -(1 + c); b2 = b0; }\n else { b0 = al; b1 = 0; b2 = -al; }\n this.b0 = b0 / a0; this.b1 = b1 / a0; this.b2 = b2 / a0; this.a1 = (-2 * c) / a0; this.a2 = (1 - al) / a0;\n }\n /** All four memories are so small that anything this filter outputs from silence on rounds to 0 in a Float32Array (below half its smallest number). */\n settled(): boolean {\n return Math.abs(this.x1) < 1e-47 && Math.abs(this.x2) < 1e-47 && Math.abs(this.y1) < 1e-47 && Math.abs(this.y2) < 1e-47;\n }\n run(x: number): number {\n const y = this.b0 * x + this.b1 * this.x1 + this.b2 * this.x2 - this.a1 * this.y1 - this.a2 * this.y2;\n this.x2 = this.x1; this.x1 = x; this.y2 = this.y1; this.y1 = y;\n return y;\n }\n}\nexport { Biquad };\n\nconst polyblep = (t: number, dt: number): number => (t < dt ? ((t /= dt), t + t - t * t - 1) : t > 1 - dt ? ((t = (t - 1) / dt), t * t + t + t + 1) : 0);\nconst saw = (ph: number, dt: number): number => 2 * ph - 1 - polyblep(ph, dt);\nconst adsr = (t: number, dur: number, a: number, d: number, s: number, r: number): number => {\n if (t < dur) return t < a ? t / a : t < a + d ? 1 - (1 - s) * ((t - a) / d) : s;\n const base = dur < a ? dur / a : dur < a + d ? 1 - (1 - s) * ((dur - a) / d) : s;\n return Math.max(0, base * (1 - (t - dur) / r));\n};\n\nexport const INSTRUMENTS = ['keys', 'pluck', 'pad', 'bass', 'sub', 'lead', 'bell', 'musicbox'] as const;\nexport type InstrumentName = (typeof INSTRUMENTS)[number];\n\nexport const VOICES: Record<InstrumentName, Voice> = {\n // electric piano: two FM operators (tine + bell), a little stereo chorus\n keys(m, dur, vel, out, start, rnd, o) {\n const f = mtof(m), rel = o.release ?? 0.5, total = dur + rel + 1.2;\n // the envelope is 0 from `dur + rel` on: what follows is silence, so it is not computed (the notes used to run 1.2 s of zeros)\n const n = Math.min(Math.floor(Math.min(total, 6) * SR), Math.ceil((dur + rel) * SR) + 2), idx = 1.1 + 2.2 * vel, det = 1 + (rnd() - 0.5) * 0.002;\n const lim = Math.min(n, out.L.length - start);\n // the parts of the sound that depend only on the pitch and the sample index are the same for every note of that pitch: tabled once (the same Math.exp / Math.sin values, so the same samples)\n const tb = keysTables(f, lim), dcy = tb.decay, s14 = tb.s14, s1 = tb.s1, e18 = tb.e18, e32 = tb.e32;\n for (let i = 0; i < lim; i++) { // what falls past the end of the bus is not made\n const t = i / SR;\n const decay = dcy[i]!;\n const mod = s14[i]! * idx * 0.12 * e18[i]! + s1[i]! * idx * e32[i]!;\n const body = Math.sin(TAU * f * t + mod) * decay;\n const body2 = Math.sin(TAU * f * det * t + mod * 0.9) * decay;\n const env = t < dur ? 1 : Math.max(0, 1 - (t - dur) / rel);\n const a = Math.min(1, t / 0.004) * env * 0.5 * vel;\n { const wl = a * (body * 0.7 + body2 * 0.3), wr = a * (body * 0.3 + body2 * 0.7); out.L[start + i]! += wl; out.R[start + i]! += wr; }\n }\n },\n // plucked string (Karplus–Strong with a darker loss filter): guitar / harp / koto\n pluck(m, dur, vel, out, start, rnd, o) {\n const f = mtof(m), len = Math.max(2, Math.round(SR / f)), buf = new Float32Array(len);\n const lp = new Biquad('lp', 2500 + 3500 * vel, 0.6);\n for (let i = 0; i < len; i++) buf[i] = lp.run(rnd() * 2 - 1);\n const rel = o.release ?? 0.25, total = Math.min(dur + rel + 0.4, 5), n = Math.floor(total * SR), loss = 0.9965 - 0.5 / (f + 100);\n let p = 0, prev = 0;\n const pan = (rnd() - 0.5) * 0.3;\n for (let i = 0, lim = Math.min(n, out.L.length - start); i < lim; i++) { // what falls past the end of the bus is not made\n const cur = buf[p]!, nxt = buf[(p + 1) % len]!;\n buf[p] = loss * 0.5 * (cur + nxt);\n p = (p + 1) % len;\n const t = i / SR, env = t < dur ? 1 : Math.max(0, 1 - (t - dur) / rel);\n const y = (cur - prev * 0.2) * env * 0.55 * vel;\n prev = cur;\n { const wl = y * (1 - pan), wr = y * (1 + pan); out.L[start + i]! += wl; out.R[start + i]! += wr; }\n }\n },\n // warm pad: five detuned band-limited saws through a slow low-pass\n pad(m, dur, vel, out, start, rnd, o) {\n const f = mtof(m), A = o.attack ?? 0.7, R = o.release ?? 1.4, n = Math.floor((dur + R) * SR);\n const cs = [-0.14, -0.07, 0, 0.07, 0.14];\n const st = (k: number): number => (f * 2 ** ((cs[k]! / 12) * 0.6)) / SR, gL = (k: number): number => 1 - (k - 2) / 2.5, gR = (k: number): number => 1 + (k - 2) / 2.5;\n let p0 = rnd(), p1 = rnd(), p2 = rnd(), p3 = rnd(), p4 = rnd();\n const d0 = st(0), d1 = st(1), d2 = st(2), d3 = st(3), d4 = st(4);\n const gl0 = gL(0), gl1 = gL(1), gl2 = gL(2), gl3 = gL(3), gl4 = gL(4), gr0 = gR(0), gr1 = gR(1), gr2 = gR(2), gr3 = gR(3), gr4 = gR(4);\n const cut = Math.min(1800, 500 + f * 1.5);\n const lp = new Biquad('lp', cut, 0.6), lp2 = new Biquad('lp', cut, 0.6);\n for (let i = 0, lim = Math.min(n, out.L.length - start); i < lim; i++) {\n const t = i / SR;\n let l = 0, r = 0, sv: number;\n p0 += d0; if (p0 >= 1) p0 -= 1; sv = saw(p0, d0); l += sv * gl0 * 0.5; r += sv * gr0 * 0.5;\n p1 += d1; if (p1 >= 1) p1 -= 1; sv = saw(p1, d1); l += sv * gl1 * 0.5; r += sv * gr1 * 0.5;\n p2 += d2; if (p2 >= 1) p2 -= 1; sv = saw(p2, d2); l += sv * gl2 * 0.5; r += sv * gr2 * 0.5;\n p3 += d3; if (p3 >= 1) p3 -= 1; sv = saw(p3, d3); l += sv * gl3 * 0.5; r += sv * gr3 * 0.5;\n p4 += d4; if (p4 >= 1) p4 -= 1; sv = saw(p4, d4); l += sv * gl4 * 0.5; r += sv * gr4 * 0.5;\n const env = t < dur ? Math.min(1, t / A) : Math.max(0, Math.min(1, dur / A) * (1 - (t - dur) / R));\n const g = env * 0.11 * vel;\n { const wl = lp.run(l) * g, wr = lp2.run(r) * g; out.L[start + i]! += wl; out.R[start + i]! += wr; }\n }\n },\n // synth bass: saw + sine sub, filter envelope\n bass(m, dur, vel, out, start, _rnd, o) {\n const f = mtof(m), rel = o.release ?? 0.12, n = Math.floor((dur + rel) * SR);\n let ph = 0, ph2 = 0;\n const lp = new Biquad('lp', 400, 1.1);\n for (let i = 0, lim = Math.min(n, out.L.length - start); i < lim; i++) { // what falls past the end of the bus is not made\n const t = i / SR, dt = f / SR;\n ph = (ph + dt) % 1; ph2 = (ph2 + dt) % 1;\n if (i % 64 === 0) lp.set('lp', Math.min(160 + 900 * Math.exp(-t * 7) * vel, 4000), 1.1);\n const s = lp.run(saw(ph, dt)) * 0.55 + Math.sin(TAU * ph2) * 0.55;\n const env = t < dur ? Math.min(1, t / 0.006) * (0.75 + 0.25 * Math.exp(-t * 4)) : Math.max(0, 1 - (t - dur) / rel) * 0.75;\n const y = s * env * 0.5 * vel;\n { const wl = y, wr = y; out.L[start + i]! += wl; out.R[start + i]! += wr; }\n }\n },\n // a pure sine bass: a soft heartbeat or sub (no filter sweep, hardly any upper harmonics)\n sub(m, dur, vel, out, start, _rnd, o) {\n const f = mtof(m), rel = o.release ?? 0.2, n = Math.floor((dur + rel) * SR);\n let ph = 0;\n for (let i = 0, lim = Math.min(n, out.L.length - start); i < lim; i++) { // what falls past the end of the bus is not made\n const t = i / SR;\n ph += (TAU * f) / SR;\n const env = t < dur ? Math.min(1, t / (o.attack ?? 0.012)) * (0.8 + 0.2 * Math.exp(-t * 5)) : Math.max(0, 1 - (t - dur) / rel) * 0.8;\n const y = (Math.sin(ph) + 0.12 * Math.sin(2 * ph)) * env * 0.6 * vel;\n { const wl = y, wr = y; out.L[start + i]! += wl; out.R[start + i]! += wr; }\n }\n },\n // lead: soft saw / triangle with a delayed vibrato\n lead(m, dur, vel, out, start, rnd, o) {\n const f = mtof(m), rel = o.release ?? 0.18, A = o.attack ?? 0.02, n = Math.floor((dur + rel) * SR);\n let ph = rnd(), ph2 = rnd();\n const lp = new Biquad('lp', 2600 + 1800 * vel, 0.8);\n for (let i = 0, lim = Math.min(n, out.L.length - start); i < lim; i++) { // what falls past the end of the bus is not made\n const t = i / SR, vib = 1 + 0.0035 * Math.sin(TAU * 5.3 * t) * Math.min(1, Math.max(0, (t - 0.18) / 0.3));\n const dt = (f * vib) / SR;\n ph = (ph + dt) % 1; ph2 = (ph2 + dt * 1.003) % 1;\n const tri = 4 * Math.abs(ph - 0.5) - 1;\n const s = lp.run(saw(ph2, dt) * 0.35 + tri * 0.65);\n const y = s * adsr(t, dur, A, 0.15, 0.7, rel) * 0.28 * vel;\n { const wl = y * 0.9, wr = y * 1.1; out.L[start + i]! += wl; out.R[start + i]! += wr; }\n }\n },\n // bell / glockenspiel: inharmonic FM; `ring` is how many seconds it keeps sounding\n bell(m, dur, vel, out, start, rnd, o) {\n const f = mtof(m), ring = o.ring ?? 2.5, n = Math.floor(Math.min(dur + ring, 6) * SR), pan = (rnd() - 0.5) * 0.6;\n const k = 1.5 * (2.5 / ring);\n const lim = Math.min(n, out.L.length - start);\n const tb = bellTables(f, k, lim), s35 = tb.s35, e5 = tb.e5, ek = tb.ek, s276 = tb.s276, e4 = tb.e4;\n for (let i = 0; i < lim; i++) { // what falls past the end of the bus is not made\n const t = i / SR;\n const mod = s35[i]! * 1.6 * e5[i]!;\n const s = Math.sin(TAU * f * t + mod) * ek[i]! + s276[i]! * 0.25 * e4[i]!;\n const y = s * Math.min(1, t / 0.002) * 0.3 * vel;\n { const wl = y * (1 - pan), wr = y * (1 + pan); out.L[start + i]! += wl; out.R[start + i]! += wr; }\n }\n },\n // music box: a bright tine with a strong upper partial and a short, dry ring\n musicbox(m, dur, vel, out, start, rnd, o) {\n const f = mtof(m), ring = o.ring ?? 1.3, n = Math.floor(Math.min(dur + ring, 4) * SR), pan = (rnd() - 0.5) * 0.4;\n for (let i = 0, lim = Math.min(n, out.L.length - start); i < lim; i++) { // what falls past the end of the bus is not made\n const t = i / SR;\n const s = Math.sin(TAU * f * t) * Math.exp(-t * (3.2 / ring * 1.3)) + Math.sin(TAU * f * 4.0 * t) * 0.22 * Math.exp(-t * (9 / ring)) + Math.sin(TAU * f * 6.8 * t) * 0.08 * Math.exp(-t * 18);\n const y = s * Math.min(1, t / 0.0015) * 0.34 * vel;\n { const wl = y * (1 - pan), wr = y * (1 + pan); out.L[start + i]! += wl; out.R[start + i]! += wr; }\n }\n },\n};\n\nexport const DRUMS = ['kick', 'snare', 'hat', 'openhat', 'clap', 'rim', 'tom', 'crash', 'shaker', 'sleigh'] as const;\nexport type DrumName = (typeof DRUMS)[number];\n\nexport function hitDrum(kind: DrumName, vel: number, out: Bus, start: number, rnd: Rand): void {\n const mono = (n: number, f: (t: number) => number, gl = 1, gr = 1): void => {\n // `f` runs for every sample (it draws noise from the seeded stream); only the samples inside the bus are written\n const lim = Math.min(n, out.L.length - start), L = out.L, R = out.R;\n for (let i = 0; i < n; i++) { const o = f(i / SR); if (i < lim) { L[start + i]! += o * gl; R[start + i]! += o * gr; } }\n };\n const len = (s: number) => Math.floor(s * SR);\n if (kind === 'kick') {\n let ph = 0;\n mono(len(0.5), t => { ph += (TAU * (45 + 110 * Math.exp(-t * 28))) / SR; const o = (Math.sin(ph) * Math.exp(-t * 7.5) + (t < 0.004 ? (rnd() - 0.5) * 0.5 : 0)) * 0.95 * vel; return o; });\n } else if (kind === 'snare') {\n const bp = new Biquad('bp', 1900, 0.9), hp = new Biquad('hp', 700, 0.7);\n let ph = 0;\n mono(len(0.4), t => { ph += (TAU * (185 - 40 * t)) / SR; const nz = hp.run(bp.run(rnd() * 2 - 1)) * 2.2; const o = (nz * Math.exp(-t * 17) + Math.sin(ph) * Math.exp(-t * 26) * 0.6) * 0.6 * vel; return o; }, 0.95, 1.05);\n } else if (kind === 'clap') {\n const bp = new Biquad('bp', 1500, 1.2);\n mono(len(0.35), t => { const burst = t < 0.033 ? Math.exp(-((t * 1000) % 11) * 0.5) : Math.exp(-(t - 0.033) * 22); const o = bp.run(rnd() * 2 - 1) * 2.4 * burst * 0.5 * vel; return o; }, 1, 0.9);\n } else if (kind === 'hat' || kind === 'openhat') {\n const hp = new Biquad('hp', 7500, 0.8), dec = kind === 'hat' ? 55 : 9;\n mono(len(kind === 'hat' ? 0.12 : 0.6), t => { const o = hp.run(rnd() * 2 - 1) * Math.exp(-t * dec) * 0.35 * vel; return o; }, 0.8, 1.2);\n } else if (kind === 'rim') {\n let ph = 0;\n const bp = new Biquad('bp', 3200, 4);\n mono(len(0.1), t => { ph += (TAU * 1750) / SR; const o = (Math.sin(ph) * 0.5 + bp.run(rnd() * 2 - 1)) * Math.exp(-t * 70) * 0.5 * vel; return o; });\n } else if (kind === 'tom') {\n let ph = 0;\n mono(len(0.5), t => { ph += (TAU * (95 + 70 * Math.exp(-t * 15))) / SR; const o = Math.sin(ph) * Math.exp(-t * 7) * 0.7 * vel; return o; });\n } else if (kind === 'crash') {\n const hp = new Biquad('hp', 5200, 0.7), bp = new Biquad('bp', 9000, 0.6);\n mono(len(1.8), t => { const nz = rnd() * 2 - 1; const o = (hp.run(nz) * 0.7 + bp.run(nz) * 0.5) * (0.55 * Math.exp(-t * 2.6) + 0.45 * Math.exp(-t * 11)) * 0.5 * vel; return o; }, 0.9, 1.1);\n } else if (kind === 'shaker') {\n const bp = new Biquad('bp', 6500, 1.4);\n mono(len(0.16), t => { const env = (t < 0.018 ? t / 0.018 : 1) * Math.exp(-t * 28); const o = bp.run(rnd() * 2 - 1) * env * 1.4 * 0.3 * vel; return o; }, 0.85, 1.15);\n } else { // sleigh: a jingle of small bells (bright noise + a cluster of high partials with a fast flutter)\n const bp = new Biquad('bp', 7800, 1.0);\n const partials = [4200, 5630, 6900, 8350];\n mono(len(0.5), t => {\n let s = 0;\n for (let k = 0; k < partials.length; k++) s += Math.sin(TAU * partials[k]! * t * (1 + k * 0.0007)) * (0.5 + 0.5 * Math.sin(TAU * (19 + k * 3.1) * t + k)) * Math.exp(-t * (7 + k * 2));\n const o = (s * 0.11 + bp.run(rnd() * 2 - 1) * Math.exp(-t * 16) * 0.5) * Math.min(1, t / 0.003) * vel * 0.8;\n return o;\n }, 0.85, 1.15);\n }\n}\n\n/** Freeverb-style reverb: sums the `send` bus to mono and adds its tail to `out` (the same bus works too). `wet` 0–1. */\n/** `reverb` in slices: it yields how far it is (0..1) every 16384 samples, so a caller can hand control back to the page. */\nexport function* reverbSteps(send: Bus, out: Bus, wet: number, size = 0.8): Generator<number, void, void> {\n const L = out.L, R = out.R, sL = send.L, sR = send.R;\n const scale = SR / 44100;\n type Comb = { b: Float32Array; i: number; fb: number; d: number; damp: number };\n const comb = (len: number): Comb => ({ b: new Float32Array(Math.max(8, Math.round(len * scale))), i: 0, fb: size, d: 0, damp: 0.35 });\n const mk = (off: number) => ({\n c: [1116, 1188, 1277, 1356, 1422, 1491].map(l => comb(l + off)),\n a: [556, 441, 341].map(l => ({ b: new Float32Array(Math.max(8, Math.round((l + off) * scale))), i: 0 })),\n });\n const chL = mk(0), chR = mk(23);\n const block = (i: number, stop: number): void => {\n for (; i < stop; i++) {\n const m = (sL[i]! + sR[i]!) * 0.5;\n L[i]! += runFlat(m, chL) * wet; R[i]! += runFlat(m, chR) * wet;\n }\n };\n for (let i = 0; i < L.length; ) {\n yield i / L.length;\n const stop = Math.min(L.length, (i | 16383) + 1);\n block(i, stop);\n i = stop;\n }\n}\n\nfunction runFlat(x: number, ch: { c: { b: Float32Array; i: number; fb: number; d: number; damp: number }[]; a: { b: Float32Array; i: number }[] }): number {\n let y = 0;\n const cs = ch.c, as = ch.a;\n for (let k = 0; k < 6; k++) {\n const c = cs[k]!, b = c.b;\n const o = b[c.i]!;\n c.d = o * (1 - c.damp) + c.d * c.damp;\n b[c.i] = x * 0.03 + c.d * c.fb;\n c.i = c.i + 1 === b.length ? 0 : c.i + 1;\n y += o;\n }\n for (let k = 0; k < 3; k++) {\n const a = as[k]!, b = a.b;\n const o = b[a.i]!, inp = y;\n b[a.i] = inp + o * 0.5;\n a.i = a.i + 1 === b.length ? 0 : a.i + 1;\n y = o - inp;\n }\n return y;\n}\nexport function reverb(send: Bus, out: Bus, wet: number, size = 0.8): void {\n for (const _ of reverbSteps(send, out, wet, size)) void _;\n}\n","import { suggestName, warnUnknownOptions } from '../../core/options';\nimport type { MusicOptions } from '../../types';\nimport { DRUMS, INSTRUMENTS, type DrumName, type InstrumentName, type VoiceOptions } from './instruments';\nimport { parseDrumGrid, parseNotes, TempoMap, type MusicEvent, type TempoPoints } from './notation';\n\nexport const MAX_TRACKS = 16;\nexport const MAX_SECONDS = 180;\nexport const MAX_NOTES = 20000;\nexport const DEFAULT_TAIL = 2.5;\n\nconst OPTION_KEYS = ['bpm', 'meter', 'tracks', 'drums', 'grid', 'swing', 'reverb', 'humanize', 'drumVol', 'transpose', 'tail', 'seed'] as const;\nconst TRACK_KEYS = ['inst', 'notes', 'vol', 'pan', 'step', 'strum', 'legato', 'tone', 'reverb', 'attack', 'release', 'ring', 'transpose'] as const;\n/** Layer fields an author may put inside `music` by mistake. */\nconst LAYER_KEYS = ['duration', 'length', 'volume', 'at', 'loop'];\n\n/** Words authors reach for, mapped to the instrument that makes that sound. */\nconst INSTRUMENT_ALIASES: Record<string, InstrumentName> = {\n piano: 'keys', ep: 'keys', rhodes: 'keys', epiano: 'keys', electricpiano: 'keys', keyboard: 'keys', organ: 'pad',\n guitar: 'pluck', harp: 'pluck', koto: 'pluck', strings: 'pad', synth: 'lead', melody: 'lead', flute: 'lead',\n glockenspiel: 'bell', glock: 'bell', chime: 'bell', vibes: 'bell', 'music-box': 'musicbox', music_box: 'musicbox', musicbox: 'musicbox',\n sinebass: 'sub', '808': 'sub', bassline: 'bass',\n};\nconst DRUM_ALIASES: Record<string, DrumName> = {\n bd: 'kick', bassdrum: 'kick', sd: 'snare', hihat: 'hat', hh: 'hat', closedhat: 'hat', oh: 'openhat', cymbal: 'crash', tambourine: 'shaker',\n sleighbells: 'sleigh', jingle: 'sleigh', bells: 'sleigh',\n};\n\nexport interface ResolvedTrack {\n inst: InstrumentName;\n events: MusicEvent[];\n length: number;\n vol: number | Array<[number, number]>;\n pan: number;\n strum: number;\n legato: number;\n tone: number;\n reverb: number;\n transpose: number;\n voice: VoiceOptions;\n}\nexport interface ResolvedDrums {\n from: number;\n to: number;\n /** Beats one repeat of the pattern lasts. */\n repeat: number;\n drums: Array<{ kind: DrumName; hits: Array<{ i: number; vel: number }> }>;\n}\nexport interface ResolvedMusic {\n tempo: TempoPoints;\n /** Beats in a bar: bar numbers and bar counts only, playback does not use it. */\n meter: number;\n /** The score gave a number as `meter` (when it did not, or gave something else, 4 is only assumed). */\n meterSet: boolean;\n swing: number;\n reverb: number;\n humanize: number;\n drumVol: number;\n grid: number;\n tail: number;\n seed: number;\n tracks: ResolvedTrack[];\n drums: ResolvedDrums[];\n /** Length of the music in beats (the longest track; drums fill up to it). */\n beats: number;\n /** Length of the music in seconds, without the tail. */\n seconds: number;\n}\n\ntype Warn = (message: string) => void;\nconst defaultWarn: Warn = m => console.warn(m);\nconst clamp = (x: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, x));\nconst finite = (x: unknown): x is number => typeof x === 'number' && Number.isFinite(x);\n\n/** Check an author's `music` value, warn about everything that will not do what they meant, and return what to render (null: silent). */\nexport function resolveMusic(music: unknown, who: string, warn: Warn = defaultWarn): ResolvedMusic | null {\n if (!music || typeof music !== 'object' || Array.isArray(music)) {\n warn(`pixi-effects: ${who}: music must be an object like { bpm: 96, tracks: [{ inst: 'keys', notes: 'Cmaj7:4 Am7:4' }], drums: { kick: 'x...x...' } } (got ${JSON.stringify(music)}). The layer is silent.`);\n return null;\n }\n const o = music as Record<string, unknown>;\n const rest: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(o)) {\n if (LAYER_KEYS.includes(k)) warn(`pixi-effects: ${who}: \"${k}\" goes on the audio layer, not inside music${k === 'duration' || k === 'length' ? ' (the music lasts as long as its notes; a shorter layer duration cuts it)' : ''}`);\n else rest[k] = v;\n }\n warnUnknownOptions(`${who} music`, rest, OPTION_KEYS);\n\n const num = (key: string, lo: number, hi: number, fallback: number): number => {\n const v = o[key];\n if (v === undefined) return fallback;\n if (!finite(v)) { warn(`pixi-effects: ${who}: music.${key} must be a number (got ${JSON.stringify(v)}); using ${fallback}`); return fallback; }\n if (v < lo || v > hi) { warn(`pixi-effects: ${who}: music.${key} ${v} is outside ${lo}–${hi}; using ${clamp(v, lo, hi)}`); return clamp(v, lo, hi); }\n return v;\n };\n\n // tempo\n let tempo: TempoPoints | null = null;\n if (finite(o.bpm)) tempo = [[0, clamp(o.bpm, 20, 400)]];\n else if (Array.isArray(o.bpm) && o.bpm.length > 0 && o.bpm.every(p => Array.isArray(p) && finite(p[0]) && finite(p[1]) && p[1] > 0)) {\n tempo = (o.bpm as Array<[number, number]>).map(([b, t]) => [Math.max(0, b), clamp(t, 20, 400)] as [number, number]).sort((a, b) => a[0] - b[0]);\n }\n if (!tempo) {\n warn(`pixi-effects: ${who}: music.bpm is required: beats per minute (96), or [beat, bpm] points for a tempo change ([[0, 96], [28, 96], [32, 60]]) (got ${JSON.stringify(o.bpm)}). The layer is silent.`);\n return null;\n }\n if (finite(o.bpm) && (o.bpm < 20 || o.bpm > 400)) warn(`pixi-effects: ${who}: music.bpm ${o.bpm} is outside 20–400; using ${tempo[0]![1]}`);\n\n const meter = num('meter', 1, 16, 4);\n const swing = num('swing', 0, 0.4, 0);\n const reverbAmount = num('reverb', 0, 0.6, 0.22);\n const humanize = num('humanize', 0, 0.06, 0.012);\n const drumVol = num('drumVol', 0, 1, 0.8);\n const grid = Math.round(num('grid', 1, 12, 4));\n const tail = num('tail', 0, 10, DEFAULT_TAIL);\n const transpose = num('transpose', -36, 36, 0);\n const seed = Math.trunc(num('seed', -1e9, 1e9, 1));\n\n // tracks\n const rawTracks: unknown[] = o.tracks === undefined ? [] : Array.isArray(o.tracks) ? o.tracks : [];\n if (o.tracks !== undefined && !Array.isArray(o.tracks)) warn(`pixi-effects: ${who}: music.tracks must be a list of { inst, notes } objects (got ${typeof o.tracks})`);\n if (rawTracks.length > MAX_TRACKS) warn(`pixi-effects: ${who}: music has ${rawTracks.length} tracks; only the first ${MAX_TRACKS} play`);\n const tracks: ResolvedTrack[] = [];\n let notes = 0;\n rawTracks.slice(0, MAX_TRACKS).forEach((raw, i) => {\n const where = `${who} music.tracks[${i}]`;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) { warn(`pixi-effects: ${where} must be an object like { inst: 'keys', notes: 'c4 e4 g4' }. The track is skipped.`); return; }\n const t = raw as Record<string, unknown>;\n warnUnknownOptions(where, t, TRACK_KEYS);\n const name = String(t.inst);\n let inst = (INSTRUMENTS as readonly string[]).includes(name) ? (name as InstrumentName) : null;\n if (!inst) {\n const guess = INSTRUMENT_ALIASES[name.toLowerCase().replace(/\\s+/g, '')] ?? (suggestName(name, INSTRUMENTS) as InstrumentName | null);\n warn(`pixi-effects: ${where}: unknown instrument \"${name}\"${guess ? ` — did you mean \"${guess}\"?` : ''} (instruments: ${INSTRUMENTS.join(', ')}). The track is skipped.`);\n return;\n }\n if (typeof t.notes !== 'string') { warn(`pixi-effects: ${where} (${inst}): notes must be a string like 'c4 e4 g4:2 _ Am7:4' (got ${JSON.stringify(t.notes)}). The track is skipped.`); return; }\n const knob = (key: string, lo: number, hi: number, fallback: number): number => {\n const v = t[key];\n if (v === undefined) return fallback;\n if (!finite(v)) { warn(`pixi-effects: ${where}: ${key} must be a number (got ${JSON.stringify(v)}); using ${fallback}`); return fallback; }\n if (v < lo || v > hi) { warn(`pixi-effects: ${where}: ${key} ${v} is outside ${lo}–${hi}; using ${clamp(v, lo, hi)}`); return clamp(v, lo, hi); }\n return v;\n };\n let parsed;\n try { parsed = parseNotes(t.notes, knob('step', 0.0625, 16, 1)); } catch (e) { warn(`pixi-effects: ${where} (${inst}): ${(e as Error).message}. The track is skipped.`); return; }\n notes += parsed.events.length;\n let vol: ResolvedTrack['vol'] = 0.8;\n if (t.vol !== undefined) {\n if (finite(t.vol)) vol = clamp(t.vol, 0, 1.5);\n else if (Array.isArray(t.vol) && t.vol.length > 0 && t.vol.every(p => Array.isArray(p) && finite(p[0]) && finite(p[1]))) {\n vol = (t.vol as Array<[number, number]>).map(([b, v]) => [b, clamp(v, 0, 1.5)] as [number, number]).sort((a, b) => a[0] - b[0]);\n } else warn(`pixi-effects: ${where}: vol must be a number (0.8) or [beat, level] points ([[0, 0], [8, 0.8]]) (got ${JSON.stringify(t.vol)}); using 0.8`);\n }\n const voice: VoiceOptions = {};\n for (const k of ['attack', 'release', 'ring'] as const) if (t[k] !== undefined) voice[k] = knob(k, k === 'ring' ? 0.1 : 0.001, k === 'ring' ? 6 : 8, 0.5);\n tracks.push({\n inst, events: parsed.events, length: parsed.length, vol, pan: knob('pan', -1, 1, 0), strum: knob('strum', 0, 0.2, 0), legato: knob('legato', 0.1, 1, 0.96),\n tone: knob('tone', 0, 1, 1), reverb: knob('reverb', 0, 1, 1), transpose: transpose + knob('transpose', -36, 36, 0), voice,\n });\n });\n if (notes > MAX_NOTES) { warn(`pixi-effects: ${who}: music has ${notes} notes; the limit is ${MAX_NOTES}. The layer is silent.`); return null; }\n\n // drums\n const sections: ResolvedDrums[] = [];\n const rawDrums: unknown[] = o.drums === undefined ? [] : Array.isArray(o.drums) ? o.drums : [o.drums];\n rawDrums.forEach((raw, i) => {\n const where = `${who} music.drums${Array.isArray(o.drums) ? `[${i}]` : ''}`;\n if (!raw || typeof raw !== 'object') { warn(`pixi-effects: ${where} must be an object like { kick: 'x...x...', snare: '....x...' } (steps: x hit, o soft hit, . nothing). It is skipped.`); return; }\n const d = raw as Record<string, unknown>;\n const drums: ResolvedDrums['drums'] = [];\n let steps = 0;\n for (const [key, pattern] of Object.entries(d)) {\n if (key === 'from' || key === 'to') continue;\n const kind = (DRUMS as readonly string[]).includes(key) ? (key as DrumName) : null;\n if (!kind) {\n const guess = DRUM_ALIASES[key.toLowerCase()] ?? (suggestName(key, DRUMS) as DrumName | null);\n warn(`pixi-effects: ${where}: unknown drum \"${key}\"${guess ? ` — did you mean \"${guess}\"?` : ''} (drums: ${DRUMS.join(', ')}, and from / to). It is skipped.`);\n continue;\n }\n if (typeof pattern !== 'string') { warn(`pixi-effects: ${where}.${key} must be a string of steps like 'x...x...' (got ${JSON.stringify(pattern)}). It is skipped.`); continue; }\n try {\n const g = parseDrumGrid(pattern);\n drums.push({ kind, hits: g.hits });\n steps = Math.max(steps, g.steps);\n } catch (e) { warn(`pixi-effects: ${where}.${key}: ${(e as Error).message}. It is skipped.`); }\n }\n if (drums.length === 0 || steps === 0) return;\n const from = finite(d.from) ? Math.max(0, d.from) : 0, to = finite(d.to) ? d.to : Infinity;\n if (d.from !== undefined && !finite(d.from)) warn(`pixi-effects: ${where}.from must be a beat number (got ${JSON.stringify(d.from)}); using 0`);\n sections.push({ from, to, repeat: steps / grid, drums });\n });\n\n const beats = Math.max(0, ...tracks.map(t => t.length), ...sections.map(s => (Number.isFinite(s.to) ? s.to : 0)));\n const map = new TempoMap(tempo);\n const seconds = map.seconds(beats);\n if (beats === 0) {\n warn(`pixi-effects: ${who}: music has no notes${sections.length ? ' (drums alone do not set the length: add a track, or a rest such as notes: \\'_:16\\')' : ''}. The layer is silent.`);\n return null;\n }\n if (seconds > MAX_SECONDS) { warn(`pixi-effects: ${who}: the music lasts ${Math.round(seconds)} s; the limit is ${MAX_SECONDS} s. The layer is silent.`); return null; }\n return { tempo, meter, meterSet: finite(o.meter), swing, reverb: reverbAmount, humanize, drumVol, grid, tail, seed, tracks, drums: sections, beats, seconds };\n}\n\n/** Cache key: equal keys render equal samples (the score is plain data, so its JSON is the key). */\nexport function musicKey(m: ResolvedMusic, length: number, loop: boolean): string {\n return `music|${JSON.stringify([m.tempo, m.swing, m.reverb, m.humanize, m.drumVol, m.grid, m.tail, m.seed, m.tracks, m.drums, length, loop])}`;\n}\n","import { Biquad, clearVoiceTables, hitDrum, reverbSteps, setSampleRate, VOICES, type Bus } from './instruments';\nimport { TempoMap } from './notation';\nimport type { ResolvedMusic, ResolvedTrack } from './resolve';\n\n/** The loudest sample of music at `volume: 1` (−6 dBFS), so it sits under speech and sound effects (sfx peak at −12 dBFS). */\nexport const MUSIC_PEAK = 0.5;\nconst RMS_CAP = 0.12;\n\n/** Seeded random numbers (mulberry32): the same seed always gives the same music. */\nfunction rng(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/** The first and the last index where the bus is not 0 (`[total, -1]` when it is all 0). */\nfunction extent(b: Bus): [number, number] {\n let lo = b.L.length, hi = -1;\n for (let i = 0; i < b.L.length; i++) if (b.L[i] !== 0 || b.R[i] !== 0) { lo = i; break; }\n for (let i = b.L.length - 1; i >= lo; i--) if (b.L[i] !== 0 || b.R[i] !== 0) { hi = i; break; }\n return [lo, hi];\n}\n\n/** How long the music plays, in seconds: its notes plus the tail of the reverb. */\nexport function musicLength(m: ResolvedMusic): number {\n return m.seconds + m.tail;\n}\n\n/** The beats of a score as times in seconds (the kick hits when there are drums with a kick, otherwise every beat): what `react()` pulses on. */\nexport function musicBeatTimes(m: ResolvedMusic, until = m.seconds): number[] {\n const map = new TempoMap(m.tempo);\n const times: number[] = [];\n if (m.drums.some(s => s.drums.some(d => d.kind === 'kick'))) {\n for (const s of m.drums) {\n const kick = s.drums.find(d => d.kind === 'kick');\n if (!kick) continue;\n const end = Math.min(s.to, m.beats);\n for (let rep = 0; s.from + rep * s.repeat < end; rep++) for (const h of kick.hits) {\n const b = s.from + rep * s.repeat + h.i / m.grid;\n if (b < end) times.push(map.seconds(b));\n }\n }\n times.sort((a, b) => a - b);\n } else {\n for (let b = 0; b < m.beats; b++) times.push(map.seconds(b));\n }\n return times.filter(t => t < until);\n}\n\n\n/** The tone filter (two cascaded biquads per channel) over [i, stop): a plain function, so the loop is not inside the generator. Returns where it stopped. */\nfunction toneRun(scratch: Bus, a: Biquad[], b: Biquad[], i: number, stop: number, end: number): number {\n const L = scratch.L, R = scratch.R;\n const a0 = a[0]!, a1 = a[1]!, b0 = b[0]!, b1 = b[1]!;\n for (; i < stop && (i < end || !(a0.settled() && a1.settled() && b0.settled() && b1.settled())); i++) {\n L[i] = a1.run(a0.run(L[i]!));\n R[i] = b1.run(b0.run(R[i]!));\n }\n return i;\n}\n/** Level, pan and the sends of one track over [i, stop): a plain function for the same reason. */\nfunction mixRun(scratch: Bus, out: Bus, send: Bus, i: number, stop: number, level: (sec: number) => number, constant: boolean, g: number, gl: number, gr: number, rv: number, sampleRate: number): void {\n const sL = scratch.L, sR = scratch.R, oL = out.L, oR = out.R, eL = send.L, eR = send.R;\n for (; i < stop; i++) {\n if (!constant) g = level(i / sampleRate);\n const l = sL[i]! * g * gl, r = sR[i]! * g * gr;\n oL[i]! += l; oR[i]! += r;\n eL[i]! += l * rv; eR[i]! += r * rv;\n }\n}\nfunction tanhRun(out: Bus, i: number, stop: number, acc: Float64Array): void {\n const L = out.L, R = out.R;\n let peak = acc[0]!, sum = acc[1]!;\n for (; i < stop; i++) {\n const l = (L[i] = Math.tanh(L[i]! * 0.9)), r = (R[i] = Math.tanh(R[i]! * 0.9));\n peak = Math.max(peak, Math.abs(l), Math.abs(r));\n sum += l * l + r * r;\n }\n acc[0] = peak; acc[1] = sum;\n}\n\n/** The music as a sequence of slices: each `yield` is how much is done (0..1); the return value is the samples. */\nfunction* renderMusicSteps(m: ResolvedMusic, sampleRate: number, length: number, loop: boolean): Generator<number, [Float32Array, Float32Array], void> {\n setSampleRate(sampleRate);\n // work is counted in units (a track, the drums, the reverb, the last pass): a yield says how many are done, as 0..1\n const units = m.tracks.length + (m.drums.length ? 1 : 0) + 2;\n let unit = 0;\n const total = Math.max(2, Math.round(length * sampleRate));\n const rnd = rng(m.seed);\n const map = new TempoMap(m.tempo);\n const loopSec = map.seconds(m.beats);\n const repeats = loop ? Math.max(1, Math.ceil(length / Math.max(0.1, loopSec))) : 1;\n const bus = (): Bus => ({ L: new Float32Array(total), R: new Float32Array(total) });\n const out = bus(), send = bus(), scratch = bus();\n const swingShift = (beat: number): number => {\n const frac = beat - Math.floor(beat);\n return beat + (Math.abs(frac - 0.5) < 1e-6 ? m.swing * 0.5 : Math.abs(frac - 0.75) < 1e-6 ? m.swing * 0.25 : 0);\n };\n\n const levelAt = (vol: ResolvedTrack['vol']): ((sec: number) => number) => {\n if (typeof vol === 'number') return () => vol;\n const pts = vol.map(([b, v]) => [map.seconds(b), v] as const);\n // played in order (a render asks for seconds that only rise) the segment is found by moving on, not by searching from the start\n if (!loop && pts.every((p, i) => i === 0 || p[0] >= pts[i - 1]![0])) {\n let j = 1;\n return sec => {\n if (sec <= pts[0]![0]) return pts[0]![1];\n while (j < pts.length && !(sec < pts[j]![0])) j++;\n if (j < pts.length) return pts[j - 1]![1] + ((pts[j]![1] - pts[j - 1]![1]) * (sec - pts[j - 1]![0])) / (pts[j]![0] - pts[j - 1]![0]);\n return pts[pts.length - 1]![1];\n };\n }\n return sec => {\n const t = loop && loopSec > 0 ? sec % loopSec : sec;\n if (t <= pts[0]![0]) return pts[0]![1];\n for (let i = 1; i < pts.length; i++) {\n if (t < pts[i]![0]) return pts[i - 1]![1] + ((pts[i]![1] - pts[i - 1]![1]) * (t - pts[i - 1]![0])) / (pts[i]![0] - pts[i - 1]![0]);\n }\n return pts[pts.length - 1]![1];\n };\n };\n\n for (const tr of m.tracks) {\n const inst = VOICES[tr.inst];\n for (let r = 0; r < repeats; r++) {\n const offset = r * loopSec;\n for (let ei = 0; ei < tr.events.length; ei++) {\n const e = tr.events[ei]!;\n yield (unit + ei / tr.events.length) / units;\n const strum = e.midi.length > 1 ? tr.strum : 0;\n const startBeat = swingShift(e.t);\n const lenSec = Math.max(0.05, (map.seconds(e.t + e.dur) - map.seconds(e.t)) * tr.legato);\n e.midi.forEach((midi, k) => {\n const t0 = offset + map.seconds(startBeat) + (rnd() - 0.5) * m.humanize + k * strum;\n const vel = Math.min(1, e.vel * (0.93 + rnd() * 0.14));\n if (t0 * sampleRate >= total) return;\n inst(midi + tr.transpose, lenSec, vel, scratch, Math.max(0, Math.round(t0 * sampleRate)), rnd, tr.voice);\n });\n }\n }\n // where the track made sound: before and after it the scratch bus is exactly 0, so nothing there is filtered or mixed\n const [lo, hi] = extent(scratch);\n let end = hi + 1;\n if (tr.tone < 1) {\n const fc = 400 * 50 ** tr.tone;\n const a = [new Biquad('lp', fc, 0.7), new Biquad('lp', fc, 0.7)], b = [new Biquad('lp', fc, 0.7), new Biquad('lp', fc, 0.7)];\n let i = lo;\n // up to the last sound, then until the filter has run out (what it gives from there on is 0 in a Float32Array)\n for (;;) {\n const stop = Math.min(total, (i | 65535) + 1);\n const j = toneRun(scratch, a, b, i, stop, end);\n if (j < stop || j >= total) { i = j; break; }\n i = j; yield (unit + 0.9) / units;\n }\n end = Math.max(end, i);\n }\n const level = levelAt(tr.vol), pan = Math.max(-1, Math.min(1, tr.pan));\n const gl = Math.cos(((pan + 1) * Math.PI) / 4) * 1.3, gr = Math.sin(((pan + 1) * Math.PI) / 4) * 1.3;\n const constant = typeof tr.vol === 'number';\n let g = constant ? level(0) : 0;\n for (let i = lo; i < end; ) {\n const stop = Math.min(end, (i | 65535) + 1);\n mixRun(scratch, out, send, i, stop, level, constant, g, gl, gr, tr.reverb, sampleRate);\n i = stop; yield (unit + 0.95) / units;\n }\n scratch.L.fill(0, lo, end); scratch.R.fill(0, lo, end);\n unit++;\n }\n\n if (m.drums.length) {\n scratch.L.fill(0); scratch.R.fill(0);\n for (let r = 0; r < repeats; r++) {\n const offset = r * loopSec;\n for (const s of m.drums) {\n yield unit / units;\n const end = Math.min(s.to, m.beats);\n for (let rep = 0; s.from + rep * s.repeat < end - 1e-6; rep++) for (const d of s.drums) for (const h of d.hits) {\n const beat = s.from + rep * s.repeat + h.i / m.grid;\n if (beat >= end) continue;\n const vel = h.vel * (0.9 + rnd() * 0.2);\n const t0 = offset + map.seconds(swingShift(beat)) + (rnd() - 0.5) * m.humanize * 0.5;\n if (t0 * sampleRate >= total) continue;\n hitDrum(d.kind, vel, scratch, Math.max(0, Math.round(t0 * sampleRate)), rnd);\n }\n }\n }\n for (let i = 0; i < total; i++) {\n const l = scratch.L[i]! * m.drumVol, r = scratch.R[i]! * m.drumVol;\n out.L[i]! += l; out.R[i]! += r; send.L[i]! += l; send.R[i]! += r;\n }\n unit++;\n }\n\n for (const f of reverbSteps(send, out, m.reverb, 0.8)) yield (unit + f) / units;\n unit++;\n const acc = new Float64Array(2);\n for (let i = 0; i < total; ) {\n const stop = Math.min(total, (i | 65535) + 1);\n tanhRun(out, i, stop, acc);\n i = stop; yield (unit + (0.5 * i) / total) / units;\n }\n const peak = acc[0]!, sum = acc[1]!;\n const rms = Math.sqrt(sum / (2 * total));\n const gain = peak > 0 ? Math.min(MUSIC_PEAK / peak, RMS_CAP / Math.max(rms, 1e-9)) : 0;\n const fade = Math.min(Math.floor(0.4 * sampleRate), total >> 2);\n for (let i = 0; i < total; i++) {\n const f = i >= total - fade ? (total - 1 - i) / fade : 1;\n out.L[i]! *= gain * f; out.R[i]! *= gain * f;\n }\n clearVoiceTables();\n return [out.L, out.R];\n}\n\n/**\n * Stereo samples `[left, right]` of the music at `sampleRate`, `length` seconds long: cut (with a short fade) if shorter than the music,\n * silent after it if longer, or repeated from the start with `loop`. Same music, same samples.\n */\nexport function renderMusic(m: ResolvedMusic, sampleRate: number, length: number, loop = false): [Float32Array, Float32Array] {\n const it = renderMusicSteps(m, sampleRate, length, loop);\n for (;;) { const r = it.next(); if (r.done) return r.value; }\n}\n\n/** The same samples, made in slices: `pace(done)` (0..1) runs between them and may wait, so the page can paint while a long piece is made. */\nexport async function renderMusicAsync(\n m: ResolvedMusic, sampleRate: number, length: number, loop = false, pace?: (done: number) => Promise<void> | void,\n): Promise<[Float32Array, Float32Array]> {\n const it = renderMusicSteps(m, sampleRate, length, loop);\n for (;;) {\n const r = it.next();\n if (r.done) return r.value;\n if (pace) await pace(r.value);\n }\n}\n\n"]}
package/dist/three.cjs CHANGED
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunkYOV6MEXH_cjs = require('./chunk-YOV6MEXH.cjs');
3
+ var chunkMZCDBRTY_cjs = require('./chunk-MZCDBRTY.cjs');
4
4
  require('./chunk-ZMAD3KJU.cjs');
5
5
  require('./chunk-TWZNOUM7.cjs');
6
6
  var pixi_js = require('pixi.js');
7
7
  var three$1 = require('three');
8
8
 
9
- var ThreeSequence = class extends chunkYOV6MEXH_cjs.Sequence {
9
+ var ThreeSequence = class extends chunkMZCDBRTY_cjs.Sequence {
10
10
  _renderer = null;
11
11
  _scene = null;
12
12
  _camera = null;
@@ -25,7 +25,7 @@ var ThreeSequence = class extends chunkYOV6MEXH_cjs.Sequence {
25
25
  if (this.duration === void 0) {
26
26
  this.duration = this.parent?.duration ?? this.root.duration;
27
27
  }
28
- const scope = chunkYOV6MEXH_cjs.buildScope(this, this.parent, this.root);
28
+ const scope = chunkMZCDBRTY_cjs.buildScope(this, this.parent, this.root);
29
29
  const width = resolveDim(spec.width, scope) ?? this.parent?.width ?? this.root.width;
30
30
  const height = resolveDim(spec.height, scope) ?? this.parent?.height ?? this.root.height;
31
31
  const resolution = spec.resolution ?? 1;
@@ -145,12 +145,12 @@ var ThreeSequence = class extends chunkYOV6MEXH_cjs.Sequence {
145
145
  function resolveDim(v, scope) {
146
146
  if (v === void 0) return void 0;
147
147
  if (typeof v === "number") return v;
148
- return chunkYOV6MEXH_cjs.evaluateExpr(v, scope);
148
+ return chunkMZCDBRTY_cjs.evaluateExpr(v, scope);
149
149
  }
150
150
 
151
151
  // src/three/index.ts
152
152
  function registerThree() {
153
- chunkYOV6MEXH_cjs.registerSequenceType("three", ThreeSequence);
153
+ chunkMZCDBRTY_cjs.registerSequenceType("three", ThreeSequence);
154
154
  }
155
155
  function three(spec) {
156
156
  return spec;
package/dist/three.d.cts CHANGED
@@ -1,6 +1,6 @@
1
- import { d as SequenceCommon, O as PropValue, S as SequenceSpec } from './types-BNVsBBZf.cjs';
1
+ import { e as SequenceCommon, X as PropValue, S as SequenceSpec } from './types-DpK1vwcl.cjs';
2
2
  import { Scene, Camera, WebGLRenderer } from 'three';
3
- import { S as Sequence, P as PathRouters } from './Base-DjhdL8B1.cjs';
3
+ import { S as Sequence, P as PathRouters } from './Base-DI1FCGcH.cjs';
4
4
  import 'pixi.js';
5
5
 
6
6
  /** Handed to setup / update / dispose. One per three sequence. */
package/dist/three.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { d as SequenceCommon, O as PropValue, S as SequenceSpec } from './types-BNVsBBZf.js';
1
+ import { e as SequenceCommon, X as PropValue, S as SequenceSpec } from './types-DpK1vwcl.js';
2
2
  import { Scene, Camera, WebGLRenderer } from 'three';
3
- import { S as Sequence, P as PathRouters } from './Base-CKGl6jCo.js';
3
+ import { S as Sequence, P as PathRouters } from './Base-C6f0fE8j.js';
4
4
  import 'pixi.js';
5
5
 
6
6
  /** Handed to setup / update / dispose. One per three sequence. */
package/dist/three.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Sequence, buildScope, evaluateExpr, registerSequenceType } from './chunk-BQNNZEAX.js';
1
+ import { Sequence, buildScope, evaluateExpr, registerSequenceType } from './chunk-AK54FIWM.js';
2
2
  import './chunk-45QKLD6M.js';
3
3
  import './chunk-BXOCEZ4U.js';
4
4
  import { Texture, Sprite } from 'pixi.js';
@@ -172,6 +172,80 @@ declare function pictureStops(stops: readonly Stop[], opts?: {
172
172
  pdf?: boolean;
173
173
  }): Stop[];
174
174
 
175
+ /** One note or chord of a track, as a score reader sees it. */
176
+ interface MusicNote {
177
+ /** Where it starts: beats from the start, and the same moment in seconds (the tempo map applied; swing and humanize are not). */
178
+ beat: number;
179
+ time: number;
180
+ /** How long it is held, in beats and in seconds. */
181
+ duration: number;
182
+ seconds: number;
183
+ /** The bar it starts in (1-based, from `meter`) and its beat inside that bar (1 = the downbeat, 1.5 = the "and" of 1). */
184
+ bar: number;
185
+ beatInBar: number;
186
+ /** The audible MIDI notes (`music.transpose` and the track's `transpose` are in). */
187
+ midi: number[];
188
+ /** What the score called it: `Am7`, `c4`, `[c4 e4 g4]`. */
189
+ name: string;
190
+ /** More than one note at once. */
191
+ chord: boolean;
192
+ /** 0–1 (0.8 normal, 1 accented with `!`, 0.55 soft with `,`). */
193
+ velocity: number;
194
+ }
195
+ interface MusicTrackEvents {
196
+ inst: string;
197
+ /** The track's length in beats and in bars (not a whole number when a bar is short: that is what to look for). */
198
+ beats: number;
199
+ bars: number;
200
+ notes: MusicNote[];
201
+ }
202
+ interface MusicDrumHit {
203
+ beat: number;
204
+ time: number;
205
+ bar: number;
206
+ beatInBar: number;
207
+ velocity: number;
208
+ }
209
+ interface MusicDrumEvents {
210
+ kind: string;
211
+ hits: MusicDrumHit[];
212
+ }
213
+ interface MusicEvents {
214
+ /** The tempo at the start. */
215
+ bpm: number;
216
+ meter: number;
217
+ beats: number;
218
+ bars: number;
219
+ /** The music without its reverb tail. */
220
+ seconds: number;
221
+ tracks: MusicTrackEvents[];
222
+ /** Every drum that is hit, over all sections, with every hit written out. */
223
+ drums: MusicDrumEvents[];
224
+ }
225
+ /** What the `check` tool prints about a music layer: lengths in bars (a short track shows), what starts in each bar, where the drums play. */
226
+ interface MusicSummary {
227
+ bpm: number;
228
+ meter: number;
229
+ /** The score set `meter`; when false 4 is only assumed. */
230
+ meterSet: boolean;
231
+ beats: number;
232
+ bars: number;
233
+ seconds: number;
234
+ tail: number;
235
+ tracks: Array<{
236
+ inst: string;
237
+ beats: number;
238
+ bars: number;
239
+ events: number;
240
+ perBar: string[];
241
+ }>;
242
+ drums: Array<{
243
+ from: number;
244
+ to: number;
245
+ kinds: string[];
246
+ }>;
247
+ }
248
+
175
249
  /**
176
250
  * pixi-effects public DSL types.
177
251
  *
@@ -588,6 +662,8 @@ type MusicDrums = {
588
662
  interface MusicOptions {
589
663
  /** Beats per minute, or `[beat, bpm]` points for a tempo change (a ritardando: `[[0, 96], [28, 96], [32, 60]]`). */
590
664
  bpm: number | Array<[number, number]>;
665
+ /** Beats in a bar (default 4; a waltz is 3). Only names the bars in `musicEvents()` and the `check` read-back; playback does not use it. */
666
+ meter?: number;
591
667
  tracks?: MusicTrack[];
592
668
  /** Drum patterns that repeat, or a list of them with `from` / `to` (beats) for sections. */
593
669
  drums?: MusicDrums | MusicDrums[];
@@ -853,6 +929,8 @@ interface AudioDescriptor {
853
929
  layer?: string;
854
930
  /** What it plays: `sfx "pop"`, `asset "bgm"`, `video "green"`. */
855
931
  source?: string;
932
+ /** A music layer's score read back: bars per track, what starts in each bar, the drum spans (for `movie.inspectAudio()` and the `check` tool). */
933
+ music?: MusicSummary;
856
934
  loop: boolean;
857
935
  start: number;
858
936
  end: number;
@@ -870,4 +948,4 @@ interface AudioDescriptor {
870
948
  sourceMap?: (u: number) => number;
871
949
  }
872
950
 
873
- export { type StopSpec as $, type ArcShapeSpec as A, type BlendModeName as B, type CompositionShape as C, type DipTransition as D, type EllipseShapeSpec as E, type FilterSpec as F, type GradientSpec as G, type PathShapeSpec as H, type ImageSequenceSpec as I, type PolygonShapeSpec as J, type Keyframe as K, type LightSequenceSpec as L, type MusicOptions as M, type NullSequenceSpec as N, type PropValue as O, type Props as P, type SfxKnobs as Q, type RectShapeSpec as R, type SequenceSpec as S, type TextSequenceSpec as T, type SfxOptions as U, type SfxPreset as V, type SfxVoice as W, type ShaderSequenceSpec as X, type ShapeSequenceSpec as Y, type SlideTransition as Z, type Stop as _, type CameraSequenceSpec as a, type TransitionCommon as a0, type VideoSequenceSpec as a1, type WipeTransition as a2, type ZoomTransition as a3, normalizeStops as a4, pictureStops as a5, type Timeline as a6, type AudioDescriptor as a7, type TransitionSpec as b, type CompositionSpec as c, type SequenceCommon as d, type AssetSpec as e, type AudioAssetSpec as f, type AudioMusicSpec as g, type AudioSequenceSpec as h, type AudioSfxSpec as i, type ChromaKeyFilterSpec as j, type CircleShapeSpec as k, type CompositionSequenceSpec as l, type CrossfadeTransition as m, type CustomFilterSpec as n, type DissolveTransition as o, type Expr as p, type IrisTransition as q, type LineShapeSpec as r, type LumaTransition as s, type MaskRefSpec as t, type MatteRefSpec as u, type MusicDrum as v, type MusicDrums as w, type MusicInstrument as x, type MusicLevel as y, type MusicTrack as z };
951
+ export { type SfxPreset as $, type ArcShapeSpec as A, type BlendModeName as B, type CompositionShape as C, type DipTransition as D, type EllipseShapeSpec as E, type FilterSpec as F, type GradientSpec as G, type MusicInstrument as H, type ImageSequenceSpec as I, type MusicLevel as J, type Keyframe as K, type LightSequenceSpec as L, type MusicOptions as M, type MusicNote as N, type MusicSummary as O, type Props as P, type MusicTrack as Q, type MusicTrackEvents as R, type SequenceSpec as S, type TextSequenceSpec as T, type NullSequenceSpec as U, type PathShapeSpec as V, type PolygonShapeSpec as W, type PropValue as X, type RectShapeSpec as Y, type SfxKnobs as Z, type SfxOptions as _, type CameraSequenceSpec as a, type SfxVoice as a0, type ShaderSequenceSpec as a1, type ShapeSequenceSpec as a2, type SlideTransition as a3, type Stop as a4, type StopSpec as a5, type TransitionCommon as a6, type VideoSequenceSpec as a7, type WipeTransition as a8, type ZoomTransition as a9, normalizeStops as aa, pictureStops as ab, type Timeline as ac, type AudioDescriptor as ad, type MusicEvents as b, type TransitionSpec as c, type CompositionSpec as d, type SequenceCommon as e, type AssetSpec as f, type AudioAssetSpec as g, type AudioMusicSpec as h, type AudioSequenceSpec as i, type AudioSfxSpec as j, type ChromaKeyFilterSpec as k, type CircleShapeSpec as l, type CompositionSequenceSpec as m, type CrossfadeTransition as n, type CustomFilterSpec as o, type DissolveTransition as p, type Expr as q, type IrisTransition as r, type LineShapeSpec as s, type LumaTransition as t, type MaskRefSpec as u, type MatteRefSpec as v, type MusicDrum as w, type MusicDrumEvents as x, type MusicDrumHit as y, type MusicDrums as z };