@opendaw/studio-scripting 0.0.2

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 (116) hide show
  1. package/README.md +24 -0
  2. package/dist/Api.d.ts +259 -0
  3. package/dist/Api.d.ts.map +1 -0
  4. package/dist/Api.js +4 -0
  5. package/dist/Asserts.d.ts +4 -0
  6. package/dist/Asserts.d.ts.map +1 -0
  7. package/dist/Asserts.js +53 -0
  8. package/dist/AudioEffectFactory.d.ts +7 -0
  9. package/dist/AudioEffectFactory.d.ts.map +1 -0
  10. package/dist/AudioEffectFactory.js +23 -0
  11. package/dist/AudioFileBoxfactory.d.ts +6 -0
  12. package/dist/AudioFileBoxfactory.d.ts.map +1 -0
  13. package/dist/AudioFileBoxfactory.js +10 -0
  14. package/dist/AudioTrackWriter.d.ts +8 -0
  15. package/dist/AudioTrackWriter.d.ts.map +1 -0
  16. package/dist/AudioTrackWriter.js +39 -0
  17. package/dist/AudioUnitBoxFactory.d.ts +6 -0
  18. package/dist/AudioUnitBoxFactory.d.ts.map +1 -0
  19. package/dist/AudioUnitBoxFactory.js +116 -0
  20. package/dist/IndexRef.d.ts +5 -0
  21. package/dist/IndexRef.d.ts.map +1 -0
  22. package/dist/IndexRef.js +1 -0
  23. package/dist/MIDIEffectFactory.d.ts +7 -0
  24. package/dist/MIDIEffectFactory.d.ts.map +1 -0
  25. package/dist/MIDIEffectFactory.js +20 -0
  26. package/dist/NoteTrackWriter.d.ts +9 -0
  27. package/dist/NoteTrackWriter.d.ts.map +1 -0
  28. package/dist/NoteTrackWriter.js +45 -0
  29. package/dist/ProjectConverter.d.ts +6 -0
  30. package/dist/ProjectConverter.d.ts.map +1 -0
  31. package/dist/ProjectConverter.js +39 -0
  32. package/dist/ProjectUnpacker.d.ts +6 -0
  33. package/dist/ProjectUnpacker.d.ts.map +1 -0
  34. package/dist/ProjectUnpacker.js +14 -0
  35. package/dist/ScriptExecutionProtocol.d.ts +7 -0
  36. package/dist/ScriptExecutionProtocol.d.ts.map +1 -0
  37. package/dist/ScriptExecutionProtocol.js +1 -0
  38. package/dist/ScriptHost.d.ts +8 -0
  39. package/dist/ScriptHost.d.ts.map +1 -0
  40. package/dist/ScriptHost.js +23 -0
  41. package/dist/ScriptHostProtocol.d.ts +10 -0
  42. package/dist/ScriptHostProtocol.d.ts.map +1 -0
  43. package/dist/ScriptHostProtocol.js +1 -0
  44. package/dist/ScriptRunner.d.ts +8 -0
  45. package/dist/ScriptRunner.d.ts.map +1 -0
  46. package/dist/ScriptRunner.js +22 -0
  47. package/dist/ScriptWorker.d.ts +2 -0
  48. package/dist/ScriptWorker.d.ts.map +1 -0
  49. package/dist/ScriptWorker.js +21 -0
  50. package/dist/ValueTrackWriter.d.ts +10 -0
  51. package/dist/ValueTrackWriter.d.ts.map +1 -0
  52. package/dist/ValueTrackWriter.js +78 -0
  53. package/dist/impl/ApiImpl.d.ts +12 -0
  54. package/dist/impl/ApiImpl.d.ts.map +1 -0
  55. package/dist/impl/ApiImpl.js +19 -0
  56. package/dist/impl/AudioRegionImpl.d.ts +19 -0
  57. package/dist/impl/AudioRegionImpl.d.ts.map +1 -0
  58. package/dist/impl/AudioRegionImpl.js +27 -0
  59. package/dist/impl/AudioTrackImpl.d.ts +12 -0
  60. package/dist/impl/AudioTrackImpl.d.ts.map +1 -0
  61. package/dist/impl/AudioTrackImpl.js +17 -0
  62. package/dist/impl/AudioUnitImpl.d.ts +25 -0
  63. package/dist/impl/AudioUnitImpl.d.ts.map +1 -0
  64. package/dist/impl/AudioUnitImpl.js +73 -0
  65. package/dist/impl/AuxAudioUnitImpl.d.ts +13 -0
  66. package/dist/impl/AuxAudioUnitImpl.d.ts.map +1 -0
  67. package/dist/impl/AuxAudioUnitImpl.js +19 -0
  68. package/dist/impl/DelayEffectImpl.d.ts +14 -0
  69. package/dist/impl/DelayEffectImpl.d.ts.map +1 -0
  70. package/dist/impl/DelayEffectImpl.js +21 -0
  71. package/dist/impl/GroupAudioUnitImpl.d.ts +13 -0
  72. package/dist/impl/GroupAudioUnitImpl.d.ts.map +1 -0
  73. package/dist/impl/GroupAudioUnitImpl.js +19 -0
  74. package/dist/impl/InstrumentAudioUnitImpl.d.ts +15 -0
  75. package/dist/impl/InstrumentAudioUnitImpl.d.ts.map +1 -0
  76. package/dist/impl/InstrumentAudioUnitImpl.js +24 -0
  77. package/dist/impl/InstrumentImpl.d.ts +9 -0
  78. package/dist/impl/InstrumentImpl.d.ts.map +1 -0
  79. package/dist/impl/InstrumentImpl.js +10 -0
  80. package/dist/impl/NoteEventImpl.d.ts +11 -0
  81. package/dist/impl/NoteEventImpl.d.ts.map +1 -0
  82. package/dist/impl/NoteEventImpl.js +14 -0
  83. package/dist/impl/NoteRegionImpl.d.ts +21 -0
  84. package/dist/impl/NoteRegionImpl.d.ts.map +1 -0
  85. package/dist/impl/NoteRegionImpl.js +36 -0
  86. package/dist/impl/NoteTrackImpl.d.ts +12 -0
  87. package/dist/impl/NoteTrackImpl.d.ts.map +1 -0
  88. package/dist/impl/NoteTrackImpl.js +17 -0
  89. package/dist/impl/OutputAudioUnitImpl.d.ts +7 -0
  90. package/dist/impl/OutputAudioUnitImpl.d.ts.map +1 -0
  91. package/dist/impl/OutputAudioUnitImpl.js +5 -0
  92. package/dist/impl/PitchEffectImpl.d.ts +12 -0
  93. package/dist/impl/PitchEffectImpl.d.ts.map +1 -0
  94. package/dist/impl/PitchEffectImpl.js +15 -0
  95. package/dist/impl/ProjectImpl.d.ts +25 -0
  96. package/dist/impl/ProjectImpl.d.ts.map +1 -0
  97. package/dist/impl/ProjectImpl.js +42 -0
  98. package/dist/impl/SendImpl.d.ts +10 -0
  99. package/dist/impl/SendImpl.d.ts.map +1 -0
  100. package/dist/impl/SendImpl.js +12 -0
  101. package/dist/impl/ValueEventImpl.d.ts +11 -0
  102. package/dist/impl/ValueEventImpl.d.ts.map +1 -0
  103. package/dist/impl/ValueEventImpl.js +12 -0
  104. package/dist/impl/ValueRegionImpl.d.ts +21 -0
  105. package/dist/impl/ValueRegionImpl.d.ts.map +1 -0
  106. package/dist/impl/ValueRegionImpl.js +37 -0
  107. package/dist/impl/ValueTrackImpl.d.ts +14 -0
  108. package/dist/impl/ValueTrackImpl.d.ts.map +1 -0
  109. package/dist/impl/ValueTrackImpl.js +21 -0
  110. package/dist/impl/index.d.ts +18 -0
  111. package/dist/impl/index.d.ts.map +1 -0
  112. package/dist/impl/index.js +17 -0
  113. package/dist/index.d.ts +7 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +14 -0
  116. package/package.json +44 -0
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # Scripting
2
+
3
+ ### TODO
4
+
5
+ * Dialogs
6
+ * Info
7
+ * Approve
8
+ * Options
9
+ * Listen to a generated sample before importing
10
+ * Console
11
+ * Pass current project to script
12
+ * Pass selection
13
+ * Load file for importing any format
14
+ * Save file for exporting any format
15
+ * Store project in ProjectStorage
16
+ * Add a way to query available projects, samples, soundfonts and presets
17
+ * Add Clip support
18
+
19
+ ### Next
20
+
21
+ * Scripts should drive backups
22
+ * Scripts should drive mixdown and Stems export
23
+ * Run scripts in the background and listen to changes in the project
24
+ * Live plugins (instruments, midi-fx, audio-fx)
package/dist/Api.d.ts ADDED
@@ -0,0 +1,259 @@
1
+ import { Chord, dbToGain, FFT, gainToDb, Interpolation, midiToHz, PPQN, ppqn } from "@opendaw/lib-dsp";
2
+ import { bipolar, float, int, Nullable, unitValue } from "@opendaw/lib-std";
3
+ import type { AudioData } from "@opendaw/studio-adapters";
4
+ import { Sample } from "@opendaw/studio-adapters";
5
+ import { AudioPlayback } from "@opendaw/studio-enums";
6
+ export { AudioPlayback, PPQN, FFT, Chord, Sample, dbToGain, gainToDb, midiToHz };
7
+ export type Send = {
8
+ /** Send amount in decibels */
9
+ amount: number;
10
+ /** Pan position for the Send (-1.0 = left, 0.0 = center, 1.0 = right) */
11
+ pan: bipolar;
12
+ /** Send routing mode (pre-fader or post-fader) */
13
+ mode: "pre" | "post";
14
+ };
15
+ export interface Sendable {
16
+ /**
17
+ * Add a Send to an auxiliary or group unit
18
+ * @param target - The destination unit for the Send
19
+ * @param props - Send configuration ({@link Send})
20
+ */
21
+ addSend(target: AuxAudioUnit | GroupAudioUnit, props?: Partial<Send>): Send;
22
+ /** Remove an existing Send */
23
+ removeSend(send: Send): void;
24
+ }
25
+ export type AnyDevice = MIDIEffects[keyof MIDIEffects] | AudioEffects[keyof AudioEffects] | Instruments[keyof Instruments] | AudioUnit;
26
+ export interface Effect {
27
+ /** Enable or bypass the effect */
28
+ enabled: boolean;
29
+ /** Custom label for the effect */
30
+ label: string;
31
+ }
32
+ export interface AudioEffect extends Effect {
33
+ /** Effect type identifier */
34
+ readonly key: keyof AudioEffects;
35
+ }
36
+ export interface DelayEffect extends AudioEffect {
37
+ /** Delay time index (0-16): 1/1, 1/2, 1/3, 1/4, 3/16, 1/6, 1/8, 3/32, 1/12, 1/16, 3/64, 1/24, 1/32, 1/48, 1/64, 1/96, 1/128 note fractions */
38
+ delay: number;
39
+ /** Feedback amount (0.0 to 1.0) */
40
+ feedback: number;
41
+ /** Cross-feedback amount (0.0 to 1.0) */
42
+ cross: number;
43
+ /** Filter cutoff frequency */
44
+ filter: number;
45
+ /** Wet (processed) signal level (0.0 to 1.0) */
46
+ wet: number;
47
+ /** Dry (original) signal level (0.0 to 1.0) */
48
+ dry: number;
49
+ }
50
+ export interface AudioEffects {
51
+ "delay": DelayEffect;
52
+ }
53
+ export interface MIDIEffect extends Effect {
54
+ /** Effect type identifier */
55
+ readonly key: keyof MIDIEffects;
56
+ }
57
+ export interface PitchEffect extends MIDIEffect {
58
+ /** Pitch shift in octaves */
59
+ octaves: int;
60
+ /** Pitch shift in semitones */
61
+ semiTones: int;
62
+ /** Fine pitch shift in cents (100 cents = 1 semitone) */
63
+ cents: float;
64
+ }
65
+ export interface MIDIEffects {
66
+ "pitch": PitchEffect;
67
+ }
68
+ export interface AudioUnit {
69
+ /** Output routing destination, if unset it goes to primary output, if null, it remains unplugged */
70
+ output?: Nullable<OutputAudioUnit | GroupAudioUnit>;
71
+ /** Volume in decibels (dB) */
72
+ volume: number;
73
+ /** Pan position (-1.0 = full left, 0.0 = center, 1.0 = full right) */
74
+ panning: bipolar;
75
+ /** Mute the audio unit */
76
+ mute: boolean;
77
+ /** Solo the audio unit */
78
+ solo: boolean;
79
+ /** Add an audio effect to the unit */
80
+ addAudioEffect<T extends keyof AudioEffects>(type: T, props?: Partial<AudioEffects[T]>): AudioEffects[T];
81
+ /** Add a MIDI effect to the unit */
82
+ addMIDIEffect<T extends keyof MIDIEffects>(type: T, props?: Partial<MIDIEffects[T]>): MIDIEffects[T];
83
+ /** Add a note track for MIDI events */
84
+ addNoteTrack(props?: Partial<Pick<Track, "enabled">>): NoteTrack;
85
+ /** Add an audio track */
86
+ addAudioTrack(props?: Partial<Pick<Track, "enabled">>): AudioTrack;
87
+ /** Add an automation track for parameter changes */
88
+ addValueTrack<DEVICE extends AnyDevice, PARAMETER extends keyof DEVICE>(device: DEVICE, parameter: PARAMETER, props?: Partial<Pick<Track, "enabled">>): ValueTrack;
89
+ }
90
+ export interface InstrumentAudioUnit extends AudioUnit, Sendable {
91
+ /** Unit type identifier */
92
+ readonly kind: "instrument";
93
+ /** The instrument instance */
94
+ readonly instrument: Instrument;
95
+ /** Change the instrument type */
96
+ setInstrument(name: keyof Instruments): Instrument;
97
+ }
98
+ export interface AuxAudioUnit extends AudioUnit, Sendable {
99
+ /** Unit type identifier */
100
+ readonly kind: "auxiliary";
101
+ /** Custom label for the auxiliary unit */
102
+ label: string;
103
+ }
104
+ export interface GroupAudioUnit extends AudioUnit, Sendable {
105
+ /** Unit type identifier */
106
+ readonly kind: "group";
107
+ /** Custom label for the group unit */
108
+ label: string;
109
+ }
110
+ export interface OutputAudioUnit extends AudioUnit {
111
+ /** Unit type identifier */
112
+ readonly kind: "output";
113
+ }
114
+ export interface Track {
115
+ /** The audio unit this track belongs to */
116
+ readonly audioUnit: AudioUnit;
117
+ /** Enable or disable the track */
118
+ enabled: boolean;
119
+ }
120
+ export interface Region {
121
+ /** Start position in PPQN */
122
+ position: ppqn;
123
+ /** Length in PPQN */
124
+ duration: ppqn;
125
+ /** Mute the region */
126
+ mute: boolean;
127
+ /** Custom label for the region */
128
+ label: string;
129
+ /** Color hue (0-360) */
130
+ hue: int;
131
+ }
132
+ export interface LoopableRegion extends Region {
133
+ /** Loop cycle length in PPQN */
134
+ loopDuration: ppqn;
135
+ /** Loop start offset in PPQN */
136
+ loopOffset: ppqn;
137
+ }
138
+ export interface NoteEvent {
139
+ /** Start position in PPQN */
140
+ position: ppqn;
141
+ /** Note length in PPQN */
142
+ duration: ppqn;
143
+ /** MIDI pitch (0-127, where 60 = middle C) */
144
+ pitch: number;
145
+ /** Fine-tuning in cents (-100 to +100) */
146
+ cents: number;
147
+ /** Note velocity (0.0 to 1.0) */
148
+ velocity: number;
149
+ }
150
+ export interface NoteRegion extends LoopableRegion {
151
+ /** The note track this region belongs to */
152
+ readonly track: NoteTrack;
153
+ /** Add a MIDI note event to the region */
154
+ addEvent(props?: Partial<NoteEvent>): NoteEvent;
155
+ addEvents(events: Array<Partial<NoteEvent>>): void;
156
+ }
157
+ export type NoteRegionProps = Partial<NoteRegion & {
158
+ mirror: NoteRegion;
159
+ }>;
160
+ export interface NoteTrack extends Track {
161
+ /** Add a note region to the track */
162
+ addRegion(props?: NoteRegionProps): NoteRegion;
163
+ }
164
+ export interface AudioRegion extends LoopableRegion {
165
+ /** The audio track this region belongs to */
166
+ readonly track: AudioTrack;
167
+ /** NoSync is not dependent on the tempo. Pass seconds for duration, loopOffset and loopDuration! **/
168
+ playback: AudioPlayback.NoSync | AudioPlayback.Pitch;
169
+ }
170
+ export interface AudioTrack extends Track {
171
+ /** Add an audio region to the track */
172
+ addRegion(sample: Sample, props?: Partial<AudioRegion>): AudioRegion;
173
+ }
174
+ export interface ValueEvent {
175
+ /** Position in PPQN */
176
+ position: ppqn;
177
+ /** Parameter value (0.0 to 1.0) */
178
+ value: unitValue;
179
+ /** Interpolation curve type */
180
+ interpolation: Interpolation;
181
+ }
182
+ export interface ValueRegion extends LoopableRegion {
183
+ /** The automation track this region belongs to */
184
+ readonly track: ValueTrack;
185
+ /** Add an automation point to the region */
186
+ addEvent(props?: Partial<ValueEvent>): ValueEvent;
187
+ addEvents(events: Array<Partial<ValueEvent>>): void;
188
+ }
189
+ export type ValueRegionProps = Partial<ValueRegion & {
190
+ mirror: ValueRegion;
191
+ }>;
192
+ export interface ValueTrack extends Track {
193
+ /** Add an automation region to the track */
194
+ addRegion(props?: ValueRegionProps): ValueRegion;
195
+ }
196
+ export interface Instrument {
197
+ /** The audio unit this instrument belongs to */
198
+ readonly audioUnit: InstrumentAudioUnit;
199
+ }
200
+ export interface MIDIInstrument extends Instrument {
201
+ }
202
+ export interface AudioInstrument extends Instrument {
203
+ }
204
+ /** Wavetable synthesizer instrument */
205
+ export interface Vaporisateur extends MIDIInstrument {
206
+ }
207
+ /** Sample-based playback instrument */
208
+ export interface Playfield extends MIDIInstrument {
209
+ }
210
+ /** Minimal synthesizer instrument */
211
+ export interface Nano extends MIDIInstrument {
212
+ sample: Sample;
213
+ }
214
+ /** SoundFont (.sf2) player instrument */
215
+ export interface Soundfont extends MIDIInstrument {
216
+ }
217
+ /** External MIDI output instrument */
218
+ export interface MIDIOutput extends MIDIInstrument {
219
+ }
220
+ export interface Tape extends AudioInstrument {
221
+ }
222
+ export type Instruments = {
223
+ "Vaporisateur": Vaporisateur;
224
+ "Playfield": Playfield;
225
+ "Nano": Nano;
226
+ "Soundfont": Soundfont;
227
+ "MIDIOutput": MIDIOutput;
228
+ "Tape": Tape;
229
+ };
230
+ export interface Project {
231
+ /** Master output audio unit */
232
+ readonly output: OutputAudioUnit;
233
+ /** Project name */
234
+ name: string;
235
+ /** Tempo in beats per minute */
236
+ bpm: number;
237
+ /** Time signature (e.g., 4/4, 3/4) */
238
+ timeSignature: {
239
+ numerator: int;
240
+ denominator: int;
241
+ };
242
+ /** Add an instrument track to the project */
243
+ addInstrumentUnit<KEY extends keyof Instruments>(name: KEY, props?: Partial<Instruments[KEY]>): InstrumentAudioUnit;
244
+ /** Add an auxiliary effects track */
245
+ addAuxUnit(props?: Partial<Pick<AuxAudioUnit, "label">>): AuxAudioUnit;
246
+ /** Add a group track for mixing multiple units */
247
+ addGroupUnit(props?: Partial<Pick<GroupAudioUnit, "label">>): GroupAudioUnit;
248
+ /** Open the project in the studio and exit */
249
+ openInStudio(): void;
250
+ }
251
+ export interface Api {
252
+ /** Create a new project */
253
+ newProject(name?: string): Project;
254
+ /** Get the current active project */
255
+ getProject(): Promise<Project>;
256
+ /** Creates a sample in the studio **/
257
+ addSample(data: AudioData, name: string): Promise<Sample>;
258
+ }
259
+ //# sourceMappingURL=Api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Api.d.ts","sourceRoot":"","sources":["../src/Api.ts"],"names":[],"mappings":"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"}
package/dist/Api.js ADDED
@@ -0,0 +1,4 @@
1
+ import { Chord, dbToGain, FFT, gainToDb, midiToHz, PPQN } from "@opendaw/lib-dsp";
2
+ import { Sample } from "@opendaw/studio-adapters";
3
+ import { AudioPlayback } from "@opendaw/studio-enums";
4
+ export { AudioPlayback, PPQN, FFT, Chord, Sample, dbToGain, gainToDb, midiToHz };
@@ -0,0 +1,4 @@
1
+ export declare namespace Asserts {
2
+ const assertNoNaN: (obj: any, label?: string) => void;
3
+ }
4
+ //# sourceMappingURL=Asserts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Asserts.d.ts","sourceRoot":"","sources":["../src/Asserts.ts"],"names":[],"mappings":"AAAA,yBAAiB,OAAO,CAAC;IAwCd,MAAM,WAAW,GAAI,KAAK,GAAG,EAAE,QAAO,MAAwB,KAAG,IAOvE,CAAA;CACJ"}
@@ -0,0 +1,53 @@
1
+ export var Asserts;
2
+ (function (Asserts) {
3
+ const validateNoNaN = (obj, path = "root", visited) => {
4
+ if (obj === null || obj === undefined)
5
+ return;
6
+ if (typeof obj === "number" && isNaN(obj)) {
7
+ throw new Error(`NaN found at: ${path}`);
8
+ }
9
+ if (Array.isArray(obj)) {
10
+ obj.forEach((item, index) => validateNoNaN(item, `${path}[${index}]`, visited));
11
+ return;
12
+ }
13
+ if (typeof obj === "object") {
14
+ if (visited.has(obj))
15
+ return;
16
+ visited.add(obj);
17
+ const allKeys = new Set();
18
+ Object.getOwnPropertyNames(obj).forEach(k => allKeys.add(k));
19
+ let proto = Object.getPrototypeOf(obj);
20
+ while (proto && proto !== Object.prototype) {
21
+ Object.getOwnPropertyNames(proto).forEach(k => allKeys.add(k));
22
+ proto = Object.getPrototypeOf(proto);
23
+ }
24
+ for (const key of allKeys) {
25
+ let value;
26
+ let accessible = true;
27
+ try {
28
+ value = obj[key];
29
+ }
30
+ catch {
31
+ accessible = false;
32
+ }
33
+ if (accessible) {
34
+ if (typeof value === "number" && isNaN(value)) {
35
+ throw new Error(`NaN found at: ${path}.${key}`);
36
+ }
37
+ if (typeof value !== "function") {
38
+ validateNoNaN(value, `${path}.${key}`, visited);
39
+ }
40
+ }
41
+ }
42
+ }
43
+ };
44
+ Asserts.assertNoNaN = (obj, label = "validateNoNaN") => {
45
+ console.time(label);
46
+ try {
47
+ validateNoNaN(obj, "root", new WeakSet());
48
+ }
49
+ finally {
50
+ console.timeEnd(label);
51
+ }
52
+ };
53
+ })(Asserts || (Asserts = {}));
@@ -0,0 +1,7 @@
1
+ import { Box, BoxGraph } from "@opendaw/lib-box";
2
+ import { AudioUnitBox } from "@opendaw/studio-boxes";
3
+ import { AudioEffects } from "./Api";
4
+ export declare class AudioEffectFactory {
5
+ static write(boxGraph: BoxGraph, audioUnitBox: AudioUnitBox, effect: Required<AudioEffects[keyof AudioEffects]>): Box;
6
+ }
7
+ //# sourceMappingURL=AudioEffectFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioEffectFactory.d.ts","sourceRoot":"","sources":["../src/AudioEffectFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAE,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAC,YAAY,EAAiB,MAAM,uBAAuB,CAAA;AAElE,OAAO,EAAC,YAAY,EAAC,MAAM,OAAO,CAAA;AAElC,qBAAa,kBAAkB;IAC3B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM,YAAY,CAAC,CAAC,GAAG,GAAG;CAmBxE"}
@@ -0,0 +1,23 @@
1
+ import { DelayDeviceBox } from "@opendaw/studio-boxes";
2
+ import { Unhandled, UUID } from "@opendaw/lib-std";
3
+ export class AudioEffectFactory {
4
+ static write(boxGraph, audioUnitBox, effect) {
5
+ switch (effect.key) {
6
+ case "delay": {
7
+ return DelayDeviceBox.create(boxGraph, UUID.generate(), box => {
8
+ box.delay.setValue(effect.delay);
9
+ box.feedback.setValue(effect.feedback);
10
+ box.cross.setValue(effect.cross);
11
+ box.filter.setValue(effect.filter);
12
+ box.dry.setValue(effect.dry);
13
+ box.wet.setValue(effect.wet);
14
+ box.enabled.setValue(effect.enabled);
15
+ box.label.setValue(effect.label); // TODO uniquify?
16
+ box.host.refer(audioUnitBox.audioEffects);
17
+ });
18
+ }
19
+ default:
20
+ return Unhandled(effect.key);
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,6 @@
1
+ import { AudioFileBox } from "@opendaw/studio-boxes";
2
+ import { BoxGraph } from "@opendaw/lib-box";
3
+ export declare namespace AudioFileBoxfactory {
4
+ const create: (boxGraph: BoxGraph, sample: Sample) => AudioFileBox;
5
+ }
6
+ //# sourceMappingURL=AudioFileBoxfactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioFileBoxfactory.d.ts","sourceRoot":"","sources":["../src/AudioFileBoxfactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAA;AAElD,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAEzC,yBAAiB,mBAAmB,CAAC;IAC1B,MAAM,MAAM,GAAI,UAAU,QAAQ,EAAE,QAAQ,MAAM,KAAG,YAKtD,CAAA;CACT"}
@@ -0,0 +1,10 @@
1
+ import { AudioFileBox } from "@opendaw/studio-boxes";
2
+ import { UUID } from "@opendaw/lib-std";
3
+ export var AudioFileBoxfactory;
4
+ (function (AudioFileBoxfactory) {
5
+ AudioFileBoxfactory.create = (boxGraph, sample) => AudioFileBox.create(boxGraph, UUID.parse(sample.uuid), box => {
6
+ box.fileName.setValue(sample.name);
7
+ box.startInSeconds.setValue(0);
8
+ box.endInSeconds.setValue(sample.duration);
9
+ });
10
+ })(AudioFileBoxfactory || (AudioFileBoxfactory = {}));
@@ -0,0 +1,8 @@
1
+ import { AudioUnitBox } from "@opendaw/studio-boxes";
2
+ import { BoxGraph } from "@opendaw/lib-box";
3
+ import { IndexRef } from "./IndexRef";
4
+ import { AudioTrackImpl } from "./impl/AudioTrackImpl";
5
+ export declare namespace AudioTrackWriter {
6
+ const write: (boxGraph: BoxGraph, audioUnitBox: AudioUnitBox, audioTracks: ReadonlyArray<AudioTrackImpl>, indexRef: IndexRef) => void;
7
+ }
8
+ //# sourceMappingURL=AudioTrackWriter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioTrackWriter.d.ts","sourceRoot":"","sources":["../src/AudioTrackWriter.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,YAAY,EAAW,MAAM,uBAAuB,CAAA;AAE5E,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAA;AACnC,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAA;AAMpD,yBAAiB,gBAAgB,CAAC;IACvB,MAAM,KAAK,GAAI,UAAU,QAAQ,EAClB,cAAc,YAAY,EAC1B,aAAa,aAAa,CAAC,cAAc,CAAC,EAC1C,UAAU,QAAQ,KAAG,IA+B1C,CAAA;CACJ"}
@@ -0,0 +1,39 @@
1
+ import { UUID } from "@opendaw/lib-std";
2
+ import { AudioRegionBox, TrackBox } from "@opendaw/studio-boxes";
3
+ import { TrackType } from "@opendaw/studio-adapters";
4
+ import { AudioPlayback } from "@opendaw/studio-enums";
5
+ import { TimeBase } from "@opendaw/lib-dsp";
6
+ import { AudioFileBoxfactory } from "./AudioFileBoxfactory";
7
+ export var AudioTrackWriter;
8
+ (function (AudioTrackWriter) {
9
+ AudioTrackWriter.write = (boxGraph, audioUnitBox, audioTracks, indexRef) => {
10
+ audioTracks.forEach(({ enabled, regions }) => {
11
+ const trackBox = TrackBox.create(boxGraph, UUID.generate(), box => {
12
+ box.type.setValue(TrackType.Audio);
13
+ box.enabled.setValue(enabled);
14
+ box.index.setValue(indexRef.index++);
15
+ box.target.refer(audioUnitBox);
16
+ box.tracks.refer(audioUnitBox.tracks);
17
+ });
18
+ regions.forEach((region) => {
19
+ const { position, duration, loopDuration, loopOffset, hue, label, mute, sample } = region;
20
+ const fileBox = AudioFileBoxfactory.create(boxGraph, sample);
21
+ AudioRegionBox.create(boxGraph, UUID.generate(), box => {
22
+ box.position.setValue(position);
23
+ box.duration.setValue(duration);
24
+ box.loopDuration.setValue(loopDuration);
25
+ box.loopOffset.setValue(loopOffset);
26
+ box.hue.setValue(hue);
27
+ box.label.setValue(label);
28
+ box.mute.setValue(mute);
29
+ box.regions.refer(trackBox.regions);
30
+ box.file.refer(fileBox);
31
+ box.playback.setValue(region.playback);
32
+ box.timeBase.setValue(region.playback === AudioPlayback.NoSync
33
+ ? TimeBase.Seconds
34
+ : TimeBase.Musical);
35
+ });
36
+ });
37
+ });
38
+ };
39
+ })(AudioTrackWriter || (AudioTrackWriter = {}));
@@ -0,0 +1,6 @@
1
+ import { ProjectSkeleton } from "@opendaw/studio-adapters";
2
+ import { ProjectImpl } from "./impl";
3
+ export declare namespace AudioUnitBoxFactory {
4
+ const create: (skeleton: ProjectSkeleton, project: ProjectImpl) => void;
5
+ }
6
+ //# sourceMappingURL=AudioUnitBoxFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioUnitBoxFactory.d.ts","sourceRoot":"","sources":["../src/AudioUnitBoxFactory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoD,eAAe,EAAC,MAAM,0BAA0B,CAAA;AAC3G,OAAO,EAAgE,WAAW,EAAW,MAAM,QAAQ,CAAA;AAS3G,yBAAiB,mBAAmB,CAAC;IAC1B,MAAM,MAAM,GAAI,UAAU,eAAe,EAAE,SAAS,WAAW,KAAG,IAqHxE,CAAA;CACJ"}
@@ -0,0 +1,116 @@
1
+ import { asDefined, isDefined, isNotNull, UUID } from "@opendaw/lib-std";
2
+ import { AudioUnitType, IconSymbol } from "@opendaw/studio-enums";
3
+ import { AudioBusBox, AudioUnitBox, AuxSendBox, TrackBox } from "@opendaw/studio-boxes";
4
+ import { AudioUnitFactory, InstrumentFactories } from "@opendaw/studio-adapters";
5
+ import { MIDIEffectFactory } from "./MIDIEffectFactory";
6
+ import { AudioEffectFactory } from "./AudioEffectFactory";
7
+ import { NoteTrackWriter } from "./NoteTrackWriter";
8
+ import { ValueTrackWriter } from "./ValueTrackWriter";
9
+ import { AudioTrackWriter } from "./AudioTrackWriter";
10
+ import { AudioFileBoxfactory } from "./AudioFileBoxfactory";
11
+ export var AudioUnitBoxFactory;
12
+ (function (AudioUnitBoxFactory) {
13
+ AudioUnitBoxFactory.create = (skeleton, project) => {
14
+ const { boxGraph, mandatoryBoxes: { rootBox, primaryAudioBus, primaryAudioOutputUnit } } = skeleton;
15
+ let audioUnitIndex = 0;
16
+ const devices = new Map();
17
+ const busMap = new Map([[project.output, primaryAudioBus]]);
18
+ const audioUnitMap = new Map([[project.output, primaryAudioOutputUnit]]);
19
+ const awaitedSends = [];
20
+ const noteTrackWriter = new NoteTrackWriter();
21
+ const valueTrackWriter = new ValueTrackWriter();
22
+ const createSend = (sends, audioUnitBox) => {
23
+ awaitedSends.push(...(sends.map((send, index) => [send, AuxSendBox.create(boxGraph, UUID.generate(), box => {
24
+ box.index.setValue(index);
25
+ box.audioUnit.refer(audioUnitBox.auxSends);
26
+ box.sendGain.setValue(send.amount);
27
+ box.sendPan.setValue(send.pan);
28
+ // TODO mode "pre" | "post"
29
+ })])));
30
+ };
31
+ project.instrumentUnits.forEach((audioUnit) => {
32
+ const { instrument, midiEffects, audioEffects, noteTracks, audioTracks, valueTracks, volume, panning, mute, solo, sends } = audioUnit;
33
+ const factory = InstrumentFactories.Named[instrument.name];
34
+ const capture = AudioUnitFactory.trackTypeToCapture(boxGraph, factory.trackType);
35
+ const audioUnitBox = AudioUnitFactory.create(skeleton, AudioUnitType.Instrument, capture);
36
+ devices.set(audioUnit, audioUnitBox);
37
+ audioUnitBox.index.setValue(audioUnitIndex++);
38
+ audioUnitBox.mute.setValue(mute);
39
+ audioUnitBox.solo.setValue(solo);
40
+ audioUnitBox.volume.setValue(volume);
41
+ audioUnitBox.panning.setValue(panning);
42
+ if (factory === InstrumentFactories.Nano) {
43
+ const sample = instrument?.props?.sample;
44
+ factory.create(boxGraph, audioUnitBox.input, factory.defaultName, factory.defaultIcon, isDefined(sample) ? AudioFileBoxfactory.create(boxGraph, sample) : undefined);
45
+ }
46
+ else {
47
+ factory.create(boxGraph, audioUnitBox.input, factory.defaultName, factory.defaultIcon);
48
+ }
49
+ midiEffects.forEach((effect) => devices.set(effect, MIDIEffectFactory.write(boxGraph, audioUnitBox, effect)));
50
+ audioEffects.forEach((effect) => devices.set(effect, AudioEffectFactory.write(boxGraph, audioUnitBox, effect)));
51
+ const indexRef = { index: 0 };
52
+ noteTrackWriter.write(boxGraph, audioUnitBox, noteTracks, indexRef);
53
+ valueTrackWriter.write(boxGraph, devices, audioUnitBox, valueTracks, indexRef);
54
+ AudioTrackWriter.write(boxGraph, audioUnitBox, audioTracks, indexRef);
55
+ if (indexRef.index === 0) { // create a default track if none existed
56
+ TrackBox.create(boxGraph, UUID.generate(), box => {
57
+ box.type.setValue(factory.trackType);
58
+ box.index.setValue(0);
59
+ box.target.refer(audioUnitBox);
60
+ box.tracks.refer(audioUnitBox.tracks);
61
+ });
62
+ }
63
+ createSend(sends, audioUnitBox);
64
+ audioUnitMap.set(audioUnit, audioUnitBox);
65
+ });
66
+ const convertBusUnits = (audioUnit, type, icon, color) => {
67
+ const audioBusBox = AudioBusBox.create(boxGraph, UUID.generate(), box => {
68
+ box.collection.refer(rootBox.audioBusses);
69
+ box.label.setValue(audioUnit.label);
70
+ box.icon.setValue(IconSymbol.toName(icon));
71
+ box.color.setValue(color);
72
+ });
73
+ const audioUnitBox = AudioUnitBox.create(boxGraph, UUID.generate(), box => {
74
+ box.type.setValue(type);
75
+ box.collection.refer(rootBox.audioUnits);
76
+ box.index.setValue(audioUnitIndex++);
77
+ });
78
+ busMap.set(audioUnit, audioBusBox);
79
+ audioUnitMap.set(audioUnit, audioUnitBox);
80
+ audioBusBox.output.refer(audioUnitBox.input);
81
+ createSend(audioUnit.sends, audioUnitBox);
82
+ devices.set(audioUnit, audioUnitBox);
83
+ audioUnit.audioEffects.forEach((effect) => devices.set(effect, AudioEffectFactory.write(boxGraph, audioUnitBox, effect)));
84
+ valueTrackWriter.write(boxGraph, devices, audioUnitBox, audioUnit.valueTracks, { index: 0 });
85
+ };
86
+ // TODO Colors need to be in code and written to CSS
87
+ // Then use ColorCodes!
88
+ project.auxUnits.forEach(unit => convertBusUnits(unit, AudioUnitType.Aux, IconSymbol.Flask, "var(--color-orange)"));
89
+ project.groupUnits.forEach(unit => convertBusUnits(unit, AudioUnitType.Bus, IconSymbol.AudioBus, "var(--color-blue)"));
90
+ awaitedSends.forEach(([send, box]) => box.targetBus.refer(asDefined(busMap.get(send.target), "Could not find AudioBus").input));
91
+ const { output: { mute, solo, volume, panning } } = project;
92
+ primaryAudioOutputUnit.mute.setValue(mute);
93
+ primaryAudioOutputUnit.solo.setValue(solo);
94
+ primaryAudioOutputUnit.volume.setValue(volume);
95
+ primaryAudioOutputUnit.panning.setValue(panning);
96
+ primaryAudioOutputUnit.index.setValue(audioUnitIndex);
97
+ // connect
98
+ const audioUnits = [
99
+ ...project.instrumentUnits,
100
+ ...project.auxUnits,
101
+ ...project.groupUnits
102
+ ];
103
+ audioUnits.forEach((audioUnit) => {
104
+ const { output } = audioUnit;
105
+ // undefined means we connect this to the primary output
106
+ // null means this is intended to be unplugged
107
+ const audioBusBox = output === undefined
108
+ ? primaryAudioBus : output === null
109
+ ? null : asDefined(busMap.get(output), "Could not find AudioBus");
110
+ if (isNotNull(audioBusBox)) {
111
+ const audioUnitBox = asDefined(audioUnitMap.get(audioUnit), "audio unit not found in map");
112
+ audioUnitBox.output.refer(audioBusBox.input);
113
+ }
114
+ });
115
+ };
116
+ })(AudioUnitBoxFactory || (AudioUnitBoxFactory = {}));
@@ -0,0 +1,5 @@
1
+ import { int } from "@opendaw/lib-std";
2
+ export type IndexRef = {
3
+ index: int;
4
+ };
5
+ //# sourceMappingURL=IndexRef.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexRef.d.ts","sourceRoot":"","sources":["../src/IndexRef.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AAEpC,MAAM,MAAM,QAAQ,GAAG;IAAE,KAAK,EAAE,GAAG,CAAA;CAAE,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import { MIDIEffects } from "./Api";
2
+ import { Box, BoxGraph } from "@opendaw/lib-box";
3
+ import { AudioUnitBox } from "@opendaw/studio-boxes";
4
+ export declare class MIDIEffectFactory {
5
+ static write(boxGraph: BoxGraph, audioUnitBox: AudioUnitBox, effect: Required<MIDIEffects[keyof MIDIEffects]>): Box;
6
+ }
7
+ //# sourceMappingURL=MIDIEffectFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MIDIEffectFactory.d.ts","sourceRoot":"","sources":["../src/MIDIEffectFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAA;AACjC,OAAO,EAAC,GAAG,EAAE,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAC,YAAY,EAAiB,MAAM,uBAAuB,CAAA;AAGlE,qBAAa,iBAAiB;IAC1B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,WAAW,CAAC,CAAC,GAAG,GAAG;CAgBtE"}
@@ -0,0 +1,20 @@
1
+ import { PitchDeviceBox } from "@opendaw/studio-boxes";
2
+ import { Unhandled, UUID } from "@opendaw/lib-std";
3
+ export class MIDIEffectFactory {
4
+ static write(boxGraph, audioUnitBox, effect) {
5
+ switch (effect.key) {
6
+ case "pitch": {
7
+ return PitchDeviceBox.create(boxGraph, UUID.generate(), box => {
8
+ box.cents.setValue(effect.cents);
9
+ box.semiTones.setValue(effect.semiTones);
10
+ box.octaves.setValue(effect.octaves);
11
+ box.enabled.setValue(effect.enabled);
12
+ box.label.setValue(effect.label); // TODO uniquify?
13
+ box.host.refer(audioUnitBox.midiEffects);
14
+ });
15
+ }
16
+ default:
17
+ return Unhandled(effect.key);
18
+ }
19
+ }
20
+ }