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/README.md +20 -1
- package/dist/earcon.min.global.js +1 -1
- package/dist/index.cjs +378 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +46 -1
- package/dist/index.d.ts +46 -1
- package/dist/index.js +370 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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":"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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 — 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"]}
|