@blibliki/engine 0.1.8 → 0.1.9
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 +4 -1
- package/build/Engine.js +16 -0
- package/build/Engine.js.map +1 -1
- package/build/MidiEvent.d.ts +6 -5
- package/build/MidiEvent.js +10 -5
- package/build/MidiEvent.js.map +1 -1
- package/build/Module/Base.d.ts +4 -2
- package/build/Module/Base.js +6 -3
- package/build/Module/Base.js.map +1 -1
- package/build/Module/Envelope/Base.js +6 -1
- package/build/Module/Envelope/Base.js.map +1 -1
- package/build/Module/IO.js +1 -1
- package/build/Module/IO.js.map +1 -1
- package/build/Module/Sequencer.d.ts +22 -0
- package/build/Module/Sequencer.js +61 -0
- package/build/Module/Sequencer.js.map +1 -0
- package/build/Module/index.js +3 -0
- package/build/Module/index.js.map +1 -1
- package/build/Note/index.d.ts +13 -1
- package/build/Note/index.js +25 -2
- package/build/Note/index.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/Engine.ts +25 -2
- package/src/MidiEvent.ts +20 -8
- package/src/Module/Base.ts +8 -3
- package/src/Module/Envelope/Base.ts +6 -1
- package/src/Module/IO.ts +2 -2
- package/src/Module/Sequencer.ts +89 -0
- package/src/Module/index.ts +3 -0
- package/src/Note/index.ts +39 -2
- package/src/index.ts +1 -0
package/build/Engine.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import MidiDeviceManager from "./MidiDeviceManager";
|
|
2
|
+
import { EType } from "./MidiEvent";
|
|
2
3
|
import { AudioModule } from "./Module";
|
|
3
4
|
import { RouteInterface, RouteProps } from "./routes";
|
|
4
5
|
declare type LatencyHint = "interactive" | "playback" | "balanced";
|
|
@@ -41,6 +42,7 @@ declare class Engine {
|
|
|
41
42
|
inputs: import(".").IOProps[];
|
|
42
43
|
outputs: import(".").IOProps[];
|
|
43
44
|
};
|
|
45
|
+
unregisterModule(id: string): string[];
|
|
44
46
|
updateNameModule(id: string, name: string): {
|
|
45
47
|
id: string;
|
|
46
48
|
name: string;
|
|
@@ -75,10 +77,11 @@ declare class Engine {
|
|
|
75
77
|
inputs: import(".").IOProps[];
|
|
76
78
|
outputs: import(".").IOProps[];
|
|
77
79
|
};
|
|
78
|
-
triggerVirtualMidi(id: string, noteName: string, type:
|
|
80
|
+
triggerVirtualMidi(id: string, noteName: string, type: EType): void;
|
|
79
81
|
dispose(): void;
|
|
80
82
|
findById(id: string): AudioModule;
|
|
81
83
|
private applyRoutesRequired;
|
|
84
|
+
private moduleRouteIds;
|
|
82
85
|
}
|
|
83
86
|
declare const _default: Engine;
|
|
84
87
|
export default _default;
|
package/build/Engine.js
CHANGED
|
@@ -39,6 +39,14 @@ class Engine {
|
|
|
39
39
|
applyRoutes(Object.values(this.routes));
|
|
40
40
|
return audioModule.serialize();
|
|
41
41
|
}
|
|
42
|
+
unregisterModule(id) {
|
|
43
|
+
this.modules[id].dispose();
|
|
44
|
+
const moduleRouteIds = this.moduleRouteIds(id);
|
|
45
|
+
moduleRouteIds.forEach((routeId) => delete this.routes[routeId]);
|
|
46
|
+
applyRoutes(Object.values(this.routes));
|
|
47
|
+
delete this.modules[id];
|
|
48
|
+
return moduleRouteIds;
|
|
49
|
+
}
|
|
42
50
|
updateNameModule(id, name) {
|
|
43
51
|
const audioModule = this.findById(id);
|
|
44
52
|
audioModule.name = name;
|
|
@@ -102,6 +110,14 @@ class Engine {
|
|
|
102
110
|
return false;
|
|
103
111
|
return props.polyNumber !== audioModule.polyNumber;
|
|
104
112
|
}
|
|
113
|
+
moduleRouteIds(id) {
|
|
114
|
+
const cloneRoutes = { ...this.routes };
|
|
115
|
+
const routeIds = Object.keys(cloneRoutes).filter((routeId) => {
|
|
116
|
+
const { sourceId, destinationId } = cloneRoutes[routeId];
|
|
117
|
+
return sourceId === id || destinationId === id;
|
|
118
|
+
});
|
|
119
|
+
return routeIds;
|
|
120
|
+
}
|
|
105
121
|
}
|
|
106
122
|
export default Engine.getInstance();
|
|
107
123
|
//# sourceMappingURL=Engine.js.map
|
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,UAAU,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"Engine.js","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"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"}
|
package/build/MidiEvent.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import Note from "./Note";
|
|
1
|
+
import Note, { INote } from "./Note";
|
|
2
|
+
export declare type EType = "noteOn" | "noteOff";
|
|
2
3
|
export default class MidiEvent {
|
|
3
4
|
note?: Note;
|
|
4
5
|
readonly triggeredAt: number;
|
|
5
|
-
_type:
|
|
6
|
+
_type: EType;
|
|
6
7
|
private data;
|
|
7
8
|
private event;
|
|
8
|
-
static fromNote(noteName: string, type:
|
|
9
|
-
constructor(event: MIDIMessageEvent);
|
|
10
|
-
get type():
|
|
9
|
+
static fromNote(noteName: string | Note | INote, type: EType, triggeredAt?: number): MidiEvent;
|
|
10
|
+
constructor(event: MIDIMessageEvent, triggeredAt?: number);
|
|
11
|
+
get type(): EType;
|
|
11
12
|
get isNote(): boolean;
|
|
12
13
|
defineNote(): void;
|
|
13
14
|
}
|
package/build/MidiEvent.js
CHANGED
|
@@ -10,15 +10,20 @@ export default class MidiEvent {
|
|
|
10
10
|
_type;
|
|
11
11
|
data;
|
|
12
12
|
event;
|
|
13
|
-
static fromNote(noteName, type) {
|
|
14
|
-
const event = new MidiEvent(new MIDIMessageEvent("", { data: new Uint8Array([0, 0, 0]) }));
|
|
15
|
-
|
|
13
|
+
static fromNote(noteName, type, triggeredAt) {
|
|
14
|
+
const event = new MidiEvent(new MIDIMessageEvent("", { data: new Uint8Array([0, 0, 0]) }), triggeredAt);
|
|
15
|
+
if (noteName instanceof Note) {
|
|
16
|
+
event.note = noteName;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
event.note = new Note(noteName);
|
|
20
|
+
}
|
|
16
21
|
event._type = type;
|
|
17
22
|
return event;
|
|
18
23
|
}
|
|
19
|
-
constructor(event) {
|
|
24
|
+
constructor(event, triggeredAt) {
|
|
20
25
|
this.event = event;
|
|
21
|
-
this.triggeredAt = now();
|
|
26
|
+
this.triggeredAt = triggeredAt || now();
|
|
22
27
|
this.data = event.data;
|
|
23
28
|
this.defineNote();
|
|
24
29
|
}
|
package/build/MidiEvent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MidiEvent.js","sourceRoot":"","sources":["../src/MidiEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC3B,OAAO,
|
|
1
|
+
{"version":3,"file":"MidiEvent.js","sourceRoot":"","sources":["../src/MidiEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC3B,OAAO,IAAe,MAAM,QAAQ,CAAC;AAErC,MAAM,SAAS,GAA6B;IAC1C,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,QAAQ;CACZ,CAAC;AAIF,MAAM,CAAC,OAAO,OAAO,SAAS;IAC5B,IAAI,CAAQ;IACH,WAAW,CAAS;IAC7B,KAAK,CAAQ;IACL,IAAI,CAAa;IACjB,KAAK,CAAmB;IAEhC,MAAM,CAAC,QAAQ,CACb,QAA+B,EAC/B,IAAW,EACX,WAAoB;QAEpB,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,IAAI,gBAAgB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC7D,WAAW,CACZ,CAAC;QAEF,IAAI,QAAQ,YAAY,IAAI,EAAE;YAC5B,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;SACvB;aAAM;YACL,KAAK,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;SACjC;QACD,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QAEnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,YAAY,KAAuB,EAAE,WAAoB;QACvD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,GAAG,EAAE,CAAC;QACxC,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,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAExC,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,KAAK,CAAC,CAAC;IACnC,CAAC;CACF"}
|
package/build/Module/Base.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export interface Connectable {
|
|
|
10
10
|
export interface Triggerable {
|
|
11
11
|
triggerAttack: Function;
|
|
12
12
|
triggerRelease: Function;
|
|
13
|
+
triggerAttackRelease: Function;
|
|
13
14
|
}
|
|
14
15
|
export interface Voicable {
|
|
15
16
|
voiceNo?: number;
|
|
@@ -44,9 +45,10 @@ declare class Module<InternalModule extends Connectable, PropsInterface> impleme
|
|
|
44
45
|
connect: (inputAudioModule: AudioModule, attribute?: string) => void;
|
|
45
46
|
disconnect: (inputAudioModule: AudioModule, attribute?: string) => void;
|
|
46
47
|
dispose(): void;
|
|
47
|
-
triggerAttack(midiEvent: MidiEvent): void;
|
|
48
|
+
triggerAttack(midiEvent: MidiEvent, duration?: number): void;
|
|
48
49
|
triggerRelease(midiEvent: MidiEvent): void;
|
|
49
|
-
|
|
50
|
+
triggerAttackRelease(midiEvent: MidiEvent): void;
|
|
51
|
+
midiTriggered: (midiEvent: MidiEvent, duration?: number) => void;
|
|
50
52
|
serialize(): {
|
|
51
53
|
id: string;
|
|
52
54
|
name: string;
|
package/build/Module/Base.js
CHANGED
|
@@ -67,16 +67,19 @@ class Module {
|
|
|
67
67
|
dispose() {
|
|
68
68
|
this.internalModule.dispose();
|
|
69
69
|
}
|
|
70
|
-
triggerAttack(midiEvent) {
|
|
70
|
+
triggerAttack(midiEvent, duration) {
|
|
71
71
|
throw Error("triggerAttack not implemented");
|
|
72
72
|
}
|
|
73
73
|
triggerRelease(midiEvent) {
|
|
74
74
|
throw Error("triggerRelease not implemented");
|
|
75
75
|
}
|
|
76
|
-
|
|
76
|
+
triggerAttackRelease(midiEvent) {
|
|
77
|
+
throw Error("triggerAttackRelease not implemented");
|
|
78
|
+
}
|
|
79
|
+
midiTriggered = (midiEvent, duration) => {
|
|
77
80
|
switch (midiEvent.type) {
|
|
78
81
|
case "noteOn":
|
|
79
|
-
this.triggerAttack(midiEvent);
|
|
82
|
+
this.triggerAttack(midiEvent, duration);
|
|
80
83
|
break;
|
|
81
84
|
case "noteOff":
|
|
82
85
|
this.triggerRelease(midiEvent);
|
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;
|
|
1
|
+
{"version":3,"file":"Base.js","sourceRoot":"","sources":["../../src/Module/Base.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,7 +60,12 @@ export default class EnvelopeModule extends Module {
|
|
|
60
60
|
const { note, triggeredAt } = midiEvent;
|
|
61
61
|
this.activeNote = note?.fullName;
|
|
62
62
|
this.triggeredAt = triggeredAt;
|
|
63
|
-
|
|
63
|
+
if (note?.duration) {
|
|
64
|
+
this.internalModule.triggerAttackRelease(note.duration, triggeredAt);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
this.internalModule.triggerAttack(triggeredAt);
|
|
68
|
+
}
|
|
64
69
|
}
|
|
65
70
|
triggerRelease(midiEvent) {
|
|
66
71
|
const { note, triggeredAt } = midiEvent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Base.js","sourceRoot":"","sources":["../../../src/Module/Envelope/Base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,MAAM,CAAC;AAEvC,OAAO,MAA8C,MAAM,SAAS,CAAC;AACrE,OAAO,UAAU,MAAM,eAAe,CAAC;AAGvC,MAAM,CAAN,IAAkB,cAKjB;AALD,WAAkB,cAAc;IAC9B,mCAAiB,CAAA;IACjB,iCAAe,CAAA;IACf,qCAAmB,CAAA;IACnB,qCAAmB,CAAA;AACrB,CAAC,EALiB,cAAc,KAAd,cAAc,QAK/B;AAED,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,QAAQ,GAAG,IAAI,CAAC;AACtB,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAU5B,MAAM,YAAY,GAAsB;IACtC,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,iBAAiB;IAC1B,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEF,MAAM,CAAC,OAAO,OAAgB,cAC5B,SAAQ,MAAuC;IAG/C,UAAU,CAAU;IACpB,WAAW,CAAS;IAEpB,YACE,IAAY,EACZ,cAA4B,EAC5B,KAAwB;QAExB,KAAK,CAAC,cAAc,EAAE;YACpB,IAAI;YACJ,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE;SACrC,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,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK,CAAC,KAAa;QACrB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,CAAC,KAAa;QACvB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,CAAC,KAAa;QACvB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,QAAQ,CAAC,KAAqB,EAAE,KAAa;QAC3C,MAAM,eAAe,GACnB,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QAClE,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;QAChD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,eAAe,CAAC;IAC/C,CAAC;IAED,aAAa,CAAC,SAAoB;QAChC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;QAExC,IAAI,CAAC,UAAU,GAAG,IAAI,EAAE,QAAQ,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"Base.js","sourceRoot":"","sources":["../../../src/Module/Envelope/Base.ts"],"names":[],"mappings":"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"}
|
package/build/Module/IO.js
CHANGED
|
@@ -20,11 +20,11 @@ class IO {
|
|
|
20
20
|
Object.assign(this, props);
|
|
21
21
|
}
|
|
22
22
|
plug(io) {
|
|
23
|
+
this.connections.push(io);
|
|
23
24
|
if (this.onPlug)
|
|
24
25
|
this.onPlug(io);
|
|
25
26
|
if (this.ioType === IOType.Output)
|
|
26
27
|
io.plug(this);
|
|
27
|
-
this.connections.push(io);
|
|
28
28
|
}
|
|
29
29
|
unPlug(io) {
|
|
30
30
|
if (this.onUnPlug)
|
package/build/Module/IO.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IO.js","sourceRoot":"","sources":["../../src/Module/IO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAiBpC,IAAK,MAGJ;AAHD,WAAK,MAAM;IACT,yBAAe,CAAA;IACf,2BAAiB,CAAA;AACnB,CAAC,EAHI,MAAM,KAAN,MAAM,QAGV;AAED,MAAe,EAAE;IACf,EAAE,CAAS;IACX,MAAM,CAAS;IACf,IAAI,CAAS;IACb,WAAW,CAAc;IACzB,SAAS,CAAM;IACf,MAAM,CAAmB;IACzB,QAAQ,CAAmB;IAC3B,WAAW,GAAuB,EAAE,CAAC;IAErC,YAAY,MAAc,EAAE,WAAwB,EAAE,KAAkB;QACtE,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAE/B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,EAAM;QACT,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEjC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"IO.js","sourceRoot":"","sources":["../../src/Module/IO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAiBpC,IAAK,MAGJ;AAHD,WAAK,MAAM;IACT,yBAAe,CAAA;IACf,2BAAiB,CAAA;AACnB,CAAC,EAHI,MAAM,KAAN,MAAM,QAGV;AAED,MAAe,EAAE;IACf,EAAE,CAAS;IACX,MAAM,CAAS;IACf,IAAI,CAAS;IACb,WAAW,CAAc;IACzB,SAAS,CAAM;IACf,MAAM,CAAmB;IACzB,QAAQ,CAAmB;IAC3B,WAAW,GAAuB,EAAE,CAAC;IAErC,YAAY,MAAc,EAAE,WAAwB,EAAE,KAAkB;QACtE,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAE/B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,EAAM;QACT,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE1B,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEjC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,EAAM;QACX,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAErC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE;YACjC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACjB;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACxC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CACxC,CAAC;IACJ,CAAC;IAED,SAAS;QACP,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,SAAS;QACP,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE;YAC7B,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;SAClC,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,KAAM,SAAQ,EAAE;IAC3B,YAAY,WAAwB,EAAE,KAAkB;QACtD,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,MAAO,SAAQ,EAAE;IAC5B,YAAY,WAAwB,EAAE,KAAkB;QACtD,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import Module, { DummnyInternalModule } from "./Base";
|
|
2
|
+
import { INote } from "../Note";
|
|
3
|
+
import { Output } from "./IO";
|
|
4
|
+
interface ISequencer {
|
|
5
|
+
notes: INote[];
|
|
6
|
+
}
|
|
7
|
+
export default class Sequencer extends Module<DummnyInternalModule, ISequencer> {
|
|
8
|
+
static moduleName: string;
|
|
9
|
+
midiOutput: Output;
|
|
10
|
+
private _part;
|
|
11
|
+
constructor(name: string, props: Partial<ISequencer>);
|
|
12
|
+
get notes(): INote[];
|
|
13
|
+
set notes(value: INote[]);
|
|
14
|
+
start(): void;
|
|
15
|
+
stop(): void;
|
|
16
|
+
private registerOutputs;
|
|
17
|
+
private get part();
|
|
18
|
+
private updateNotesToPart;
|
|
19
|
+
private get loopEnd();
|
|
20
|
+
private onEvent;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Part } from "tone";
|
|
2
|
+
import Module, { DummnyInternalModule } from "./Base";
|
|
3
|
+
import MidiEvent from "../MidiEvent";
|
|
4
|
+
const InitialProps = {
|
|
5
|
+
notes: [],
|
|
6
|
+
};
|
|
7
|
+
export default class Sequencer extends Module {
|
|
8
|
+
static moduleName = "Sequencer";
|
|
9
|
+
midiOutput;
|
|
10
|
+
_part;
|
|
11
|
+
constructor(name, props) {
|
|
12
|
+
super(new DummnyInternalModule(), {
|
|
13
|
+
name,
|
|
14
|
+
props: { ...InitialProps, ...props },
|
|
15
|
+
});
|
|
16
|
+
this.registerOutputs();
|
|
17
|
+
this.start();
|
|
18
|
+
}
|
|
19
|
+
get notes() {
|
|
20
|
+
return this._props["notes"];
|
|
21
|
+
}
|
|
22
|
+
set notes(value) {
|
|
23
|
+
const notes = value;
|
|
24
|
+
this._props = { ...this.props, notes };
|
|
25
|
+
this.updateNotesToPart();
|
|
26
|
+
}
|
|
27
|
+
start() {
|
|
28
|
+
this.part.start();
|
|
29
|
+
}
|
|
30
|
+
stop() {
|
|
31
|
+
this.part.stop();
|
|
32
|
+
}
|
|
33
|
+
registerOutputs() {
|
|
34
|
+
this.midiOutput = this.registerOutput({ name: "midi out" });
|
|
35
|
+
}
|
|
36
|
+
get part() {
|
|
37
|
+
if (this._part)
|
|
38
|
+
return this._part;
|
|
39
|
+
this._part = new Part(this.onEvent, this.notes);
|
|
40
|
+
this._part.loop = true;
|
|
41
|
+
this._part.loopEnd = this.loopEnd;
|
|
42
|
+
return this._part;
|
|
43
|
+
}
|
|
44
|
+
updateNotesToPart() {
|
|
45
|
+
this.part.clear();
|
|
46
|
+
this.notes.forEach((note) => {
|
|
47
|
+
this.part.add(note.time, note);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
get loopEnd() {
|
|
51
|
+
const end = Math.max(...this.notes.map((note) => parseInt(note.time.split(":")[0], 10))) + 1;
|
|
52
|
+
return `${end}:0:0`;
|
|
53
|
+
}
|
|
54
|
+
onEvent = (time, note) => {
|
|
55
|
+
const event = MidiEvent.fromNote(note, "noteOn", time);
|
|
56
|
+
this.midiOutput.connections.forEach((input) => {
|
|
57
|
+
input.pluggable(event);
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=Sequencer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sequencer.js","sourceRoot":"","sources":["../../src/Module/Sequencer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,MAAM,EAAE,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAGtD,OAAO,SAAS,MAAM,cAAc,CAAC;AAMrC,MAAM,YAAY,GAAe;IAC/B,KAAK,EAAE,EAAE;CACV,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,MAGtC;IACC,MAAM,CAAC,UAAU,GAAG,WAAW,CAAC;IAChC,UAAU,CAAS;IACX,KAAK,CAAO;IAEpB,YAAY,IAAY,EAAE,KAA0B;QAClD,KAAK,CAAC,IAAI,oBAAoB,EAAE,EAAE;YAChC,IAAI;YACJ,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK,CAAC,KAAc;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAY,IAAI;QACd,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QAElC,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAElC,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAElB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAY,OAAO;QACjB,MAAM,GAAG,GACP,IAAI,CAAC,GAAG,CACN,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CACnE,GAAG,CAAC,CAAC;QAER,OAAO,GAAG,GAAG,MAAM,CAAC;IACtB,CAAC;IAEO,OAAO,GAAG,CAAC,IAAY,EAAE,IAAW,EAAE,EAAE;QAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEvD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5C,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC"}
|
package/build/Module/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import Reverb from "./Reverb";
|
|
|
11
11
|
import Delay from "./Delay";
|
|
12
12
|
import Distortion from "./Distortion";
|
|
13
13
|
import BitCrusher from "./BitCrusher";
|
|
14
|
+
import Sequencer from "./Sequencer";
|
|
14
15
|
export { default } from "./Base";
|
|
15
16
|
export { default as PolyModule } from "./PolyModule";
|
|
16
17
|
export { default as Filter } from "./Filter";
|
|
@@ -51,6 +52,8 @@ function moduleClassFromType(type) {
|
|
|
51
52
|
return Distortion;
|
|
52
53
|
case BitCrusher.moduleName:
|
|
53
54
|
return BitCrusher;
|
|
55
|
+
case Sequencer.moduleName:
|
|
56
|
+
return Sequencer;
|
|
54
57
|
default:
|
|
55
58
|
throw Error(`Unknown module type ${type}`);
|
|
56
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Module/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAG/C,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,UAAU,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Module/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAG/C,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AAGrD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AAMpB,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,IAAY,EACZ,KAAU;IAEV,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAExC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnC,QAAQ,IAAI,EAAE;QACZ,KAAK,UAAU,CAAC,UAAU;YACxB,OAAO,UAAU,CAAC;QACpB,KAAK,QAAQ,CAAC,UAAU;YACtB,OAAO,QAAQ,CAAC;QAClB,KAAK,WAAW,CAAC,UAAU;YACzB,OAAO,WAAW,CAAC;QACrB,KAAK,YAAY,CAAC,UAAU;YAC1B,OAAO,YAAY,CAAC;QACtB,KAAK,MAAM,CAAC,UAAU;YACpB,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM,CAAC,UAAU;YACpB,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM,CAAC,UAAU;YACpB,OAAO,MAAM,CAAC;QAChB,KAAK,cAAc,CAAC,UAAU;YAC5B,OAAO,cAAc,CAAC;QACxB,KAAK,YAAY,CAAC,UAAU;YAC1B,OAAO,YAAY,CAAC;QACtB,KAAK,WAAW,CAAC,UAAU;YACzB,OAAO,WAAW,CAAC;QACrB,KAAK,MAAM,CAAC,UAAU;YACpB,OAAO,MAAM,CAAC;QAChB,KAAK,KAAK,CAAC,UAAU;YACnB,OAAO,KAAK,CAAC;QACf,KAAK,UAAU,CAAC,UAAU;YACxB,OAAO,UAAU,CAAC;QACpB,KAAK,UAAU,CAAC,UAAU;YACxB,OAAO,UAAU,CAAC;QACpB,KAAK,SAAS,CAAC,UAAU;YACvB,OAAO,SAAS,CAAC;QACnB;YACE,MAAM,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;KAC9C;AACH,CAAC"}
|
package/build/Note/index.d.ts
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
|
+
import { TimeClass } from "tone";
|
|
2
|
+
export interface INote {
|
|
3
|
+
note: string;
|
|
4
|
+
time: string;
|
|
5
|
+
velocity?: number;
|
|
6
|
+
duration?: string;
|
|
7
|
+
}
|
|
1
8
|
export default class Note {
|
|
2
9
|
static _notes: Note[];
|
|
3
10
|
name: string;
|
|
4
11
|
octave: number;
|
|
5
|
-
|
|
12
|
+
time: TimeClass;
|
|
13
|
+
velocity?: number;
|
|
14
|
+
duration?: string;
|
|
15
|
+
constructor(eventOrString: INote | MIDIMessageEvent | string, duration?: string);
|
|
6
16
|
static notes(octave?: number): Note[];
|
|
7
17
|
get isSemi(): boolean;
|
|
8
18
|
get fullName(): string;
|
|
9
19
|
frequency(range?: number, coarse?: number): number;
|
|
10
20
|
valueOf(): string;
|
|
21
|
+
serialize(): INote;
|
|
11
22
|
private fromString;
|
|
12
23
|
private fromEvent;
|
|
24
|
+
private fromProps;
|
|
13
25
|
}
|
package/build/Note/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Time } from "tone";
|
|
1
2
|
import frequencyTable from "./frequencyTable";
|
|
2
3
|
const Notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
|
|
3
4
|
const NotesLength = Notes.length;
|
|
@@ -5,13 +6,20 @@ export default class Note {
|
|
|
5
6
|
static _notes;
|
|
6
7
|
name;
|
|
7
8
|
octave;
|
|
8
|
-
|
|
9
|
+
time = Time("0:0:0");
|
|
10
|
+
velocity = 1;
|
|
11
|
+
duration;
|
|
12
|
+
constructor(eventOrString, duration) {
|
|
13
|
+
this.duration = duration;
|
|
9
14
|
if (typeof eventOrString === "string") {
|
|
10
15
|
this.fromString(eventOrString);
|
|
11
16
|
}
|
|
12
|
-
else {
|
|
17
|
+
else if (eventOrString instanceof MIDIMessageEvent) {
|
|
13
18
|
this.fromEvent(eventOrString);
|
|
14
19
|
}
|
|
20
|
+
else {
|
|
21
|
+
this.fromProps(eventOrString);
|
|
22
|
+
}
|
|
15
23
|
}
|
|
16
24
|
static notes(octave = 3) {
|
|
17
25
|
return Notes.map((note) => new Note(`${note}${octave}`));
|
|
@@ -40,6 +48,14 @@ export default class Note {
|
|
|
40
48
|
valueOf() {
|
|
41
49
|
return this.fullName;
|
|
42
50
|
}
|
|
51
|
+
serialize() {
|
|
52
|
+
return {
|
|
53
|
+
time: this.time.toBarsBeatsSixteenths(),
|
|
54
|
+
note: this.fullName,
|
|
55
|
+
duration: this.duration,
|
|
56
|
+
velocity: 1,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
43
59
|
fromString(string) {
|
|
44
60
|
const matches = string.match(/(\w#?)(\d)?/) || [];
|
|
45
61
|
this.name = matches[1];
|
|
@@ -49,5 +65,12 @@ export default class Note {
|
|
|
49
65
|
this.name = Notes[event.data[1] % 12];
|
|
50
66
|
this.octave = Math.floor(event.data[1] / 12) - 2;
|
|
51
67
|
}
|
|
68
|
+
fromProps(props) {
|
|
69
|
+
const { note, time, duration, velocity } = props;
|
|
70
|
+
this.fromString(note);
|
|
71
|
+
this.time = Time(time);
|
|
72
|
+
this.duration = duration;
|
|
73
|
+
this.velocity = velocity;
|
|
74
|
+
}
|
|
52
75
|
}
|
|
53
76
|
//# sourceMappingURL=index.js.map
|
package/build/Note/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Note/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAE9C,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAEhF,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Note/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,IAAI,EAAE,MAAM,MAAM,CAAC;AAEvC,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAE9C,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAEhF,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;AASjC,MAAM,CAAC,OAAO,OAAO,IAAI;IACvB,MAAM,CAAC,MAAM,CAAS;IACtB,IAAI,CAAS;IACb,MAAM,CAAS;IACf,IAAI,GAAc,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,QAAQ,GAAY,CAAC,CAAC;IACtB,QAAQ,CAAU;IAElB,YACE,aAAgD,EAChD,QAAiB;QAEjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;YACrC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;SAChC;aAAM,IAAI,aAAa,YAAY,gBAAgB,EAAE;YACpD,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;SAC/B;aAAM;YACL,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;SAC/B;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAiB,CAAC;QAC7B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;IACrC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,SAAS,CAAC,QAAgB,CAAC,EAAE,SAAiB,CAAC;QAC7C,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpC,IAAI,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACpD,IAAI,SAAS,GAAG,WAAW,CAAC;QAE5B,IAAI,WAAW,IAAI,WAAW,EAAE;YAC9B,SAAS,EAAE,CAAC;YACZ,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;SACvC;aAAM,IAAI,WAAW,GAAG,CAAC,EAAE;YAC1B,SAAS,EAAE,CAAC;YACZ,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;SACrC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAEjC,OAAO,cAAc,CAAC,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,SAAS;QACP,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;YACvC,IAAI,EAAE,IAAI,CAAC,QAAQ;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,MAAc;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAElD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAEO,SAAS,CAAC,KAAuB;QACvC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;IAEO,SAAS,CAAC,KAAY;QAC5B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QAEjD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
|
package/build/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export { default } from "./Engine";
|
|
|
2
2
|
export { default as MidiDevice } from "./MidiDevice";
|
|
3
3
|
export { default as MidiDeviceManager } from "./MidiDeviceManager";
|
|
4
4
|
export { default as Note } from "./Note";
|
|
5
|
+
export type { INote } from "./Note";
|
|
5
6
|
export type { MidiDeviceInterface } from "./MidiDevice";
|
|
6
7
|
export type { ModuleInterface, AudioModule } from "./Module";
|
|
7
8
|
export type { SerializeInterface as IOProps } from "./Module/IO";
|
package/package.json
CHANGED
package/src/Engine.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Context, setContext } from "tone";
|
|
2
2
|
import MidiDeviceManager from "./MidiDeviceManager";
|
|
3
|
-
import MidiEvent from "./MidiEvent";
|
|
3
|
+
import MidiEvent, { EType } from "./MidiEvent";
|
|
4
4
|
|
|
5
5
|
import { AudioModule, createModule } from "./Module";
|
|
6
6
|
import Master from "./Module/Master";
|
|
@@ -68,6 +68,17 @@ class Engine {
|
|
|
68
68
|
return audioModule.serialize();
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
unregisterModule(id: string) {
|
|
72
|
+
this.modules[id].dispose();
|
|
73
|
+
const moduleRouteIds = this.moduleRouteIds(id);
|
|
74
|
+
|
|
75
|
+
moduleRouteIds.forEach((routeId) => delete this.routes[routeId]);
|
|
76
|
+
applyRoutes(Object.values(this.routes));
|
|
77
|
+
delete this.modules[id];
|
|
78
|
+
|
|
79
|
+
return moduleRouteIds;
|
|
80
|
+
}
|
|
81
|
+
|
|
71
82
|
updateNameModule(id: string, name: string) {
|
|
72
83
|
const audioModule = this.findById(id);
|
|
73
84
|
audioModule.name = name;
|
|
@@ -117,7 +128,7 @@ class Engine {
|
|
|
117
128
|
return masterProps;
|
|
118
129
|
}
|
|
119
130
|
|
|
120
|
-
triggerVirtualMidi(id: string, noteName: string, type:
|
|
131
|
+
triggerVirtualMidi(id: string, noteName: string, type: EType) {
|
|
121
132
|
const virtualMidi = this.findById(id) as VirtualMidi;
|
|
122
133
|
|
|
123
134
|
virtualMidi.sendMidi(MidiEvent.fromNote(noteName, type));
|
|
@@ -148,6 +159,18 @@ class Engine {
|
|
|
148
159
|
|
|
149
160
|
return props.polyNumber !== audioModule.polyNumber;
|
|
150
161
|
}
|
|
162
|
+
|
|
163
|
+
private moduleRouteIds(id: string) {
|
|
164
|
+
const cloneRoutes = { ...this.routes };
|
|
165
|
+
|
|
166
|
+
const routeIds = Object.keys(cloneRoutes).filter((routeId) => {
|
|
167
|
+
const { sourceId, destinationId } = cloneRoutes[routeId];
|
|
168
|
+
|
|
169
|
+
return sourceId === id || destinationId === id;
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
return routeIds;
|
|
173
|
+
}
|
|
151
174
|
}
|
|
152
175
|
|
|
153
176
|
export default Engine.getInstance();
|
package/src/MidiEvent.ts
CHANGED
|
@@ -1,31 +1,43 @@
|
|
|
1
1
|
import { now } from "tone";
|
|
2
|
-
import Note from "./Note";
|
|
2
|
+
import Note, { INote } from "./Note";
|
|
3
3
|
|
|
4
|
-
const EventType: { [key: number]:
|
|
4
|
+
const EventType: { [key: number]: EType } = {
|
|
5
5
|
8: "noteOff",
|
|
6
6
|
9: "noteOn",
|
|
7
7
|
};
|
|
8
8
|
|
|
9
|
+
export type EType = "noteOn" | "noteOff";
|
|
10
|
+
|
|
9
11
|
export default class MidiEvent {
|
|
10
12
|
note?: Note;
|
|
11
13
|
readonly triggeredAt: number;
|
|
12
|
-
_type:
|
|
14
|
+
_type: EType;
|
|
13
15
|
private data: Uint8Array;
|
|
14
16
|
private event: MIDIMessageEvent;
|
|
15
17
|
|
|
16
|
-
static fromNote(
|
|
18
|
+
static fromNote(
|
|
19
|
+
noteName: string | Note | INote,
|
|
20
|
+
type: EType,
|
|
21
|
+
triggeredAt?: number
|
|
22
|
+
) {
|
|
17
23
|
const event = new MidiEvent(
|
|
18
|
-
new MIDIMessageEvent("", { data: new Uint8Array([0, 0, 0]) })
|
|
24
|
+
new MIDIMessageEvent("", { data: new Uint8Array([0, 0, 0]) }),
|
|
25
|
+
triggeredAt
|
|
19
26
|
);
|
|
20
|
-
|
|
27
|
+
|
|
28
|
+
if (noteName instanceof Note) {
|
|
29
|
+
event.note = noteName;
|
|
30
|
+
} else {
|
|
31
|
+
event.note = new Note(noteName);
|
|
32
|
+
}
|
|
21
33
|
event._type = type;
|
|
22
34
|
|
|
23
35
|
return event;
|
|
24
36
|
}
|
|
25
37
|
|
|
26
|
-
constructor(event: MIDIMessageEvent) {
|
|
38
|
+
constructor(event: MIDIMessageEvent, triggeredAt?: number) {
|
|
27
39
|
this.event = event;
|
|
28
|
-
this.triggeredAt = now();
|
|
40
|
+
this.triggeredAt = triggeredAt || now();
|
|
29
41
|
this.data = event.data;
|
|
30
42
|
this.defineNote();
|
|
31
43
|
}
|
package/src/Module/Base.ts
CHANGED
|
@@ -14,6 +14,7 @@ export interface Connectable {
|
|
|
14
14
|
export interface Triggerable {
|
|
15
15
|
triggerAttack: Function;
|
|
16
16
|
triggerRelease: Function;
|
|
17
|
+
triggerAttackRelease: Function;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
export interface Voicable {
|
|
@@ -121,7 +122,7 @@ class Module<InternalModule extends Connectable, PropsInterface>
|
|
|
121
122
|
this.internalModule.dispose();
|
|
122
123
|
}
|
|
123
124
|
|
|
124
|
-
triggerAttack(midiEvent: MidiEvent) {
|
|
125
|
+
triggerAttack(midiEvent: MidiEvent, duration?: number) {
|
|
125
126
|
throw Error("triggerAttack not implemented");
|
|
126
127
|
}
|
|
127
128
|
|
|
@@ -129,10 +130,14 @@ class Module<InternalModule extends Connectable, PropsInterface>
|
|
|
129
130
|
throw Error("triggerRelease not implemented");
|
|
130
131
|
}
|
|
131
132
|
|
|
132
|
-
|
|
133
|
+
triggerAttackRelease(midiEvent: MidiEvent) {
|
|
134
|
+
throw Error("triggerAttackRelease not implemented");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
midiTriggered = (midiEvent: MidiEvent, duration?: number) => {
|
|
133
138
|
switch (midiEvent.type) {
|
|
134
139
|
case "noteOn":
|
|
135
|
-
this.triggerAttack(midiEvent);
|
|
140
|
+
this.triggerAttack(midiEvent, duration);
|
|
136
141
|
break;
|
|
137
142
|
case "noteOff":
|
|
138
143
|
this.triggerRelease(midiEvent);
|
|
@@ -93,7 +93,12 @@ export default abstract class EnvelopeModule<EnvelopeLike extends Env>
|
|
|
93
93
|
|
|
94
94
|
this.activeNote = note?.fullName;
|
|
95
95
|
this.triggeredAt = triggeredAt;
|
|
96
|
-
|
|
96
|
+
|
|
97
|
+
if (note?.duration) {
|
|
98
|
+
this.internalModule.triggerAttackRelease(note.duration, triggeredAt);
|
|
99
|
+
} else {
|
|
100
|
+
this.internalModule.triggerAttack(triggeredAt);
|
|
101
|
+
}
|
|
97
102
|
}
|
|
98
103
|
|
|
99
104
|
triggerRelease(midiEvent: MidiEvent) {
|
package/src/Module/IO.ts
CHANGED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Part } from "tone";
|
|
2
|
+
import Module, { DummnyInternalModule } from "./Base";
|
|
3
|
+
import Note, { INote } from "../Note";
|
|
4
|
+
import { Output } from "./IO";
|
|
5
|
+
import MidiEvent from "../MidiEvent";
|
|
6
|
+
|
|
7
|
+
interface ISequencer {
|
|
8
|
+
notes: INote[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const InitialProps: ISequencer = {
|
|
12
|
+
notes: [],
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default class Sequencer extends Module<
|
|
16
|
+
DummnyInternalModule,
|
|
17
|
+
ISequencer
|
|
18
|
+
> {
|
|
19
|
+
static moduleName = "Sequencer";
|
|
20
|
+
midiOutput: Output;
|
|
21
|
+
private _part: Part;
|
|
22
|
+
|
|
23
|
+
constructor(name: string, props: Partial<ISequencer>) {
|
|
24
|
+
super(new DummnyInternalModule(), {
|
|
25
|
+
name,
|
|
26
|
+
props: { ...InitialProps, ...props },
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
this.registerOutputs();
|
|
30
|
+
this.start();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get notes() {
|
|
34
|
+
return this._props["notes"];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
set notes(value: INote[]) {
|
|
38
|
+
const notes = value;
|
|
39
|
+
this._props = { ...this.props, notes };
|
|
40
|
+
this.updateNotesToPart();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
start() {
|
|
44
|
+
this.part.start();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
stop() {
|
|
48
|
+
this.part.stop();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private registerOutputs() {
|
|
52
|
+
this.midiOutput = this.registerOutput({ name: "midi out" });
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private get part() {
|
|
56
|
+
if (this._part) return this._part;
|
|
57
|
+
|
|
58
|
+
this._part = new Part(this.onEvent, this.notes);
|
|
59
|
+
this._part.loop = true;
|
|
60
|
+
this._part.loopEnd = this.loopEnd;
|
|
61
|
+
|
|
62
|
+
return this._part;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private updateNotesToPart() {
|
|
66
|
+
this.part.clear();
|
|
67
|
+
|
|
68
|
+
this.notes.forEach((note) => {
|
|
69
|
+
this.part.add(note.time, note);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private get loopEnd() {
|
|
74
|
+
const end =
|
|
75
|
+
Math.max(
|
|
76
|
+
...this.notes.map((note) => parseInt(note.time.split(":")[0], 10))
|
|
77
|
+
) + 1;
|
|
78
|
+
|
|
79
|
+
return `${end}:0:0`;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private onEvent = (time: number, note: INote) => {
|
|
83
|
+
const event = MidiEvent.fromNote(note, "noteOn", time);
|
|
84
|
+
|
|
85
|
+
this.midiOutput.connections.forEach((input) => {
|
|
86
|
+
input.pluggable(event);
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
}
|
package/src/Module/index.ts
CHANGED
|
@@ -13,6 +13,7 @@ import Reverb from "./Reverb";
|
|
|
13
13
|
import Delay from "./Delay";
|
|
14
14
|
import Distortion from "./Distortion";
|
|
15
15
|
import BitCrusher from "./BitCrusher";
|
|
16
|
+
import Sequencer from "./Sequencer";
|
|
16
17
|
|
|
17
18
|
export { default } from "./Base";
|
|
18
19
|
export { default as PolyModule } from "./PolyModule";
|
|
@@ -73,6 +74,8 @@ function moduleClassFromType(type: string) {
|
|
|
73
74
|
return Distortion;
|
|
74
75
|
case BitCrusher.moduleName:
|
|
75
76
|
return BitCrusher;
|
|
77
|
+
case Sequencer.moduleName:
|
|
78
|
+
return Sequencer;
|
|
76
79
|
default:
|
|
77
80
|
throw Error(`Unknown module type ${type}`);
|
|
78
81
|
}
|
package/src/Note/index.ts
CHANGED
|
@@ -1,19 +1,38 @@
|
|
|
1
|
+
import { TimeClass, Time } from "tone";
|
|
2
|
+
import MidiEvent from "../MidiEvent";
|
|
1
3
|
import frequencyTable from "./frequencyTable";
|
|
2
4
|
|
|
3
5
|
const Notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
|
|
4
6
|
|
|
5
7
|
const NotesLength = Notes.length;
|
|
6
8
|
|
|
9
|
+
export interface INote {
|
|
10
|
+
note: string;
|
|
11
|
+
time: string;
|
|
12
|
+
velocity?: number;
|
|
13
|
+
duration?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
7
16
|
export default class Note {
|
|
8
17
|
static _notes: Note[];
|
|
9
18
|
name: string;
|
|
10
19
|
octave: number;
|
|
20
|
+
time: TimeClass = Time("0:0:0");
|
|
21
|
+
velocity?: number = 1;
|
|
22
|
+
duration?: string;
|
|
23
|
+
|
|
24
|
+
constructor(
|
|
25
|
+
eventOrString: INote | MIDIMessageEvent | string,
|
|
26
|
+
duration?: string
|
|
27
|
+
) {
|
|
28
|
+
this.duration = duration;
|
|
11
29
|
|
|
12
|
-
constructor(eventOrString: MIDIMessageEvent | string) {
|
|
13
30
|
if (typeof eventOrString === "string") {
|
|
14
31
|
this.fromString(eventOrString);
|
|
15
|
-
} else {
|
|
32
|
+
} else if (eventOrString instanceof MIDIMessageEvent) {
|
|
16
33
|
this.fromEvent(eventOrString);
|
|
34
|
+
} else {
|
|
35
|
+
this.fromProps(eventOrString);
|
|
17
36
|
}
|
|
18
37
|
}
|
|
19
38
|
|
|
@@ -51,6 +70,15 @@ export default class Note {
|
|
|
51
70
|
return this.fullName;
|
|
52
71
|
}
|
|
53
72
|
|
|
73
|
+
serialize(): INote {
|
|
74
|
+
return {
|
|
75
|
+
time: this.time.toBarsBeatsSixteenths(),
|
|
76
|
+
note: this.fullName,
|
|
77
|
+
duration: this.duration,
|
|
78
|
+
velocity: 1,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
54
82
|
private fromString(string: string) {
|
|
55
83
|
const matches = string.match(/(\w#?)(\d)?/) || [];
|
|
56
84
|
|
|
@@ -62,4 +90,13 @@ export default class Note {
|
|
|
62
90
|
this.name = Notes[event.data[1] % 12];
|
|
63
91
|
this.octave = Math.floor(event.data[1] / 12) - 2;
|
|
64
92
|
}
|
|
93
|
+
|
|
94
|
+
private fromProps(props: INote) {
|
|
95
|
+
const { note, time, duration, velocity } = props;
|
|
96
|
+
|
|
97
|
+
this.fromString(note);
|
|
98
|
+
this.time = Time(time);
|
|
99
|
+
this.duration = duration;
|
|
100
|
+
this.velocity = velocity;
|
|
101
|
+
}
|
|
65
102
|
}
|
package/src/index.ts
CHANGED
|
@@ -3,6 +3,7 @@ export { default as MidiDevice } from "./MidiDevice";
|
|
|
3
3
|
export { default as MidiDeviceManager } from "./MidiDeviceManager";
|
|
4
4
|
export { default as Note } from "./Note";
|
|
5
5
|
|
|
6
|
+
export type { INote } from "./Note";
|
|
6
7
|
export type { MidiDeviceInterface } from "./MidiDevice";
|
|
7
8
|
export type { ModuleInterface, AudioModule } from "./Module";
|
|
8
9
|
|