@blibliki/engine 0.1.4 → 0.1.6
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/build/Engine.d.ts +5 -41
- package/build/Engine.js +2 -3
- package/build/Engine.js.map +1 -1
- package/build/Module/Base.d.ts +4 -15
- package/build/Module/Base.js +1 -15
- package/build/Module/Base.js.map +1 -1
- package/build/Module/BitCrusher.d.ts +11 -0
- package/build/Module/BitCrusher.js +21 -0
- package/build/Module/BitCrusher.js.map +1 -0
- package/build/Module/Delay.d.ts +14 -0
- package/build/Module/Delay.js +29 -0
- package/build/Module/Delay.js.map +1 -0
- package/build/Module/Distortion.d.ts +11 -0
- package/build/Module/Distortion.js +21 -0
- package/build/Module/Distortion.js.map +1 -0
- package/build/Module/Effect.d.ts +14 -0
- package/build/Module/Effect.js +22 -0
- package/build/Module/Effect.js.map +1 -0
- package/build/Module/Envelope/AmpEnvelope.d.ts +3 -2
- package/build/Module/Envelope/AmpEnvelope.js +4 -6
- package/build/Module/Envelope/AmpEnvelope.js.map +1 -1
- package/build/Module/Envelope/Base.d.ts +8 -7
- package/build/Module/Envelope/Base.js +10 -11
- package/build/Module/Envelope/Base.js.map +1 -1
- package/build/Module/Envelope/FreqEnvelope.d.ts +2 -2
- package/build/Module/Envelope/FreqEnvelope.js +4 -6
- package/build/Module/Envelope/FreqEnvelope.js.map +1 -1
- package/build/Module/Envelope/index.d.ts +1 -1
- package/build/Module/Envelope/index.js +1 -1
- package/build/Module/Envelope/index.js.map +1 -1
- package/build/Module/Filter.d.ts +8 -8
- package/build/Module/Filter.js +9 -9
- package/build/Module/Filter.js.map +1 -1
- package/build/Module/Master.d.ts +1 -1
- package/build/Module/Master.js +1 -2
- package/build/Module/Master.js.map +1 -1
- package/build/Module/MidiSelector.d.ts +2 -0
- package/build/Module/MidiSelector.js +12 -6
- package/build/Module/MidiSelector.js.map +1 -1
- package/build/Module/Oscillator.d.ts +5 -5
- package/build/Module/Oscillator.js +6 -7
- package/build/Module/Oscillator.js.map +1 -1
- package/build/Module/PolyModule.d.ts +9 -18
- package/build/Module/PolyModule.js +9 -26
- package/build/Module/PolyModule.js.map +1 -1
- package/build/Module/Reverb.d.ts +14 -0
- package/build/Module/Reverb.js +29 -0
- package/build/Module/Reverb.js.map +1 -0
- package/build/Module/VirtualMidi.d.ts +2 -2
- package/build/Module/VirtualMidi.js +1 -2
- package/build/Module/VirtualMidi.js.map +1 -1
- package/build/Module/VoiceScheduler.d.ts +7 -7
- package/build/Module/VoiceScheduler.js +5 -6
- package/build/Module/VoiceScheduler.js.map +1 -1
- package/build/Module/Volume.d.ts +5 -5
- package/build/Module/Volume.js +6 -7
- package/build/Module/Volume.js.map +1 -1
- package/build/Module/index.d.ts +2 -13
- package/build/Module/index.js +32 -37
- package/build/Module/index.js.map +1 -1
- package/build/index.d.ts +0 -1
- package/build/index.js +0 -1
- package/build/index.js.map +1 -1
- package/build/routes.js +9 -1
- package/build/routes.js.map +1 -1
- package/package.json +3 -1
- package/src/Engine.ts +2 -7
- package/src/Module/Base.ts +5 -16
- package/src/Module/BitCrusher.ts +32 -0
- package/src/Module/Delay.ts +40 -0
- package/src/Module/Distortion.ts +32 -0
- package/src/Module/Effect.ts +42 -0
- package/src/Module/Envelope/AmpEnvelope.ts +4 -6
- package/src/Module/Envelope/Base.ts +10 -13
- package/src/Module/Envelope/FreqEnvelope.ts +4 -6
- package/src/Module/Envelope/index.ts +1 -1
- package/src/Module/Filter.ts +15 -15
- package/src/Module/Master.ts +1 -2
- package/src/Module/MidiSelector.ts +14 -6
- package/src/Module/Oscillator.ts +8 -10
- package/src/Module/PolyModule.ts +15 -30
- package/src/Module/Reverb.ts +40 -0
- package/src/Module/VirtualMidi.ts +1 -2
- package/src/Module/VoiceScheduler.ts +7 -10
- package/src/Module/Volume.ts +7 -9
- package/src/Module/index.ts +35 -37
- package/src/index.ts +0 -1
- package/src/routes.ts +14 -7
package/src/Module/Filter.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Filter as InternalFilter } from "tone";
|
|
2
2
|
|
|
3
|
-
import { FreqEnvelope } from "./Envelope";
|
|
4
|
-
import Module, {
|
|
5
|
-
import PolyModule
|
|
6
|
-
import { PolyFreqEnvelope } from "./Envelope/FreqEnvelope";
|
|
3
|
+
import { FreqEnvelope, MonoFreqEnvelope } from "./Envelope";
|
|
4
|
+
import Module, { Voicable } from "./Base";
|
|
5
|
+
import PolyModule from "./PolyModule";
|
|
7
6
|
|
|
8
|
-
interface FilterInterface {
|
|
7
|
+
interface FilterInterface extends Voicable {
|
|
9
8
|
cutoff: number;
|
|
9
|
+
filterType: BiquadFilterType;
|
|
10
10
|
resonance: number;
|
|
11
11
|
envelopeAmount: number;
|
|
12
12
|
voiceNo?: number;
|
|
@@ -18,16 +18,16 @@ const InitialProps: FilterInterface = {
|
|
|
18
18
|
cutoff: 20000,
|
|
19
19
|
resonance: 0,
|
|
20
20
|
envelopeAmount: 0,
|
|
21
|
+
filterType: "lowpass",
|
|
21
22
|
};
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
private _envelope:
|
|
24
|
+
class MonoFilter extends Module<InternalFilter, FilterInterface> {
|
|
25
|
+
private _envelope: MonoFreqEnvelope;
|
|
25
26
|
|
|
26
27
|
constructor(name: string, props: FilterProps) {
|
|
27
28
|
super(new InternalFilter({ type: "lowpass" }), {
|
|
28
29
|
name,
|
|
29
30
|
props: { ...InitialProps, ...props },
|
|
30
|
-
type: ModuleType.Filter,
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -71,19 +71,19 @@ export default class Filter extends Module<InternalFilter, FilterInterface> {
|
|
|
71
71
|
this._envelope.amount = value;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
conntectedEnvelope(envelope:
|
|
74
|
+
conntectedEnvelope(envelope: MonoFreqEnvelope) {
|
|
75
75
|
this._envelope = envelope;
|
|
76
76
|
this._envelope.frequency = this.cutoff;
|
|
77
77
|
this._envelope.amount = this.envelopeAmount;
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
export class
|
|
81
|
+
export default class Filter extends PolyModule<MonoFilter, FilterInterface> {
|
|
82
82
|
constructor(name: string, props: Partial<FilterInterface>) {
|
|
83
|
-
super(
|
|
83
|
+
super({
|
|
84
84
|
name,
|
|
85
|
+
child: MonoFilter,
|
|
85
86
|
props: { ...InitialProps, ...props },
|
|
86
|
-
type: ModuleType.Filter,
|
|
87
87
|
});
|
|
88
88
|
|
|
89
89
|
this.registerBasicInputs();
|
|
@@ -96,13 +96,13 @@ export class PolyFilter extends PolyModule<Filter, FilterInterface> {
|
|
|
96
96
|
name: "frequency",
|
|
97
97
|
pluggable: "frequency",
|
|
98
98
|
onPlug: (output) => {
|
|
99
|
-
this.conntectedEnvelope(output.audioModule as
|
|
99
|
+
this.conntectedEnvelope(output.audioModule as FreqEnvelope);
|
|
100
100
|
},
|
|
101
101
|
});
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
conntectedEnvelope(
|
|
105
|
-
|
|
104
|
+
conntectedEnvelope(freqEnvelope: FreqEnvelope) {
|
|
105
|
+
freqEnvelope.audioModules.forEach((envelope) => {
|
|
106
106
|
if (envelope.voiceNo === undefined) return;
|
|
107
107
|
|
|
108
108
|
const filter = this.findVoice(envelope.voiceNo);
|
package/src/Module/Master.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Destination, getDestination } from "tone";
|
|
2
|
-
import Module
|
|
2
|
+
import Module from "./Base";
|
|
3
3
|
|
|
4
4
|
export interface MasterInterface {}
|
|
5
5
|
|
|
@@ -10,7 +10,6 @@ export default class Master extends Module<
|
|
|
10
10
|
constructor() {
|
|
11
11
|
super(getDestination(), {
|
|
12
12
|
name: "Master",
|
|
13
|
-
type: ModuleType.Master,
|
|
14
13
|
});
|
|
15
14
|
|
|
16
15
|
this.registerBasicInputs();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Engine from "../Engine";
|
|
2
2
|
import MidiEvent from "../MidiEvent";
|
|
3
|
-
import Module, {
|
|
3
|
+
import Module, { DummnyInternalModule } from "./Base";
|
|
4
4
|
import { Output } from "./IO";
|
|
5
5
|
|
|
6
6
|
export interface MidiSelectorInterface {
|
|
@@ -21,7 +21,6 @@ export default class MidiSelector extends Module<
|
|
|
21
21
|
super(new DummnyInternalModule(), {
|
|
22
22
|
name,
|
|
23
23
|
props: { ...InitialProps, ...props },
|
|
24
|
-
type: ModuleType.MidiSelector,
|
|
25
24
|
});
|
|
26
25
|
|
|
27
26
|
this.registerOutputs();
|
|
@@ -33,16 +32,18 @@ export default class MidiSelector extends Module<
|
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
set selectedId(value: string | null) {
|
|
36
|
-
|
|
37
|
-
const prevMidiDevice = Engine.midiDeviceManager.find(this.selectedId);
|
|
38
|
-
prevMidiDevice?.removeEventListener(this.onMidiEvent);
|
|
39
|
-
}
|
|
35
|
+
this.removeEventListener();
|
|
40
36
|
|
|
41
37
|
this._props = { ...this.props, selectedId: value };
|
|
42
38
|
|
|
43
39
|
this.addEventListener(value);
|
|
44
40
|
}
|
|
45
41
|
|
|
42
|
+
dispose() {
|
|
43
|
+
this.removeEventListener();
|
|
44
|
+
super.dispose();
|
|
45
|
+
}
|
|
46
|
+
|
|
46
47
|
private registerOutputs() {
|
|
47
48
|
this.midiOutput = this.registerOutput({ name: "midi out" });
|
|
48
49
|
}
|
|
@@ -59,4 +60,11 @@ export default class MidiSelector extends Module<
|
|
|
59
60
|
const midiDevice = Engine.midiDeviceManager.find(midiId);
|
|
60
61
|
midiDevice?.addEventListener(this.onMidiEvent);
|
|
61
62
|
}
|
|
63
|
+
|
|
64
|
+
private removeEventListener() {
|
|
65
|
+
if (!this.selectedId) return;
|
|
66
|
+
|
|
67
|
+
const midiDevice = Engine.midiDeviceManager.find(this.selectedId);
|
|
68
|
+
midiDevice?.removeEventListener(this.onMidiEvent);
|
|
69
|
+
}
|
|
62
70
|
}
|
package/src/Module/Oscillator.ts
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import MidiEvent from "../MidiEvent";
|
|
2
2
|
import { Oscillator as Osc, ToneOscillatorType } from "tone";
|
|
3
3
|
|
|
4
|
-
import Module, { ModuleType } from "../Module";
|
|
5
4
|
import Note from "../Note";
|
|
6
|
-
import
|
|
5
|
+
import Module, { Voicable } from "./Base";
|
|
6
|
+
import PolyModule from "./PolyModule";
|
|
7
7
|
|
|
8
|
-
export interface OscillatorInterface {
|
|
8
|
+
export interface OscillatorInterface extends Voicable {
|
|
9
9
|
noteName: string;
|
|
10
10
|
fine: number;
|
|
11
11
|
coarse: number;
|
|
12
12
|
wave: string;
|
|
13
13
|
volume: number;
|
|
14
14
|
range: number;
|
|
15
|
-
voiceNo?: number;
|
|
16
15
|
}
|
|
17
16
|
|
|
18
17
|
const InitialProps: OscillatorInterface = {
|
|
@@ -24,14 +23,13 @@ const InitialProps: OscillatorInterface = {
|
|
|
24
23
|
volume: 0,
|
|
25
24
|
};
|
|
26
25
|
|
|
27
|
-
|
|
26
|
+
class MonoOscillator extends Module<Osc, OscillatorInterface> {
|
|
28
27
|
private _note: Note;
|
|
29
28
|
|
|
30
29
|
constructor(name: string, props: Partial<OscillatorInterface>) {
|
|
31
30
|
super(new Osc(), {
|
|
32
31
|
name,
|
|
33
32
|
props: { ...InitialProps, ...props },
|
|
34
|
-
type: ModuleType.Oscillator,
|
|
35
33
|
});
|
|
36
34
|
|
|
37
35
|
this.note = new Note("C3");
|
|
@@ -142,15 +140,15 @@ export default class Oscillator extends Module<Osc, OscillatorInterface> {
|
|
|
142
140
|
}
|
|
143
141
|
}
|
|
144
142
|
|
|
145
|
-
export class
|
|
146
|
-
|
|
143
|
+
export default class Oscillator extends PolyModule<
|
|
144
|
+
MonoOscillator,
|
|
147
145
|
OscillatorInterface
|
|
148
146
|
> {
|
|
149
147
|
constructor(name: string, props: Partial<OscillatorInterface>) {
|
|
150
|
-
super(
|
|
148
|
+
super({
|
|
151
149
|
name,
|
|
150
|
+
child: MonoOscillator,
|
|
152
151
|
props: { ...InitialProps, ...props },
|
|
153
|
-
type: ModuleType.Oscillator,
|
|
154
152
|
});
|
|
155
153
|
|
|
156
154
|
this.registerBasicOutputs();
|
package/src/Module/PolyModule.ts
CHANGED
|
@@ -1,42 +1,33 @@
|
|
|
1
1
|
import MidiEvent from "../MidiEvent";
|
|
2
2
|
import { v4 as uuidv4 } from "uuid";
|
|
3
|
-
import {
|
|
4
|
-
import Module, { ModuleInterface, ModuleType, Connectable } from "./Base";
|
|
3
|
+
import Module, { Connectable, Voicable } from "./Base";
|
|
5
4
|
import { Input, Output, IOInterface } from "./IO";
|
|
6
5
|
import { AudioModule } from "../Module";
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
FreqEnvelope = "freqEnvelope",
|
|
13
|
-
VoiceScheduler = "voiceScheduler",
|
|
14
|
-
Filter = "filter",
|
|
15
|
-
Volume = "volume",
|
|
7
|
+
interface PolyModuleInterface<MonoAudioModule, PropsInterface> {
|
|
8
|
+
name: string;
|
|
9
|
+
child: new (name: string, props: PropsInterface) => MonoAudioModule;
|
|
10
|
+
props: PropsInterface;
|
|
16
11
|
}
|
|
17
12
|
|
|
18
|
-
interface PolyModuleInterface extends ModuleInterface {}
|
|
19
|
-
|
|
20
13
|
export default abstract class PolyModule<
|
|
21
14
|
MonoAudioModule extends Module<Connectable, any>,
|
|
22
|
-
PropsInterface
|
|
15
|
+
PropsInterface extends Voicable
|
|
23
16
|
> {
|
|
24
17
|
readonly id: string;
|
|
18
|
+
readonly child: new (name: string, props: PropsInterface) => MonoAudioModule;
|
|
25
19
|
_name: string;
|
|
26
20
|
audioModules: MonoAudioModule[];
|
|
27
21
|
inputs: Input[] = [];
|
|
28
22
|
outputs: Output[] = [];
|
|
29
|
-
readonly _type: PolyModuleType;
|
|
30
|
-
readonly childrenType: ModuleType;
|
|
31
23
|
private _numberOfVoices: number;
|
|
32
24
|
|
|
33
|
-
constructor(
|
|
25
|
+
constructor(params: PolyModuleInterface<MonoAudioModule, PropsInterface>) {
|
|
34
26
|
this.id = uuidv4();
|
|
35
|
-
this._type = type;
|
|
36
|
-
this.childrenType = props.type;
|
|
37
27
|
this.audioModules = [];
|
|
38
28
|
|
|
39
|
-
const { props: extraProps, ...basicProps } =
|
|
29
|
+
const { child, props: extraProps, ...basicProps } = params;
|
|
30
|
+
this.child = child;
|
|
40
31
|
Object.assign(this, basicProps);
|
|
41
32
|
|
|
42
33
|
this.numberOfVoices = 1;
|
|
@@ -45,10 +36,6 @@ export default abstract class PolyModule<
|
|
|
45
36
|
this.registerNumberOfVoicesInput();
|
|
46
37
|
}
|
|
47
38
|
|
|
48
|
-
get type() {
|
|
49
|
-
return this._type;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
39
|
get name() {
|
|
53
40
|
return this._name;
|
|
54
41
|
}
|
|
@@ -58,10 +45,6 @@ export default abstract class PolyModule<
|
|
|
58
45
|
this.audioModules.forEach((m) => (m.name = value));
|
|
59
46
|
}
|
|
60
47
|
|
|
61
|
-
// Do nothing
|
|
62
|
-
// This is a little hack to avoid override type by children module
|
|
63
|
-
set type(value: PolyModuleType) {}
|
|
64
|
-
|
|
65
48
|
get props() {
|
|
66
49
|
if (this.audioModules.length === 0) {
|
|
67
50
|
throw Error("There isn't any initialized module");
|
|
@@ -117,7 +100,7 @@ export default abstract class PolyModule<
|
|
|
117
100
|
return {
|
|
118
101
|
...this.audioModules[0].serialize(),
|
|
119
102
|
id: this.id,
|
|
120
|
-
type: this.
|
|
103
|
+
type: this.constructor.name,
|
|
121
104
|
inputs: this.inputs.map((i) => i.serialize()),
|
|
122
105
|
outputs: this.outputs.map((i) => i.serialize()),
|
|
123
106
|
};
|
|
@@ -224,8 +207,10 @@ export default abstract class PolyModule<
|
|
|
224
207
|
const audioModule = this.audioModules.pop();
|
|
225
208
|
audioModule?.dispose();
|
|
226
209
|
} else {
|
|
227
|
-
const props = this.audioModules.length
|
|
228
|
-
|
|
210
|
+
const props = this.audioModules.length
|
|
211
|
+
? this.props
|
|
212
|
+
: ({} as PropsInterface);
|
|
213
|
+
const audioModule = new this.child(this.name, {
|
|
229
214
|
...props,
|
|
230
215
|
voiceNo: this.audioModules.length,
|
|
231
216
|
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Reverb as InternalReverb } from "tone";
|
|
2
|
+
|
|
3
|
+
import Effect, { EffectInterface } from "./Effect";
|
|
4
|
+
|
|
5
|
+
interface ReverbInterface extends EffectInterface {
|
|
6
|
+
decay: number;
|
|
7
|
+
preDelay: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const InitialProps: Partial<ReverbInterface> = {
|
|
11
|
+
decay: 1.5,
|
|
12
|
+
preDelay: 0.025,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default class Reverb extends Effect<InternalReverb, ReverbInterface> {
|
|
16
|
+
constructor(name: string, props: Partial<ReverbInterface>) {
|
|
17
|
+
super(name, new InternalReverb(), {
|
|
18
|
+
...InitialProps,
|
|
19
|
+
...props,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
get decay() {
|
|
24
|
+
return this._props["decay"];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
set decay(value: number) {
|
|
28
|
+
this._props = { ...this.props, decay: value };
|
|
29
|
+
this.internalModule.decay = this.decay;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
get preDelay() {
|
|
33
|
+
return this._props["preDelay"];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
set preDelay(value: number) {
|
|
37
|
+
this._props = { ...this.props, preDelay: value };
|
|
38
|
+
this.internalModule.preDelay = this.preDelay;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Engine from "../Engine";
|
|
2
2
|
import MidiEvent from "../MidiEvent";
|
|
3
|
-
import Module, {
|
|
3
|
+
import Module, { DummnyInternalModule } from "./Base";
|
|
4
4
|
import { Output } from "./IO";
|
|
5
5
|
|
|
6
6
|
export interface VirtualMidiInterface {
|
|
@@ -21,7 +21,6 @@ export default class VirtualMidi extends Module<
|
|
|
21
21
|
super(new DummnyInternalModule(), {
|
|
22
22
|
name,
|
|
23
23
|
props: { ...InitialProps, ...props },
|
|
24
|
-
type: ModuleType.VirtualMidi,
|
|
25
24
|
});
|
|
26
25
|
|
|
27
26
|
this.registerInputs();
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import Module, {
|
|
1
|
+
import Module, { DummnyInternalModule, Voicable } from "./Base";
|
|
2
2
|
import MidiEvent from "../MidiEvent";
|
|
3
3
|
import { Input, Output } from "./IO";
|
|
4
|
-
import PolyModule
|
|
4
|
+
import PolyModule from "./PolyModule";
|
|
5
5
|
|
|
6
|
-
export interface VoiceSchedulerInterface {
|
|
6
|
+
export interface VoiceSchedulerInterface extends Voicable {
|
|
7
7
|
polyNumber: number;
|
|
8
8
|
}
|
|
9
9
|
|
|
@@ -15,10 +15,10 @@ export default class VoiceScheduler extends PolyModule<
|
|
|
15
15
|
numberOfVoicesOut: Output;
|
|
16
16
|
|
|
17
17
|
constructor(name: string, props: VoiceSchedulerInterface) {
|
|
18
|
-
super(
|
|
18
|
+
super({
|
|
19
19
|
name,
|
|
20
|
+
child: Voice,
|
|
20
21
|
props,
|
|
21
|
-
type: ModuleType.Voice,
|
|
22
22
|
});
|
|
23
23
|
|
|
24
24
|
this.registerInputs();
|
|
@@ -111,11 +111,9 @@ export default class VoiceScheduler extends PolyModule<
|
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
-
export interface VoiceInterface {
|
|
115
|
-
voiceNo?: number;
|
|
116
|
-
}
|
|
114
|
+
export interface VoiceInterface extends Voicable {}
|
|
117
115
|
|
|
118
|
-
|
|
116
|
+
class Voice extends Module<DummnyInternalModule, VoiceInterface> {
|
|
119
117
|
midiEvent: MidiEvent | null;
|
|
120
118
|
activeNote: string | null;
|
|
121
119
|
triggeredAt: number;
|
|
@@ -124,7 +122,6 @@ export class Voice extends Module<DummnyInternalModule, VoiceInterface> {
|
|
|
124
122
|
constructor(name: string, props: VoiceInterface) {
|
|
125
123
|
super(new DummnyInternalModule(), {
|
|
126
124
|
name,
|
|
127
|
-
type: ModuleType.Voice,
|
|
128
125
|
props,
|
|
129
126
|
});
|
|
130
127
|
}
|
package/src/Module/Volume.ts
CHANGED
|
@@ -1,23 +1,21 @@
|
|
|
1
1
|
import { Volume as Vol } from "tone";
|
|
2
2
|
|
|
3
|
-
import Module, {
|
|
4
|
-
import PolyModule
|
|
3
|
+
import Module, { Voicable } from "./Base";
|
|
4
|
+
import PolyModule from "./PolyModule";
|
|
5
5
|
|
|
6
|
-
export interface VolumeInterface {
|
|
6
|
+
export interface VolumeInterface extends Voicable {
|
|
7
7
|
volume: number;
|
|
8
|
-
voiceNo?: number;
|
|
9
8
|
}
|
|
10
9
|
|
|
11
10
|
const InitialProps: VolumeInterface = {
|
|
12
11
|
volume: -100,
|
|
13
12
|
};
|
|
14
13
|
|
|
15
|
-
|
|
14
|
+
class MonoVolume extends Module<Vol, VolumeInterface> {
|
|
16
15
|
constructor(name: string, props: Partial<VolumeInterface>) {
|
|
17
16
|
super(new Vol(), {
|
|
18
17
|
name,
|
|
19
18
|
props: { ...InitialProps, ...props },
|
|
20
|
-
type: ModuleType.Volume,
|
|
21
19
|
});
|
|
22
20
|
}
|
|
23
21
|
|
|
@@ -32,12 +30,12 @@ export default class Volume extends Module<Vol, VolumeInterface> {
|
|
|
32
30
|
}
|
|
33
31
|
}
|
|
34
32
|
|
|
35
|
-
export class
|
|
33
|
+
export default class Volume extends PolyModule<MonoVolume, VolumeInterface> {
|
|
36
34
|
constructor(name: string, props: Partial<VolumeInterface>) {
|
|
37
|
-
super(
|
|
35
|
+
super({
|
|
38
36
|
name,
|
|
37
|
+
child: MonoVolume,
|
|
39
38
|
props: { ...InitialProps, ...props },
|
|
40
|
-
type: ModuleType.Volume,
|
|
41
39
|
});
|
|
42
40
|
|
|
43
41
|
this.registerBasicInputs();
|
package/src/Module/index.ts
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import { camelCase, upperFirst } from "lodash";
|
|
2
|
+
import Module, { Connectable } from "./Base";
|
|
3
|
+
import PolyModule from "./PolyModule";
|
|
4
|
+
import Oscillator from "./Oscillator";
|
|
4
5
|
import { Envelope, AmpEnvelope, FreqEnvelope } from "./Envelope";
|
|
5
|
-
import Filter
|
|
6
|
+
import Filter from "./Filter";
|
|
6
7
|
import Master from "./Master";
|
|
7
|
-
import VoiceScheduler
|
|
8
|
+
import VoiceScheduler from "./VoiceScheduler";
|
|
8
9
|
import MidiSelector from "./MidiSelector";
|
|
9
|
-
import
|
|
10
|
-
import { PolyFreqEnvelope } from "./Envelope/FreqEnvelope";
|
|
11
|
-
import { PolyEnvelope } from "./Envelope/Base";
|
|
12
|
-
import Volume, { PolyVolume } from "./Volume";
|
|
10
|
+
import Volume from "./Volume";
|
|
13
11
|
import VirtualMidi from "./VirtualMidi";
|
|
12
|
+
import Reverb from "./Reverb";
|
|
13
|
+
import Delay from "./Delay";
|
|
14
|
+
import Distortion from "./Distortion";
|
|
15
|
+
import BitCrusher from "./BitCrusher";
|
|
14
16
|
|
|
15
|
-
export { default
|
|
16
|
-
export { default as PolyModule
|
|
17
|
+
export { default } from "./Base";
|
|
18
|
+
export { default as PolyModule } from "./PolyModule";
|
|
17
19
|
export type { ModuleInterface, Connectable, Triggerable } from "./Base";
|
|
18
20
|
|
|
19
21
|
export { default as Filter } from "./Filter";
|
|
@@ -39,43 +41,39 @@ export function createModule(
|
|
|
39
41
|
return new klass(name, props);
|
|
40
42
|
}
|
|
41
43
|
|
|
42
|
-
|
|
44
|
+
function moduleClassFromType(type: string) {
|
|
45
|
+
type = upperFirst(camelCase(type));
|
|
46
|
+
|
|
43
47
|
switch (type) {
|
|
44
|
-
case
|
|
48
|
+
case Oscillator.name:
|
|
45
49
|
return Oscillator;
|
|
46
|
-
case
|
|
50
|
+
case Envelope.name:
|
|
47
51
|
return Envelope;
|
|
48
|
-
case
|
|
52
|
+
case AmpEnvelope.name:
|
|
49
53
|
return AmpEnvelope;
|
|
50
|
-
case
|
|
54
|
+
case FreqEnvelope.name:
|
|
51
55
|
return FreqEnvelope;
|
|
52
|
-
case
|
|
56
|
+
case Filter.name:
|
|
53
57
|
return Filter;
|
|
54
|
-
case
|
|
58
|
+
case Volume.name:
|
|
55
59
|
return Volume;
|
|
56
|
-
case
|
|
57
|
-
return PolyOscillator;
|
|
58
|
-
case PolyModuleType.Envelope:
|
|
59
|
-
return PolyEnvelope;
|
|
60
|
-
case PolyModuleType.AmpEnvelope:
|
|
61
|
-
return PolyAmpEnvelope;
|
|
62
|
-
case PolyModuleType.FreqEnvelope:
|
|
63
|
-
return PolyFreqEnvelope;
|
|
64
|
-
case PolyModuleType.Filter:
|
|
65
|
-
return PolyFilter;
|
|
66
|
-
case PolyModuleType.Volume:
|
|
67
|
-
return PolyVolume;
|
|
68
|
-
case ModuleType.Master:
|
|
60
|
+
case Master.name:
|
|
69
61
|
return Master;
|
|
70
|
-
case
|
|
71
|
-
return Voice;
|
|
72
|
-
case PolyModuleType.VoiceScheduler:
|
|
62
|
+
case VoiceScheduler.name:
|
|
73
63
|
return VoiceScheduler;
|
|
74
|
-
case
|
|
64
|
+
case MidiSelector.name:
|
|
75
65
|
return MidiSelector;
|
|
76
|
-
case
|
|
66
|
+
case VirtualMidi.name:
|
|
77
67
|
return VirtualMidi;
|
|
68
|
+
case Reverb.name:
|
|
69
|
+
return Reverb;
|
|
70
|
+
case Delay.name:
|
|
71
|
+
return Delay;
|
|
72
|
+
case Distortion.name:
|
|
73
|
+
return Distortion;
|
|
74
|
+
case BitCrusher.name:
|
|
75
|
+
return BitCrusher;
|
|
78
76
|
default:
|
|
79
|
-
throw Error(
|
|
77
|
+
throw Error(`Unknown module type ${type}`);
|
|
80
78
|
}
|
|
81
79
|
}
|
package/src/index.ts
CHANGED
package/src/routes.ts
CHANGED
|
@@ -22,16 +22,23 @@ export function createRoute(props: RouteProps) {
|
|
|
22
22
|
export function applyRoutes(routes: RouteInterface[]) {
|
|
23
23
|
Object.values(Engine.modules).forEach((m) => m.unplugAll());
|
|
24
24
|
|
|
25
|
-
const succesedConnections = routes
|
|
26
|
-
|
|
25
|
+
const succesedConnections = routes
|
|
26
|
+
.sort((r1, r2) => {
|
|
27
|
+
if (r1.outputName === "number of voices") return -1;
|
|
28
|
+
if (r2.outputName === "number of voices") return 1;
|
|
27
29
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
return 0;
|
|
31
|
+
})
|
|
32
|
+
.map((route) => {
|
|
33
|
+
const { sourceId, outputName, destinationId, inputName } = route;
|
|
30
34
|
|
|
31
|
-
|
|
35
|
+
const source = Engine.findById(sourceId);
|
|
36
|
+
const destination = Engine.findById(destinationId);
|
|
32
37
|
|
|
33
|
-
|
|
34
|
-
|
|
38
|
+
source.plug(destination, outputName, inputName);
|
|
39
|
+
|
|
40
|
+
return true;
|
|
41
|
+
});
|
|
35
42
|
|
|
36
43
|
if (succesedConnections.every((v) => v)) {
|
|
37
44
|
console.log("######## Routes succesfully applied");
|