rlo-engine 1.0.3

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 (154) hide show
  1. package/README.md +493 -0
  2. package/dist/AudioEffects.d.ts +16 -0
  3. package/dist/AudioEffects.d.ts.map +1 -0
  4. package/dist/AudioEffects.js +41 -0
  5. package/dist/AudioEffects.js.map +1 -0
  6. package/dist/Instruments/Analog/AnalogSynthBase.d.ts +22 -0
  7. package/dist/Instruments/Analog/AnalogSynthBase.d.ts.map +1 -0
  8. package/dist/Instruments/Analog/AnalogSynthBase.js +30 -0
  9. package/dist/Instruments/Analog/AnalogSynthBase.js.map +1 -0
  10. package/dist/Instruments/Analog/BassSynth.d.ts +14 -0
  11. package/dist/Instruments/Analog/BassSynth.d.ts.map +1 -0
  12. package/dist/Instruments/Analog/BassSynth.js +25 -0
  13. package/dist/Instruments/Analog/BassSynth.js.map +1 -0
  14. package/dist/Instruments/Analog/ChiptuneSynth.d.ts +14 -0
  15. package/dist/Instruments/Analog/ChiptuneSynth.d.ts.map +1 -0
  16. package/dist/Instruments/Analog/ChiptuneSynth.js +19 -0
  17. package/dist/Instruments/Analog/ChiptuneSynth.js.map +1 -0
  18. package/dist/Instruments/Analog/FMSynth.d.ts +15 -0
  19. package/dist/Instruments/Analog/FMSynth.d.ts.map +1 -0
  20. package/dist/Instruments/Analog/FMSynth.js +23 -0
  21. package/dist/Instruments/Analog/FMSynth.js.map +1 -0
  22. package/dist/Instruments/Analog/FormantSynth.d.ts +14 -0
  23. package/dist/Instruments/Analog/FormantSynth.d.ts.map +1 -0
  24. package/dist/Instruments/Analog/FormantSynth.js +26 -0
  25. package/dist/Instruments/Analog/FormantSynth.js.map +1 -0
  26. package/dist/Instruments/Analog/LeadSynth.d.ts +13 -0
  27. package/dist/Instruments/Analog/LeadSynth.d.ts.map +1 -0
  28. package/dist/Instruments/Analog/LeadSynth.js +21 -0
  29. package/dist/Instruments/Analog/LeadSynth.js.map +1 -0
  30. package/dist/Instruments/Analog/OrganSynth.d.ts +13 -0
  31. package/dist/Instruments/Analog/OrganSynth.d.ts.map +1 -0
  32. package/dist/Instruments/Analog/OrganSynth.js +24 -0
  33. package/dist/Instruments/Analog/OrganSynth.js.map +1 -0
  34. package/dist/Instruments/Analog/PadSynth.d.ts +14 -0
  35. package/dist/Instruments/Analog/PadSynth.d.ts.map +1 -0
  36. package/dist/Instruments/Analog/PadSynth.js +22 -0
  37. package/dist/Instruments/Analog/PadSynth.js.map +1 -0
  38. package/dist/Instruments/Analog/ReeseBassSynth.d.ts +14 -0
  39. package/dist/Instruments/Analog/ReeseBassSynth.d.ts.map +1 -0
  40. package/dist/Instruments/Analog/ReeseBassSynth.js +22 -0
  41. package/dist/Instruments/Analog/ReeseBassSynth.js.map +1 -0
  42. package/dist/Instruments/Analog/StringSynth.d.ts +13 -0
  43. package/dist/Instruments/Analog/StringSynth.d.ts.map +1 -0
  44. package/dist/Instruments/Analog/StringSynth.js +19 -0
  45. package/dist/Instruments/Analog/StringSynth.js.map +1 -0
  46. package/dist/Instruments/Analog/WoodwindSynth.d.ts +14 -0
  47. package/dist/Instruments/Analog/WoodwindSynth.d.ts.map +1 -0
  48. package/dist/Instruments/Analog/WoodwindSynth.js +35 -0
  49. package/dist/Instruments/Analog/WoodwindSynth.js.map +1 -0
  50. package/dist/Instruments/CoreSynthBase.d.ts +29 -0
  51. package/dist/Instruments/CoreSynthBase.d.ts.map +1 -0
  52. package/dist/Instruments/CoreSynthBase.js +91 -0
  53. package/dist/Instruments/CoreSynthBase.js.map +1 -0
  54. package/dist/Instruments/Decay/AdditiveSynth.d.ts +15 -0
  55. package/dist/Instruments/Decay/AdditiveSynth.d.ts.map +1 -0
  56. package/dist/Instruments/Decay/AdditiveSynth.js +24 -0
  57. package/dist/Instruments/Decay/AdditiveSynth.js.map +1 -0
  58. package/dist/Instruments/Decay/BrassSynth.d.ts +13 -0
  59. package/dist/Instruments/Decay/BrassSynth.d.ts.map +1 -0
  60. package/dist/Instruments/Decay/BrassSynth.js +29 -0
  61. package/dist/Instruments/Decay/BrassSynth.js.map +1 -0
  62. package/dist/Instruments/Decay/ChromaticPercussionSynth.d.ts +15 -0
  63. package/dist/Instruments/Decay/ChromaticPercussionSynth.d.ts.map +1 -0
  64. package/dist/Instruments/Decay/ChromaticPercussionSynth.js +23 -0
  65. package/dist/Instruments/Decay/ChromaticPercussionSynth.js.map +1 -0
  66. package/dist/Instruments/Decay/DecaySynthBase.d.ts +23 -0
  67. package/dist/Instruments/Decay/DecaySynthBase.d.ts.map +1 -0
  68. package/dist/Instruments/Decay/DecaySynthBase.js +35 -0
  69. package/dist/Instruments/Decay/DecaySynthBase.js.map +1 -0
  70. package/dist/Instruments/Decay/ElectricGuitarSynth.d.ts +15 -0
  71. package/dist/Instruments/Decay/ElectricGuitarSynth.d.ts.map +1 -0
  72. package/dist/Instruments/Decay/ElectricGuitarSynth.js +31 -0
  73. package/dist/Instruments/Decay/ElectricGuitarSynth.js.map +1 -0
  74. package/dist/Instruments/Decay/EthnicSynth.d.ts +15 -0
  75. package/dist/Instruments/Decay/EthnicSynth.d.ts.map +1 -0
  76. package/dist/Instruments/Decay/EthnicSynth.js +21 -0
  77. package/dist/Instruments/Decay/EthnicSynth.js.map +1 -0
  78. package/dist/Instruments/Decay/GuitarSynth.d.ts +14 -0
  79. package/dist/Instruments/Decay/GuitarSynth.d.ts.map +1 -0
  80. package/dist/Instruments/Decay/GuitarSynth.js +23 -0
  81. package/dist/Instruments/Decay/GuitarSynth.js.map +1 -0
  82. package/dist/Instruments/Decay/KarplusSynth.d.ts +10 -0
  83. package/dist/Instruments/Decay/KarplusSynth.d.ts.map +1 -0
  84. package/dist/Instruments/Decay/KarplusSynth.js +34 -0
  85. package/dist/Instruments/Decay/KarplusSynth.js.map +1 -0
  86. package/dist/Instruments/Decay/PianoSynth.d.ts +14 -0
  87. package/dist/Instruments/Decay/PianoSynth.d.ts.map +1 -0
  88. package/dist/Instruments/Decay/PianoSynth.js +32 -0
  89. package/dist/Instruments/Decay/PianoSynth.js.map +1 -0
  90. package/dist/Instruments/Decay/SlapBassSynth.d.ts +15 -0
  91. package/dist/Instruments/Decay/SlapBassSynth.d.ts.map +1 -0
  92. package/dist/Instruments/Decay/SlapBassSynth.js +28 -0
  93. package/dist/Instruments/Decay/SlapBassSynth.js.map +1 -0
  94. package/dist/Instruments/ISynthInstrument.d.ts +16 -0
  95. package/dist/Instruments/ISynthInstrument.d.ts.map +1 -0
  96. package/dist/Instruments/ISynthInstrument.js +2 -0
  97. package/dist/Instruments/ISynthInstrument.js.map +1 -0
  98. package/dist/Instruments/InstrumentFactory.d.ts +2 -0
  99. package/dist/Instruments/InstrumentFactory.d.ts.map +1 -0
  100. package/dist/Instruments/InstrumentFactory.js +4 -0
  101. package/dist/Instruments/InstrumentFactory.js.map +1 -0
  102. package/dist/Instruments/Speciality/DrumSynth.d.ts +11 -0
  103. package/dist/Instruments/Speciality/DrumSynth.d.ts.map +1 -0
  104. package/dist/Instruments/Speciality/DrumSynth.js +61 -0
  105. package/dist/Instruments/Speciality/DrumSynth.js.map +1 -0
  106. package/dist/Instruments/Speciality/SoundEffectsSynth.d.ts +12 -0
  107. package/dist/Instruments/Speciality/SoundEffectsSynth.d.ts.map +1 -0
  108. package/dist/Instruments/Speciality/SoundEffectsSynth.js +27 -0
  109. package/dist/Instruments/Speciality/SoundEffectsSynth.js.map +1 -0
  110. package/dist/Instruments/Synthesizer.d.ts +15 -0
  111. package/dist/Instruments/Synthesizer.d.ts.map +1 -0
  112. package/dist/Instruments/Synthesizer.js +27 -0
  113. package/dist/Instruments/Synthesizer.js.map +1 -0
  114. package/dist/RLO-Player.d.ts +298 -0
  115. package/dist/RLO-Player.d.ts.map +1 -0
  116. package/dist/RLO-Player.js +724 -0
  117. package/dist/RLO-Player.js.map +1 -0
  118. package/dist/RLO-Transpiler.d.ts +22 -0
  119. package/dist/RLO-Transpiler.d.ts.map +1 -0
  120. package/dist/RLO-Transpiler.js +133 -0
  121. package/dist/RLO-Transpiler.js.map +1 -0
  122. package/dist/compiler.d.ts +40 -0
  123. package/dist/compiler.d.ts.map +1 -0
  124. package/dist/compiler.js +268 -0
  125. package/dist/compiler.js.map +1 -0
  126. package/dist/crush.d.ts +9 -0
  127. package/dist/crush.d.ts.map +1 -0
  128. package/dist/crush.js +20 -0
  129. package/dist/crush.js.map +1 -0
  130. package/dist/index.d.ts +36 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +59 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/midi-parser.d.ts +10 -0
  135. package/dist/midi-parser.d.ts.map +1 -0
  136. package/dist/midi-parser.js +130 -0
  137. package/dist/midi-parser.js.map +1 -0
  138. package/dist/rlo-engine.min.js +655 -0
  139. package/dist/rlo-engine.min.js.map +1 -0
  140. package/dist/rlo-engine.min.umd.js +2 -0
  141. package/dist/rlo-engine.min.umd.js.map +1 -0
  142. package/dist/types.d.ts +16 -0
  143. package/dist/types.d.ts.map +1 -0
  144. package/dist/types.js +7 -0
  145. package/dist/types.js.map +1 -0
  146. package/dist/vite.config.d.ts +7 -0
  147. package/dist/vite.config.d.ts.map +1 -0
  148. package/dist/vite.config.js +244 -0
  149. package/dist/vite.config.js.map +1 -0
  150. package/dist/vite.config.js13k.d.ts +7 -0
  151. package/dist/vite.config.js13k.d.ts.map +1 -0
  152. package/dist/vite.config.js13k.js +72 -0
  153. package/dist/vite.config.js13k.js.map +1 -0
  154. package/package.json +50 -0
@@ -0,0 +1,25 @@
1
+ import { DecaySynthBase } from "../Decay/DecaySynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for deep Bass instruments using sawtooth waves.
4
+ */
5
+ export class BassSynth extends DecaySynthBase {
6
+ constructor() {
7
+ super(...arguments);
8
+ this._c = { v: 0.8, a: 0.05, d: 0.1, m: 4.0 };
9
+ }
10
+ _setupSynthesis(ctx, masterGain, gain, time, freq, velocity, safeDuration, stopTime) {
11
+ /** Deep envelope sweep for punchy, muffled bass attack. Capped safely below Nyquist. */
12
+ const filter = this._filterSweep(ctx, 0 /* Filter.Lowpass */, 300 + velocity * 500, 100, time, safeDuration);
13
+ const osc = this._osc(ctx, 2 /* Osc.Sawtooth */, 0, gain);
14
+ this._set(osc.frequency, freq * 0.92, time);
15
+ this._exp(osc.frequency, freq, time + 0.04);
16
+ const subGain = this._gain(ctx, 0.6, gain);
17
+ const subOsc = this._osc(ctx, 0 /* Osc.Sine */, 0, subGain);
18
+ this._set(subOsc.frequency, (freq / 2) * 0.92, time);
19
+ this._exp(subOsc.frequency, freq / 2, time + 0.04);
20
+ gain.connect(filter);
21
+ this._on(time, stopTime, osc, subOsc);
22
+ return filter;
23
+ }
24
+ }
25
+ //# sourceMappingURL=BassSynth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BassSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/BassSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5D;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,cAAc;IAA7C;;QACY,OAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAqCrD,CAAC;IAnCW,eAAe,CACvB,GAAiB,EACjB,UAAoB,EACpB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,YAAoB,EACpB,QAAgB;QAEhB,wFAAwF;QACxF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAC9B,GAAG,0BAEH,GAAG,GAAG,QAAQ,GAAG,GAAG,EACpB,GAAG,EACH,IAAI,EACJ,YAAY,CACb,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,wBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,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,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,oBAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QAEnD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAErB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAEtC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for 8-bit Chiptune sounds.
4
+ * Uses a raw square wave with a rapid pitch-drop "blip" attack.
5
+ */
6
+ export declare class ChiptuneSynth extends AnalogSynthBase {
7
+ protected _c: {
8
+ v: number;
9
+ a: number;
10
+ r: number;
11
+ };
12
+ protected _setupSynthesis(ctx: AudioContext, gain: GainNode, time: number, freq: number, velocity: number, sustainTime: number, releaseTime: number, stopTime: number): AudioNode | void;
13
+ }
14
+ //# sourceMappingURL=ChiptuneSynth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChiptuneSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Analog/ChiptuneSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,sBAAsB,CAAC;AAGlE;;;GAGG;AACH,qBAAa,aAAc,SAAQ,eAAe;IAChD,SAAS,CAAC,EAAE;;;;MAAiC;IAE7C,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;CASpB"}
@@ -0,0 +1,19 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for 8-bit Chiptune sounds.
4
+ * Uses a raw square wave with a rapid pitch-drop "blip" attack.
5
+ */
6
+ export class ChiptuneSynth extends AnalogSynthBase {
7
+ constructor() {
8
+ super(...arguments);
9
+ this._c = { v: 0.4, a: 0.005, r: 0.05 };
10
+ }
11
+ _setupSynthesis(ctx, gain, time, freq, velocity, sustainTime, releaseTime, stopTime) {
12
+ const osc = this._osc(ctx, 1 /* Osc.Square */, 0, gain);
13
+ /** Classic tracker "blip" attack: starts one octave higher for a fraction of a second */
14
+ this._set(osc.frequency, freq * 2, time);
15
+ this._set(osc.frequency, freq, time + 0.02);
16
+ this._on(time, stopTime, osc);
17
+ }
18
+ }
19
+ //# sourceMappingURL=ChiptuneSynth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChiptuneSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/ChiptuneSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,sBAAsB,CAAC;AAGlE;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,eAAe;IAAlD;;QACY,OAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;IAoB/C,CAAC;IAlBW,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;QAEhD,yFAAyF;QACzF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QAE5C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for FM (Frequency Modulation).
4
+ * Modulates a carrier sine wave with another sine wave to create glassy,
5
+ * metallic overtones common in 1980s Electric Pianos and Bells.
6
+ */
7
+ export declare class FMSynth extends AnalogSynthBase {
8
+ protected _c: {
9
+ v: number;
10
+ a: number;
11
+ r: number;
12
+ };
13
+ protected _setupSynthesis(ctx: AudioContext, gain: GainNode, time: number, freq: number, velocity: number, sustainTime: number, releaseTime: number, stopTime: number): AudioNode | void;
14
+ }
15
+ //# sourceMappingURL=FMSynth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FMSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Analog/FMSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,sBAAsB,CAAC;AAGlE;;;;GAIG;AACH,qBAAa,OAAQ,SAAQ,eAAe;IAC1C,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;CAcpB"}
@@ -0,0 +1,23 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for FM (Frequency Modulation).
4
+ * Modulates a carrier sine wave with another sine wave to create glassy,
5
+ * metallic overtones common in 1980s Electric Pianos and Bells.
6
+ */
7
+ export class FMSynth extends AnalogSynthBase {
8
+ constructor() {
9
+ super(...arguments);
10
+ this._c = { v: 0.6, a: 0.01, r: 0.1 };
11
+ }
12
+ _setupSynthesis(ctx, gain, time, freq, velocity, sustainTime, releaseTime, stopTime) {
13
+ const carrier = this._osc(ctx, 0 /* Osc.Sine */, freq, gain);
14
+ const modFreq = freq * 2; // 2:1 harmonic ratio for bell/epiano overtones
15
+ const modDepth = modFreq * 4; // Modulation index (brightness)
16
+ const modGain = this._gain(ctx, 0, carrier.frequency);
17
+ this._set(modGain.gain, modDepth * velocity, time);
18
+ this._exp(modGain.gain, 0.01, time + sustainTime); // Decay the harshness over time for a plucked feel
19
+ const modulator = this._osc(ctx, 0 /* Osc.Sine */, modFreq, modGain);
20
+ this._on(time, stopTime, carrier, modulator);
21
+ }
22
+ }
23
+ //# sourceMappingURL=FMSynth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FMSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/FMSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,sBAAsB,CAAC;AAGlE;;;;GAIG;AACH,MAAM,OAAO,OAAQ,SAAQ,eAAe;IAA5C;;QACY,OAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAyB7C,CAAC;IAvBW,eAAe,CACvB,GAAiB,EACjB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,WAAmB,EACnB,QAAgB;QAEhB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,oBAAY,IAAI,EAAE,IAAI,CAAC,CAAC;QAErD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,+CAA+C;QACzE,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,gCAAgC;QAE9D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,mDAAmD;QAEtG,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,oBAAY,OAAO,EAAE,OAAO,CAAC,CAAC;QAE7D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for Formant Choirs (Human Vox).
4
+ * Uses parallel bandpass filters locked to specific "vowel" resonant frequencies.
5
+ */
6
+ export declare class FormantSynth extends AnalogSynthBase {
7
+ protected _c: {
8
+ v: number;
9
+ a: number;
10
+ r: number;
11
+ };
12
+ protected _setupSynthesis(ctx: AudioContext, gain: GainNode, time: number, freq: number, velocity: number, sustainTime: number, releaseTime: number, stopTime: number): AudioNode | void;
13
+ }
14
+ //# sourceMappingURL=FormantSynth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormantSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Analog/FormantSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,sBAAsB,CAAC;AAGlE;;;GAGG;AACH,qBAAa,YAAa,SAAQ,eAAe;IAC/C,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;CAgBpB"}
@@ -0,0 +1,26 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for Formant Choirs (Human Vox).
4
+ * Uses parallel bandpass filters locked to specific "vowel" resonant frequencies.
5
+ */
6
+ export class FormantSynth extends AnalogSynthBase {
7
+ constructor() {
8
+ super(...arguments);
9
+ this._c = { v: 0.8, a: 0.1, r: 0.4 };
10
+ }
11
+ _setupSynthesis(ctx, gain, time, freq, velocity, sustainTime, releaseTime, stopTime) {
12
+ const osc = this._osc(ctx, 2 /* Osc.Sawtooth */, freq);
13
+ this._lfo(ctx, 5, freq * 0.015, time, 0.2, stopTime, osc.frequency);
14
+ // Typical 'Ah' vowel formants: 730Hz, 1090Hz, 2440Hz
15
+ [730, 1090, 2440].forEach((f) => {
16
+ if (f < 22000) {
17
+ const filter = this._filter(ctx, 2 /* Filter.Bandpass */);
18
+ filter.frequency.value = f;
19
+ filter.Q.value = 12; // High resonance to isolate the formant
20
+ osc.connect(filter).connect(gain);
21
+ }
22
+ });
23
+ this._on(time, stopTime, osc);
24
+ }
25
+ }
26
+ //# sourceMappingURL=FormantSynth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormantSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/FormantSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,sBAAsB,CAAC;AAGlE;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,eAAe;IAAjD;;QACY,OAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IA2B5C,CAAC;IAzBW,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,wBAAgB,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAEpE,qDAAqD;QACrD,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9B,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;gBACd,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,0BAAkB,CAAC;gBAClD,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;gBAC3B,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,wCAAwC;gBAC7D,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for Synth Leads featuring an LFO Vibrato.
4
+ */
5
+ export declare class LeadSynth extends AnalogSynthBase {
6
+ protected _c: {
7
+ v: number;
8
+ a: number;
9
+ r: number;
10
+ };
11
+ protected _setupSynthesis(ctx: AudioContext, gain: GainNode, time: number, freq: number, velocity: number, sustainTime: number, releaseTime: number, stopTime: number): AudioNode | void;
12
+ }
13
+ //# sourceMappingURL=LeadSynth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LeadSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Analog/LeadSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;GAEG;AACH,qBAAa,SAAU,SAAQ,eAAe;IAC5C,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;CAqBpB"}
@@ -0,0 +1,21 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for Synth Leads featuring an LFO Vibrato.
4
+ */
5
+ export class LeadSynth extends AnalogSynthBase {
6
+ constructor() {
7
+ super(...arguments);
8
+ this._c = { v: 0.4, a: 0.05, r: 0.1 };
9
+ }
10
+ _setupSynthesis(ctx, gain, time, freq, velocity, sustainTime, releaseTime, stopTime) {
11
+ const osc = this._osc(ctx, 2 /* Osc.Sawtooth */, 0);
12
+ this._set(osc.frequency, freq, time);
13
+ this._lfo(ctx, 5, freq * 0.02, time, 0.2, stopTime, osc.frequency);
14
+ const filter = this._filterSweep(ctx, 0 /* Filter.Lowpass */, freq, freq * 3, time, 0.05);
15
+ this._exp(filter.frequency, freq * 1.5, time + sustainTime);
16
+ filter.Q.value = 3; /** Squelchy resonance */
17
+ osc.connect(filter).connect(gain);
18
+ this._on(time, stopTime, osc);
19
+ }
20
+ }
21
+ //# sourceMappingURL=LeadSynth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LeadSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/LeadSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,eAAe;IAA9C;;QACY,OAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAgC7C,CAAC;IA9BW,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,wBAAgB,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAErC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAC9B,GAAG,0BAEH,IAAI,EACJ,IAAI,GAAG,CAAC,EACR,IAAI,EACJ,IAAI,CACL,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC;QAC5D,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,yBAAyB;QAE7C,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for Organs using additive sine waves.
4
+ */
5
+ export declare class OrganSynth extends AnalogSynthBase {
6
+ protected _c: {
7
+ v: number;
8
+ a: number;
9
+ r: number;
10
+ };
11
+ protected _setupSynthesis(ctx: AudioContext, gain: GainNode, time: number, freq: number, velocity: number, sustainTime: number, releaseTime: number, stopTime: number): AudioNode | void;
12
+ }
13
+ //# sourceMappingURL=OrganSynth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Analog/OrganSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,sBAAsB,CAAC;AAGlE;;GAEG;AACH,qBAAa,UAAW,SAAQ,eAAe;IAC7C,SAAS,CAAC,EAAE;;;;MAAgC;IAE5C,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;CA0BpB"}
@@ -0,0 +1,24 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for Organs using additive sine waves.
4
+ */
5
+ export class OrganSynth extends AnalogSynthBase {
6
+ constructor() {
7
+ super(...arguments);
8
+ this._c = { v: 0.4, a: 0.01, r: 0.05 };
9
+ }
10
+ _setupSynthesis(ctx, gain, time, freq, velocity, sustainTime, releaseTime, stopTime) {
11
+ const osc1 = this._osc(ctx, 0 /* Osc.Sine */, freq, gain);
12
+ const gain2 = this._gain(ctx, 0.5, gain);
13
+ const osc2 = this._osc(ctx, 0 /* Osc.Sine */, freq * 2, gain2);
14
+ const gain3 = this._gain(ctx, 0.25, gain);
15
+ const osc3 = this._osc(ctx, 0 /* Osc.Sine */, freq * 3, gain3);
16
+ const rotaryNode = this._gain(ctx, 0.7);
17
+ this._lfo(ctx, 6.5, 0.3, time, 0, stopTime, rotaryNode.gain);
18
+ gain.connect(rotaryNode);
19
+ this._transient(ctx, 1 /* Osc.Square */, 4000, rotaryNode, time, Math.max(0.001, velocity * 0.1), 0.015);
20
+ this._on(time, stopTime, osc1, osc2, osc3);
21
+ return rotaryNode;
22
+ }
23
+ }
24
+ //# sourceMappingURL=OrganSynth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/OrganSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,sBAAsB,CAAC;AAGlE;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,eAAe;IAA/C;;QACY,OAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;IAqC9C,CAAC;IAnCW,eAAe,CACvB,GAAiB,EACjB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,WAAmB,EACnB,QAAgB;QAEhB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,oBAAY,IAAI,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,oBAAY,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,oBAAY,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAEvD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAE7D,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAEzB,IAAI,CAAC,UAAU,CACb,GAAG,sBAEH,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,EAC/B,KAAK,CACN,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE3C,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for Synth Pads (Warm, Choir, Halo, Bowed).
4
+ * Characterized by slow attacks, slow releases, and evolving filter sweeps.
5
+ */
6
+ export declare class PadSynth extends AnalogSynthBase {
7
+ protected _cfg(d: number): {
8
+ v: number;
9
+ a: number;
10
+ r: number;
11
+ };
12
+ protected _setupSynthesis(ctx: AudioContext, gain: GainNode, time: number, freq: number, velocity: number, sustainTime: number, releaseTime: number, stopTime: number): AudioNode | void;
13
+ }
14
+ //# sourceMappingURL=PadSynth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PadSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Analog/PadSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;;GAGG;AACH,qBAAa,QAAS,SAAQ,eAAe;IAC3C,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAI9D,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;CA2BpB"}
@@ -0,0 +1,22 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for Synth Pads (Warm, Choir, Halo, Bowed).
4
+ * Characterized by slow attacks, slow releases, and evolving filter sweeps.
5
+ */
6
+ export class PadSynth extends AnalogSynthBase {
7
+ _cfg(d) {
8
+ return { v: 0.4, a: d < 0.4 ? 0.05 : 0.3, r: d < 0.4 ? 0.1 : 0.8 };
9
+ }
10
+ _setupSynthesis(ctx, gain, time, freq, velocity, sustainTime, releaseTime, stopTime) {
11
+ const [osc1, osc2] = this._stereoOsc(ctx, 3 /* Osc.Triangle */, freq, 1.01, 0.7, gain);
12
+ const filter = this._filter(ctx, 0 /* Filter.Lowpass */);
13
+ this._set(filter.frequency, freq + 400, time);
14
+ this._lin(filter.frequency, freq + 1000 + velocity * 500, time + sustainTime);
15
+ this._lfo(ctx, 0.5, 10, time, 0, stopTime, osc2.frequency);
16
+ this._lfo(ctx, 0.1, 400, time, 0, stopTime, filter.frequency);
17
+ gain.connect(filter);
18
+ this._on(time, stopTime, osc1, osc2);
19
+ return filter;
20
+ }
21
+ }
22
+ //# sourceMappingURL=PadSynth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PadSynth.js","sourceRoot":"","sources":["../../../Instruments/Analog/PadSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;;GAGG;AACH,MAAM,OAAO,QAAS,SAAQ,eAAe;IACjC,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,IAAI,EACJ,GAAG,EACH,IAAI,CACL,CAAC;QAEF,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,CACP,MAAM,CAAC,SAAS,EAChB,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,GAAG,EAC5B,IAAI,GAAG,WAAW,CACnB,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAE9D,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"}
@@ -0,0 +1,14 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for Reese/Wobble Bass.
4
+ * Uses heavily detuned sawtooths and an LFO-driven lowpass filter.
5
+ */
6
+ export declare class ReeseBassSynth extends AnalogSynthBase {
7
+ protected _c: {
8
+ v: number;
9
+ a: number;
10
+ r: number;
11
+ };
12
+ protected _setupSynthesis(ctx: AudioContext, gain: GainNode, time: number, freq: number, velocity: number, sustainTime: number, releaseTime: number, stopTime: number): AudioNode | void;
13
+ }
14
+ //# sourceMappingURL=ReeseBassSynth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReeseBassSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Analog/ReeseBassSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,sBAAsB,CAAC;AAGlE;;;GAGG;AACH,qBAAa,cAAe,SAAQ,eAAe;IACjD,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;CAmBpB"}
@@ -0,0 +1,22 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for Reese/Wobble Bass.
4
+ * Uses heavily detuned sawtooths and an LFO-driven lowpass filter.
5
+ */
6
+ export class ReeseBassSynth extends AnalogSynthBase {
7
+ constructor() {
8
+ super(...arguments);
9
+ this._c = { v: 0.7, a: 0.05, r: 0.2 };
10
+ }
11
+ _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);
14
+ // 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);
16
+ // Deep, phasing detune
17
+ const [osc1, osc2] = this._stereoOsc(ctx, 2 /* Osc.Sawtooth */, freq / 2, 1.015, 0.4, filter);
18
+ filter.connect(gain);
19
+ this._on(time, stopTime, osc1, osc2);
20
+ }
21
+ }
22
+ //# sourceMappingURL=ReeseBassSynth.js.map
@@ -0,0 +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"}
@@ -0,0 +1,13 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for String and Pad instruments using detuned oscillators.
4
+ */
5
+ export declare class StringSynth extends AnalogSynthBase {
6
+ protected _cfg(d: number): {
7
+ v: number;
8
+ a: number;
9
+ r: number;
10
+ };
11
+ protected _setupSynthesis(ctx: AudioContext, gain: GainNode, time: number, freq: number, velocity: number, sustainTime: number, releaseTime: number, stopTime: number): AudioNode | void;
12
+ }
13
+ //# sourceMappingURL=StringSynth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StringSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Analog/StringSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;GAEG;AACH,qBAAa,WAAY,SAAQ,eAAe;IAC9C,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAI9D,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;CAoCpB"}
@@ -0,0 +1,19 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for String and Pad instruments using detuned oscillators.
4
+ */
5
+ export class StringSynth extends AnalogSynthBase {
6
+ _cfg(d) {
7
+ return { v: 0.3, a: d < 0.4 ? 0.05 : 0.2, r: d < 0.4 ? 0.1 : 0.5 };
8
+ }
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);
12
+ lfo.connect(osc2.frequency);
13
+ const filter = this._filterSweep(ctx, 0 /* Filter.Lowpass */, freq + 1200 + velocity * 1000, freq + 800, time, sustainTime + releaseTime);
14
+ gain.connect(filter);
15
+ this._on(time, stopTime, osc1, osc2);
16
+ return filter;
17
+ }
18
+ }
19
+ //# sourceMappingURL=StringSynth.js.map
@@ -0,0 +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"}
@@ -0,0 +1,14 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for Woodwinds and Pipes (Flute, Piccolo, Recorder, Ocarina).
4
+ * Characterized by a pure, hollow, and breathy tone using sine and triangle waves.
5
+ */
6
+ export declare class WoodwindSynth extends AnalogSynthBase {
7
+ protected _c: {
8
+ v: number;
9
+ a: number;
10
+ r: number;
11
+ };
12
+ protected _setupSynthesis(ctx: AudioContext, gain: GainNode, time: number, freq: number, velocity: number, sustainTime: number, releaseTime: number, stopTime: number): AudioNode | void;
13
+ }
14
+ //# sourceMappingURL=WoodwindSynth.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,35 @@
1
+ import { AnalogSynthBase } from "./AnalogSynthBase.js";
2
+ /**
3
+ * Synthesizer strategy for Woodwinds and Pipes (Flute, Piccolo, Recorder, Ocarina).
4
+ * Characterized by a pure, hollow, and breathy tone using sine and triangle waves.
5
+ */
6
+ export class WoodwindSynth extends AnalogSynthBase {
7
+ constructor() {
8
+ super(...arguments);
9
+ this._c = { v: 0.7, a: 0.05, r: 0.1 };
10
+ }
11
+ _setupSynthesis(ctx, gain, time, freq, velocity, sustainTime, releaseTime, stopTime) {
12
+ /** 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);
14
+ /** Triangle is mixed much lower just to provide a bit of upper harmonic texture */
15
+ const triGain = this._gain(ctx, 0, gain);
16
+ /** 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);
20
+ /** 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);
23
+ /** 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);
25
+ vibrato.connect(osc2.frequency);
26
+ /** 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);
29
+ vibrato.connect(tremoloDepth);
30
+ gain.connect(tremoloNode).connect(filter);
31
+ this._on(time, stopTime, osc1, osc2);
32
+ return filter;
33
+ }
34
+ }
35
+ //# sourceMappingURL=WoodwindSynth.js.map
@@ -0,0 +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"}
@@ -0,0 +1,29 @@
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
+ }
13
+ export declare abstract class CoreSynthBase implements ISynthInstrument {
14
+ 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;
28
+ }
29
+ //# sourceMappingURL=CoreSynthBase.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,91 @@
1
+ const hasStrictGC = typeof __ENABLE_STRICT_GC__ !== "undefined" ? __ENABLE_STRICT_GC__ : true;
2
+ export class CoreSynthBase {
3
+ _osc(ctx, type, freq, dest) {
4
+ const o = ctx.createOscillator();
5
+ o.type = ["sine", "square", "sawtooth", "triangle"][type];
6
+ if (freq)
7
+ o.frequency.value = Math.min(22000, freq);
8
+ if (dest)
9
+ o.connect(dest);
10
+ return o;
11
+ }
12
+ _gain(ctx, val, dest) {
13
+ const g = ctx.createGain();
14
+ g.gain.value = val;
15
+ if (dest)
16
+ g.connect(dest);
17
+ return g;
18
+ }
19
+ _filter(ctx, type) {
20
+ const f = ctx.createBiquadFilter();
21
+ f.type = ["lowpass", "highpass", "bandpass"][type];
22
+ return f;
23
+ }
24
+ _pan(ctx, val, dest) {
25
+ const p = ctx.createStereoPanner();
26
+ p.pan.value = val;
27
+ if (dest)
28
+ p.connect(dest);
29
+ return p;
30
+ }
31
+ _on(t, s, ...n) {
32
+ n.forEach((x) => {
33
+ x.start(t);
34
+ x.stop(s);
35
+ });
36
+ }
37
+ _set(p, v, t) {
38
+ p.setValueAtTime(Math.min(22000, v), t);
39
+ }
40
+ _lin(p, v, t) {
41
+ p.linearRampToValueAtTime(Math.min(22000, v), t);
42
+ }
43
+ _exp(p, v, t) {
44
+ p.exponentialRampToValueAtTime(Math.min(22000, v), t);
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);
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));
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);
58
+ return f;
59
+ }
60
+ _stereoOsc(ctx, type, freq, detune, pan, dest) {
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)),
64
+ ];
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);
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));
73
+ return g;
74
+ }
75
+ _gc(ctx, time, stopTime, ...nodes) {
76
+ if (hasStrictGC) {
77
+ const gcOsc = ctx.createOscillator();
78
+ gcOsc.onended = () => {
79
+ nodes.forEach((n) => {
80
+ try {
81
+ n.disconnect();
82
+ }
83
+ catch (e) { }
84
+ });
85
+ };
86
+ gcOsc.start(time);
87
+ gcOsc.stop(stopTime);
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=CoreSynthBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoreSynthBase.js","sourceRoot":"","sources":["../../Instruments/CoreSynthBase.ts"],"names":[],"mappings":"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"}