@blibliki/engine 0.1.17 → 0.1.18
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/.eslintrc.js +14 -0
- package/.parcerc +6 -0
- package/README.md +13 -1
- package/dist/main.cjs.js +33 -0
- package/package.json +21 -22
- package/rollup.config.mjs +21 -0
- package/src/Engine.ts +27 -36
- package/src/core/IO/AudioNode.ts +77 -0
- package/src/core/IO/Collection.ts +76 -0
- package/src/core/IO/ForwardNode.ts +192 -0
- package/src/core/IO/MidiNode.ts +67 -0
- package/src/core/IO/Node.ts +117 -0
- package/src/core/IO/index.ts +47 -0
- package/src/core/Module/MonoModule.ts +219 -0
- package/src/core/Module/PolyModule.ts +206 -0
- package/src/core/Module/index.ts +15 -0
- package/src/{Note → core/Note}/index.ts +19 -4
- package/src/{MidiDeviceManager.ts → core/midi/MidiDeviceManager.ts} +20 -15
- package/src/core/midi/MidiEvent.ts +91 -0
- package/src/core/midi/index.ts +5 -0
- package/src/index.ts +8 -12
- package/src/{Module → modules}/BitCrusher.ts +15 -4
- package/src/{Module → modules}/Delay.ts +15 -4
- package/src/{Module → modules}/Distortion.ts +15 -4
- package/src/{Module → modules}/Effect.ts +10 -6
- package/src/modules/Envelope/AmpEnvelope.ts +23 -0
- package/src/{Module → modules}/Envelope/Base.ts +50 -31
- package/src/{Module → modules}/Envelope/FreqEnvelope.ts +18 -23
- package/src/{Module → modules}/Filter.ts +18 -46
- package/src/{Module → modules}/Master.ts +8 -2
- package/src/{Module → modules}/MidiSelector.ts +18 -14
- package/src/{Module → modules}/Oscillator.ts +27 -16
- package/src/{Module → modules}/Reverb.ts +15 -4
- package/src/{Module → modules}/Sequencer.ts +17 -13
- package/src/{Module → modules}/VirtualMidi.ts +16 -12
- package/src/modules/VoiceScheduler.ts +145 -0
- package/src/{Module → modules}/Volume.ts +23 -15
- package/src/{Module → modules}/index.ts +14 -21
- package/src/routes.ts +19 -18
- package/src/types.ts +3 -0
- package/src/utils.ts +18 -0
- package/test/MockingModules.ts +27 -0
- package/test/Module/Oscillator.test.ts +1 -1
- package/test/core/IO.test.ts +172 -0
- package/build/Engine.d.ts +0 -89
- package/build/Engine.js +0 -165
- package/build/Engine.js.map +0 -1
- package/build/MidiDevice.d.ts +0 -25
- package/build/MidiDevice.js +0 -45
- package/build/MidiDevice.js.map +0 -1
- package/build/MidiDeviceManager.d.ts +0 -13
- package/build/MidiDeviceManager.js +0 -59
- package/build/MidiDeviceManager.js.map +0 -1
- package/build/MidiEvent.d.ts +0 -18
- package/build/MidiEvent.js +0 -64
- package/build/MidiEvent.js.map +0 -1
- package/build/Module/Base.d.ts +0 -63
- package/build/Module/Base.js +0 -138
- package/build/Module/Base.js.map +0 -1
- package/build/Module/BitCrusher.d.ts +0 -12
- package/build/Module/BitCrusher.js +0 -22
- package/build/Module/BitCrusher.js.map +0 -1
- package/build/Module/DataSequencer.d.ts +0 -26
- package/build/Module/DataSequencer.js +0 -91
- package/build/Module/DataSequencer.js.map +0 -1
- package/build/Module/Delay.d.ts +0 -15
- package/build/Module/Delay.js +0 -30
- package/build/Module/Delay.js.map +0 -1
- package/build/Module/Distortion.d.ts +0 -12
- package/build/Module/Distortion.js +0 -22
- package/build/Module/Distortion.js.map +0 -1
- package/build/Module/Effect.d.ts +0 -14
- package/build/Module/Effect.js +0 -22
- package/build/Module/Effect.js.map +0 -1
- package/build/Module/Envelope/AmpEnvelope.d.ts +0 -10
- package/build/Module/Envelope/AmpEnvelope.js +0 -14
- package/build/Module/Envelope/AmpEnvelope.js.map +0 -1
- package/build/Module/Envelope/Base.d.ts +0 -47
- package/build/Module/Envelope/Base.js +0 -106
- package/build/Module/Envelope/Base.js.map +0 -1
- package/build/Module/Envelope/FreqEnvelope.d.ts +0 -18
- package/build/Module/Envelope/FreqEnvelope.js +0 -50
- package/build/Module/Envelope/FreqEnvelope.js.map +0 -1
- package/build/Module/Envelope/index.d.ts +0 -3
- package/build/Module/Envelope/index.js +0 -4
- package/build/Module/Envelope/index.js.map +0 -1
- package/build/Module/Filter.d.ts +0 -37
- package/build/Module/Filter.js +0 -100
- package/build/Module/Filter.js.map +0 -1
- package/build/Module/IO.d.ts +0 -39
- package/build/Module/IO.js +0 -59
- package/build/Module/IO.js.map +0 -1
- package/build/Module/Master.d.ts +0 -8
- package/build/Module/Master.js +0 -12
- package/build/Module/Master.js.map +0 -1
- package/build/Module/MidiSelector.d.ts +0 -17
- package/build/Module/MidiSelector.js +0 -50
- package/build/Module/MidiSelector.js.map +0 -1
- package/build/Module/Oscillator.d.ts +0 -45
- package/build/Module/Oscillator.js +0 -136
- package/build/Module/Oscillator.js.map +0 -1
- package/build/Module/PolyModule.d.ts +0 -49
- package/build/Module/PolyModule.js +0 -175
- package/build/Module/PolyModule.js.map +0 -1
- package/build/Module/Reverb.d.ts +0 -15
- package/build/Module/Reverb.js +0 -30
- package/build/Module/Reverb.js.map +0 -1
- package/build/Module/Sequencer.d.ts +0 -38
- package/build/Module/Sequencer.js +0 -131
- package/build/Module/Sequencer.js.map +0 -1
- package/build/Module/VirtualMidi.d.ts +0 -28
- package/build/Module/VirtualMidi.js +0 -53
- package/build/Module/VirtualMidi.js.map +0 -1
- package/build/Module/VoiceScheduler.d.ts +0 -38
- package/build/Module/VoiceScheduler.js +0 -130
- package/build/Module/VoiceScheduler.js.map +0 -1
- package/build/Module/Volume.d.ts +0 -20
- package/build/Module/Volume.js +0 -48
- package/build/Module/Volume.js.map +0 -1
- package/build/Module/index.d.ts +0 -14
- package/build/Module/index.js +0 -66
- package/build/Module/index.js.map +0 -1
- package/build/Note/frequencyTable.d.ts +0 -4
- package/build/Note/frequencyTable.js +0 -146
- package/build/Note/frequencyTable.js.map +0 -1
- package/build/Note/index.d.ts +0 -25
- package/build/Note/index.js +0 -81
- package/build/Note/index.js.map +0 -1
- package/build/index.d.ts +0 -8
- package/build/index.js +0 -5
- package/build/index.js.map +0 -1
- package/build/routes.d.ts +0 -17
- package/build/routes.js +0 -31
- package/build/routes.js.map +0 -1
- package/src/MidiEvent.ts +0 -93
- package/src/Module/Base.ts +0 -223
- package/src/Module/DataSequencer.ts +0 -121
- package/src/Module/Envelope/AmpEnvelope.ts +0 -17
- package/src/Module/IO.ts +0 -85
- package/src/Module/PolyModule.ts +0 -234
- package/src/Module/VoiceScheduler.ts +0 -161
- /package/src/{Note → core/Note}/frequencyTable.ts +0 -0
- /package/src/{MidiDevice.ts → core/midi/MidiDevice.ts} +0 -0
- /package/src/{Module → modules}/Envelope/index.ts +0 -0
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import Engine from "../Engine";
|
|
2
|
-
import Module, { DummnyInternalModule } from "./Base";
|
|
3
|
-
const InitialProps = {
|
|
4
|
-
activeNotes: [],
|
|
5
|
-
};
|
|
6
|
-
export default class VirtualMidi extends Module {
|
|
7
|
-
static moduleName = "VirtualMidi";
|
|
8
|
-
midiOutput;
|
|
9
|
-
constructor(name, props) {
|
|
10
|
-
super(new DummnyInternalModule(), {
|
|
11
|
-
name,
|
|
12
|
-
props: { ...InitialProps, ...props },
|
|
13
|
-
});
|
|
14
|
-
this.registerInputs();
|
|
15
|
-
this.registerOutputs();
|
|
16
|
-
}
|
|
17
|
-
get activeNotes() {
|
|
18
|
-
return this._props["activeNotes"];
|
|
19
|
-
}
|
|
20
|
-
// can't set externaly
|
|
21
|
-
set activeNotes(value) {
|
|
22
|
-
this._props = { ...this.props, activeNotes: value };
|
|
23
|
-
}
|
|
24
|
-
sendMidi(midiEvent) {
|
|
25
|
-
this.midiOutput.connections.forEach((input) => {
|
|
26
|
-
input.pluggable(midiEvent);
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
triggerAttack = (note) => {
|
|
30
|
-
this.activeNotes = [...this.activeNotes, note.fullName];
|
|
31
|
-
Engine._triggerPropsUpdate(this.id, this.props);
|
|
32
|
-
};
|
|
33
|
-
triggerRelease = (note) => {
|
|
34
|
-
this.activeNotes = this.activeNotes.filter((name) => name !== note.fullName);
|
|
35
|
-
Engine._triggerPropsUpdate(this.id, this.props);
|
|
36
|
-
};
|
|
37
|
-
serialize() {
|
|
38
|
-
return {
|
|
39
|
-
...super.serialize(),
|
|
40
|
-
activeNotes: this.activeNotes,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
registerInputs() {
|
|
44
|
-
this.registerInput({
|
|
45
|
-
name: "midi in",
|
|
46
|
-
pluggable: this.midiTriggered,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
registerOutputs() {
|
|
50
|
-
this.midiOutput = this.registerOutput({ name: "midi out" });
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=VirtualMidi.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualMidi.js","sourceRoot":"","sources":["../../src/Module/VirtualMidi.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,WAAW,CAAC;AAG/B,OAAO,MAAM,EAAE,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAOtD,MAAM,YAAY,GAAyB;IACzC,WAAW,EAAE,EAAE;CAChB,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,MAGxC;IACC,MAAM,CAAC,UAAU,GAAG,aAAa,CAAC;IAClC,UAAU,CAAS;IAEnB,YAAY,IAAY,EAAE,KAA2B;QACnD,KAAK,CAAC,IAAI,oBAAoB,EAAE,EAAE;YAChC,IAAI;YACJ,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACpC,CAAC;IAED,sBAAsB;IACtB,IAAI,WAAW,CAAC,KAAe;QAC7B,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACtD,CAAC;IAED,QAAQ,CAAC,SAAoB;QAC3B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5C,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,aAAa,GAAG,CAAC,IAAU,EAAE,EAAE;QAC7B,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC;IAEF,cAAc,GAAG,CAAC,IAAU,EAAE,EAAE;QAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACxC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CACjC,CAAC;QACF,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC;IAEF,SAAS;QACP,OAAO;YACL,GAAG,KAAK,CAAC,SAAS,EAAE;YACpB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,aAAa,CAAC;YACjB,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,IAAI,CAAC,aAAa;SAC9B,CAAC,CAAC;IACL,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import Module, { DummnyInternalModule, Voicable } from "./Base";
|
|
2
|
-
import MidiEvent from "../MidiEvent";
|
|
3
|
-
import { Output } from "./IO";
|
|
4
|
-
import PolyModule from "./PolyModule";
|
|
5
|
-
export interface VoiceSchedulerInterface extends Voicable {
|
|
6
|
-
polyNumber: number;
|
|
7
|
-
}
|
|
8
|
-
export default class VoiceScheduler extends PolyModule<Voice, VoiceSchedulerInterface> {
|
|
9
|
-
static moduleName: string;
|
|
10
|
-
midiOutput: Output;
|
|
11
|
-
numberOfVoicesOut: Output;
|
|
12
|
-
constructor(name: string, props: VoiceSchedulerInterface);
|
|
13
|
-
set polyNumber(value: number);
|
|
14
|
-
get polyNumber(): number;
|
|
15
|
-
midiTriggered: (midiEvent: MidiEvent) => void;
|
|
16
|
-
serialize(): {
|
|
17
|
-
props: any;
|
|
18
|
-
id: string;
|
|
19
|
-
type: string;
|
|
20
|
-
inputs: import("./IO").SerializeInterface[];
|
|
21
|
-
outputs: import("./IO").SerializeInterface[];
|
|
22
|
-
name: string;
|
|
23
|
-
};
|
|
24
|
-
private findFreeVoices;
|
|
25
|
-
private registerInputs;
|
|
26
|
-
private registerOutputs;
|
|
27
|
-
}
|
|
28
|
-
export interface VoiceInterface extends Voicable {
|
|
29
|
-
}
|
|
30
|
-
declare class Voice extends Module<DummnyInternalModule, VoiceInterface> {
|
|
31
|
-
midiEvent: MidiEvent | null;
|
|
32
|
-
activeNote: string | null;
|
|
33
|
-
triggeredAt: number;
|
|
34
|
-
midiOutput: Output;
|
|
35
|
-
constructor(name: string, props: VoiceInterface);
|
|
36
|
-
midiTriggered: (midiEvent: MidiEvent, noteIndex?: number) => void;
|
|
37
|
-
}
|
|
38
|
-
export {};
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import Module, { DummnyInternalModule } from "./Base";
|
|
2
|
-
import PolyModule from "./PolyModule";
|
|
3
|
-
export default class VoiceScheduler extends PolyModule {
|
|
4
|
-
static moduleName = "VoiceScheduler";
|
|
5
|
-
midiOutput;
|
|
6
|
-
numberOfVoicesOut;
|
|
7
|
-
constructor(name, props) {
|
|
8
|
-
super({
|
|
9
|
-
name,
|
|
10
|
-
child: Voice,
|
|
11
|
-
props,
|
|
12
|
-
});
|
|
13
|
-
this.registerInputs();
|
|
14
|
-
this.registerOutputs();
|
|
15
|
-
this.polyNumber = this.numberOfVoices;
|
|
16
|
-
}
|
|
17
|
-
set polyNumber(value) {
|
|
18
|
-
super.numberOfVoices = value;
|
|
19
|
-
if (!this.numberOfVoicesOut)
|
|
20
|
-
return;
|
|
21
|
-
this.numberOfVoicesOut.connections.forEach((input) => {
|
|
22
|
-
if (input.audioModule instanceof Module)
|
|
23
|
-
return;
|
|
24
|
-
input.audioModule.numberOfVoices = value;
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
get polyNumber() {
|
|
28
|
-
return this.numberOfVoices;
|
|
29
|
-
}
|
|
30
|
-
midiTriggered = (midiEvent) => {
|
|
31
|
-
let voices;
|
|
32
|
-
switch (midiEvent.type) {
|
|
33
|
-
case "noteOn":
|
|
34
|
-
voices = this.findFreeVoices(midiEvent.notes.length);
|
|
35
|
-
break;
|
|
36
|
-
case "noteOff":
|
|
37
|
-
voices = midiEvent.notes.map((note) => {
|
|
38
|
-
return this.audioModules.find((v) => v.activeNote === note.fullName);
|
|
39
|
-
});
|
|
40
|
-
break;
|
|
41
|
-
default:
|
|
42
|
-
throw Error("This type is not a note");
|
|
43
|
-
}
|
|
44
|
-
if (voices.length === 0)
|
|
45
|
-
return;
|
|
46
|
-
voices.forEach((voice, i) => {
|
|
47
|
-
if (!voice)
|
|
48
|
-
return;
|
|
49
|
-
voice.midiTriggered(midiEvent, i);
|
|
50
|
-
this.midiOutput.connections.forEach((input) => {
|
|
51
|
-
input.pluggable(midiEvent, voice.voiceNo, i);
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
};
|
|
55
|
-
serialize() {
|
|
56
|
-
const serialize = super.serialize();
|
|
57
|
-
delete serialize.props.voiceNo;
|
|
58
|
-
return {
|
|
59
|
-
...serialize,
|
|
60
|
-
props: { ...serialize.props, polyNumber: this.polyNumber },
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
findFreeVoices(num = 1) {
|
|
64
|
-
let voices = this.audioModules.filter((v) => !v.activeNote).slice(0, num);
|
|
65
|
-
if (voices.length === 0) {
|
|
66
|
-
voices = this.audioModules
|
|
67
|
-
.sort((a, b) => {
|
|
68
|
-
if (!a || !b)
|
|
69
|
-
return 0;
|
|
70
|
-
return a.triggeredAt - b.triggeredAt;
|
|
71
|
-
})
|
|
72
|
-
.slice(0, num);
|
|
73
|
-
}
|
|
74
|
-
return voices;
|
|
75
|
-
}
|
|
76
|
-
registerInputs() {
|
|
77
|
-
this.registerInput({
|
|
78
|
-
name: "midi in",
|
|
79
|
-
pluggable: this.midiTriggered,
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
registerOutputs() {
|
|
83
|
-
this.numberOfVoicesOut = this.registerOutput({
|
|
84
|
-
name: "number of voices",
|
|
85
|
-
onPlug: (input) => {
|
|
86
|
-
if (input.audioModule instanceof Module)
|
|
87
|
-
return;
|
|
88
|
-
input.audioModule.numberOfVoices = this.numberOfVoices;
|
|
89
|
-
},
|
|
90
|
-
});
|
|
91
|
-
this.midiOutput = this.registerOutput({ name: "midi out" });
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
class Voice extends Module {
|
|
95
|
-
midiEvent;
|
|
96
|
-
activeNote;
|
|
97
|
-
triggeredAt;
|
|
98
|
-
midiOutput;
|
|
99
|
-
constructor(name, props) {
|
|
100
|
-
super(new DummnyInternalModule(), {
|
|
101
|
-
name,
|
|
102
|
-
props,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
midiTriggered = (midiEvent, noteIndex) => {
|
|
106
|
-
if (this.voiceNo === undefined)
|
|
107
|
-
throw Error("Voice without voiceNo");
|
|
108
|
-
if (noteIndex === undefined)
|
|
109
|
-
return;
|
|
110
|
-
const { triggeredAt, notes, type } = midiEvent;
|
|
111
|
-
const note = notes[noteIndex];
|
|
112
|
-
if (!note)
|
|
113
|
-
return;
|
|
114
|
-
const noteName = note.fullName;
|
|
115
|
-
switch (type) {
|
|
116
|
-
case "noteOn":
|
|
117
|
-
this.activeNote = noteName;
|
|
118
|
-
this.triggeredAt = triggeredAt;
|
|
119
|
-
this.midiEvent = midiEvent;
|
|
120
|
-
break;
|
|
121
|
-
case "noteOff":
|
|
122
|
-
this.activeNote = null;
|
|
123
|
-
this.midiEvent = null;
|
|
124
|
-
break;
|
|
125
|
-
default:
|
|
126
|
-
throw Error("This type is not a note");
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
//# sourceMappingURL=VoiceScheduler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceScheduler.js","sourceRoot":"","sources":["../../src/Module/VoiceScheduler.ts"],"names":[],"mappings":"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"}
|
package/build/Module/Volume.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Volume as Vol } from "tone";
|
|
2
|
-
import Module, { Voicable } from "./Base";
|
|
3
|
-
import PolyModule from "./PolyModule";
|
|
4
|
-
import Note from "../Note";
|
|
5
|
-
export interface VolumeInterface extends Voicable {
|
|
6
|
-
volume: number;
|
|
7
|
-
}
|
|
8
|
-
declare class MonoVolume extends Module<Vol, VolumeInterface> {
|
|
9
|
-
constructor(name: string, props: Partial<VolumeInterface>);
|
|
10
|
-
get volume(): number;
|
|
11
|
-
set volume(value: number);
|
|
12
|
-
triggerAttack: (note: Note, triggeredAt: number) => void;
|
|
13
|
-
triggerRelease: (note: Note, triggeredAt: number) => void;
|
|
14
|
-
}
|
|
15
|
-
export default class Volume extends PolyModule<MonoVolume, VolumeInterface> {
|
|
16
|
-
static moduleName: string;
|
|
17
|
-
constructor(name: string, props: Partial<VolumeInterface>);
|
|
18
|
-
private registerInputs;
|
|
19
|
-
}
|
|
20
|
-
export {};
|
package/build/Module/Volume.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { Volume as Vol } from "tone";
|
|
2
|
-
import Module from "./Base";
|
|
3
|
-
import PolyModule from "./PolyModule";
|
|
4
|
-
const InitialProps = {
|
|
5
|
-
volume: -Infinity,
|
|
6
|
-
};
|
|
7
|
-
class MonoVolume extends Module {
|
|
8
|
-
constructor(name, props) {
|
|
9
|
-
super(new Vol(), {
|
|
10
|
-
name,
|
|
11
|
-
props: { ...InitialProps, ...props },
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
get volume() {
|
|
15
|
-
return this._props["volume"];
|
|
16
|
-
}
|
|
17
|
-
set volume(value) {
|
|
18
|
-
this._props = { ...this.props, volume: value };
|
|
19
|
-
this.internalModule.volume.value = this.volume;
|
|
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
|
-
};
|
|
28
|
-
}
|
|
29
|
-
export default class Volume extends PolyModule {
|
|
30
|
-
static moduleName = "Volume";
|
|
31
|
-
constructor(name, props) {
|
|
32
|
-
super({
|
|
33
|
-
name,
|
|
34
|
-
child: MonoVolume,
|
|
35
|
-
props: { ...InitialProps, ...props },
|
|
36
|
-
});
|
|
37
|
-
this.registerBasicInputs();
|
|
38
|
-
this.registerBasicOutputs();
|
|
39
|
-
this.registerInputs();
|
|
40
|
-
}
|
|
41
|
-
registerInputs() {
|
|
42
|
-
this.registerInput({
|
|
43
|
-
name: "midi in",
|
|
44
|
-
pluggable: this.midiTriggered,
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=Volume.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import Module, { Connectable } from "./Base";
|
|
2
|
-
import PolyModule from "./PolyModule";
|
|
3
|
-
export { default } from "./Base";
|
|
4
|
-
export { default as PolyModule } from "./PolyModule";
|
|
5
|
-
export type { ModuleInterface, Connectable, Triggerable } from "./Base";
|
|
6
|
-
export { default as Filter } from "./Filter";
|
|
7
|
-
export { default as Oscillator } from "./Oscillator";
|
|
8
|
-
export { default as Sequencer } from "./Sequencer";
|
|
9
|
-
export { default as DataSequencer } from "./DataSequencer";
|
|
10
|
-
export type { ISequence } from "./Sequencer";
|
|
11
|
-
export type { IDataSequence } from "./DataSequencer";
|
|
12
|
-
export { Envelope, AmpEnvelope, FreqEnvelope, EnvelopeStages, } from "./Envelope";
|
|
13
|
-
export declare type AudioModule = Module<Connectable, any> | PolyModule<Module<Connectable, any>, any>;
|
|
14
|
-
export declare function createModule(name: string, type: string, props: any): AudioModule;
|
package/build/Module/index.js
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { camelCase, upperFirst } from "lodash";
|
|
2
|
-
import Oscillator from "./Oscillator";
|
|
3
|
-
import { Envelope, AmpEnvelope, FreqEnvelope } from "./Envelope";
|
|
4
|
-
import Filter from "./Filter";
|
|
5
|
-
import Master from "./Master";
|
|
6
|
-
import VoiceScheduler from "./VoiceScheduler";
|
|
7
|
-
import MidiSelector from "./MidiSelector";
|
|
8
|
-
import Volume from "./Volume";
|
|
9
|
-
import VirtualMidi from "./VirtualMidi";
|
|
10
|
-
import Reverb from "./Reverb";
|
|
11
|
-
import Delay from "./Delay";
|
|
12
|
-
import Distortion from "./Distortion";
|
|
13
|
-
import BitCrusher from "./BitCrusher";
|
|
14
|
-
import Sequencer from "./Sequencer";
|
|
15
|
-
import DataSequencer from "./DataSequencer";
|
|
16
|
-
export { default } from "./Base";
|
|
17
|
-
export { default as PolyModule } from "./PolyModule";
|
|
18
|
-
export { default as Filter } from "./Filter";
|
|
19
|
-
export { default as Oscillator } from "./Oscillator";
|
|
20
|
-
export { default as Sequencer } from "./Sequencer";
|
|
21
|
-
export { default as DataSequencer } from "./DataSequencer";
|
|
22
|
-
export { Envelope, AmpEnvelope, FreqEnvelope, EnvelopeStages, } from "./Envelope";
|
|
23
|
-
export function createModule(name, type, props) {
|
|
24
|
-
const klass = moduleClassFromType(type);
|
|
25
|
-
return new klass(name, props);
|
|
26
|
-
}
|
|
27
|
-
function moduleClassFromType(type) {
|
|
28
|
-
type = upperFirst(camelCase(type));
|
|
29
|
-
switch (type) {
|
|
30
|
-
case Oscillator.moduleName:
|
|
31
|
-
return Oscillator;
|
|
32
|
-
case Envelope.moduleName:
|
|
33
|
-
return Envelope;
|
|
34
|
-
case AmpEnvelope.moduleName:
|
|
35
|
-
return AmpEnvelope;
|
|
36
|
-
case FreqEnvelope.moduleName:
|
|
37
|
-
return FreqEnvelope;
|
|
38
|
-
case Filter.moduleName:
|
|
39
|
-
return Filter;
|
|
40
|
-
case Volume.moduleName:
|
|
41
|
-
return Volume;
|
|
42
|
-
case Master.moduleName:
|
|
43
|
-
return Master;
|
|
44
|
-
case VoiceScheduler.moduleName:
|
|
45
|
-
return VoiceScheduler;
|
|
46
|
-
case MidiSelector.moduleName:
|
|
47
|
-
return MidiSelector;
|
|
48
|
-
case VirtualMidi.moduleName:
|
|
49
|
-
return VirtualMidi;
|
|
50
|
-
case Reverb.moduleName:
|
|
51
|
-
return Reverb;
|
|
52
|
-
case Delay.moduleName:
|
|
53
|
-
return Delay;
|
|
54
|
-
case Distortion.moduleName:
|
|
55
|
-
return Distortion;
|
|
56
|
-
case BitCrusher.moduleName:
|
|
57
|
-
return BitCrusher;
|
|
58
|
-
case Sequencer.moduleName:
|
|
59
|
-
return Sequencer;
|
|
60
|
-
case DataSequencer.moduleName:
|
|
61
|
-
return DataSequencer;
|
|
62
|
-
default:
|
|
63
|
-
throw Error(`Unknown module type ${type}`);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
const frequencyTable = {
|
|
2
|
-
C0: 16.35,
|
|
3
|
-
"C#0": 17.32,
|
|
4
|
-
Db0: 17.32,
|
|
5
|
-
D0: 18.35,
|
|
6
|
-
"D#0": 19.45,
|
|
7
|
-
Eb0: 19.45,
|
|
8
|
-
E0: 20.6,
|
|
9
|
-
F0: 21.83,
|
|
10
|
-
"F#0": 23.12,
|
|
11
|
-
Gb0: 23.12,
|
|
12
|
-
G0: 24.5,
|
|
13
|
-
"G#0": 25.96,
|
|
14
|
-
Ab0: 25.96,
|
|
15
|
-
A0: 27.5,
|
|
16
|
-
"A#0": 29.14,
|
|
17
|
-
Bb0: 29.14,
|
|
18
|
-
B0: 30.87,
|
|
19
|
-
C1: 32.7,
|
|
20
|
-
"C#1": 34.65,
|
|
21
|
-
Db1: 34.65,
|
|
22
|
-
D1: 36.71,
|
|
23
|
-
"D#1": 38.89,
|
|
24
|
-
Eb1: 38.89,
|
|
25
|
-
E1: 41.2,
|
|
26
|
-
F1: 43.65,
|
|
27
|
-
"F#1": 46.25,
|
|
28
|
-
Gb1: 46.25,
|
|
29
|
-
G1: 49.0,
|
|
30
|
-
"G#1": 51.91,
|
|
31
|
-
Ab1: 51.91,
|
|
32
|
-
A1: 55.0,
|
|
33
|
-
"A#1": 58.27,
|
|
34
|
-
Bb1: 58.27,
|
|
35
|
-
B1: 61.74,
|
|
36
|
-
C2: 65.41,
|
|
37
|
-
"C#2": 69.3,
|
|
38
|
-
Db2: 69.3,
|
|
39
|
-
D2: 73.42,
|
|
40
|
-
"D#2": 77.78,
|
|
41
|
-
Eb2: 77.78,
|
|
42
|
-
E2: 82.41,
|
|
43
|
-
F2: 87.31,
|
|
44
|
-
"F#2": 92.5,
|
|
45
|
-
Gb2: 92.5,
|
|
46
|
-
G2: 98.0,
|
|
47
|
-
"G#2": 103.83,
|
|
48
|
-
Ab2: 103.83,
|
|
49
|
-
A2: 110.0,
|
|
50
|
-
"A#2": 116.54,
|
|
51
|
-
Bb2: 116.54,
|
|
52
|
-
B2: 123.47,
|
|
53
|
-
C3: 130.81,
|
|
54
|
-
"C#3": 138.59,
|
|
55
|
-
Db3: 138.59,
|
|
56
|
-
D3: 146.83,
|
|
57
|
-
"D#3": 155.56,
|
|
58
|
-
Eb3: 155.56,
|
|
59
|
-
E3: 164.81,
|
|
60
|
-
F3: 174.61,
|
|
61
|
-
"F#3": 185.0,
|
|
62
|
-
Gb3: 185.0,
|
|
63
|
-
G3: 196.0,
|
|
64
|
-
"G#3": 207.65,
|
|
65
|
-
Ab3: 207.65,
|
|
66
|
-
A3: 220.0,
|
|
67
|
-
"A#3": 233.08,
|
|
68
|
-
Bb3: 233.08,
|
|
69
|
-
B3: 246.94,
|
|
70
|
-
C4: 261.63,
|
|
71
|
-
"C#4": 277.18,
|
|
72
|
-
Db4: 277.18,
|
|
73
|
-
D4: 293.66,
|
|
74
|
-
"D#4": 311.13,
|
|
75
|
-
Eb4: 311.13,
|
|
76
|
-
E4: 329.63,
|
|
77
|
-
F4: 349.23,
|
|
78
|
-
"F#4": 369.99,
|
|
79
|
-
Gb4: 369.99,
|
|
80
|
-
G4: 392.0,
|
|
81
|
-
"G#4": 415.3,
|
|
82
|
-
Ab4: 415.3,
|
|
83
|
-
A4: 440.0,
|
|
84
|
-
"A#4": 466.16,
|
|
85
|
-
Bb4: 466.16,
|
|
86
|
-
B4: 493.88,
|
|
87
|
-
C5: 523.25,
|
|
88
|
-
"C#5": 554.37,
|
|
89
|
-
Db5: 554.37,
|
|
90
|
-
D5: 587.33,
|
|
91
|
-
"D#5": 622.25,
|
|
92
|
-
Eb5: 622.25,
|
|
93
|
-
E5: 659.26,
|
|
94
|
-
F5: 698.46,
|
|
95
|
-
"F#5": 739.99,
|
|
96
|
-
Gb5: 739.99,
|
|
97
|
-
G5: 783.99,
|
|
98
|
-
"G#5": 830.61,
|
|
99
|
-
Ab5: 830.61,
|
|
100
|
-
A5: 880.0,
|
|
101
|
-
"A#5": 932.33,
|
|
102
|
-
Bb5: 932.33,
|
|
103
|
-
B5: 987.77,
|
|
104
|
-
C6: 1046.5,
|
|
105
|
-
"C#6": 1108.73,
|
|
106
|
-
Db6: 1108.73,
|
|
107
|
-
D6: 1174.66,
|
|
108
|
-
"D#6": 1244.51,
|
|
109
|
-
Eb6: 1244.51,
|
|
110
|
-
E6: 1318.51,
|
|
111
|
-
F6: 1396.91,
|
|
112
|
-
"F#6": 1479.98,
|
|
113
|
-
Gb6: 1479.98,
|
|
114
|
-
G6: 1567.98,
|
|
115
|
-
"G#6": 1661.22,
|
|
116
|
-
Ab6: 1661.22,
|
|
117
|
-
A6: 1760.0,
|
|
118
|
-
"A#6": 1864.66,
|
|
119
|
-
Bb6: 1864.66,
|
|
120
|
-
B6: 1975.53,
|
|
121
|
-
C7: 2093.0,
|
|
122
|
-
"C#7": 2217.46,
|
|
123
|
-
Db7: 2217.46,
|
|
124
|
-
D7: 2349.32,
|
|
125
|
-
"D#7": 2489.02,
|
|
126
|
-
Eb7: 2489.02,
|
|
127
|
-
E7: 2637.02,
|
|
128
|
-
F7: 2793.83,
|
|
129
|
-
"F#7": 2959.96,
|
|
130
|
-
Gb7: 2959.96,
|
|
131
|
-
G7: 3135.96,
|
|
132
|
-
"G#7": 3322.44,
|
|
133
|
-
Ab7: 3322.44,
|
|
134
|
-
A7: 3520.0,
|
|
135
|
-
"A#7": 3729.31,
|
|
136
|
-
Bb7: 3729.31,
|
|
137
|
-
B7: 3951.07,
|
|
138
|
-
C8: 4186.01,
|
|
139
|
-
"C#8": 4434.92,
|
|
140
|
-
Db8: 4434.92,
|
|
141
|
-
D8: 4698.64,
|
|
142
|
-
"D#8": 4978.03,
|
|
143
|
-
Eb8: 4978.03,
|
|
144
|
-
};
|
|
145
|
-
export default frequencyTable;
|
|
146
|
-
//# sourceMappingURL=frequencyTable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"frequencyTable.js","sourceRoot":"","sources":["../../src/Note/frequencyTable.ts"],"names":[],"mappings":"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"}
|
package/build/Note/index.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export interface INote {
|
|
2
|
-
note: string;
|
|
3
|
-
frequency: number;
|
|
4
|
-
duration: string;
|
|
5
|
-
velocity?: number;
|
|
6
|
-
}
|
|
7
|
-
export default class Note {
|
|
8
|
-
static _notes: Note[];
|
|
9
|
-
name: string;
|
|
10
|
-
octave: number;
|
|
11
|
-
velocity: number;
|
|
12
|
-
duration: string;
|
|
13
|
-
frequency: number;
|
|
14
|
-
constructor(eventOrString: Partial<INote> | MIDIMessageEvent | string | number);
|
|
15
|
-
static notes(octave?: number): Note[];
|
|
16
|
-
get isSemi(): boolean;
|
|
17
|
-
get fullName(): string;
|
|
18
|
-
adjustFrequency(range?: number, coarse?: number): number;
|
|
19
|
-
valueOf(): string;
|
|
20
|
-
serialize(): INote;
|
|
21
|
-
private fromFrequency;
|
|
22
|
-
private fromString;
|
|
23
|
-
private fromEvent;
|
|
24
|
-
private fromProps;
|
|
25
|
-
}
|
package/build/Note/index.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import frequencyTable from "./frequencyTable";
|
|
2
|
-
const Notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
|
|
3
|
-
const NotesLength = Notes.length;
|
|
4
|
-
export default class Note {
|
|
5
|
-
static _notes;
|
|
6
|
-
name;
|
|
7
|
-
octave;
|
|
8
|
-
velocity = 1;
|
|
9
|
-
duration;
|
|
10
|
-
frequency;
|
|
11
|
-
constructor(eventOrString) {
|
|
12
|
-
if (typeof eventOrString === "number") {
|
|
13
|
-
this.fromFrequency(eventOrString);
|
|
14
|
-
}
|
|
15
|
-
else if (typeof eventOrString === "string") {
|
|
16
|
-
this.fromString(eventOrString);
|
|
17
|
-
}
|
|
18
|
-
else if (eventOrString instanceof MIDIMessageEvent) {
|
|
19
|
-
this.fromEvent(eventOrString);
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
this.fromProps(eventOrString);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
static notes(octave = 3) {
|
|
26
|
-
return Notes.map((note) => new Note(`${note}${octave}`));
|
|
27
|
-
}
|
|
28
|
-
get isSemi() {
|
|
29
|
-
return this.name.slice(-1) === "#";
|
|
30
|
-
}
|
|
31
|
-
get fullName() {
|
|
32
|
-
return `${this.name}${this.octave}`;
|
|
33
|
-
}
|
|
34
|
-
adjustFrequency(range = 0, coarse = 0) {
|
|
35
|
-
if (this.frequency)
|
|
36
|
-
return this.frequency;
|
|
37
|
-
let newOctave = this.octave + range;
|
|
38
|
-
let coarseIndex = Notes.indexOf(this.name) + coarse;
|
|
39
|
-
let nameIndex = coarseIndex;
|
|
40
|
-
if (coarseIndex >= NotesLength) {
|
|
41
|
-
newOctave++;
|
|
42
|
-
nameIndex = coarseIndex % NotesLength;
|
|
43
|
-
}
|
|
44
|
-
else if (coarseIndex < 0) {
|
|
45
|
-
newOctave--;
|
|
46
|
-
nameIndex = NotesLength + nameIndex;
|
|
47
|
-
}
|
|
48
|
-
const newName = Notes[nameIndex];
|
|
49
|
-
return frequencyTable[`${newName}${newOctave}`];
|
|
50
|
-
}
|
|
51
|
-
valueOf() {
|
|
52
|
-
return this.fullName;
|
|
53
|
-
}
|
|
54
|
-
serialize() {
|
|
55
|
-
return {
|
|
56
|
-
note: this.fullName,
|
|
57
|
-
frequency: this.frequency,
|
|
58
|
-
velocity: this.velocity,
|
|
59
|
-
duration: this.duration,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
fromFrequency(frequency) {
|
|
63
|
-
this.frequency = frequency;
|
|
64
|
-
}
|
|
65
|
-
fromString(string) {
|
|
66
|
-
const matches = string.match(/(\w#?)(\d)?/) || [];
|
|
67
|
-
this.name = matches[1];
|
|
68
|
-
this.octave = matches[2] ? parseInt(matches[2]) : 1;
|
|
69
|
-
}
|
|
70
|
-
fromEvent(event) {
|
|
71
|
-
this.name = Notes[event.data[1] % 12];
|
|
72
|
-
this.octave = Math.floor(event.data[1] / 12) - 2;
|
|
73
|
-
}
|
|
74
|
-
fromProps(props) {
|
|
75
|
-
Object.assign(this, props);
|
|
76
|
-
if (!props.note)
|
|
77
|
-
throw Error("note props is mandatory");
|
|
78
|
-
this.fromString(props.note);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=index.js.map
|
package/build/Note/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Note/index.ts"],"names":[],"mappings":"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"}
|