@blibliki/engine 0.1.15 → 0.1.17
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 +110 -0
- package/build/Engine.d.ts +8 -12
- package/build/Engine.js +29 -18
- package/build/Engine.js.map +1 -1
- package/build/Module/Base.d.ts +4 -6
- package/build/Module/Base.js.map +1 -1
- package/build/Module/DataSequencer.d.ts +2 -0
- package/build/Module/DataSequencer.js +31 -7
- package/build/Module/DataSequencer.js.map +1 -1
- package/build/Module/Effect.js.map +1 -1
- package/package.json +1 -1
- package/src/Engine.ts +32 -17
- package/src/Module/Base.ts +7 -4
- package/src/Module/DataSequencer.ts +33 -7
- package/src/Module/Effect.ts +1 -1
package/README.md
CHANGED
|
@@ -12,6 +12,116 @@ One notable advantage of the data-driven approach is the ability to easily save
|
|
|
12
12
|
|
|
13
13
|
Blibliki Engine offers polyphony support and provides access to essential audio modules such as oscillators, filters, envelopes, and effects. It's important to note that the list of available audio modules will be extended as the development of the engine continues.
|
|
14
14
|
|
|
15
|
+
## Installing
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @blibliki/engine
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
```JavaScript
|
|
24
|
+
import Engine from "@blibliki/engine";
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
#### Initialize
|
|
28
|
+
|
|
29
|
+
`Engine.initialize` returns a promise that resolves when the engine is initialized and ready for use.
|
|
30
|
+
|
|
31
|
+
```JavaScript
|
|
32
|
+
Engine.initialize({ context: { lookAhead: 0.03 } });
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
#### Start / Stop
|
|
36
|
+
|
|
37
|
+
This methods are triggering all audio modules to start or stop
|
|
38
|
+
|
|
39
|
+
```JavaScript
|
|
40
|
+
Engine.start();
|
|
41
|
+
Engine.stop();
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
#### Modules
|
|
45
|
+
|
|
46
|
+
##### AudioModule structure
|
|
47
|
+
|
|
48
|
+
All audio modules share the shame structure.
|
|
49
|
+
The props structure vary per audioModule.
|
|
50
|
+
|
|
51
|
+
```JavaScript
|
|
52
|
+
{
|
|
53
|
+
id: string,
|
|
54
|
+
name: string,
|
|
55
|
+
props: Object
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
##### Create audio module
|
|
60
|
+
|
|
61
|
+
```JavaScript
|
|
62
|
+
const master = Engine.master;
|
|
63
|
+
const osc = Engine.addModule({ name: "Osc", type: "Oscillator" });
|
|
64
|
+
const volume = Engine.addModule({
|
|
65
|
+
name: "Vol",
|
|
66
|
+
type: "Volume",
|
|
67
|
+
props: { volume: -10 },
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
##### Update props
|
|
72
|
+
|
|
73
|
+
```JavaScript
|
|
74
|
+
// Update props
|
|
75
|
+
Engine.updatePropsModule(volume.id, { volume: -20 });
|
|
76
|
+
Engine.updatePropsModule(osc.id, { wave: "square", fine: -10 });
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
##### Remove audio module
|
|
80
|
+
|
|
81
|
+
```JavaScript
|
|
82
|
+
Engine.removeModule(osc.id);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
#### Routes
|
|
86
|
+
|
|
87
|
+
##### Route structure
|
|
88
|
+
|
|
89
|
+
```JavaScript
|
|
90
|
+
{
|
|
91
|
+
id: string,
|
|
92
|
+
sourceId: string,
|
|
93
|
+
outputName: string,
|
|
94
|
+
destinationId: string,
|
|
95
|
+
inputName: string,
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
##### Add Route
|
|
100
|
+
|
|
101
|
+
```JavaScript
|
|
102
|
+
// Connect oscillator out to volume input
|
|
103
|
+
const oscVolRoute = Engine.addRoute({
|
|
104
|
+
sourceId: osc.id,
|
|
105
|
+
outputName: "output",
|
|
106
|
+
destinationId: volume.id,
|
|
107
|
+
inputName: "input",
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// Connect oscillator out to volume input
|
|
111
|
+
const volToMaster = Engine.addRoute({
|
|
112
|
+
sourceId: volume.id,
|
|
113
|
+
outputName: "output",
|
|
114
|
+
destinationId: master.id,
|
|
115
|
+
inputName: "input",
|
|
116
|
+
});
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
##### Remove route
|
|
120
|
+
|
|
121
|
+
```JavaScript
|
|
122
|
+
Engine.removeRoute(oscVolRoute.id);
|
|
123
|
+
```
|
|
124
|
+
|
|
15
125
|
## Contributing
|
|
16
126
|
|
|
17
127
|
As a work-in-progress project, Blibliki Engine actively welcomes contributions and feedback from the community. Whether it's reporting issues, suggesting new features, or submitting code changes, contributors are encouraged to get involved and help shape the future of Blibliki Engine.
|
package/build/Engine.d.ts
CHANGED
|
@@ -25,17 +25,12 @@ declare class Engine {
|
|
|
25
25
|
};
|
|
26
26
|
private constructor();
|
|
27
27
|
static getInstance(): Engine;
|
|
28
|
-
initialize(props: InitializeInterface):
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
inputs: import(".").IOProps[];
|
|
35
|
-
outputs: import(".").IOProps[];
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
|
-
registerModule(name: string, type: string, props?: any): {
|
|
28
|
+
initialize(props: InitializeInterface): Promise<unknown>;
|
|
29
|
+
addModule(params: {
|
|
30
|
+
name: string;
|
|
31
|
+
type: string;
|
|
32
|
+
props?: any;
|
|
33
|
+
}): {
|
|
39
34
|
id: string;
|
|
40
35
|
name: string;
|
|
41
36
|
type: string;
|
|
@@ -43,7 +38,7 @@ declare class Engine {
|
|
|
43
38
|
inputs: import(".").IOProps[];
|
|
44
39
|
outputs: import(".").IOProps[];
|
|
45
40
|
};
|
|
46
|
-
|
|
41
|
+
removeModule(id: string): string[];
|
|
47
42
|
updateNameModule(id: string, name: string): {
|
|
48
43
|
id: string;
|
|
49
44
|
name: string;
|
|
@@ -86,6 +81,7 @@ declare class Engine {
|
|
|
86
81
|
stop(): void;
|
|
87
82
|
get bpm(): number;
|
|
88
83
|
set bpm(value: number);
|
|
84
|
+
updateRoutes(): void;
|
|
89
85
|
private applyRoutesRequired;
|
|
90
86
|
private moduleRouteIds;
|
|
91
87
|
}
|
package/build/Engine.js
CHANGED
|
@@ -26,26 +26,31 @@ class Engine {
|
|
|
26
26
|
return Engine.instance;
|
|
27
27
|
}
|
|
28
28
|
initialize(props) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
return new Promise((resolve) => {
|
|
30
|
+
if (this.context)
|
|
31
|
+
return resolve({ master: this.master });
|
|
32
|
+
this.context = new Context(props.context);
|
|
33
|
+
setContext(this.context);
|
|
34
|
+
this.context.transport.start();
|
|
35
|
+
this.midiDeviceManager = new MidiDeviceManager();
|
|
36
|
+
setTimeout(() => {
|
|
37
|
+
resolve({ master: this.master });
|
|
38
|
+
}, 0);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
addModule(params) {
|
|
42
|
+
const { name, type, props = {} } = params;
|
|
38
43
|
const audioModule = createModule(name, type, {});
|
|
39
44
|
audioModule.props = props;
|
|
40
45
|
this.modules[audioModule.id] = audioModule;
|
|
41
|
-
|
|
46
|
+
this.updateRoutes();
|
|
42
47
|
return audioModule.serialize();
|
|
43
48
|
}
|
|
44
|
-
|
|
49
|
+
removeModule(id) {
|
|
45
50
|
this.modules[id].dispose();
|
|
46
51
|
const moduleRouteIds = this.moduleRouteIds(id);
|
|
47
52
|
moduleRouteIds.forEach((routeId) => delete this.routes[routeId]);
|
|
48
|
-
|
|
53
|
+
this.updateRoutes();
|
|
49
54
|
delete this.modules[id];
|
|
50
55
|
return moduleRouteIds;
|
|
51
56
|
}
|
|
@@ -65,24 +70,24 @@ class Engine {
|
|
|
65
70
|
const applyRoutesRequired = this.applyRoutesRequired(audioModule, props);
|
|
66
71
|
audioModule.props = props;
|
|
67
72
|
if (applyRoutesRequired)
|
|
68
|
-
|
|
73
|
+
this.updateRoutes();
|
|
69
74
|
return audioModule.serialize();
|
|
70
75
|
}
|
|
71
76
|
addRoute(props) {
|
|
72
77
|
const route = createRoute(props);
|
|
73
78
|
const newRoutes = { ...this.routes, [route.id]: route };
|
|
74
|
-
applyRoutes(Object.values(newRoutes));
|
|
75
79
|
this.routes = newRoutes;
|
|
80
|
+
this.updateRoutes();
|
|
76
81
|
return route;
|
|
77
82
|
}
|
|
78
83
|
removeRoute(id) {
|
|
79
84
|
delete this.routes[id];
|
|
80
|
-
|
|
85
|
+
this.updateRoutes();
|
|
81
86
|
}
|
|
82
87
|
get master() {
|
|
83
88
|
if (this._master)
|
|
84
89
|
return this._master.serialize();
|
|
85
|
-
const masterProps = this.
|
|
90
|
+
const masterProps = this.addModule({ name: "Master", type: "Master" });
|
|
86
91
|
this._master = this.modules[masterProps.id];
|
|
87
92
|
return masterProps;
|
|
88
93
|
}
|
|
@@ -96,7 +101,7 @@ class Engine {
|
|
|
96
101
|
return;
|
|
97
102
|
m.dispose();
|
|
98
103
|
});
|
|
99
|
-
this.modules = { [this._master.id]: this._master };
|
|
104
|
+
this.modules = this._master ? { [this._master.id]: this._master } : {};
|
|
100
105
|
this.routes = {};
|
|
101
106
|
}
|
|
102
107
|
findById(id) {
|
|
@@ -106,11 +111,14 @@ class Engine {
|
|
|
106
111
|
return audioModule;
|
|
107
112
|
}
|
|
108
113
|
get isStarted() {
|
|
109
|
-
return this.context
|
|
114
|
+
return (this.context !== undefined &&
|
|
115
|
+
this.context.transport.state === "started" &&
|
|
116
|
+
this._isStarted);
|
|
110
117
|
}
|
|
111
118
|
start() {
|
|
112
119
|
const startTime = now();
|
|
113
120
|
this._isStarted = true;
|
|
121
|
+
this.updateRoutes();
|
|
114
122
|
Object.values(this.modules).forEach((audioModule) => {
|
|
115
123
|
const am = audioModule;
|
|
116
124
|
if (!am.start)
|
|
@@ -134,6 +142,9 @@ class Engine {
|
|
|
134
142
|
set bpm(value) {
|
|
135
143
|
this.context.transport.bpm.value = value;
|
|
136
144
|
}
|
|
145
|
+
updateRoutes() {
|
|
146
|
+
applyRoutes(Object.values(this.routes));
|
|
147
|
+
}
|
|
137
148
|
applyRoutesRequired(audioModule, props) {
|
|
138
149
|
if (!props.polyNumber)
|
|
139
150
|
return false;
|
package/build/Engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Engine.js","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,SAAoB,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAe,YAAY,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAErC,OAAO,cAAc,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,WAAW,EAA8B,MAAM,UAAU,CAAC;AAahF,MAAM,MAAM;IACV,iBAAiB,CAAoB;IAC7B,MAAM,CAAC,QAAQ,CAAS;IACxB,OAAO,CAAS;IAChB,OAAO,CAAU;IACjB,oBAAoB,CAAuC;IAC3D,UAAU,GAAY,KAAK,CAAC;IAEpC,OAAO,CAEL;IAEF,MAAM,CAEJ;IAEF;QACE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;IACjC,CAAC;IAEM,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YACpB,MAAM,CAAC,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAC;SAChC;QAED,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,UAAU,CAAC,KAA0B;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"Engine.js","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"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"}
|
package/build/Module/Base.d.ts
CHANGED
|
@@ -15,11 +15,9 @@ export interface Triggerable {
|
|
|
15
15
|
export interface Voicable {
|
|
16
16
|
voiceNo?: number;
|
|
17
17
|
}
|
|
18
|
-
export interface ModuleInterface {
|
|
18
|
+
export interface ModuleInterface<PropsInterface> {
|
|
19
19
|
name: string;
|
|
20
|
-
props
|
|
21
|
-
[key: string]: any;
|
|
22
|
-
};
|
|
20
|
+
props: PropsInterface;
|
|
23
21
|
voiceNo?: number;
|
|
24
22
|
}
|
|
25
23
|
export declare class DummnyInternalModule implements Connectable {
|
|
@@ -27,7 +25,7 @@ export declare class DummnyInternalModule implements Connectable {
|
|
|
27
25
|
disconnect(inputNode?: InputNode): void;
|
|
28
26
|
dispose(): void;
|
|
29
27
|
}
|
|
30
|
-
declare class Module<InternalModule extends Connectable, PropsInterface> implements ModuleInterface {
|
|
28
|
+
declare class Module<InternalModule extends Connectable, PropsInterface> implements ModuleInterface<PropsInterface> {
|
|
31
29
|
static readonly moduleName: string;
|
|
32
30
|
readonly id: string;
|
|
33
31
|
name: string;
|
|
@@ -37,7 +35,7 @@ declare class Module<InternalModule extends Connectable, PropsInterface> impleme
|
|
|
37
35
|
readonly voiceNo?: number;
|
|
38
36
|
updatedAt: Date;
|
|
39
37
|
_props: PropsInterface;
|
|
40
|
-
constructor(internalModule: InternalModule, props: Partial<ModuleInterface
|
|
38
|
+
constructor(internalModule: InternalModule, props: Partial<ModuleInterface<PropsInterface>>);
|
|
41
39
|
set props(value: PropsInterface);
|
|
42
40
|
get props(): PropsInterface;
|
|
43
41
|
plug(audioModule: AudioModule, from: string, to: string): void;
|
package/build/Module/Base.js.map
CHANGED
|
@@ -1 +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;AAwBpD,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,MAAM,CAAU,UAAU,CAAS;IAE1B,EAAE,CAAS;IACpB,IAAI,CAAS;IACb,cAAc,CAAiB;IAC/B,MAAM,GAAY,EAAE,CAAC;IACrB,OAAO,GAAa,EAAE,CAAC;IACd,OAAO,CAAU;IAC1B,SAAS,CAAO;IAChB,MAAM,GAAmB,EAAoB,CAAC;IAE9C,
|
|
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;AAwBpD,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,MAAM,CAAU,UAAU,CAAS;IAE1B,EAAE,CAAS;IACpB,IAAI,CAAS;IACb,cAAc,CAAiB;IAC/B,MAAM,GAAY,EAAE,CAAC;IACrB,OAAO,GAAa,EAAE,CAAC;IACd,OAAO,CAAU;IAC1B,SAAS,CAAO;IAChB,MAAM,GAAmB,EAAoB,CAAC;IAE9C,YACE,cAA8B,EAC9B,KAA+C;QAE/C,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;QAEnB,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,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,IAAU,EAAE,WAAmB;QAC3C,MAAM,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAED,cAAc,CAAC,IAAU,EAAE,WAAmB;QAC5C,MAAM,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,aAAa,GAAG,CAAC,SAAoB,EAAE,SAAkB,EAAE,EAAE;QAC3D,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;QAEzC,QAAQ,SAAS,CAAC,IAAI,EAAE;YACtB,KAAK,QAAQ;gBACX,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAE9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;gBAElE,IAAI,QAAQ,EAAE;oBACZ,MAAM,kBAAkB,GACtB,WAAW,GAAI,IAAI,CAAC,cAAsB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;oBACjE,IAAI,CAAC,SAAS,CACZ,IAAI,CAAC,cAAc,EACnB,KAAK,EACL,kBAAkB,EAClB,SAAS,CACV,CAAC;iBACH;gBACD,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;gBACnE,MAAM;YACR;gBACE,MAAM,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC1C;IACH,CAAC,CAAC;IAEM,SAAS,CACf,OAAiB,EACjB,KAAa,EACb,WAAmB,EACnB,SAAkB;QAElB,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;YACzD,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;YACvC,OAAO;SACR;QAED,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,SAAS;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,WAA4B,CAAC;QAEhD,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,KAAK,CAAC,UAAU;YACtB,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"}
|
|
@@ -11,6 +11,8 @@ export interface IDataSequence {
|
|
|
11
11
|
export default class DataSequencer extends Module<DummnyInternalModule, IDataSequencer> {
|
|
12
12
|
static moduleName: string;
|
|
13
13
|
private midiOutput;
|
|
14
|
+
private prevNumberOfVoices;
|
|
15
|
+
private loop;
|
|
14
16
|
constructor(name: string, props: Partial<IDataSequence>);
|
|
15
17
|
get sequences(): IDataSequence[];
|
|
16
18
|
set sequences(value: IDataSequence[]);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { now } from "tone";
|
|
1
|
+
import { Loop, now } from "tone";
|
|
2
2
|
import Module, { DummnyInternalModule } from "./Base";
|
|
3
3
|
import MidiEvent from "../MidiEvent";
|
|
4
|
-
import { uniq } from "lodash";
|
|
4
|
+
import { sortBy, uniq } from "lodash";
|
|
5
5
|
import Engine from "../Engine";
|
|
6
6
|
const InitialProps = () => ({
|
|
7
7
|
sequences: [],
|
|
@@ -9,6 +9,8 @@ const InitialProps = () => ({
|
|
|
9
9
|
export default class DataSequencer extends Module {
|
|
10
10
|
static moduleName = "DataSequencer";
|
|
11
11
|
midiOutput;
|
|
12
|
+
prevNumberOfVoices;
|
|
13
|
+
loop;
|
|
12
14
|
constructor(name, props) {
|
|
13
15
|
super(new DummnyInternalModule(), {
|
|
14
16
|
name,
|
|
@@ -21,7 +23,7 @@ export default class DataSequencer extends Module {
|
|
|
21
23
|
return this._props["sequences"];
|
|
22
24
|
}
|
|
23
25
|
set sequences(value) {
|
|
24
|
-
const sequences = value;
|
|
26
|
+
const sequences = sortBy(value, (seq) => -seq.time);
|
|
25
27
|
this._props = { ...this.props, sequences };
|
|
26
28
|
this.updateNumberOfVoices();
|
|
27
29
|
this.start(now());
|
|
@@ -29,11 +31,29 @@ export default class DataSequencer extends Module {
|
|
|
29
31
|
start(time) {
|
|
30
32
|
if (!Engine.isStarted)
|
|
31
33
|
return;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
Engine.updateRoutes();
|
|
35
|
+
const loopLength = 0.1;
|
|
36
|
+
const tempSequences = [...this.sequences];
|
|
37
|
+
const iterate = (maxTime) => {
|
|
38
|
+
const sequence = tempSequences.pop();
|
|
39
|
+
if (!sequence)
|
|
40
|
+
return;
|
|
41
|
+
const seqTime = time + sequence.time;
|
|
42
|
+
this.onPartEvent(seqTime, sequence);
|
|
43
|
+
if (seqTime > maxTime)
|
|
44
|
+
return;
|
|
45
|
+
iterate(maxTime);
|
|
46
|
+
};
|
|
47
|
+
this.loop = new Loop((t) => {
|
|
48
|
+
iterate(time + t + loopLength);
|
|
49
|
+
}, loopLength).start(time);
|
|
50
|
+
}
|
|
51
|
+
stop() {
|
|
52
|
+
if (!this.loop)
|
|
53
|
+
return;
|
|
54
|
+
this.loop.stop();
|
|
55
|
+
this.loop.dispose();
|
|
35
56
|
}
|
|
36
|
-
stop() { }
|
|
37
57
|
onPartEvent = (time, sequence) => {
|
|
38
58
|
const { voiceNo } = sequence;
|
|
39
59
|
const event = MidiEvent.fromDataSequence(sequence, time);
|
|
@@ -52,6 +72,10 @@ export default class DataSequencer extends Module {
|
|
|
52
72
|
return;
|
|
53
73
|
input.audioModule.numberOfVoices = this.numberOfVoices;
|
|
54
74
|
});
|
|
75
|
+
if (this.prevNumberOfVoices !== this.numberOfVoices) {
|
|
76
|
+
Engine.updateRoutes();
|
|
77
|
+
}
|
|
78
|
+
this.prevNumberOfVoices = this.numberOfVoices;
|
|
55
79
|
}
|
|
56
80
|
registerOutputs() {
|
|
57
81
|
this.midiOutput = this.registerOutput({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataSequencer.js","sourceRoot":"","sources":["../../src/Module/DataSequencer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"DataSequencer.js","sourceRoot":"","sources":["../../src/Module/DataSequencer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Effect.js","sourceRoot":"","sources":["../../src/Module/Effect.ts"],"names":[],"mappings":"AACA,OAAO,MAAuB,MAAM,QAAQ,CAAC;AAU7C,MAAM,YAAY,GAAoB;IACpC,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,CAAC,OAAO,OAAgB,MAG5B,SAAQ,MAAuC;IAC/C,YACE,IAAY,EACZ,cAA8B,EAC9B,KAA+B;QAE/B,KAAK,CAAC,cAAc,EAAE;YACpB,IAAI;YACJ,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"Effect.js","sourceRoot":"","sources":["../../src/Module/Effect.ts"],"names":[],"mappings":"AACA,OAAO,MAAuB,MAAM,QAAQ,CAAC;AAU7C,MAAM,YAAY,GAAoB;IACpC,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,CAAC,OAAO,OAAgB,MAG5B,SAAQ,MAAuC;IAC/C,YACE,IAAY,EACZ,cAA8B,EAC9B,KAA+B;QAE/B,KAAK,CAAC,cAAc,EAAE;YACpB,IAAI;YACJ,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAqB;SACxD,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,GAAG,CAAC,KAAa;QACnB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QAC5C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3C,CAAC;CACF"}
|
package/package.json
CHANGED
package/src/Engine.ts
CHANGED
|
@@ -50,33 +50,39 @@ class Engine {
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
initialize(props: InitializeInterface) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
this.context.transport.start();
|
|
53
|
+
return new Promise((resolve) => {
|
|
54
|
+
if (this.context) return resolve({ master: this.master });
|
|
56
55
|
|
|
57
|
-
|
|
56
|
+
this.context = new Context(props.context);
|
|
57
|
+
setContext(this.context);
|
|
58
|
+
this.context.transport.start();
|
|
58
59
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
this.midiDeviceManager = new MidiDeviceManager();
|
|
61
|
+
|
|
62
|
+
setTimeout(() => {
|
|
63
|
+
resolve({ master: this.master });
|
|
64
|
+
}, 0);
|
|
65
|
+
});
|
|
62
66
|
}
|
|
63
67
|
|
|
64
|
-
|
|
68
|
+
addModule(params: { name: string; type: string; props?: any }) {
|
|
69
|
+
const { name, type, props = {} } = params;
|
|
70
|
+
|
|
65
71
|
const audioModule = createModule(name, type, {});
|
|
66
72
|
audioModule.props = props;
|
|
67
73
|
this.modules[audioModule.id] = audioModule;
|
|
68
74
|
|
|
69
|
-
|
|
75
|
+
this.updateRoutes();
|
|
70
76
|
|
|
71
77
|
return audioModule.serialize();
|
|
72
78
|
}
|
|
73
79
|
|
|
74
|
-
|
|
80
|
+
removeModule(id: string) {
|
|
75
81
|
this.modules[id].dispose();
|
|
76
82
|
const moduleRouteIds = this.moduleRouteIds(id);
|
|
77
83
|
|
|
78
84
|
moduleRouteIds.forEach((routeId) => delete this.routes[routeId]);
|
|
79
|
-
|
|
85
|
+
this.updateRoutes();
|
|
80
86
|
delete this.modules[id];
|
|
81
87
|
|
|
82
88
|
return moduleRouteIds;
|
|
@@ -102,7 +108,7 @@ class Engine {
|
|
|
102
108
|
|
|
103
109
|
const applyRoutesRequired = this.applyRoutesRequired(audioModule, props);
|
|
104
110
|
audioModule.props = props;
|
|
105
|
-
if (applyRoutesRequired)
|
|
111
|
+
if (applyRoutesRequired) this.updateRoutes();
|
|
106
112
|
|
|
107
113
|
return audioModule.serialize();
|
|
108
114
|
}
|
|
@@ -111,21 +117,21 @@ class Engine {
|
|
|
111
117
|
const route = createRoute(props);
|
|
112
118
|
const newRoutes = { ...this.routes, [route.id]: route };
|
|
113
119
|
|
|
114
|
-
applyRoutes(Object.values(newRoutes));
|
|
115
120
|
this.routes = newRoutes;
|
|
121
|
+
this.updateRoutes();
|
|
116
122
|
|
|
117
123
|
return route;
|
|
118
124
|
}
|
|
119
125
|
|
|
120
126
|
removeRoute(id: string) {
|
|
121
127
|
delete this.routes[id];
|
|
122
|
-
|
|
128
|
+
this.updateRoutes();
|
|
123
129
|
}
|
|
124
130
|
|
|
125
131
|
get master() {
|
|
126
132
|
if (this._master) return this._master.serialize();
|
|
127
133
|
|
|
128
|
-
const masterProps = this.
|
|
134
|
+
const masterProps = this.addModule({ name: "Master", type: "Master" });
|
|
129
135
|
this._master = this.modules[masterProps.id] as Master;
|
|
130
136
|
|
|
131
137
|
return masterProps;
|
|
@@ -144,7 +150,7 @@ class Engine {
|
|
|
144
150
|
m.dispose();
|
|
145
151
|
});
|
|
146
152
|
|
|
147
|
-
this.modules = { [this._master.id]: this._master };
|
|
153
|
+
this.modules = this._master ? { [this._master.id]: this._master } : {};
|
|
148
154
|
this.routes = {};
|
|
149
155
|
}
|
|
150
156
|
|
|
@@ -157,12 +163,17 @@ class Engine {
|
|
|
157
163
|
}
|
|
158
164
|
|
|
159
165
|
get isStarted() {
|
|
160
|
-
return
|
|
166
|
+
return (
|
|
167
|
+
this.context !== undefined &&
|
|
168
|
+
this.context.transport.state === "started" &&
|
|
169
|
+
this._isStarted
|
|
170
|
+
);
|
|
161
171
|
}
|
|
162
172
|
|
|
163
173
|
start() {
|
|
164
174
|
const startTime = now();
|
|
165
175
|
this._isStarted = true;
|
|
176
|
+
this.updateRoutes();
|
|
166
177
|
|
|
167
178
|
Object.values(this.modules).forEach((audioModule) => {
|
|
168
179
|
const am = audioModule as any;
|
|
@@ -192,6 +203,10 @@ class Engine {
|
|
|
192
203
|
this.context.transport.bpm.value = value;
|
|
193
204
|
}
|
|
194
205
|
|
|
206
|
+
updateRoutes() {
|
|
207
|
+
applyRoutes(Object.values(this.routes));
|
|
208
|
+
}
|
|
209
|
+
|
|
195
210
|
private applyRoutesRequired(audioModule: AudioModule, props: any) {
|
|
196
211
|
if (!props.polyNumber) return false;
|
|
197
212
|
if (!(audioModule instanceof VoiceScheduler)) return false;
|
package/src/Module/Base.ts
CHANGED
|
@@ -21,9 +21,9 @@ export interface Voicable {
|
|
|
21
21
|
voiceNo?: number;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
export interface ModuleInterface {
|
|
24
|
+
export interface ModuleInterface<PropsInterface> {
|
|
25
25
|
name: string;
|
|
26
|
-
props
|
|
26
|
+
props: PropsInterface;
|
|
27
27
|
voiceNo?: number;
|
|
28
28
|
}
|
|
29
29
|
|
|
@@ -38,7 +38,7 @@ export class DummnyInternalModule implements Connectable {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
class Module<InternalModule extends Connectable, PropsInterface>
|
|
41
|
-
implements ModuleInterface
|
|
41
|
+
implements ModuleInterface<PropsInterface>
|
|
42
42
|
{
|
|
43
43
|
static readonly moduleName: string;
|
|
44
44
|
|
|
@@ -51,7 +51,10 @@ class Module<InternalModule extends Connectable, PropsInterface>
|
|
|
51
51
|
updatedAt: Date;
|
|
52
52
|
_props: PropsInterface = {} as PropsInterface;
|
|
53
53
|
|
|
54
|
-
constructor(
|
|
54
|
+
constructor(
|
|
55
|
+
internalModule: InternalModule,
|
|
56
|
+
props: Partial<ModuleInterface<PropsInterface>>
|
|
57
|
+
) {
|
|
55
58
|
this.internalModule = internalModule;
|
|
56
59
|
this.id = uuidv4();
|
|
57
60
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { now } from "tone";
|
|
1
|
+
import { Loop, now } from "tone";
|
|
2
2
|
|
|
3
3
|
import Module, { DummnyInternalModule } from "./Base";
|
|
4
4
|
import { Output } from "./IO";
|
|
5
5
|
import MidiEvent from "../MidiEvent";
|
|
6
|
-
import { uniq } from "lodash";
|
|
6
|
+
import { sortBy, uniq } from "lodash";
|
|
7
7
|
import Engine from "../Engine";
|
|
8
8
|
|
|
9
9
|
interface IDataSequencer {
|
|
@@ -27,6 +27,8 @@ export default class DataSequencer extends Module<
|
|
|
27
27
|
> {
|
|
28
28
|
static moduleName = "DataSequencer";
|
|
29
29
|
private midiOutput: Output;
|
|
30
|
+
private prevNumberOfVoices: number;
|
|
31
|
+
private loop: Loop;
|
|
30
32
|
|
|
31
33
|
constructor(name: string, props: Partial<IDataSequence>) {
|
|
32
34
|
super(new DummnyInternalModule(), {
|
|
@@ -43,7 +45,7 @@ export default class DataSequencer extends Module<
|
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
set sequences(value: IDataSequence[]) {
|
|
46
|
-
const sequences = value;
|
|
48
|
+
const sequences = sortBy(value, (seq) => -seq.time);
|
|
47
49
|
this._props = { ...this.props, sequences };
|
|
48
50
|
this.updateNumberOfVoices();
|
|
49
51
|
this.start(now());
|
|
@@ -51,13 +53,32 @@ export default class DataSequencer extends Module<
|
|
|
51
53
|
|
|
52
54
|
start(time: number) {
|
|
53
55
|
if (!Engine.isStarted) return;
|
|
56
|
+
Engine.updateRoutes();
|
|
54
57
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
const loopLength = 0.1;
|
|
59
|
+
const tempSequences = [...this.sequences];
|
|
60
|
+
const iterate = (maxTime: number) => {
|
|
61
|
+
const sequence = tempSequences.pop();
|
|
62
|
+
if (!sequence) return;
|
|
63
|
+
|
|
64
|
+
const seqTime = time + sequence.time;
|
|
65
|
+
this.onPartEvent(seqTime, sequence);
|
|
66
|
+
if (seqTime > maxTime) return;
|
|
67
|
+
|
|
68
|
+
iterate(maxTime);
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
this.loop = new Loop((t) => {
|
|
72
|
+
iterate(time + t + loopLength);
|
|
73
|
+
}, loopLength).start(time);
|
|
58
74
|
}
|
|
59
75
|
|
|
60
|
-
stop() {
|
|
76
|
+
stop() {
|
|
77
|
+
if (!this.loop) return;
|
|
78
|
+
|
|
79
|
+
this.loop.stop();
|
|
80
|
+
this.loop.dispose();
|
|
81
|
+
}
|
|
61
82
|
|
|
62
83
|
private onPartEvent = (time: number, sequence: IDataSequence) => {
|
|
63
84
|
const { voiceNo } = sequence;
|
|
@@ -80,6 +101,11 @@ export default class DataSequencer extends Module<
|
|
|
80
101
|
|
|
81
102
|
input.audioModule.numberOfVoices = this.numberOfVoices;
|
|
82
103
|
});
|
|
104
|
+
|
|
105
|
+
if (this.prevNumberOfVoices !== this.numberOfVoices) {
|
|
106
|
+
Engine.updateRoutes();
|
|
107
|
+
}
|
|
108
|
+
this.prevNumberOfVoices = this.numberOfVoices;
|
|
83
109
|
}
|
|
84
110
|
|
|
85
111
|
private registerOutputs() {
|