rlo-engine 1.0.3 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -4
- package/dist/Core/AudioMath.d.ts +29 -0
- package/dist/Core/AudioMath.d.ts.map +1 -0
- package/dist/Core/AudioMath.js +64 -0
- package/dist/Core/AudioMath.js.map +1 -0
- package/dist/Core/InstrumentMap.d.ts +36 -0
- package/dist/Core/InstrumentMap.d.ts.map +1 -0
- package/dist/Core/InstrumentMap.js +62 -0
- package/dist/Core/InstrumentMap.js.map +1 -0
- package/dist/Core/RLOCore.d.ts +49 -0
- package/dist/Core/RLOCore.d.ts.map +1 -0
- package/dist/Core/RLOCore.js +188 -0
- package/dist/Core/RLOCore.js.map +1 -0
- package/dist/Core/SequenceBuilder.d.ts +23 -0
- package/dist/Core/SequenceBuilder.d.ts.map +1 -0
- package/dist/Core/SequenceBuilder.js +31 -0
- package/dist/Core/SequenceBuilder.js.map +1 -0
- package/dist/Instruments/Analog/AnalogSynthBase.d.ts +17 -7
- package/dist/Instruments/Analog/AnalogSynthBase.d.ts.map +1 -1
- package/dist/Instruments/Analog/AnalogSynthBase.js +27 -16
- package/dist/Instruments/Analog/AnalogSynthBase.js.map +1 -1
- package/dist/Instruments/Analog/BassSynth.d.ts +12 -5
- package/dist/Instruments/Analog/BassSynth.d.ts.map +1 -1
- package/dist/Instruments/Analog/BassSynth.js +17 -10
- package/dist/Instruments/Analog/BassSynth.js.map +1 -1
- package/dist/Instruments/Analog/ChiptuneSynth.d.ts +11 -4
- package/dist/Instruments/Analog/ChiptuneSynth.d.ts.map +1 -1
- package/dist/Instruments/Analog/ChiptuneSynth.js +12 -5
- package/dist/Instruments/Analog/ChiptuneSynth.js.map +1 -1
- package/dist/Instruments/Analog/FMSynth.d.ts +11 -4
- package/dist/Instruments/Analog/FMSynth.d.ts.map +1 -1
- package/dist/Instruments/Analog/FMSynth.js +14 -7
- package/dist/Instruments/Analog/FMSynth.js.map +1 -1
- package/dist/Instruments/Analog/FormantSynth.d.ts +11 -4
- package/dist/Instruments/Analog/FormantSynth.d.ts.map +1 -1
- package/dist/Instruments/Analog/FormantSynth.js +12 -5
- package/dist/Instruments/Analog/FormantSynth.js.map +1 -1
- package/dist/Instruments/Analog/LeadSynth.d.ts +11 -4
- package/dist/Instruments/Analog/LeadSynth.d.ts.map +1 -1
- package/dist/Instruments/Analog/LeadSynth.js +14 -7
- package/dist/Instruments/Analog/LeadSynth.js.map +1 -1
- package/dist/Instruments/Analog/OrganSynth.d.ts +11 -4
- package/dist/Instruments/Analog/OrganSynth.d.ts.map +1 -1
- package/dist/Instruments/Analog/OrganSynth.js +17 -10
- package/dist/Instruments/Analog/OrganSynth.js.map +1 -1
- package/dist/Instruments/Analog/PadSynth.js +7 -7
- package/dist/Instruments/Analog/PadSynth.js.map +1 -1
- package/dist/Instruments/Analog/ReeseBassSynth.d.ts +11 -4
- package/dist/Instruments/Analog/ReeseBassSynth.d.ts.map +1 -1
- package/dist/Instruments/Analog/ReeseBassSynth.js +13 -6
- package/dist/Instruments/Analog/ReeseBassSynth.js.map +1 -1
- package/dist/Instruments/Analog/StringSynth.js +4 -4
- package/dist/Instruments/Analog/StringSynth.js.map +1 -1
- package/dist/Instruments/Analog/WoodwindSynth.d.ts +11 -4
- package/dist/Instruments/Analog/WoodwindSynth.d.ts.map +1 -1
- package/dist/Instruments/Analog/WoodwindSynth.js +19 -12
- package/dist/Instruments/Analog/WoodwindSynth.js.map +1 -1
- package/dist/Instruments/CoreSynthBase.d.ts +31 -24
- package/dist/Instruments/CoreSynthBase.d.ts.map +1 -1
- package/dist/Instruments/CoreSynthBase.js +53 -34
- package/dist/Instruments/CoreSynthBase.js.map +1 -1
- package/dist/Instruments/Decay/AdditiveSynth.d.ts +12 -5
- package/dist/Instruments/Decay/AdditiveSynth.d.ts.map +1 -1
- package/dist/Instruments/Decay/AdditiveSynth.js +9 -2
- package/dist/Instruments/Decay/AdditiveSynth.js.map +1 -1
- package/dist/Instruments/Decay/BrassSynth.d.ts +11 -4
- package/dist/Instruments/Decay/BrassSynth.d.ts.map +1 -1
- package/dist/Instruments/Decay/BrassSynth.js +22 -15
- package/dist/Instruments/Decay/BrassSynth.js.map +1 -1
- package/dist/Instruments/Decay/ChromaticPercussionSynth.d.ts +12 -5
- package/dist/Instruments/Decay/ChromaticPercussionSynth.d.ts.map +1 -1
- package/dist/Instruments/Decay/ChromaticPercussionSynth.js +16 -9
- package/dist/Instruments/Decay/ChromaticPercussionSynth.js.map +1 -1
- package/dist/Instruments/Decay/DecaySynthBase.d.ts +14 -8
- package/dist/Instruments/Decay/DecaySynthBase.d.ts.map +1 -1
- package/dist/Instruments/Decay/DecaySynthBase.js +22 -15
- package/dist/Instruments/Decay/DecaySynthBase.js.map +1 -1
- package/dist/Instruments/Decay/ElectricGuitarSynth.d.ts +12 -5
- package/dist/Instruments/Decay/ElectricGuitarSynth.d.ts.map +1 -1
- package/dist/Instruments/Decay/ElectricGuitarSynth.js +19 -12
- package/dist/Instruments/Decay/ElectricGuitarSynth.js.map +1 -1
- package/dist/Instruments/Decay/EthnicSynth.d.ts +12 -5
- package/dist/Instruments/Decay/EthnicSynth.d.ts.map +1 -1
- package/dist/Instruments/Decay/EthnicSynth.js +13 -6
- package/dist/Instruments/Decay/EthnicSynth.js.map +1 -1
- package/dist/Instruments/Decay/GuitarSynth.d.ts +12 -5
- package/dist/Instruments/Decay/GuitarSynth.d.ts.map +1 -1
- package/dist/Instruments/Decay/GuitarSynth.js +14 -7
- package/dist/Instruments/Decay/GuitarSynth.js.map +1 -1
- package/dist/Instruments/Decay/KarplusSynth.d.ts +7 -0
- package/dist/Instruments/Decay/KarplusSynth.d.ts.map +1 -1
- package/dist/Instruments/Decay/KarplusSynth.js +16 -8
- package/dist/Instruments/Decay/KarplusSynth.js.map +1 -1
- package/dist/Instruments/Decay/PianoSynth.d.ts +12 -5
- package/dist/Instruments/Decay/PianoSynth.d.ts.map +1 -1
- package/dist/Instruments/Decay/PianoSynth.js +19 -12
- package/dist/Instruments/Decay/PianoSynth.js.map +1 -1
- package/dist/Instruments/Decay/SlapBassSynth.d.ts +12 -5
- package/dist/Instruments/Decay/SlapBassSynth.d.ts.map +1 -1
- package/dist/Instruments/Decay/SlapBassSynth.js +13 -6
- package/dist/Instruments/Decay/SlapBassSynth.js.map +1 -1
- package/dist/Instruments/ISynthInstrument.d.ts +6 -0
- package/dist/Instruments/ISynthInstrument.d.ts.map +1 -1
- package/dist/Instruments/Speciality/DrumSynth.d.ts +7 -0
- package/dist/Instruments/Speciality/DrumSynth.d.ts.map +1 -1
- package/dist/Instruments/Speciality/DrumSynth.js +30 -21
- package/dist/Instruments/Speciality/DrumSynth.js.map +1 -1
- package/dist/Instruments/Speciality/SoundEffectsSynth.d.ts +7 -0
- package/dist/Instruments/Speciality/SoundEffectsSynth.d.ts.map +1 -1
- package/dist/Instruments/Speciality/SoundEffectsSynth.js +20 -12
- package/dist/Instruments/Speciality/SoundEffectsSynth.js.map +1 -1
- package/dist/Instruments/Synthesizer.d.ts +5 -0
- package/dist/Instruments/Synthesizer.d.ts.map +1 -1
- package/dist/Instruments/Synthesizer.js +7 -1
- package/dist/Instruments/Synthesizer.js.map +1 -1
- package/dist/Players/RLOGameEngine.d.ts +35 -0
- package/dist/Players/RLOGameEngine.d.ts.map +1 -0
- package/dist/Players/RLOGameEngine.js +98 -0
- package/dist/Players/RLOGameEngine.js.map +1 -0
- package/dist/Players/RLOMusicPlayer.d.ts +35 -0
- package/dist/Players/RLOMusicPlayer.d.ts.map +1 -0
- package/dist/Players/RLOMusicPlayer.js +167 -0
- package/dist/Players/RLOMusicPlayer.js.map +1 -0
- package/dist/RLO-Transpiler.d.ts +37 -15
- package/dist/RLO-Transpiler.d.ts.map +1 -1
- package/dist/RLO-Transpiler.js +139 -117
- package/dist/RLO-Transpiler.js.map +1 -1
- package/dist/compiler.d.ts +50 -31
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +165 -230
- package/dist/compiler.js.map +1 -1
- package/dist/crush.d.ts +1 -5
- package/dist/crush.d.ts.map +1 -1
- package/dist/crush.js +10 -3
- package/dist/crush.js.map +1 -1
- package/dist/index.d.ts +15 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/midi-parser.d.ts +14 -0
- package/dist/midi-parser.d.ts.map +1 -1
- package/dist/midi-parser.js +21 -0
- package/dist/midi-parser.js.map +1 -1
- package/dist/rlo-engine.min.js +441 -439
- package/dist/rlo-engine.min.js.map +1 -1
- package/dist/rlo-engine.min.umd.js +1 -1
- package/dist/rlo-engine.min.umd.js.map +1 -1
- package/dist/types.d.ts +21 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -1
- package/dist/vite.config.d.ts.map +1 -1
- package/dist/vite.config.js +16 -3
- package/dist/vite.config.js.map +1 -1
- package/dist/vite.config.js13k.d.ts.map +1 -1
- package/dist/vite.config.js13k.js +1 -0
- package/dist/vite.config.js13k.js.map +1 -1
- package/package.json +1 -1
- package/dist/Instruments/InstrumentFactory.d.ts +0 -2
- package/dist/Instruments/InstrumentFactory.d.ts.map +0 -1
- package/dist/Instruments/InstrumentFactory.js +0 -4
- package/dist/Instruments/InstrumentFactory.js.map +0 -1
- package/dist/RLO-Player.d.ts +0 -298
- package/dist/RLO-Player.d.ts.map +0 -1
- package/dist/RLO-Player.js +0 -724
- package/dist/RLO-Player.js.map +0 -1
|
@@ -3,12 +3,19 @@ import { DecaySynthBase } from "./DecaySynthBase.js";
|
|
|
3
3
|
* Synthesizer strategy for 80s Slap Bass (DX7/Seinfeld style).
|
|
4
4
|
* Characterized by a very snappy filter envelope and a metallic transient "pop".
|
|
5
5
|
*/
|
|
6
|
+
/**
|
|
7
|
+
* Emulates a slapped bass guitar with a sharp, percussive attack phase and a rapidly decaying low-pass filter.
|
|
8
|
+
*
|
|
9
|
+
* @reason Acoustic Design:
|
|
10
|
+
* Encapsulates the specific Web Audio node routing and ADSR parameters
|
|
11
|
+
* required to physically model this instrument within the 13KB limit.
|
|
12
|
+
*/
|
|
6
13
|
export declare class SlapBassSynth extends DecaySynthBase {
|
|
7
|
-
protected
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
14
|
+
protected _envelopeConfig: {
|
|
15
|
+
_peakVelocity: number;
|
|
16
|
+
_attackTimeSeconds: number;
|
|
17
|
+
_decayTimeSeconds: number;
|
|
18
|
+
_maxDurationSeconds: number;
|
|
12
19
|
};
|
|
13
20
|
protected _setupSynthesis(ctx: AudioContext, masterGain: GainNode, gain: GainNode, time: number, freq: number, velocity: number, safeDuration: number, stopTime: number): AudioNode | void;
|
|
14
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlapBassSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Decay/SlapBassSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD;;;GAGG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAC/C,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"SlapBassSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Decay/SlapBassSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD;;;GAGG;AACH;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAC/C,SAAS,CAAC,eAAe;;;;;MAAwG;IAEjI,SAAS,CAAC,eAAe,CACvB,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,QAAQ,EACpB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,SAAS,GAAG,IAAI;CAkCpB"}
|
|
@@ -3,25 +3,32 @@ import { DecaySynthBase } from "./DecaySynthBase.js";
|
|
|
3
3
|
* Synthesizer strategy for 80s Slap Bass (DX7/Seinfeld style).
|
|
4
4
|
* Characterized by a very snappy filter envelope and a metallic transient "pop".
|
|
5
5
|
*/
|
|
6
|
+
/**
|
|
7
|
+
* Emulates a slapped bass guitar with a sharp, percussive attack phase and a rapidly decaying low-pass filter.
|
|
8
|
+
*
|
|
9
|
+
* @reason Acoustic Design:
|
|
10
|
+
* Encapsulates the specific Web Audio node routing and ADSR parameters
|
|
11
|
+
* required to physically model this instrument within the 13KB limit.
|
|
12
|
+
*/
|
|
6
13
|
export class SlapBassSynth extends DecaySynthBase {
|
|
7
14
|
constructor() {
|
|
8
15
|
super(...arguments);
|
|
9
|
-
this.
|
|
16
|
+
this._envelopeConfig = { _peakVelocity: 0.9, _attackTimeSeconds: 0.005, _decayTimeSeconds: 0.15, _maxDurationSeconds: 3.0 }; // Ultra-fast attack for the slap
|
|
10
17
|
}
|
|
11
18
|
_setupSynthesis(ctx, masterGain, gain, time, freq, velocity, safeDuration, stopTime) {
|
|
12
19
|
/** The "Pop" - An aggressive lowpass filter sweep that opens bright and snaps shut */
|
|
13
|
-
const filter = this.
|
|
20
|
+
const filter = this._createFilterSweep(ctx, "lowpass", freq * 8 + velocity * 3000, // Very bright on hard velocities
|
|
14
21
|
freq + 100, // Quickly muffles down to the fundamental
|
|
15
22
|
time, 0.1);
|
|
16
23
|
filter.Q.value = 3; // Adds a "quack" resonance to the slap
|
|
17
24
|
/** The Body - Sawtooth for rich harmonics */
|
|
18
|
-
const osc = this.
|
|
25
|
+
const osc = this._createOscillator(ctx, "sawtooth", freq, gain);
|
|
19
26
|
/** The Sub - Deep sine wave an octave down to anchor the low end */
|
|
20
|
-
const subOsc = this.
|
|
27
|
+
const subOsc = this._createOscillator(ctx, "sine", freq / 2, gain);
|
|
21
28
|
/** The "Thumb Slap" - A quick, inharmonic metallic burst simulating the string hitting the fretboard */
|
|
22
|
-
this.
|
|
29
|
+
this._createTransient(ctx, "square", freq * 3.5, filter, time, Math.max(0.001, velocity * 0.4), 0.04);
|
|
23
30
|
gain.connect(filter);
|
|
24
|
-
this.
|
|
31
|
+
this._scheduleNodeStartStop(time, stopTime, osc, subOsc);
|
|
25
32
|
return filter;
|
|
26
33
|
}
|
|
27
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlapBassSynth.js","sourceRoot":"","sources":["../../../Instruments/Decay/SlapBassSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,cAAc;IAAjD;;QACY,
|
|
1
|
+
{"version":3,"file":"SlapBassSynth.js","sourceRoot":"","sources":["../../../Instruments/Decay/SlapBassSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD;;;GAGG;AACH;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,cAAc;IAAjD;;QACY,oBAAe,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC,iCAAiC;IA6CrK,CAAC;IA3CW,eAAe,CACvB,GAAiB,EACjB,UAAoB,EACpB,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,YAAoB,EACpB,QAAgB;QAEhB,sFAAsF;QACtF,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CACpC,GAAG,EACH,SAAS,EACT,IAAI,GAAG,CAAC,GAAG,QAAQ,GAAG,IAAI,EAAE,iCAAiC;QAC7D,IAAI,GAAG,GAAG,EAAE,0CAA0C;QACtD,IAAI,EACJ,GAAG,CACJ,CAAC;QACF,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,uCAAuC;QAE3D,6CAA6C;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAEhE,oEAAoE;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAEnE,wGAAwG;QACxG,IAAI,CAAC,gBAAgB,CACnB,GAAG,EACH,QAAQ,EACR,IAAI,GAAG,GAAG,EACV,MAAM,EACN,IAAI,EACJ,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,EAC/B,IAAI,CACL,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAEzD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Interface for all synthesizer instrument strategies.
|
|
3
|
+
*
|
|
4
|
+
* @reason Strategy Pattern Isolation:
|
|
5
|
+
* By forcing all Synthesizers to conform to a single `_playNote` contract,
|
|
6
|
+
* the `Synthesizer` router does not need to know if it is triggering an FM synth,
|
|
7
|
+
* an Additive synth, or a simple Oscillator. This allows Rollup to easily tree-shake
|
|
8
|
+
* unused classes because there is no hard-coded type checking or switch statements.
|
|
3
9
|
*/
|
|
4
10
|
export interface ISynthInstrument {
|
|
5
11
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ISynthInstrument.d.ts","sourceRoot":"","sources":["../../Instruments/ISynthInstrument.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ISynthInstrument.d.ts","sourceRoot":"","sources":["../../Instruments/ISynthInstrument.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;OAQG;IACH,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1H"}
|
|
@@ -2,6 +2,13 @@ import { CoreSynthBase } from "../CoreSynthBase.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* Synthesizer strategy for Percussion and Drum kits.
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* A specialized routing class that uses note frequency as a trigger map to synthesize distinct drum kit pieces (Kick, Snare, Hi-Hat, etc.).
|
|
7
|
+
*
|
|
8
|
+
* @reason Acoustic Design:
|
|
9
|
+
* Encapsulates the specific Web Audio node routing and ADSR parameters
|
|
10
|
+
* required to physically model this instrument within the 13KB limit.
|
|
11
|
+
*/
|
|
5
12
|
export declare class DrumSynth extends CoreSynthBase {
|
|
6
13
|
/** Cached white noise buffer to prevent massive memory allocations and GC spikes. */
|
|
7
14
|
private static _cachedNoiseBuffer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrumSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Speciality/DrumSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAe,MAAM,qBAAqB,CAAC;AAEjE;;GAEG;AACH,qBAAa,SAAU,SAAQ,aAAa;IAC1C,qFAAqF;IACrF,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA4B;IAE7D,OAAO,CAAC,MAAM,CAAC,eAAe;IAcvB,SAAS,CACd,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;CA0DR"}
|
|
1
|
+
{"version":3,"file":"DrumSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Speciality/DrumSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAe,MAAM,qBAAqB,CAAC;AAEjE;;GAEG;AACH;;;;;;GAMG;AACH,qBAAa,SAAU,SAAQ,aAAa;IAC1C,qFAAqF;IACrF,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA4B;IAE7D,OAAO,CAAC,MAAM,CAAC,eAAe;IAcvB,SAAS,CACd,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;CA0DR"}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
import { CoreSynthBase } from "../CoreSynthBase.js";
|
|
1
|
+
import { CoreSynthBase, hasStrictGC } from "../CoreSynthBase.js";
|
|
2
2
|
/**
|
|
3
3
|
* Synthesizer strategy for Percussion and Drum kits.
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* A specialized routing class that uses note frequency as a trigger map to synthesize distinct drum kit pieces (Kick, Snare, Hi-Hat, etc.).
|
|
7
|
+
*
|
|
8
|
+
* @reason Acoustic Design:
|
|
9
|
+
* Encapsulates the specific Web Audio node routing and ADSR parameters
|
|
10
|
+
* required to physically model this instrument within the 13KB limit.
|
|
11
|
+
*/
|
|
5
12
|
export class DrumSynth extends CoreSynthBase {
|
|
6
13
|
/** Cached white noise buffer to prevent massive memory allocations and GC spikes. */
|
|
7
14
|
static { this._cachedNoiseBuffer = null; }
|
|
@@ -20,41 +27,43 @@ export class DrumSynth extends CoreSynthBase {
|
|
|
20
27
|
_playNote(ctx, masterGain, time, freq, duration, velocity) {
|
|
21
28
|
/** Standard MIDI maps specific frequencies to specific drum kit pieces */
|
|
22
29
|
if (freq < 70) {
|
|
23
|
-
const gain = this.
|
|
24
|
-
const osc = this.
|
|
25
|
-
this.
|
|
26
|
-
this.
|
|
27
|
-
this.
|
|
28
|
-
this.
|
|
29
|
-
this.
|
|
30
|
-
|
|
30
|
+
const gain = this._createGain(ctx, 0, masterGain);
|
|
31
|
+
const osc = this._createOscillator(ctx, "sine", 0, gain);
|
|
32
|
+
this._setValueAtTime(osc.frequency, 150, time);
|
|
33
|
+
this._exponentialRampToValue(osc.frequency, 30, time + 0.1);
|
|
34
|
+
this._setValueAtTime(gain.gain, Math.max(0.001, velocity * 1.5), time);
|
|
35
|
+
this._exponentialRampToValue(gain.gain, 0.001, time + 0.5);
|
|
36
|
+
this._scheduleNodeStartStop(time, time + 0.5, osc);
|
|
37
|
+
if (hasStrictGC)
|
|
38
|
+
this._scheduleNodeDisposal(ctx, time, time + 0.6, gain);
|
|
31
39
|
}
|
|
32
40
|
else {
|
|
33
41
|
/** HI-HAT / SNARE (White Noise generation) */
|
|
34
42
|
const isSnare = freq < 90;
|
|
35
43
|
const noise = ctx.createBufferSource();
|
|
36
44
|
noise.buffer = DrumSynth._getNoiseBuffer(ctx);
|
|
37
|
-
const gain = this.
|
|
38
|
-
const filter = this.
|
|
39
|
-
const panner = this.
|
|
45
|
+
const gain = this._createGain(ctx, 0, masterGain);
|
|
46
|
+
const filter = this._createFilter(ctx, isSnare ? "bandpass" : "highpass");
|
|
47
|
+
const panner = this._createStereoPanner(ctx, isSnare ? 0 : Math.random() * 0.6 - 0.3);
|
|
40
48
|
filter.frequency.value = isSnare ? 1500 : 5000;
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
49
|
+
this._setValueAtTime(gain.gain, Math.max(0.001, velocity), time);
|
|
50
|
+
this._exponentialRampToValue(gain.gain, 0.001, time + (isSnare ? 0.2 : 0.05));
|
|
43
51
|
noise.connect(filter).connect(gain).connect(panner);
|
|
44
|
-
this.
|
|
52
|
+
this._scheduleNodeStartStop(time, time + (isSnare ? 0.2 : 0.05), noise);
|
|
45
53
|
/** Add an extra body thwack tone if it is a snare */
|
|
46
54
|
if (isSnare) {
|
|
47
|
-
const snareOsc = this.
|
|
55
|
+
const snareOsc = this._createOscillator(ctx, "triangle", 0, gain);
|
|
48
56
|
/** Snare drum head tension: quick pitch drop when the stick hits the skin */
|
|
49
|
-
this.
|
|
50
|
-
this.
|
|
51
|
-
this.
|
|
57
|
+
this._setValueAtTime(snareOsc.frequency, 300, time);
|
|
58
|
+
this._exponentialRampToValue(snareOsc.frequency, 100, time + 0.1);
|
|
59
|
+
this._scheduleNodeStartStop(time, time + 0.2, snareOsc);
|
|
52
60
|
}
|
|
53
61
|
else {
|
|
54
62
|
/** 808 Cymbal Metallic Ring: TR-808 hi-hats contain high-pitched ringing square waves */
|
|
55
|
-
this.
|
|
63
|
+
this._createTransient(ctx, "square", 7000, panner, time, Math.max(0.001, velocity * 0.2), 0.05);
|
|
56
64
|
}
|
|
57
|
-
|
|
65
|
+
if (hasStrictGC)
|
|
66
|
+
this._scheduleNodeDisposal(ctx, time, time + 0.4, filter, gain, panner);
|
|
58
67
|
}
|
|
59
68
|
}
|
|
60
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrumSynth.js","sourceRoot":"","sources":["../../../Instruments/Speciality/DrumSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"DrumSynth.js","sourceRoot":"","sources":["../../../Instruments/Speciality/DrumSynth.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,13 @@ import { CoreSynthBase } from "../CoreSynthBase.js";
|
|
|
3
3
|
* Synthesizer strategy for Sound Effects and Sci-Fi Synths.
|
|
4
4
|
* Features extreme frequency sweeping over the duration of the note.
|
|
5
5
|
*/
|
|
6
|
+
/**
|
|
7
|
+
* Synthesizes various game-related sound effects (lasers, explosions, jumps) using noise bursts and rapid pitch sweeps.
|
|
8
|
+
*
|
|
9
|
+
* @reason Acoustic Design:
|
|
10
|
+
* Encapsulates the specific Web Audio node routing and ADSR parameters
|
|
11
|
+
* required to physically model this instrument within the 13KB limit.
|
|
12
|
+
*/
|
|
6
13
|
export declare class SoundEffectsSynth extends CoreSynthBase {
|
|
7
14
|
/**
|
|
8
15
|
* Plays an automated sweeping sci-fi sound effect.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SoundEffectsSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Speciality/SoundEffectsSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"SoundEffectsSynth.d.ts","sourceRoot":"","sources":["../../../Instruments/Speciality/SoundEffectsSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAe,MAAM,qBAAqB,CAAC;AAEjE;;;GAGG;AACH;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,aAAa;IAClD;;OAEG;IACI,SAAS,CACd,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;CA0BR"}
|
|
@@ -1,27 +1,35 @@
|
|
|
1
|
-
import { CoreSynthBase } from "../CoreSynthBase.js";
|
|
1
|
+
import { CoreSynthBase, hasStrictGC } from "../CoreSynthBase.js";
|
|
2
2
|
/**
|
|
3
3
|
* Synthesizer strategy for Sound Effects and Sci-Fi Synths.
|
|
4
4
|
* Features extreme frequency sweeping over the duration of the note.
|
|
5
5
|
*/
|
|
6
|
+
/**
|
|
7
|
+
* Synthesizes various game-related sound effects (lasers, explosions, jumps) using noise bursts and rapid pitch sweeps.
|
|
8
|
+
*
|
|
9
|
+
* @reason Acoustic Design:
|
|
10
|
+
* Encapsulates the specific Web Audio node routing and ADSR parameters
|
|
11
|
+
* required to physically model this instrument within the 13KB limit.
|
|
12
|
+
*/
|
|
6
13
|
export class SoundEffectsSynth extends CoreSynthBase {
|
|
7
14
|
/**
|
|
8
15
|
* Plays an automated sweeping sci-fi sound effect.
|
|
9
16
|
*/
|
|
10
17
|
_playNote(ctx, masterGain, time, freq, duration, velocity) {
|
|
11
|
-
const gain = this.
|
|
12
|
-
const osc = this.
|
|
18
|
+
const gain = this._createGain(ctx, 0);
|
|
19
|
+
const osc = this._createOscillator(ctx, "sawtooth", 0, gain);
|
|
13
20
|
/** Extreme pitch dive from fundamental down one full octave over the note's duration */
|
|
14
|
-
this.
|
|
15
|
-
this.
|
|
21
|
+
this._setValueAtTime(osc.frequency, freq, time);
|
|
22
|
+
this._exponentialRampToValue(osc.frequency, Math.max(1, freq / 2), time + Math.max(0.05, duration));
|
|
16
23
|
/** Sci-Fi "Laser Wobble": fast sine-wave amplitude modulation (avoids scratchy clicking of square wave) */
|
|
17
|
-
const stutterNode = this.
|
|
18
|
-
this.
|
|
24
|
+
const stutterNode = this._createGain(ctx, 0.5, masterGain);
|
|
25
|
+
this._createLFO(ctx, 15, 0.5, time, 0, time + duration + 0.2, stutterNode.gain);
|
|
19
26
|
gain.connect(stutterNode);
|
|
20
|
-
this.
|
|
21
|
-
this.
|
|
22
|
-
this.
|
|
23
|
-
this.
|
|
24
|
-
|
|
27
|
+
this._setValueAtTime(gain.gain, 0, time);
|
|
28
|
+
this._linearRampToValue(gain.gain, Math.max(0.001, velocity * 0.5), time + 0.05);
|
|
29
|
+
this._exponentialRampToValue(gain.gain, 0.001, time + duration + 0.2);
|
|
30
|
+
this._scheduleNodeStartStop(time, time + duration + 0.2, osc);
|
|
31
|
+
if (hasStrictGC)
|
|
32
|
+
this._scheduleNodeDisposal(ctx, time, time + duration + 0.3, gain, stutterNode);
|
|
25
33
|
}
|
|
26
34
|
}
|
|
27
35
|
//# sourceMappingURL=SoundEffectsSynth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SoundEffectsSynth.js","sourceRoot":"","sources":["../../../Instruments/Speciality/SoundEffectsSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"SoundEffectsSynth.js","sourceRoot":"","sources":["../../../Instruments/Speciality/SoundEffectsSynth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEjE;;;GAGG;AACH;;;;;;GAMG;AACH,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD;;OAEG;IACI,SAAS,CACd,GAAiB,EACjB,UAAoB,EACpB,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,QAAgB;QAEhB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAE7D,wFAAwF;QACxF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,uBAAuB,CAC1B,GAAG,CAAC,SAAS,EACb,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,EACrB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAChC,CAAC;QAEF,2GAA2G;QAC3G,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,QAAQ,GAAG,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAEhF,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAE1B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QACjF,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,QAAQ,GAAG,GAAG,CAAC,CAAC;QAEtE,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;QAE9D,IAAI,WAAW;YAAE,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACnG,CAAC;CACF"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { ISynthInstrument } from "./ISynthInstrument.js";
|
|
2
2
|
/**
|
|
3
3
|
* Handles routing and synthesis of different instrument types.
|
|
4
|
+
*
|
|
5
|
+
* @reason Separation of Concerns:
|
|
6
|
+
* The `RLOCore` is strictly responsible for timing and track decoding.
|
|
7
|
+
* This class is strictly responsible for mapping Instrument IDs to their specific
|
|
8
|
+
* synthesis classes, applying Key Tracking math, and managing the polyphonic fan-out.
|
|
4
9
|
*/
|
|
5
10
|
export declare class Synthesizer {
|
|
6
11
|
private _ctx;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Synthesizer.d.ts","sourceRoot":"","sources":["../../Instruments/Synthesizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"Synthesizer.d.ts","sourceRoot":"","sources":["../../Instruments/Synthesizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAKzD;;;;;;;GAOG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,WAAW,CAAW;IAC9B,OAAO,CAAC,YAAY,CAAqB;gBAGvC,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,QAAQ,EACpB,WAAW,EAAE,gBAAgB,EAAE;IAOjC;;OAEG;IACI,SAAS,CACd,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,IAAI;CAyBR"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
+
const hasMidiDebug = typeof __ENABLE_MIDI_DEBUG__ !== "undefined" ? __ENABLE_MIDI_DEBUG__ : false;
|
|
1
2
|
/**
|
|
2
3
|
* Handles routing and synthesis of different instrument types.
|
|
4
|
+
*
|
|
5
|
+
* @reason Separation of Concerns:
|
|
6
|
+
* The `RLOCore` is strictly responsible for timing and track decoding.
|
|
7
|
+
* This class is strictly responsible for mapping Instrument IDs to their specific
|
|
8
|
+
* synthesis classes, applying Key Tracking math, and managing the polyphonic fan-out.
|
|
3
9
|
*/
|
|
4
10
|
export class Synthesizer {
|
|
5
11
|
constructor(ctx, masterGain, instruments) {
|
|
@@ -16,7 +22,7 @@ export class Synthesizer {
|
|
|
16
22
|
* We also apply a 0.6 global headroom multiplier to prevent 30+ note crescendos from clipping. */
|
|
17
23
|
const keyTrackVel = velocity * 0.6 * Math.min(1, 1600 / freq);
|
|
18
24
|
const instrument = this._instruments[instrumentId] || this._instruments[0];
|
|
19
|
-
if (
|
|
25
|
+
if (hasMidiDebug) {
|
|
20
26
|
console.log(`[MIDI Debug] Instr ID: ${instrumentId} | Class: ${instrument?.constructor.name || "Unknown"} | Freq: ${freq.toFixed(2)}Hz | Vel: ${velocity.toFixed(2)} | Dur: ${duration.toFixed(2)}s | Time: ${time.toFixed(2)}s`);
|
|
21
27
|
}
|
|
22
28
|
if (instrument) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Synthesizer.js","sourceRoot":"","sources":["../../Instruments/Synthesizer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Synthesizer.js","sourceRoot":"","sources":["../../Instruments/Synthesizer.ts"],"names":[],"mappings":"AAGA,MAAM,YAAY,GAAG,OAAO,qBAAqB,KAAK,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC;AAElG;;;;;;;GAOG;AACH,MAAM,OAAO,WAAW;IAKtB,YACE,GAAiB,EACjB,UAAoB,EACpB,WAA+B;QAE/B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED;;OAEG;IACI,SAAS,CACd,YAAoB,EACpB,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,QAAgB;QAEhB;;0GAEkG;QAClG,MAAM,WAAW,GAAG,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QAE9D,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE3E,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CACT,0BAA0B,YAAY,aAAa,UAAU,EAAE,WAAW,CAAC,IAAI,IAAI,SAAS,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACrN,CAAC;QACJ,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,SAAS,CAClB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,WAAW,CACZ,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { RLOCore, PlaySequenceOptions } from "../Core/RLOCore.js";
|
|
2
|
+
import { RloData } from "../types.js";
|
|
3
|
+
import { ISynthInstrument } from "../Instruments/ISynthInstrument.js";
|
|
4
|
+
export interface SFXOptions {
|
|
5
|
+
velocity?: number;
|
|
6
|
+
timeOffset?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Advanced audio engine designed specifically for video games (like JS13k entries).
|
|
10
|
+
*
|
|
11
|
+
* @reason Architectural Separation:
|
|
12
|
+
* This class completely isolates the Music bus from the SFX (Sound Effects) bus.
|
|
13
|
+
* Games require distinct volume sliders for Music vs SFX. By instantiating a dedicated
|
|
14
|
+
* internal `Synthesizer` explicitly for SFX, we can route all UI clicks, explosions,
|
|
15
|
+
* and jump sounds through the `_sfxRoutingGain` without disrupting the background
|
|
16
|
+
* music's master volume or looping sequence logic.
|
|
17
|
+
*/
|
|
18
|
+
export declare class RLOGameEngine extends RLOCore {
|
|
19
|
+
private _gameMasterGain;
|
|
20
|
+
private _sfxRoutingGain;
|
|
21
|
+
private _musicRoutingGain;
|
|
22
|
+
private _sfxInternalSynthesizer;
|
|
23
|
+
constructor(audioContext: AudioContext, instrumentMap?: ISynthInstrument[]);
|
|
24
|
+
setVolume(vol: number): void;
|
|
25
|
+
setMusicVolume(vol: number): void;
|
|
26
|
+
setSFXVolume(vol: number): void;
|
|
27
|
+
protected _createRouting(fadeInTime?: number): {
|
|
28
|
+
destination: AudioNode;
|
|
29
|
+
};
|
|
30
|
+
playSFX(instrumentId: number, freqOrNote: number | string, duration: number, velocityOrOpts?: number | SFXOptions, oldTimeOffset?: number): void;
|
|
31
|
+
playSFXSequence(track: RloData, timeOffset?: number): void;
|
|
32
|
+
playMusic(track: RloData, loopOrOpts?: boolean | PlaySequenceOptions, oldFadeInTime?: number): void;
|
|
33
|
+
stopMusic(): void;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=RLOGameEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RLOGameEngine.d.ts","sourceRoot":"","sources":["../../Players/RLOGameEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAMtE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,qBAAa,aAAc,SAAQ,OAAO;IACxC,OAAO,CAAC,eAAe,CAAY;IACnC,OAAO,CAAC,eAAe,CAAY;IACnC,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,uBAAuB,CAAe;gBAElC,YAAY,EAAE,YAAY,EAAE,aAAa,GAAE,gBAAgB,EAAO;IAmBvE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM5B,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKjC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKtC,SAAS,CAAC,cAAc,CAAC,UAAU,GAAE,MAAU,GAAG;QAAE,WAAW,EAAE,SAAS,CAAA;KAAE;IAWrE,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAE,MAAM,GAAG,UAAgB,EAAE,aAAa,GAAE,MAAU;IAejJ,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,GAAE,MAAU,GAAG,IAAI;IAa7D,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,GAAE,OAAO,GAAG,mBAA0B,EAAE,aAAa,GAAE,MAAU,GAAG,IAAI;IAW5G,SAAS,IAAI,IAAI;CAGzB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { RLOCore } from "../Core/RLOCore.js";
|
|
2
|
+
import { Note } from "../Core/AudioMath.js";
|
|
3
|
+
import { Synthesizer } from "../Instruments/Synthesizer.js";
|
|
4
|
+
const hasGameEngine = typeof __ENABLE_GAME_ENGINE__ !== "undefined" ? __ENABLE_GAME_ENGINE__ : true;
|
|
5
|
+
/**
|
|
6
|
+
* Advanced audio engine designed specifically for video games (like JS13k entries).
|
|
7
|
+
*
|
|
8
|
+
* @reason Architectural Separation:
|
|
9
|
+
* This class completely isolates the Music bus from the SFX (Sound Effects) bus.
|
|
10
|
+
* Games require distinct volume sliders for Music vs SFX. By instantiating a dedicated
|
|
11
|
+
* internal `Synthesizer` explicitly for SFX, we can route all UI clicks, explosions,
|
|
12
|
+
* and jump sounds through the `_sfxRoutingGain` without disrupting the background
|
|
13
|
+
* music's master volume or looping sequence logic.
|
|
14
|
+
*/
|
|
15
|
+
export class RLOGameEngine extends RLOCore {
|
|
16
|
+
constructor(audioContext, instrumentMap = []) {
|
|
17
|
+
super(audioContext, instrumentMap);
|
|
18
|
+
if (!hasGameEngine)
|
|
19
|
+
return;
|
|
20
|
+
this._gameMasterGain = this._createGain();
|
|
21
|
+
this._gameMasterGain.gain.value = this._volume;
|
|
22
|
+
const compressor = this._createCompressor();
|
|
23
|
+
this._gameMasterGain.connect(compressor).connect(this._ctx.destination);
|
|
24
|
+
this._musicRoutingGain = this._createGain();
|
|
25
|
+
this._musicRoutingGain.connect(this._gameMasterGain);
|
|
26
|
+
this._sfxRoutingGain = this._createGain();
|
|
27
|
+
this._sfxRoutingGain.connect(this._gameMasterGain);
|
|
28
|
+
this._sfxInternalSynthesizer = new Synthesizer(this._ctx, this._sfxRoutingGain, this._instrumentMap);
|
|
29
|
+
}
|
|
30
|
+
setVolume(vol) {
|
|
31
|
+
super.setVolume(vol);
|
|
32
|
+
if (!hasGameEngine)
|
|
33
|
+
return;
|
|
34
|
+
this._gameMasterGain.gain.setTargetAtTime(vol, this._now, 0.1);
|
|
35
|
+
}
|
|
36
|
+
setMusicVolume(vol) {
|
|
37
|
+
if (!hasGameEngine)
|
|
38
|
+
return;
|
|
39
|
+
this._musicRoutingGain.gain.setTargetAtTime(vol, this._now, 0.1);
|
|
40
|
+
}
|
|
41
|
+
setSFXVolume(vol) {
|
|
42
|
+
if (!hasGameEngine)
|
|
43
|
+
return;
|
|
44
|
+
this._sfxRoutingGain.gain.setTargetAtTime(vol, this._now, 0.1);
|
|
45
|
+
}
|
|
46
|
+
_createRouting(fadeInTime = 0) {
|
|
47
|
+
if (!hasGameEngine)
|
|
48
|
+
return super._createRouting(fadeInTime);
|
|
49
|
+
const musicGain = this._createGain();
|
|
50
|
+
musicGain.connect(this._musicRoutingGain);
|
|
51
|
+
this._activeNodes.push(musicGain);
|
|
52
|
+
this._applyLinearFade(musicGain.gain, 1, fadeInTime);
|
|
53
|
+
return { destination: musicGain };
|
|
54
|
+
}
|
|
55
|
+
playSFX(instrumentId, freqOrNote, duration, velocityOrOpts = 1.0, oldTimeOffset = 0) {
|
|
56
|
+
if (!hasGameEngine)
|
|
57
|
+
return;
|
|
58
|
+
if (this._ctx.state === "suspended")
|
|
59
|
+
this._ctx.resume();
|
|
60
|
+
let velocity = 1.0;
|
|
61
|
+
let timeOffset = oldTimeOffset;
|
|
62
|
+
if (typeof velocityOrOpts === "object") {
|
|
63
|
+
velocity = velocityOrOpts.velocity ?? 1.0;
|
|
64
|
+
timeOffset = velocityOrOpts.timeOffset ?? 0;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
velocity = velocityOrOpts;
|
|
68
|
+
}
|
|
69
|
+
this._sfxInternalSynthesizer._playNote(instrumentId, this._now + timeOffset, Note(freqOrNote), duration, velocity);
|
|
70
|
+
}
|
|
71
|
+
playSFXSequence(track, timeOffset = 0) {
|
|
72
|
+
if (!hasGameEngine)
|
|
73
|
+
return;
|
|
74
|
+
if (this._ctx.state === "suspended")
|
|
75
|
+
this._ctx.resume();
|
|
76
|
+
const start = this._now + timeOffset;
|
|
77
|
+
const n = track.notes;
|
|
78
|
+
const len = n.length;
|
|
79
|
+
for (let i = 0; i < len; i += 5) {
|
|
80
|
+
this._sfxInternalSynthesizer._playNote(n[i + 4], start + n[i + 1], n[i], n[i + 2], n[i + 3]);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
playMusic(track, loopOrOpts = true, oldFadeInTime = 0) {
|
|
84
|
+
if (!hasGameEngine)
|
|
85
|
+
return;
|
|
86
|
+
let opts = loopOrOpts;
|
|
87
|
+
if (typeof loopOrOpts === "object" && loopOrOpts.volume !== undefined) {
|
|
88
|
+
this.setMusicVolume(loopOrOpts.volume);
|
|
89
|
+
opts = { ...loopOrOpts };
|
|
90
|
+
delete opts.volume;
|
|
91
|
+
}
|
|
92
|
+
this.playSequence(track, opts, oldFadeInTime);
|
|
93
|
+
}
|
|
94
|
+
stopMusic() {
|
|
95
|
+
super.stop();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=RLOGameEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RLOGameEngine.js","sourceRoot":"","sources":["../../Players/RLOGameEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { RLOCore, PlaySequenceOptions } from "../Core/RLOCore.js";
|
|
2
|
+
import { RloData } from "../types.js";
|
|
3
|
+
import { ISynthInstrument } from "../Instruments/ISynthInstrument.js";
|
|
4
|
+
import { ReverbMode } from "../AudioEffects.js";
|
|
5
|
+
/**
|
|
6
|
+
* A specialized extension of `RLOCore` designed for standalone music playback.
|
|
7
|
+
*
|
|
8
|
+
* @reason Architecture Separation:
|
|
9
|
+
* The base `RLOCore` is extremely lightweight and purely handles scheduling logic.
|
|
10
|
+
* `RLOMusicPlayer` adds heavy features like Convolution Reverb routing, URL fetching,
|
|
11
|
+
* binary decompression streams, and track caching. By separating these into a derived class,
|
|
12
|
+
* JS13k game developers who just want to play simple 1-channel blips don't have to bundle
|
|
13
|
+
* the gzip DecompressionStream or Convolution Reverb code.
|
|
14
|
+
*/
|
|
15
|
+
export declare class RLOMusicPlayer extends RLOCore {
|
|
16
|
+
private _masterGainNode;
|
|
17
|
+
private _reverbNode;
|
|
18
|
+
private _fxGainNode;
|
|
19
|
+
private _trackCacheMap;
|
|
20
|
+
private _visibilityEventHandler;
|
|
21
|
+
private _maxCacheSizeLimit;
|
|
22
|
+
private _currentReverbMode;
|
|
23
|
+
constructor(audioContext: AudioContext, instrumentMap?: ISynthInstrument[]);
|
|
24
|
+
setReverbMode(mode: ReverbMode): void;
|
|
25
|
+
dispose(): void;
|
|
26
|
+
setVolume(vol: number): void;
|
|
27
|
+
getCurrentTime(): number;
|
|
28
|
+
getTotalDuration(): number;
|
|
29
|
+
protected _createRouting(fadeInTime?: number): {
|
|
30
|
+
destination: AudioNode;
|
|
31
|
+
};
|
|
32
|
+
play(trackUrlOrData: string | RloData, fadeInOrOpts?: number | PlaySequenceOptions, oldLoop?: boolean): Promise<void>;
|
|
33
|
+
stop(): void;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=RLOMusicPlayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RLOMusicPlayer.d.ts","sourceRoot":"","sources":["../../Players/RLOMusicPlayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAgB,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAY9D;;;;;;;;;GASG;AACH,qBAAa,cAAe,SAAQ,OAAO;IACzC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,uBAAuB,CAAc;IAC7C,OAAO,CAAC,kBAAkB,CAAc;IACxC,OAAO,CAAC,kBAAkB,CAAyB;gBAEvC,YAAY,EAAE,YAAY,EAAE,aAAa,GAAE,gBAAgB,EAAO;IAoBvE,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IASrC,OAAO,IAAI,IAAI;IASf,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ5B,cAAc,IAAI,MAAM;IAMxB,gBAAgB,IAAI,MAAM;IAKjC,SAAS,CAAC,cAAc,CAAC,UAAU,GAAE,MAAU,GAAG;QAAE,WAAW,EAAE,SAAS,CAAA;KAAE;IA2B/D,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,EAAE,YAAY,GAAE,MAAM,GAAG,mBAAuB,EAAE,OAAO,GAAE,OAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDpI,IAAI,IAAI,IAAI;CAYpB"}
|