@blibliki/engine 0.1.5 → 0.1.6

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.
Files changed (82) hide show
  1. package/build/Engine.d.ts +5 -41
  2. package/build/Engine.js +2 -3
  3. package/build/Engine.js.map +1 -1
  4. package/build/Module/Base.d.ts +4 -19
  5. package/build/Module/Base.js +1 -19
  6. package/build/Module/Base.js.map +1 -1
  7. package/build/Module/BitCrusher.d.ts +1 -1
  8. package/build/Module/BitCrusher.js +2 -3
  9. package/build/Module/BitCrusher.js.map +1 -1
  10. package/build/Module/Delay.js +1 -2
  11. package/build/Module/Delay.js.map +1 -1
  12. package/build/Module/Distortion.js +1 -2
  13. package/build/Module/Distortion.js.map +1 -1
  14. package/build/Module/Effect.d.ts +2 -2
  15. package/build/Module/Effect.js +1 -2
  16. package/build/Module/Effect.js.map +1 -1
  17. package/build/Module/Envelope/AmpEnvelope.d.ts +3 -2
  18. package/build/Module/Envelope/AmpEnvelope.js +4 -6
  19. package/build/Module/Envelope/AmpEnvelope.js.map +1 -1
  20. package/build/Module/Envelope/Base.d.ts +8 -7
  21. package/build/Module/Envelope/Base.js +10 -11
  22. package/build/Module/Envelope/Base.js.map +1 -1
  23. package/build/Module/Envelope/FreqEnvelope.d.ts +2 -2
  24. package/build/Module/Envelope/FreqEnvelope.js +4 -6
  25. package/build/Module/Envelope/FreqEnvelope.js.map +1 -1
  26. package/build/Module/Envelope/index.d.ts +1 -1
  27. package/build/Module/Envelope/index.js +1 -1
  28. package/build/Module/Envelope/index.js.map +1 -1
  29. package/build/Module/Filter.d.ts +8 -8
  30. package/build/Module/Filter.js +9 -9
  31. package/build/Module/Filter.js.map +1 -1
  32. package/build/Module/Master.d.ts +1 -1
  33. package/build/Module/Master.js +1 -2
  34. package/build/Module/Master.js.map +1 -1
  35. package/build/Module/MidiSelector.d.ts +2 -0
  36. package/build/Module/MidiSelector.js +12 -6
  37. package/build/Module/MidiSelector.js.map +1 -1
  38. package/build/Module/Oscillator.d.ts +5 -5
  39. package/build/Module/Oscillator.js +6 -7
  40. package/build/Module/Oscillator.js.map +1 -1
  41. package/build/Module/PolyModule.d.ts +9 -18
  42. package/build/Module/PolyModule.js +9 -26
  43. package/build/Module/PolyModule.js.map +1 -1
  44. package/build/Module/Reverb.js +1 -2
  45. package/build/Module/Reverb.js.map +1 -1
  46. package/build/Module/VirtualMidi.d.ts +2 -2
  47. package/build/Module/VirtualMidi.js +1 -2
  48. package/build/Module/VirtualMidi.js.map +1 -1
  49. package/build/Module/VoiceScheduler.d.ts +7 -7
  50. package/build/Module/VoiceScheduler.js +5 -6
  51. package/build/Module/VoiceScheduler.js.map +1 -1
  52. package/build/Module/Volume.d.ts +5 -5
  53. package/build/Module/Volume.js +6 -7
  54. package/build/Module/Volume.js.map +1 -1
  55. package/build/Module/index.d.ts +2 -17
  56. package/build/Module/index.js +24 -41
  57. package/build/Module/index.js.map +1 -1
  58. package/build/index.d.ts +0 -1
  59. package/build/index.js +0 -1
  60. package/build/index.js.map +1 -1
  61. package/package.json +3 -1
  62. package/src/Engine.ts +2 -7
  63. package/src/Module/Base.ts +5 -20
  64. package/src/Module/BitCrusher.ts +2 -3
  65. package/src/Module/Delay.ts +1 -2
  66. package/src/Module/Distortion.ts +1 -2
  67. package/src/Module/Effect.ts +1 -3
  68. package/src/Module/Envelope/AmpEnvelope.ts +4 -6
  69. package/src/Module/Envelope/Base.ts +10 -13
  70. package/src/Module/Envelope/FreqEnvelope.ts +4 -6
  71. package/src/Module/Envelope/index.ts +1 -1
  72. package/src/Module/Filter.ts +15 -15
  73. package/src/Module/Master.ts +1 -2
  74. package/src/Module/MidiSelector.ts +14 -6
  75. package/src/Module/Oscillator.ts +8 -10
  76. package/src/Module/PolyModule.ts +15 -30
  77. package/src/Module/Reverb.ts +1 -2
  78. package/src/Module/VirtualMidi.ts +1 -2
  79. package/src/Module/VoiceScheduler.ts +7 -10
  80. package/src/Module/Volume.ts +7 -9
  81. package/src/Module/index.ts +27 -41
  82. package/src/index.ts +0 -1
@@ -1,6 +1,6 @@
1
1
  import Engine from "../Engine";
2
2
  import MidiEvent from "../MidiEvent";
3
- import Module, { ModuleType, DummnyInternalModule } from "./Base";
3
+ import Module, { DummnyInternalModule } from "./Base";
4
4
  import { Output } from "./IO";
5
5
 
6
6
  export interface MidiSelectorInterface {
@@ -21,7 +21,6 @@ export default class MidiSelector extends Module<
21
21
  super(new DummnyInternalModule(), {
22
22
  name,
23
23
  props: { ...InitialProps, ...props },
24
- type: ModuleType.MidiSelector,
25
24
  });
26
25
 
27
26
  this.registerOutputs();
@@ -33,16 +32,18 @@ export default class MidiSelector extends Module<
33
32
  }
34
33
 
35
34
  set selectedId(value: string | null) {
36
- if (this.selectedId) {
37
- const prevMidiDevice = Engine.midiDeviceManager.find(this.selectedId);
38
- prevMidiDevice?.removeEventListener(this.onMidiEvent);
39
- }
35
+ this.removeEventListener();
40
36
 
41
37
  this._props = { ...this.props, selectedId: value };
42
38
 
43
39
  this.addEventListener(value);
44
40
  }
45
41
 
42
+ dispose() {
43
+ this.removeEventListener();
44
+ super.dispose();
45
+ }
46
+
46
47
  private registerOutputs() {
47
48
  this.midiOutput = this.registerOutput({ name: "midi out" });
48
49
  }
@@ -59,4 +60,11 @@ export default class MidiSelector extends Module<
59
60
  const midiDevice = Engine.midiDeviceManager.find(midiId);
60
61
  midiDevice?.addEventListener(this.onMidiEvent);
61
62
  }
63
+
64
+ private removeEventListener() {
65
+ if (!this.selectedId) return;
66
+
67
+ const midiDevice = Engine.midiDeviceManager.find(this.selectedId);
68
+ midiDevice?.removeEventListener(this.onMidiEvent);
69
+ }
62
70
  }
@@ -1,18 +1,17 @@
1
1
  import MidiEvent from "../MidiEvent";
2
2
  import { Oscillator as Osc, ToneOscillatorType } from "tone";
3
3
 
4
- import Module, { ModuleType } from "../Module";
5
4
  import Note from "../Note";
6
- import PolyModule, { PolyModuleType } from "./PolyModule";
5
+ import Module, { Voicable } from "./Base";
6
+ import PolyModule from "./PolyModule";
7
7
 
8
- export interface OscillatorInterface {
8
+ export interface OscillatorInterface extends Voicable {
9
9
  noteName: string;
10
10
  fine: number;
11
11
  coarse: number;
12
12
  wave: string;
13
13
  volume: number;
14
14
  range: number;
15
- voiceNo?: number;
16
15
  }
17
16
 
18
17
  const InitialProps: OscillatorInterface = {
@@ -24,14 +23,13 @@ const InitialProps: OscillatorInterface = {
24
23
  volume: 0,
25
24
  };
26
25
 
27
- export default class Oscillator extends Module<Osc, OscillatorInterface> {
26
+ class MonoOscillator extends Module<Osc, OscillatorInterface> {
28
27
  private _note: Note;
29
28
 
30
29
  constructor(name: string, props: Partial<OscillatorInterface>) {
31
30
  super(new Osc(), {
32
31
  name,
33
32
  props: { ...InitialProps, ...props },
34
- type: ModuleType.Oscillator,
35
33
  });
36
34
 
37
35
  this.note = new Note("C3");
@@ -142,15 +140,15 @@ export default class Oscillator extends Module<Osc, OscillatorInterface> {
142
140
  }
143
141
  }
144
142
 
145
- export class PolyOscillator extends PolyModule<
146
- Oscillator,
143
+ export default class Oscillator extends PolyModule<
144
+ MonoOscillator,
147
145
  OscillatorInterface
148
146
  > {
149
147
  constructor(name: string, props: Partial<OscillatorInterface>) {
150
- super(PolyModuleType.Oscillator, {
148
+ super({
151
149
  name,
150
+ child: MonoOscillator,
152
151
  props: { ...InitialProps, ...props },
153
- type: ModuleType.Oscillator,
154
152
  });
155
153
 
156
154
  this.registerBasicOutputs();
@@ -1,42 +1,33 @@
1
1
  import MidiEvent from "../MidiEvent";
2
2
  import { v4 as uuidv4 } from "uuid";
3
- import { createModule } from ".";
4
- import Module, { ModuleInterface, ModuleType, Connectable } from "./Base";
3
+ import Module, { Connectable, Voicable } from "./Base";
5
4
  import { Input, Output, IOInterface } from "./IO";
6
5
  import { AudioModule } from "../Module";
7
6
 
8
- export enum PolyModuleType {
9
- Oscillator = "oscillator",
10
- Envelope = "envelope",
11
- AmpEnvelope = "ampEnvelope",
12
- FreqEnvelope = "freqEnvelope",
13
- VoiceScheduler = "voiceScheduler",
14
- Filter = "filter",
15
- Volume = "volume",
7
+ interface PolyModuleInterface<MonoAudioModule, PropsInterface> {
8
+ name: string;
9
+ child: new (name: string, props: PropsInterface) => MonoAudioModule;
10
+ props: PropsInterface;
16
11
  }
17
12
 
18
- interface PolyModuleInterface extends ModuleInterface {}
19
-
20
13
  export default abstract class PolyModule<
21
14
  MonoAudioModule extends Module<Connectable, any>,
22
- PropsInterface
15
+ PropsInterface extends Voicable
23
16
  > {
24
17
  readonly id: string;
18
+ readonly child: new (name: string, props: PropsInterface) => MonoAudioModule;
25
19
  _name: string;
26
20
  audioModules: MonoAudioModule[];
27
21
  inputs: Input[] = [];
28
22
  outputs: Output[] = [];
29
- readonly _type: PolyModuleType;
30
- readonly childrenType: ModuleType;
31
23
  private _numberOfVoices: number;
32
24
 
33
- constructor(type: PolyModuleType, props: PolyModuleInterface) {
25
+ constructor(params: PolyModuleInterface<MonoAudioModule, PropsInterface>) {
34
26
  this.id = uuidv4();
35
- this._type = type;
36
- this.childrenType = props.type;
37
27
  this.audioModules = [];
38
28
 
39
- const { props: extraProps, ...basicProps } = props;
29
+ const { child, props: extraProps, ...basicProps } = params;
30
+ this.child = child;
40
31
  Object.assign(this, basicProps);
41
32
 
42
33
  this.numberOfVoices = 1;
@@ -45,10 +36,6 @@ export default abstract class PolyModule<
45
36
  this.registerNumberOfVoicesInput();
46
37
  }
47
38
 
48
- get type() {
49
- return this._type;
50
- }
51
-
52
39
  get name() {
53
40
  return this._name;
54
41
  }
@@ -58,10 +45,6 @@ export default abstract class PolyModule<
58
45
  this.audioModules.forEach((m) => (m.name = value));
59
46
  }
60
47
 
61
- // Do nothing
62
- // This is a little hack to avoid override type by children module
63
- set type(value: PolyModuleType) {}
64
-
65
48
  get props() {
66
49
  if (this.audioModules.length === 0) {
67
50
  throw Error("There isn't any initialized module");
@@ -117,7 +100,7 @@ export default abstract class PolyModule<
117
100
  return {
118
101
  ...this.audioModules[0].serialize(),
119
102
  id: this.id,
120
- type: this.type,
103
+ type: this.constructor.name,
121
104
  inputs: this.inputs.map((i) => i.serialize()),
122
105
  outputs: this.outputs.map((i) => i.serialize()),
123
106
  };
@@ -224,8 +207,10 @@ export default abstract class PolyModule<
224
207
  const audioModule = this.audioModules.pop();
225
208
  audioModule?.dispose();
226
209
  } else {
227
- const props = this.audioModules.length ? this.props : {};
228
- const audioModule = createModule(this.name, this.childrenType, {
210
+ const props = this.audioModules.length
211
+ ? this.props
212
+ : ({} as PropsInterface);
213
+ const audioModule = new this.child(this.name, {
229
214
  ...props,
230
215
  voiceNo: this.audioModules.length,
231
216
  });
@@ -1,6 +1,5 @@
1
1
  import { Reverb as InternalReverb } from "tone";
2
2
 
3
- import { ModuleType } from "./Base";
4
3
  import Effect, { EffectInterface } from "./Effect";
5
4
 
6
5
  interface ReverbInterface extends EffectInterface {
@@ -15,7 +14,7 @@ const InitialProps: Partial<ReverbInterface> = {
15
14
 
16
15
  export default class Reverb extends Effect<InternalReverb, ReverbInterface> {
17
16
  constructor(name: string, props: Partial<ReverbInterface>) {
18
- super(name, ModuleType.Reverb, new InternalReverb(), {
17
+ super(name, new InternalReverb(), {
19
18
  ...InitialProps,
20
19
  ...props,
21
20
  });
@@ -1,6 +1,6 @@
1
1
  import Engine from "../Engine";
2
2
  import MidiEvent from "../MidiEvent";
3
- import Module, { ModuleType, DummnyInternalModule } from "./Base";
3
+ import Module, { DummnyInternalModule } from "./Base";
4
4
  import { Output } from "./IO";
5
5
 
6
6
  export interface VirtualMidiInterface {
@@ -21,7 +21,6 @@ export default class VirtualMidi extends Module<
21
21
  super(new DummnyInternalModule(), {
22
22
  name,
23
23
  props: { ...InitialProps, ...props },
24
- type: ModuleType.VirtualMidi,
25
24
  });
26
25
 
27
26
  this.registerInputs();
@@ -1,9 +1,9 @@
1
- import Module, { ModuleType, DummnyInternalModule } from "./Base";
1
+ import Module, { DummnyInternalModule, Voicable } from "./Base";
2
2
  import MidiEvent from "../MidiEvent";
3
3
  import { Input, Output } from "./IO";
4
- import PolyModule, { PolyModuleType } from "./PolyModule";
4
+ import PolyModule from "./PolyModule";
5
5
 
6
- export interface VoiceSchedulerInterface {
6
+ export interface VoiceSchedulerInterface extends Voicable {
7
7
  polyNumber: number;
8
8
  }
9
9
 
@@ -15,10 +15,10 @@ export default class VoiceScheduler extends PolyModule<
15
15
  numberOfVoicesOut: Output;
16
16
 
17
17
  constructor(name: string, props: VoiceSchedulerInterface) {
18
- super(PolyModuleType.VoiceScheduler, {
18
+ super({
19
19
  name,
20
+ child: Voice,
20
21
  props,
21
- type: ModuleType.Voice,
22
22
  });
23
23
 
24
24
  this.registerInputs();
@@ -111,11 +111,9 @@ export default class VoiceScheduler extends PolyModule<
111
111
  }
112
112
  }
113
113
 
114
- export interface VoiceInterface {
115
- voiceNo?: number;
116
- }
114
+ export interface VoiceInterface extends Voicable {}
117
115
 
118
- export class Voice extends Module<DummnyInternalModule, VoiceInterface> {
116
+ class Voice extends Module<DummnyInternalModule, VoiceInterface> {
119
117
  midiEvent: MidiEvent | null;
120
118
  activeNote: string | null;
121
119
  triggeredAt: number;
@@ -124,7 +122,6 @@ export class Voice extends Module<DummnyInternalModule, VoiceInterface> {
124
122
  constructor(name: string, props: VoiceInterface) {
125
123
  super(new DummnyInternalModule(), {
126
124
  name,
127
- type: ModuleType.Voice,
128
125
  props,
129
126
  });
130
127
  }
@@ -1,23 +1,21 @@
1
1
  import { Volume as Vol } from "tone";
2
2
 
3
- import Module, { ModuleType } from "../Module";
4
- import PolyModule, { PolyModuleType } from "./PolyModule";
3
+ import Module, { Voicable } from "./Base";
4
+ import PolyModule from "./PolyModule";
5
5
 
6
- export interface VolumeInterface {
6
+ export interface VolumeInterface extends Voicable {
7
7
  volume: number;
8
- voiceNo?: number;
9
8
  }
10
9
 
11
10
  const InitialProps: VolumeInterface = {
12
11
  volume: -100,
13
12
  };
14
13
 
15
- export default class Volume extends Module<Vol, VolumeInterface> {
14
+ class MonoVolume extends Module<Vol, VolumeInterface> {
16
15
  constructor(name: string, props: Partial<VolumeInterface>) {
17
16
  super(new Vol(), {
18
17
  name,
19
18
  props: { ...InitialProps, ...props },
20
- type: ModuleType.Volume,
21
19
  });
22
20
  }
23
21
 
@@ -32,12 +30,12 @@ export default class Volume extends Module<Vol, VolumeInterface> {
32
30
  }
33
31
  }
34
32
 
35
- export class PolyVolume extends PolyModule<Volume, VolumeInterface> {
33
+ export default class Volume extends PolyModule<MonoVolume, VolumeInterface> {
36
34
  constructor(name: string, props: Partial<VolumeInterface>) {
37
- super(PolyModuleType.Volume, {
35
+ super({
38
36
  name,
37
+ child: MonoVolume,
39
38
  props: { ...InitialProps, ...props },
40
- type: ModuleType.Volume,
41
39
  });
42
40
 
43
41
  this.registerBasicInputs();
@@ -1,23 +1,21 @@
1
- import Module, { Connectable, ModuleType } from "./Base";
2
- import PolyModule, { PolyModuleType } from "./PolyModule";
3
- import Oscillator, { PolyOscillator } from "./Oscillator";
1
+ import { camelCase, upperFirst } from "lodash";
2
+ import Module, { Connectable } from "./Base";
3
+ import PolyModule from "./PolyModule";
4
+ import Oscillator from "./Oscillator";
4
5
  import { Envelope, AmpEnvelope, FreqEnvelope } from "./Envelope";
5
- import Filter, { PolyFilter } from "./Filter";
6
+ import Filter from "./Filter";
6
7
  import Master from "./Master";
7
- import VoiceScheduler, { Voice } from "./VoiceScheduler";
8
+ import VoiceScheduler from "./VoiceScheduler";
8
9
  import MidiSelector from "./MidiSelector";
9
- import { PolyAmpEnvelope } from "./Envelope/AmpEnvelope";
10
- import { PolyFreqEnvelope } from "./Envelope/FreqEnvelope";
11
- import { PolyEnvelope } from "./Envelope/Base";
12
- import Volume, { PolyVolume } from "./Volume";
10
+ import Volume from "./Volume";
13
11
  import VirtualMidi from "./VirtualMidi";
14
12
  import Reverb from "./Reverb";
15
13
  import Delay from "./Delay";
16
14
  import Distortion from "./Distortion";
17
15
  import BitCrusher from "./BitCrusher";
18
16
 
19
- export { default, ModuleType } from "./Base";
20
- export { default as PolyModule, PolyModuleType } from "./PolyModule";
17
+ export { default } from "./Base";
18
+ export { default as PolyModule } from "./PolyModule";
21
19
  export type { ModuleInterface, Connectable, Triggerable } from "./Base";
22
20
 
23
21
  export { default as Filter } from "./Filter";
@@ -43,51 +41,39 @@ export function createModule(
43
41
  return new klass(name, props);
44
42
  }
45
43
 
46
- export function moduleClassFromType(type: string) {
44
+ function moduleClassFromType(type: string) {
45
+ type = upperFirst(camelCase(type));
46
+
47
47
  switch (type) {
48
- case ModuleType.Oscillator:
48
+ case Oscillator.name:
49
49
  return Oscillator;
50
- case ModuleType.Envelope:
50
+ case Envelope.name:
51
51
  return Envelope;
52
- case ModuleType.AmpEnvelope:
52
+ case AmpEnvelope.name:
53
53
  return AmpEnvelope;
54
- case ModuleType.FreqEnvelope:
54
+ case FreqEnvelope.name:
55
55
  return FreqEnvelope;
56
- case ModuleType.Filter:
56
+ case Filter.name:
57
57
  return Filter;
58
- case ModuleType.Volume:
58
+ case Volume.name:
59
59
  return Volume;
60
- case PolyModuleType.Oscillator:
61
- return PolyOscillator;
62
- case PolyModuleType.Envelope:
63
- return PolyEnvelope;
64
- case PolyModuleType.AmpEnvelope:
65
- return PolyAmpEnvelope;
66
- case PolyModuleType.FreqEnvelope:
67
- return PolyFreqEnvelope;
68
- case PolyModuleType.Filter:
69
- return PolyFilter;
70
- case PolyModuleType.Volume:
71
- return PolyVolume;
72
- case ModuleType.Master:
60
+ case Master.name:
73
61
  return Master;
74
- case ModuleType.Voice:
75
- return Voice;
76
- case PolyModuleType.VoiceScheduler:
62
+ case VoiceScheduler.name:
77
63
  return VoiceScheduler;
78
- case ModuleType.MidiSelector:
64
+ case MidiSelector.name:
79
65
  return MidiSelector;
80
- case ModuleType.VirtualMidi:
66
+ case VirtualMidi.name:
81
67
  return VirtualMidi;
82
- case ModuleType.Reverb:
68
+ case Reverb.name:
83
69
  return Reverb;
84
- case ModuleType.Delay:
70
+ case Delay.name:
85
71
  return Delay;
86
- case ModuleType.Distortion:
72
+ case Distortion.name:
87
73
  return Distortion;
88
- case ModuleType.BitCrusher:
74
+ case BitCrusher.name:
89
75
  return BitCrusher;
90
76
  default:
91
- throw Error("Unknown module type");
77
+ throw Error(`Unknown module type ${type}`);
92
78
  }
93
79
  }
package/src/index.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  export { default } from "./Engine";
2
- export { ModuleType, PolyModuleType } from "./Module";
3
2
  export { default as MidiDevice } from "./MidiDevice";
4
3
  export { default as MidiDeviceManager } from "./MidiDeviceManager";
5
4
  export { default as Note } from "./Note";