@blibliki/engine 0.1.12 → 0.1.14
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/MidiEvent.d.ts +2 -0
- package/build/MidiEvent.js +8 -0
- package/build/MidiEvent.js.map +1 -1
- package/build/Module/DataSequencer.d.ts +24 -0
- package/build/Module/DataSequencer.js +64 -0
- package/build/Module/DataSequencer.js.map +1 -0
- package/build/Module/Envelope/Base.js +1 -1
- package/build/Module/Envelope/Base.js.map +1 -1
- package/build/Module/Oscillator.js +2 -2
- package/build/Module/Oscillator.js.map +1 -1
- package/build/Module/Sequencer.d.ts +0 -2
- package/build/Module/Sequencer.js +5 -23
- package/build/Module/Sequencer.js.map +1 -1
- package/build/Module/Volume.d.ts +4 -0
- package/build/Module/Volume.js +15 -1
- package/build/Module/Volume.js.map +1 -1
- package/build/Module/index.d.ts +2 -0
- package/build/Module/index.js +4 -0
- package/build/Module/index.js.map +1 -1
- package/build/Note/index.d.ts +5 -2
- package/build/Note/index.js +12 -2
- package/build/Note/index.js.map +1 -1
- package/build/index.d.ts +1 -1
- package/package.json +1 -1
- package/src/MidiEvent.ts +14 -0
- package/src/Module/DataSequencer.ts +92 -0
- package/src/Module/Envelope/Base.ts +1 -1
- package/src/Module/Oscillator.ts +2 -2
- package/src/Module/Sequencer.ts +7 -27
- package/src/Module/Volume.ts +19 -1
- package/src/Module/index.ts +5 -0
- package/src/Note/index.ts +17 -5
- package/src/index.ts +6 -1
package/build/MidiEvent.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ISequence } from "./Module/Sequencer";
|
|
2
|
+
import { IDataSequence } from "./Module/DataSequencer";
|
|
2
3
|
import Note, { INote } from "./Note";
|
|
3
4
|
export declare type EType = "noteOn" | "noteOff";
|
|
4
5
|
export default class MidiEvent {
|
|
@@ -7,6 +8,7 @@ export default class MidiEvent {
|
|
|
7
8
|
_type: EType;
|
|
8
9
|
private data;
|
|
9
10
|
private event;
|
|
11
|
+
static fromDataSequence(sequence: IDataSequence, triggeredAt: number): MidiEvent;
|
|
10
12
|
static fromSequence(sequence: ISequence, triggeredAt: number): MidiEvent;
|
|
11
13
|
static fromNote(noteName: string | Note | INote, type: EType, triggeredAt?: number): MidiEvent;
|
|
12
14
|
constructor(event: MIDIMessageEvent, triggeredAt?: number);
|
package/build/MidiEvent.js
CHANGED
|
@@ -10,6 +10,14 @@ export default class MidiEvent {
|
|
|
10
10
|
_type;
|
|
11
11
|
data;
|
|
12
12
|
event;
|
|
13
|
+
static fromDataSequence(sequence, triggeredAt) {
|
|
14
|
+
const event = new MidiEvent(new MIDIMessageEvent("", { data: new Uint8Array([0, 0, 0]) }), triggeredAt);
|
|
15
|
+
event._type = "noteOn";
|
|
16
|
+
const note = new Note(sequence.frequency);
|
|
17
|
+
note.velocity = sequence.amplitude;
|
|
18
|
+
event.notes = [note];
|
|
19
|
+
return event;
|
|
20
|
+
}
|
|
13
21
|
static fromSequence(sequence, triggeredAt) {
|
|
14
22
|
const event = new MidiEvent(new MIDIMessageEvent("", { data: new Uint8Array([0, 0, 0]) }), triggeredAt);
|
|
15
23
|
event._type = "noteOn";
|
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;
|
|
1
|
+
{"version":3,"file":"MidiEvent.js","sourceRoot":"","sources":["../src/MidiEvent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import Module, { DummnyInternalModule } from "./Base";
|
|
2
|
+
interface IDataSequencer {
|
|
3
|
+
sequences: IDataSequence[];
|
|
4
|
+
}
|
|
5
|
+
export interface IDataSequence {
|
|
6
|
+
voiceNo: number;
|
|
7
|
+
time: number;
|
|
8
|
+
frequency: number;
|
|
9
|
+
amplitude: number;
|
|
10
|
+
}
|
|
11
|
+
export default class DataSequencer extends Module<DummnyInternalModule, IDataSequencer> {
|
|
12
|
+
static moduleName: string;
|
|
13
|
+
private midiOutput;
|
|
14
|
+
constructor(name: string, props: Partial<IDataSequence>);
|
|
15
|
+
get sequences(): IDataSequence[];
|
|
16
|
+
set sequences(value: IDataSequence[]);
|
|
17
|
+
start(time: number): void;
|
|
18
|
+
stop(): void;
|
|
19
|
+
private onPartEvent;
|
|
20
|
+
private get numberOfVoices();
|
|
21
|
+
private updateNumberOfVoices;
|
|
22
|
+
private registerOutputs;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { now } from "tone";
|
|
2
|
+
import Module, { DummnyInternalModule } from "./Base";
|
|
3
|
+
import MidiEvent from "../MidiEvent";
|
|
4
|
+
import { uniq } from "lodash";
|
|
5
|
+
const InitialProps = () => ({
|
|
6
|
+
sequences: [],
|
|
7
|
+
});
|
|
8
|
+
export default class DataSequencer extends Module {
|
|
9
|
+
static moduleName = "DataSequencer";
|
|
10
|
+
midiOutput;
|
|
11
|
+
constructor(name, props) {
|
|
12
|
+
super(new DummnyInternalModule(), {
|
|
13
|
+
name,
|
|
14
|
+
props: { ...InitialProps(), ...props },
|
|
15
|
+
});
|
|
16
|
+
this.start(now());
|
|
17
|
+
this.registerOutputs();
|
|
18
|
+
}
|
|
19
|
+
get sequences() {
|
|
20
|
+
return this._props["sequences"];
|
|
21
|
+
}
|
|
22
|
+
set sequences(value) {
|
|
23
|
+
const sequences = value;
|
|
24
|
+
this._props = { ...this.props, sequences };
|
|
25
|
+
this.updateNumberOfVoices();
|
|
26
|
+
this.start(now());
|
|
27
|
+
}
|
|
28
|
+
start(time) {
|
|
29
|
+
this.sequences.forEach((sequence) => {
|
|
30
|
+
this.onPartEvent(time + sequence.time, sequence);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
stop() { }
|
|
34
|
+
onPartEvent = (time, sequence) => {
|
|
35
|
+
const { voiceNo } = sequence;
|
|
36
|
+
const event = MidiEvent.fromDataSequence(sequence, time);
|
|
37
|
+
this.midiOutput.connections.forEach((input) => {
|
|
38
|
+
input.pluggable(event, voiceNo);
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
get numberOfVoices() {
|
|
42
|
+
return uniq(this.sequences.map((sequence) => sequence.voiceNo)).length;
|
|
43
|
+
}
|
|
44
|
+
updateNumberOfVoices() {
|
|
45
|
+
if (!this.midiOutput)
|
|
46
|
+
return;
|
|
47
|
+
this.midiOutput.connections.forEach((input) => {
|
|
48
|
+
if (input.audioModule instanceof Module)
|
|
49
|
+
return;
|
|
50
|
+
input.audioModule.numberOfVoices = this.numberOfVoices;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
registerOutputs() {
|
|
54
|
+
this.midiOutput = this.registerOutput({
|
|
55
|
+
name: "midi out",
|
|
56
|
+
onPlug: (input) => {
|
|
57
|
+
if (input.audioModule instanceof Module)
|
|
58
|
+
return;
|
|
59
|
+
input.audioModule.numberOfVoices = this.numberOfVoices;
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=DataSequencer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataSequencer.js","sourceRoot":"","sources":["../../src/Module/DataSequencer.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,7 +59,7 @@ export default class EnvelopeModule extends Module {
|
|
|
59
59
|
triggerAttack = (note, triggeredAt) => {
|
|
60
60
|
this.activeNote = note.fullName;
|
|
61
61
|
this.triggeredAt = triggeredAt;
|
|
62
|
-
this.internalModule.triggerAttack(triggeredAt);
|
|
62
|
+
this.internalModule.triggerAttack(triggeredAt, note.velocity);
|
|
63
63
|
};
|
|
64
64
|
triggerRelease = (note, triggeredAt) => {
|
|
65
65
|
this.internalModule.triggerRelease(triggeredAt);
|
|
@@ -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,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAE/B,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"Base.js","sourceRoot":"","sources":["../../../src/Module/Envelope/Base.ts"],"names":[],"mappings":"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"}
|
|
@@ -97,9 +97,9 @@ class MonoOscillator extends Module {
|
|
|
97
97
|
updateFrequency(time) {
|
|
98
98
|
if (!this.note)
|
|
99
99
|
return;
|
|
100
|
-
const freq = this.note.
|
|
100
|
+
const freq = this.note.adjustFrequency(this.range, this.coarse);
|
|
101
101
|
if (time) {
|
|
102
|
-
this.internalModule.frequency.
|
|
102
|
+
this.internalModule.frequency.linearRampToValueAtTime(freq, time);
|
|
103
103
|
}
|
|
104
104
|
else {
|
|
105
105
|
this.internalModule.frequency.value = freq;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Oscillator.js","sourceRoot":"","sources":["../../src/Module/Oscillator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Oscillator.js","sourceRoot":"","sources":["../../src/Module/Oscillator.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,6 @@ export default class Sequencer extends Module<DummnyInternalModule, ISequencer>
|
|
|
15
15
|
static moduleName: string;
|
|
16
16
|
midiOutput: Output;
|
|
17
17
|
private part;
|
|
18
|
-
private barParts;
|
|
19
18
|
constructor(name: string, props: Partial<ISequencer>);
|
|
20
19
|
get props(): ISequencer;
|
|
21
20
|
set props(value: ISequencer);
|
|
@@ -35,6 +34,5 @@ export default class Sequencer extends Module<DummnyInternalModule, ISequencer>
|
|
|
35
34
|
private updateBarParts;
|
|
36
35
|
private get loopEnd();
|
|
37
36
|
private onPartEvent;
|
|
38
|
-
private onSequenceEvent;
|
|
39
37
|
}
|
|
40
38
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { now, Part
|
|
1
|
+
import { now, Part } from "tone";
|
|
2
2
|
import Module, { DummnyInternalModule } from "./Base";
|
|
3
3
|
import MidiEvent from "../MidiEvent";
|
|
4
4
|
const InitialProps = () => ({
|
|
@@ -10,7 +10,6 @@ export default class Sequencer extends Module {
|
|
|
10
10
|
static moduleName = "Sequencer";
|
|
11
11
|
midiOutput;
|
|
12
12
|
part;
|
|
13
|
-
barParts = [];
|
|
14
13
|
constructor(name, props) {
|
|
15
14
|
super(new DummnyInternalModule(), {
|
|
16
15
|
name,
|
|
@@ -64,9 +63,6 @@ export default class Sequencer extends Module {
|
|
|
64
63
|
this.part = new Part(this.onPartEvent, []);
|
|
65
64
|
this.part.loop = true;
|
|
66
65
|
this.part.loopEnd = this.loopEnd;
|
|
67
|
-
this.sequences.forEach((_, i) => {
|
|
68
|
-
this.part.add(`${i}:0:0`, i);
|
|
69
|
-
});
|
|
70
66
|
}
|
|
71
67
|
adjust() {
|
|
72
68
|
if (!this.part)
|
|
@@ -107,37 +103,23 @@ export default class Sequencer extends Module {
|
|
|
107
103
|
}
|
|
108
104
|
else {
|
|
109
105
|
const index = sequences.length;
|
|
110
|
-
sequences.push({ active: false, time:
|
|
106
|
+
sequences.push({ active: false, time: `${bar}:0:${index}`, notes: [] });
|
|
111
107
|
}
|
|
112
108
|
allSequences[bar] = sequences;
|
|
113
109
|
this.sequences = allSequences;
|
|
114
110
|
this.adjustNumberOfSteps(bar);
|
|
115
111
|
}
|
|
116
112
|
updateBarParts() {
|
|
117
|
-
this.barParts = this.sequences.map((barSeqs, _) => {
|
|
118
|
-
const part = new Part(this.onSequenceEvent, []);
|
|
119
|
-
barSeqs.forEach((seq) => part.add(seq.time, seq));
|
|
120
|
-
return part;
|
|
121
|
-
});
|
|
122
113
|
this.part.clear();
|
|
123
|
-
this.
|
|
124
|
-
this.part.add(
|
|
114
|
+
this.sequences.forEach((barSeqs, i) => {
|
|
115
|
+
barSeqs.forEach((seq) => this.part.add(seq.time, seq));
|
|
125
116
|
});
|
|
126
117
|
this.part.loopEnd = this.loopEnd;
|
|
127
118
|
}
|
|
128
119
|
get loopEnd() {
|
|
129
120
|
return `${this.bars}:0:0`;
|
|
130
121
|
}
|
|
131
|
-
onPartEvent = (time,
|
|
132
|
-
if (bar === null)
|
|
133
|
-
return;
|
|
134
|
-
const part = this.barParts[bar];
|
|
135
|
-
if (!part)
|
|
136
|
-
return;
|
|
137
|
-
part.start(time);
|
|
138
|
-
part.stop(time + Time("1m").toSeconds());
|
|
139
|
-
};
|
|
140
|
-
onSequenceEvent = (time, sequence) => {
|
|
122
|
+
onPartEvent = (time, sequence) => {
|
|
141
123
|
if (!sequence.active)
|
|
142
124
|
return;
|
|
143
125
|
const event = MidiEvent.fromSequence(sequence, time);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sequencer.js","sourceRoot":"","sources":["../../src/Module/Sequencer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"Sequencer.js","sourceRoot":"","sources":["../../src/Module/Sequencer.ts"],"names":[],"mappings":"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"}
|
package/build/Module/Volume.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Volume as Vol } from "tone";
|
|
2
2
|
import Module, { Voicable } from "./Base";
|
|
3
3
|
import PolyModule from "./PolyModule";
|
|
4
|
+
import Note from "../Note";
|
|
4
5
|
export interface VolumeInterface extends Voicable {
|
|
5
6
|
volume: number;
|
|
6
7
|
}
|
|
@@ -8,9 +9,12 @@ declare class MonoVolume extends Module<Vol, VolumeInterface> {
|
|
|
8
9
|
constructor(name: string, props: Partial<VolumeInterface>);
|
|
9
10
|
get volume(): number;
|
|
10
11
|
set volume(value: number);
|
|
12
|
+
triggerAttack: (note: Note, triggeredAt: number) => void;
|
|
13
|
+
triggerRelease: (note: Note, triggeredAt: number) => void;
|
|
11
14
|
}
|
|
12
15
|
export default class Volume extends PolyModule<MonoVolume, VolumeInterface> {
|
|
13
16
|
static moduleName: string;
|
|
14
17
|
constructor(name: string, props: Partial<VolumeInterface>);
|
|
18
|
+
private registerInputs;
|
|
15
19
|
}
|
|
16
20
|
export {};
|
package/build/Module/Volume.js
CHANGED
|
@@ -2,7 +2,7 @@ import { Volume as Vol } from "tone";
|
|
|
2
2
|
import Module from "./Base";
|
|
3
3
|
import PolyModule from "./PolyModule";
|
|
4
4
|
const InitialProps = {
|
|
5
|
-
volume: -
|
|
5
|
+
volume: -Infinity,
|
|
6
6
|
};
|
|
7
7
|
class MonoVolume extends Module {
|
|
8
8
|
constructor(name, props) {
|
|
@@ -18,6 +18,13 @@ class MonoVolume extends Module {
|
|
|
18
18
|
this._props = { ...this.props, volume: value };
|
|
19
19
|
this.internalModule.volume.value = this.volume;
|
|
20
20
|
}
|
|
21
|
+
triggerAttack = (note, triggeredAt) => {
|
|
22
|
+
const db = 20 * Math.log10(note.velocity);
|
|
23
|
+
this.internalModule.volume.exponentialRampToValueAtTime(db, triggeredAt);
|
|
24
|
+
};
|
|
25
|
+
triggerRelease = (note, triggeredAt) => {
|
|
26
|
+
// Do nothing
|
|
27
|
+
};
|
|
21
28
|
}
|
|
22
29
|
export default class Volume extends PolyModule {
|
|
23
30
|
static moduleName = "Volume";
|
|
@@ -29,6 +36,13 @@ export default class Volume extends PolyModule {
|
|
|
29
36
|
});
|
|
30
37
|
this.registerBasicInputs();
|
|
31
38
|
this.registerBasicOutputs();
|
|
39
|
+
this.registerInputs();
|
|
40
|
+
}
|
|
41
|
+
registerInputs() {
|
|
42
|
+
this.registerInput({
|
|
43
|
+
name: "midi in",
|
|
44
|
+
pluggable: this.midiTriggered,
|
|
45
|
+
});
|
|
32
46
|
}
|
|
33
47
|
}
|
|
34
48
|
//# sourceMappingURL=Volume.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Volume.js","sourceRoot":"","sources":["../../src/Module/Volume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,GAAG,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,MAAoB,MAAM,QAAQ,CAAC;AAC1C,OAAO,UAAU,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Volume.js","sourceRoot":"","sources":["../../src/Module/Volume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,GAAG,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,MAAoB,MAAM,QAAQ,CAAC;AAC1C,OAAO,UAAU,MAAM,cAAc,CAAC;AAOtC,MAAM,YAAY,GAAoB;IACpC,MAAM,EAAE,CAAC,QAAQ;CAClB,CAAC;AAEF,MAAM,UAAW,SAAQ,MAA4B;IACnD,YAAY,IAAY,EAAE,KAA+B;QACvD,KAAK,CAAC,IAAI,GAAG,EAAE,EAAE;YACf,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,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAE/C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IACjD,CAAC;IAED,aAAa,GAAG,CAAC,IAAU,EAAE,WAAmB,EAAE,EAAE;QAClD,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,4BAA4B,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC3E,CAAC,CAAC;IAEF,cAAc,GAAG,CAAC,IAAU,EAAE,WAAmB,EAAE,EAAE;QACnD,aAAa;IACf,CAAC,CAAC;CACH;AAED,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,UAAuC;IACzE,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC;IAE7B,YAAY,IAAY,EAAE,KAA+B;QACvD,KAAK,CAAC;YACJ,IAAI;YACJ,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,aAAa,CAAC;YACjB,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,IAAI,CAAC,aAAa;SAC9B,CAAC,CAAC;IACL,CAAC"}
|
package/build/Module/index.d.ts
CHANGED
|
@@ -6,7 +6,9 @@ export type { ModuleInterface, Connectable, Triggerable } from "./Base";
|
|
|
6
6
|
export { default as Filter } from "./Filter";
|
|
7
7
|
export { default as Oscillator } from "./Oscillator";
|
|
8
8
|
export { default as Sequencer } from "./Sequencer";
|
|
9
|
+
export { default as DataSequencer } from "./DataSequencer";
|
|
9
10
|
export type { ISequence } from "./Sequencer";
|
|
11
|
+
export type { IDataSequence } from "./DataSequencer";
|
|
10
12
|
export { Envelope, AmpEnvelope, FreqEnvelope, EnvelopeStages, } from "./Envelope";
|
|
11
13
|
export declare type AudioModule = Module<Connectable, any> | PolyModule<Module<Connectable, any>, any>;
|
|
12
14
|
export declare function createModule(name: string, type: string, props: any): AudioModule;
|
package/build/Module/index.js
CHANGED
|
@@ -12,11 +12,13 @@ import Delay from "./Delay";
|
|
|
12
12
|
import Distortion from "./Distortion";
|
|
13
13
|
import BitCrusher from "./BitCrusher";
|
|
14
14
|
import Sequencer from "./Sequencer";
|
|
15
|
+
import DataSequencer from "./DataSequencer";
|
|
15
16
|
export { default } from "./Base";
|
|
16
17
|
export { default as PolyModule } from "./PolyModule";
|
|
17
18
|
export { default as Filter } from "./Filter";
|
|
18
19
|
export { default as Oscillator } from "./Oscillator";
|
|
19
20
|
export { default as Sequencer } from "./Sequencer";
|
|
21
|
+
export { default as DataSequencer } from "./DataSequencer";
|
|
20
22
|
export { Envelope, AmpEnvelope, FreqEnvelope, EnvelopeStages, } from "./Envelope";
|
|
21
23
|
export function createModule(name, type, props) {
|
|
22
24
|
const klass = moduleClassFromType(type);
|
|
@@ -55,6 +57,8 @@ function moduleClassFromType(type) {
|
|
|
55
57
|
return BitCrusher;
|
|
56
58
|
case Sequencer.moduleName:
|
|
57
59
|
return Sequencer;
|
|
60
|
+
case DataSequencer.moduleName:
|
|
61
|
+
return DataSequencer;
|
|
58
62
|
default:
|
|
59
63
|
throw Error(`Unknown module type ${type}`);
|
|
60
64
|
}
|
|
@@ -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;AACtC,OAAO,SAAS,MAAM,aAAa,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;AACpC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,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,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAI3D,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,KAAK,aAAa,CAAC,UAAU;YAC3B,OAAO,aAAa,CAAC;QACvB;YACE,MAAM,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;KAC9C;AACH,CAAC"}
|
package/build/Note/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export interface INote {
|
|
2
2
|
note: string;
|
|
3
|
+
frequency: number;
|
|
3
4
|
duration: string;
|
|
4
5
|
velocity?: number;
|
|
5
6
|
}
|
|
@@ -9,13 +10,15 @@ export default class Note {
|
|
|
9
10
|
octave: number;
|
|
10
11
|
velocity: number;
|
|
11
12
|
duration: string;
|
|
12
|
-
|
|
13
|
+
frequency: number;
|
|
14
|
+
constructor(eventOrString: Partial<INote> | MIDIMessageEvent | string | number);
|
|
13
15
|
static notes(octave?: number): Note[];
|
|
14
16
|
get isSemi(): boolean;
|
|
15
17
|
get fullName(): string;
|
|
16
|
-
|
|
18
|
+
adjustFrequency(range?: number, coarse?: number): number;
|
|
17
19
|
valueOf(): string;
|
|
18
20
|
serialize(): INote;
|
|
21
|
+
private fromFrequency;
|
|
19
22
|
private fromString;
|
|
20
23
|
private fromEvent;
|
|
21
24
|
private fromProps;
|
package/build/Note/index.js
CHANGED
|
@@ -7,8 +7,12 @@ export default class Note {
|
|
|
7
7
|
octave;
|
|
8
8
|
velocity = 1;
|
|
9
9
|
duration;
|
|
10
|
+
frequency;
|
|
10
11
|
constructor(eventOrString) {
|
|
11
|
-
if (typeof eventOrString === "
|
|
12
|
+
if (typeof eventOrString === "number") {
|
|
13
|
+
this.fromFrequency(eventOrString);
|
|
14
|
+
}
|
|
15
|
+
else if (typeof eventOrString === "string") {
|
|
12
16
|
this.fromString(eventOrString);
|
|
13
17
|
}
|
|
14
18
|
else if (eventOrString instanceof MIDIMessageEvent) {
|
|
@@ -27,7 +31,9 @@ export default class Note {
|
|
|
27
31
|
get fullName() {
|
|
28
32
|
return `${this.name}${this.octave}`;
|
|
29
33
|
}
|
|
30
|
-
|
|
34
|
+
adjustFrequency(range = 0, coarse = 0) {
|
|
35
|
+
if (this.frequency)
|
|
36
|
+
return this.frequency;
|
|
31
37
|
let newOctave = this.octave + range;
|
|
32
38
|
let coarseIndex = Notes.indexOf(this.name) + coarse;
|
|
33
39
|
let nameIndex = coarseIndex;
|
|
@@ -48,10 +54,14 @@ export default class Note {
|
|
|
48
54
|
serialize() {
|
|
49
55
|
return {
|
|
50
56
|
note: this.fullName,
|
|
57
|
+
frequency: this.frequency,
|
|
51
58
|
velocity: this.velocity,
|
|
52
59
|
duration: this.duration,
|
|
53
60
|
};
|
|
54
61
|
}
|
|
62
|
+
fromFrequency(frequency) {
|
|
63
|
+
this.frequency = frequency;
|
|
64
|
+
}
|
|
55
65
|
fromString(string) {
|
|
56
66
|
const matches = string.match(/(\w#?)(\d)?/) || [];
|
|
57
67
|
this.name = matches[1];
|
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":"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"}
|
package/build/index.d.ts
CHANGED
|
@@ -4,5 +4,5 @@ export { default as MidiDeviceManager } from "./MidiDeviceManager";
|
|
|
4
4
|
export { default as Note } from "./Note";
|
|
5
5
|
export type { INote } from "./Note";
|
|
6
6
|
export type { MidiDeviceInterface } from "./MidiDevice";
|
|
7
|
-
export type { ModuleInterface, AudioModule, ISequence } from "./Module";
|
|
7
|
+
export type { ModuleInterface, AudioModule, ISequence, IDataSequence, } from "./Module";
|
|
8
8
|
export type { SerializeInterface as IOProps } from "./Module/IO";
|
package/package.json
CHANGED
package/src/MidiEvent.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { now } from "tone";
|
|
2
2
|
import { ISequence } from "./Module/Sequencer";
|
|
3
|
+
import { IDataSequence } from "./Module/DataSequencer";
|
|
3
4
|
import Note, { INote } from "./Note";
|
|
4
5
|
|
|
5
6
|
const EventType: { [key: number]: EType } = {
|
|
@@ -16,6 +17,19 @@ export default class MidiEvent {
|
|
|
16
17
|
private data: Uint8Array;
|
|
17
18
|
private event: MIDIMessageEvent;
|
|
18
19
|
|
|
20
|
+
static fromDataSequence(sequence: IDataSequence, triggeredAt: number) {
|
|
21
|
+
const event = new MidiEvent(
|
|
22
|
+
new MIDIMessageEvent("", { data: new Uint8Array([0, 0, 0]) }),
|
|
23
|
+
triggeredAt
|
|
24
|
+
);
|
|
25
|
+
event._type = "noteOn";
|
|
26
|
+
const note = new Note(sequence.frequency);
|
|
27
|
+
note.velocity = sequence.amplitude;
|
|
28
|
+
event.notes = [note];
|
|
29
|
+
|
|
30
|
+
return event;
|
|
31
|
+
}
|
|
32
|
+
|
|
19
33
|
static fromSequence(sequence: ISequence, triggeredAt: number) {
|
|
20
34
|
const event = new MidiEvent(
|
|
21
35
|
new MIDIMessageEvent("", { data: new Uint8Array([0, 0, 0]) }),
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { now } from "tone";
|
|
2
|
+
|
|
3
|
+
import Module, { DummnyInternalModule } from "./Base";
|
|
4
|
+
import { Output } from "./IO";
|
|
5
|
+
import MidiEvent from "../MidiEvent";
|
|
6
|
+
import { uniq } from "lodash";
|
|
7
|
+
|
|
8
|
+
interface IDataSequencer {
|
|
9
|
+
sequences: IDataSequence[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface IDataSequence {
|
|
13
|
+
voiceNo: number;
|
|
14
|
+
time: number;
|
|
15
|
+
frequency: number;
|
|
16
|
+
amplitude: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const InitialProps = () => ({
|
|
20
|
+
sequences: [],
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
export default class DataSequencer extends Module<
|
|
24
|
+
DummnyInternalModule,
|
|
25
|
+
IDataSequencer
|
|
26
|
+
> {
|
|
27
|
+
static moduleName = "DataSequencer";
|
|
28
|
+
private midiOutput: Output;
|
|
29
|
+
|
|
30
|
+
constructor(name: string, props: Partial<IDataSequence>) {
|
|
31
|
+
super(new DummnyInternalModule(), {
|
|
32
|
+
name,
|
|
33
|
+
props: { ...InitialProps(), ...props },
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
this.start(now());
|
|
37
|
+
this.registerOutputs();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
get sequences() {
|
|
41
|
+
return this._props["sequences"];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
set sequences(value: IDataSequence[]) {
|
|
45
|
+
const sequences = value;
|
|
46
|
+
this._props = { ...this.props, sequences };
|
|
47
|
+
this.updateNumberOfVoices();
|
|
48
|
+
this.start(now());
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
start(time: number) {
|
|
52
|
+
this.sequences.forEach((sequence) => {
|
|
53
|
+
this.onPartEvent(time + sequence.time, sequence);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
stop() {}
|
|
58
|
+
|
|
59
|
+
private onPartEvent = (time: number, sequence: IDataSequence) => {
|
|
60
|
+
const { voiceNo } = sequence;
|
|
61
|
+
const event = MidiEvent.fromDataSequence(sequence, time);
|
|
62
|
+
|
|
63
|
+
this.midiOutput.connections.forEach((input) => {
|
|
64
|
+
input.pluggable(event, voiceNo);
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
private get numberOfVoices() {
|
|
69
|
+
return uniq(this.sequences.map((sequence) => sequence.voiceNo)).length;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private updateNumberOfVoices() {
|
|
73
|
+
if (!this.midiOutput) return;
|
|
74
|
+
|
|
75
|
+
this.midiOutput.connections.forEach((input) => {
|
|
76
|
+
if (input.audioModule instanceof Module) return;
|
|
77
|
+
|
|
78
|
+
input.audioModule.numberOfVoices = this.numberOfVoices;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private registerOutputs() {
|
|
83
|
+
this.midiOutput = this.registerOutput({
|
|
84
|
+
name: "midi out",
|
|
85
|
+
onPlug: (input) => {
|
|
86
|
+
if (input.audioModule instanceof Module) return;
|
|
87
|
+
|
|
88
|
+
input.audioModule.numberOfVoices = this.numberOfVoices;
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -93,7 +93,7 @@ export default abstract class EnvelopeModule<EnvelopeLike extends Env>
|
|
|
93
93
|
this.activeNote = note.fullName;
|
|
94
94
|
this.triggeredAt = triggeredAt;
|
|
95
95
|
|
|
96
|
-
this.internalModule.triggerAttack(triggeredAt);
|
|
96
|
+
this.internalModule.triggerAttack(triggeredAt, note.velocity);
|
|
97
97
|
};
|
|
98
98
|
|
|
99
99
|
triggerRelease = (note: Note, triggeredAt: number) => {
|
package/src/Module/Oscillator.ts
CHANGED
|
@@ -133,10 +133,10 @@ class MonoOscillator extends Module<Osc, OscillatorInterface> {
|
|
|
133
133
|
private updateFrequency(time?: number) {
|
|
134
134
|
if (!this.note) return;
|
|
135
135
|
|
|
136
|
-
const freq = this.note.
|
|
136
|
+
const freq = this.note.adjustFrequency(this.range, this.coarse);
|
|
137
137
|
|
|
138
138
|
if (time) {
|
|
139
|
-
this.internalModule.frequency.
|
|
139
|
+
this.internalModule.frequency.linearRampToValueAtTime(freq, time);
|
|
140
140
|
} else {
|
|
141
141
|
this.internalModule.frequency.value = freq;
|
|
142
142
|
}
|
package/src/Module/Sequencer.ts
CHANGED
|
@@ -27,8 +27,7 @@ export default class Sequencer extends Module<
|
|
|
27
27
|
> {
|
|
28
28
|
static moduleName = "Sequencer";
|
|
29
29
|
midiOutput: Output;
|
|
30
|
-
private part: Part<
|
|
31
|
-
private barParts: Part<ISequence>[] = [];
|
|
30
|
+
private part: Part<ISequence>;
|
|
32
31
|
|
|
33
32
|
constructor(name: string, props: Partial<ISequencer>) {
|
|
34
33
|
super(new DummnyInternalModule(), {
|
|
@@ -93,13 +92,9 @@ export default class Sequencer extends Module<
|
|
|
93
92
|
}
|
|
94
93
|
|
|
95
94
|
private initializePart() {
|
|
96
|
-
this.part = new Part(this.onPartEvent, [] as
|
|
95
|
+
this.part = new Part(this.onPartEvent, [] as ISequence[]);
|
|
97
96
|
this.part.loop = true;
|
|
98
97
|
this.part.loopEnd = this.loopEnd;
|
|
99
|
-
|
|
100
|
-
this.sequences.forEach((_, i) => {
|
|
101
|
-
this.part.add(`${i}:0:0`, i);
|
|
102
|
-
});
|
|
103
98
|
}
|
|
104
99
|
|
|
105
100
|
private adjust() {
|
|
@@ -145,7 +140,7 @@ export default class Sequencer extends Module<
|
|
|
145
140
|
sequences.pop();
|
|
146
141
|
} else {
|
|
147
142
|
const index = sequences.length;
|
|
148
|
-
sequences.push({ active: false, time:
|
|
143
|
+
sequences.push({ active: false, time: `${bar}:0:${index}`, notes: [] });
|
|
149
144
|
}
|
|
150
145
|
allSequences[bar] = sequences;
|
|
151
146
|
this.sequences = allSequences;
|
|
@@ -154,17 +149,12 @@ export default class Sequencer extends Module<
|
|
|
154
149
|
}
|
|
155
150
|
|
|
156
151
|
private updateBarParts() {
|
|
157
|
-
this.
|
|
158
|
-
const part = new Part(this.onSequenceEvent, [] as Array<ISequence>);
|
|
159
|
-
barSeqs.forEach((seq) => part.add(seq.time, seq));
|
|
152
|
+
this.part.clear();
|
|
160
153
|
|
|
161
|
-
|
|
154
|
+
this.sequences.forEach((barSeqs, i) => {
|
|
155
|
+
barSeqs.forEach((seq) => this.part.add(seq.time, seq));
|
|
162
156
|
});
|
|
163
157
|
|
|
164
|
-
this.part.clear();
|
|
165
|
-
this.barParts.forEach((_, bar) => {
|
|
166
|
-
this.part.add(`${bar}:0:0`, bar);
|
|
167
|
-
});
|
|
168
158
|
this.part.loopEnd = this.loopEnd;
|
|
169
159
|
}
|
|
170
160
|
|
|
@@ -172,17 +162,7 @@ export default class Sequencer extends Module<
|
|
|
172
162
|
return `${this.bars}:0:0`;
|
|
173
163
|
}
|
|
174
164
|
|
|
175
|
-
private onPartEvent = (time: number,
|
|
176
|
-
if (bar === null) return;
|
|
177
|
-
|
|
178
|
-
const part = this.barParts[bar];
|
|
179
|
-
if (!part) return;
|
|
180
|
-
|
|
181
|
-
part.start(time);
|
|
182
|
-
part.stop(time + Time("1m").toSeconds());
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
private onSequenceEvent = (time: number, sequence: ISequence) => {
|
|
165
|
+
private onPartEvent = (time: number, sequence: ISequence) => {
|
|
186
166
|
if (!sequence.active) return;
|
|
187
167
|
|
|
188
168
|
const event = MidiEvent.fromSequence(sequence, time);
|
package/src/Module/Volume.ts
CHANGED
|
@@ -2,13 +2,14 @@ import { Volume as Vol } from "tone";
|
|
|
2
2
|
|
|
3
3
|
import Module, { Voicable } from "./Base";
|
|
4
4
|
import PolyModule from "./PolyModule";
|
|
5
|
+
import Note from "../Note";
|
|
5
6
|
|
|
6
7
|
export interface VolumeInterface extends Voicable {
|
|
7
8
|
volume: number;
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
const InitialProps: VolumeInterface = {
|
|
11
|
-
volume: -
|
|
12
|
+
volume: -Infinity,
|
|
12
13
|
};
|
|
13
14
|
|
|
14
15
|
class MonoVolume extends Module<Vol, VolumeInterface> {
|
|
@@ -28,6 +29,15 @@ class MonoVolume extends Module<Vol, VolumeInterface> {
|
|
|
28
29
|
|
|
29
30
|
this.internalModule.volume.value = this.volume;
|
|
30
31
|
}
|
|
32
|
+
|
|
33
|
+
triggerAttack = (note: Note, triggeredAt: number) => {
|
|
34
|
+
const db = 20 * Math.log10(note.velocity);
|
|
35
|
+
this.internalModule.volume.exponentialRampToValueAtTime(db, triggeredAt);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
triggerRelease = (note: Note, triggeredAt: number) => {
|
|
39
|
+
// Do nothing
|
|
40
|
+
};
|
|
31
41
|
}
|
|
32
42
|
|
|
33
43
|
export default class Volume extends PolyModule<MonoVolume, VolumeInterface> {
|
|
@@ -42,5 +52,13 @@ export default class Volume extends PolyModule<MonoVolume, VolumeInterface> {
|
|
|
42
52
|
|
|
43
53
|
this.registerBasicInputs();
|
|
44
54
|
this.registerBasicOutputs();
|
|
55
|
+
this.registerInputs();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private registerInputs() {
|
|
59
|
+
this.registerInput({
|
|
60
|
+
name: "midi in",
|
|
61
|
+
pluggable: this.midiTriggered,
|
|
62
|
+
});
|
|
45
63
|
}
|
|
46
64
|
}
|
package/src/Module/index.ts
CHANGED
|
@@ -14,6 +14,7 @@ import Delay from "./Delay";
|
|
|
14
14
|
import Distortion from "./Distortion";
|
|
15
15
|
import BitCrusher from "./BitCrusher";
|
|
16
16
|
import Sequencer from "./Sequencer";
|
|
17
|
+
import DataSequencer from "./DataSequencer";
|
|
17
18
|
|
|
18
19
|
export { default } from "./Base";
|
|
19
20
|
export { default as PolyModule } from "./PolyModule";
|
|
@@ -22,7 +23,9 @@ export type { ModuleInterface, Connectable, Triggerable } from "./Base";
|
|
|
22
23
|
export { default as Filter } from "./Filter";
|
|
23
24
|
export { default as Oscillator } from "./Oscillator";
|
|
24
25
|
export { default as Sequencer } from "./Sequencer";
|
|
26
|
+
export { default as DataSequencer } from "./DataSequencer";
|
|
25
27
|
export type { ISequence } from "./Sequencer";
|
|
28
|
+
export type { IDataSequence } from "./DataSequencer";
|
|
26
29
|
|
|
27
30
|
export {
|
|
28
31
|
Envelope,
|
|
@@ -79,6 +82,8 @@ function moduleClassFromType(type: string) {
|
|
|
79
82
|
return BitCrusher;
|
|
80
83
|
case Sequencer.moduleName:
|
|
81
84
|
return Sequencer;
|
|
85
|
+
case DataSequencer.moduleName:
|
|
86
|
+
return DataSequencer;
|
|
82
87
|
default:
|
|
83
88
|
throw Error(`Unknown module type ${type}`);
|
|
84
89
|
}
|
package/src/Note/index.ts
CHANGED
|
@@ -6,6 +6,7 @@ const NotesLength = Notes.length;
|
|
|
6
6
|
|
|
7
7
|
export interface INote {
|
|
8
8
|
note: string;
|
|
9
|
+
frequency: number;
|
|
9
10
|
duration: string;
|
|
10
11
|
velocity?: number;
|
|
11
12
|
}
|
|
@@ -16,9 +17,14 @@ export default class Note {
|
|
|
16
17
|
octave: number;
|
|
17
18
|
velocity: number = 1;
|
|
18
19
|
duration: string;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
frequency: number;
|
|
21
|
+
|
|
22
|
+
constructor(
|
|
23
|
+
eventOrString: Partial<INote> | MIDIMessageEvent | string | number
|
|
24
|
+
) {
|
|
25
|
+
if (typeof eventOrString === "number") {
|
|
26
|
+
this.fromFrequency(eventOrString);
|
|
27
|
+
} else if (typeof eventOrString === "string") {
|
|
22
28
|
this.fromString(eventOrString);
|
|
23
29
|
} else if (eventOrString instanceof MIDIMessageEvent) {
|
|
24
30
|
this.fromEvent(eventOrString);
|
|
@@ -39,7 +45,9 @@ export default class Note {
|
|
|
39
45
|
return `${this.name}${this.octave}`;
|
|
40
46
|
}
|
|
41
47
|
|
|
42
|
-
|
|
48
|
+
adjustFrequency(range: number = 0, coarse: number = 0) {
|
|
49
|
+
if (this.frequency) return this.frequency;
|
|
50
|
+
|
|
43
51
|
let newOctave = this.octave + range;
|
|
44
52
|
let coarseIndex = Notes.indexOf(this.name) + coarse;
|
|
45
53
|
let nameIndex = coarseIndex;
|
|
@@ -51,7 +59,6 @@ export default class Note {
|
|
|
51
59
|
newOctave--;
|
|
52
60
|
nameIndex = NotesLength + nameIndex;
|
|
53
61
|
}
|
|
54
|
-
|
|
55
62
|
const newName = Notes[nameIndex];
|
|
56
63
|
|
|
57
64
|
return frequencyTable[`${newName}${newOctave}`];
|
|
@@ -64,11 +71,16 @@ export default class Note {
|
|
|
64
71
|
serialize(): INote {
|
|
65
72
|
return {
|
|
66
73
|
note: this.fullName,
|
|
74
|
+
frequency: this.frequency,
|
|
67
75
|
velocity: this.velocity,
|
|
68
76
|
duration: this.duration,
|
|
69
77
|
};
|
|
70
78
|
}
|
|
71
79
|
|
|
80
|
+
private fromFrequency(frequency: number) {
|
|
81
|
+
this.frequency = frequency;
|
|
82
|
+
}
|
|
83
|
+
|
|
72
84
|
private fromString(string: string) {
|
|
73
85
|
const matches = string.match(/(\w#?)(\d)?/) || [];
|
|
74
86
|
|
package/src/index.ts
CHANGED
|
@@ -5,6 +5,11 @@ export { default as Note } from "./Note";
|
|
|
5
5
|
|
|
6
6
|
export type { INote } from "./Note";
|
|
7
7
|
export type { MidiDeviceInterface } from "./MidiDevice";
|
|
8
|
-
export type {
|
|
8
|
+
export type {
|
|
9
|
+
ModuleInterface,
|
|
10
|
+
AudioModule,
|
|
11
|
+
ISequence,
|
|
12
|
+
IDataSequence,
|
|
13
|
+
} from "./Module";
|
|
9
14
|
|
|
10
15
|
export type { SerializeInterface as IOProps } from "./Module/IO";
|