@blibliki/engine 0.1.10 → 0.1.12
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 +15 -2
- package/build/Engine.d.ts +5 -0
- package/build/Engine.js +30 -2
- package/build/Engine.js.map +1 -1
- package/build/Module/Base.d.ts +0 -2
- package/build/Module/Base.js +9 -7
- package/build/Module/Base.js.map +1 -1
- package/build/Module/Envelope/Base.d.ts +0 -1
- package/build/Module/Envelope/Base.js +0 -9
- package/build/Module/Envelope/Base.js.map +1 -1
- package/build/Module/Oscillator.d.ts +5 -2
- package/build/Module/Oscillator.js +24 -9
- package/build/Module/Oscillator.js.map +1 -1
- package/build/Module/PolyModule.d.ts +1 -1
- package/build/Module/PolyModule.js +1 -1
- package/build/Module/PolyModule.js.map +1 -1
- package/build/Module/Sequencer.d.ts +8 -5
- package/build/Module/Sequencer.js +48 -27
- package/build/Module/Sequencer.js.map +1 -1
- package/package.json +1 -1
- package/src/Engine.ts +36 -2
- package/src/Module/Base.ts +19 -10
- package/src/Module/Envelope/Base.ts +1 -10
- package/src/Module/Oscillator.ts +26 -10
- package/src/Module/PolyModule.ts +1 -1
- package/src/Module/Sequencer.ts +53 -28
package/README.md
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
# Blibliki Engine
|
|
2
|
-
This is an engine for making synth systems.
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
Blibliki Engine is a data-driven, non-UI JavaScript library written in TypeScript that serves as a framework for building synthesizers.
|
|
4
|
+
Built on top of ToneJS, it aims to provide a streamlined interface for creating custom synthesizers.
|
|
5
|
+
|
|
6
|
+
## Approach
|
|
7
|
+
|
|
8
|
+
The engine operates in a data-driven manner, allowing developers to provide changes to the current module configuration rather than directly accessing the modules themselves.
|
|
9
|
+
This approach facilitates seamless integration with state management libraries like Redux, making it easy to build applications with centralized state management.
|
|
10
|
+
|
|
11
|
+
One notable advantage of the data-driven approach is the ability to easily save and recall patches. By representing the synthesizer configuration as data, developers can effortlessly store and load patches, enabling users to save and share their custom presets.
|
|
12
|
+
|
|
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
|
+
|
|
15
|
+
## Contributing
|
|
16
|
+
|
|
17
|
+
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
|
@@ -80,6 +80,11 @@ declare class Engine {
|
|
|
80
80
|
triggerVirtualMidi(id: string, noteName: string, type: EType): void;
|
|
81
81
|
dispose(): void;
|
|
82
82
|
findById(id: string): AudioModule;
|
|
83
|
+
get isStarted(): boolean;
|
|
84
|
+
start(): void;
|
|
85
|
+
stop(): void;
|
|
86
|
+
get bpm(): number;
|
|
87
|
+
set bpm(value: number);
|
|
83
88
|
private applyRoutesRequired;
|
|
84
89
|
private moduleRouteIds;
|
|
85
90
|
}
|
package/build/Engine.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Context, setContext } from "tone";
|
|
1
|
+
import { Context, now, setContext } from "tone";
|
|
2
2
|
import MidiDeviceManager from "./MidiDeviceManager";
|
|
3
3
|
import MidiEvent from "./MidiEvent";
|
|
4
4
|
import { createModule } from "./Module";
|
|
@@ -34,7 +34,8 @@ class Engine {
|
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
36
|
registerModule(name, type, props = {}) {
|
|
37
|
-
const audioModule = createModule(name, type,
|
|
37
|
+
const audioModule = createModule(name, type, {});
|
|
38
|
+
audioModule.props = props;
|
|
38
39
|
this.modules[audioModule.id] = audioModule;
|
|
39
40
|
applyRoutes(Object.values(this.routes));
|
|
40
41
|
return audioModule.serialize();
|
|
@@ -103,6 +104,33 @@ class Engine {
|
|
|
103
104
|
throw Error(`Audio module with id ${id} not exists`);
|
|
104
105
|
return audioModule;
|
|
105
106
|
}
|
|
107
|
+
get isStarted() {
|
|
108
|
+
return this.context.transport.state === "started";
|
|
109
|
+
}
|
|
110
|
+
start() {
|
|
111
|
+
const startTime = now();
|
|
112
|
+
Object.values(this.modules).forEach((audioModule) => {
|
|
113
|
+
const am = audioModule;
|
|
114
|
+
if (!am.start)
|
|
115
|
+
return;
|
|
116
|
+
am.start(startTime);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
stop() {
|
|
120
|
+
const startTime = now();
|
|
121
|
+
Object.values(this.modules).forEach((audioModule) => {
|
|
122
|
+
const am = audioModule;
|
|
123
|
+
if (!am.stop)
|
|
124
|
+
return;
|
|
125
|
+
am.stop(startTime);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
get bpm() {
|
|
129
|
+
return this.context.transport.bpm.value;
|
|
130
|
+
}
|
|
131
|
+
set bpm(value) {
|
|
132
|
+
this.context.transport.bpm.value = value;
|
|
133
|
+
}
|
|
106
134
|
applyRoutesRequired(audioModule, props) {
|
|
107
135
|
if (!props.polyNumber)
|
|
108
136
|
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,UAAU,EAAE,MAAM,MAAM,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
|
@@ -11,7 +11,6 @@ export interface Connectable {
|
|
|
11
11
|
export interface Triggerable {
|
|
12
12
|
triggerAttack: Function;
|
|
13
13
|
triggerRelease: Function;
|
|
14
|
-
triggerAttackRelease: Function;
|
|
15
14
|
}
|
|
16
15
|
export interface Voicable {
|
|
17
16
|
voiceNo?: number;
|
|
@@ -48,7 +47,6 @@ declare class Module<InternalModule extends Connectable, PropsInterface> impleme
|
|
|
48
47
|
dispose(): void;
|
|
49
48
|
triggerAttack(note: Note, triggeredAt: number): void;
|
|
50
49
|
triggerRelease(note: Note, triggeredAt: number): void;
|
|
51
|
-
triggerAttackRelease(note: Note, triggeredAt: number): void;
|
|
52
50
|
midiTriggered: (midiEvent: MidiEvent, noteIndex?: number) => void;
|
|
53
51
|
private triggerer;
|
|
54
52
|
serialize(): {
|
package/build/Module/Base.js
CHANGED
|
@@ -71,23 +71,25 @@ class Module {
|
|
|
71
71
|
triggerRelease(note, triggeredAt) {
|
|
72
72
|
throw Error("triggerRelease not implemented");
|
|
73
73
|
}
|
|
74
|
-
triggerAttackRelease(note, triggeredAt) {
|
|
75
|
-
throw Error("triggerAttackRelease not implemented");
|
|
76
|
-
}
|
|
77
74
|
midiTriggered = (midiEvent, noteIndex) => {
|
|
75
|
+
const { notes, triggeredAt } = midiEvent;
|
|
78
76
|
switch (midiEvent.type) {
|
|
79
77
|
case "noteOn":
|
|
80
|
-
|
|
78
|
+
const { duration } = notes[0];
|
|
79
|
+
this.triggerer(this.triggerAttack, notes, triggeredAt, noteIndex);
|
|
80
|
+
if (duration) {
|
|
81
|
+
const releaseTriggeredAt = triggeredAt + this.internalModule.toSeconds(duration);
|
|
82
|
+
this.triggerer(this.triggerRelease, notes, releaseTriggeredAt, noteIndex);
|
|
83
|
+
}
|
|
81
84
|
break;
|
|
82
85
|
case "noteOff":
|
|
83
|
-
this.triggerer(this.triggerRelease,
|
|
86
|
+
this.triggerer(this.triggerRelease, notes, triggeredAt, noteIndex);
|
|
84
87
|
break;
|
|
85
88
|
default:
|
|
86
89
|
throw Error("This type is not a note");
|
|
87
90
|
}
|
|
88
91
|
};
|
|
89
|
-
triggerer(trigger,
|
|
90
|
-
const { notes, triggeredAt } = midiEvent;
|
|
92
|
+
triggerer(trigger, notes, triggeredAt, noteIndex) {
|
|
91
93
|
if (noteIndex !== undefined && this.voiceNo !== undefined) {
|
|
92
94
|
trigger(notes[noteIndex], triggeredAt);
|
|
93
95
|
return;
|
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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"}
|
|
@@ -29,7 +29,6 @@ export default abstract class EnvelopeModule<EnvelopeLike extends Env> extends M
|
|
|
29
29
|
set release(value: number);
|
|
30
30
|
setStage(stage: EnvelopeStages, value: number): void;
|
|
31
31
|
triggerAttack: (note: Note, triggeredAt: number) => void;
|
|
32
|
-
triggerAttackRelease: (note: Note, triggeredAt: number) => void;
|
|
33
32
|
triggerRelease: (note: Note, triggeredAt: number) => void;
|
|
34
33
|
private maxTime;
|
|
35
34
|
private minTime;
|
|
@@ -57,20 +57,11 @@ export default class EnvelopeModule extends Module {
|
|
|
57
57
|
this.internalModule[stage] = calculatedValue;
|
|
58
58
|
}
|
|
59
59
|
triggerAttack = (note, triggeredAt) => {
|
|
60
|
-
if (note.duration)
|
|
61
|
-
return this.triggerAttackRelease(note, triggeredAt);
|
|
62
60
|
this.activeNote = note.fullName;
|
|
63
61
|
this.triggeredAt = triggeredAt;
|
|
64
62
|
this.internalModule.triggerAttack(triggeredAt);
|
|
65
63
|
};
|
|
66
|
-
triggerAttackRelease = (note, triggeredAt) => {
|
|
67
|
-
this.activeNote = note.fullName;
|
|
68
|
-
this.triggeredAt = triggeredAt;
|
|
69
|
-
this.internalModule.triggerAttackRelease(note.duration, triggeredAt);
|
|
70
|
-
};
|
|
71
64
|
triggerRelease = (note, triggeredAt) => {
|
|
72
|
-
if (this.activeNote && this.activeNote !== note.fullName)
|
|
73
|
-
return;
|
|
74
65
|
this.internalModule.triggerRelease(triggeredAt);
|
|
75
66
|
};
|
|
76
67
|
maxTime(stage) {
|
|
@@ -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;AAIvC,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,GAAG,CAAC,IAAU,EAAE,WAAmB,EAAE,EAAE;QAClD,IAAI,
|
|
1
|
+
{"version":3,"file":"Base.js","sourceRoot":"","sources":["../../../src/Module/Envelope/Base.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,15 +28,18 @@ declare class MonoOscillator extends Module<Osc, OscillatorInterface> {
|
|
|
28
28
|
set volume(value: number);
|
|
29
29
|
get range(): number;
|
|
30
30
|
set range(value: number);
|
|
31
|
-
start(): void;
|
|
31
|
+
start(time: number): void;
|
|
32
|
+
stop(time?: number): void;
|
|
32
33
|
triggerAttack: (note: Note, triggeredAt: number) => void;
|
|
33
|
-
triggerRelease: (note: Note) => void;
|
|
34
|
+
triggerRelease: (note: Note, triggeredAt: number) => void;
|
|
34
35
|
private updateFrequency;
|
|
35
36
|
private getNote;
|
|
36
37
|
}
|
|
37
38
|
export default class Oscillator extends PolyModule<MonoOscillator, OscillatorInterface> {
|
|
38
39
|
static moduleName: string;
|
|
39
40
|
constructor(name: string, props: Partial<OscillatorInterface>);
|
|
41
|
+
start(time: number): void;
|
|
42
|
+
stop(time?: number): void;
|
|
40
43
|
private registerInputs;
|
|
41
44
|
}
|
|
42
45
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Oscillator as Osc } from "tone";
|
|
1
|
+
import { now, Oscillator as Osc } from "tone";
|
|
2
2
|
import Note from "../Note";
|
|
3
3
|
import Module from "./Base";
|
|
4
4
|
import PolyModule from "./PolyModule";
|
|
@@ -17,9 +17,7 @@ class MonoOscillator extends Module {
|
|
|
17
17
|
name,
|
|
18
18
|
props: { ...InitialProps, ...props },
|
|
19
19
|
});
|
|
20
|
-
this.
|
|
21
|
-
this.internalModule.sync();
|
|
22
|
-
this.internalModule.start();
|
|
20
|
+
this.start(now());
|
|
23
21
|
}
|
|
24
22
|
get note() {
|
|
25
23
|
return this._note;
|
|
@@ -74,13 +72,26 @@ class MonoOscillator extends Module {
|
|
|
74
72
|
this._props = { ...this.props, range: value };
|
|
75
73
|
this.updateFrequency();
|
|
76
74
|
}
|
|
77
|
-
start() {
|
|
78
|
-
this.internalModule.
|
|
75
|
+
start(time) {
|
|
76
|
+
const state = this.internalModule.context.transport.state;
|
|
77
|
+
if (state !== "started")
|
|
78
|
+
return;
|
|
79
|
+
const oscState = this.internalModule.state;
|
|
80
|
+
if (oscState === "started") {
|
|
81
|
+
this.internalModule.restart(time);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
this.internalModule.start(time);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
stop(time) {
|
|
88
|
+
this.internalModule.stop(time);
|
|
79
89
|
}
|
|
80
90
|
triggerAttack = (note, triggeredAt) => {
|
|
81
91
|
this.setNoteAt(note, triggeredAt);
|
|
92
|
+
this.start(triggeredAt);
|
|
82
93
|
};
|
|
83
|
-
triggerRelease = (note) => {
|
|
94
|
+
triggerRelease = (note, triggeredAt) => {
|
|
84
95
|
// Do nothing
|
|
85
96
|
};
|
|
86
97
|
updateFrequency(time) {
|
|
@@ -88,11 +99,9 @@ class MonoOscillator extends Module {
|
|
|
88
99
|
return;
|
|
89
100
|
const freq = this.note.frequency(this.range, this.coarse);
|
|
90
101
|
if (time) {
|
|
91
|
-
this.internalModule.restart(time);
|
|
92
102
|
this.internalModule.frequency.setValueAtTime(freq, time);
|
|
93
103
|
}
|
|
94
104
|
else {
|
|
95
|
-
this.internalModule.restart();
|
|
96
105
|
this.internalModule.frequency.value = freq;
|
|
97
106
|
}
|
|
98
107
|
}
|
|
@@ -111,6 +120,12 @@ export default class Oscillator extends PolyModule {
|
|
|
111
120
|
this.registerBasicOutputs();
|
|
112
121
|
this.registerInputs();
|
|
113
122
|
}
|
|
123
|
+
start(time) {
|
|
124
|
+
this.audioModules.forEach((audioModule) => audioModule.start(time));
|
|
125
|
+
}
|
|
126
|
+
stop(time) {
|
|
127
|
+
this.audioModules.forEach((audioModule) => audioModule.stop(time));
|
|
128
|
+
}
|
|
114
129
|
registerInputs() {
|
|
115
130
|
this.registerInput({
|
|
116
131
|
name: "midi in",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Oscillator.js","sourceRoot":"","sources":["../../src/Module/Oscillator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Oscillator.js","sourceRoot":"","sources":["../../src/Module/Oscillator.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ export default abstract class PolyModule<MonoAudioModule extends Module<Connecta
|
|
|
26
26
|
plug(audioModule: AudioModule, from: string, to: string): void;
|
|
27
27
|
unplugAll(): void;
|
|
28
28
|
dispose(): void;
|
|
29
|
-
midiTriggered: (midiEvent: MidiEvent, voiceNo
|
|
29
|
+
midiTriggered: (midiEvent: MidiEvent, voiceNo?: number, noteIndex?: number) => void;
|
|
30
30
|
serialize(): {
|
|
31
31
|
id: string;
|
|
32
32
|
type: string;
|
|
@@ -60,7 +60,7 @@ export default class PolyModule {
|
|
|
60
60
|
m.dispose();
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
|
-
midiTriggered = (midiEvent, voiceNo, noteIndex) => {
|
|
63
|
+
midiTriggered = (midiEvent, voiceNo = 0, noteIndex) => {
|
|
64
64
|
const audioModule = this.findVoice(voiceNo);
|
|
65
65
|
audioModule?.midiTriggered(midiEvent, noteIndex);
|
|
66
66
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolyModule.js","sourceRoot":"","sources":["../../src/Module/PolyModule.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PolyModule.js","sourceRoot":"","sources":["../../src/Module/PolyModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ export interface ISequence {
|
|
|
8
8
|
}
|
|
9
9
|
interface ISequencer {
|
|
10
10
|
sequences: ISequence[][];
|
|
11
|
-
|
|
11
|
+
steps: number;
|
|
12
12
|
bars: number;
|
|
13
13
|
}
|
|
14
14
|
export default class Sequencer extends Module<DummnyInternalModule, ISequencer> {
|
|
@@ -17,18 +17,21 @@ export default class Sequencer extends Module<DummnyInternalModule, ISequencer>
|
|
|
17
17
|
private part;
|
|
18
18
|
private barParts;
|
|
19
19
|
constructor(name: string, props: Partial<ISequencer>);
|
|
20
|
-
get
|
|
21
|
-
set
|
|
20
|
+
get props(): ISequencer;
|
|
21
|
+
set props(value: ISequencer);
|
|
22
|
+
get steps(): number;
|
|
23
|
+
set steps(value: number);
|
|
22
24
|
get bars(): number;
|
|
23
25
|
set bars(value: number);
|
|
24
26
|
get sequences(): ISequence[][];
|
|
25
27
|
set sequences(value: ISequence[][]);
|
|
26
|
-
start(): void;
|
|
28
|
+
start(time: number): void;
|
|
27
29
|
stop(): void;
|
|
28
30
|
private registerOutputs;
|
|
29
31
|
private initializePart;
|
|
32
|
+
private adjust;
|
|
30
33
|
private adjustNumberOfBars;
|
|
31
|
-
private
|
|
34
|
+
private adjustNumberOfSteps;
|
|
32
35
|
private updateBarParts;
|
|
33
36
|
private get loopEnd();
|
|
34
37
|
private onPartEvent;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Part, Time } from "tone";
|
|
1
|
+
import { now, Part, Time } from "tone";
|
|
2
2
|
import Module, { DummnyInternalModule } from "./Base";
|
|
3
3
|
import MidiEvent from "../MidiEvent";
|
|
4
4
|
const InitialProps = () => ({
|
|
5
5
|
sequences: [],
|
|
6
|
-
|
|
6
|
+
steps: 16,
|
|
7
7
|
bars: 1,
|
|
8
8
|
});
|
|
9
9
|
export default class Sequencer extends Module {
|
|
@@ -17,25 +17,29 @@ export default class Sequencer extends Module {
|
|
|
17
17
|
props: { ...InitialProps(), ...props },
|
|
18
18
|
});
|
|
19
19
|
this.initializePart();
|
|
20
|
-
this.start();
|
|
20
|
+
this.start(now());
|
|
21
21
|
this.registerOutputs();
|
|
22
22
|
}
|
|
23
|
-
get
|
|
24
|
-
return
|
|
23
|
+
get props() {
|
|
24
|
+
return super.props;
|
|
25
25
|
}
|
|
26
|
-
set
|
|
27
|
-
this.
|
|
28
|
-
|
|
29
|
-
this.
|
|
26
|
+
set props(value) {
|
|
27
|
+
if (!this.sequences)
|
|
28
|
+
this._props["sequences"] = [];
|
|
29
|
+
super.props = { ...this.props, ...value };
|
|
30
|
+
this.adjust();
|
|
31
|
+
}
|
|
32
|
+
get steps() {
|
|
33
|
+
return this._props["steps"];
|
|
34
|
+
}
|
|
35
|
+
set steps(value) {
|
|
36
|
+
this._props = { ...this.props, steps: value };
|
|
30
37
|
}
|
|
31
38
|
get bars() {
|
|
32
39
|
return this.props["bars"];
|
|
33
40
|
}
|
|
34
41
|
set bars(value) {
|
|
35
|
-
this._props
|
|
36
|
-
this.adjustNumberOfBars();
|
|
37
|
-
this.adjustNumberOfSequences();
|
|
38
|
-
this.updateBarParts();
|
|
42
|
+
this._props = { ...this.props, bars: value };
|
|
39
43
|
}
|
|
40
44
|
get sequences() {
|
|
41
45
|
return this._props["sequences"];
|
|
@@ -43,10 +47,12 @@ export default class Sequencer extends Module {
|
|
|
43
47
|
set sequences(value) {
|
|
44
48
|
const sequences = value;
|
|
45
49
|
this._props = { ...this.props, sequences };
|
|
46
|
-
this.updateBarParts();
|
|
47
50
|
}
|
|
48
|
-
start() {
|
|
49
|
-
this.part.
|
|
51
|
+
start(time) {
|
|
52
|
+
const state = this.part.context.transport.state;
|
|
53
|
+
if (state !== "started")
|
|
54
|
+
return;
|
|
55
|
+
this.part.start(time);
|
|
50
56
|
}
|
|
51
57
|
stop() {
|
|
52
58
|
this.part.stop();
|
|
@@ -62,30 +68,38 @@ export default class Sequencer extends Module {
|
|
|
62
68
|
this.part.add(`${i}:0:0`, i);
|
|
63
69
|
});
|
|
64
70
|
}
|
|
71
|
+
adjust() {
|
|
72
|
+
if (!this.part)
|
|
73
|
+
return;
|
|
74
|
+
this.adjustNumberOfBars();
|
|
75
|
+
this.adjustNumberOfSteps();
|
|
76
|
+
this.updateBarParts();
|
|
77
|
+
}
|
|
65
78
|
adjustNumberOfBars() {
|
|
66
79
|
const currentBar = this.sequences.length;
|
|
67
80
|
const num = currentBar - this.bars;
|
|
81
|
+
const sequences = [...this.sequences];
|
|
68
82
|
if (num === 0)
|
|
69
83
|
return;
|
|
70
84
|
if (num > 0) {
|
|
71
|
-
|
|
72
|
-
this.sequences.pop();
|
|
85
|
+
sequences.pop();
|
|
73
86
|
}
|
|
74
87
|
else {
|
|
75
|
-
|
|
76
|
-
this.sequences.push([]);
|
|
88
|
+
sequences.push([]);
|
|
77
89
|
}
|
|
90
|
+
this.sequences = sequences;
|
|
78
91
|
this.adjustNumberOfBars();
|
|
79
92
|
}
|
|
80
|
-
|
|
93
|
+
adjustNumberOfSteps(bar = 0) {
|
|
81
94
|
if (!this.bars)
|
|
82
95
|
return;
|
|
83
|
-
const
|
|
84
|
-
const
|
|
96
|
+
const allSequences = [...this.sequences];
|
|
97
|
+
const sequences = [...allSequences[bar]];
|
|
98
|
+
const num = sequences.length - this.steps;
|
|
85
99
|
if (num === 0) {
|
|
86
100
|
if (bar === this.bars - 1)
|
|
87
101
|
return;
|
|
88
|
-
this.
|
|
102
|
+
this.adjustNumberOfSteps(bar + 1);
|
|
89
103
|
return;
|
|
90
104
|
}
|
|
91
105
|
if (num > 0) {
|
|
@@ -93,16 +107,23 @@ export default class Sequencer extends Module {
|
|
|
93
107
|
}
|
|
94
108
|
else {
|
|
95
109
|
const index = sequences.length;
|
|
96
|
-
sequences.push({ active: false, time:
|
|
110
|
+
sequences.push({ active: false, time: `0:0:${index}`, notes: [] });
|
|
97
111
|
}
|
|
98
|
-
|
|
112
|
+
allSequences[bar] = sequences;
|
|
113
|
+
this.sequences = allSequences;
|
|
114
|
+
this.adjustNumberOfSteps(bar);
|
|
99
115
|
}
|
|
100
116
|
updateBarParts() {
|
|
101
|
-
this.barParts = this.sequences.map((barSeqs,
|
|
117
|
+
this.barParts = this.sequences.map((barSeqs, _) => {
|
|
102
118
|
const part = new Part(this.onSequenceEvent, []);
|
|
103
119
|
barSeqs.forEach((seq) => part.add(seq.time, seq));
|
|
104
120
|
return part;
|
|
105
121
|
});
|
|
122
|
+
this.part.clear();
|
|
123
|
+
this.barParts.forEach((_, bar) => {
|
|
124
|
+
this.part.add(`${bar}:0:0`, bar);
|
|
125
|
+
});
|
|
126
|
+
this.part.loopEnd = this.loopEnd;
|
|
106
127
|
}
|
|
107
128
|
get loopEnd() {
|
|
108
129
|
return `${this.bars}:0:0`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sequencer.js","sourceRoot":"","sources":["../../src/Module/Sequencer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"Sequencer.js","sourceRoot":"","sources":["../../src/Module/Sequencer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Engine.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Context, setContext } from "tone";
|
|
1
|
+
import { Context, now, setContext } from "tone";
|
|
2
2
|
import MidiDeviceManager from "./MidiDeviceManager";
|
|
3
3
|
import MidiEvent, { EType } from "./MidiEvent";
|
|
4
4
|
|
|
@@ -52,6 +52,7 @@ class Engine {
|
|
|
52
52
|
this.context = new Context(props.context);
|
|
53
53
|
setContext(this.context);
|
|
54
54
|
this.context.transport.start();
|
|
55
|
+
|
|
55
56
|
this.midiDeviceManager = new MidiDeviceManager();
|
|
56
57
|
|
|
57
58
|
return {
|
|
@@ -60,7 +61,8 @@ class Engine {
|
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
registerModule(name: string, type: string, props: any = {}) {
|
|
63
|
-
const audioModule = createModule(name, type,
|
|
64
|
+
const audioModule = createModule(name, type, {});
|
|
65
|
+
audioModule.props = props;
|
|
64
66
|
this.modules[audioModule.id] = audioModule;
|
|
65
67
|
|
|
66
68
|
applyRoutes(Object.values(this.routes));
|
|
@@ -153,6 +155,38 @@ class Engine {
|
|
|
153
155
|
return audioModule;
|
|
154
156
|
}
|
|
155
157
|
|
|
158
|
+
get isStarted() {
|
|
159
|
+
return this.context.transport.state === "started";
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
start() {
|
|
163
|
+
const startTime = now();
|
|
164
|
+
Object.values(this.modules).forEach((audioModule) => {
|
|
165
|
+
const am = audioModule as any;
|
|
166
|
+
if (!am.start) return;
|
|
167
|
+
|
|
168
|
+
am.start(startTime);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
stop() {
|
|
173
|
+
const startTime = now();
|
|
174
|
+
Object.values(this.modules).forEach((audioModule) => {
|
|
175
|
+
const am = audioModule as any;
|
|
176
|
+
if (!am.stop) return;
|
|
177
|
+
|
|
178
|
+
am.stop(startTime);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
get bpm() {
|
|
183
|
+
return this.context.transport.bpm.value;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
set bpm(value: number) {
|
|
187
|
+
this.context.transport.bpm.value = value;
|
|
188
|
+
}
|
|
189
|
+
|
|
156
190
|
private applyRoutesRequired(audioModule: AudioModule, props: any) {
|
|
157
191
|
if (!props.polyNumber) return false;
|
|
158
192
|
if (!(audioModule instanceof VoiceScheduler)) return false;
|
package/src/Module/Base.ts
CHANGED
|
@@ -15,7 +15,6 @@ export interface Connectable {
|
|
|
15
15
|
export interface Triggerable {
|
|
16
16
|
triggerAttack: Function;
|
|
17
17
|
triggerRelease: Function;
|
|
18
|
-
triggerAttackRelease: Function;
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
export interface Voicable {
|
|
@@ -130,17 +129,28 @@ class Module<InternalModule extends Connectable, PropsInterface>
|
|
|
130
129
|
throw Error("triggerRelease not implemented");
|
|
131
130
|
}
|
|
132
131
|
|
|
133
|
-
triggerAttackRelease(note: Note, triggeredAt: number) {
|
|
134
|
-
throw Error("triggerAttackRelease not implemented");
|
|
135
|
-
}
|
|
136
|
-
|
|
137
132
|
midiTriggered = (midiEvent: MidiEvent, noteIndex?: number) => {
|
|
133
|
+
const { notes, triggeredAt } = midiEvent;
|
|
134
|
+
|
|
138
135
|
switch (midiEvent.type) {
|
|
139
136
|
case "noteOn":
|
|
140
|
-
|
|
137
|
+
const { duration } = notes[0];
|
|
138
|
+
|
|
139
|
+
this.triggerer(this.triggerAttack, notes, triggeredAt, noteIndex);
|
|
140
|
+
|
|
141
|
+
if (duration) {
|
|
142
|
+
const releaseTriggeredAt =
|
|
143
|
+
triggeredAt + (this.internalModule as any).toSeconds(duration);
|
|
144
|
+
this.triggerer(
|
|
145
|
+
this.triggerRelease,
|
|
146
|
+
notes,
|
|
147
|
+
releaseTriggeredAt,
|
|
148
|
+
noteIndex
|
|
149
|
+
);
|
|
150
|
+
}
|
|
141
151
|
break;
|
|
142
152
|
case "noteOff":
|
|
143
|
-
this.triggerer(this.triggerRelease,
|
|
153
|
+
this.triggerer(this.triggerRelease, notes, triggeredAt, noteIndex);
|
|
144
154
|
break;
|
|
145
155
|
default:
|
|
146
156
|
throw Error("This type is not a note");
|
|
@@ -149,11 +159,10 @@ class Module<InternalModule extends Connectable, PropsInterface>
|
|
|
149
159
|
|
|
150
160
|
private triggerer(
|
|
151
161
|
trigger: Function,
|
|
152
|
-
|
|
162
|
+
notes: Note[],
|
|
163
|
+
triggeredAt: number,
|
|
153
164
|
noteIndex?: number
|
|
154
165
|
) {
|
|
155
|
-
const { notes, triggeredAt } = midiEvent;
|
|
156
|
-
|
|
157
166
|
if (noteIndex !== undefined && this.voiceNo !== undefined) {
|
|
158
167
|
trigger(notes[noteIndex], triggeredAt);
|
|
159
168
|
return;
|
|
@@ -90,22 +90,13 @@ export default abstract class EnvelopeModule<EnvelopeLike extends Env>
|
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
triggerAttack = (note: Note, triggeredAt: number) => {
|
|
93
|
-
if (note.duration) return this.triggerAttackRelease(note, triggeredAt);
|
|
94
|
-
|
|
95
93
|
this.activeNote = note.fullName;
|
|
96
94
|
this.triggeredAt = triggeredAt;
|
|
97
|
-
this.internalModule.triggerAttack(triggeredAt);
|
|
98
|
-
};
|
|
99
95
|
|
|
100
|
-
|
|
101
|
-
this.activeNote = note.fullName;
|
|
102
|
-
this.triggeredAt = triggeredAt;
|
|
103
|
-
this.internalModule.triggerAttackRelease(note.duration, triggeredAt);
|
|
96
|
+
this.internalModule.triggerAttack(triggeredAt);
|
|
104
97
|
};
|
|
105
98
|
|
|
106
99
|
triggerRelease = (note: Note, triggeredAt: number) => {
|
|
107
|
-
if (this.activeNote && this.activeNote !== note.fullName) return;
|
|
108
|
-
|
|
109
100
|
this.internalModule.triggerRelease(triggeredAt);
|
|
110
101
|
};
|
|
111
102
|
|
package/src/Module/Oscillator.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import MidiEvent from "../MidiEvent";
|
|
2
1
|
import { now, Oscillator as Osc, ToneOscillatorType } from "tone";
|
|
3
2
|
|
|
4
3
|
import Note from "../Note";
|
|
@@ -32,10 +31,7 @@ class MonoOscillator extends Module<Osc, OscillatorInterface> {
|
|
|
32
31
|
props: { ...InitialProps, ...props },
|
|
33
32
|
});
|
|
34
33
|
|
|
35
|
-
this.
|
|
36
|
-
|
|
37
|
-
this.internalModule.sync();
|
|
38
|
-
this.internalModule.start();
|
|
34
|
+
this.start(now());
|
|
39
35
|
}
|
|
40
36
|
|
|
41
37
|
get note(): Note {
|
|
@@ -108,15 +104,29 @@ class MonoOscillator extends Module<Osc, OscillatorInterface> {
|
|
|
108
104
|
this.updateFrequency();
|
|
109
105
|
}
|
|
110
106
|
|
|
111
|
-
start() {
|
|
112
|
-
this.internalModule.
|
|
107
|
+
start(time: number) {
|
|
108
|
+
const state = this.internalModule.context.transport.state;
|
|
109
|
+
if (state !== "started") return;
|
|
110
|
+
|
|
111
|
+
const oscState = this.internalModule.state;
|
|
112
|
+
|
|
113
|
+
if (oscState === "started") {
|
|
114
|
+
this.internalModule.restart(time);
|
|
115
|
+
} else {
|
|
116
|
+
this.internalModule.start(time);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
stop(time?: number) {
|
|
121
|
+
this.internalModule.stop(time);
|
|
113
122
|
}
|
|
114
123
|
|
|
115
124
|
triggerAttack = (note: Note, triggeredAt: number) => {
|
|
116
125
|
this.setNoteAt(note, triggeredAt);
|
|
126
|
+
this.start(triggeredAt);
|
|
117
127
|
};
|
|
118
128
|
|
|
119
|
-
triggerRelease = (note: Note) => {
|
|
129
|
+
triggerRelease = (note: Note, triggeredAt: number) => {
|
|
120
130
|
// Do nothing
|
|
121
131
|
};
|
|
122
132
|
|
|
@@ -126,10 +136,8 @@ class MonoOscillator extends Module<Osc, OscillatorInterface> {
|
|
|
126
136
|
const freq = this.note.frequency(this.range, this.coarse);
|
|
127
137
|
|
|
128
138
|
if (time) {
|
|
129
|
-
this.internalModule.restart(time);
|
|
130
139
|
this.internalModule.frequency.setValueAtTime(freq, time);
|
|
131
140
|
} else {
|
|
132
|
-
this.internalModule.restart();
|
|
133
141
|
this.internalModule.frequency.value = freq;
|
|
134
142
|
}
|
|
135
143
|
}
|
|
@@ -156,6 +164,14 @@ export default class Oscillator extends PolyModule<
|
|
|
156
164
|
this.registerInputs();
|
|
157
165
|
}
|
|
158
166
|
|
|
167
|
+
start(time: number) {
|
|
168
|
+
this.audioModules.forEach((audioModule) => audioModule.start(time));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
stop(time?: number) {
|
|
172
|
+
this.audioModules.forEach((audioModule) => audioModule.stop(time));
|
|
173
|
+
}
|
|
174
|
+
|
|
159
175
|
private registerInputs() {
|
|
160
176
|
this.registerInput({
|
|
161
177
|
name: "midi in",
|
package/src/Module/PolyModule.ts
CHANGED
package/src/Module/Sequencer.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Part, Time } from "tone";
|
|
1
|
+
import { now, Part, Time } from "tone";
|
|
2
2
|
import Module, { DummnyInternalModule } from "./Base";
|
|
3
3
|
import { INote } from "../Note";
|
|
4
4
|
import { Output } from "./IO";
|
|
@@ -11,13 +11,13 @@ export interface ISequence {
|
|
|
11
11
|
}
|
|
12
12
|
interface ISequencer {
|
|
13
13
|
sequences: ISequence[][];
|
|
14
|
-
|
|
14
|
+
steps: number;
|
|
15
15
|
bars: number;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
const InitialProps = () => ({
|
|
19
19
|
sequences: [],
|
|
20
|
-
|
|
20
|
+
steps: 16,
|
|
21
21
|
bars: 1,
|
|
22
22
|
});
|
|
23
23
|
|
|
@@ -37,18 +37,27 @@ export default class Sequencer extends Module<
|
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
this.initializePart();
|
|
40
|
-
this.start();
|
|
40
|
+
this.start(now());
|
|
41
41
|
this.registerOutputs();
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
get
|
|
45
|
-
return
|
|
44
|
+
get props() {
|
|
45
|
+
return super.props;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
set
|
|
49
|
-
this._props["
|
|
50
|
-
|
|
51
|
-
this.
|
|
48
|
+
set props(value: ISequencer) {
|
|
49
|
+
if (!this.sequences) this._props["sequences"] = [];
|
|
50
|
+
|
|
51
|
+
super.props = { ...this.props, ...value };
|
|
52
|
+
this.adjust();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
get steps() {
|
|
56
|
+
return this._props["steps"];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
set steps(value: number) {
|
|
60
|
+
this._props = { ...this.props, steps: value };
|
|
52
61
|
}
|
|
53
62
|
|
|
54
63
|
get bars() {
|
|
@@ -56,10 +65,7 @@ export default class Sequencer extends Module<
|
|
|
56
65
|
}
|
|
57
66
|
|
|
58
67
|
set bars(value: number) {
|
|
59
|
-
this._props
|
|
60
|
-
this.adjustNumberOfBars();
|
|
61
|
-
this.adjustNumberOfSequences();
|
|
62
|
-
this.updateBarParts();
|
|
68
|
+
this._props = { ...this.props, bars: value };
|
|
63
69
|
}
|
|
64
70
|
|
|
65
71
|
get sequences() {
|
|
@@ -69,11 +75,13 @@ export default class Sequencer extends Module<
|
|
|
69
75
|
set sequences(value: ISequence[][]) {
|
|
70
76
|
const sequences = value;
|
|
71
77
|
this._props = { ...this.props, sequences };
|
|
72
|
-
this.updateBarParts();
|
|
73
78
|
}
|
|
74
79
|
|
|
75
|
-
start() {
|
|
76
|
-
this.part.
|
|
80
|
+
start(time: number) {
|
|
81
|
+
const state = this.part.context.transport.state;
|
|
82
|
+
if (state !== "started") return;
|
|
83
|
+
|
|
84
|
+
this.part.start(time);
|
|
77
85
|
}
|
|
78
86
|
|
|
79
87
|
stop() {
|
|
@@ -94,33 +102,42 @@ export default class Sequencer extends Module<
|
|
|
94
102
|
});
|
|
95
103
|
}
|
|
96
104
|
|
|
105
|
+
private adjust() {
|
|
106
|
+
if (!this.part) return;
|
|
107
|
+
|
|
108
|
+
this.adjustNumberOfBars();
|
|
109
|
+
this.adjustNumberOfSteps();
|
|
110
|
+
this.updateBarParts();
|
|
111
|
+
}
|
|
112
|
+
|
|
97
113
|
private adjustNumberOfBars() {
|
|
98
114
|
const currentBar = this.sequences.length;
|
|
99
115
|
const num = currentBar - this.bars;
|
|
116
|
+
const sequences = [...this.sequences];
|
|
100
117
|
|
|
101
118
|
if (num === 0) return;
|
|
102
119
|
|
|
103
120
|
if (num > 0) {
|
|
104
|
-
|
|
105
|
-
this.sequences.pop();
|
|
121
|
+
sequences.pop();
|
|
106
122
|
} else {
|
|
107
|
-
|
|
108
|
-
this.sequences.push([]);
|
|
123
|
+
sequences.push([]);
|
|
109
124
|
}
|
|
110
125
|
|
|
126
|
+
this.sequences = sequences;
|
|
111
127
|
this.adjustNumberOfBars();
|
|
112
128
|
}
|
|
113
129
|
|
|
114
|
-
private
|
|
130
|
+
private adjustNumberOfSteps(bar = 0) {
|
|
115
131
|
if (!this.bars) return;
|
|
116
132
|
|
|
117
|
-
const
|
|
118
|
-
const
|
|
133
|
+
const allSequences = [...this.sequences];
|
|
134
|
+
const sequences = [...allSequences[bar]];
|
|
135
|
+
const num = sequences.length - this.steps;
|
|
119
136
|
|
|
120
137
|
if (num === 0) {
|
|
121
138
|
if (bar === this.bars - 1) return;
|
|
122
139
|
|
|
123
|
-
this.
|
|
140
|
+
this.adjustNumberOfSteps(bar + 1);
|
|
124
141
|
return;
|
|
125
142
|
}
|
|
126
143
|
|
|
@@ -128,19 +145,27 @@ export default class Sequencer extends Module<
|
|
|
128
145
|
sequences.pop();
|
|
129
146
|
} else {
|
|
130
147
|
const index = sequences.length;
|
|
131
|
-
sequences.push({ active: false, time:
|
|
148
|
+
sequences.push({ active: false, time: `0:0:${index}`, notes: [] });
|
|
132
149
|
}
|
|
150
|
+
allSequences[bar] = sequences;
|
|
151
|
+
this.sequences = allSequences;
|
|
133
152
|
|
|
134
|
-
this.
|
|
153
|
+
this.adjustNumberOfSteps(bar);
|
|
135
154
|
}
|
|
136
155
|
|
|
137
156
|
private updateBarParts() {
|
|
138
|
-
this.barParts = this.sequences.map((barSeqs,
|
|
157
|
+
this.barParts = this.sequences.map((barSeqs, _) => {
|
|
139
158
|
const part = new Part(this.onSequenceEvent, [] as Array<ISequence>);
|
|
140
159
|
barSeqs.forEach((seq) => part.add(seq.time, seq));
|
|
141
160
|
|
|
142
161
|
return part;
|
|
143
162
|
});
|
|
163
|
+
|
|
164
|
+
this.part.clear();
|
|
165
|
+
this.barParts.forEach((_, bar) => {
|
|
166
|
+
this.part.add(`${bar}:0:0`, bar);
|
|
167
|
+
});
|
|
168
|
+
this.part.loopEnd = this.loopEnd;
|
|
144
169
|
}
|
|
145
170
|
|
|
146
171
|
private get loopEnd() {
|