rlo-engine 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +15 -4
  2. package/dist/Core/AudioMath.d.ts +29 -0
  3. package/dist/Core/AudioMath.d.ts.map +1 -0
  4. package/dist/Core/AudioMath.js +64 -0
  5. package/dist/Core/AudioMath.js.map +1 -0
  6. package/dist/Core/InstrumentMap.d.ts +36 -0
  7. package/dist/Core/InstrumentMap.d.ts.map +1 -0
  8. package/dist/Core/InstrumentMap.js +62 -0
  9. package/dist/Core/InstrumentMap.js.map +1 -0
  10. package/dist/Core/RLOCore.d.ts +49 -0
  11. package/dist/Core/RLOCore.d.ts.map +1 -0
  12. package/dist/Core/RLOCore.js +188 -0
  13. package/dist/Core/RLOCore.js.map +1 -0
  14. package/dist/Core/SequenceBuilder.d.ts +23 -0
  15. package/dist/Core/SequenceBuilder.d.ts.map +1 -0
  16. package/dist/Core/SequenceBuilder.js +31 -0
  17. package/dist/Core/SequenceBuilder.js.map +1 -0
  18. package/dist/Instruments/Analog/AnalogSynthBase.d.ts +17 -7
  19. package/dist/Instruments/Analog/AnalogSynthBase.d.ts.map +1 -1
  20. package/dist/Instruments/Analog/AnalogSynthBase.js +27 -16
  21. package/dist/Instruments/Analog/AnalogSynthBase.js.map +1 -1
  22. package/dist/Instruments/Analog/BassSynth.d.ts +12 -5
  23. package/dist/Instruments/Analog/BassSynth.d.ts.map +1 -1
  24. package/dist/Instruments/Analog/BassSynth.js +17 -10
  25. package/dist/Instruments/Analog/BassSynth.js.map +1 -1
  26. package/dist/Instruments/Analog/ChiptuneSynth.d.ts +11 -4
  27. package/dist/Instruments/Analog/ChiptuneSynth.d.ts.map +1 -1
  28. package/dist/Instruments/Analog/ChiptuneSynth.js +12 -5
  29. package/dist/Instruments/Analog/ChiptuneSynth.js.map +1 -1
  30. package/dist/Instruments/Analog/FMSynth.d.ts +11 -4
  31. package/dist/Instruments/Analog/FMSynth.d.ts.map +1 -1
  32. package/dist/Instruments/Analog/FMSynth.js +14 -7
  33. package/dist/Instruments/Analog/FMSynth.js.map +1 -1
  34. package/dist/Instruments/Analog/FormantSynth.d.ts +11 -4
  35. package/dist/Instruments/Analog/FormantSynth.d.ts.map +1 -1
  36. package/dist/Instruments/Analog/FormantSynth.js +12 -5
  37. package/dist/Instruments/Analog/FormantSynth.js.map +1 -1
  38. package/dist/Instruments/Analog/LeadSynth.d.ts +11 -4
  39. package/dist/Instruments/Analog/LeadSynth.d.ts.map +1 -1
  40. package/dist/Instruments/Analog/LeadSynth.js +14 -7
  41. package/dist/Instruments/Analog/LeadSynth.js.map +1 -1
  42. package/dist/Instruments/Analog/OrganSynth.d.ts +11 -4
  43. package/dist/Instruments/Analog/OrganSynth.d.ts.map +1 -1
  44. package/dist/Instruments/Analog/OrganSynth.js +17 -10
  45. package/dist/Instruments/Analog/OrganSynth.js.map +1 -1
  46. package/dist/Instruments/Analog/PadSynth.js +7 -7
  47. package/dist/Instruments/Analog/PadSynth.js.map +1 -1
  48. package/dist/Instruments/Analog/ReeseBassSynth.d.ts +11 -4
  49. package/dist/Instruments/Analog/ReeseBassSynth.d.ts.map +1 -1
  50. package/dist/Instruments/Analog/ReeseBassSynth.js +13 -6
  51. package/dist/Instruments/Analog/ReeseBassSynth.js.map +1 -1
  52. package/dist/Instruments/Analog/StringSynth.js +4 -4
  53. package/dist/Instruments/Analog/StringSynth.js.map +1 -1
  54. package/dist/Instruments/Analog/WoodwindSynth.d.ts +11 -4
  55. package/dist/Instruments/Analog/WoodwindSynth.d.ts.map +1 -1
  56. package/dist/Instruments/Analog/WoodwindSynth.js +19 -12
  57. package/dist/Instruments/Analog/WoodwindSynth.js.map +1 -1
  58. package/dist/Instruments/CoreSynthBase.d.ts +31 -24
  59. package/dist/Instruments/CoreSynthBase.d.ts.map +1 -1
  60. package/dist/Instruments/CoreSynthBase.js +53 -34
  61. package/dist/Instruments/CoreSynthBase.js.map +1 -1
  62. package/dist/Instruments/Decay/AdditiveSynth.d.ts +12 -5
  63. package/dist/Instruments/Decay/AdditiveSynth.d.ts.map +1 -1
  64. package/dist/Instruments/Decay/AdditiveSynth.js +9 -2
  65. package/dist/Instruments/Decay/AdditiveSynth.js.map +1 -1
  66. package/dist/Instruments/Decay/BrassSynth.d.ts +11 -4
  67. package/dist/Instruments/Decay/BrassSynth.d.ts.map +1 -1
  68. package/dist/Instruments/Decay/BrassSynth.js +22 -15
  69. package/dist/Instruments/Decay/BrassSynth.js.map +1 -1
  70. package/dist/Instruments/Decay/ChromaticPercussionSynth.d.ts +12 -5
  71. package/dist/Instruments/Decay/ChromaticPercussionSynth.d.ts.map +1 -1
  72. package/dist/Instruments/Decay/ChromaticPercussionSynth.js +16 -9
  73. package/dist/Instruments/Decay/ChromaticPercussionSynth.js.map +1 -1
  74. package/dist/Instruments/Decay/DecaySynthBase.d.ts +14 -8
  75. package/dist/Instruments/Decay/DecaySynthBase.d.ts.map +1 -1
  76. package/dist/Instruments/Decay/DecaySynthBase.js +22 -15
  77. package/dist/Instruments/Decay/DecaySynthBase.js.map +1 -1
  78. package/dist/Instruments/Decay/ElectricGuitarSynth.d.ts +12 -5
  79. package/dist/Instruments/Decay/ElectricGuitarSynth.d.ts.map +1 -1
  80. package/dist/Instruments/Decay/ElectricGuitarSynth.js +19 -12
  81. package/dist/Instruments/Decay/ElectricGuitarSynth.js.map +1 -1
  82. package/dist/Instruments/Decay/EthnicSynth.d.ts +12 -5
  83. package/dist/Instruments/Decay/EthnicSynth.d.ts.map +1 -1
  84. package/dist/Instruments/Decay/EthnicSynth.js +13 -6
  85. package/dist/Instruments/Decay/EthnicSynth.js.map +1 -1
  86. package/dist/Instruments/Decay/GuitarSynth.d.ts +12 -5
  87. package/dist/Instruments/Decay/GuitarSynth.d.ts.map +1 -1
  88. package/dist/Instruments/Decay/GuitarSynth.js +14 -7
  89. package/dist/Instruments/Decay/GuitarSynth.js.map +1 -1
  90. package/dist/Instruments/Decay/KarplusSynth.d.ts +7 -0
  91. package/dist/Instruments/Decay/KarplusSynth.d.ts.map +1 -1
  92. package/dist/Instruments/Decay/KarplusSynth.js +16 -8
  93. package/dist/Instruments/Decay/KarplusSynth.js.map +1 -1
  94. package/dist/Instruments/Decay/PianoSynth.d.ts +12 -5
  95. package/dist/Instruments/Decay/PianoSynth.d.ts.map +1 -1
  96. package/dist/Instruments/Decay/PianoSynth.js +19 -12
  97. package/dist/Instruments/Decay/PianoSynth.js.map +1 -1
  98. package/dist/Instruments/Decay/SlapBassSynth.d.ts +12 -5
  99. package/dist/Instruments/Decay/SlapBassSynth.d.ts.map +1 -1
  100. package/dist/Instruments/Decay/SlapBassSynth.js +13 -6
  101. package/dist/Instruments/Decay/SlapBassSynth.js.map +1 -1
  102. package/dist/Instruments/ISynthInstrument.d.ts +6 -0
  103. package/dist/Instruments/ISynthInstrument.d.ts.map +1 -1
  104. package/dist/Instruments/Speciality/DrumSynth.d.ts +7 -0
  105. package/dist/Instruments/Speciality/DrumSynth.d.ts.map +1 -1
  106. package/dist/Instruments/Speciality/DrumSynth.js +30 -21
  107. package/dist/Instruments/Speciality/DrumSynth.js.map +1 -1
  108. package/dist/Instruments/Speciality/SoundEffectsSynth.d.ts +7 -0
  109. package/dist/Instruments/Speciality/SoundEffectsSynth.d.ts.map +1 -1
  110. package/dist/Instruments/Speciality/SoundEffectsSynth.js +20 -12
  111. package/dist/Instruments/Speciality/SoundEffectsSynth.js.map +1 -1
  112. package/dist/Instruments/Synthesizer.d.ts +5 -0
  113. package/dist/Instruments/Synthesizer.d.ts.map +1 -1
  114. package/dist/Instruments/Synthesizer.js +7 -1
  115. package/dist/Instruments/Synthesizer.js.map +1 -1
  116. package/dist/Players/RLOGameEngine.d.ts +35 -0
  117. package/dist/Players/RLOGameEngine.d.ts.map +1 -0
  118. package/dist/Players/RLOGameEngine.js +98 -0
  119. package/dist/Players/RLOGameEngine.js.map +1 -0
  120. package/dist/Players/RLOMusicPlayer.d.ts +35 -0
  121. package/dist/Players/RLOMusicPlayer.d.ts.map +1 -0
  122. package/dist/Players/RLOMusicPlayer.js +167 -0
  123. package/dist/Players/RLOMusicPlayer.js.map +1 -0
  124. package/dist/RLO-Transpiler.d.ts +37 -15
  125. package/dist/RLO-Transpiler.d.ts.map +1 -1
  126. package/dist/RLO-Transpiler.js +139 -117
  127. package/dist/RLO-Transpiler.js.map +1 -1
  128. package/dist/compiler.d.ts +50 -31
  129. package/dist/compiler.d.ts.map +1 -1
  130. package/dist/compiler.js +165 -230
  131. package/dist/compiler.js.map +1 -1
  132. package/dist/crush.d.ts +1 -5
  133. package/dist/crush.d.ts.map +1 -1
  134. package/dist/crush.js +10 -3
  135. package/dist/crush.js.map +1 -1
  136. package/dist/index.d.ts +15 -2
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +14 -3
  139. package/dist/index.js.map +1 -1
  140. package/dist/midi-parser.d.ts +14 -0
  141. package/dist/midi-parser.d.ts.map +1 -1
  142. package/dist/midi-parser.js +21 -0
  143. package/dist/midi-parser.js.map +1 -1
  144. package/dist/rlo-engine.min.js +441 -439
  145. package/dist/rlo-engine.min.js.map +1 -1
  146. package/dist/rlo-engine.min.umd.js +1 -1
  147. package/dist/rlo-engine.min.umd.js.map +1 -1
  148. package/dist/types.d.ts +21 -3
  149. package/dist/types.d.ts.map +1 -1
  150. package/dist/types.js +4 -0
  151. package/dist/types.js.map +1 -1
  152. package/dist/vite.config.d.ts.map +1 -1
  153. package/dist/vite.config.js +16 -3
  154. package/dist/vite.config.js.map +1 -1
  155. package/dist/vite.config.js13k.d.ts.map +1 -1
  156. package/dist/vite.config.js13k.js +1 -0
  157. package/dist/vite.config.js13k.js.map +1 -1
  158. package/package.json +1 -1
  159. package/dist/Instruments/InstrumentFactory.d.ts +0 -2
  160. package/dist/Instruments/InstrumentFactory.d.ts.map +0 -1
  161. package/dist/Instruments/InstrumentFactory.js +0 -4
  162. package/dist/Instruments/InstrumentFactory.js.map +0 -1
  163. package/dist/RLO-Player.d.ts +0 -298
  164. package/dist/RLO-Player.d.ts.map +0 -1
  165. package/dist/RLO-Player.js +0 -724
  166. package/dist/RLO-Player.js.map +0 -1
@@ -3,20 +3,27 @@ import { AnalogSynthBase } from "./AnalogSynthBase.js";
3
3
  * Synthesizer strategy for Reese/Wobble Bass.
4
4
  * Uses heavily detuned sawtooths and an LFO-driven lowpass filter.
5
5
  */
6
+ /**
7
+ * A staple of Drum & Bass music, this uses two heavily detuned sawtooth waves to create a thick, phasing, and wide bass tone.
8
+ *
9
+ * @reason Acoustic Design:
10
+ * Encapsulates the specific Web Audio node routing and ADSR parameters
11
+ * required to physically model this instrument within the 13KB limit.
12
+ */
6
13
  export class ReeseBassSynth extends AnalogSynthBase {
7
14
  constructor() {
8
15
  super(...arguments);
9
- this._c = { v: 0.7, a: 0.05, r: 0.2 };
16
+ this._envelopeConfig = { _peakVelocity: 0.7, _attackTimeSeconds: 0.05, _releaseTimeSeconds: 0.2 };
10
17
  }
11
18
  _setupSynthesis(ctx, gain, time, freq, velocity, sustainTime, releaseTime, stopTime) {
12
- const filter = this._filter(ctx, 0 /* Filter.Lowpass */);
13
- this._set(filter.frequency, freq * 2, time);
19
+ const filter = this._createFilter(ctx, "lowpass");
20
+ this._setValueAtTime(filter.frequency, freq * 2, time);
14
21
  // Wobble LFO: syncs roughly to tempo (e.g. 1/8th notes ~4-8 Hz)
15
- this._lfo(ctx, 6, freq * 3, time, 0, stopTime, filter.frequency);
22
+ this._createLFO(ctx, 6, freq * 3, time, 0, stopTime, filter.frequency);
16
23
  // Deep, phasing detune
17
- const [osc1, osc2] = this._stereoOsc(ctx, 2 /* Osc.Sawtooth */, freq / 2, 1.015, 0.4, filter);
24
+ const [osc1, osc2] = this._createStereoOscillator(ctx, "sawtooth", freq / 2, 1.015, 0.4, filter);
18
25
  filter.connect(gain);
19
- this._on(time, stopTime, osc1, osc2);
26
+ this._scheduleNodeStartStop(time, stopTime, osc1, osc2);
20
27
  }
21
28
  }
22
29
  //# sourceMappingURL=ReeseBassSynth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReeseBassSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/ReeseBassSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,sBAAsB,CAAC;AAGlE;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,eAAe;IAAnD;;QACY,OAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IA8B7C,CAAC;IA5BW,eAAe,CACvB,GAAiB,EACjB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,WAAmB,EACnB,QAAgB;QAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,yBAAiB,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAE5C,gEAAgE;QAChE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAEjE,uBAAuB;QACvB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAClC,GAAG,wBAEH,IAAI,GAAG,CAAC,EACR,KAAK,EACL,GAAG,EACH,MAAM,CACP,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;CACF"}
1
+ {"version":3,"file":"ReeseBassSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/ReeseBassSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,sBAAsB,CAAC;AAGlE;;;GAGG;AACH;;;;;;GAMG;AACH,MAAM,OAAO,cAAe,SAAQ,eAAe;IAAnD;;QACY,oBAAe,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC;IA8BzG,CAAC;IA5BW,eAAe,CACvB,GAAiB,EACjB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,WAAmB,EACnB,QAAgB;QAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAEvD,gEAAgE;QAChE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAEvE,uBAAuB;QACvB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAC/C,GAAG,EACH,UAAU,EACV,IAAI,GAAG,CAAC,EACR,KAAK,EACL,GAAG,EACH,MAAM,CACP,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;CACF"}
@@ -7,12 +7,12 @@ export class StringSynth extends AnalogSynthBase {
7
7
  return { v: 0.3, a: d < 0.4 ? 0.05 : 0.2, r: d < 0.4 ? 0.1 : 0.5 };
8
8
  }
9
9
  _setupSynthesis(ctx, gain, time, freq, velocity, sustainTime, releaseTime, stopTime) {
10
- const [osc1, osc2] = this._stereoOsc(ctx, 2 /* Osc.Sawtooth */, freq, 1.005, 0.6, gain);
11
- const lfo = this._lfo(ctx, 4.5, freq * 0.012, time, 0.3, stopTime, osc1.frequency);
10
+ const [osc1, osc2] = this._createStereoOscillator(ctx, "sawtooth", freq, 1.005, 0.6, gain);
11
+ const lfo = this._createLFO(ctx, 4.5, freq * 0.012, time, 0.3, stopTime, osc1.frequency);
12
12
  lfo.connect(osc2.frequency);
13
- const filter = this._filterSweep(ctx, 0 /* Filter.Lowpass */, freq + 1200 + velocity * 1000, freq + 800, time, sustainTime + releaseTime);
13
+ const filter = this._createFilterSweep(ctx, "lowpass", freq + 1200 + velocity * 1000, freq + 800, time, sustainTime + releaseTime);
14
14
  gain.connect(filter);
15
- this._on(time, stopTime, osc1, osc2);
15
+ this._scheduleNodeStartStop(time, stopTime, osc1, osc2);
16
16
  return filter;
17
17
  }
18
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StringSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/StringSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,eAAe;IACpC,IAAI,CAAC,CAAS;QACtB,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACrE,CAAC;IAES,eAAe,CACvB,GAAiB,EACjB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,WAAmB,EACnB,QAAgB;QAEhB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAClC,GAAG,wBAEH,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAI,CACL,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CACnB,GAAG,EACH,GAAG,EACH,IAAI,GAAG,KAAK,EACZ,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,IAAI,CAAC,SAAS,CACf,CAAC;QACF,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAC9B,GAAG,0BAEH,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,EAC7B,IAAI,GAAG,GAAG,EACV,IAAI,EACJ,WAAW,GAAG,WAAW,CAC1B,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAErB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAErC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"StringSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/StringSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,eAAe;IACpC,IAAI,CAAC,CAAS;QACtB,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACrE,CAAC;IAES,eAAe,CACvB,GAAiB,EACjB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,WAAmB,EACnB,QAAgB;QAEhB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAC/C,GAAG,EACH,UAAU,EACV,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAI,CACL,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CACzB,GAAG,EACH,GAAG,EACH,IAAI,GAAG,KAAK,EACZ,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,IAAI,CAAC,SAAS,CACf,CAAC;QACF,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CACpC,GAAG,EACH,SAAS,EACT,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,EAC7B,IAAI,GAAG,GAAG,EACV,IAAI,EACJ,WAAW,GAAG,WAAW,CAC1B,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAErB,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAExD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -3,11 +3,18 @@ import { AnalogSynthBase } from "./AnalogSynthBase.js";
3
3
  * Synthesizer strategy for Woodwinds and Pipes (Flute, Piccolo, Recorder, Ocarina).
4
4
  * Characterized by a pure, hollow, and breathy tone using sine and triangle waves.
5
5
  */
6
+ /**
7
+ * Emulates a flute or clarinet using a pure sine or triangle wave with gentle vibrato and a breathy noise layer.
8
+ *
9
+ * @reason Acoustic Design:
10
+ * Encapsulates the specific Web Audio node routing and ADSR parameters
11
+ * required to physically model this instrument within the 13KB limit.
12
+ */
6
13
  export declare class WoodwindSynth extends AnalogSynthBase {
7
- protected _c: {
8
- v: number;
9
- a: number;
10
- r: number;
14
+ protected _envelopeConfig: {
15
+ _peakVelocity: number;
16
+ _attackTimeSeconds: number;
17
+ _releaseTimeSeconds: number;
11
18
  };
12
19
  protected _setupSynthesis(ctx: AudioContext, gain: GainNode, time: number, freq: number, velocity: number, sustainTime: number, releaseTime: number, stopTime: number): AudioNode | void;
13
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WoodwindSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Analog/WoodwindSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;;GAGG;AACH,qBAAa,aAAc,SAAQ,eAAe;IAChD,SAAS,CAAC,EAAE;;;;MAA+B;IAE3C,SAAS,CAAC,eAAe,CACvB,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,SAAS,GAAG,IAAI;CAsCpB"}
1
+ {"version":3,"file":"WoodwindSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Analog/WoodwindSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;;GAGG;AACH;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,eAAe;IAChD,SAAS,CAAC,eAAe;;;;MAA8E;IAEvG,SAAS,CAAC,eAAe,CACvB,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,SAAS,GAAG,IAAI;CAsCpB"}
@@ -3,32 +3,39 @@ import { AnalogSynthBase } from "./AnalogSynthBase.js";
3
3
  * Synthesizer strategy for Woodwinds and Pipes (Flute, Piccolo, Recorder, Ocarina).
4
4
  * Characterized by a pure, hollow, and breathy tone using sine and triangle waves.
5
5
  */
6
+ /**
7
+ * Emulates a flute or clarinet using a pure sine or triangle wave with gentle vibrato and a breathy noise layer.
8
+ *
9
+ * @reason Acoustic Design:
10
+ * Encapsulates the specific Web Audio node routing and ADSR parameters
11
+ * required to physically model this instrument within the 13KB limit.
12
+ */
6
13
  export class WoodwindSynth extends AnalogSynthBase {
7
14
  constructor() {
8
15
  super(...arguments);
9
- this._c = { v: 0.7, a: 0.05, r: 0.1 };
16
+ this._envelopeConfig = { _peakVelocity: 0.7, _attackTimeSeconds: 0.05, _releaseTimeSeconds: 0.1 };
10
17
  }
11
18
  _setupSynthesis(ctx, gain, time, freq, velocity, sustainTime, releaseTime, stopTime) {
12
19
  /** Flutes are mostly a fundamental sine wave with a tiny bit of triangle for the "chiff" sound */
13
- const osc1 = this._osc(ctx, 0 /* Osc.Sine */, freq, gain);
20
+ const osc1 = this._createOscillator(ctx, "sine", freq, gain);
14
21
  /** Triangle is mixed much lower just to provide a bit of upper harmonic texture */
15
- const triGain = this._gain(ctx, 0, gain);
22
+ const triGain = this._createGain(ctx, 0, gain);
16
23
  /** Breath transient: louder at attack, decaying to a whisper during sustain */
17
- this._set(triGain.gain, 0.3, time);
18
- this._exp(triGain.gain, 0.05, time + 0.2);
19
- const osc2 = this._osc(ctx, 3 /* Osc.Triangle */, freq, triGain);
24
+ this._setValueAtTime(triGain.gain, 0.3, time);
25
+ this._exponentialRampToValue(triGain.gain, 0.05, time + 0.2);
26
+ const osc2 = this._createOscillator(ctx, "triangle", freq, triGain);
20
27
  /** Lowpass filter to keep it extremely smooth and remove any digital sharpness */
21
- const filter = this._filter(ctx, 0 /* Filter.Lowpass */);
22
- this._set(filter.frequency, freq + 800, time);
28
+ const filter = this._createFilter(ctx, "lowpass");
29
+ this._setValueAtTime(filter.frequency, freq + 800, time);
23
30
  /** Diaphragm vibrato: blooms slowly after the initial breath attack */
24
- const vibrato = this._lfo(ctx, 5.5, freq * 0.015, time, 0.4, stopTime, osc1.frequency);
31
+ const vibrato = this._createLFO(ctx, 5.5, freq * 0.015, time, 0.4, stopTime, osc1.frequency);
25
32
  vibrato.connect(osc2.frequency);
26
33
  /** True Amplitude Modulation (Tremolo) pipelined from the diaphragm vibrato */
27
- const tremoloNode = this._gain(ctx, 1.0);
28
- const tremoloDepth = this._gain(ctx, 0.15, tremoloNode.gain);
34
+ const tremoloNode = this._createGain(ctx, 1.0);
35
+ const tremoloDepth = this._createGain(ctx, 0.15, tremoloNode.gain);
29
36
  vibrato.connect(tremoloDepth);
30
37
  gain.connect(tremoloNode).connect(filter);
31
- this._on(time, stopTime, osc1, osc2);
38
+ this._scheduleNodeStartStop(time, stopTime, osc1, osc2);
32
39
  return filter;
33
40
  }
34
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WoodwindSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/WoodwindSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,eAAe;IAAlD;;QACY,OAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAiD7C,CAAC;IA/CW,eAAe,CACvB,GAAiB,EACjB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,WAAmB,EACnB,QAAgB;QAEhB,kGAAkG;QAClG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,oBAAY,IAAI,EAAE,IAAI,CAAC,CAAC;QAElD,mFAAmF;QACnF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACzC,+EAA+E;QAC/E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,wBAAgB,IAAI,EAAE,OAAO,CAAC,CAAC;QAEzD,kFAAkF;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,yBAAiB,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;QAE9C,uEAAuE;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,GAAG,EACH,GAAG,EACH,IAAI,GAAG,KAAK,EACZ,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,IAAI,CAAC,SAAS,CACf,CAAC;QACF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEhC,+EAA+E;QAC/E,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAE9B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE1C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAErC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"WoodwindSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/WoodwindSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;;GAGG;AACH;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,eAAe;IAAlD;;QACY,oBAAe,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC;IAiDzG,CAAC;IA/CW,eAAe,CACvB,GAAiB,EACjB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,WAAmB,EACnB,QAAgB;QAEhB,kGAAkG;QAClG,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE7D,mFAAmF;QACnF,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/C,+EAA+E;QAC/E,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAEpE,kFAAkF;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;QAEzD,uEAAuE;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAC7B,GAAG,EACH,GAAG,EACH,IAAI,GAAG,KAAK,EACZ,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,IAAI,CAAC,SAAS,CACf,CAAC;QACF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEhC,+EAA+E;QAC/E,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACnE,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAE9B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE1C,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAExD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -1,29 +1,36 @@
1
1
  import { ISynthInstrument } from "./ISynthInstrument.js";
2
- export declare const enum Osc {
3
- Sine = 0,
4
- Square = 1,
5
- Sawtooth = 2,
6
- Triangle = 3
7
- }
8
- export declare const enum Filter {
9
- Lowpass = 0,
10
- Highpass = 1,
11
- Bandpass = 2
12
- }
2
+ export declare const hasStrictGC: boolean;
3
+ export type Osc = "sine" | "square" | "sawtooth" | "triangle";
4
+ export type Filter = "lowpass" | "highpass" | "bandpass";
13
5
  export declare abstract class CoreSynthBase implements ISynthInstrument {
14
6
  abstract _playNote(ctx: AudioContext, masterGain: GainNode, time: number, freq: number, duration: number, velocity: number): void;
15
- _osc(ctx: AudioContext, type: Osc, freq: number, dest?: AudioNode | AudioParam): OscillatorNode;
16
- _gain(ctx: AudioContext, val: number, dest?: AudioNode | AudioParam): GainNode;
17
- _filter(ctx: AudioContext, type: Filter): BiquadFilterNode;
18
- _pan(ctx: AudioContext, val: number, dest?: AudioNode): StereoPannerNode;
19
- _on(t: number, s: number, ...n: AudioScheduledSourceNode[]): void;
20
- _set(p: AudioParam, v: number, t: number): void;
21
- _lin(p: AudioParam, v: number, t: number): void;
22
- _exp(p: AudioParam, v: number, t: number): void;
23
- _transient(ctx: AudioContext, type: Osc, freq: number, dest: AudioNode, time: number, peak: number, dur: number, atk?: number): void;
24
- _filterSweep(ctx: AudioContext, type: Filter, f1: number, f2: number, t1: number, dur: number): BiquadFilterNode;
25
- _stereoOsc(ctx: AudioContext, type: Osc, freq: number, detune: number, pan: number, dest: AudioNode): [OscillatorNode, OscillatorNode];
26
- _lfo(ctx: AudioContext, freq: number, depth: number, time: number, fadeIn: number, stopTime: number, dest: AudioNode | AudioParam, delay?: number): GainNode;
27
- _gc(ctx: AudioContext, time: number, stopTime: number, ...nodes: AudioNode[]): void;
7
+ _createOscillator(ctx: AudioContext, type: Osc, freq: number, dest?: AudioNode | AudioParam): OscillatorNode;
8
+ _createGain(ctx: AudioContext, val: number, dest?: AudioNode | AudioParam): GainNode;
9
+ _createFilter(ctx: AudioContext, type: Filter): BiquadFilterNode;
10
+ _createStereoPanner(ctx: AudioContext, val: number, dest?: AudioNode): StereoPannerNode;
11
+ _scheduleNodeStartStop(t: number, s: number, ...n: AudioScheduledSourceNode[]): void;
12
+ _setValueAtTime(p: AudioParam, v: number, t: number): void;
13
+ _linearRampToValue(p: AudioParam, v: number, t: number): void;
14
+ _exponentialRampToValue(p: AudioParam, v: number, t: number): void;
15
+ _createTransient(ctx: AudioContext, type: Osc, freq: number, dest: AudioNode, time: number, peak: number, dur: number, atk?: number): void;
16
+ _createFilterSweep(ctx: AudioContext, type: Filter, f1: number, f2: number, t1: number, dur: number): BiquadFilterNode;
17
+ _createStereoOscillator(ctx: AudioContext, type: Osc, freq: number, detune: number, pan: number, dest: AudioNode): [OscillatorNode, OscillatorNode];
18
+ _createLFO(ctx: AudioContext, freq: number, depth: number, time: number, fadeIn: number, stopTime: number, dest: AudioNode | AudioParam, delay?: number): GainNode;
19
+ /**
20
+ * Schedules a delayed garbage collection using a native C++ audio thread.
21
+ *
22
+ * @reason Why we use a dummy OscillatorNode instead of setTimeout:
23
+ * The JS event loop is inherently jittery and subject to GC pauses and tab throttling.
24
+ * By scheduling a silent OscillatorNode with a precise `.stop(stopTime)`, we leverage
25
+ * the Web Audio API's C++ audio thread to trigger the `onended` callback precisely at the sample
26
+ * boundary. This guarantees that `disconnect()` is called on exhausted nodes exactly when
27
+ * they finish decaying, preventing memory leaks (stray disconnected nodes) without any JS timing overhead.
28
+ *
29
+ * @param ctx The AudioContext.
30
+ * @param time The start time of the GC lifecycle.
31
+ * @param stopTime The exact time when the audio nodes should be completely unlinked from the graph.
32
+ * @param nodes The nodes to disconnect.
33
+ */
34
+ _scheduleNodeDisposal(ctx: AudioContext, time: number, stopTime: number, ...nodes: AudioNode[]): void;
28
35
  }
29
36
  //# sourceMappingURL=CoreSynthBase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CoreSynthBase.d.ts","sourceRoot":"","sources":["../../Instruments/CoreSynthBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAMzD,0BAAkB,GAAG;IACnB,IAAI,IAAI;IACR,MAAM,IAAI;IACV,QAAQ,IAAI;IACZ,QAAQ,IAAI;CACb;AACD,0BAAkB,MAAM;IACtB,OAAO,IAAI;IACX,QAAQ,IAAI;IACZ,QAAQ,IAAI;CACb;AAED,8BAAsB,aAAc,YAAW,gBAAgB;aAC7C,SAAS,CACvB,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,QAAQ,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,IAAI;IAEA,IAAI,CACT,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,GAAG,EACT,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAC5B,cAAc;IAOV,KAAK,CACV,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAC5B,QAAQ;IAMJ,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB;IAK1D,IAAI,CACT,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,SAAS,GACf,gBAAgB;IAMZ,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,wBAAwB,EAAE,GAAG,IAAI;IAMjE,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAG/C,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAG/C,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAI/C,UAAU,CACf,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,GAAG,EACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAU,GACd,IAAI;IAOA,YAAY,CACjB,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,GACV,gBAAgB;IAMZ,UAAU,CACf,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,GAAG,EACT,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,GACd,CAAC,cAAc,EAAE,cAAc,CAAC;IAM5B,IAAI,CACT,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,SAAS,GAAG,UAAU,EAC5B,KAAK,GAAE,MAAU,GAChB,QAAQ;IASJ,GAAG,CACR,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,GAAG,KAAK,EAAE,SAAS,EAAE,GACpB,IAAI;CAcR"}
1
+ {"version":3,"file":"CoreSynthBase.d.ts","sourceRoot":"","sources":["../../Instruments/CoreSynthBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,eAAO,MAAM,WAAW,SACmD,CAAC;AAE5E,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAC9D,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEzD,8BAAsB,aAAc,YAAW,gBAAgB;aAC7C,SAAS,CACvB,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,QAAQ,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,IAAI;IAEA,iBAAiB,CACtB,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,GAAG,EACT,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAC5B,cAAc;IAOV,WAAW,CAChB,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAC5B,QAAQ;IAMJ,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB;IAKhE,mBAAmB,CACxB,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,SAAS,GACf,gBAAgB;IAMZ,sBAAsB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,wBAAwB,EAAE,GAAG,IAAI;IAMpF,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAG1D,kBAAkB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAG7D,uBAAuB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAIlE,gBAAgB,CACrB,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,GAAG,EACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAU,GACd,IAAI;IAOA,kBAAkB,CACvB,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,GACV,gBAAgB;IAMZ,uBAAuB,CAC5B,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,GAAG,EACT,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,GACd,CAAC,cAAc,EAAE,cAAc,CAAC;IAM5B,UAAU,CACf,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,SAAS,GAAG,UAAU,EAC5B,KAAK,GAAE,MAAU,GAChB,QAAQ;IASX;;;;;;;;;;;;;;OAcG;IACI,qBAAqB,CAC1B,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,GAAG,KAAK,EAAE,SAAS,EAAE,GACpB,IAAI;CAkBR"}
@@ -1,86 +1,105 @@
1
- const hasStrictGC = typeof __ENABLE_STRICT_GC__ !== "undefined" ? __ENABLE_STRICT_GC__ : true;
1
+ export const hasStrictGC = typeof __ENABLE_STRICT_GC__ !== "undefined" ? __ENABLE_STRICT_GC__ : true;
2
2
  export class CoreSynthBase {
3
- _osc(ctx, type, freq, dest) {
3
+ _createOscillator(ctx, type, freq, dest) {
4
4
  const o = ctx.createOscillator();
5
- o.type = ["sine", "square", "sawtooth", "triangle"][type];
5
+ o.type = type;
6
6
  if (freq)
7
7
  o.frequency.value = Math.min(22000, freq);
8
8
  if (dest)
9
9
  o.connect(dest);
10
10
  return o;
11
11
  }
12
- _gain(ctx, val, dest) {
12
+ _createGain(ctx, val, dest) {
13
13
  const g = ctx.createGain();
14
14
  g.gain.value = val;
15
15
  if (dest)
16
16
  g.connect(dest);
17
17
  return g;
18
18
  }
19
- _filter(ctx, type) {
19
+ _createFilter(ctx, type) {
20
20
  const f = ctx.createBiquadFilter();
21
- f.type = ["lowpass", "highpass", "bandpass"][type];
21
+ f.type = type;
22
22
  return f;
23
23
  }
24
- _pan(ctx, val, dest) {
24
+ _createStereoPanner(ctx, val, dest) {
25
25
  const p = ctx.createStereoPanner();
26
26
  p.pan.value = val;
27
27
  if (dest)
28
28
  p.connect(dest);
29
29
  return p;
30
30
  }
31
- _on(t, s, ...n) {
31
+ _scheduleNodeStartStop(t, s, ...n) {
32
32
  n.forEach((x) => {
33
33
  x.start(t);
34
34
  x.stop(s);
35
35
  });
36
36
  }
37
- _set(p, v, t) {
37
+ _setValueAtTime(p, v, t) {
38
38
  p.setValueAtTime(Math.min(22000, v), t);
39
39
  }
40
- _lin(p, v, t) {
40
+ _linearRampToValue(p, v, t) {
41
41
  p.linearRampToValueAtTime(Math.min(22000, v), t);
42
42
  }
43
- _exp(p, v, t) {
43
+ _exponentialRampToValue(p, v, t) {
44
44
  p.exponentialRampToValueAtTime(Math.min(22000, v), t);
45
45
  }
46
- _transient(ctx, type, freq, dest, time, peak, dur, atk = 0) {
47
- const g = this._gain(ctx, 0, dest);
48
- this._set(g.gain, atk > 0 ? 0 : peak, time);
46
+ _createTransient(ctx, type, freq, dest, time, peak, dur, atk = 0) {
47
+ const g = this._createGain(ctx, 0, dest);
48
+ this._setValueAtTime(g.gain, atk > 0 ? 0 : peak, time);
49
49
  if (atk > 0)
50
- this._lin(g.gain, peak, time + atk);
51
- this._exp(g.gain, 0.001, time + dur);
52
- this._on(time, time + dur, this._osc(ctx, type, freq, g));
50
+ this._linearRampToValue(g.gain, peak, time + atk);
51
+ this._exponentialRampToValue(g.gain, 0.001, time + dur);
52
+ this._scheduleNodeStartStop(time, time + dur, this._createOscillator(ctx, type, freq, g));
53
53
  }
54
- _filterSweep(ctx, type, f1, f2, t1, dur) {
55
- const f = this._filter(ctx, type);
56
- this._set(f.frequency, f1, t1);
57
- this._exp(f.frequency, f2, t1 + dur);
54
+ _createFilterSweep(ctx, type, f1, f2, t1, dur) {
55
+ const f = this._createFilter(ctx, type);
56
+ this._setValueAtTime(f.frequency, f1, t1);
57
+ this._exponentialRampToValue(f.frequency, f2, t1 + dur);
58
58
  return f;
59
59
  }
60
- _stereoOsc(ctx, type, freq, detune, pan, dest) {
60
+ _createStereoOscillator(ctx, type, freq, detune, pan, dest) {
61
61
  return [
62
- this._osc(ctx, type, freq, this._pan(ctx, -pan, dest)),
63
- this._osc(ctx, type, freq * detune, this._pan(ctx, pan, dest)),
62
+ this._createOscillator(ctx, type, freq, this._createStereoPanner(ctx, -pan, dest)),
63
+ this._createOscillator(ctx, type, freq * detune, this._createStereoPanner(ctx, pan, dest)),
64
64
  ];
65
65
  }
66
- _lfo(ctx, freq, depth, time, fadeIn, stopTime, dest, delay = 0) {
67
- const g = this._gain(ctx, 0, dest);
68
- this._set(g.gain, 0, time);
66
+ _createLFO(ctx, freq, depth, time, fadeIn, stopTime, dest, delay = 0) {
67
+ const g = this._createGain(ctx, 0, dest);
68
+ this._setValueAtTime(g.gain, 0, time);
69
69
  if (delay > 0)
70
- this._set(g.gain, 0, time + delay);
71
- this._lin(g.gain, depth, time + delay + fadeIn);
72
- this._on(time, stopTime, this._osc(ctx, 0 /* Osc.Sine */, freq, g));
70
+ this._setValueAtTime(g.gain, 0, time + delay);
71
+ this._linearRampToValue(g.gain, depth, time + delay + fadeIn);
72
+ this._scheduleNodeStartStop(time, stopTime, this._createOscillator(ctx, "sine", freq, g));
73
73
  return g;
74
74
  }
75
- _gc(ctx, time, stopTime, ...nodes) {
75
+ /**
76
+ * Schedules a delayed garbage collection using a native C++ audio thread.
77
+ *
78
+ * @reason Why we use a dummy OscillatorNode instead of setTimeout:
79
+ * The JS event loop is inherently jittery and subject to GC pauses and tab throttling.
80
+ * By scheduling a silent OscillatorNode with a precise `.stop(stopTime)`, we leverage
81
+ * the Web Audio API's C++ audio thread to trigger the `onended` callback precisely at the sample
82
+ * boundary. This guarantees that `disconnect()` is called on exhausted nodes exactly when
83
+ * they finish decaying, preventing memory leaks (stray disconnected nodes) without any JS timing overhead.
84
+ *
85
+ * @param ctx The AudioContext.
86
+ * @param time The start time of the GC lifecycle.
87
+ * @param stopTime The exact time when the audio nodes should be completely unlinked from the graph.
88
+ * @param nodes The nodes to disconnect.
89
+ */
90
+ _scheduleNodeDisposal(ctx, time, stopTime, ...nodes) {
76
91
  if (hasStrictGC) {
77
- const gcOsc = ctx.createOscillator();
92
+ const gcOsc = this._createOscillator(ctx, "sine", 0);
78
93
  gcOsc.onended = () => {
79
94
  nodes.forEach((n) => {
80
95
  try {
81
- n.disconnect();
96
+ if (n && typeof n.disconnect === "function") {
97
+ n.disconnect();
98
+ }
99
+ }
100
+ catch (e) {
101
+ // Safe swallow: Node may have been externally disconnected by Game Engine routing.
82
102
  }
83
- catch (e) { }
84
103
  });
85
104
  };
86
105
  gcOsc.start(time);
@@ -1 +1 @@
1
- {"version":3,"file":"CoreSynthBase.js","sourceRoot":"","sources":["../../Instruments/CoreSynthBase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CoreSynthBase.js","sourceRoot":"","sources":["../../Instruments/CoreSynthBase.ts"],"names":[],"mappings":"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"}
@@ -3,12 +3,19 @@ import { DecaySynthBase } from "./DecaySynthBase.js";
3
3
  * Synthesizer strategy for Inharmonic Additive bells/glass.
4
4
  * Stacks sine waves at non-integer multiples to create metallic, clanging overtones.
5
5
  */
6
+ /**
7
+ * Creates complex timbres by summing together multiple sine waves at mathematically calculated harmonic ratios.
8
+ *
9
+ * @reason Acoustic Design:
10
+ * Encapsulates the specific Web Audio node routing and ADSR parameters
11
+ * required to physically model this instrument within the 13KB limit.
12
+ */
6
13
  export declare class AdditiveSynth extends DecaySynthBase {
7
- protected _c: {
8
- v: number;
9
- a: number;
10
- d: number;
11
- m: number;
14
+ protected _envelopeConfig: {
15
+ _peakVelocity: number;
16
+ _attackTimeSeconds: number;
17
+ _decayTimeSeconds: number;
18
+ _maxDurationSeconds: number;
12
19
  };
13
20
  protected _setupSynthesis(ctx: AudioContext, masterGain: GainNode, gain: GainNode, time: number, freq: number, velocity: number, safeDuration: number, stopTime: number): AudioNode | void;
14
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AdditiveSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Decay/AdditiveSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAY,MAAM,qBAAqB,CAAC;AAG/D;;;GAGG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAC/C,SAAS,CAAC,EAAE;;;;;MAAwC;IAEpD,SAAS,CAAC,eAAe,CACvB,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,QAAQ,EACpB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,SAAS,GAAG,IAAI;CAapB"}
1
+ {"version":3,"file":"AdditiveSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Decay/AdditiveSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAY,MAAM,qBAAqB,CAAC;AAG/D;;;GAGG;AACH;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAC/C,SAAS,CAAC,eAAe;;;;;MAAuG;IAEhI,SAAS,CAAC,eAAe,CACvB,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,QAAQ,EACpB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,SAAS,GAAG,IAAI;CAapB"}
@@ -3,10 +3,17 @@ import { DecaySynthBase } from "./DecaySynthBase.js";
3
3
  * Synthesizer strategy for Inharmonic Additive bells/glass.
4
4
  * Stacks sine waves at non-integer multiples to create metallic, clanging overtones.
5
5
  */
6
+ /**
7
+ * Creates complex timbres by summing together multiple sine waves at mathematically calculated harmonic ratios.
8
+ *
9
+ * @reason Acoustic Design:
10
+ * Encapsulates the specific Web Audio node routing and ADSR parameters
11
+ * required to physically model this instrument within the 13KB limit.
12
+ */
6
13
  export class AdditiveSynth extends DecaySynthBase {
7
14
  constructor() {
8
15
  super(...arguments);
9
- this._c = { v: 0.6, a: 0.005, d: 0.5, m: 5.0 };
16
+ this._envelopeConfig = { _peakVelocity: 0.6, _attackTimeSeconds: 0.005, _decayTimeSeconds: 0.5, _maxDurationSeconds: 5.0 };
10
17
  }
11
18
  _setupSynthesis(ctx, masterGain, gain, time, freq, velocity, safeDuration, stopTime) {
12
19
  const ratios = [1.0, 2.76, 5.4, 8.9, 13.3];
@@ -16,7 +23,7 @@ export class AdditiveSynth extends DecaySynthBase {
16
23
  if (hFreq < 22000) {
17
24
  const peak = Math.max(0.001, velocity * (1 / (i + 1.5)));
18
25
  const dur = Math.max(0.1, safeDuration * decays[i]);
19
- this._transient(ctx, 0 /* Osc.Sine */, hFreq, gain, time, peak, dur, 0.005);
26
+ this._createTransient(ctx, "sine", hFreq, gain, time, peak, dur, 0.005);
20
27
  }
21
28
  });
22
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AdditiveSynth.js","sourceRoot":"","sources":["../../../Instruments/Decay/AdditiveSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAY,MAAM,qBAAqB,CAAC;AAG/D;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,cAAc;IAAjD;;QACY,OAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAwBtD,CAAC;IAtBW,eAAe,CACvB,GAAiB,EACjB,UAAoB,EACpB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,YAAoB,EACpB,QAAgB;QAEhB,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,yCAAyC;QAEnF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;YAC3B,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;gBAClB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,UAAU,CAAC,GAAG,oBAAY,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACtE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"AdditiveSynth.js","sourceRoot":"","sources":["../../../Instruments/Decay/AdditiveSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAY,MAAM,qBAAqB,CAAC;AAG/D;;;GAGG;AACH;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,cAAc;IAAjD;;QACY,oBAAe,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC;IAwBlI,CAAC;IAtBW,eAAe,CACvB,GAAiB,EACjB,UAAoB,EACpB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,YAAoB,EACpB,QAAgB;QAEhB,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,yCAAyC;QAEnF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;YAC3B,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;gBAClB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -2,11 +2,18 @@ import { AnalogSynthBase } from "../Analog/AnalogSynthBase.js";
2
2
  /**
3
3
  * Synthesizer strategy for Brass and Wind instruments with a slow filter envelope.
4
4
  */
5
+ /**
6
+ * Simulates a brass instrument (e.g. Trumpet/Trombone) using a sawtooth wave and an envelope-driven lowpass filter to mimic breath pressure.
7
+ *
8
+ * @reason Acoustic Design:
9
+ * Encapsulates the specific Web Audio node routing and ADSR parameters
10
+ * required to physically model this instrument within the 13KB limit.
11
+ */
5
12
  export declare class BrassSynth extends AnalogSynthBase {
6
- protected _c: {
7
- v: number;
8
- a: number;
9
- r: number;
13
+ protected _envelopeConfig: {
14
+ _peakVelocity: number;
15
+ _attackTimeSeconds: number;
16
+ _releaseTimeSeconds: number;
10
17
  };
11
18
  protected _setupSynthesis(ctx: AudioContext, gain: GainNode, time: number, freq: number, velocity: number, sustainTime: number, releaseTime: number, stopTime: number): AudioNode | void;
12
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BrassSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Decay/BrassSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D;;GAEG;AACH,qBAAa,UAAW,SAAQ,eAAe;IAC7C,SAAS,CAAC,EAAE;;;;MAA8B;IAE1C,SAAS,CAAC,eAAe,CACvB,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,SAAS,GAAG,IAAI;CAsBpB"}
1
+ {"version":3,"file":"BrassSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Decay/BrassSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D;;GAEG;AACH;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,eAAe;IAC7C,SAAS,CAAC,eAAe;;;;MAA6E;IAEtG,SAAS,CAAC,eAAe,CACvB,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,SAAS,GAAG,IAAI;CAsBpB"}
@@ -2,27 +2,34 @@ import { AnalogSynthBase } from "../Analog/AnalogSynthBase.js";
2
2
  /**
3
3
  * Synthesizer strategy for Brass and Wind instruments with a slow filter envelope.
4
4
  */
5
+ /**
6
+ * Simulates a brass instrument (e.g. Trumpet/Trombone) using a sawtooth wave and an envelope-driven lowpass filter to mimic breath pressure.
7
+ *
8
+ * @reason Acoustic Design:
9
+ * Encapsulates the specific Web Audio node routing and ADSR parameters
10
+ * required to physically model this instrument within the 13KB limit.
11
+ */
5
12
  export class BrassSynth extends AnalogSynthBase {
6
13
  constructor() {
7
14
  super(...arguments);
8
- this._c = { v: 0.5, a: 0.1, r: 0.1 };
15
+ this._envelopeConfig = { _peakVelocity: 0.5, _attackTimeSeconds: 0.1, _releaseTimeSeconds: 0.1 };
9
16
  }
10
17
  _setupSynthesis(ctx, gain, time, freq, velocity, sustainTime, releaseTime, stopTime) {
11
- const osc = this._osc(ctx, 1 /* Osc.Square */, 0, gain);
12
- this._set(osc.frequency, freq * 0.95, time);
13
- this._exp(osc.frequency, freq, time + 0.05);
14
- const blareGain = this._gain(ctx, 0, gain);
15
- this._set(blareGain.gain, 0, time);
16
- this._lin(blareGain.gain, Math.max(0.001, velocity * 0.25), time + 0.05);
17
- this._exp(blareGain.gain, 0.001, time + 0.2);
18
- const blare = this._osc(ctx, 2 /* Osc.Sawtooth */, freq * 2, blareGain);
19
- const filter = this._filter(ctx, 0 /* Filter.Lowpass */);
20
- this._set(filter.frequency, freq + 400, time);
21
- this._lin(filter.frequency, freq + 1500 + velocity * 1000, time + 0.1);
22
- this._exp(filter.frequency, freq + 400, time + sustainTime + releaseTime);
18
+ const osc = this._createOscillator(ctx, "square", 0, gain);
19
+ this._setValueAtTime(osc.frequency, freq * 0.95, time);
20
+ this._exponentialRampToValue(osc.frequency, freq, time + 0.05);
21
+ const blareGain = this._createGain(ctx, 0, gain);
22
+ this._setValueAtTime(blareGain.gain, 0, time);
23
+ this._linearRampToValue(blareGain.gain, Math.max(0.001, velocity * 0.25), time + 0.05);
24
+ this._exponentialRampToValue(blareGain.gain, 0.001, time + 0.2);
25
+ const blare = this._createOscillator(ctx, "sawtooth", freq * 2, blareGain);
26
+ const filter = this._createFilter(ctx, "lowpass");
27
+ this._setValueAtTime(filter.frequency, freq + 400, time);
28
+ this._linearRampToValue(filter.frequency, freq + 1500 + velocity * 1000, time + 0.1);
29
+ this._exponentialRampToValue(filter.frequency, freq + 400, time + sustainTime + releaseTime);
23
30
  gain.connect(filter);
24
- this._on(time, stopTime, osc);
25
- this._on(time, time + 0.2, blare);
31
+ this._scheduleNodeStartStop(time, stopTime, osc);
32
+ this._scheduleNodeStartStop(time, time + 0.2, blare);
26
33
  return filter;
27
34
  }
28
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BrassSynth.js","sourceRoot":"","sources":["../../../Instruments/Decay/BrassSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,eAAe;IAA/C;;QACY,OAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAiC5C,CAAC;IA/BW,eAAe,CACvB,GAAiB,EACjB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,WAAmB,EACnB,QAAgB;QAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,sBAAc,CAAC,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QAE5C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QACzE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,wBAAgB,IAAI,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QAEhE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,yBAAiB,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC;QAE1E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QAElC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"BrassSynth.js","sourceRoot":"","sources":["../../../Instruments/Decay/BrassSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D;;GAEG;AACH;;;;;;GAMG;AACH,MAAM,OAAO,UAAW,SAAQ,eAAe;IAA/C;;QACY,oBAAe,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC;IAiCxG,CAAC;IA/BW,eAAe,CACvB,GAAiB,EACjB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,WAAmB,EACnB,QAAgB;QAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QAE/D,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QACvF,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QAE3E,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;QACrF,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC;QAE7F,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QAErD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -3,12 +3,19 @@ import { DecaySynthBase } from "./DecaySynthBase.js";
3
3
  * Synthesizer strategy for Chromatic Percussion (Bells, Marimba, Vibraphone).
4
4
  * Characterized by a pure tone with a very fast attack and immediate decay.
5
5
  */
6
+ /**
7
+ * Emulates struck melodic instruments like a Glockenspiel or Marimba using rapid decay envelopes and metallic overtones.
8
+ *
9
+ * @reason Acoustic Design:
10
+ * Encapsulates the specific Web Audio node routing and ADSR parameters
11
+ * required to physically model this instrument within the 13KB limit.
12
+ */
6
13
  export declare class ChromaticPercussionSynth extends DecaySynthBase {
7
- protected _c: {
8
- v: number;
9
- a: number;
10
- d: number;
11
- m: number;
14
+ protected _envelopeConfig: {
15
+ _peakVelocity: number;
16
+ _attackTimeSeconds: number;
17
+ _decayTimeSeconds: number;
18
+ _maxDurationSeconds: number;
12
19
  };
13
20
  protected _setupSynthesis(ctx: AudioContext, masterGain: GainNode, gain: GainNode, time: number, freq: number, velocity: number, safeDuration: number, stopTime: number): AudioNode | void;
14
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ChromaticPercussionSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Decay/ChromaticPercussionSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD;;;GAGG;AACH,qBAAa,wBAAyB,SAAQ,cAAc;IAC1D,SAAS,CAAC,EAAE;;;;;MAAwC;IAEpD,SAAS,CAAC,eAAe,CACvB,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,QAAQ,EACpB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,SAAS,GAAG,IAAI;CAcpB"}
1
+ {"version":3,"file":"ChromaticPercussionSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Decay/ChromaticPercussionSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD;;;GAGG;AACH;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,cAAc;IAC1D,SAAS,CAAC,eAAe;;;;;MAAuG;IAEhI,SAAS,CAAC,eAAe,CACvB,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,QAAQ,EACpB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,SAAS,GAAG,IAAI;CAcpB"}