@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.
- package/README.md +4 -0
- package/build/Engine.d.ts +114 -0
- package/build/Engine.js +81 -0
- package/build/Engine.js.map +1 -0
- package/build/MidiDevice.d.ts +25 -0
- package/build/MidiDevice.js +45 -0
- package/build/MidiDevice.js.map +1 -0
- package/build/MidiDeviceManager.d.ts +12 -0
- package/build/MidiDeviceManager.js +45 -0
- package/build/MidiDeviceManager.js.map +1 -0
- package/build/MidiEvent.d.ts +12 -0
- package/build/MidiEvent.js +37 -0
- package/build/MidiEvent.js.map +1 -0
- package/build/Module/Base.d.ts +72 -0
- package/build/Module/Base.js +139 -0
- package/build/Module/Base.js.map +1 -0
- package/build/Module/Envelope/AmpEnvelope.d.ts +8 -0
- package/build/Module/Envelope/AmpEnvelope.js +15 -0
- package/build/Module/Envelope/AmpEnvelope.js.map +1 -0
- package/build/Module/Envelope/Base.d.ts +45 -0
- package/build/Module/Envelope/Base.js +110 -0
- package/build/Module/Envelope/Base.js.map +1 -0
- package/build/Module/Envelope/FreqEnvelope.d.ts +17 -0
- package/build/Module/Envelope/FreqEnvelope.js +51 -0
- package/build/Module/Envelope/FreqEnvelope.js.map +1 -0
- package/build/Module/Envelope/index.d.ts +3 -0
- package/build/Module/Envelope/index.js +4 -0
- package/build/Module/Envelope/index.js.map +1 -0
- package/build/Module/Filter.d.ts +31 -0
- package/build/Module/Filter.js +83 -0
- package/build/Module/Filter.js.map +1 -0
- package/build/Module/IO.d.ts +39 -0
- package/build/Module/IO.js +59 -0
- package/build/Module/IO.js.map +1 -0
- package/build/Module/Master.d.ts +7 -0
- package/build/Module/Master.js +12 -0
- package/build/Module/Master.js.map +1 -0
- package/build/Module/MidiSelector.d.ts +16 -0
- package/build/Module/MidiSelector.js +44 -0
- package/build/Module/MidiSelector.js.map +1 -0
- package/build/Module/Oscillator.d.ts +42 -0
- package/build/Module/Oscillator.js +123 -0
- package/build/Module/Oscillator.js.map +1 -0
- package/build/Module/PolyModule.d.ts +57 -0
- package/build/Module/PolyModule.js +191 -0
- package/build/Module/PolyModule.js.map +1 -0
- package/build/Module/VoiceScheduler.d.ts +37 -0
- package/build/Module/VoiceScheduler.js +117 -0
- package/build/Module/VoiceScheduler.js.map +1 -0
- package/build/Module/Volume.d.ts +15 -0
- package/build/Module/Volume.js +34 -0
- package/build/Module/Volume.js.map +1 -0
- package/build/Module/index.d.ts +20 -0
- package/build/Module/index.js +60 -0
- package/build/Module/index.js.map +1 -0
- package/build/Note/frequencyTable.d.ts +4 -0
- package/build/Note/frequencyTable.js +146 -0
- package/build/Note/frequencyTable.js.map +1 -0
- package/build/Note/index.d.ts +13 -0
- package/build/Note/index.js +53 -0
- package/build/Note/index.js.map +1 -0
- package/build/index.d.ts +8 -0
- package/build/index.js +6 -0
- package/build/index.js.map +1 -0
- package/build/routes.d.ts +17 -0
- package/build/routes.js +23 -0
- package/build/routes.js.map +1 -0
- package/package.json +37 -0
- package/src/Engine.ts +129 -0
- package/src/MidiDevice.ts +67 -0
- package/src/MidiDeviceManager.ts +61 -0
- package/src/MidiEvent.ts +44 -0
- package/src/Module/Base.ts +200 -0
- package/src/Module/Envelope/AmpEnvelope.ts +17 -0
- package/src/Module/Envelope/Base.ts +159 -0
- package/src/Module/Envelope/FreqEnvelope.ts +69 -0
- package/src/Module/Envelope/index.ts +3 -0
- package/src/Module/Filter.ts +111 -0
- package/src/Module/IO.ts +85 -0
- package/src/Module/Master.ts +18 -0
- package/src/Module/MidiSelector.ts +64 -0
- package/src/Module/Oscillator.ts +166 -0
- package/src/Module/PolyModule.ts +243 -0
- package/src/Module/VoiceScheduler.ts +153 -0
- package/src/Module/Volume.ts +46 -0
- package/src/Module/index.ts +78 -0
- package/src/Note/frequencyTable.ts +146 -0
- package/src/Note/index.ts +65 -0
- package/src/index.ts +10 -0
- package/src/routes.ts +41 -0
- package/tsconfig.json +22 -0
package/README.md
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { ModuleType } from "./Module";
|
|
2
|
+
import { AudioModule } from "./Module";
|
|
3
|
+
import { RouteInterface, RouteProps } from "./routes";
|
|
4
|
+
declare type LatencyHint = "interactive" | "playback" | "balanced";
|
|
5
|
+
interface ContextInterface {
|
|
6
|
+
latencyHint: LatencyHint;
|
|
7
|
+
lookAhead: number;
|
|
8
|
+
}
|
|
9
|
+
interface InitializeInterface {
|
|
10
|
+
context?: Partial<ContextInterface>;
|
|
11
|
+
}
|
|
12
|
+
declare class Engine {
|
|
13
|
+
private static instance;
|
|
14
|
+
private _master;
|
|
15
|
+
private context;
|
|
16
|
+
modules: {
|
|
17
|
+
[Identifier: string]: AudioModule;
|
|
18
|
+
};
|
|
19
|
+
routes: {
|
|
20
|
+
[Identifier: string]: RouteInterface;
|
|
21
|
+
};
|
|
22
|
+
private constructor();
|
|
23
|
+
static getInstance(): Engine;
|
|
24
|
+
initialize(props: InitializeInterface): {
|
|
25
|
+
master: {
|
|
26
|
+
id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
type: ModuleType;
|
|
29
|
+
props: any;
|
|
30
|
+
inputs: import(".").IOProps[];
|
|
31
|
+
outputs: import(".").IOProps[];
|
|
32
|
+
} | {
|
|
33
|
+
id: string;
|
|
34
|
+
type: import("./Module").PolyModuleType;
|
|
35
|
+
inputs: import(".").IOProps[];
|
|
36
|
+
outputs: import(".").IOProps[];
|
|
37
|
+
name: string;
|
|
38
|
+
props: any;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
registerModule(name: string, type: string, props?: any): {
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
type: ModuleType;
|
|
45
|
+
props: any;
|
|
46
|
+
inputs: import(".").IOProps[];
|
|
47
|
+
outputs: import(".").IOProps[];
|
|
48
|
+
} | {
|
|
49
|
+
id: string;
|
|
50
|
+
type: import("./Module").PolyModuleType;
|
|
51
|
+
inputs: import(".").IOProps[];
|
|
52
|
+
outputs: import(".").IOProps[];
|
|
53
|
+
name: string;
|
|
54
|
+
props: any;
|
|
55
|
+
};
|
|
56
|
+
updateNameModule(id: string, name: string): {
|
|
57
|
+
id: string;
|
|
58
|
+
name: string;
|
|
59
|
+
type: ModuleType;
|
|
60
|
+
props: any;
|
|
61
|
+
inputs: import(".").IOProps[];
|
|
62
|
+
outputs: import(".").IOProps[];
|
|
63
|
+
} | {
|
|
64
|
+
id: string;
|
|
65
|
+
type: import("./Module").PolyModuleType;
|
|
66
|
+
inputs: import(".").IOProps[];
|
|
67
|
+
outputs: import(".").IOProps[];
|
|
68
|
+
name: string;
|
|
69
|
+
props: any;
|
|
70
|
+
};
|
|
71
|
+
updatePropsModule(id: string, props: any): {
|
|
72
|
+
id: string;
|
|
73
|
+
name: string;
|
|
74
|
+
type: ModuleType;
|
|
75
|
+
props: any;
|
|
76
|
+
inputs: import(".").IOProps[];
|
|
77
|
+
outputs: import(".").IOProps[];
|
|
78
|
+
} | {
|
|
79
|
+
id: string;
|
|
80
|
+
type: import("./Module").PolyModuleType;
|
|
81
|
+
inputs: import(".").IOProps[];
|
|
82
|
+
outputs: import(".").IOProps[];
|
|
83
|
+
name: string;
|
|
84
|
+
props: any;
|
|
85
|
+
};
|
|
86
|
+
addRoute(props: RouteProps): {
|
|
87
|
+
id: string;
|
|
88
|
+
sourceId: string;
|
|
89
|
+
outputName: string;
|
|
90
|
+
destinationId: string;
|
|
91
|
+
inputName: string;
|
|
92
|
+
};
|
|
93
|
+
removeRoute(route: RouteInterface): void;
|
|
94
|
+
get master(): {
|
|
95
|
+
id: string;
|
|
96
|
+
name: string;
|
|
97
|
+
type: ModuleType;
|
|
98
|
+
props: any;
|
|
99
|
+
inputs: import(".").IOProps[];
|
|
100
|
+
outputs: import(".").IOProps[];
|
|
101
|
+
} | {
|
|
102
|
+
id: string;
|
|
103
|
+
type: import("./Module").PolyModuleType;
|
|
104
|
+
inputs: import(".").IOProps[];
|
|
105
|
+
outputs: import(".").IOProps[];
|
|
106
|
+
name: string;
|
|
107
|
+
props: any;
|
|
108
|
+
};
|
|
109
|
+
triggerKey(noteName: string, type: string): void;
|
|
110
|
+
dispose(): void;
|
|
111
|
+
findById(id: string): AudioModule;
|
|
112
|
+
}
|
|
113
|
+
declare const _default: Engine;
|
|
114
|
+
export default _default;
|
package/build/Engine.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Context, setContext } from "tone";
|
|
2
|
+
import { ModuleType } from "./Module";
|
|
3
|
+
import { createModule } from "./Module";
|
|
4
|
+
import VoiceScheduler from "./Module/VoiceScheduler";
|
|
5
|
+
import { applyRoutes, createRoute } from "./routes";
|
|
6
|
+
class Engine {
|
|
7
|
+
static instance;
|
|
8
|
+
_master;
|
|
9
|
+
context;
|
|
10
|
+
modules;
|
|
11
|
+
routes;
|
|
12
|
+
constructor() {
|
|
13
|
+
this.modules = {};
|
|
14
|
+
this.routes = {};
|
|
15
|
+
}
|
|
16
|
+
static getInstance() {
|
|
17
|
+
if (!Engine.instance) {
|
|
18
|
+
Engine.instance = new Engine();
|
|
19
|
+
}
|
|
20
|
+
return Engine.instance;
|
|
21
|
+
}
|
|
22
|
+
initialize(props) {
|
|
23
|
+
this.context = new Context(props.context);
|
|
24
|
+
setContext(this.context);
|
|
25
|
+
this.context.transport.start();
|
|
26
|
+
return {
|
|
27
|
+
master: this.master,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
registerModule(name, type, props = {}) {
|
|
31
|
+
const audioModule = createModule(name, type, props);
|
|
32
|
+
this.modules[audioModule.id] = audioModule;
|
|
33
|
+
applyRoutes(Object.values(this.routes));
|
|
34
|
+
return audioModule.serialize();
|
|
35
|
+
}
|
|
36
|
+
updateNameModule(id, name) {
|
|
37
|
+
const audioModule = this.findById(id);
|
|
38
|
+
audioModule.name = name;
|
|
39
|
+
return audioModule.serialize();
|
|
40
|
+
}
|
|
41
|
+
updatePropsModule(id, props) {
|
|
42
|
+
const audioModule = this.findById(id);
|
|
43
|
+
const polyNumber = audioModule instanceof VoiceScheduler && audioModule.polyNumber;
|
|
44
|
+
audioModule.props = props;
|
|
45
|
+
const { polyNumber: newPolyNumber } = props;
|
|
46
|
+
if (polyNumber !== newPolyNumber)
|
|
47
|
+
applyRoutes(Object.values(this.routes));
|
|
48
|
+
return audioModule.serialize();
|
|
49
|
+
}
|
|
50
|
+
addRoute(props) {
|
|
51
|
+
const route = createRoute(props);
|
|
52
|
+
const newRoutes = { ...this.routes, [route.id]: route };
|
|
53
|
+
applyRoutes(Object.values(newRoutes));
|
|
54
|
+
this.routes = newRoutes;
|
|
55
|
+
return route;
|
|
56
|
+
}
|
|
57
|
+
removeRoute(route) {
|
|
58
|
+
delete this.routes[route.id];
|
|
59
|
+
applyRoutes(Object.values(this.routes));
|
|
60
|
+
}
|
|
61
|
+
get master() {
|
|
62
|
+
if (this._master)
|
|
63
|
+
return this._master.serialize();
|
|
64
|
+
const masterProps = this.registerModule("Master", "master", ModuleType.Master);
|
|
65
|
+
this._master = this.modules[masterProps.id];
|
|
66
|
+
return masterProps;
|
|
67
|
+
}
|
|
68
|
+
triggerKey(noteName, type) { }
|
|
69
|
+
dispose() {
|
|
70
|
+
Object.values(this.modules).forEach((m) => m.dispose());
|
|
71
|
+
this.modules = {};
|
|
72
|
+
}
|
|
73
|
+
findById(id) {
|
|
74
|
+
const audioModule = this.modules[id];
|
|
75
|
+
if (!audioModule)
|
|
76
|
+
throw Error(`Audio module with id ${id} not exists`);
|
|
77
|
+
return audioModule;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export default Engine.getInstance();
|
|
81
|
+
//# sourceMappingURL=Engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Engine.js","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import MidiEvent from "./MidiEvent";
|
|
2
|
+
export interface MidiDeviceInterface {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
state: string;
|
|
6
|
+
}
|
|
7
|
+
export declare type EventListerCallback = (event: MidiEvent) => void;
|
|
8
|
+
export default class MidiDevice implements MidiDeviceInterface {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
state: string;
|
|
12
|
+
eventListerCallbacks: EventListerCallback[];
|
|
13
|
+
private _midi;
|
|
14
|
+
constructor(midi: MIDIInput);
|
|
15
|
+
connect(): void;
|
|
16
|
+
disconnect(): void;
|
|
17
|
+
serialize(): {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
state: string;
|
|
21
|
+
};
|
|
22
|
+
addEventListener(callback: EventListerCallback): void;
|
|
23
|
+
removeEventListener(callback: EventListerCallback): void;
|
|
24
|
+
_processEvent(e: MIDIMessageEvent): void;
|
|
25
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import MidiEvent from "./MidiEvent";
|
|
2
|
+
export default class MidiDevice {
|
|
3
|
+
id;
|
|
4
|
+
name;
|
|
5
|
+
state;
|
|
6
|
+
eventListerCallbacks = [];
|
|
7
|
+
_midi;
|
|
8
|
+
constructor(midi) {
|
|
9
|
+
this.id = midi.id;
|
|
10
|
+
this.name = midi.name || `Device ${midi.id}`;
|
|
11
|
+
this.state = midi.state;
|
|
12
|
+
this._midi = midi;
|
|
13
|
+
this.connect();
|
|
14
|
+
}
|
|
15
|
+
connect() {
|
|
16
|
+
this._midi.onmidimessage = (e) => {
|
|
17
|
+
const isMidiEvent = e instanceof MIDIMessageEvent;
|
|
18
|
+
if (!isMidiEvent)
|
|
19
|
+
return;
|
|
20
|
+
this._processEvent(e);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
disconnect() {
|
|
24
|
+
this._midi.onmidimessage = null;
|
|
25
|
+
}
|
|
26
|
+
serialize() {
|
|
27
|
+
const { id, name, state } = this;
|
|
28
|
+
return { id, name, state };
|
|
29
|
+
}
|
|
30
|
+
addEventListener(callback) {
|
|
31
|
+
this.eventListerCallbacks.push(callback);
|
|
32
|
+
}
|
|
33
|
+
removeEventListener(callback) {
|
|
34
|
+
this.eventListerCallbacks = this.eventListerCallbacks.filter((c) => c === callback);
|
|
35
|
+
}
|
|
36
|
+
_processEvent(e) {
|
|
37
|
+
const event = new MidiEvent(e);
|
|
38
|
+
switch (event.type) {
|
|
39
|
+
case "noteOn":
|
|
40
|
+
case "noteOff":
|
|
41
|
+
this.eventListerCallbacks.forEach((callback) => callback(event));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=MidiDevice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MidiDevice.js","sourceRoot":"","sources":["../src/MidiDevice.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,aAAa,CAAC;AAUpC,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,EAAE,CAAS;IACX,IAAI,CAAS;IACb,KAAK,CAAS;IACd,oBAAoB,GAA0B,EAAE,CAAC;IAEzC,KAAK,CAAY;IAEzB,YAAY,IAAe;QACzB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,IAAI,CAAC,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,OAAO;QACL,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,EAAE;YAC/B,MAAM,WAAW,GAAG,CAAC,YAAY,gBAAgB,CAAC;YAElD,IAAI,CAAC,WAAW;gBAAE,OAAO;YAEzB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC;IAED,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;IAClC,CAAC;IAED,SAAS;QACP,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAEjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,gBAAgB,CAAC,QAA6B;QAC5C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,mBAAmB,CAAC,QAA6B;QAC/C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAC1D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CACtB,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,CAAmB;QAC/B,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;QAE/B,QAAQ,KAAK,CAAC,IAAI,EAAE;YAClB,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS;gBACZ,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;SACpE;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import MidiDevice from "./MidiDevice";
|
|
2
|
+
declare class MidiDeviceManager {
|
|
3
|
+
private devices;
|
|
4
|
+
private static instance;
|
|
5
|
+
static getInstance(): MidiDeviceManager;
|
|
6
|
+
fetchDevices(): Promise<MidiDevice[]>;
|
|
7
|
+
find(id: string): Promise<MidiDevice>;
|
|
8
|
+
_inputs(): Promise<MIDIInput[]>;
|
|
9
|
+
onStateChange(callback: Function): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
declare const _default: MidiDeviceManager;
|
|
12
|
+
export default _default;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import MidiDevice from "./MidiDevice";
|
|
2
|
+
class MidiDeviceManager {
|
|
3
|
+
devices;
|
|
4
|
+
static instance;
|
|
5
|
+
static getInstance() {
|
|
6
|
+
if (!MidiDeviceManager.instance) {
|
|
7
|
+
MidiDeviceManager.instance = new MidiDeviceManager();
|
|
8
|
+
}
|
|
9
|
+
return MidiDeviceManager.instance;
|
|
10
|
+
}
|
|
11
|
+
async fetchDevices() {
|
|
12
|
+
if (this.devices)
|
|
13
|
+
return this.devices;
|
|
14
|
+
this.devices = (await this._inputs()).map((input) => new MidiDevice(input));
|
|
15
|
+
return this.devices;
|
|
16
|
+
}
|
|
17
|
+
async find(id) {
|
|
18
|
+
const device = (await this.fetchDevices()).find((dev) => dev.id === id);
|
|
19
|
+
if (!device)
|
|
20
|
+
throw Error(`Midie device with id ${id} not found`);
|
|
21
|
+
return device;
|
|
22
|
+
}
|
|
23
|
+
async _inputs() {
|
|
24
|
+
const inputs = [];
|
|
25
|
+
const access = await navigator.requestMIDIAccess();
|
|
26
|
+
access.inputs.forEach((input) => inputs.push(input));
|
|
27
|
+
return inputs;
|
|
28
|
+
}
|
|
29
|
+
async onStateChange(callback) {
|
|
30
|
+
const access = await navigator.requestMIDIAccess();
|
|
31
|
+
await this.fetchDevices();
|
|
32
|
+
access.onstatechange = (e) => {
|
|
33
|
+
const isMidiEvent = e instanceof MIDIConnectionEvent;
|
|
34
|
+
if (!isMidiEvent)
|
|
35
|
+
return;
|
|
36
|
+
if (e.port instanceof MIDIOutput)
|
|
37
|
+
return;
|
|
38
|
+
const input = e.port;
|
|
39
|
+
const midi = new MidiDevice(input);
|
|
40
|
+
callback(midi);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export default MidiDeviceManager.getInstance();
|
|
45
|
+
//# sourceMappingURL=MidiDeviceManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MidiDeviceManager.js","sourceRoot":"","sources":["../src/MidiDeviceManager.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,iBAAiB;IACb,OAAO,CAAoB;IAC3B,MAAM,CAAC,QAAQ,CAAoB;IAEpC,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;YAC/B,iBAAiB,CAAC,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;SACtD;QAED,OAAO,iBAAiB,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QAEtC,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAE5E,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAU;QACnB,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAC7C,CAAC,GAAe,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CACnC,CAAC;QAEF,IAAI,CAAC,MAAM;YAAE,MAAM,KAAK,CAAC,wBAAwB,EAAE,YAAY,CAAC,CAAC;QAEjE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,MAAM,GAAqB,EAAE,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,iBAAiB,EAAE,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAErD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAkB;QACpC,MAAM,MAAM,GAAe,MAAM,SAAS,CAAC,iBAAiB,EAAE,CAAC;QAC/D,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAE1B,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,EAAE;YAC3B,MAAM,WAAW,GAAG,CAAC,YAAY,mBAAmB,CAAC;YAErD,IAAI,CAAC,WAAW;gBAAE,OAAO;YACzB,IAAI,CAAC,CAAC,IAAI,YAAY,UAAU;gBAAE,OAAO;YAEzC,MAAM,KAAK,GAAG,CAAC,CAAC,IAAiB,CAAC;YAElC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;YAEnC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC;CACF;AAED,eAAe,iBAAiB,CAAC,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Note from "./Note";
|
|
2
|
+
export default class MidiEvent {
|
|
3
|
+
note?: Note;
|
|
4
|
+
triggeredAt: number;
|
|
5
|
+
private data;
|
|
6
|
+
private _type;
|
|
7
|
+
private _event;
|
|
8
|
+
constructor(event: MIDIMessageEvent);
|
|
9
|
+
get type(): string;
|
|
10
|
+
get isNote(): boolean;
|
|
11
|
+
defineNote(): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { now } from "tone";
|
|
2
|
+
import Note from "./Note";
|
|
3
|
+
const EvenType = {
|
|
4
|
+
8: "noteOff",
|
|
5
|
+
9: "noteOn",
|
|
6
|
+
};
|
|
7
|
+
export default class MidiEvent {
|
|
8
|
+
note;
|
|
9
|
+
triggeredAt;
|
|
10
|
+
data;
|
|
11
|
+
_type;
|
|
12
|
+
_event;
|
|
13
|
+
constructor(event) {
|
|
14
|
+
this._event = event;
|
|
15
|
+
this.triggeredAt = now();
|
|
16
|
+
this.data = event.data;
|
|
17
|
+
this.defineNote();
|
|
18
|
+
}
|
|
19
|
+
get type() {
|
|
20
|
+
if (this._type)
|
|
21
|
+
return this._type;
|
|
22
|
+
let type = EvenType[this.data[0] >> 4];
|
|
23
|
+
if (type === "noteOn" && this.data[2] === 0) {
|
|
24
|
+
type = "noteOff";
|
|
25
|
+
}
|
|
26
|
+
return (this._type = type);
|
|
27
|
+
}
|
|
28
|
+
get isNote() {
|
|
29
|
+
return this.type === "noteOn" || this.type === "noteOff";
|
|
30
|
+
}
|
|
31
|
+
defineNote() {
|
|
32
|
+
if (!this.isNote)
|
|
33
|
+
return;
|
|
34
|
+
this.note = new Note(this._event);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=MidiEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MidiEvent.js","sourceRoot":"","sources":["../src/MidiEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC3B,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,MAAM,QAAQ,GAA8B;IAC1C,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,QAAQ;CACZ,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,SAAS;IAC5B,IAAI,CAAQ;IACZ,WAAW,CAAS;IACZ,IAAI,CAAa;IACjB,KAAK,CAAS;IACd,MAAM,CAAmB;IAEjC,YAAY,KAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,IAAI,IAAI;QACN,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QAElC,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEvC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;YAC3C,IAAI,GAAG,SAAS,CAAC;SAClB;QAED,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;IAC3D,CAAC;IAED,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { InputNode } from "tone";
|
|
2
|
+
import { Input, Output, IOInterface } from "./IO";
|
|
3
|
+
import MidiEvent from "../MidiEvent";
|
|
4
|
+
import { AudioModule } from "../Module";
|
|
5
|
+
export declare enum ModuleType {
|
|
6
|
+
Oscillator = "monoOscillator",
|
|
7
|
+
Envelope = "monoEnvelope",
|
|
8
|
+
AmpEnvelope = "monoAmpEnvelope",
|
|
9
|
+
FreqEnvelope = "monoFreqEnvelope",
|
|
10
|
+
Filter = "monoFilter",
|
|
11
|
+
Master = "master",
|
|
12
|
+
Voice = "voice",
|
|
13
|
+
MidiSelector = "midiSelector",
|
|
14
|
+
Volume = "monoVolume"
|
|
15
|
+
}
|
|
16
|
+
export interface Connectable {
|
|
17
|
+
connect: (inputNode: InputNode) => void;
|
|
18
|
+
disconnect: (inputNode?: InputNode) => void;
|
|
19
|
+
dispose: () => void;
|
|
20
|
+
}
|
|
21
|
+
export interface Triggerable {
|
|
22
|
+
triggerAttack: Function;
|
|
23
|
+
triggerRelease: Function;
|
|
24
|
+
}
|
|
25
|
+
export interface ModuleInterface {
|
|
26
|
+
name: string;
|
|
27
|
+
type: ModuleType;
|
|
28
|
+
props?: {
|
|
29
|
+
[key: string]: any;
|
|
30
|
+
};
|
|
31
|
+
voiceNo?: number;
|
|
32
|
+
}
|
|
33
|
+
export declare class DummnyInternalModule implements Connectable {
|
|
34
|
+
connect(inputNode: InputNode): void;
|
|
35
|
+
disconnect(inputNode?: InputNode): void;
|
|
36
|
+
dispose(): void;
|
|
37
|
+
}
|
|
38
|
+
declare class Module<InternalModule extends Connectable, PropsInterface> implements ModuleInterface {
|
|
39
|
+
internalModule: InternalModule;
|
|
40
|
+
readonly id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
inputs: Input[];
|
|
43
|
+
outputs: Output[];
|
|
44
|
+
type: ModuleType;
|
|
45
|
+
readonly voiceNo?: number;
|
|
46
|
+
updatedAt: Date;
|
|
47
|
+
_props: PropsInterface;
|
|
48
|
+
constructor(internalModule: InternalModule, props: Partial<ModuleInterface>);
|
|
49
|
+
set props(value: PropsInterface);
|
|
50
|
+
get props(): PropsInterface;
|
|
51
|
+
plug(audioModule: AudioModule, from: string, to: string): void;
|
|
52
|
+
unplugAll(): void;
|
|
53
|
+
connect: (inputAudioModule: AudioModule, attribute?: string) => void;
|
|
54
|
+
disconnect: (inputAudioModule: AudioModule, attribute?: string) => void;
|
|
55
|
+
dispose(): void;
|
|
56
|
+
triggerAttack(midiEvent: MidiEvent): void;
|
|
57
|
+
triggerRelease(midiEvent: MidiEvent): void;
|
|
58
|
+
midiTriggered: (midiEvent: MidiEvent) => void;
|
|
59
|
+
serialize(): {
|
|
60
|
+
id: string;
|
|
61
|
+
name: string;
|
|
62
|
+
type: ModuleType;
|
|
63
|
+
props: PropsInterface;
|
|
64
|
+
inputs: import("./IO").SerializeInterface[];
|
|
65
|
+
outputs: import("./IO").SerializeInterface[];
|
|
66
|
+
};
|
|
67
|
+
protected registerInput(props: IOInterface): Input;
|
|
68
|
+
protected registerOutput(props: IOInterface): Output;
|
|
69
|
+
protected registerBasicOutputs(): void;
|
|
70
|
+
protected registerBasicInputs(): void;
|
|
71
|
+
}
|
|
72
|
+
export default Module;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from "uuid";
|
|
2
|
+
import { Input, Output } from "./IO";
|
|
3
|
+
import { PolyModule } from "../Module";
|
|
4
|
+
export var ModuleType;
|
|
5
|
+
(function (ModuleType) {
|
|
6
|
+
ModuleType["Oscillator"] = "monoOscillator";
|
|
7
|
+
ModuleType["Envelope"] = "monoEnvelope";
|
|
8
|
+
ModuleType["AmpEnvelope"] = "monoAmpEnvelope";
|
|
9
|
+
ModuleType["FreqEnvelope"] = "monoFreqEnvelope";
|
|
10
|
+
ModuleType["Filter"] = "monoFilter";
|
|
11
|
+
ModuleType["Master"] = "master";
|
|
12
|
+
ModuleType["Voice"] = "voice";
|
|
13
|
+
ModuleType["MidiSelector"] = "midiSelector";
|
|
14
|
+
ModuleType["Volume"] = "monoVolume";
|
|
15
|
+
})(ModuleType || (ModuleType = {}));
|
|
16
|
+
export class DummnyInternalModule {
|
|
17
|
+
connect(inputNode) {
|
|
18
|
+
throw Error("This module is not connectable");
|
|
19
|
+
}
|
|
20
|
+
disconnect(inputNode) { }
|
|
21
|
+
dispose() { }
|
|
22
|
+
}
|
|
23
|
+
class Module {
|
|
24
|
+
internalModule;
|
|
25
|
+
id;
|
|
26
|
+
name;
|
|
27
|
+
inputs = [];
|
|
28
|
+
outputs = [];
|
|
29
|
+
type;
|
|
30
|
+
voiceNo;
|
|
31
|
+
updatedAt;
|
|
32
|
+
_props;
|
|
33
|
+
constructor(internalModule, props) {
|
|
34
|
+
this.internalModule = internalModule;
|
|
35
|
+
this.id = uuidv4();
|
|
36
|
+
Object.assign(this, props);
|
|
37
|
+
}
|
|
38
|
+
set props(value) {
|
|
39
|
+
if (!value)
|
|
40
|
+
return;
|
|
41
|
+
if (!this._props)
|
|
42
|
+
this._props = value;
|
|
43
|
+
this.updatedAt = new Date();
|
|
44
|
+
Object.assign(this, value);
|
|
45
|
+
}
|
|
46
|
+
get props() {
|
|
47
|
+
return this._props;
|
|
48
|
+
}
|
|
49
|
+
plug(audioModule, from, to) {
|
|
50
|
+
const output = this.outputs.find((i) => i.name === from);
|
|
51
|
+
if (!output)
|
|
52
|
+
throw Error(`Output ${from} not exist`);
|
|
53
|
+
console.log(`${this.name}:${from} => ${audioModule.name}:${to}`);
|
|
54
|
+
const input = audioModule.inputs.find((i) => i.name === to);
|
|
55
|
+
if (!input)
|
|
56
|
+
throw Error(`Input ${to} in module ${audioModule.name} not exist`);
|
|
57
|
+
output.plug(input);
|
|
58
|
+
}
|
|
59
|
+
unplugAll() {
|
|
60
|
+
this.outputs.forEach((o) => o.unPlugAll());
|
|
61
|
+
}
|
|
62
|
+
connect = (inputAudioModule, attribute = "internalModule") => {
|
|
63
|
+
if (inputAudioModule instanceof PolyModule) {
|
|
64
|
+
inputAudioModule.audioModules.forEach((m) => {
|
|
65
|
+
this.internalModule.connect(m[attribute]);
|
|
66
|
+
});
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
this.internalModule.connect(inputAudioModule[attribute]);
|
|
70
|
+
};
|
|
71
|
+
disconnect = (inputAudioModule, attribute = "internalModule") => {
|
|
72
|
+
if (inputAudioModule instanceof PolyModule) {
|
|
73
|
+
inputAudioModule.audioModules.forEach((m) => {
|
|
74
|
+
this.internalModule.disconnect(m[attribute]);
|
|
75
|
+
});
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this.internalModule.disconnect(inputAudioModule[attribute]);
|
|
79
|
+
};
|
|
80
|
+
dispose() {
|
|
81
|
+
this.internalModule.dispose();
|
|
82
|
+
}
|
|
83
|
+
triggerAttack(midiEvent) {
|
|
84
|
+
throw Error("triggerAttack not implemented");
|
|
85
|
+
}
|
|
86
|
+
triggerRelease(midiEvent) {
|
|
87
|
+
throw Error("triggerRelease not implemented");
|
|
88
|
+
}
|
|
89
|
+
midiTriggered = (midiEvent) => {
|
|
90
|
+
switch (midiEvent.type) {
|
|
91
|
+
case "noteOn":
|
|
92
|
+
this.triggerAttack(midiEvent);
|
|
93
|
+
break;
|
|
94
|
+
case "noteOff":
|
|
95
|
+
this.triggerRelease(midiEvent);
|
|
96
|
+
break;
|
|
97
|
+
default:
|
|
98
|
+
throw Error("This type is not a note");
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
serialize() {
|
|
102
|
+
return {
|
|
103
|
+
id: this.id,
|
|
104
|
+
name: this.name,
|
|
105
|
+
type: this.type,
|
|
106
|
+
props: this.props,
|
|
107
|
+
inputs: this.inputs.map((i) => i.serialize()),
|
|
108
|
+
outputs: this.outputs.map((i) => i.serialize()),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
registerInput(props) {
|
|
112
|
+
const input = new Input(this, props);
|
|
113
|
+
this.inputs.push(input);
|
|
114
|
+
return input;
|
|
115
|
+
}
|
|
116
|
+
registerOutput(props) {
|
|
117
|
+
const output = new Output(this, props);
|
|
118
|
+
this.outputs.push(output);
|
|
119
|
+
return output;
|
|
120
|
+
}
|
|
121
|
+
registerBasicOutputs() {
|
|
122
|
+
this.registerOutput({
|
|
123
|
+
name: "output",
|
|
124
|
+
onPlug: (output) => {
|
|
125
|
+
this.connect(output.audioModule);
|
|
126
|
+
},
|
|
127
|
+
onUnPlug: (output) => {
|
|
128
|
+
this.disconnect(output.audioModule);
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
registerBasicInputs() {
|
|
133
|
+
this.registerInput({
|
|
134
|
+
name: "input",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export default Module;
|
|
139
|
+
//# sourceMappingURL=Base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Base.js","sourceRoot":"","sources":["../../src/Module/Base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAe,MAAM,MAAM,CAAC;AAElD,OAAO,EAAe,UAAU,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,CAAN,IAAY,UAUX;AAVD,WAAY,UAAU;IACpB,2CAA6B,CAAA;IAC7B,uCAAyB,CAAA;IACzB,6CAA+B,CAAA;IAC/B,+CAAiC,CAAA;IACjC,mCAAqB,CAAA;IACrB,+BAAiB,CAAA;IACjB,6BAAe,CAAA;IACf,2CAA6B,CAAA;IAC7B,mCAAqB,CAAA;AACvB,CAAC,EAVW,UAAU,KAAV,UAAU,QAUrB;AAoBD,MAAM,OAAO,oBAAoB;IAC/B,OAAO,CAAC,SAAoB;QAC1B,MAAM,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,UAAU,CAAC,SAAqB,IAAG,CAAC;IAEpC,OAAO,KAAI,CAAC;CACb;AAED,MAAM,MAAM;IAGV,cAAc,CAAiB;IAEtB,EAAE,CAAS;IACpB,IAAI,CAAS;IACb,MAAM,GAAY,EAAE,CAAC;IACrB,OAAO,GAAa,EAAE,CAAC;IACvB,IAAI,CAAa;IACR,OAAO,CAAU;IAC1B,SAAS,CAAO;IAChB,MAAM,CAAiB;IAEvB,YAAY,cAA8B,EAAE,KAA+B;QACzE,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;QAEnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,CAAC,KAAqB;QAC7B,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEtC,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE5B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,WAAwB,EAAE,IAAY,EAAE,EAAU;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM;YAAE,MAAM,KAAK,CAAC,UAAU,IAAI,YAAY,CAAC,CAAC;QAErD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,OAAO,WAAW,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK;YACR,MAAM,KAAK,CAAC,SAAS,EAAE,cAAc,WAAW,CAAC,IAAI,YAAY,CAAC,CAAC;QAErE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,SAAS;QACP,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,GAAG,CACR,gBAA6B,EAC7B,YAAoB,gBAAgB,EACpC,EAAE;QACF,IAAI,gBAAgB,YAAY,UAAU,EAAE;YAC1C,gBAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC1C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAE,CAAS,CAAC,SAAS,CAAc,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;YACH,OAAO;SACR;QAED,IAAI,CAAC,cAAc,CAAC,OAAO,CACxB,gBAAwB,CAAC,SAAS,CAAc,CAClD,CAAC;IACJ,CAAC,CAAC;IAEF,UAAU,GAAG,CACX,gBAA6B,EAC7B,YAAoB,gBAAgB,EACpC,EAAE;QACF,IAAI,gBAAgB,YAAY,UAAU,EAAE;YAC1C,gBAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC1C,IAAI,CAAC,cAAc,CAAC,UAAU,CAAE,CAAS,CAAC,SAAS,CAAc,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;YACH,OAAO;SACR;QAED,IAAI,CAAC,cAAc,CAAC,UAAU,CAC3B,gBAAwB,CAAC,SAAS,CAAc,CAClD,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,aAAa,CAAC,SAAoB;QAChC,MAAM,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAED,cAAc,CAAC,SAAoB;QACjC,MAAM,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,aAAa,GAAG,CAAC,SAAoB,EAAE,EAAE;QACvC,QAAQ,SAAS,CAAC,IAAI,EAAE;YACtB,KAAK,QAAQ;gBACX,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBAC9B,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBAC/B,MAAM;YACR;gBACE,MAAM,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC1C;IACH,CAAC,CAAC;IAEF,SAAS;QACP,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YAC7C,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC;IAES,aAAa,CAAC,KAAkB;QACxC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAExB,OAAO,KAAK,CAAC;IACf,CAAC;IAES,cAAc,CAAC,KAAkB;QACzC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAES,oBAAoB;QAC5B,IAAI,CAAC,cAAc,CAAC;YAClB,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,CAAC,MAAc,EAAE,EAAE;gBACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACnC,CAAC;YACD,QAAQ,EAAE,CAAC,MAAc,EAAE,EAAE;gBAC3B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACtC,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAES,mBAAmB;QAC3B,IAAI,CAAC,aAAa,CAAC;YACjB,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;IACL,CAAC;CACF;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AmplitudeEnvelope } from "tone";
|
|
2
|
+
import Base, { EnvelopeInterface, PolyBase } from "./Base";
|
|
3
|
+
export default class AmpEnvelope extends Base<AmplitudeEnvelope> {
|
|
4
|
+
constructor(name: string, props: EnvelopeInterface);
|
|
5
|
+
}
|
|
6
|
+
export declare class PolyAmpEnvelope extends PolyBase<AmpEnvelope> {
|
|
7
|
+
constructor(name: string, props: Partial<EnvelopeInterface>);
|
|
8
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AmplitudeEnvelope } from "tone";
|
|
2
|
+
import { ModuleType } from "../index";
|
|
3
|
+
import Base, { PolyBase } from "./Base";
|
|
4
|
+
import { PolyModuleType } from "../PolyModule";
|
|
5
|
+
export default class AmpEnvelope extends Base {
|
|
6
|
+
constructor(name, props) {
|
|
7
|
+
super(name, ModuleType.AmpEnvelope, new AmplitudeEnvelope(), props);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class PolyAmpEnvelope extends PolyBase {
|
|
11
|
+
constructor(name, props) {
|
|
12
|
+
super(name, ModuleType.AmpEnvelope, PolyModuleType.AmpEnvelope, props);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=AmpEnvelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AmpEnvelope.js","sourceRoot":"","sources":["../../../src/Module/Envelope/AmpEnvelope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,IAAI,EAAE,EAAqB,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,IAAuB;IAC9D,YAAY,IAAY,EAAE,KAAwB;QAChD,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,EAAE,IAAI,iBAAiB,EAAE,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAqB;IACxD,YAAY,IAAY,EAAE,KAAiC;QACzD,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,EAAE,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzE,CAAC;CACF"}
|