@blibliki/engine 0.1.0

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 (91) hide show
  1. package/README.md +4 -0
  2. package/build/Engine.d.ts +114 -0
  3. package/build/Engine.js +81 -0
  4. package/build/Engine.js.map +1 -0
  5. package/build/MidiDevice.d.ts +25 -0
  6. package/build/MidiDevice.js +45 -0
  7. package/build/MidiDevice.js.map +1 -0
  8. package/build/MidiDeviceManager.d.ts +12 -0
  9. package/build/MidiDeviceManager.js +45 -0
  10. package/build/MidiDeviceManager.js.map +1 -0
  11. package/build/MidiEvent.d.ts +12 -0
  12. package/build/MidiEvent.js +37 -0
  13. package/build/MidiEvent.js.map +1 -0
  14. package/build/Module/Base.d.ts +72 -0
  15. package/build/Module/Base.js +139 -0
  16. package/build/Module/Base.js.map +1 -0
  17. package/build/Module/Envelope/AmpEnvelope.d.ts +8 -0
  18. package/build/Module/Envelope/AmpEnvelope.js +15 -0
  19. package/build/Module/Envelope/AmpEnvelope.js.map +1 -0
  20. package/build/Module/Envelope/Base.d.ts +45 -0
  21. package/build/Module/Envelope/Base.js +110 -0
  22. package/build/Module/Envelope/Base.js.map +1 -0
  23. package/build/Module/Envelope/FreqEnvelope.d.ts +17 -0
  24. package/build/Module/Envelope/FreqEnvelope.js +51 -0
  25. package/build/Module/Envelope/FreqEnvelope.js.map +1 -0
  26. package/build/Module/Envelope/index.d.ts +3 -0
  27. package/build/Module/Envelope/index.js +4 -0
  28. package/build/Module/Envelope/index.js.map +1 -0
  29. package/build/Module/Filter.d.ts +31 -0
  30. package/build/Module/Filter.js +83 -0
  31. package/build/Module/Filter.js.map +1 -0
  32. package/build/Module/IO.d.ts +39 -0
  33. package/build/Module/IO.js +59 -0
  34. package/build/Module/IO.js.map +1 -0
  35. package/build/Module/Master.d.ts +7 -0
  36. package/build/Module/Master.js +12 -0
  37. package/build/Module/Master.js.map +1 -0
  38. package/build/Module/MidiSelector.d.ts +16 -0
  39. package/build/Module/MidiSelector.js +44 -0
  40. package/build/Module/MidiSelector.js.map +1 -0
  41. package/build/Module/Oscillator.d.ts +42 -0
  42. package/build/Module/Oscillator.js +123 -0
  43. package/build/Module/Oscillator.js.map +1 -0
  44. package/build/Module/PolyModule.d.ts +57 -0
  45. package/build/Module/PolyModule.js +191 -0
  46. package/build/Module/PolyModule.js.map +1 -0
  47. package/build/Module/VoiceScheduler.d.ts +37 -0
  48. package/build/Module/VoiceScheduler.js +117 -0
  49. package/build/Module/VoiceScheduler.js.map +1 -0
  50. package/build/Module/Volume.d.ts +15 -0
  51. package/build/Module/Volume.js +34 -0
  52. package/build/Module/Volume.js.map +1 -0
  53. package/build/Module/index.d.ts +20 -0
  54. package/build/Module/index.js +60 -0
  55. package/build/Module/index.js.map +1 -0
  56. package/build/Note/frequencyTable.d.ts +4 -0
  57. package/build/Note/frequencyTable.js +146 -0
  58. package/build/Note/frequencyTable.js.map +1 -0
  59. package/build/Note/index.d.ts +13 -0
  60. package/build/Note/index.js +53 -0
  61. package/build/Note/index.js.map +1 -0
  62. package/build/index.d.ts +8 -0
  63. package/build/index.js +6 -0
  64. package/build/index.js.map +1 -0
  65. package/build/routes.d.ts +17 -0
  66. package/build/routes.js +23 -0
  67. package/build/routes.js.map +1 -0
  68. package/package.json +37 -0
  69. package/src/Engine.ts +129 -0
  70. package/src/MidiDevice.ts +67 -0
  71. package/src/MidiDeviceManager.ts +61 -0
  72. package/src/MidiEvent.ts +44 -0
  73. package/src/Module/Base.ts +200 -0
  74. package/src/Module/Envelope/AmpEnvelope.ts +17 -0
  75. package/src/Module/Envelope/Base.ts +159 -0
  76. package/src/Module/Envelope/FreqEnvelope.ts +69 -0
  77. package/src/Module/Envelope/index.ts +3 -0
  78. package/src/Module/Filter.ts +111 -0
  79. package/src/Module/IO.ts +85 -0
  80. package/src/Module/Master.ts +18 -0
  81. package/src/Module/MidiSelector.ts +64 -0
  82. package/src/Module/Oscillator.ts +166 -0
  83. package/src/Module/PolyModule.ts +243 -0
  84. package/src/Module/VoiceScheduler.ts +153 -0
  85. package/src/Module/Volume.ts +46 -0
  86. package/src/Module/index.ts +78 -0
  87. package/src/Note/frequencyTable.ts +146 -0
  88. package/src/Note/index.ts +65 -0
  89. package/src/index.ts +10 -0
  90. package/src/routes.ts +41 -0
  91. package/tsconfig.json +22 -0
@@ -0,0 +1,78 @@
1
+ import Module, { Connectable, ModuleType } from "./Base";
2
+ import PolyModule, { PolyModuleType } from "./PolyModule";
3
+ import Oscillator, { PolyOscillator } from "./Oscillator";
4
+ import { Envelope, AmpEnvelope, FreqEnvelope } from "./Envelope";
5
+ import Filter, { PolyFilter } from "./Filter";
6
+ import Master from "./Master";
7
+ import VoiceScheduler, { Voice } from "./VoiceScheduler";
8
+ 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";
13
+
14
+ export { default, ModuleType } from "./Base";
15
+ export { default as PolyModule, PolyModuleType } from "./PolyModule";
16
+ export type { ModuleInterface, Connectable, Triggerable } from "./Base";
17
+
18
+ export { default as Filter } from "./Filter";
19
+ export { default as Oscillator } from "./Oscillator";
20
+ export {
21
+ Envelope,
22
+ AmpEnvelope,
23
+ FreqEnvelope,
24
+ EnvelopeStages,
25
+ } from "./Envelope";
26
+
27
+ export type AudioModule =
28
+ | Module<Connectable, any>
29
+ | PolyModule<Module<Connectable, any>, any>;
30
+
31
+ export function createModule(
32
+ name: string,
33
+ type: string,
34
+ props: any
35
+ ): AudioModule {
36
+ const klass = moduleClassFromType(type);
37
+
38
+ return new klass(name, props);
39
+ }
40
+
41
+ export function moduleClassFromType(type: string) {
42
+ switch (type) {
43
+ case ModuleType.Oscillator:
44
+ return Oscillator;
45
+ case ModuleType.Envelope:
46
+ return Envelope;
47
+ case ModuleType.AmpEnvelope:
48
+ return AmpEnvelope;
49
+ case ModuleType.FreqEnvelope:
50
+ return FreqEnvelope;
51
+ case ModuleType.Filter:
52
+ return Filter;
53
+ case ModuleType.Volume:
54
+ return Volume;
55
+ case PolyModuleType.Oscillator:
56
+ return PolyOscillator;
57
+ case PolyModuleType.Envelope:
58
+ return PolyEnvelope;
59
+ case PolyModuleType.AmpEnvelope:
60
+ return PolyAmpEnvelope;
61
+ case PolyModuleType.FreqEnvelope:
62
+ return PolyFreqEnvelope;
63
+ case PolyModuleType.Filter:
64
+ return PolyFilter;
65
+ case PolyModuleType.Volume:
66
+ return PolyVolume;
67
+ case ModuleType.Master:
68
+ return Master;
69
+ case ModuleType.Voice:
70
+ return Voice;
71
+ case PolyModuleType.VoiceScheduler:
72
+ return VoiceScheduler;
73
+ case ModuleType.MidiSelector:
74
+ return MidiSelector;
75
+ default:
76
+ throw Error("Unknown module type");
77
+ }
78
+ }
@@ -0,0 +1,146 @@
1
+ const frequencyTable: { [key: string]: number } = {
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
+
146
+ export default frequencyTable;
@@ -0,0 +1,65 @@
1
+ import frequencyTable from "./frequencyTable";
2
+
3
+ const Notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
4
+
5
+ const NotesLength = Notes.length;
6
+
7
+ export default class Note {
8
+ static _notes: Note[];
9
+ name: string;
10
+ octave: number;
11
+
12
+ constructor(eventOrString: MIDIMessageEvent | string) {
13
+ if (typeof eventOrString === "string") {
14
+ this.fromString(eventOrString);
15
+ } else {
16
+ this.fromEvent(eventOrString);
17
+ }
18
+ }
19
+
20
+ static notes(octave: number = 3) {
21
+ return Notes.map((note: string) => new Note(`${note}${octave}`));
22
+ }
23
+
24
+ get isSemi() {
25
+ return this.name.slice(-1) === "#";
26
+ }
27
+
28
+ get fullName() {
29
+ return `${this.name}${this.octave}`;
30
+ }
31
+
32
+ frequency(range: number = 0, coarse: number = 0) {
33
+ let newOctave = this.octave + range;
34
+ let coarseIndex = Notes.indexOf(this.name) + coarse;
35
+ let nameIndex = coarseIndex;
36
+
37
+ if (coarseIndex >= NotesLength) {
38
+ newOctave++;
39
+ nameIndex = coarseIndex % NotesLength;
40
+ } else if (coarseIndex < 0) {
41
+ newOctave--;
42
+ nameIndex = NotesLength + nameIndex;
43
+ }
44
+
45
+ const newName = Notes[nameIndex];
46
+
47
+ return frequencyTable[`${newName}${newOctave}`];
48
+ }
49
+
50
+ valueOf() {
51
+ return this.fullName;
52
+ }
53
+
54
+ private fromString(string: string) {
55
+ const matches = string.match(/(\w#?)(\d)?/) || [];
56
+
57
+ this.name = matches[1];
58
+ this.octave = matches[2] ? parseInt(matches[2]) : 1;
59
+ }
60
+
61
+ private fromEvent(event: MIDIMessageEvent) {
62
+ this.name = Notes[event.data[1] % 12];
63
+ this.octave = Math.floor(event.data[1] / 12) - 2;
64
+ }
65
+ }
package/src/index.ts ADDED
@@ -0,0 +1,10 @@
1
+ export { default } from "./Engine";
2
+ export { ModuleType, PolyModuleType } from "./Module";
3
+ export { default as MidiDevice } from "./MidiDevice";
4
+ export { default as MidiDeviceManager } from "./MidiDeviceManager";
5
+ export { default as Note } from "./Note";
6
+
7
+ export type { MidiDeviceInterface } from "./MidiDevice";
8
+ export type { ModuleInterface, AudioModule } from "./Module";
9
+
10
+ export type { SerializeInterface as IOProps } from "./Module/IO";
package/src/routes.ts ADDED
@@ -0,0 +1,41 @@
1
+ import { v4 as uuidv4 } from "uuid";
2
+
3
+ import Engine from "./";
4
+
5
+ export interface RouteProps {
6
+ sourceId: string;
7
+ outputName: string;
8
+ destinationId: string;
9
+ inputName: string;
10
+ }
11
+
12
+ export interface RouteInterface extends RouteProps {
13
+ id: string;
14
+ }
15
+
16
+ export function createRoute(props: RouteProps) {
17
+ const id = uuidv4();
18
+
19
+ return { ...props, id };
20
+ }
21
+
22
+ export function applyRoutes(routes: RouteInterface[]) {
23
+ Object.values(Engine.modules).forEach((m) => m.unplugAll());
24
+
25
+ const succesedConnections = routes.map((route) => {
26
+ const { sourceId, outputName, destinationId, inputName } = route;
27
+
28
+ const source = Engine.findById(sourceId);
29
+ const destination = Engine.findById(destinationId);
30
+
31
+ source.plug(destination, outputName, inputName);
32
+
33
+ return true;
34
+ });
35
+
36
+ if (succesedConnections.every((v) => v)) {
37
+ console.log("######## Routes succesfully applied");
38
+ } else {
39
+ console.log("######## Routes partialy applied");
40
+ }
41
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "esnext",
4
+ "moduleResolution": "node",
5
+ "target": "esnext",
6
+ "declaration": true,
7
+ "lib": ["dom", "dom.iterable", "esnext"],
8
+ "strict": true,
9
+ "allowJs": true,
10
+ "skipLibCheck": true,
11
+ "esModuleInterop": true,
12
+ "allowSyntheticDefaultImports": true,
13
+ "strictPropertyInitialization": false,
14
+ "forceConsistentCasingInFileNames": true,
15
+ "noFallthroughCasesInSwitch": true,
16
+ "resolveJsonModule": true,
17
+ "isolatedModules": true,
18
+ "sourceMap": true,
19
+ "outDir": "build"
20
+ },
21
+ "include": ["src"]
22
+ }