@blibliki/engine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +4 -0
  2. package/build/Engine.d.ts +114 -0
  3. package/build/Engine.js +81 -0
  4. package/build/Engine.js.map +1 -0
  5. package/build/MidiDevice.d.ts +25 -0
  6. package/build/MidiDevice.js +45 -0
  7. package/build/MidiDevice.js.map +1 -0
  8. package/build/MidiDeviceManager.d.ts +12 -0
  9. package/build/MidiDeviceManager.js +45 -0
  10. package/build/MidiDeviceManager.js.map +1 -0
  11. package/build/MidiEvent.d.ts +12 -0
  12. package/build/MidiEvent.js +37 -0
  13. package/build/MidiEvent.js.map +1 -0
  14. package/build/Module/Base.d.ts +72 -0
  15. package/build/Module/Base.js +139 -0
  16. package/build/Module/Base.js.map +1 -0
  17. package/build/Module/Envelope/AmpEnvelope.d.ts +8 -0
  18. package/build/Module/Envelope/AmpEnvelope.js +15 -0
  19. package/build/Module/Envelope/AmpEnvelope.js.map +1 -0
  20. package/build/Module/Envelope/Base.d.ts +45 -0
  21. package/build/Module/Envelope/Base.js +110 -0
  22. package/build/Module/Envelope/Base.js.map +1 -0
  23. package/build/Module/Envelope/FreqEnvelope.d.ts +17 -0
  24. package/build/Module/Envelope/FreqEnvelope.js +51 -0
  25. package/build/Module/Envelope/FreqEnvelope.js.map +1 -0
  26. package/build/Module/Envelope/index.d.ts +3 -0
  27. package/build/Module/Envelope/index.js +4 -0
  28. package/build/Module/Envelope/index.js.map +1 -0
  29. package/build/Module/Filter.d.ts +31 -0
  30. package/build/Module/Filter.js +83 -0
  31. package/build/Module/Filter.js.map +1 -0
  32. package/build/Module/IO.d.ts +39 -0
  33. package/build/Module/IO.js +59 -0
  34. package/build/Module/IO.js.map +1 -0
  35. package/build/Module/Master.d.ts +7 -0
  36. package/build/Module/Master.js +12 -0
  37. package/build/Module/Master.js.map +1 -0
  38. package/build/Module/MidiSelector.d.ts +16 -0
  39. package/build/Module/MidiSelector.js +44 -0
  40. package/build/Module/MidiSelector.js.map +1 -0
  41. package/build/Module/Oscillator.d.ts +42 -0
  42. package/build/Module/Oscillator.js +123 -0
  43. package/build/Module/Oscillator.js.map +1 -0
  44. package/build/Module/PolyModule.d.ts +57 -0
  45. package/build/Module/PolyModule.js +191 -0
  46. package/build/Module/PolyModule.js.map +1 -0
  47. package/build/Module/VoiceScheduler.d.ts +37 -0
  48. package/build/Module/VoiceScheduler.js +117 -0
  49. package/build/Module/VoiceScheduler.js.map +1 -0
  50. package/build/Module/Volume.d.ts +15 -0
  51. package/build/Module/Volume.js +34 -0
  52. package/build/Module/Volume.js.map +1 -0
  53. package/build/Module/index.d.ts +20 -0
  54. package/build/Module/index.js +60 -0
  55. package/build/Module/index.js.map +1 -0
  56. package/build/Note/frequencyTable.d.ts +4 -0
  57. package/build/Note/frequencyTable.js +146 -0
  58. package/build/Note/frequencyTable.js.map +1 -0
  59. package/build/Note/index.d.ts +13 -0
  60. package/build/Note/index.js +53 -0
  61. package/build/Note/index.js.map +1 -0
  62. package/build/index.d.ts +8 -0
  63. package/build/index.js +6 -0
  64. package/build/index.js.map +1 -0
  65. package/build/routes.d.ts +17 -0
  66. package/build/routes.js +23 -0
  67. package/build/routes.js.map +1 -0
  68. package/package.json +37 -0
  69. package/src/Engine.ts +129 -0
  70. package/src/MidiDevice.ts +67 -0
  71. package/src/MidiDeviceManager.ts +61 -0
  72. package/src/MidiEvent.ts +44 -0
  73. package/src/Module/Base.ts +200 -0
  74. package/src/Module/Envelope/AmpEnvelope.ts +17 -0
  75. package/src/Module/Envelope/Base.ts +159 -0
  76. package/src/Module/Envelope/FreqEnvelope.ts +69 -0
  77. package/src/Module/Envelope/index.ts +3 -0
  78. package/src/Module/Filter.ts +111 -0
  79. package/src/Module/IO.ts +85 -0
  80. package/src/Module/Master.ts +18 -0
  81. package/src/Module/MidiSelector.ts +64 -0
  82. package/src/Module/Oscillator.ts +166 -0
  83. package/src/Module/PolyModule.ts +243 -0
  84. package/src/Module/VoiceScheduler.ts +153 -0
  85. package/src/Module/Volume.ts +46 -0
  86. package/src/Module/index.ts +78 -0
  87. package/src/Note/frequencyTable.ts +146 -0
  88. package/src/Note/index.ts +65 -0
  89. package/src/index.ts +10 -0
  90. package/src/routes.ts +41 -0
  91. package/tsconfig.json +22 -0
@@ -0,0 +1,123 @@
1
+ import { Oscillator as Osc } from "tone";
2
+ import Module, { ModuleType } from "../Module";
3
+ import Note from "../Note";
4
+ import PolyModule, { PolyModuleType } from "./PolyModule";
5
+ const InitialProps = {
6
+ noteName: "C3",
7
+ fine: 0,
8
+ coarse: 0,
9
+ wave: "sine",
10
+ range: 0,
11
+ volume: 0,
12
+ };
13
+ export default class Oscillator extends Module {
14
+ _note;
15
+ constructor(name, props) {
16
+ super(new Osc(), {
17
+ name,
18
+ props: { ...InitialProps, ...props },
19
+ type: ModuleType.Oscillator,
20
+ });
21
+ this.note = new Note("C3");
22
+ this.internalModule.sync();
23
+ this.internalModule.start();
24
+ }
25
+ get note() {
26
+ return this._note;
27
+ }
28
+ setNoteAt(value, time) {
29
+ this._note = this.getNote(value);
30
+ this.updateFrequency(time);
31
+ }
32
+ set note(value) {
33
+ this._note = this.getNote(value);
34
+ this.updateFrequency();
35
+ }
36
+ get noteName() {
37
+ return this._props["noteName"];
38
+ }
39
+ set noteName(value) {
40
+ this._props = { ...this.props, noteName: value };
41
+ this.note = new Note(this.noteName);
42
+ }
43
+ get fine() {
44
+ return this._props["fine"];
45
+ }
46
+ set fine(value) {
47
+ this._props = { ...this.props, fine: Math.floor(value) };
48
+ this.internalModule.detune.value = this.fine;
49
+ }
50
+ get coarse() {
51
+ return this._props["coarse"];
52
+ }
53
+ set coarse(value) {
54
+ this._props = { ...this.props, coarse: Math.floor(value) };
55
+ this.updateFrequency();
56
+ }
57
+ get wave() {
58
+ return this._props["wave"];
59
+ }
60
+ set wave(value) {
61
+ this._props = { ...this.props, wave: value };
62
+ this.internalModule.type = this.wave;
63
+ }
64
+ get volume() {
65
+ return this._props["volume"];
66
+ }
67
+ set volume(value) {
68
+ this._props = { ...this.props, volume: value };
69
+ this.internalModule.volume.value = this.volume;
70
+ }
71
+ get range() {
72
+ return this._props["range"];
73
+ }
74
+ set range(value) {
75
+ this._props = { ...this.props, range: value };
76
+ this.updateFrequency();
77
+ }
78
+ start() {
79
+ this.internalModule.start();
80
+ }
81
+ triggerAttack(midiEvent) {
82
+ if (!midiEvent.note)
83
+ return;
84
+ this.setNoteAt(midiEvent.note, midiEvent.triggeredAt);
85
+ }
86
+ triggerRelease(midiEvent) {
87
+ // Do nothing
88
+ }
89
+ updateFrequency(time) {
90
+ if (!this.note)
91
+ return;
92
+ const freq = this.note.frequency(this.range, this.coarse);
93
+ if (time) {
94
+ this.internalModule.restart(time);
95
+ this.internalModule.frequency.setValueAtTime(freq, time);
96
+ }
97
+ else {
98
+ this.internalModule.restart();
99
+ this.internalModule.frequency.value = freq;
100
+ }
101
+ }
102
+ getNote(note) {
103
+ return note instanceof Note ? note : new Note(note);
104
+ }
105
+ }
106
+ export class PolyOscillator extends PolyModule {
107
+ constructor(name, props) {
108
+ super(PolyModuleType.Oscillator, {
109
+ name,
110
+ props: { ...InitialProps, ...props },
111
+ type: ModuleType.Oscillator,
112
+ });
113
+ this.registerBasicOutputs();
114
+ this.registerInputs();
115
+ }
116
+ registerInputs() {
117
+ this.registerInput({
118
+ name: "midi in",
119
+ pluggable: this.midiTriggered,
120
+ });
121
+ }
122
+ }
123
+ //# sourceMappingURL=Oscillator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Oscillator.js","sourceRoot":"","sources":["../../src/Module/Oscillator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import MidiEvent from "../MidiEvent";
2
+ import Module, { ModuleInterface, ModuleType, Connectable } from "./Base";
3
+ import { Input, Output, IOInterface } from "./IO";
4
+ import { AudioModule } from "../Module";
5
+ export declare enum PolyModuleType {
6
+ Oscillator = "oscillator",
7
+ Envelope = "envelope",
8
+ AmpEnvelope = "ampEnvelope",
9
+ FreqEnvelope = "freqEnvelope",
10
+ VoiceScheduler = "voiceScheduler",
11
+ Filter = "filter",
12
+ Volume = "volume"
13
+ }
14
+ interface PolyModuleInterface extends ModuleInterface {
15
+ }
16
+ export default abstract class PolyModule<MonoAudioModule extends Module<Connectable, any>, PropsInterface> {
17
+ readonly id: string;
18
+ _name: string;
19
+ audioModules: MonoAudioModule[];
20
+ inputs: Input[];
21
+ outputs: Output[];
22
+ readonly _type: PolyModuleType;
23
+ readonly childrenType: ModuleType;
24
+ private _numberOfVoices;
25
+ constructor(type: PolyModuleType, props: PolyModuleInterface);
26
+ get type(): PolyModuleType;
27
+ get name(): string;
28
+ set name(value: string);
29
+ set type(value: PolyModuleType);
30
+ get props(): PropsInterface;
31
+ set props(value: PropsInterface);
32
+ get numberOfVoices(): number;
33
+ set numberOfVoices(value: number);
34
+ plug(audioModule: AudioModule, from: string, to: string): void;
35
+ unplugAll(): void;
36
+ dispose(): void;
37
+ midiTriggered: (midiEvent: MidiEvent, voiceNo?: number) => void;
38
+ serialize(): {
39
+ id: string;
40
+ type: PolyModuleType;
41
+ inputs: import("./IO").SerializeInterface[];
42
+ outputs: import("./IO").SerializeInterface[];
43
+ name: string;
44
+ props: any;
45
+ };
46
+ protected connect: (inputAudioModule: AudioModule, attribute?: string) => void;
47
+ protected disconnect: (inputAudioModule: AudioModule, attribute?: string) => void;
48
+ protected registerInput(props: IOInterface): Input;
49
+ protected registerOutput(props: IOInterface): Output;
50
+ protected find(callback: (audioModule: MonoAudioModule) => boolean): MonoAudioModule;
51
+ protected findVoice(voiceNo: number): MonoAudioModule | undefined;
52
+ protected registerBasicOutputs(): void;
53
+ protected registerBasicInputs(): void;
54
+ private registerNumberOfVoicesInput;
55
+ private adjustNumberOfModules;
56
+ }
57
+ export {};
@@ -0,0 +1,191 @@
1
+ import { v4 as uuidv4 } from "uuid";
2
+ import { createModule } from ".";
3
+ import { Input, Output } from "./IO";
4
+ export var PolyModuleType;
5
+ (function (PolyModuleType) {
6
+ PolyModuleType["Oscillator"] = "oscillator";
7
+ PolyModuleType["Envelope"] = "envelope";
8
+ PolyModuleType["AmpEnvelope"] = "ampEnvelope";
9
+ PolyModuleType["FreqEnvelope"] = "freqEnvelope";
10
+ PolyModuleType["VoiceScheduler"] = "voiceScheduler";
11
+ PolyModuleType["Filter"] = "filter";
12
+ PolyModuleType["Volume"] = "volume";
13
+ })(PolyModuleType || (PolyModuleType = {}));
14
+ export default class PolyModule {
15
+ id;
16
+ _name;
17
+ audioModules;
18
+ inputs = [];
19
+ outputs = [];
20
+ _type;
21
+ childrenType;
22
+ _numberOfVoices;
23
+ constructor(type, props) {
24
+ this.id = uuidv4();
25
+ this._type = type;
26
+ this.childrenType = props.type;
27
+ this.audioModules = [];
28
+ const { props: extraProps, ...basicProps } = props;
29
+ Object.assign(this, basicProps);
30
+ this.numberOfVoices = 1;
31
+ Object.assign(this, { props: extraProps });
32
+ this.registerNumberOfVoicesInput();
33
+ }
34
+ get type() {
35
+ return this._type;
36
+ }
37
+ get name() {
38
+ return this._name;
39
+ }
40
+ set name(value) {
41
+ this._name = value;
42
+ this.audioModules.forEach((m) => (m.name = value));
43
+ }
44
+ // Do nothing
45
+ // This is a little hack to avoid override type by children module
46
+ set type(value) { }
47
+ get props() {
48
+ if (this.audioModules.length === 0) {
49
+ throw Error("There isn't any initialized module");
50
+ }
51
+ return this.audioModules[0].props;
52
+ }
53
+ set props(value) {
54
+ Object.assign(this, value);
55
+ this.audioModules.forEach((m) => (m.props = value));
56
+ }
57
+ get numberOfVoices() {
58
+ return this._numberOfVoices;
59
+ }
60
+ set numberOfVoices(value) {
61
+ this._numberOfVoices = value;
62
+ this.adjustNumberOfModules();
63
+ }
64
+ plug(audioModule, from, to) {
65
+ const output = this.outputs.find((i) => i.name === from);
66
+ if (!output)
67
+ throw Error(`Output ${from} not exist`);
68
+ console.log(`${this.name}:${from} => ${audioModule.name}:${to}`);
69
+ const input = audioModule.inputs.find((i) => i.name === to);
70
+ if (!input)
71
+ throw Error(`Input ${to} in module ${audioModule.name} not exist`);
72
+ output.plug(input);
73
+ }
74
+ unplugAll() {
75
+ this.outputs.forEach((o) => o.unPlugAll());
76
+ }
77
+ dispose() {
78
+ this.audioModules.forEach((m) => {
79
+ m.dispose();
80
+ });
81
+ }
82
+ midiTriggered = (midiEvent, voiceNo = 0) => {
83
+ const audioModule = this.findVoice(voiceNo);
84
+ audioModule?.midiTriggered(midiEvent);
85
+ };
86
+ serialize() {
87
+ if (this.audioModules.length === 0)
88
+ throw Error("There isn't any initialized module");
89
+ return {
90
+ ...this.audioModules[0].serialize(),
91
+ id: this.id,
92
+ type: this.type,
93
+ inputs: this.inputs.map((i) => i.serialize()),
94
+ outputs: this.outputs.map((i) => i.serialize()),
95
+ };
96
+ }
97
+ connect = (inputAudioModule, attribute = "internalModule") => {
98
+ if (inputAudioModule instanceof PolyModule) {
99
+ inputAudioModule.audioModules.forEach((m) => {
100
+ if (m.voiceNo === undefined)
101
+ throw Error("Voice error");
102
+ const audioModule = this.findVoice(m.voiceNo);
103
+ audioModule?.connect(m, attribute);
104
+ });
105
+ return;
106
+ }
107
+ this.audioModules.forEach((m) => m.connect(inputAudioModule, attribute));
108
+ };
109
+ disconnect = (inputAudioModule, attribute = "internalModule") => {
110
+ if (inputAudioModule instanceof PolyModule) {
111
+ inputAudioModule.audioModules.forEach((m) => {
112
+ if (m.voiceNo === undefined)
113
+ throw Error("Voice error");
114
+ const audioModule = this.findVoice(m.voiceNo);
115
+ try {
116
+ audioModule?.disconnect(m, attribute);
117
+ }
118
+ catch (e) {
119
+ console.log(e);
120
+ }
121
+ });
122
+ return;
123
+ }
124
+ try {
125
+ this.audioModules.forEach((m) => m.disconnect(inputAudioModule, attribute));
126
+ }
127
+ catch (e) {
128
+ console.log(e);
129
+ }
130
+ };
131
+ registerInput(props) {
132
+ const input = new Input(this, props);
133
+ this.inputs.push(input);
134
+ return input;
135
+ }
136
+ registerOutput(props) {
137
+ const output = new Output(this, props);
138
+ this.outputs.push(output);
139
+ return output;
140
+ }
141
+ find(callback) {
142
+ const audioModule = this.audioModules.find(callback);
143
+ if (!audioModule)
144
+ throw Error(`Audio module not found`);
145
+ return audioModule;
146
+ }
147
+ findVoice(voiceNo) {
148
+ return this.audioModules.find((m) => m.voiceNo === voiceNo);
149
+ }
150
+ registerBasicOutputs() {
151
+ this.registerOutput({
152
+ name: "output",
153
+ onPlug: (output) => {
154
+ this.connect(output.audioModule);
155
+ },
156
+ onUnPlug: (output) => {
157
+ this.disconnect(output.audioModule);
158
+ },
159
+ });
160
+ }
161
+ registerBasicInputs() {
162
+ this.registerInput({
163
+ name: "input",
164
+ });
165
+ }
166
+ registerNumberOfVoicesInput() {
167
+ this.registerInput({
168
+ name: "number of voices",
169
+ });
170
+ }
171
+ adjustNumberOfModules() {
172
+ if (this.audioModules.length === this.numberOfVoices)
173
+ return;
174
+ if (this.audioModules.length > this.numberOfVoices) {
175
+ const audioModule = this.audioModules.pop();
176
+ audioModule?.dispose();
177
+ }
178
+ else {
179
+ const props = this.audioModules.length ? this.props : {};
180
+ const audioModule = createModule(this.name, this.childrenType, {
181
+ ...props,
182
+ voiceNo: this.audioModules.length,
183
+ });
184
+ if (audioModule instanceof PolyModule)
185
+ throw Error("Polymodule not supported");
186
+ this.audioModules.push(audioModule);
187
+ }
188
+ this.adjustNumberOfModules();
189
+ }
190
+ }
191
+ //# sourceMappingURL=PolyModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PolyModule.js","sourceRoot":"","sources":["../../src/Module/PolyModule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import Module, { DummnyInternalModule } from "./Base";
2
+ import MidiEvent from "../MidiEvent";
3
+ import { Output } from "./IO";
4
+ import PolyModule, { PolyModuleType } from "./PolyModule";
5
+ export interface VoiceSchedulerInterface {
6
+ polyNumber: number;
7
+ }
8
+ export default class VoiceScheduler extends PolyModule<Voice, VoiceSchedulerInterface> {
9
+ midiOutput: Output;
10
+ numberOfVoicesOut: Output;
11
+ constructor(name: string, props: VoiceSchedulerInterface);
12
+ set polyNumber(value: number);
13
+ get polyNumber(): number;
14
+ midiTriggered: (midiEvent: MidiEvent) => void;
15
+ serialize(): {
16
+ props: any;
17
+ id: string;
18
+ type: PolyModuleType;
19
+ inputs: import("./IO").SerializeInterface[];
20
+ outputs: import("./IO").SerializeInterface[];
21
+ name: string;
22
+ };
23
+ private findFreeVoice;
24
+ private registerInputs;
25
+ private registerOutputs;
26
+ }
27
+ export interface VoiceInterface {
28
+ voiceNo?: number;
29
+ }
30
+ export declare class Voice extends Module<DummnyInternalModule, VoiceInterface> {
31
+ midiEvent: MidiEvent | null;
32
+ activeNote: string | null;
33
+ triggeredAt: number;
34
+ midiOutput: Output;
35
+ constructor(name: string, props: VoiceInterface);
36
+ midiTriggered: (midiEvent: MidiEvent) => void;
37
+ }
@@ -0,0 +1,117 @@
1
+ import Module, { ModuleType, DummnyInternalModule } from "./Base";
2
+ import PolyModule, { PolyModuleType } from "./PolyModule";
3
+ export default class VoiceScheduler extends PolyModule {
4
+ midiOutput;
5
+ numberOfVoicesOut;
6
+ constructor(name, props) {
7
+ super(PolyModuleType.VoiceScheduler, {
8
+ name,
9
+ props,
10
+ type: ModuleType.Voice,
11
+ });
12
+ this.registerInputs();
13
+ this.registerOutputs();
14
+ this.polyNumber = this.numberOfVoices;
15
+ }
16
+ set polyNumber(value) {
17
+ super.numberOfVoices = value;
18
+ if (!this.numberOfVoicesOut)
19
+ return;
20
+ this.numberOfVoicesOut.connections.forEach((input) => {
21
+ if (input.audioModule instanceof Module)
22
+ return;
23
+ input.audioModule.numberOfVoices = value;
24
+ });
25
+ }
26
+ get polyNumber() {
27
+ return this.numberOfVoices;
28
+ }
29
+ midiTriggered = (midiEvent) => {
30
+ let voice;
31
+ switch (midiEvent.type) {
32
+ case "noteOn":
33
+ voice = this.findFreeVoice();
34
+ break;
35
+ case "noteOff":
36
+ voice = this.audioModules.find((v) => v.activeNote === midiEvent.note?.fullName);
37
+ break;
38
+ default:
39
+ throw Error("This type is not a note");
40
+ }
41
+ if (voice === undefined)
42
+ return;
43
+ voice.midiTriggered(midiEvent);
44
+ this.midiOutput.connections.forEach((input) => {
45
+ input.pluggable(midiEvent, voice?.voiceNo);
46
+ });
47
+ };
48
+ serialize() {
49
+ const serialize = super.serialize();
50
+ delete serialize.props.voiceNo;
51
+ return {
52
+ ...serialize,
53
+ props: { ...serialize.props, polyNumber: this.polyNumber },
54
+ };
55
+ }
56
+ findFreeVoice() {
57
+ let voice = this.audioModules.find((v) => !v.activeNote);
58
+ if (!voice) {
59
+ voice = this.audioModules.sort((a, b) => {
60
+ if (!a || !b)
61
+ return 0;
62
+ return a.triggeredAt - b.triggeredAt;
63
+ })[0];
64
+ }
65
+ return voice;
66
+ }
67
+ registerInputs() {
68
+ this.registerInput({
69
+ name: "midi in",
70
+ pluggable: this.midiTriggered,
71
+ });
72
+ }
73
+ registerOutputs() {
74
+ this.numberOfVoicesOut = this.registerOutput({
75
+ name: "number of voices",
76
+ onPlug: (input) => {
77
+ if (input.audioModule instanceof Module)
78
+ return;
79
+ input.audioModule.numberOfVoices = this.numberOfVoices;
80
+ },
81
+ });
82
+ this.midiOutput = this.registerOutput({ name: "midi out" });
83
+ }
84
+ }
85
+ export class Voice extends Module {
86
+ midiEvent;
87
+ activeNote;
88
+ triggeredAt;
89
+ midiOutput;
90
+ constructor(name, props) {
91
+ super(new DummnyInternalModule(), {
92
+ name,
93
+ type: ModuleType.Voice,
94
+ props,
95
+ });
96
+ }
97
+ midiTriggered = (midiEvent) => {
98
+ const { triggeredAt, note, type } = midiEvent;
99
+ if (!note)
100
+ throw Error("No valid note on this event");
101
+ const noteName = note.fullName;
102
+ switch (type) {
103
+ case "noteOn":
104
+ this.activeNote = noteName;
105
+ this.triggeredAt = triggeredAt;
106
+ this.midiEvent = midiEvent;
107
+ break;
108
+ case "noteOff":
109
+ this.activeNote = null;
110
+ this.midiEvent = null;
111
+ break;
112
+ default:
113
+ throw Error("This type is not a note");
114
+ }
115
+ };
116
+ }
117
+ //# sourceMappingURL=VoiceScheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VoiceScheduler.js","sourceRoot":"","sources":["../../src/Module/VoiceScheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Volume as Vol } from "tone";
2
+ import Module from "../Module";
3
+ import PolyModule from "./PolyModule";
4
+ export interface VolumeInterface {
5
+ volume: number;
6
+ voiceNo?: number;
7
+ }
8
+ export default class Volume extends Module<Vol, VolumeInterface> {
9
+ constructor(name: string, props: Partial<VolumeInterface>);
10
+ get volume(): number;
11
+ set volume(value: number);
12
+ }
13
+ export declare class PolyVolume extends PolyModule<Volume, VolumeInterface> {
14
+ constructor(name: string, props: Partial<VolumeInterface>);
15
+ }
@@ -0,0 +1,34 @@
1
+ import { Volume as Vol } from "tone";
2
+ import Module, { ModuleType } from "../Module";
3
+ import PolyModule, { PolyModuleType } from "./PolyModule";
4
+ const InitialProps = {
5
+ volume: -100,
6
+ };
7
+ export default class Volume extends Module {
8
+ constructor(name, props) {
9
+ super(new Vol(), {
10
+ name,
11
+ props: { ...InitialProps, ...props },
12
+ type: ModuleType.Volume,
13
+ });
14
+ }
15
+ get volume() {
16
+ return this._props["volume"];
17
+ }
18
+ set volume(value) {
19
+ this._props = { ...this.props, volume: value };
20
+ this.internalModule.volume.value = this.volume;
21
+ }
22
+ }
23
+ export class PolyVolume extends PolyModule {
24
+ constructor(name, props) {
25
+ super(PolyModuleType.Volume, {
26
+ name,
27
+ props: { ...InitialProps, ...props },
28
+ type: ModuleType.Volume,
29
+ });
30
+ this.registerBasicInputs();
31
+ this.registerBasicOutputs();
32
+ }
33
+ }
34
+ //# sourceMappingURL=Volume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Volume.js","sourceRoot":"","sources":["../../src/Module/Volume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,GAAG,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,UAAU,EAAE,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAO1D,MAAM,YAAY,GAAoB;IACpC,MAAM,EAAE,CAAC,GAAG;CACb,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,MAA4B;IAC9D,YAAY,IAAY,EAAE,KAA+B;QACvD,KAAK,CAAC,IAAI,GAAG,EAAE,EAAE;YACf,IAAI;YACJ,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE;YACpC,IAAI,EAAE,UAAU,CAAC,MAAM;SACxB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,MAAM,CAAC,KAAa;QACtB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAE/C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IACjD,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,UAAmC;IACjE,YAAY,IAAY,EAAE,KAA+B;QACvD,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE;YAC3B,IAAI;YACJ,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE;YACpC,IAAI,EAAE,UAAU,CAAC,MAAM;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import Module, { Connectable } from "./Base";
2
+ import PolyModule from "./PolyModule";
3
+ import Oscillator, { PolyOscillator } from "./Oscillator";
4
+ import { Envelope, AmpEnvelope } from "./Envelope";
5
+ import Filter, { PolyFilter } from "./Filter";
6
+ import Master from "./Master";
7
+ import VoiceScheduler, { Voice } from "./VoiceScheduler";
8
+ import MidiSelector from "./MidiSelector";
9
+ import { PolyAmpEnvelope } from "./Envelope/AmpEnvelope";
10
+ import { PolyEnvelope } from "./Envelope/Base";
11
+ import Volume, { PolyVolume } from "./Volume";
12
+ export { default, ModuleType } from "./Base";
13
+ export { default as PolyModule, PolyModuleType } from "./PolyModule";
14
+ export type { ModuleInterface, Connectable, Triggerable } from "./Base";
15
+ export { default as Filter } from "./Filter";
16
+ export { default as Oscillator } from "./Oscillator";
17
+ export { Envelope, AmpEnvelope, FreqEnvelope, EnvelopeStages, } from "./Envelope";
18
+ export declare type AudioModule = Module<Connectable, any> | PolyModule<Module<Connectable, any>, any>;
19
+ export declare function createModule(name: string, type: string, props: any): AudioModule;
20
+ export declare function moduleClassFromType(type: string): typeof Oscillator | typeof PolyOscillator | typeof Envelope | typeof PolyEnvelope | typeof AmpEnvelope | typeof PolyAmpEnvelope | typeof Filter | typeof PolyFilter | typeof Master | typeof VoiceScheduler | typeof Voice | typeof MidiSelector | typeof Volume | typeof PolyVolume;