earcons 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -389,6 +389,336 @@ function infoPreset(variant, pitchSemitones) {
389
389
  return VARIANTS6[variant];
390
390
  }
391
391
 
392
+ // src/sounds/toggle.ts
393
+ var ENV = { attack: 3e-3, decay: 0.022, sustain: 0, release: 0.018 };
394
+ var VARIANTS7 = {
395
+ short: {
396
+ name: "toggle",
397
+ duration: 0.08,
398
+ notes: [
399
+ { frequency: 880, duration: 0.06, startAt: 0, waveShape: "triangle", gain: 0.6, envelope: ENV }
400
+ ]
401
+ },
402
+ medium: {
403
+ name: "toggle",
404
+ duration: 0.18,
405
+ notes: [
406
+ { frequency: 660, duration: 0.05, startAt: 0, waveShape: "triangle", gain: 0.5, envelope: ENV },
407
+ { frequency: 880, duration: 0.07, startAt: 0.08, waveShape: "triangle", gain: 0.65, envelope: ENV }
408
+ ]
409
+ },
410
+ long: {
411
+ name: "toggle",
412
+ duration: 0.3,
413
+ notes: [
414
+ { frequency: 440, duration: 0.05, startAt: 0, waveShape: "triangle", gain: 0.45, envelope: ENV },
415
+ { frequency: 660, duration: 0.05, startAt: 0.08, waveShape: "triangle", gain: 0.55, envelope: ENV },
416
+ { frequency: 880, duration: 0.08, startAt: 0.16, waveShape: "triangle", gain: 0.65, envelope: ENV }
417
+ ]
418
+ }
419
+ };
420
+ function togglePreset(variant, pitchSemitones) {
421
+ return VARIANTS7[variant];
422
+ }
423
+
424
+ // src/sounds/delete.ts
425
+ var ENV2 = { attack: 3e-3, decay: 0.04, sustain: 0.3, release: 0.07 };
426
+ var VARIANTS8 = {
427
+ short: {
428
+ name: "delete",
429
+ duration: 0.22,
430
+ notes: [
431
+ { frequency: 440, duration: 0.07, startAt: 0, waveShape: "sawtooth", gain: 0.5, envelope: ENV2 },
432
+ { frequency: 293, duration: 0.12, startAt: 0.08, waveShape: "sawtooth", gain: 0.55, envelope: ENV2 }
433
+ ]
434
+ },
435
+ medium: {
436
+ name: "delete",
437
+ duration: 0.38,
438
+ notes: [
439
+ { frequency: 523, duration: 0.07, startAt: 0, waveShape: "sawtooth", gain: 0.45, envelope: ENV2 },
440
+ { frequency: 415, duration: 0.07, startAt: 0.09, waveShape: "sawtooth", gain: 0.5, envelope: ENV2 },
441
+ { frequency: 277, duration: 0.15, startAt: 0.18, waveShape: "sawtooth", gain: 0.55, envelope: ENV2 }
442
+ ]
443
+ },
444
+ long: {
445
+ name: "delete",
446
+ duration: 0.55,
447
+ notes: [
448
+ { frequency: 587, duration: 0.07, startAt: 0, waveShape: "sawtooth", gain: 0.4, envelope: ENV2 },
449
+ { frequency: 494, duration: 0.07, startAt: 0.09, waveShape: "sawtooth", gain: 0.45, envelope: ENV2 },
450
+ { frequency: 392, duration: 0.07, startAt: 0.18, waveShape: "sawtooth", gain: 0.5, envelope: ENV2 },
451
+ { frequency: 277, duration: 0.2, startAt: 0.27, waveShape: "sawtooth", gain: 0.55, envelope: ENV2 }
452
+ ]
453
+ }
454
+ };
455
+ function deletePreset(variant, pitchSemitones) {
456
+ return VARIANTS8[variant];
457
+ }
458
+
459
+ // src/sounds/message.ts
460
+ var ENV3 = { attack: 0.01, decay: 0.04, sustain: 0.3, release: 0.08 };
461
+ var VARIANTS9 = {
462
+ short: {
463
+ name: "message",
464
+ duration: 0.15,
465
+ notes: [
466
+ { frequency: 1318, duration: 0.12, startAt: 0, waveShape: "sine", gain: 0.35, envelope: ENV3 }
467
+ ]
468
+ },
469
+ medium: {
470
+ name: "message",
471
+ duration: 0.26,
472
+ notes: [
473
+ { frequency: 1318, duration: 0.07, startAt: 0, waveShape: "sine", gain: 0.35, envelope: ENV3 },
474
+ { frequency: 1047, duration: 0.15, startAt: 0.08, waveShape: "sine", gain: 0.4, envelope: ENV3 }
475
+ ]
476
+ },
477
+ long: {
478
+ name: "message",
479
+ duration: 0.4,
480
+ notes: [
481
+ { frequency: 1568, duration: 0.06, startAt: 0, waveShape: "sine", gain: 0.3, envelope: ENV3 },
482
+ { frequency: 1318, duration: 0.07, startAt: 0.07, waveShape: "sine", gain: 0.35, envelope: ENV3 },
483
+ { frequency: 1047, duration: 0.22, startAt: 0.15, waveShape: "sine", gain: 0.4, envelope: ENV3 }
484
+ ]
485
+ }
486
+ };
487
+ function messagePreset(variant, pitchSemitones) {
488
+ return VARIANTS9[variant];
489
+ }
490
+
491
+ // src/sounds/upload.ts
492
+ var VARIANTS10 = {
493
+ short: {
494
+ name: "upload",
495
+ duration: 0.24,
496
+ notes: [
497
+ { frequency: 523, duration: 0.08, startAt: 0, waveShape: "sine", gain: 0.6 },
498
+ { frequency: 784, duration: 0.13, startAt: 0.09, waveShape: "sine", gain: 0.7 }
499
+ ]
500
+ },
501
+ medium: {
502
+ name: "upload",
503
+ duration: 0.4,
504
+ notes: [
505
+ { frequency: 392, duration: 0.08, startAt: 0, waveShape: "sine", gain: 0.55 },
506
+ { frequency: 523, duration: 0.08, startAt: 0.1, waveShape: "sine", gain: 0.65 },
507
+ { frequency: 784, duration: 0.18, startAt: 0.2, waveShape: "sine", gain: 0.75 }
508
+ ]
509
+ },
510
+ long: {
511
+ name: "upload",
512
+ duration: 0.58,
513
+ notes: [
514
+ { frequency: 330, duration: 0.08, startAt: 0, waveShape: "sine", gain: 0.5 },
515
+ { frequency: 392, duration: 0.08, startAt: 0.1, waveShape: "sine", gain: 0.6 },
516
+ { frequency: 523, duration: 0.08, startAt: 0.2, waveShape: "sine", gain: 0.65 },
517
+ { frequency: 784, duration: 0.24, startAt: 0.3, waveShape: "sine", gain: 0.75 }
518
+ ]
519
+ }
520
+ };
521
+ function uploadPreset(variant, pitchSemitones) {
522
+ return VARIANTS10[variant];
523
+ }
524
+
525
+ // src/sounds/download.ts
526
+ var VARIANTS11 = {
527
+ short: {
528
+ name: "download",
529
+ duration: 0.24,
530
+ notes: [
531
+ { frequency: 784, duration: 0.08, startAt: 0, waveShape: "sine", gain: 0.7 },
532
+ { frequency: 523, duration: 0.13, startAt: 0.09, waveShape: "sine", gain: 0.6 }
533
+ ]
534
+ },
535
+ medium: {
536
+ name: "download",
537
+ duration: 0.4,
538
+ notes: [
539
+ { frequency: 784, duration: 0.08, startAt: 0, waveShape: "sine", gain: 0.75 },
540
+ { frequency: 523, duration: 0.08, startAt: 0.1, waveShape: "sine", gain: 0.65 },
541
+ { frequency: 392, duration: 0.18, startAt: 0.2, waveShape: "sine", gain: 0.55 }
542
+ ]
543
+ },
544
+ long: {
545
+ name: "download",
546
+ duration: 0.58,
547
+ notes: [
548
+ { frequency: 784, duration: 0.08, startAt: 0, waveShape: "sine", gain: 0.75 },
549
+ { frequency: 523, duration: 0.08, startAt: 0.1, waveShape: "sine", gain: 0.65 },
550
+ { frequency: 392, duration: 0.08, startAt: 0.2, waveShape: "sine", gain: 0.6 },
551
+ { frequency: 330, duration: 0.24, startAt: 0.3, waveShape: "sine", gain: 0.5 }
552
+ ]
553
+ }
554
+ };
555
+ function downloadPreset(variant, pitchSemitones) {
556
+ return VARIANTS11[variant];
557
+ }
558
+
559
+ // src/sounds/eightBit.ts
560
+ var ENV4 = { attack: 3e-3, decay: 0.015, sustain: 0.4, release: 0.015 };
561
+ var VARIANTS12 = {
562
+ short: {
563
+ name: "eightBit",
564
+ duration: 0.2,
565
+ notes: [
566
+ { frequency: 523.25, duration: 0.04, startAt: 0, waveShape: "square", gain: 0.38, envelope: ENV4 },
567
+ { frequency: 659.26, duration: 0.04, startAt: 0.05, waveShape: "square", gain: 0.38, envelope: ENV4 },
568
+ { frequency: 783.99, duration: 0.08, startAt: 0.1, waveShape: "square", gain: 0.42, envelope: ENV4 }
569
+ ]
570
+ },
571
+ medium: {
572
+ name: "eightBit",
573
+ duration: 0.33,
574
+ notes: [
575
+ { frequency: 523.25, duration: 0.04, startAt: 0, waveShape: "square", gain: 0.35, envelope: ENV4 },
576
+ { frequency: 659.26, duration: 0.04, startAt: 0.06, waveShape: "square", gain: 0.38, envelope: ENV4 },
577
+ { frequency: 783.99, duration: 0.04, startAt: 0.12, waveShape: "square", gain: 0.4, envelope: ENV4 },
578
+ { frequency: 1046.5, duration: 0.12, startAt: 0.18, waveShape: "square", gain: 0.45, envelope: ENV4 }
579
+ ]
580
+ },
581
+ long: {
582
+ name: "eightBit",
583
+ duration: 0.5,
584
+ notes: [
585
+ { frequency: 523.25, duration: 0.04, startAt: 0, waveShape: "square", gain: 0.32, envelope: ENV4 },
586
+ { frequency: 659.26, duration: 0.04, startAt: 0.06, waveShape: "square", gain: 0.35, envelope: ENV4 },
587
+ { frequency: 783.99, duration: 0.04, startAt: 0.12, waveShape: "square", gain: 0.38, envelope: ENV4 },
588
+ { frequency: 659.26, duration: 0.04, startAt: 0.18, waveShape: "square", gain: 0.35, envelope: ENV4 },
589
+ { frequency: 783.99, duration: 0.04, startAt: 0.24, waveShape: "square", gain: 0.38, envelope: ENV4 },
590
+ { frequency: 1046.5, duration: 0.15, startAt: 0.3, waveShape: "square", gain: 0.45, envelope: ENV4 }
591
+ ]
592
+ }
593
+ };
594
+ function eightBitPreset(variant, pitchSemitones) {
595
+ return VARIANTS12[variant];
596
+ }
597
+
598
+ // src/sounds/police.ts
599
+ var ENV5 = { attack: 0.02, decay: 0, sustain: 1, release: 0.04 };
600
+ function sirenNote(freq, startAt) {
601
+ return { frequency: freq, duration: 0.22, startAt, waveShape: "sawtooth", gain: 0.45, envelope: ENV5 };
602
+ }
603
+ var VARIANTS13 = {
604
+ short: {
605
+ name: "police",
606
+ duration: 0.52,
607
+ notes: [
608
+ sirenNote(770, 0),
609
+ sirenNote(577, 0.26)
610
+ ]
611
+ },
612
+ medium: {
613
+ name: "police",
614
+ duration: 1.04,
615
+ notes: [
616
+ sirenNote(770, 0),
617
+ sirenNote(577, 0.26),
618
+ sirenNote(770, 0.52),
619
+ sirenNote(577, 0.78)
620
+ ]
621
+ },
622
+ long: {
623
+ name: "police",
624
+ duration: 1.56,
625
+ notes: [
626
+ sirenNote(770, 0),
627
+ sirenNote(577, 0.26),
628
+ sirenNote(770, 0.52),
629
+ sirenNote(577, 0.78),
630
+ sirenNote(770, 1.04),
631
+ sirenNote(577, 1.3)
632
+ ]
633
+ }
634
+ };
635
+ function policePreset(variant, pitchSemitones) {
636
+ return VARIANTS13[variant];
637
+ }
638
+
639
+ // src/sounds/coin.ts
640
+ var ENV6 = { attack: 3e-3, decay: 0.025, sustain: 0.45, release: 0.04 };
641
+ var VARIANTS14 = {
642
+ short: {
643
+ name: "coin",
644
+ duration: 0.16,
645
+ notes: [
646
+ { frequency: 987.77, duration: 0.04, startAt: 0, waveShape: "square", gain: 0.45, envelope: ENV6 },
647
+ { frequency: 1318.51, duration: 0.1, startAt: 0.045, waveShape: "square", gain: 0.5, envelope: ENV6 }
648
+ ]
649
+ },
650
+ medium: {
651
+ name: "coin",
652
+ duration: 0.28,
653
+ notes: [
654
+ { frequency: 987.77, duration: 0.05, startAt: 0, waveShape: "square", gain: 0.42, envelope: ENV6 },
655
+ { frequency: 1174.66, duration: 0.05, startAt: 0.06, waveShape: "square", gain: 0.45, envelope: ENV6 },
656
+ { frequency: 1318.51, duration: 0.14, startAt: 0.12, waveShape: "square", gain: 0.5, envelope: ENV6 }
657
+ ]
658
+ },
659
+ long: {
660
+ name: "coin",
661
+ duration: 0.42,
662
+ notes: [
663
+ { frequency: 987.77, duration: 0.05, startAt: 0, waveShape: "square", gain: 0.4, envelope: ENV6 },
664
+ { frequency: 1174.66, duration: 0.05, startAt: 0.06, waveShape: "square", gain: 0.43, envelope: ENV6 },
665
+ { frequency: 1318.51, duration: 0.05, startAt: 0.12, waveShape: "square", gain: 0.47, envelope: ENV6 },
666
+ { frequency: 1568, duration: 0.2, startAt: 0.18, waveShape: "square", gain: 0.52, envelope: ENV6 }
667
+ ]
668
+ }
669
+ };
670
+ function coinPreset(variant, pitchSemitones) {
671
+ return VARIANTS14[variant];
672
+ }
673
+
674
+ // src/sounds/boing.ts
675
+ var ENV7 = { attack: 4e-3, decay: 0, sustain: 1, release: 0.025 };
676
+ var VARIANTS15 = {
677
+ short: {
678
+ name: "boing",
679
+ duration: 0.38,
680
+ notes: [
681
+ { frequency: 1200, duration: 0.03, startAt: 0, waveShape: "sine", gain: 0.6, envelope: ENV7 },
682
+ { frequency: 900, duration: 0.03, startAt: 0.04, waveShape: "sine", gain: 0.58, envelope: ENV7 },
683
+ { frequency: 680, duration: 0.04, startAt: 0.08, waveShape: "sine", gain: 0.55, envelope: ENV7 },
684
+ { frequency: 500, duration: 0.05, startAt: 0.13, waveShape: "sine", gain: 0.52, envelope: ENV7 },
685
+ { frequency: 350, duration: 0.07, startAt: 0.19, waveShape: "sine", gain: 0.48, envelope: ENV7 },
686
+ { frequency: 220, duration: 0.1, startAt: 0.27, waveShape: "sine", gain: 0.42, envelope: ENV7 }
687
+ ]
688
+ },
689
+ medium: {
690
+ name: "boing",
691
+ duration: 0.6,
692
+ notes: [
693
+ { frequency: 1400, duration: 0.04, startAt: 0, waveShape: "sine", gain: 0.62, envelope: ENV7 },
694
+ { frequency: 1050, duration: 0.04, startAt: 0.05, waveShape: "sine", gain: 0.6, envelope: ENV7 },
695
+ { frequency: 800, duration: 0.05, startAt: 0.1, waveShape: "sine", gain: 0.57, envelope: ENV7 },
696
+ { frequency: 600, duration: 0.06, startAt: 0.16, waveShape: "sine", gain: 0.54, envelope: ENV7 },
697
+ { frequency: 450, duration: 0.07, startAt: 0.23, waveShape: "sine", gain: 0.51, envelope: ENV7 },
698
+ { frequency: 330, duration: 0.09, startAt: 0.31, waveShape: "sine", gain: 0.47, envelope: ENV7 },
699
+ { frequency: 240, duration: 0.13, startAt: 0.41, waveShape: "sine", gain: 0.42, envelope: ENV7 }
700
+ ]
701
+ },
702
+ long: {
703
+ name: "boing",
704
+ duration: 0.9,
705
+ notes: [
706
+ { frequency: 1600, duration: 0.04, startAt: 0, waveShape: "sine", gain: 0.62, envelope: ENV7 },
707
+ { frequency: 1200, duration: 0.04, startAt: 0.05, waveShape: "sine", gain: 0.6, envelope: ENV7 },
708
+ { frequency: 950, duration: 0.05, startAt: 0.1, waveShape: "sine", gain: 0.58, envelope: ENV7 },
709
+ { frequency: 720, duration: 0.06, startAt: 0.16, waveShape: "sine", gain: 0.55, envelope: ENV7 },
710
+ { frequency: 540, duration: 0.07, startAt: 0.23, waveShape: "sine", gain: 0.52, envelope: ENV7 },
711
+ { frequency: 400, duration: 0.09, startAt: 0.31, waveShape: "sine", gain: 0.49, envelope: ENV7 },
712
+ { frequency: 290, duration: 0.12, startAt: 0.41, waveShape: "sine", gain: 0.45, envelope: ENV7 },
713
+ { frequency: 210, duration: 0.16, startAt: 0.54, waveShape: "sine", gain: 0.41, envelope: ENV7 },
714
+ { frequency: 160, duration: 0.18, startAt: 0.71, waveShape: "sine", gain: 0.36, envelope: ENV7 }
715
+ ]
716
+ }
717
+ };
718
+ function boingPreset(variant, pitchSemitones) {
719
+ return VARIANTS15[variant];
720
+ }
721
+
392
722
  // src/index.ts
393
723
  async function play(preset, opts = {}) {
394
724
  const { volume = 0.5, pitch = 0, audioContext, onEnded } = opts;
@@ -416,13 +746,51 @@ async function playClick(opts = {}) {
416
746
  async function playInfo(opts = {}) {
417
747
  return play(infoPreset(opts.variant ?? "medium", opts.pitch ?? 0), opts);
418
748
  }
749
+ async function playToggle(opts = {}) {
750
+ return play(togglePreset(opts.variant ?? "short", opts.pitch ?? 0), opts);
751
+ }
752
+ async function playDelete(opts = {}) {
753
+ return play(deletePreset(opts.variant ?? "medium", opts.pitch ?? 0), opts);
754
+ }
755
+ async function playMessage(opts = {}) {
756
+ return play(messagePreset(opts.variant ?? "medium", opts.pitch ?? 0), opts);
757
+ }
758
+ async function playUpload(opts = {}) {
759
+ return play(uploadPreset(opts.variant ?? "medium", opts.pitch ?? 0), opts);
760
+ }
761
+ async function playDownload(opts = {}) {
762
+ return play(downloadPreset(opts.variant ?? "medium", opts.pitch ?? 0), opts);
763
+ }
764
+ async function playEightBit(opts = {}) {
765
+ return play(eightBitPreset(opts.variant ?? "medium", opts.pitch ?? 0), opts);
766
+ }
767
+ async function playPolice(opts = {}) {
768
+ return play(policePreset(opts.variant ?? "short", opts.pitch ?? 0), opts);
769
+ }
770
+ async function playCoin(opts = {}) {
771
+ return play(coinPreset(opts.variant ?? "short", opts.pitch ?? 0), opts);
772
+ }
773
+ async function playBoing(opts = {}) {
774
+ return play(boingPreset(opts.variant ?? "medium", opts.pitch ?? 0), opts);
775
+ }
419
776
  var BANK = {
777
+ // UI sounds
420
778
  success: successPreset,
421
779
  error: errorPreset,
422
780
  warning: warningPreset,
423
781
  notification: notificationPreset,
424
782
  click: clickPreset,
425
- info: infoPreset
783
+ info: infoPreset,
784
+ toggle: togglePreset,
785
+ delete: deletePreset,
786
+ message: messagePreset,
787
+ upload: uploadPreset,
788
+ download: downloadPreset,
789
+ // fun & misc
790
+ eightBit: eightBitPreset,
791
+ police: policePreset,
792
+ coin: coinPreset,
793
+ boing: boingPreset
426
794
  };
427
795
  async function earcon(name, opts = {}) {
428
796
  const preset = BANK[name];
@@ -432,6 +800,6 @@ function registerSound(name, preset) {
432
800
  BANK[name] = preset;
433
801
  }
434
802
 
435
- export { closeAudioContext, earcon, playClick, playError, playInfo, playNotification, playSuccess, playWarning, registerSound, semitonesToMultiplier, setAudioContext };
803
+ export { closeAudioContext, earcon, playBoing, playClick, playCoin, playDelete, playDownload, playEightBit, playError, playInfo, playMessage, playNotification, playPolice, playSuccess, playToggle, playUpload, playWarning, registerSound, semitonesToMultiplier, setAudioContext };
436
804
  //# sourceMappingURL=index.js.map
437
805
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.ts","../src/synth.ts","../src/sounds/success.ts","../src/sounds/error.ts","../src/sounds/warning.ts","../src/sounds/notification.ts","../src/sounds/click.ts","../src/sounds/info.ts","../src/index.ts"],"names":["VARIANTS"],"mappings":";AAIA,IAAI,IAAA,GAA4B,IAAA;AAOhC,eAAsB,eAAA,GAAyC;AAC7D,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,GAAO,IAAI,YAAA,EAAa;AAAA,EAC1B;AAEA,EAAA,IAAI,IAAA,CAAK,UAAU,WAAA,EAAa;AAC9B,IAAA,MAAM,KAAK,MAAA,EAAO;AAAA,EACpB;AAEA,EAAA,OAAO,IAAA;AACT;AAkBA,eAAsB,iBAAA,GAAmC;AACvD,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,IAAA,GAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,gBAAgB,GAAA,EAAyB;AACvD,EAAA,IAAA,GAAO,GAAA;AACT;;;AC3CA,IAAM,gBAAA,GAA6B;AAAA,EACjC,MAAA,EAAQ,IAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,OAAA,EAAS,GAAA;AAAA,EACT,OAAA,EAAS,IAAA;AAAA,EACT,IAAA,EAAM;AACR,CAAA;AAMO,SAAS,sBAAsB,SAAA,EAA2B;AAC/D,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,GAAY,EAAE,CAAA;AACnC;AAMA,SAAS,YAAA,CACP,GAAA,EACA,IAAA,EACA,UAAA,EACA,iBACA,UAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAgB;AAAA,IACpB,GAAG,gBAAA;AAAA,IACH,GAAG,IAAA,CAAK;AAAA,GACV;AAEA,EAAA,MAAM,EAAA,GAAK,aAAa,IAAA,CAAK,OAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,IAAQ,CAAA;AAC9B,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,MAAA;AACpC,EAAA,MAAM,IAAA,GAAO,KAAK,SAAA,GAAY,eAAA;AAG9B,EAAA,MAAM,QAAA,GAAW,IAAI,UAAA,EAAW;AAChC,EAAA,QAAA,CAAS,QAAQ,UAAU,CAAA;AAC3B,EAAA,QAAA,CAAS,IAAA,CAAK,cAAA,CAAe,CAAA,EAAG,EAAE,CAAA;AAGlC,EAAA,QAAA,CAAS,IAAA,CAAK,uBAAA,CAAwB,QAAA,EAAU,EAAA,GAAK,IAAI,MAAM,CAAA;AAG/D,EAAA,MAAM,OAAA,GAAU,EAAA,GAAK,GAAA,CAAI,MAAA,IAAU,IAAI,IAAA,IAAQ,CAAA,CAAA;AAC/C,EAAA,QAAA,CAAS,IAAA,CAAK,cAAA,CAAe,QAAA,EAAU,OAAO,CAAA;AAG9C,EAAA,QAAA,CAAS,IAAA,CAAK,uBAAA;AAAA,IACZ,WAAW,GAAA,CAAI,OAAA;AAAA,IACf,UAAU,GAAA,CAAI;AAAA,GAChB;AAGA,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,CAAK,QAAA;AAC1B,EAAA,QAAA,CAAS,IAAA,CAAK,cAAA,CAAe,QAAA,GAAW,GAAA,CAAI,SAAS,OAAO,CAAA;AAG5D,EAAA,QAAA,CAAS,IAAA,CAAK,uBAAA,CAAwB,CAAA,EAAG,OAAA,GAAU,IAAI,OAAO,CAAA;AAG9D,EAAA,MAAM,GAAA,GAAM,IAAI,gBAAA,EAAiB;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,SAAA;AACX,EAAA,GAAA,CAAI,SAAA,CAAU,cAAA,CAAe,IAAA,EAAM,EAAE,CAAA;AACrC,EAAA,GAAA,CAAI,QAAQ,QAAQ,CAAA;AACpB,EAAA,GAAA,CAAI,MAAM,EAAE,CAAA;AACZ,EAAA,GAAA,CAAI,IAAA,CAAK,OAAA,GAAU,GAAA,CAAI,OAAA,GAAU,IAAI,CAAA;AAErC,EAAA,OAAO,UAAU,GAAA,CAAI,OAAA;AACvB;AAWO,SAAS,SAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,gBACA,OAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,EAAW;AAClC,EAAA,UAAA,CAAW,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA,EAAG,GAAA,CAAI,WAAW,CAAA;AAChF,EAAA,UAAA,CAAW,OAAA,CAAQ,IAAI,WAAW,CAAA;AAElC,EAAA,MAAM,eAAA,GAAkB,sBAAsB,cAAc,CAAA;AAC5D,EAAA,MAAM,aAAa,GAAA,CAAI,WAAA;AAEvB,EAAA,IAAI,SAAA,GAAY,UAAA;AAEhB,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,MAAM,MAAM,YAAA,CAAa,GAAA,EAAK,IAAA,EAAM,UAAA,EAAY,iBAAiB,UAAU,CAAA;AAC3E,IAAA,IAAI,GAAA,GAAM,WAAW,SAAA,GAAY,GAAA;AAAA,EACnC;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,EAAiB;AACtC,IAAA,MAAM,UAAA,GAAa,IAAI,UAAA,EAAW;AAClC,IAAA,UAAA,CAAW,IAAA,CAAK,cAAA,CAAe,CAAA,EAAG,UAAU,CAAA;AAC5C,IAAA,QAAA,CAAS,QAAQ,UAAU,CAAA;AAC3B,IAAA,UAAA,CAAW,OAAA,CAAQ,IAAI,WAAW,CAAA;AAClC,IAAA,QAAA,CAAS,MAAM,UAAU,CAAA;AACzB,IAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AACvB,IAAA,QAAA,CAAS,OAAA,GAAU,OAAA;AAAA,EACrB;AACF;;;ACnHA,IAAM,QAAA,GAA8C;AAAA,EAClD,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,SAAS,CAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA,MAChF,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,GAAA,EAAK,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA;AAAI;AAClF,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,CAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA,MACjF,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA,MACjF,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAM,SAAS,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA;AAAI;AACnF,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,GAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,EAAE,SAAA,EAAW,GAAA,EAAQ,QAAA,EAAU,GAAA,EAAM,SAAS,CAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA,MACjF,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,GAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA,MACjF,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA,MACjF,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA;AAAI;AACnF;AAEJ,CAAA;AAEO,SAAS,aAAA,CACd,SACA,cAAA,EACa;AAGb,EAAA,OAAO,SAAS,OAAO,CAAA;AACzB;;;ACrCA,IAAMA,SAAAA,GAA8C;AAAA,EAClD,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL;AAAA,QAAE,SAAA,EAAW,GAAA;AAAA,QAAK,QAAA,EAAU,GAAA;AAAA,QAAM,OAAA,EAAS,CAAA;AAAA,QAAM,SAAA,EAAW,QAAA;AAAA,QAAU,IAAA,EAAM,GAAA;AAAA,QAC1E,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAO,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,IAAA;AAAK,OAAE;AAAA,MACxE;AAAA,QAAE,SAAA,EAAW,GAAA;AAAA,QAAK,QAAA,EAAU,IAAA;AAAA,QAAM,OAAA,EAAS,GAAA;AAAA,QAAM,SAAA,EAAW,QAAA;AAAA,QAAU,IAAA,EAAM,GAAA;AAAA,QAC1E,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAO,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,IAAA;AAAK;AAAE;AAC1E,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,GAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL;AAAA,QAAE,SAAA,EAAW,GAAA;AAAA,QAAK,QAAA,EAAU,IAAA;AAAA,QAAM,OAAA,EAAS,CAAA;AAAA,QAAM,SAAA,EAAW,UAAA;AAAA,QAAY,IAAA,EAAM,GAAA;AAAA,QAC5E,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAO,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,IAAA;AAAK,OAAE;AAAA,MACxE;AAAA,QAAE,SAAA,EAAW,GAAA;AAAA,QAAK,QAAA,EAAU,IAAA;AAAA,QAAM,OAAA,EAAS,IAAA;AAAA,QAAM,SAAA,EAAW,UAAA;AAAA,QAAY,IAAA,EAAM,IAAA;AAAA,QAC5E,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAO,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,IAAA;AAAK,OAAE;AAAA,MACxE;AAAA,QAAE,SAAA,EAAW,GAAA;AAAA,QAAK,QAAA,EAAU,GAAA;AAAA,QAAM,OAAA,EAAS,IAAA;AAAA,QAAM,SAAA,EAAW,UAAA;AAAA,QAAY,IAAA,EAAM,IAAA;AAAA,QAC5E,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAO,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,IAAA;AAAK;AAAE;AAC1E,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL;AAAA,QAAE,SAAA,EAAW,GAAA;AAAA,QAAK,QAAA,EAAU,IAAA;AAAA,QAAM,OAAA,EAAS,CAAA;AAAA,QAAM,SAAA,EAAW,UAAA;AAAA,QAAY,IAAA,EAAM,GAAA;AAAA,QAC5E,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAO,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,GAAA;AAAI,OAAE;AAAA,MACvE;AAAA,QAAE,SAAA,EAAW,GAAA;AAAA,QAAK,QAAA,EAAU,GAAA;AAAA,QAAM,OAAA,EAAS,IAAA;AAAA,QAAM,SAAA,EAAW,UAAA;AAAA,QAAY,IAAA,EAAM,GAAA;AAAA,QAC5E,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAO,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,GAAA;AAAI,OAAE;AAAA,MACvE;AAAA,QAAE,SAAA,EAAW,GAAA;AAAA,QAAK,QAAA,EAAU,IAAA;AAAA,QAAM,OAAA,EAAS,IAAA;AAAA,QAAM,SAAA,EAAW,UAAA;AAAA,QAAY,IAAA,EAAM,IAAA;AAAA,QAC5E,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAO,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,GAAA;AAAI,OAAE;AAAA,MACvE;AAAA,QAAE,SAAA,EAAW,GAAA;AAAA,QAAK,QAAA,EAAU,IAAA;AAAA,QAAM,OAAA,EAAS,GAAA;AAAA,QAAM,SAAA,EAAW,UAAA;AAAA,QAAY,IAAA,EAAM,IAAA;AAAA,QAC5E,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAO,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,IAAA;AAAK;AAAE;AAC1E;AAEJ,CAAA;AAEO,SAAS,WAAA,CACd,SACA,cAAA,EACa;AAEb,EAAA,OAAOA,UAAS,OAAO,CAAA;AACzB;;;AC7CA,IAAMA,SAAAA,GAA8C;AAAA,EAClD,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAM,SAAS,CAAA,EAAM,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,GAAA,EAAI;AAAA,MACrF,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,GAAA,EAAM,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,IAAA;AAAK;AACxF,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,GAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,CAAA,EAAM,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,IAAA,EAAK;AAAA,MACtF,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,IAAA,EAAK;AAAA,MACtF,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAM,SAAS,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,IAAA;AAAK;AACxF,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,GAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,CAAA,EAAM,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,GAAA,EAAI;AAAA,MACrF,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,GAAA,EAAI;AAAA,MACrF,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,GAAA,EAAM,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,IAAA,EAAK;AAAA,MACtF,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,IAAA;AAAK;AACxF;AAEJ,CAAA;AAEO,SAAS,aAAA,CACd,SACA,cAAA,EACa;AAEb,EAAA,OAAOA,UAAS,OAAO,CAAA;AACzB;;;ACpCA,IAAMA,SAAAA,GAA8C;AAAA,EAClD,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,EAAE,SAAA,EAAW,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,SAAS,CAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA,MAC9E,EAAE,SAAA,EAAW,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,SAAS,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,IAAA;AAAK;AACjF,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,cAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,EAAE,SAAA,EAAW,GAAA,EAAK,QAAA,EAAU,GAAA,EAAM,SAAS,CAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,MAC/E,EAAE,SAAA,EAAW,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,SAAS,GAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA;AAAI;AAChF,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,cAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,CAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA,MACjF,EAAE,SAAA,EAAW,GAAA,EAAQ,QAAA,EAAU,GAAA,EAAM,SAAS,GAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,MAClF,EAAE,SAAA,EAAW,GAAA,EAAQ,QAAA,EAAU,GAAA,EAAM,SAAS,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAA;AAAI;AACnF;AAEJ,CAAA;AAEO,SAAS,kBAAA,CACd,SACA,cAAA,EACa;AAEb,EAAA,OAAOA,UAAS,OAAO,CAAA;AACzB;;;AClCA,IAAMA,SAAAA,GAA8C;AAAA,EAClD,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL;AAAA,QACE,SAAA,EAAW,IAAA;AAAA,QACX,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW,MAAA;AAAA,QACX,IAAA,EAAM,GAAA;AAAA,QACN,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAO,OAAO,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,IAAA;AAAK;AACrE;AACF,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL;AAAA,QACE,SAAA,EAAW,GAAA;AAAA,QACX,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW,MAAA;AAAA,QACX,IAAA,EAAM,IAAA;AAAA,QACN,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAO,OAAO,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,KAAA;AAAM;AACrE;AACF,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL;AAAA,QACE,SAAA,EAAW,GAAA;AAAA,QACX,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW,UAAA;AAAA,QACX,IAAA,EAAM,GAAA;AAAA,QACN,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAO,OAAO,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,KAAA;AAAM;AACrE;AACF;AAEJ,CAAA;AAEO,SAAS,WAAA,CACd,SACA,cAAA,EACa;AAEb,EAAA,OAAOA,UAAS,OAAO,CAAA;AACzB;;;ACnDA,IAAMA,SAAAA,GAA8C;AAAA,EAClD,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,GAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL;AAAA,QACE,SAAA,EAAW,MAAA;AAAA;AAAA,QACX,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW,MAAA;AAAA,QACX,IAAA,EAAM,IAAA;AAAA,QACN,QAAA,EAAU,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,GAAA;AAAI;AACrE;AACF,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL;AAAA,QACE,SAAA,EAAW,MAAA;AAAA,QACX,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW,MAAA;AAAA,QACX,IAAA,EAAM,IAAA;AAAA,QACN,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,IAAA;AAAK;AACrE;AACF,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL;AAAA,QACE,SAAA,EAAW,MAAA;AAAA;AAAA,QACX,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW,MAAA;AAAA,QACX,IAAA,EAAM,GAAA;AAAA,QACN,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,GAAA;AAAI,OACpE;AAAA,MACA;AAAA,QACE,SAAA,EAAW,MAAA;AAAA;AAAA,QACX,QAAA,EAAU,GAAA;AAAA,QACV,OAAA,EAAS,GAAA;AAAA,QACT,SAAA,EAAW,MAAA;AAAA,QACX,IAAA,EAAM,IAAA;AAAA,QACN,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,IAAA;AAAK;AACrE;AACF;AAEJ,CAAA;AAEO,SAAS,UAAA,CACd,SACA,cAAA,EACa;AAEb,EAAA,OAAOA,UAAS,OAAO,CAAA;AACzB;;;AChCA,eAAe,IAAA,CACb,MAAA,EACA,IAAA,GAAqB,EAAC,EACP;AACf,EAAA,MAAM,EAAE,MAAA,GAAS,GAAA,EAAK,QAAQ,CAAA,EAAG,YAAA,EAAc,SAAQ,GAAI,IAAA;AAC3D,EAAA,MAAM,GAAA,GAAM,YAAA,IAAiB,MAAM,eAAA,EAAgB;AACnD,EAAA,SAAA,CAAU,GAAA,EAAK,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AAC/C;AAOA,eAAsB,WAAA,CAAY,IAAA,GAAqB,EAAC,EAAkB;AACxE,EAAA,OAAO,IAAA,CAAK,cAAc,IAAA,CAAK,OAAA,IAAW,UAAU,IAAA,CAAK,KAAA,IAAS,CAAC,CAAA,EAAG,IAAI,CAAA;AAC5E;AAGA,eAAsB,SAAA,CAAU,IAAA,GAAqB,EAAC,EAAkB;AACtE,EAAA,OAAO,IAAA,CAAK,YAAY,IAAA,CAAK,OAAA,IAAW,UAAU,IAAA,CAAK,KAAA,IAAS,CAAC,CAAA,EAAG,IAAI,CAAA;AAC1E;AAGA,eAAsB,WAAA,CAAY,IAAA,GAAqB,EAAC,EAAkB;AACxE,EAAA,OAAO,IAAA,CAAK,cAAc,IAAA,CAAK,OAAA,IAAW,UAAU,IAAA,CAAK,KAAA,IAAS,CAAC,CAAA,EAAG,IAAI,CAAA;AAC5E;AAGA,eAAsB,gBAAA,CAAiB,IAAA,GAAqB,EAAC,EAAkB;AAC7E,EAAA,OAAO,IAAA;AAAA,IACL,mBAAmB,IAAA,CAAK,OAAA,IAAW,QAAA,EAAU,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,IAC5D;AAAA,GACF;AACF;AAGA,eAAsB,SAAA,CAAU,IAAA,GAAqB,EAAC,EAAkB;AACtE,EAAA,OAAO,IAAA,CAAK,YAAY,IAAA,CAAK,OAAA,IAAW,SAAS,IAAA,CAAK,KAAA,IAAS,CAAC,CAAA,EAAG,IAAI,CAAA;AACzE;AAGA,eAAsB,QAAA,CAAS,IAAA,GAAqB,EAAC,EAAkB;AACrE,EAAA,OAAO,IAAA,CAAK,WAAW,IAAA,CAAK,OAAA,IAAW,UAAU,IAAA,CAAK,KAAA,IAAS,CAAC,CAAA,EAAG,IAAI,CAAA;AACzE;AAMA,IAAM,IAAA,GAAO;AAAA,EACX,OAAA,EAAS,aAAA;AAAA,EACT,KAAA,EAAO,WAAA;AAAA,EACP,OAAA,EAAS,aAAA;AAAA,EACT,YAAA,EAAc,kBAAA;AAAA,EACd,KAAA,EAAO,WAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AAWA,eAAsB,MAAA,CACpB,IAAA,EACA,IAAA,GAAqB,EAAC,EACP;AACf,EAAA,MAAM,MAAA,GAAS,KAAK,IAAI,CAAA;AACxB,EAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,OAAA,IAAW,UAAU,IAAA,CAAK,KAAA,IAAS,CAAC,CAAA,EAAG,IAAI,CAAA;AACrE;AAiBO,SAAS,aAAA,CAAc,MAAc,MAAA,EAA2B;AACrE,EAAC,IAAA,CAAqC,IAAI,CAAA,GAAI,MAAA;AAChD","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// earcon — AudioContext singleton with autoplay-policy handling\n// ---------------------------------------------------------------------------\n\nlet _ctx: AudioContext | null = null;\n\n/**\n * Returns the shared AudioContext, creating it on first call.\n * Automatically resumes a suspended context (needed after browser\n * autoplay-policy restrictions kick in before a user gesture).\n */\nexport async function getAudioContext(): Promise<AudioContext> {\n if (!_ctx) {\n _ctx = new AudioContext();\n }\n\n if (_ctx.state === \"suspended\") {\n await _ctx.resume();\n }\n\n return _ctx;\n}\n\n/**\n * Returns the shared AudioContext synchronously.\n * The context may still be suspended — callers that need it resumed\n * should use {@link getAudioContext} instead.\n */\nexport function getAudioContextSync(): AudioContext {\n if (!_ctx) {\n _ctx = new AudioContext();\n }\n return _ctx;\n}\n\n/**\n * Closes and discards the shared AudioContext.\n * Useful in tests or when tearing down an SPA.\n */\nexport async function closeAudioContext(): Promise<void> {\n if (_ctx) {\n await _ctx.close();\n _ctx = null;\n }\n}\n\n/**\n * Replace the internal singleton — useful in tests to inject a mock.\n */\nexport function setAudioContext(ctx: AudioContext): void {\n _ctx = ctx;\n}\n","// ---------------------------------------------------------------------------\n// earcon — synthesis engine\n// Schedules NoteEvents on a given AudioContext using oscillator nodes\n// and a GainNode-based ADSR envelope.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, Envelope, NoteEvent } from \"./types.js\";\n\nconst DEFAULT_ENVELOPE: Envelope = {\n attack: 0.01,\n decay: 0.05,\n sustain: 0.7,\n release: 0.08,\n hold: 0,\n};\n\n/**\n * Converts a semitone offset to a frequency multiplier.\n * e.g. +12 semitones → ×2 (one octave up)\n */\nexport function semitonesToMultiplier(semitones: number): number {\n return Math.pow(2, semitones / 12);\n}\n\n/**\n * Schedules a single NoteEvent on the provided AudioContext.\n * Returns the scheduled end time (AudioContext.currentTime + startAt + duration + release).\n */\nfunction scheduleNote(\n ctx: AudioContext,\n note: NoteEvent,\n masterGain: GainNode,\n pitchMultiplier: number,\n timeOffset: number\n): number {\n const env: Envelope = {\n ...DEFAULT_ENVELOPE,\n ...note.envelope,\n };\n\n const t0 = timeOffset + note.startAt;\n const noteGain = note.gain ?? 1;\n const waveShape = note.waveShape ?? \"sine\";\n const freq = note.frequency * pitchMultiplier;\n\n // Per-note gain envelope node\n const gainNode = ctx.createGain();\n gainNode.connect(masterGain);\n gainNode.gain.setValueAtTime(0, t0);\n\n // Attack\n gainNode.gain.linearRampToValueAtTime(noteGain, t0 + env.attack);\n\n // Hold (optional flat segment)\n const holdEnd = t0 + env.attack + (env.hold ?? 0);\n gainNode.gain.setValueAtTime(noteGain, holdEnd);\n\n // Decay → sustain level\n gainNode.gain.linearRampToValueAtTime(\n noteGain * env.sustain,\n holdEnd + env.decay\n );\n\n // Sustain until note end\n const noteEnd = t0 + note.duration;\n gainNode.gain.setValueAtTime(noteGain * env.sustain, noteEnd);\n\n // Release\n gainNode.gain.linearRampToValueAtTime(0, noteEnd + env.release);\n\n // Oscillator\n const osc = ctx.createOscillator();\n osc.type = waveShape;\n osc.frequency.setValueAtTime(freq, t0);\n osc.connect(gainNode);\n osc.start(t0);\n osc.stop(noteEnd + env.release + 0.01); // tiny buffer to avoid click\n\n return noteEnd + env.release;\n}\n\n/**\n * Plays an {@link EarconSound} on the provided AudioContext.\n *\n * @param ctx - AudioContext to schedule on\n * @param sound - The sound descriptor to play\n * @param volume - Master volume 0–1\n * @param pitchSemitones - Semitone offset applied to all frequencies\n * @param onEnded - Optional callback when the sound finishes\n */\nexport function playSound(\n ctx: AudioContext,\n sound: EarconSound,\n volume: number,\n pitchSemitones: number,\n onEnded?: () => void\n): void {\n const masterGain = ctx.createGain();\n masterGain.gain.setValueAtTime(Math.max(0, Math.min(1, volume)), ctx.currentTime);\n masterGain.connect(ctx.destination);\n\n const pitchMultiplier = semitonesToMultiplier(pitchSemitones);\n const timeOffset = ctx.currentTime;\n\n let latestEnd = timeOffset;\n\n for (const note of sound.notes) {\n const end = scheduleNote(ctx, note, masterGain, pitchMultiplier, timeOffset);\n if (end > latestEnd) latestEnd = end;\n }\n\n // Schedule onEnded callback via a silent OscillatorNode that stops at latestEnd\n if (onEnded) {\n const sentinel = ctx.createOscillator();\n const silentGain = ctx.createGain();\n silentGain.gain.setValueAtTime(0, timeOffset);\n sentinel.connect(silentGain);\n silentGain.connect(ctx.destination);\n sentinel.start(timeOffset);\n sentinel.stop(latestEnd);\n sentinel.onended = onEnded;\n }\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"success\" preset\n// A short ascending two-tone chime (major third → fifth), bright and clean.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"success\",\n duration: 0.25,\n notes: [\n { frequency: 523.25, duration: 0.1, startAt: 0, waveShape: \"sine\", gain: 0.8 },\n { frequency: 783.99, duration: 0.15, startAt: 0.1, waveShape: \"sine\", gain: 0.9 },\n ],\n },\n medium: {\n name: \"success\",\n duration: 0.45,\n notes: [\n { frequency: 523.25, duration: 0.12, startAt: 0, waveShape: \"sine\", gain: 0.7 },\n { frequency: 659.25, duration: 0.12, startAt: 0.12, waveShape: \"sine\", gain: 0.8 },\n { frequency: 783.99, duration: 0.2, startAt: 0.24, waveShape: \"sine\", gain: 0.9 },\n ],\n },\n long: {\n name: \"success\",\n duration: 0.7,\n notes: [\n { frequency: 392.00, duration: 0.1, startAt: 0, waveShape: \"sine\", gain: 0.6 },\n { frequency: 523.25, duration: 0.12, startAt: 0.1, waveShape: \"sine\", gain: 0.7 },\n { frequency: 659.25, duration: 0.12, startAt: 0.22, waveShape: \"sine\", gain: 0.8 },\n { frequency: 783.99, duration: 0.25, startAt: 0.34, waveShape: \"sine\", gain: 0.9 },\n ],\n },\n};\n\nexport function successPreset(\n variant: SoundVariant,\n pitchSemitones: number\n): EarconSound {\n // pitchSemitones is applied by the synth engine — just return the descriptor\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"error\" preset\n// Descending dissonant tones (tritone), harsh and attention-grabbing.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"error\",\n duration: 0.25,\n notes: [\n { frequency: 440, duration: 0.1, startAt: 0, waveShape: \"square\", gain: 0.5,\n envelope: { attack: 0.005, decay: 0.04, sustain: 0.6, release: 0.06 } },\n { frequency: 311, duration: 0.15, startAt: 0.1, waveShape: \"square\", gain: 0.6,\n envelope: { attack: 0.005, decay: 0.04, sustain: 0.6, release: 0.06 } },\n ],\n },\n medium: {\n name: \"error\",\n duration: 0.5,\n notes: [\n { frequency: 440, duration: 0.12, startAt: 0, waveShape: \"sawtooth\", gain: 0.4,\n envelope: { attack: 0.005, decay: 0.06, sustain: 0.5, release: 0.08 } },\n { frequency: 392, duration: 0.12, startAt: 0.13, waveShape: \"sawtooth\", gain: 0.45,\n envelope: { attack: 0.005, decay: 0.06, sustain: 0.5, release: 0.08 } },\n { frequency: 311, duration: 0.2, startAt: 0.26, waveShape: \"sawtooth\", gain: 0.55,\n envelope: { attack: 0.005, decay: 0.06, sustain: 0.5, release: 0.12 } },\n ],\n },\n long: {\n name: \"error\",\n duration: 0.75,\n notes: [\n { frequency: 440, duration: 0.12, startAt: 0, waveShape: \"sawtooth\", gain: 0.4,\n envelope: { attack: 0.005, decay: 0.07, sustain: 0.5, release: 0.1 } },\n { frequency: 415, duration: 0.1, startAt: 0.14, waveShape: \"sawtooth\", gain: 0.4,\n envelope: { attack: 0.005, decay: 0.07, sustain: 0.5, release: 0.1 } },\n { frequency: 370, duration: 0.12, startAt: 0.26, waveShape: \"sawtooth\", gain: 0.45,\n envelope: { attack: 0.005, decay: 0.07, sustain: 0.5, release: 0.1 } },\n { frequency: 311, duration: 0.25, startAt: 0.4, waveShape: \"sawtooth\", gain: 0.55,\n envelope: { attack: 0.005, decay: 0.08, sustain: 0.5, release: 0.15 } },\n ],\n },\n};\n\nexport function errorPreset(\n variant: SoundVariant,\n pitchSemitones: number\n): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"warning\" preset\n// A flat-then-descending minor second — cautious, not alarming.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"warning\",\n duration: 0.28,\n notes: [\n { frequency: 587.33, duration: 0.1, startAt: 0, waveShape: \"triangle\", gain: 0.7 },\n { frequency: 523.25, duration: 0.18, startAt: 0.1, waveShape: \"triangle\", gain: 0.75 },\n ],\n },\n medium: {\n name: \"warning\",\n duration: 0.5,\n notes: [\n { frequency: 587.33, duration: 0.12, startAt: 0, waveShape: \"triangle\", gain: 0.65 },\n { frequency: 587.33, duration: 0.12, startAt: 0.14, waveShape: \"triangle\", gain: 0.65 },\n { frequency: 493.88, duration: 0.2, startAt: 0.28, waveShape: \"triangle\", gain: 0.75 },\n ],\n },\n long: {\n name: \"warning\",\n duration: 0.8,\n notes: [\n { frequency: 587.33, duration: 0.12, startAt: 0, waveShape: \"triangle\", gain: 0.6 },\n { frequency: 587.33, duration: 0.12, startAt: 0.15, waveShape: \"triangle\", gain: 0.6 },\n { frequency: 554.37, duration: 0.12, startAt: 0.3, waveShape: \"triangle\", gain: 0.65 },\n { frequency: 493.88, duration: 0.25, startAt: 0.45, waveShape: \"triangle\", gain: 0.75 },\n ],\n },\n};\n\nexport function warningPreset(\n variant: SoundVariant,\n pitchSemitones: number\n): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"notification\" preset\n// Two clean sine tones — a gentle, neutral \"ding\" suitable for messages.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"notification\",\n duration: 0.22,\n notes: [\n { frequency: 880, duration: 0.08, startAt: 0, waveShape: \"sine\", gain: 0.6 },\n { frequency: 660, duration: 0.14, startAt: 0.08, waveShape: \"sine\", gain: 0.65 },\n ],\n },\n medium: {\n name: \"notification\",\n duration: 0.38,\n notes: [\n { frequency: 880, duration: 0.1, startAt: 0, waveShape: \"sine\", gain: 0.55 },\n { frequency: 660, duration: 0.28, startAt: 0.1, waveShape: \"sine\", gain: 0.6 },\n ],\n },\n long: {\n name: \"notification\",\n duration: 0.55,\n notes: [\n { frequency: 1046.5, duration: 0.08, startAt: 0, waveShape: \"sine\", gain: 0.5 },\n { frequency: 880, duration: 0.1, startAt: 0.1, waveShape: \"sine\", gain: 0.55 },\n { frequency: 660, duration: 0.3, startAt: 0.22, waveShape: \"sine\", gain: 0.6 },\n ],\n },\n};\n\nexport function notificationPreset(\n variant: SoundVariant,\n pitchSemitones: number\n): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"click\" preset\n// A very short transient — simulates a tactile UI button press/toggle.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"click\",\n duration: 0.04,\n notes: [\n {\n frequency: 1200,\n duration: 0.03,\n startAt: 0,\n waveShape: \"sine\",\n gain: 0.5,\n envelope: { attack: 0.002, decay: 0.015, sustain: 0, release: 0.01 },\n },\n ],\n },\n medium: {\n name: \"click\",\n duration: 0.07,\n notes: [\n {\n frequency: 900,\n duration: 0.05,\n startAt: 0,\n waveShape: \"sine\",\n gain: 0.55,\n envelope: { attack: 0.002, decay: 0.03, sustain: 0, release: 0.015 },\n },\n ],\n },\n long: {\n name: \"click\",\n duration: 0.12,\n notes: [\n {\n frequency: 700,\n duration: 0.08,\n startAt: 0,\n waveShape: \"triangle\",\n gain: 0.6,\n envelope: { attack: 0.002, decay: 0.05, sustain: 0, release: 0.025 },\n },\n ],\n },\n};\n\nexport function clickPreset(\n variant: SoundVariant,\n pitchSemitones: number\n): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"info\" preset\n// A neutral single soft tone — informational, non-intrusive.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"info\",\n duration: 0.2,\n notes: [\n {\n frequency: 698.46, // F5\n duration: 0.18,\n startAt: 0,\n waveShape: \"sine\",\n gain: 0.55,\n envelope: { attack: 0.015, decay: 0.04, sustain: 0.5, release: 0.1 },\n },\n ],\n },\n medium: {\n name: \"info\",\n duration: 0.35,\n notes: [\n {\n frequency: 698.46,\n duration: 0.32,\n startAt: 0,\n waveShape: \"sine\",\n gain: 0.55,\n envelope: { attack: 0.02, decay: 0.05, sustain: 0.5, release: 0.12 },\n },\n ],\n },\n long: {\n name: \"info\",\n duration: 0.55,\n notes: [\n {\n frequency: 587.33, // D5\n duration: 0.18,\n startAt: 0,\n waveShape: \"sine\",\n gain: 0.5,\n envelope: { attack: 0.02, decay: 0.05, sustain: 0.4, release: 0.1 },\n },\n {\n frequency: 698.46, // F5\n duration: 0.3,\n startAt: 0.2,\n waveShape: \"sine\",\n gain: 0.55,\n envelope: { attack: 0.02, decay: 0.06, sustain: 0.5, release: 0.12 },\n },\n ],\n },\n};\n\nexport function infoPreset(\n variant: SoundVariant,\n pitchSemitones: number\n): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — public API\n// ---------------------------------------------------------------------------\n\nexport type {\n WaveShape,\n SoundVariant,\n SoundOptions,\n Envelope,\n NoteEvent,\n EarconSound,\n SoundPreset,\n} from \"./types.js\";\n\nexport { closeAudioContext, setAudioContext } from \"./context.js\";\nexport { semitonesToMultiplier } from \"./synth.js\";\n\nimport { getAudioContext } from \"./context.js\";\nimport { playSound } from \"./synth.js\";\nimport type { SoundOptions } from \"./types.js\";\n\nimport {\n successPreset,\n errorPreset,\n warningPreset,\n notificationPreset,\n clickPreset,\n infoPreset,\n} from \"./sounds/index.js\";\n\n// ---------------------------------------------------------------------------\n// Internal helper — resolves options and dispatches to the synth engine\n// ---------------------------------------------------------------------------\n\nasync function play(\n preset: ReturnType<typeof successPreset>,\n opts: SoundOptions = {}\n): Promise<void> {\n const { volume = 0.5, pitch = 0, audioContext, onEnded } = opts;\n const ctx = audioContext ?? (await getAudioContext());\n playSound(ctx, preset, volume, pitch, onEnded);\n}\n\n// ---------------------------------------------------------------------------\n// Named play functions — tree-shakable, one per sound type\n// ---------------------------------------------------------------------------\n\n/** Play a success / confirmation sound */\nexport async function playSuccess(opts: SoundOptions = {}): Promise<void> {\n return play(successPreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/** Play an error sound */\nexport async function playError(opts: SoundOptions = {}): Promise<void> {\n return play(errorPreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/** Play a warning sound */\nexport async function playWarning(opts: SoundOptions = {}): Promise<void> {\n return play(warningPreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/** Play a notification / message sound */\nexport async function playNotification(opts: SoundOptions = {}): Promise<void> {\n return play(\n notificationPreset(opts.variant ?? \"medium\", opts.pitch ?? 0),\n opts\n );\n}\n\n/** Play a UI click / toggle transient */\nexport async function playClick(opts: SoundOptions = {}): Promise<void> {\n return play(clickPreset(opts.variant ?? \"short\", opts.pitch ?? 0), opts);\n}\n\n/** Play an informational / neutral tone */\nexport async function playInfo(opts: SoundOptions = {}): Promise<void> {\n return play(infoPreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n// ---------------------------------------------------------------------------\n// Sound bank — generic play-by-name API\n// ---------------------------------------------------------------------------\n\nconst BANK = {\n success: successPreset,\n error: errorPreset,\n warning: warningPreset,\n notification: notificationPreset,\n click: clickPreset,\n info: infoPreset,\n} as const;\n\nexport type SoundName = keyof typeof BANK;\n\n/**\n * Play any registered sound by name.\n *\n * @example\n * await earcon(\"success\");\n * await earcon(\"error\", { variant: \"long\", volume: 0.8 });\n */\nexport async function earcon(\n name: SoundName,\n opts: SoundOptions = {}\n): Promise<void> {\n const preset = BANK[name];\n return play(preset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/**\n * Register a custom sound under a new name so it can be played via {@link earcon}.\n *\n * @example\n * import type { SoundPreset } from \"earcons\";\n *\n * const mySound: SoundPreset = (variant, pitch) => ({\n * name: \"mySound\",\n * duration: 0.3,\n * notes: [{ frequency: 440, duration: 0.3, startAt: 0 }],\n * });\n *\n * registerSound(\"mySound\", mySound);\n * await earcon(\"mySound\");\n */\nexport function registerSound(name: string, preset: SoundPreset): void {\n (BANK as Record<string, SoundPreset>)[name] = preset;\n}\n\nimport type { SoundPreset } from \"./types.js\";\n"]}
1
+ {"version":3,"sources":["../src/context.ts","../src/synth.ts","../src/sounds/success.ts","../src/sounds/error.ts","../src/sounds/warning.ts","../src/sounds/notification.ts","../src/sounds/click.ts","../src/sounds/info.ts","../src/sounds/toggle.ts","../src/sounds/delete.ts","../src/sounds/message.ts","../src/sounds/upload.ts","../src/sounds/download.ts","../src/sounds/eightBit.ts","../src/sounds/police.ts","../src/sounds/coin.ts","../src/sounds/boing.ts","../src/index.ts"],"names":["VARIANTS","ENV"],"mappings":"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","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// earcon — AudioContext singleton with autoplay-policy handling\n// ---------------------------------------------------------------------------\n\nlet _ctx: AudioContext | null = null;\n\n/**\n * Returns the shared AudioContext, creating it on first call.\n * Automatically resumes a suspended context (needed after browser\n * autoplay-policy restrictions kick in before a user gesture).\n */\nexport async function getAudioContext(): Promise<AudioContext> {\n if (!_ctx) {\n _ctx = new AudioContext();\n }\n\n if (_ctx.state === \"suspended\") {\n await _ctx.resume();\n }\n\n return _ctx;\n}\n\n/**\n * Returns the shared AudioContext synchronously.\n * The context may still be suspended — callers that need it resumed\n * should use {@link getAudioContext} instead.\n */\nexport function getAudioContextSync(): AudioContext {\n if (!_ctx) {\n _ctx = new AudioContext();\n }\n return _ctx;\n}\n\n/**\n * Closes and discards the shared AudioContext.\n * Useful in tests or when tearing down an SPA.\n */\nexport async function closeAudioContext(): Promise<void> {\n if (_ctx) {\n await _ctx.close();\n _ctx = null;\n }\n}\n\n/**\n * Replace the internal singleton — useful in tests to inject a mock.\n */\nexport function setAudioContext(ctx: AudioContext): void {\n _ctx = ctx;\n}\n","// ---------------------------------------------------------------------------\n// earcon — synthesis engine\n// Schedules NoteEvents on a given AudioContext using oscillator nodes\n// and a GainNode-based ADSR envelope.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, Envelope, NoteEvent } from \"./types.js\";\n\nconst DEFAULT_ENVELOPE: Envelope = {\n attack: 0.01,\n decay: 0.05,\n sustain: 0.7,\n release: 0.08,\n hold: 0,\n};\n\n/**\n * Converts a semitone offset to a frequency multiplier.\n * e.g. +12 semitones → ×2 (one octave up)\n */\nexport function semitonesToMultiplier(semitones: number): number {\n return Math.pow(2, semitones / 12);\n}\n\n/**\n * Schedules a single NoteEvent on the provided AudioContext.\n * Returns the scheduled end time (AudioContext.currentTime + startAt + duration + release).\n */\nfunction scheduleNote(\n ctx: AudioContext,\n note: NoteEvent,\n masterGain: GainNode,\n pitchMultiplier: number,\n timeOffset: number\n): number {\n const env: Envelope = {\n ...DEFAULT_ENVELOPE,\n ...note.envelope,\n };\n\n const t0 = timeOffset + note.startAt;\n const noteGain = note.gain ?? 1;\n const waveShape = note.waveShape ?? \"sine\";\n const freq = note.frequency * pitchMultiplier;\n\n // Per-note gain envelope node\n const gainNode = ctx.createGain();\n gainNode.connect(masterGain);\n gainNode.gain.setValueAtTime(0, t0);\n\n // Attack\n gainNode.gain.linearRampToValueAtTime(noteGain, t0 + env.attack);\n\n // Hold (optional flat segment)\n const holdEnd = t0 + env.attack + (env.hold ?? 0);\n gainNode.gain.setValueAtTime(noteGain, holdEnd);\n\n // Decay → sustain level\n gainNode.gain.linearRampToValueAtTime(\n noteGain * env.sustain,\n holdEnd + env.decay\n );\n\n // Sustain until note end\n const noteEnd = t0 + note.duration;\n gainNode.gain.setValueAtTime(noteGain * env.sustain, noteEnd);\n\n // Release\n gainNode.gain.linearRampToValueAtTime(0, noteEnd + env.release);\n\n // Oscillator\n const osc = ctx.createOscillator();\n osc.type = waveShape;\n osc.frequency.setValueAtTime(freq, t0);\n osc.connect(gainNode);\n osc.start(t0);\n osc.stop(noteEnd + env.release + 0.01); // tiny buffer to avoid click\n\n return noteEnd + env.release;\n}\n\n/**\n * Plays an {@link EarconSound} on the provided AudioContext.\n *\n * @param ctx - AudioContext to schedule on\n * @param sound - The sound descriptor to play\n * @param volume - Master volume 0–1\n * @param pitchSemitones - Semitone offset applied to all frequencies\n * @param onEnded - Optional callback when the sound finishes\n */\nexport function playSound(\n ctx: AudioContext,\n sound: EarconSound,\n volume: number,\n pitchSemitones: number,\n onEnded?: () => void\n): void {\n const masterGain = ctx.createGain();\n masterGain.gain.setValueAtTime(Math.max(0, Math.min(1, volume)), ctx.currentTime);\n masterGain.connect(ctx.destination);\n\n const pitchMultiplier = semitonesToMultiplier(pitchSemitones);\n const timeOffset = ctx.currentTime;\n\n let latestEnd = timeOffset;\n\n for (const note of sound.notes) {\n const end = scheduleNote(ctx, note, masterGain, pitchMultiplier, timeOffset);\n if (end > latestEnd) latestEnd = end;\n }\n\n // Schedule onEnded callback via a silent OscillatorNode that stops at latestEnd\n if (onEnded) {\n const sentinel = ctx.createOscillator();\n const silentGain = ctx.createGain();\n silentGain.gain.setValueAtTime(0, timeOffset);\n sentinel.connect(silentGain);\n silentGain.connect(ctx.destination);\n sentinel.start(timeOffset);\n sentinel.stop(latestEnd);\n sentinel.onended = onEnded;\n }\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"success\" preset\n// A short ascending two-tone chime (major third → fifth), bright and clean.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"success\",\n duration: 0.25,\n notes: [\n { frequency: 523.25, duration: 0.1, startAt: 0, waveShape: \"sine\", gain: 0.8 },\n { frequency: 783.99, duration: 0.15, startAt: 0.1, waveShape: \"sine\", gain: 0.9 },\n ],\n },\n medium: {\n name: \"success\",\n duration: 0.45,\n notes: [\n { frequency: 523.25, duration: 0.12, startAt: 0, waveShape: \"sine\", gain: 0.7 },\n { frequency: 659.25, duration: 0.12, startAt: 0.12, waveShape: \"sine\", gain: 0.8 },\n { frequency: 783.99, duration: 0.2, startAt: 0.24, waveShape: \"sine\", gain: 0.9 },\n ],\n },\n long: {\n name: \"success\",\n duration: 0.7,\n notes: [\n { frequency: 392.00, duration: 0.1, startAt: 0, waveShape: \"sine\", gain: 0.6 },\n { frequency: 523.25, duration: 0.12, startAt: 0.1, waveShape: \"sine\", gain: 0.7 },\n { frequency: 659.25, duration: 0.12, startAt: 0.22, waveShape: \"sine\", gain: 0.8 },\n { frequency: 783.99, duration: 0.25, startAt: 0.34, waveShape: \"sine\", gain: 0.9 },\n ],\n },\n};\n\nexport function successPreset(\n variant: SoundVariant,\n pitchSemitones: number\n): EarconSound {\n // pitchSemitones is applied by the synth engine — just return the descriptor\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"error\" preset\n// Descending dissonant tones (tritone), harsh and attention-grabbing.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"error\",\n duration: 0.25,\n notes: [\n { frequency: 440, duration: 0.1, startAt: 0, waveShape: \"square\", gain: 0.5,\n envelope: { attack: 0.005, decay: 0.04, sustain: 0.6, release: 0.06 } },\n { frequency: 311, duration: 0.15, startAt: 0.1, waveShape: \"square\", gain: 0.6,\n envelope: { attack: 0.005, decay: 0.04, sustain: 0.6, release: 0.06 } },\n ],\n },\n medium: {\n name: \"error\",\n duration: 0.5,\n notes: [\n { frequency: 440, duration: 0.12, startAt: 0, waveShape: \"sawtooth\", gain: 0.4,\n envelope: { attack: 0.005, decay: 0.06, sustain: 0.5, release: 0.08 } },\n { frequency: 392, duration: 0.12, startAt: 0.13, waveShape: \"sawtooth\", gain: 0.45,\n envelope: { attack: 0.005, decay: 0.06, sustain: 0.5, release: 0.08 } },\n { frequency: 311, duration: 0.2, startAt: 0.26, waveShape: \"sawtooth\", gain: 0.55,\n envelope: { attack: 0.005, decay: 0.06, sustain: 0.5, release: 0.12 } },\n ],\n },\n long: {\n name: \"error\",\n duration: 0.75,\n notes: [\n { frequency: 440, duration: 0.12, startAt: 0, waveShape: \"sawtooth\", gain: 0.4,\n envelope: { attack: 0.005, decay: 0.07, sustain: 0.5, release: 0.1 } },\n { frequency: 415, duration: 0.1, startAt: 0.14, waveShape: \"sawtooth\", gain: 0.4,\n envelope: { attack: 0.005, decay: 0.07, sustain: 0.5, release: 0.1 } },\n { frequency: 370, duration: 0.12, startAt: 0.26, waveShape: \"sawtooth\", gain: 0.45,\n envelope: { attack: 0.005, decay: 0.07, sustain: 0.5, release: 0.1 } },\n { frequency: 311, duration: 0.25, startAt: 0.4, waveShape: \"sawtooth\", gain: 0.55,\n envelope: { attack: 0.005, decay: 0.08, sustain: 0.5, release: 0.15 } },\n ],\n },\n};\n\nexport function errorPreset(\n variant: SoundVariant,\n pitchSemitones: number\n): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"warning\" preset\n// A flat-then-descending minor second — cautious, not alarming.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"warning\",\n duration: 0.28,\n notes: [\n { frequency: 587.33, duration: 0.1, startAt: 0, waveShape: \"triangle\", gain: 0.7 },\n { frequency: 523.25, duration: 0.18, startAt: 0.1, waveShape: \"triangle\", gain: 0.75 },\n ],\n },\n medium: {\n name: \"warning\",\n duration: 0.5,\n notes: [\n { frequency: 587.33, duration: 0.12, startAt: 0, waveShape: \"triangle\", gain: 0.65 },\n { frequency: 587.33, duration: 0.12, startAt: 0.14, waveShape: \"triangle\", gain: 0.65 },\n { frequency: 493.88, duration: 0.2, startAt: 0.28, waveShape: \"triangle\", gain: 0.75 },\n ],\n },\n long: {\n name: \"warning\",\n duration: 0.8,\n notes: [\n { frequency: 587.33, duration: 0.12, startAt: 0, waveShape: \"triangle\", gain: 0.6 },\n { frequency: 587.33, duration: 0.12, startAt: 0.15, waveShape: \"triangle\", gain: 0.6 },\n { frequency: 554.37, duration: 0.12, startAt: 0.3, waveShape: \"triangle\", gain: 0.65 },\n { frequency: 493.88, duration: 0.25, startAt: 0.45, waveShape: \"triangle\", gain: 0.75 },\n ],\n },\n};\n\nexport function warningPreset(\n variant: SoundVariant,\n pitchSemitones: number\n): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"notification\" preset\n// Two clean sine tones — a gentle, neutral \"ding\" suitable for messages.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"notification\",\n duration: 0.22,\n notes: [\n { frequency: 880, duration: 0.08, startAt: 0, waveShape: \"sine\", gain: 0.6 },\n { frequency: 660, duration: 0.14, startAt: 0.08, waveShape: \"sine\", gain: 0.65 },\n ],\n },\n medium: {\n name: \"notification\",\n duration: 0.38,\n notes: [\n { frequency: 880, duration: 0.1, startAt: 0, waveShape: \"sine\", gain: 0.55 },\n { frequency: 660, duration: 0.28, startAt: 0.1, waveShape: \"sine\", gain: 0.6 },\n ],\n },\n long: {\n name: \"notification\",\n duration: 0.55,\n notes: [\n { frequency: 1046.5, duration: 0.08, startAt: 0, waveShape: \"sine\", gain: 0.5 },\n { frequency: 880, duration: 0.1, startAt: 0.1, waveShape: \"sine\", gain: 0.55 },\n { frequency: 660, duration: 0.3, startAt: 0.22, waveShape: \"sine\", gain: 0.6 },\n ],\n },\n};\n\nexport function notificationPreset(\n variant: SoundVariant,\n pitchSemitones: number\n): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"click\" preset\n// A very short transient — simulates a tactile UI button press/toggle.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"click\",\n duration: 0.04,\n notes: [\n {\n frequency: 1200,\n duration: 0.03,\n startAt: 0,\n waveShape: \"sine\",\n gain: 0.5,\n envelope: { attack: 0.002, decay: 0.015, sustain: 0, release: 0.01 },\n },\n ],\n },\n medium: {\n name: \"click\",\n duration: 0.07,\n notes: [\n {\n frequency: 900,\n duration: 0.05,\n startAt: 0,\n waveShape: \"sine\",\n gain: 0.55,\n envelope: { attack: 0.002, decay: 0.03, sustain: 0, release: 0.015 },\n },\n ],\n },\n long: {\n name: \"click\",\n duration: 0.12,\n notes: [\n {\n frequency: 700,\n duration: 0.08,\n startAt: 0,\n waveShape: \"triangle\",\n gain: 0.6,\n envelope: { attack: 0.002, decay: 0.05, sustain: 0, release: 0.025 },\n },\n ],\n },\n};\n\nexport function clickPreset(\n variant: SoundVariant,\n pitchSemitones: number\n): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"info\" preset\n// A neutral single soft tone — informational, non-intrusive.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"info\",\n duration: 0.2,\n notes: [\n {\n frequency: 698.46, // F5\n duration: 0.18,\n startAt: 0,\n waveShape: \"sine\",\n gain: 0.55,\n envelope: { attack: 0.015, decay: 0.04, sustain: 0.5, release: 0.1 },\n },\n ],\n },\n medium: {\n name: \"info\",\n duration: 0.35,\n notes: [\n {\n frequency: 698.46,\n duration: 0.32,\n startAt: 0,\n waveShape: \"sine\",\n gain: 0.55,\n envelope: { attack: 0.02, decay: 0.05, sustain: 0.5, release: 0.12 },\n },\n ],\n },\n long: {\n name: \"info\",\n duration: 0.55,\n notes: [\n {\n frequency: 587.33, // D5\n duration: 0.18,\n startAt: 0,\n waveShape: \"sine\",\n gain: 0.5,\n envelope: { attack: 0.02, decay: 0.05, sustain: 0.4, release: 0.1 },\n },\n {\n frequency: 698.46, // F5\n duration: 0.3,\n startAt: 0.2,\n waveShape: \"sine\",\n gain: 0.55,\n envelope: { attack: 0.02, decay: 0.06, sustain: 0.5, release: 0.12 },\n },\n ],\n },\n};\n\nexport function infoPreset(\n variant: SoundVariant,\n pitchSemitones: number\n): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"toggle\" preset\n// A short tactile pop — distinct from click, signals an on/off state change.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst ENV = { attack: 0.003, decay: 0.022, sustain: 0, release: 0.018 } as const;\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"toggle\",\n duration: 0.08,\n notes: [\n { frequency: 880, duration: 0.06, startAt: 0, waveShape: \"triangle\", gain: 0.6, envelope: ENV },\n ],\n },\n medium: {\n name: \"toggle\",\n duration: 0.18,\n notes: [\n { frequency: 660, duration: 0.05, startAt: 0, waveShape: \"triangle\", gain: 0.5, envelope: ENV },\n { frequency: 880, duration: 0.07, startAt: 0.08, waveShape: \"triangle\", gain: 0.65, envelope: ENV },\n ],\n },\n long: {\n name: \"toggle\",\n duration: 0.3,\n notes: [\n { frequency: 440, duration: 0.05, startAt: 0, waveShape: \"triangle\", gain: 0.45, envelope: ENV },\n { frequency: 660, duration: 0.05, startAt: 0.08, waveShape: \"triangle\", gain: 0.55, envelope: ENV },\n { frequency: 880, duration: 0.08, startAt: 0.16, waveShape: \"triangle\", gain: 0.65, envelope: ENV },\n ],\n },\n};\n\nexport function togglePreset(variant: SoundVariant, pitchSemitones: number): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"delete\" preset\n// Rapid descending sawtooth notes — conveys loss/removal without panic.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst ENV = { attack: 0.003, decay: 0.04, sustain: 0.3, release: 0.07 } as const;\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"delete\",\n duration: 0.22,\n notes: [\n { frequency: 440, duration: 0.07, startAt: 0, waveShape: \"sawtooth\", gain: 0.5, envelope: ENV },\n { frequency: 293, duration: 0.12, startAt: 0.08, waveShape: \"sawtooth\", gain: 0.55, envelope: ENV },\n ],\n },\n medium: {\n name: \"delete\",\n duration: 0.38,\n notes: [\n { frequency: 523, duration: 0.07, startAt: 0, waveShape: \"sawtooth\", gain: 0.45, envelope: ENV },\n { frequency: 415, duration: 0.07, startAt: 0.09, waveShape: \"sawtooth\", gain: 0.5, envelope: ENV },\n { frequency: 277, duration: 0.15, startAt: 0.18, waveShape: \"sawtooth\", gain: 0.55, envelope: ENV },\n ],\n },\n long: {\n name: \"delete\",\n duration: 0.55,\n notes: [\n { frequency: 587, duration: 0.07, startAt: 0, waveShape: \"sawtooth\", gain: 0.4, envelope: ENV },\n { frequency: 494, duration: 0.07, startAt: 0.09, waveShape: \"sawtooth\", gain: 0.45, envelope: ENV },\n { frequency: 392, duration: 0.07, startAt: 0.18, waveShape: \"sawtooth\", gain: 0.5, envelope: ENV },\n { frequency: 277, duration: 0.2, startAt: 0.27, waveShape: \"sawtooth\", gain: 0.55, envelope: ENV },\n ],\n },\n};\n\nexport function deletePreset(variant: SoundVariant, pitchSemitones: number): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"message\" preset\n// Soft high ping — lighter than notification, suitable for chat messages.\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst ENV = { attack: 0.01, decay: 0.04, sustain: 0.3, release: 0.08 } as const;\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"message\",\n duration: 0.15,\n notes: [\n { frequency: 1318, duration: 0.12, startAt: 0, waveShape: \"sine\", gain: 0.35, envelope: ENV },\n ],\n },\n medium: {\n name: \"message\",\n duration: 0.26,\n notes: [\n { frequency: 1318, duration: 0.07, startAt: 0, waveShape: \"sine\", gain: 0.35, envelope: ENV },\n { frequency: 1047, duration: 0.15, startAt: 0.08, waveShape: \"sine\", gain: 0.4, envelope: ENV },\n ],\n },\n long: {\n name: \"message\",\n duration: 0.4,\n notes: [\n { frequency: 1568, duration: 0.06, startAt: 0, waveShape: \"sine\", gain: 0.3, envelope: ENV },\n { frequency: 1318, duration: 0.07, startAt: 0.07, waveShape: \"sine\", gain: 0.35, envelope: ENV },\n { frequency: 1047, duration: 0.22, startAt: 0.15, waveShape: \"sine\", gain: 0.4, envelope: ENV },\n ],\n },\n};\n\nexport function messagePreset(variant: SoundVariant, pitchSemitones: number): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"upload\" preset\n// Ascending sine sweep — upward motion signals \"sent / going up\".\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"upload\",\n duration: 0.24,\n notes: [\n { frequency: 523, duration: 0.08, startAt: 0, waveShape: \"sine\", gain: 0.6 },\n { frequency: 784, duration: 0.13, startAt: 0.09, waveShape: \"sine\", gain: 0.7 },\n ],\n },\n medium: {\n name: \"upload\",\n duration: 0.4,\n notes: [\n { frequency: 392, duration: 0.08, startAt: 0, waveShape: \"sine\", gain: 0.55 },\n { frequency: 523, duration: 0.08, startAt: 0.1, waveShape: \"sine\", gain: 0.65 },\n { frequency: 784, duration: 0.18, startAt: 0.2, waveShape: \"sine\", gain: 0.75 },\n ],\n },\n long: {\n name: \"upload\",\n duration: 0.58,\n notes: [\n { frequency: 330, duration: 0.08, startAt: 0, waveShape: \"sine\", gain: 0.5 },\n { frequency: 392, duration: 0.08, startAt: 0.1, waveShape: \"sine\", gain: 0.6 },\n { frequency: 523, duration: 0.08, startAt: 0.2, waveShape: \"sine\", gain: 0.65 },\n { frequency: 784, duration: 0.24, startAt: 0.3, waveShape: \"sine\", gain: 0.75 },\n ],\n },\n};\n\nexport function uploadPreset(variant: SoundVariant, pitchSemitones: number): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"download\" preset\n// Descending sine sweep — mirror of upload, signals \"received / arriving\".\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"download\",\n duration: 0.24,\n notes: [\n { frequency: 784, duration: 0.08, startAt: 0, waveShape: \"sine\", gain: 0.7 },\n { frequency: 523, duration: 0.13, startAt: 0.09, waveShape: \"sine\", gain: 0.6 },\n ],\n },\n medium: {\n name: \"download\",\n duration: 0.4,\n notes: [\n { frequency: 784, duration: 0.08, startAt: 0, waveShape: \"sine\", gain: 0.75 },\n { frequency: 523, duration: 0.08, startAt: 0.1, waveShape: \"sine\", gain: 0.65 },\n { frequency: 392, duration: 0.18, startAt: 0.2, waveShape: \"sine\", gain: 0.55 },\n ],\n },\n long: {\n name: \"download\",\n duration: 0.58,\n notes: [\n { frequency: 784, duration: 0.08, startAt: 0, waveShape: \"sine\", gain: 0.75 },\n { frequency: 523, duration: 0.08, startAt: 0.1, waveShape: \"sine\", gain: 0.65 },\n { frequency: 392, duration: 0.08, startAt: 0.2, waveShape: \"sine\", gain: 0.6 },\n { frequency: 330, duration: 0.24, startAt: 0.3, waveShape: \"sine\", gain: 0.5 },\n ],\n },\n};\n\nexport function downloadPreset(variant: SoundVariant, pitchSemitones: number): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"eightBit\" preset\n// Square wave chiptune arpeggio — retro 8-bit video game feel 🕹️\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst ENV = { attack: 0.003, decay: 0.015, sustain: 0.4, release: 0.015 } as const;\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"eightBit\",\n duration: 0.2,\n notes: [\n { frequency: 523.25, duration: 0.04, startAt: 0.0, waveShape: \"square\", gain: 0.38, envelope: ENV },\n { frequency: 659.26, duration: 0.04, startAt: 0.05, waveShape: \"square\", gain: 0.38, envelope: ENV },\n { frequency: 783.99, duration: 0.08, startAt: 0.1, waveShape: \"square\", gain: 0.42, envelope: ENV },\n ],\n },\n medium: {\n name: \"eightBit\",\n duration: 0.33,\n notes: [\n { frequency: 523.25, duration: 0.04, startAt: 0.0, waveShape: \"square\", gain: 0.35, envelope: ENV },\n { frequency: 659.26, duration: 0.04, startAt: 0.06, waveShape: \"square\", gain: 0.38, envelope: ENV },\n { frequency: 783.99, duration: 0.04, startAt: 0.12, waveShape: \"square\", gain: 0.4, envelope: ENV },\n { frequency: 1046.5, duration: 0.12, startAt: 0.18, waveShape: \"square\", gain: 0.45, envelope: ENV },\n ],\n },\n long: {\n name: \"eightBit\",\n duration: 0.5,\n notes: [\n { frequency: 523.25, duration: 0.04, startAt: 0.0, waveShape: \"square\", gain: 0.32, envelope: ENV },\n { frequency: 659.26, duration: 0.04, startAt: 0.06, waveShape: \"square\", gain: 0.35, envelope: ENV },\n { frequency: 783.99, duration: 0.04, startAt: 0.12, waveShape: \"square\", gain: 0.38, envelope: ENV },\n { frequency: 659.26, duration: 0.04, startAt: 0.18, waveShape: \"square\", gain: 0.35, envelope: ENV },\n { frequency: 783.99, duration: 0.04, startAt: 0.24, waveShape: \"square\", gain: 0.38, envelope: ENV },\n { frequency: 1046.5, duration: 0.15, startAt: 0.3, waveShape: \"square\", gain: 0.45, envelope: ENV },\n ],\n },\n};\n\nexport function eightBitPreset(variant: SoundVariant, pitchSemitones: number): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"police\" preset\n// Alternating wee-woo tones — European emergency siren 🚨\n// 770 Hz (hi) ↔ 577 Hz (lo)\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst ENV = { attack: 0.02, decay: 0.0, sustain: 1.0, release: 0.04 } as const;\n\nfunction sirenNote(freq: number, startAt: number): (typeof VARIANTS)[\"short\"][\"notes\"][number] {\n return { frequency: freq, duration: 0.22, startAt, waveShape: \"sawtooth\", gain: 0.45, envelope: ENV };\n}\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"police\",\n duration: 0.52,\n notes: [\n sirenNote(770, 0.0),\n sirenNote(577, 0.26),\n ],\n },\n medium: {\n name: \"police\",\n duration: 1.04,\n notes: [\n sirenNote(770, 0.0),\n sirenNote(577, 0.26),\n sirenNote(770, 0.52),\n sirenNote(577, 0.78),\n ],\n },\n long: {\n name: \"police\",\n duration: 1.56,\n notes: [\n sirenNote(770, 0.0),\n sirenNote(577, 0.26),\n sirenNote(770, 0.52),\n sirenNote(577, 0.78),\n sirenNote(770, 1.04),\n sirenNote(577, 1.30),\n ],\n },\n};\n\nexport function policePreset(variant: SoundVariant, pitchSemitones: number): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"coin\" preset\n// Classic two-note square wave pickup sound 🪙\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst ENV = { attack: 0.003, decay: 0.025, sustain: 0.45, release: 0.04 } as const;\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"coin\",\n duration: 0.16,\n notes: [\n { frequency: 987.77, duration: 0.04, startAt: 0.0, waveShape: \"square\", gain: 0.45, envelope: ENV },\n { frequency: 1318.51, duration: 0.1, startAt: 0.045, waveShape: \"square\", gain: 0.5, envelope: ENV },\n ],\n },\n medium: {\n name: \"coin\",\n duration: 0.28,\n notes: [\n { frequency: 987.77, duration: 0.05, startAt: 0.0, waveShape: \"square\", gain: 0.42, envelope: ENV },\n { frequency: 1174.66, duration: 0.05, startAt: 0.06, waveShape: \"square\", gain: 0.45, envelope: ENV },\n { frequency: 1318.51, duration: 0.14, startAt: 0.12, waveShape: \"square\", gain: 0.5, envelope: ENV },\n ],\n },\n long: {\n name: \"coin\",\n duration: 0.42,\n notes: [\n { frequency: 987.77, duration: 0.05, startAt: 0.0, waveShape: \"square\", gain: 0.4, envelope: ENV },\n { frequency: 1174.66, duration: 0.05, startAt: 0.06, waveShape: \"square\", gain: 0.43, envelope: ENV },\n { frequency: 1318.51, duration: 0.05, startAt: 0.12, waveShape: \"square\", gain: 0.47, envelope: ENV },\n { frequency: 1568.0, duration: 0.2, startAt: 0.18, waveShape: \"square\", gain: 0.52, envelope: ENV },\n ],\n },\n};\n\nexport function coinPreset(variant: SoundVariant, pitchSemitones: number): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — \"boing\" preset\n// Comedy spring drop — sine notes descend in pitch with increasing duration\n// to simulate a spring slowly settling 🎪\n// ---------------------------------------------------------------------------\n\nimport type { EarconSound, SoundVariant } from \"../types.js\";\n\nconst ENV = { attack: 0.004, decay: 0.0, sustain: 1.0, release: 0.025 } as const;\n\nconst VARIANTS: Record<SoundVariant, EarconSound> = {\n short: {\n name: \"boing\",\n duration: 0.38,\n notes: [\n { frequency: 1200, duration: 0.03, startAt: 0.0, waveShape: \"sine\", gain: 0.6, envelope: ENV },\n { frequency: 900, duration: 0.03, startAt: 0.04, waveShape: \"sine\", gain: 0.58, envelope: ENV },\n { frequency: 680, duration: 0.04, startAt: 0.08, waveShape: \"sine\", gain: 0.55, envelope: ENV },\n { frequency: 500, duration: 0.05, startAt: 0.13, waveShape: \"sine\", gain: 0.52, envelope: ENV },\n { frequency: 350, duration: 0.07, startAt: 0.19, waveShape: \"sine\", gain: 0.48, envelope: ENV },\n { frequency: 220, duration: 0.1, startAt: 0.27, waveShape: \"sine\", gain: 0.42, envelope: ENV },\n ],\n },\n medium: {\n name: \"boing\",\n duration: 0.6,\n notes: [\n { frequency: 1400, duration: 0.04, startAt: 0.0, waveShape: \"sine\", gain: 0.62, envelope: ENV },\n { frequency: 1050, duration: 0.04, startAt: 0.05, waveShape: \"sine\", gain: 0.6, envelope: ENV },\n { frequency: 800, duration: 0.05, startAt: 0.1, waveShape: \"sine\", gain: 0.57, envelope: ENV },\n { frequency: 600, duration: 0.06, startAt: 0.16, waveShape: \"sine\", gain: 0.54, envelope: ENV },\n { frequency: 450, duration: 0.07, startAt: 0.23, waveShape: \"sine\", gain: 0.51, envelope: ENV },\n { frequency: 330, duration: 0.09, startAt: 0.31, waveShape: \"sine\", gain: 0.47, envelope: ENV },\n { frequency: 240, duration: 0.13, startAt: 0.41, waveShape: \"sine\", gain: 0.42, envelope: ENV },\n ],\n },\n long: {\n name: \"boing\",\n duration: 0.9,\n notes: [\n { frequency: 1600, duration: 0.04, startAt: 0.0, waveShape: \"sine\", gain: 0.62, envelope: ENV },\n { frequency: 1200, duration: 0.04, startAt: 0.05, waveShape: \"sine\", gain: 0.6, envelope: ENV },\n { frequency: 950, duration: 0.05, startAt: 0.1, waveShape: \"sine\", gain: 0.58, envelope: ENV },\n { frequency: 720, duration: 0.06, startAt: 0.16, waveShape: \"sine\", gain: 0.55, envelope: ENV },\n { frequency: 540, duration: 0.07, startAt: 0.23, waveShape: \"sine\", gain: 0.52, envelope: ENV },\n { frequency: 400, duration: 0.09, startAt: 0.31, waveShape: \"sine\", gain: 0.49, envelope: ENV },\n { frequency: 290, duration: 0.12, startAt: 0.41, waveShape: \"sine\", gain: 0.45, envelope: ENV },\n { frequency: 210, duration: 0.16, startAt: 0.54, waveShape: \"sine\", gain: 0.41, envelope: ENV },\n { frequency: 160, duration: 0.18, startAt: 0.71, waveShape: \"sine\", gain: 0.36, envelope: ENV },\n ],\n },\n};\n\nexport function boingPreset(variant: SoundVariant, pitchSemitones: number): EarconSound {\n void pitchSemitones;\n return VARIANTS[variant];\n}\n","// ---------------------------------------------------------------------------\n// earcon — public API\n// ---------------------------------------------------------------------------\n\nexport type {\n WaveShape,\n SoundVariant,\n SoundOptions,\n Envelope,\n NoteEvent,\n EarconSound,\n SoundPreset,\n} from \"./types.js\";\n\nexport { closeAudioContext, setAudioContext } from \"./context.js\";\nexport { semitonesToMultiplier } from \"./synth.js\";\n\nimport { getAudioContext } from \"./context.js\";\nimport { playSound } from \"./synth.js\";\nimport type { SoundOptions } from \"./types.js\";\n\nimport {\n successPreset,\n errorPreset,\n warningPreset,\n notificationPreset,\n clickPreset,\n infoPreset,\n togglePreset,\n deletePreset,\n messagePreset,\n uploadPreset,\n downloadPreset,\n eightBitPreset,\n policePreset,\n coinPreset,\n boingPreset,\n} from \"./sounds/index.js\";\n\n// ---------------------------------------------------------------------------\n// Internal helper — resolves options and dispatches to the synth engine\n// ---------------------------------------------------------------------------\n\nasync function play(\n preset: ReturnType<typeof successPreset>,\n opts: SoundOptions = {}\n): Promise<void> {\n const { volume = 0.5, pitch = 0, audioContext, onEnded } = opts;\n const ctx = audioContext ?? (await getAudioContext());\n playSound(ctx, preset, volume, pitch, onEnded);\n}\n\n// ---------------------------------------------------------------------------\n// Named play functions — tree-shakable, one per sound type\n// ---------------------------------------------------------------------------\n\n/** Play a success / confirmation sound */\nexport async function playSuccess(opts: SoundOptions = {}): Promise<void> {\n return play(successPreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/** Play an error sound */\nexport async function playError(opts: SoundOptions = {}): Promise<void> {\n return play(errorPreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/** Play a warning sound */\nexport async function playWarning(opts: SoundOptions = {}): Promise<void> {\n return play(warningPreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/** Play a notification / message sound */\nexport async function playNotification(opts: SoundOptions = {}): Promise<void> {\n return play(\n notificationPreset(opts.variant ?? \"medium\", opts.pitch ?? 0),\n opts\n );\n}\n\n/** Play a UI click / toggle transient */\nexport async function playClick(opts: SoundOptions = {}): Promise<void> {\n return play(clickPreset(opts.variant ?? \"short\", opts.pitch ?? 0), opts);\n}\n\n/** Play an informational / neutral tone */\nexport async function playInfo(opts: SoundOptions = {}): Promise<void> {\n return play(infoPreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/** Play a tactile on/off toggle sound */\nexport async function playToggle(opts: SoundOptions = {}): Promise<void> {\n return play(togglePreset(opts.variant ?? \"short\", opts.pitch ?? 0), opts);\n}\n\n/** Play a delete / destructive action sound */\nexport async function playDelete(opts: SoundOptions = {}): Promise<void> {\n return play(deletePreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/** Play a message / incoming chat sound */\nexport async function playMessage(opts: SoundOptions = {}): Promise<void> {\n return play(messagePreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/** Play an upload / send-complete ascending sweep */\nexport async function playUpload(opts: SoundOptions = {}): Promise<void> {\n return play(uploadPreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/** Play a download / receive-complete descending sweep */\nexport async function playDownload(opts: SoundOptions = {}): Promise<void> {\n return play(downloadPreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/** Play a retro 8-bit chiptune arpeggio 🕹️ */\nexport async function playEightBit(opts: SoundOptions = {}): Promise<void> {\n return play(eightBitPreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/** Play a police / emergency siren 🚨 */\nexport async function playPolice(opts: SoundOptions = {}): Promise<void> {\n return play(policePreset(opts.variant ?? \"short\", opts.pitch ?? 0), opts);\n}\n\n/** Play a classic coin pickup sound 🪙 */\nexport async function playCoin(opts: SoundOptions = {}): Promise<void> {\n return play(coinPreset(opts.variant ?? \"short\", opts.pitch ?? 0), opts);\n}\n\n/** Play a comedy spring/boing sound 🎪 */\nexport async function playBoing(opts: SoundOptions = {}): Promise<void> {\n return play(boingPreset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n// ---------------------------------------------------------------------------\n// Sound bank — generic play-by-name API\n// ---------------------------------------------------------------------------\n\nconst BANK = {\n // UI sounds\n success: successPreset,\n error: errorPreset,\n warning: warningPreset,\n notification: notificationPreset,\n click: clickPreset,\n info: infoPreset,\n toggle: togglePreset,\n delete: deletePreset,\n message: messagePreset,\n upload: uploadPreset,\n download: downloadPreset,\n // fun & misc\n eightBit: eightBitPreset,\n police: policePreset,\n coin: coinPreset,\n boing: boingPreset,\n} as const;\n\nexport type SoundName = keyof typeof BANK;\n\n/**\n * Play any registered sound by name.\n *\n * @example\n * await earcon(\"success\");\n * await earcon(\"error\", { variant: \"long\", volume: 0.8 });\n */\nexport async function earcon(\n name: SoundName,\n opts: SoundOptions = {}\n): Promise<void> {\n const preset = BANK[name];\n return play(preset(opts.variant ?? \"medium\", opts.pitch ?? 0), opts);\n}\n\n/**\n * Register a custom sound under a new name so it can be played via {@link earcon}.\n *\n * @example\n * import type { SoundPreset } from \"earcons\";\n *\n * const mySound: SoundPreset = (variant, pitch) => ({\n * name: \"mySound\",\n * duration: 0.3,\n * notes: [{ frequency: 440, duration: 0.3, startAt: 0 }],\n * });\n *\n * registerSound(\"mySound\", mySound);\n * await earcon(\"mySound\");\n */\nexport function registerSound(name: string, preset: SoundPreset): void {\n (BANK as Record<string, SoundPreset>)[name] = preset;\n}\n\nimport type { SoundPreset } from \"./types.js\";\n"]}