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.
- package/README.md +493 -0
- package/dist/AudioEffects.d.ts +16 -0
- package/dist/AudioEffects.d.ts.map +1 -0
- package/dist/AudioEffects.js +41 -0
- package/dist/AudioEffects.js.map +1 -0
- package/dist/Instruments/Analog/AnalogSynthBase.d.ts +22 -0
- package/dist/Instruments/Analog/AnalogSynthBase.d.ts.map +1 -0
- package/dist/Instruments/Analog/AnalogSynthBase.js +30 -0
- package/dist/Instruments/Analog/AnalogSynthBase.js.map +1 -0
- package/dist/Instruments/Analog/BassSynth.d.ts +14 -0
- package/dist/Instruments/Analog/BassSynth.d.ts.map +1 -0
- package/dist/Instruments/Analog/BassSynth.js +25 -0
- package/dist/Instruments/Analog/BassSynth.js.map +1 -0
- package/dist/Instruments/Analog/ChiptuneSynth.d.ts +14 -0
- package/dist/Instruments/Analog/ChiptuneSynth.d.ts.map +1 -0
- package/dist/Instruments/Analog/ChiptuneSynth.js +19 -0
- package/dist/Instruments/Analog/ChiptuneSynth.js.map +1 -0
- package/dist/Instruments/Analog/FMSynth.d.ts +15 -0
- package/dist/Instruments/Analog/FMSynth.d.ts.map +1 -0
- package/dist/Instruments/Analog/FMSynth.js +23 -0
- package/dist/Instruments/Analog/FMSynth.js.map +1 -0
- package/dist/Instruments/Analog/FormantSynth.d.ts +14 -0
- package/dist/Instruments/Analog/FormantSynth.d.ts.map +1 -0
- package/dist/Instruments/Analog/FormantSynth.js +26 -0
- package/dist/Instruments/Analog/FormantSynth.js.map +1 -0
- package/dist/Instruments/Analog/LeadSynth.d.ts +13 -0
- package/dist/Instruments/Analog/LeadSynth.d.ts.map +1 -0
- package/dist/Instruments/Analog/LeadSynth.js +21 -0
- package/dist/Instruments/Analog/LeadSynth.js.map +1 -0
- package/dist/Instruments/Analog/OrganSynth.d.ts +13 -0
- package/dist/Instruments/Analog/OrganSynth.d.ts.map +1 -0
- package/dist/Instruments/Analog/OrganSynth.js +24 -0
- package/dist/Instruments/Analog/OrganSynth.js.map +1 -0
- package/dist/Instruments/Analog/PadSynth.d.ts +14 -0
- package/dist/Instruments/Analog/PadSynth.d.ts.map +1 -0
- package/dist/Instruments/Analog/PadSynth.js +22 -0
- package/dist/Instruments/Analog/PadSynth.js.map +1 -0
- package/dist/Instruments/Analog/ReeseBassSynth.d.ts +14 -0
- package/dist/Instruments/Analog/ReeseBassSynth.d.ts.map +1 -0
- package/dist/Instruments/Analog/ReeseBassSynth.js +22 -0
- package/dist/Instruments/Analog/ReeseBassSynth.js.map +1 -0
- package/dist/Instruments/Analog/StringSynth.d.ts +13 -0
- package/dist/Instruments/Analog/StringSynth.d.ts.map +1 -0
- package/dist/Instruments/Analog/StringSynth.js +19 -0
- package/dist/Instruments/Analog/StringSynth.js.map +1 -0
- package/dist/Instruments/Analog/WoodwindSynth.d.ts +14 -0
- package/dist/Instruments/Analog/WoodwindSynth.d.ts.map +1 -0
- package/dist/Instruments/Analog/WoodwindSynth.js +35 -0
- package/dist/Instruments/Analog/WoodwindSynth.js.map +1 -0
- package/dist/Instruments/CoreSynthBase.d.ts +29 -0
- package/dist/Instruments/CoreSynthBase.d.ts.map +1 -0
- package/dist/Instruments/CoreSynthBase.js +91 -0
- package/dist/Instruments/CoreSynthBase.js.map +1 -0
- package/dist/Instruments/Decay/AdditiveSynth.d.ts +15 -0
- package/dist/Instruments/Decay/AdditiveSynth.d.ts.map +1 -0
- package/dist/Instruments/Decay/AdditiveSynth.js +24 -0
- package/dist/Instruments/Decay/AdditiveSynth.js.map +1 -0
- package/dist/Instruments/Decay/BrassSynth.d.ts +13 -0
- package/dist/Instruments/Decay/BrassSynth.d.ts.map +1 -0
- package/dist/Instruments/Decay/BrassSynth.js +29 -0
- package/dist/Instruments/Decay/BrassSynth.js.map +1 -0
- package/dist/Instruments/Decay/ChromaticPercussionSynth.d.ts +15 -0
- package/dist/Instruments/Decay/ChromaticPercussionSynth.d.ts.map +1 -0
- package/dist/Instruments/Decay/ChromaticPercussionSynth.js +23 -0
- package/dist/Instruments/Decay/ChromaticPercussionSynth.js.map +1 -0
- package/dist/Instruments/Decay/DecaySynthBase.d.ts +23 -0
- package/dist/Instruments/Decay/DecaySynthBase.d.ts.map +1 -0
- package/dist/Instruments/Decay/DecaySynthBase.js +35 -0
- package/dist/Instruments/Decay/DecaySynthBase.js.map +1 -0
- package/dist/Instruments/Decay/ElectricGuitarSynth.d.ts +15 -0
- package/dist/Instruments/Decay/ElectricGuitarSynth.d.ts.map +1 -0
- package/dist/Instruments/Decay/ElectricGuitarSynth.js +31 -0
- package/dist/Instruments/Decay/ElectricGuitarSynth.js.map +1 -0
- package/dist/Instruments/Decay/EthnicSynth.d.ts +15 -0
- package/dist/Instruments/Decay/EthnicSynth.d.ts.map +1 -0
- package/dist/Instruments/Decay/EthnicSynth.js +21 -0
- package/dist/Instruments/Decay/EthnicSynth.js.map +1 -0
- package/dist/Instruments/Decay/GuitarSynth.d.ts +14 -0
- package/dist/Instruments/Decay/GuitarSynth.d.ts.map +1 -0
- package/dist/Instruments/Decay/GuitarSynth.js +23 -0
- package/dist/Instruments/Decay/GuitarSynth.js.map +1 -0
- package/dist/Instruments/Decay/KarplusSynth.d.ts +10 -0
- package/dist/Instruments/Decay/KarplusSynth.d.ts.map +1 -0
- package/dist/Instruments/Decay/KarplusSynth.js +34 -0
- package/dist/Instruments/Decay/KarplusSynth.js.map +1 -0
- package/dist/Instruments/Decay/PianoSynth.d.ts +14 -0
- package/dist/Instruments/Decay/PianoSynth.d.ts.map +1 -0
- package/dist/Instruments/Decay/PianoSynth.js +32 -0
- package/dist/Instruments/Decay/PianoSynth.js.map +1 -0
- package/dist/Instruments/Decay/SlapBassSynth.d.ts +15 -0
- package/dist/Instruments/Decay/SlapBassSynth.d.ts.map +1 -0
- package/dist/Instruments/Decay/SlapBassSynth.js +28 -0
- package/dist/Instruments/Decay/SlapBassSynth.js.map +1 -0
- package/dist/Instruments/ISynthInstrument.d.ts +16 -0
- package/dist/Instruments/ISynthInstrument.d.ts.map +1 -0
- package/dist/Instruments/ISynthInstrument.js +2 -0
- package/dist/Instruments/ISynthInstrument.js.map +1 -0
- package/dist/Instruments/InstrumentFactory.d.ts +2 -0
- package/dist/Instruments/InstrumentFactory.d.ts.map +1 -0
- package/dist/Instruments/InstrumentFactory.js +4 -0
- package/dist/Instruments/InstrumentFactory.js.map +1 -0
- package/dist/Instruments/Speciality/DrumSynth.d.ts +11 -0
- package/dist/Instruments/Speciality/DrumSynth.d.ts.map +1 -0
- package/dist/Instruments/Speciality/DrumSynth.js +61 -0
- package/dist/Instruments/Speciality/DrumSynth.js.map +1 -0
- package/dist/Instruments/Speciality/SoundEffectsSynth.d.ts +12 -0
- package/dist/Instruments/Speciality/SoundEffectsSynth.d.ts.map +1 -0
- package/dist/Instruments/Speciality/SoundEffectsSynth.js +27 -0
- package/dist/Instruments/Speciality/SoundEffectsSynth.js.map +1 -0
- package/dist/Instruments/Synthesizer.d.ts +15 -0
- package/dist/Instruments/Synthesizer.d.ts.map +1 -0
- package/dist/Instruments/Synthesizer.js +27 -0
- package/dist/Instruments/Synthesizer.js.map +1 -0
- package/dist/RLO-Player.d.ts +298 -0
- package/dist/RLO-Player.d.ts.map +1 -0
- package/dist/RLO-Player.js +724 -0
- package/dist/RLO-Player.js.map +1 -0
- package/dist/RLO-Transpiler.d.ts +22 -0
- package/dist/RLO-Transpiler.d.ts.map +1 -0
- package/dist/RLO-Transpiler.js +133 -0
- package/dist/RLO-Transpiler.js.map +1 -0
- package/dist/compiler.d.ts +40 -0
- package/dist/compiler.d.ts.map +1 -0
- package/dist/compiler.js +268 -0
- package/dist/compiler.js.map +1 -0
- package/dist/crush.d.ts +9 -0
- package/dist/crush.d.ts.map +1 -0
- package/dist/crush.js +20 -0
- package/dist/crush.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/midi-parser.d.ts +10 -0
- package/dist/midi-parser.d.ts.map +1 -0
- package/dist/midi-parser.js +130 -0
- package/dist/midi-parser.js.map +1 -0
- package/dist/rlo-engine.min.js +655 -0
- package/dist/rlo-engine.min.js.map +1 -0
- package/dist/rlo-engine.min.umd.js +2 -0
- package/dist/rlo-engine.min.umd.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/vite.config.d.ts +7 -0
- package/dist/vite.config.d.ts.map +1 -0
- package/dist/vite.config.js +244 -0
- package/dist/vite.config.js.map +1 -0
- package/dist/vite.config.js13k.d.ts +7 -0
- package/dist/vite.config.js13k.d.ts.map +1 -0
- package/dist/vite.config.js13k.js +72 -0
- package/dist/vite.config.js13k.js.map +1 -0
- 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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"}
|