@opendaw/studio-adapters 0.3.0 → 0.3.1

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 (37) hide show
  1. package/dist/DeviceManualUrls.d.ts +3 -3
  2. package/dist/DeviceManualUrls.d.ts.map +1 -1
  3. package/dist/DeviceManualUrls.js +3 -3
  4. package/dist/ParameterOwner.d.ts +10 -0
  5. package/dist/ParameterOwner.d.ts.map +1 -0
  6. package/dist/ParameterOwner.js +73 -0
  7. package/dist/devices/audio-effects/ReverbDeviceBoxAdapter.d.ts +1 -1
  8. package/dist/devices/audio-effects/ReverbDeviceBoxAdapter.d.ts.map +1 -1
  9. package/dist/devices/audio-effects/StereoToolDeviceBoxAdapter.d.ts +1 -1
  10. package/dist/devices/audio-effects/StereoToolDeviceBoxAdapter.d.ts.map +1 -1
  11. package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.d.ts +1 -1
  12. package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.d.ts.map +1 -1
  13. package/dist/modulation/LfoModulatorBoxAdapter.d.ts +31 -0
  14. package/dist/modulation/LfoModulatorBoxAdapter.d.ts.map +1 -0
  15. package/dist/modulation/LfoModulatorBoxAdapter.js +48 -0
  16. package/dist/modulation/MacroModulatorBoxAdapter.d.ts +11 -0
  17. package/dist/modulation/MacroModulatorBoxAdapter.d.ts.map +1 -0
  18. package/dist/modulation/MacroModulatorBoxAdapter.js +21 -0
  19. package/dist/modulation/ModulationBoxAdapter.d.ts +27 -0
  20. package/dist/modulation/ModulationBoxAdapter.d.ts.map +1 -0
  21. package/dist/modulation/ModulationBoxAdapter.js +72 -0
  22. package/dist/modulation/ModulatorBoxAdapter.d.ts +35 -0
  23. package/dist/modulation/ModulatorBoxAdapter.d.ts.map +1 -0
  24. package/dist/modulation/ModulatorBoxAdapter.js +69 -0
  25. package/dist/modulation/Modulators.d.ts +25 -0
  26. package/dist/modulation/Modulators.d.ts.map +1 -0
  27. package/dist/modulation/Modulators.js +101 -0
  28. package/dist/modulation/RandomModulatorBoxAdapter.d.ts +24 -0
  29. package/dist/modulation/RandomModulatorBoxAdapter.d.ts.map +1 -0
  30. package/dist/modulation/RandomModulatorBoxAdapter.js +62 -0
  31. package/dist/modulation/StepsModulatorBoxAdapter.d.ts +42 -0
  32. package/dist/modulation/StepsModulatorBoxAdapter.d.ts.map +1 -0
  33. package/dist/modulation/StepsModulatorBoxAdapter.js +100 -0
  34. package/dist/timeline/ParameterTracks.d.ts +30 -0
  35. package/dist/timeline/ParameterTracks.d.ts.map +1 -0
  36. package/dist/timeline/ParameterTracks.js +75 -0
  37. package/package.json +5 -5
@@ -6,13 +6,13 @@ export declare namespace DeviceManualUrls {
6
6
  const Velocity = "manuals/devices/midi/velocity";
7
7
  const Zeitgeist = "manuals/devices/midi/zeitgeist";
8
8
  const Autotune = "manuals/devices/audio/autotune";
9
- const StereoTool = "manuals/devices/audio/stereo-tool";
9
+ const StereoTool = "manuals/devices/audio/stereotool";
10
10
  const Delay = "manuals/devices/audio/delay";
11
11
  const DattorroReverb = "manuals/devices/audio/dattorro-reverb";
12
12
  const Maximizer = "manuals/devices/audio/maximizer";
13
13
  const Compressor = "manuals/devices/audio/compressor";
14
14
  const Gate = "manuals/devices/audio/gate";
15
- const Reverb = "manuals/devices/audio/cheap-reverb";
15
+ const Reverb = "manuals/devices/audio/reverb";
16
16
  const Crusher = "manuals/devices/audio/crusher";
17
17
  const Fold = "manuals/devices/audio/fold";
18
18
  const Tidal = "manuals/devices/audio/tidal";
@@ -30,7 +30,7 @@ export declare namespace DeviceManualUrls {
30
30
  const Playfield = "manuals/devices/instruments/playfield";
31
31
  const Vaporisateur = "manuals/devices/instruments/vaporisateur";
32
32
  const Neon = "manuals/devices/instruments/neon";
33
- const MIDIOutput = "manuals/devices/instruments/midi-output";
33
+ const MIDIOutput = "manuals/devices/instruments/midioutput";
34
34
  const Soundfont = "manuals/devices/instruments/soundfont";
35
35
  const FrequencySplit = "manuals/devices/audio/frequency-split";
36
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DeviceManualUrls.d.ts","sourceRoot":"","sources":["../src/DeviceManualUrls.ts"],"names":[],"mappings":"AAAA,yBAAiB,gBAAgB,CAAC;IAEvB,MAAM,QAAQ,sBAAsB,CAAA;IAGpC,MAAM,QAAQ,kCAAkC,CAAA;IAChD,MAAM,KAAK,+BAA+B,CAAA;IAC1C,MAAM,SAAS,mCAAmC,CAAA;IAClD,MAAM,QAAQ,kCAAkC,CAAA;IAChD,MAAM,SAAS,mCAAmC,CAAA;IAGlD,MAAM,QAAQ,mCAAmC,CAAA;IACjD,MAAM,UAAU,sCAAsC,CAAA;IACtD,MAAM,KAAK,gCAAgC,CAAA;IAC3C,MAAM,cAAc,0CAA0C,CAAA;IAC9D,MAAM,SAAS,oCAAoC,CAAA;IACnD,MAAM,UAAU,qCAAqC,CAAA;IACrD,MAAM,IAAI,+BAA+B,CAAA;IACzC,MAAM,MAAM,uCAAuC,CAAA;IACnD,MAAM,OAAO,kCAAkC,CAAA;IAC/C,MAAM,IAAI,+BAA+B,CAAA;IACzC,MAAM,KAAK,gCAAgC,CAAA;IAC3C,MAAM,MAAM,iCAAiC,CAAA;IAC7C,MAAM,OAAO,kCAAkC,CAAA;IAC/C,MAAM,SAAS,qCAAqC,CAAA;IACpD,MAAM,OAAO,kCAAkC,CAAA;IAC/C,MAAM,UAAU,qCAAqC,CAAA;IACrD,MAAM,SAAS,oCAAoC,CAAA;IACnD,MAAM,oBAAoB,2CAA2C,CAAA;IACrE,MAAM,eAAe,2CAA2C,CAAA;IAGhE,MAAM,OAAO,wCAAwC,CAAA;IACrD,MAAM,IAAI,qCAAqC,CAAA;IAC/C,MAAM,IAAI,qCAAqC,CAAA;IAC/C,MAAM,SAAS,0CAA0C,CAAA;IACzD,MAAM,YAAY,6CAA6C,CAAA;IAC/D,MAAM,IAAI,qCAAqC,CAAA;IAC/C,MAAM,UAAU,4CAA4C,CAAA;IAC5D,MAAM,SAAS,0CAA0C,CAAA;IACzD,MAAM,cAAc,0CAA0C,CAAA;CACxE"}
1
+ {"version":3,"file":"DeviceManualUrls.d.ts","sourceRoot":"","sources":["../src/DeviceManualUrls.ts"],"names":[],"mappings":"AAAA,yBAAiB,gBAAgB,CAAC;IAEvB,MAAM,QAAQ,sBAAsB,CAAA;IAGpC,MAAM,QAAQ,kCAAkC,CAAA;IAChD,MAAM,KAAK,+BAA+B,CAAA;IAC1C,MAAM,SAAS,mCAAmC,CAAA;IAClD,MAAM,QAAQ,kCAAkC,CAAA;IAChD,MAAM,SAAS,mCAAmC,CAAA;IAGlD,MAAM,QAAQ,mCAAmC,CAAA;IACjD,MAAM,UAAU,qCAAqC,CAAA;IACrD,MAAM,KAAK,gCAAgC,CAAA;IAC3C,MAAM,cAAc,0CAA0C,CAAA;IAC9D,MAAM,SAAS,oCAAoC,CAAA;IACnD,MAAM,UAAU,qCAAqC,CAAA;IACrD,MAAM,IAAI,+BAA+B,CAAA;IACzC,MAAM,MAAM,iCAAiC,CAAA;IAC7C,MAAM,OAAO,kCAAkC,CAAA;IAC/C,MAAM,IAAI,+BAA+B,CAAA;IACzC,MAAM,KAAK,gCAAgC,CAAA;IAC3C,MAAM,MAAM,iCAAiC,CAAA;IAC7C,MAAM,OAAO,kCAAkC,CAAA;IAC/C,MAAM,SAAS,qCAAqC,CAAA;IACpD,MAAM,OAAO,kCAAkC,CAAA;IAC/C,MAAM,UAAU,qCAAqC,CAAA;IACrD,MAAM,SAAS,oCAAoC,CAAA;IACnD,MAAM,oBAAoB,2CAA2C,CAAA;IACrE,MAAM,eAAe,2CAA2C,CAAA;IAGhE,MAAM,OAAO,wCAAwC,CAAA;IACrD,MAAM,IAAI,qCAAqC,CAAA;IAC/C,MAAM,IAAI,qCAAqC,CAAA;IAC/C,MAAM,SAAS,0CAA0C,CAAA;IACzD,MAAM,YAAY,6CAA6C,CAAA;IAC/D,MAAM,IAAI,qCAAqC,CAAA;IAC/C,MAAM,UAAU,2CAA2C,CAAA;IAC3D,MAAM,SAAS,0CAA0C,CAAA;IACzD,MAAM,cAAc,0CAA0C,CAAA;CACxE"}
@@ -10,13 +10,13 @@ export var DeviceManualUrls;
10
10
  DeviceManualUrls.Zeitgeist = "manuals/devices/midi/zeitgeist";
11
11
  // Audio Effects
12
12
  DeviceManualUrls.Autotune = "manuals/devices/audio/autotune";
13
- DeviceManualUrls.StereoTool = "manuals/devices/audio/stereo-tool";
13
+ DeviceManualUrls.StereoTool = "manuals/devices/audio/stereotool";
14
14
  DeviceManualUrls.Delay = "manuals/devices/audio/delay";
15
15
  DeviceManualUrls.DattorroReverb = "manuals/devices/audio/dattorro-reverb";
16
16
  DeviceManualUrls.Maximizer = "manuals/devices/audio/maximizer";
17
17
  DeviceManualUrls.Compressor = "manuals/devices/audio/compressor";
18
18
  DeviceManualUrls.Gate = "manuals/devices/audio/gate";
19
- DeviceManualUrls.Reverb = "manuals/devices/audio/cheap-reverb";
19
+ DeviceManualUrls.Reverb = "manuals/devices/audio/reverb";
20
20
  DeviceManualUrls.Crusher = "manuals/devices/audio/crusher";
21
21
  DeviceManualUrls.Fold = "manuals/devices/audio/fold";
22
22
  DeviceManualUrls.Tidal = "manuals/devices/audio/tidal";
@@ -35,7 +35,7 @@ export var DeviceManualUrls;
35
35
  DeviceManualUrls.Playfield = "manuals/devices/instruments/playfield";
36
36
  DeviceManualUrls.Vaporisateur = "manuals/devices/instruments/vaporisateur";
37
37
  DeviceManualUrls.Neon = "manuals/devices/instruments/neon";
38
- DeviceManualUrls.MIDIOutput = "manuals/devices/instruments/midi-output";
38
+ DeviceManualUrls.MIDIOutput = "manuals/devices/instruments/midioutput";
39
39
  DeviceManualUrls.Soundfont = "manuals/devices/instruments/soundfont";
40
40
  DeviceManualUrls.FrequencySplit = "manuals/devices/audio/frequency-split";
41
41
  })(DeviceManualUrls || (DeviceManualUrls = {}));
@@ -0,0 +1,10 @@
1
+ import { Vertex } from "@opendaw/lib-box";
2
+ import { Observer, Option, Subscription } from "@opendaw/lib-std";
3
+ import { BoxAdaptersContext } from "./BoxAdaptersContext";
4
+ import { AudioUnitBoxAdapter } from "./audio-unit/AudioUnitBoxAdapter";
5
+ export declare namespace ParameterOwner {
6
+ const nameOf: (context: BoxAdaptersContext, vertex: Vertex) => Option<string>;
7
+ const catchupAndSubscribeName: (context: BoxAdaptersContext, vertex: Vertex, observer: Observer<string>) => Subscription;
8
+ const audioUnitOf: (context: BoxAdaptersContext, vertex: Vertex) => Option<AudioUnitBoxAdapter>;
9
+ }
10
+ //# sourceMappingURL=ParameterOwner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParameterOwner.d.ts","sourceRoot":"","sources":["../src/ParameterOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,MAAM,EAAC,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAa,MAAM,kBAAkB,CAAA;AAG3E,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAA;AAIpE,yBAAiB,cAAc,CAAC;IAGrB,MAAM,MAAM,GAAI,SAAS,kBAAkB,EAAE,QAAQ,MAAM,KAAG,MAAM,CAAC,MAAM,CAcjF,CAAA;IAIM,MAAM,uBAAuB,GAAI,SAAS,kBAAkB,EAC3B,QAAQ,MAAM,EACd,UAAU,QAAQ,CAAC,MAAM,CAAC,KAAG,YAepE,CAAA;IAEM,MAAM,WAAW,GAAI,SAAS,kBAAkB,EAAE,QAAQ,MAAM,KAAG,MAAM,CAAC,mBAAmB,CAQnG,CAAA;CAyBJ"}
@@ -0,0 +1,73 @@
1
+ import { StringField } from "@opendaw/lib-box";
2
+ import { Option, Terminable } from "@opendaw/lib-std";
3
+ import { Pointers } from "@opendaw/studio-enums";
4
+ import { AudioUnitBox, ModulationBox } from "@opendaw/studio-boxes";
5
+ import { AudioUnitBoxAdapter } from "./audio-unit/AudioUnitBoxAdapter";
6
+ import { ModulationBoxAdapter } from "./modulation/ModulationBoxAdapter";
7
+ import { Devices } from "./DeviceAdapter";
8
+ export var ParameterOwner;
9
+ (function (ParameterOwner) {
10
+ /// A scriptable device's dynamic parameter lives in its own child box, so the walk falls back to the
11
+ /// device that owns it.
12
+ ParameterOwner.nameOf = (context, vertex) => {
13
+ const box = vertex.box;
14
+ if (box instanceof AudioUnitBox) {
15
+ return context.boxAdapters.adapterFor(box, AudioUnitBoxAdapter).input.label;
16
+ }
17
+ if (box instanceof ModulationBox) {
18
+ const adapter = context.boxAdapters.adapterFor(box, ModulationBoxAdapter);
19
+ return Option.wrap(`${adapter.source.label} \u2192 ${adapter.targetOwner.unwrapOrElse("")} ${adapter.target.mapOr(parameter => parameter.name, "")}`.trim());
20
+ }
21
+ const own = labelOf(context, box);
22
+ if (own.nonEmpty()) {
23
+ return own;
24
+ }
25
+ const owner = resolveOwnerDeviceBox(box).flatMap(owner => labelOf(context, owner));
26
+ return owner.nonEmpty() ? owner : Option.wrap(box.name);
27
+ };
28
+ /// The same name as `nameOf`, but following the rename: a view stays in sync when the device (or the
29
+ /// audio unit's instrument) is relabelled.
30
+ ParameterOwner.catchupAndSubscribeName = (context, vertex, observer) => {
31
+ const box = vertex.box;
32
+ if (box instanceof AudioUnitBox) {
33
+ return context.boxAdapters.adapterFor(box, AudioUnitBoxAdapter).input
34
+ .catchupAndSubscribeLabelChange(label => observer(label.unwrapOrElse("")));
35
+ }
36
+ const own = labelFieldOf(context, box);
37
+ const field = own.nonEmpty()
38
+ ? own
39
+ : resolveOwnerDeviceBox(box).flatMap(owner => labelFieldOf(context, owner));
40
+ if (field.isEmpty()) {
41
+ observer(ParameterOwner.nameOf(context, vertex).unwrapOrElse(box.name));
42
+ return Terminable.Empty;
43
+ }
44
+ return field.unwrap().catchupAndSubscribe(field => observer(field.getValue()));
45
+ };
46
+ ParameterOwner.audioUnitOf = (context, vertex) => {
47
+ const box = vertex.box;
48
+ if (box instanceof AudioUnitBox) {
49
+ return Option.wrap(context.boxAdapters.adapterFor(box, AudioUnitBoxAdapter));
50
+ }
51
+ const own = unitOf(context, box);
52
+ if (own.nonEmpty()) {
53
+ return own;
54
+ }
55
+ return resolveOwnerDeviceBox(box).flatMap(owner => unitOf(context, owner));
56
+ };
57
+ const unitOf = (context, box) => context.boxAdapters.optAdapter(box)
58
+ .flatMap(adapter => Devices.isAny(adapter)
59
+ ? Option.wrap(adapter.audioUnitBoxAdapter())
60
+ : Option.None);
61
+ const labelOf = (context, box) => labelFieldOf(context, box).map(field => field.getValue());
62
+ const labelFieldOf = (context, box) => context.boxAdapters.optAdapter(box).flatMap(adapter => "labelField" in adapter && adapter.labelField instanceof StringField
63
+ ? Option.wrap(adapter.labelField)
64
+ : Option.None);
65
+ const resolveOwnerDeviceBox = (box) => {
66
+ for (const [pointer] of box.outgoingEdges()) {
67
+ if (pointer.pointerType === Pointers.Parameter) {
68
+ return pointer.targetVertex.map(vertex => vertex.box);
69
+ }
70
+ }
71
+ return Option.None;
72
+ };
73
+ })(ParameterOwner || (ParameterOwner = {}));
@@ -10,7 +10,7 @@ export declare class ReverbDeviceBoxAdapter implements AudioEffectDeviceAdapter
10
10
  #private;
11
11
  readonly type = "audio-effect";
12
12
  readonly accepts = "audio";
13
- readonly manualUrl = "manuals/devices/audio/cheap-reverb";
13
+ readonly manualUrl = "manuals/devices/audio/reverb";
14
14
  readonly namedParameter: {
15
15
  readonly decay: import("../..").AutomatableParameterFieldAdapter<number>;
16
16
  readonly preDelay: import("../..").AutomatableParameterFieldAdapter<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"ReverbDeviceBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/audio-effects/ReverbDeviceBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAwB,IAAI,EAAe,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAC,wBAAwB,EAAE,UAAU,EAAU,MAAM,qBAAqB,CAAA;AACjF,OAAO,EAAC,kBAAkB,EAAC,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAA;AAG3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAA;AAExE,qBAAa,sBAAuB,YAAW,wBAAwB;;IACnE,QAAQ,CAAC,IAAI,kBAAiB;IAC9B,QAAQ,CAAC,OAAO,WAAU;IAC1B,QAAQ,CAAC,SAAS,wCAA0B;IAK5C,QAAQ,CAAC,cAAc;;;;;;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,eAAe;IAO7D,IAAI,GAAG,IAAI,eAAe,CAAmB;IAC7C,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,UAAU,IAAI,UAAU,CAAyB;IACrD,IAAI,UAAU,IAAI,WAAW,CAAyB;IACtD,IAAI,YAAY,IAAI,YAAY,CAA2B;IAC3D,IAAI,cAAc,IAAI,YAAY,CAA6B;IAC/D,IAAI,IAAI,IAAI,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAwB;IAE1E,UAAU,IAAI,UAAU;IAKxB,mBAAmB,IAAI,mBAAmB;IAEzC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAIpD,SAAS,IAAI,IAAI;CAwCpB"}
1
+ {"version":3,"file":"ReverbDeviceBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/audio-effects/ReverbDeviceBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAwB,IAAI,EAAe,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAC,wBAAwB,EAAE,UAAU,EAAU,MAAM,qBAAqB,CAAA;AACjF,OAAO,EAAC,kBAAkB,EAAC,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAA;AAG3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAA;AAExE,qBAAa,sBAAuB,YAAW,wBAAwB;;IACnE,QAAQ,CAAC,IAAI,kBAAiB;IAC9B,QAAQ,CAAC,OAAO,WAAU;IAC1B,QAAQ,CAAC,SAAS,kCAA0B;IAK5C,QAAQ,CAAC,cAAc;;;;;;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,eAAe;IAO7D,IAAI,GAAG,IAAI,eAAe,CAAmB;IAC7C,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,UAAU,IAAI,UAAU,CAAyB;IACrD,IAAI,UAAU,IAAI,WAAW,CAAyB;IACtD,IAAI,YAAY,IAAI,YAAY,CAA2B;IAC3D,IAAI,cAAc,IAAI,YAAY,CAA6B;IAC/D,IAAI,IAAI,IAAI,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAwB;IAE1E,UAAU,IAAI,UAAU;IAKxB,mBAAmB,IAAI,mBAAmB;IAEzC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAIpD,SAAS,IAAI,IAAI;CAwCpB"}
@@ -10,7 +10,7 @@ export declare class StereoToolDeviceBoxAdapter implements AudioEffectDeviceAdap
10
10
  #private;
11
11
  readonly type = "audio-effect";
12
12
  readonly accepts = "audio";
13
- readonly manualUrl = "manuals/devices/audio/stereo-tool";
13
+ readonly manualUrl = "manuals/devices/audio/stereotool";
14
14
  readonly namedParameter: {
15
15
  readonly volume: import("../..").AutomatableParameterFieldAdapter<number>;
16
16
  readonly panning: import("../..").AutomatableParameterFieldAdapter<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"StereoToolDeviceBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/audio-effects/StereoToolDeviceBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,IAAI,EAAe,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAC,wBAAwB,EAAE,UAAU,EAAU,MAAM,qBAAqB,CAAA;AACjF,OAAO,EAAC,kBAAkB,EAAC,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAA;AAG3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAA;AAExE,qBAAa,0BAA2B,YAAW,wBAAwB;;IACvE,QAAQ,CAAC,IAAI,kBAAiB;IAC9B,QAAQ,CAAC,OAAO,WAAU;IAC1B,QAAQ,CAAC,SAAS,uCAA8B;IAMhD,QAAQ,CAAC,cAAc;;;;;;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,mBAAmB;IAOjE,IAAI,GAAG,IAAI,mBAAmB,CAAmB;IACjD,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,UAAU,IAAI,UAAU,CAAyB;IACrD,IAAI,UAAU,IAAI,WAAW,CAAyB;IACtD,IAAI,YAAY,IAAI,YAAY,CAA2B;IAC3D,IAAI,cAAc,IAAI,YAAY,CAA6B;IAC/D,IAAI,IAAI,IAAI,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAwB;IAE1E,UAAU,IAAI,UAAU;IAKxB,mBAAmB,IAAI,mBAAmB;IAEzC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAIpD,SAAS,IAAI,IAAI;CAqBpB"}
1
+ {"version":3,"file":"StereoToolDeviceBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/audio-effects/StereoToolDeviceBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,IAAI,EAAe,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAC,wBAAwB,EAAE,UAAU,EAAU,MAAM,qBAAqB,CAAA;AACjF,OAAO,EAAC,kBAAkB,EAAC,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAA;AAG3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAA;AAExE,qBAAa,0BAA2B,YAAW,wBAAwB;;IACvE,QAAQ,CAAC,IAAI,kBAAiB;IAC9B,QAAQ,CAAC,OAAO,WAAU;IAC1B,QAAQ,CAAC,SAAS,sCAA8B;IAMhD,QAAQ,CAAC,cAAc;;;;;;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,mBAAmB;IAOjE,IAAI,GAAG,IAAI,mBAAmB,CAAmB;IACjD,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,UAAU,IAAI,UAAU,CAAyB;IACrD,IAAI,UAAU,IAAI,WAAW,CAAyB;IACtD,IAAI,YAAY,IAAI,YAAY,CAA2B;IAC3D,IAAI,cAAc,IAAI,YAAY,CAA6B;IAC/D,IAAI,IAAI,IAAI,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAwB;IAE1E,UAAU,IAAI,UAAU;IAKxB,mBAAmB,IAAI,mBAAmB;IAEzC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAIpD,SAAS,IAAI,IAAI;CAqBpB"}
@@ -11,7 +11,7 @@ export declare class MIDIOutputDeviceBoxAdapter implements InstrumentDeviceBoxAd
11
11
  #private;
12
12
  readonly type = "instrument";
13
13
  readonly accepts = "midi";
14
- readonly manualUrl = "manuals/devices/instruments/midi-output";
14
+ readonly manualUrl = "manuals/devices/instruments/midioutput";
15
15
  constructor(context: BoxAdaptersContext, box: MIDIOutputDeviceBox);
16
16
  get box(): MIDIOutputDeviceBox;
17
17
  get uuid(): UUID.Bytes;
@@ -1 +1 @@
1
- {"version":3,"file":"MIDIOutputDeviceBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/instruments/MIDIOutputDeviceBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,gBAAgB,EAQhB,IAAI,EAEP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,aAAa,EAAE,mBAAmB,EAAyB,MAAM,uBAAuB,CAAA;AAChG,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAC,UAAU,EAAW,0BAA0B,EAAC,MAAM,qBAAqB,CAAA;AACnF,OAAO,EAAC,kBAAkB,EAAC,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAA;AAE3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAA;AAoBxE,qBAAa,0BAA2B,YAAW,0BAA0B;;IAGzE,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,OAAO,UAAS;IACzB,QAAQ,CAAC,SAAS,6CAA8B;gBAQpC,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,mBAAmB;IAuBjE,IAAI,GAAG,IAAI,mBAAmB,CAAmB;IACjD,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,UAAU,IAAI,WAAW,CAAyB;IACtD,IAAI,SAAS,IAAI,WAAW,CAAwB;IACpD,IAAI,gBAAgB,IAAI,SAAS,CAAyB;IAC1D,IAAI,YAAY,IAAI,YAAY,CAA2B;IAC3D,IAAI,cAAc,IAAI,YAAY,CAA6B;IAC/D,IAAI,iBAAiB,IAAI,OAAO,CAAc;IAC9C,IAAI,UAAU,IAAI,mBAAmB,CAA0B;IAC/D,IAAI,UAAU,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAA0B;IAE3E,UAAU,IAAI,UAAU;IAKxB,mBAAmB,IAAI,mBAAmB;IAEzC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAIpD,SAAS,IAAI,IAAI;CACpB"}
1
+ {"version":3,"file":"MIDIOutputDeviceBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/instruments/MIDIOutputDeviceBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,gBAAgB,EAQhB,IAAI,EAEP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,aAAa,EAAE,mBAAmB,EAAyB,MAAM,uBAAuB,CAAA;AAChG,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAC,UAAU,EAAW,0BAA0B,EAAC,MAAM,qBAAqB,CAAA;AACnF,OAAO,EAAC,kBAAkB,EAAC,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAA;AAE3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAA;AAoBxE,qBAAa,0BAA2B,YAAW,0BAA0B;;IAGzE,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,OAAO,UAAS;IACzB,QAAQ,CAAC,SAAS,4CAA8B;gBAQpC,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,mBAAmB;IAuBjE,IAAI,GAAG,IAAI,mBAAmB,CAAmB;IACjD,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,UAAU,IAAI,WAAW,CAAyB;IACtD,IAAI,SAAS,IAAI,WAAW,CAAwB;IACpD,IAAI,gBAAgB,IAAI,SAAS,CAAyB;IAC1D,IAAI,YAAY,IAAI,YAAY,CAA2B;IAC3D,IAAI,cAAc,IAAI,YAAY,CAA6B;IAC/D,IAAI,iBAAiB,IAAI,OAAO,CAAc;IAC9C,IAAI,UAAU,IAAI,mBAAmB,CAA0B;IAC/D,IAAI,UAAU,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAA0B;IAE3E,UAAU,IAAI,UAAU;IAKxB,mBAAmB,IAAI,mBAAmB;IAEzC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAIpD,SAAS,IAAI,IAAI;CACpB"}
@@ -0,0 +1,31 @@
1
+ import { LfoModulatorBox } from "@opendaw/studio-boxes";
2
+ import { int } from "@opendaw/lib-std";
3
+ import { ppqn } from "@opendaw/lib-dsp";
4
+ import { BoxAdaptersContext } from "../BoxAdaptersContext";
5
+ import { ModulatorBoxAdapter } from "./ModulatorBoxAdapter";
6
+ export declare enum LfoShape {
7
+ Sine = 0,
8
+ Triangle = 1,
9
+ SawUp = 2,
10
+ SawDown = 3,
11
+ Square = 4
12
+ }
13
+ export declare class LfoModulatorBoxAdapter extends ModulatorBoxAdapter<LfoModulatorBox> {
14
+ #private;
15
+ static readonly Rates: ReadonlyArray<[int, int]>;
16
+ static readonly MaxAbsoluteRate = 10;
17
+ static readonly ExponentRange = 8;
18
+ static readonly CenterAbsoluteRate = 1;
19
+ static readonly RatePPQNs: ReadonlyArray<ppqn>;
20
+ static readonly RateStrings: ReadonlyArray<string>;
21
+ static readonly ShapeStrings: ReadonlyArray<string>;
22
+ readonly namedParameter: {
23
+ readonly shape: import("..").AutomatableParameterFieldAdapter<number>;
24
+ readonly rateSync: import("..").AutomatableParameterFieldAdapter<number>;
25
+ readonly rateAbsolute: import("..").AutomatableParameterFieldAdapter<number>;
26
+ readonly phase: import("..").AutomatableParameterFieldAdapter<number>;
27
+ readonly exponent: import("..").AutomatableParameterFieldAdapter<number>;
28
+ };
29
+ constructor(context: BoxAdaptersContext, box: LfoModulatorBox);
30
+ }
31
+ //# sourceMappingURL=LfoModulatorBoxAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LfoModulatorBoxAdapter.d.ts","sourceRoot":"","sources":["../../src/modulation/LfoModulatorBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAC,GAAG,EAA8B,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAC,IAAI,EAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAA;AAEzD,oBAAY,QAAQ;IAAE,IAAI,IAAA;IAAE,QAAQ,IAAA;IAAE,KAAK,IAAA;IAAE,OAAO,IAAA;IAAE,MAAM,IAAA;CAAC;AAG7D,qBAAa,sBAAuB,SAAQ,mBAAmB,CAAC,eAAe,CAAC;;IAC5E,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAE/C;IACD,MAAM,CAAC,QAAQ,CAAC,eAAe,MAAO;IACtC,MAAM,CAAC,QAAQ,CAAC,aAAa,KAAM;IACnC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,KAAM;IACxC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,CACqC;IACnF,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAGT;IACzC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAmD;IAEtG,QAAQ,CAAC,cAAc;;;;;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,eAAe;CAwBhE"}
@@ -0,0 +1,48 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _LfoModulatorBoxAdapter_instances, _a, _LfoModulatorBoxAdapter_wrapParameters;
7
+ import { StringMapping, ValueMapping } from "@opendaw/lib-std";
8
+ import { PPQN } from "@opendaw/lib-dsp";
9
+ import { ModulatorBoxAdapter } from "./ModulatorBoxAdapter";
10
+ export var LfoShape;
11
+ (function (LfoShape) {
12
+ LfoShape[LfoShape["Sine"] = 0] = "Sine";
13
+ LfoShape[LfoShape["Triangle"] = 1] = "Triangle";
14
+ LfoShape[LfoShape["SawUp"] = 2] = "SawUp";
15
+ LfoShape[LfoShape["SawDown"] = 3] = "SawDown";
16
+ LfoShape[LfoShape["Square"] = 4] = "Square";
17
+ })(LfoShape || (LfoShape = {}));
18
+ // WASM CONTRACT: `RatePPQNs` mirrors the engine's `modulation::RATES` (crates/engine/src/modulation.rs).
19
+ export class LfoModulatorBoxAdapter extends ModulatorBoxAdapter {
20
+ constructor(context, box) {
21
+ super(context, box);
22
+ _LfoModulatorBoxAdapter_instances.add(this);
23
+ this.namedParameter = __classPrivateFieldGet(this, _LfoModulatorBoxAdapter_instances, "m", _LfoModulatorBoxAdapter_wrapParameters).call(this, box);
24
+ this.registerParameterTracks();
25
+ }
26
+ }
27
+ _a = LfoModulatorBoxAdapter, _LfoModulatorBoxAdapter_instances = new WeakSet(), _LfoModulatorBoxAdapter_wrapParameters = function _LfoModulatorBoxAdapter_wrapParameters(box) {
28
+ return {
29
+ shape: this.parametric.createParameter(box.shape, ValueMapping.linearInteger(0, _a.ShapeStrings.length - 1), StringMapping.indices("", _a.ShapeStrings), "Shape"),
30
+ rateSync: this.parametric.createParameter(box.rateSync, ValueMapping.linearInteger(0, _a.RateStrings.length - 1), StringMapping.indices("", _a.RateStrings), "Sync"),
31
+ rateAbsolute: this.parametric.createParameter(box.rateAbsolute, ValueMapping.powerByCenter(_a.CenterAbsoluteRate, 0.0, _a.MaxAbsoluteRate), StringMapping.numeric({ unit: "Hz", fractionDigits: 2 }), "Free"),
32
+ phase: this.parametric.createParameter(box.phase, ValueMapping.unipolar(), StringMapping.percent({ fractionDigits: 0 }), "Phase"),
33
+ exponent: this.parametric.createParameter(box.exponent, ValueMapping.bipolar(), StringMapping.percent({ fractionDigits: 0 }), "Pow")
34
+ };
35
+ };
36
+ LfoModulatorBoxAdapter.Rates = [
37
+ [8, 1], [4, 1], [2, 1], [1, 1], [1, 2], [1, 4], [1, 6], [1, 8], [1, 12], [1, 16], [1, 24], [1, 32]
38
+ ];
39
+ LfoModulatorBoxAdapter.MaxAbsoluteRate = 10.0;
40
+ LfoModulatorBoxAdapter.ExponentRange = 8.0;
41
+ LfoModulatorBoxAdapter.CenterAbsoluteRate = 1.0;
42
+ LfoModulatorBoxAdapter.RatePPQNs = [0, ..._a.Rates
43
+ .map(([nominator, denominator]) => PPQN.fromSignature(nominator, denominator))];
44
+ LfoModulatorBoxAdapter.RateStrings = ["Off", ..._a.Rates
45
+ .map(([nominator, denominator]) => denominator === 1
46
+ ? (nominator === 1 ? "1 bar" : `${nominator} bars`)
47
+ : `${nominator}/${denominator}`)];
48
+ LfoModulatorBoxAdapter.ShapeStrings = ["Sine", "Triangle", "Saw ↑", "Saw ↓", "Square"];
@@ -0,0 +1,11 @@
1
+ import { MacroModulatorBox } from "@opendaw/studio-boxes";
2
+ import { BoxAdaptersContext } from "../BoxAdaptersContext";
3
+ import { ModulatorBoxAdapter } from "./ModulatorBoxAdapter";
4
+ export declare class MacroModulatorBoxAdapter extends ModulatorBoxAdapter<MacroModulatorBox> {
5
+ #private;
6
+ readonly namedParameter: {
7
+ readonly value: import("..").AutomatableParameterFieldAdapter<number>;
8
+ };
9
+ constructor(context: BoxAdaptersContext, box: MacroModulatorBox);
10
+ }
11
+ //# sourceMappingURL=MacroModulatorBoxAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MacroModulatorBoxAdapter.d.ts","sourceRoot":"","sources":["../../src/modulation/MacroModulatorBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAC,mBAAmB,EAAwB,MAAM,uBAAuB,CAAA;AAEhF,qBAAa,wBAAyB,SAAQ,mBAAmB,CAAC,iBAAiB,CAAC;;IAChF,QAAQ,CAAC,cAAc;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,iBAAiB;CAYlE"}
@@ -0,0 +1,21 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _MacroModulatorBoxAdapter_instances, _MacroModulatorBoxAdapter_wrapParameters;
7
+ import { ValueMapping } from "@opendaw/lib-std";
8
+ import { ModulatorBoxAdapter, polarityStringMapping } from "./ModulatorBoxAdapter";
9
+ export class MacroModulatorBoxAdapter extends ModulatorBoxAdapter {
10
+ constructor(context, box) {
11
+ super(context, box);
12
+ _MacroModulatorBoxAdapter_instances.add(this);
13
+ this.namedParameter = __classPrivateFieldGet(this, _MacroModulatorBoxAdapter_instances, "m", _MacroModulatorBoxAdapter_wrapParameters).call(this, box);
14
+ this.registerParameterTracks();
15
+ }
16
+ }
17
+ _MacroModulatorBoxAdapter_instances = new WeakSet(), _MacroModulatorBoxAdapter_wrapParameters = function _MacroModulatorBoxAdapter_wrapParameters(box) {
18
+ return {
19
+ value: this.parametric.createParameter(box.value, ValueMapping.unipolar(), polarityStringMapping(box.bipolar), "Value")
20
+ };
21
+ };
@@ -0,0 +1,27 @@
1
+ import { Address } from "@opendaw/lib-box";
2
+ import { ModulationBox } from "@opendaw/studio-boxes";
3
+ import { Observer, Option, Subscription, UUID } from "@opendaw/lib-std";
4
+ import { BoxAdapter } from "../BoxAdapter";
5
+ import { BoxAdaptersContext } from "../BoxAdaptersContext";
6
+ import { AutomatableParameterFieldAdapter } from "../AutomatableParameterFieldAdapter";
7
+ import { AudioUnitBoxAdapter } from "../audio-unit/AudioUnitBoxAdapter";
8
+ import { ModulatorBoxAdapter } from "./ModulatorBoxAdapter";
9
+ export declare class ModulationBoxAdapter implements BoxAdapter {
10
+ #private;
11
+ readonly namedParameter: {
12
+ readonly depth: AutomatableParameterFieldAdapter<number>;
13
+ };
14
+ constructor(context: BoxAdaptersContext, box: ModulationBox);
15
+ get box(): ModulationBox;
16
+ get uuid(): UUID.Bytes;
17
+ get address(): Address;
18
+ get enabled(): boolean;
19
+ get depth(): number;
20
+ get source(): ModulatorBoxAdapter;
21
+ get target(): Option<AutomatableParameterFieldAdapter>;
22
+ get targetAudioUnit(): Option<AudioUnitBoxAdapter>;
23
+ get targetOwner(): Option<string>;
24
+ catchupAndSubscribeTargetOwner(observer: Observer<string>): Subscription;
25
+ terminate(): void;
26
+ }
27
+ //# sourceMappingURL=ModulationBoxAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModulationBoxAdapter.d.ts","sourceRoot":"","sources":["../../src/modulation/ModulationBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAiB,YAAY,EAA0B,IAAI,EAAe,MAAM,kBAAkB,CAAA;AAC1H,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAA;AACxC,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAA;AAExD,OAAO,EAAC,gCAAgC,EAAC,MAAM,qCAAqC,CAAA;AACpF,OAAO,EAAC,mBAAmB,EAAC,MAAM,mCAAmC,CAAA;AACrE,OAAO,EAAwB,mBAAmB,EAAC,MAAM,uBAAuB,CAAA;AAGhF,qBAAa,oBAAqB,YAAW,UAAU;;IAKnD,QAAQ,CAAC,cAAc;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,aAAa;IAsB3D,IAAI,GAAG,IAAI,aAAa,CAAmB;IAC3C,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,OAAO,IAAI,OAAO,CAAsC;IAC5D,IAAI,KAAK,IAAI,MAAM,CAAoC;IAEvD,IAAI,MAAM,IAAI,mBAAmB,CAGhC;IAGD,IAAI,MAAM,IAAI,MAAM,CAAC,gCAAgC,CAAC,CAGrD;IAED,IAAI,eAAe,IAAI,MAAM,CAAC,mBAAmB,CAAC,CAEjD;IAED,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,CAEhC;IAGD,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,YAAY;IASxE,SAAS,IAAI,IAAI;CACpB"}
@@ -0,0 +1,72 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _ModulationBoxAdapter_terminator, _ModulationBoxAdapter_context, _ModulationBoxAdapter_box, _ModulationBoxAdapter_parametric;
13
+ import { StringMapping, Terminable, Terminator, ValueMapping } from "@opendaw/lib-std";
14
+ import { ParameterAdapterSet } from "../ParameterAdapterSet";
15
+ import { isModulatorBoxAdapter } from "./ModulatorBoxAdapter";
16
+ import { ParameterOwner } from "../ParameterOwner";
17
+ export class ModulationBoxAdapter {
18
+ constructor(context, box) {
19
+ _ModulationBoxAdapter_terminator.set(this, new Terminator());
20
+ _ModulationBoxAdapter_context.set(this, void 0);
21
+ _ModulationBoxAdapter_box.set(this, void 0);
22
+ _ModulationBoxAdapter_parametric.set(this, void 0);
23
+ __classPrivateFieldSet(this, _ModulationBoxAdapter_context, context, "f");
24
+ __classPrivateFieldSet(this, _ModulationBoxAdapter_box, box, "f");
25
+ __classPrivateFieldSet(this, _ModulationBoxAdapter_parametric, __classPrivateFieldGet(this, _ModulationBoxAdapter_terminator, "f").own(new ParameterAdapterSet(__classPrivateFieldGet(this, _ModulationBoxAdapter_context, "f"))), "f");
26
+ this.namedParameter = {
27
+ depth: __classPrivateFieldGet(this, _ModulationBoxAdapter_parametric, "f").createParameter(box.depth, ValueMapping.bipolar(), StringMapping.percent({ fractionDigits: 0 }), "Depth", 0.5)
28
+ };
29
+ // The depth's automation lane lives on the modulator that drives it, so it shows up in that group.
30
+ const registration = __classPrivateFieldGet(this, _ModulationBoxAdapter_terminator, "f").own(new Terminator());
31
+ __classPrivateFieldGet(this, _ModulationBoxAdapter_terminator, "f").own(box.source.catchupAndSubscribe(() => {
32
+ registration.terminate();
33
+ box.source.targetVertex
34
+ .flatMap(vertex => __classPrivateFieldGet(this, _ModulationBoxAdapter_context, "f").boxAdapters.optAdapter(vertex.box))
35
+ .ifSome(adapter => {
36
+ if (isModulatorBoxAdapter(adapter)) {
37
+ registration.own(this.namedParameter.depth.registerTracks(adapter.tracks));
38
+ }
39
+ });
40
+ }));
41
+ }
42
+ get box() { return __classPrivateFieldGet(this, _ModulationBoxAdapter_box, "f"); }
43
+ get uuid() { return __classPrivateFieldGet(this, _ModulationBoxAdapter_box, "f").address.uuid; }
44
+ get address() { return __classPrivateFieldGet(this, _ModulationBoxAdapter_box, "f").address; }
45
+ get enabled() { return __classPrivateFieldGet(this, _ModulationBoxAdapter_box, "f").enabled.getValue(); }
46
+ get depth() { return __classPrivateFieldGet(this, _ModulationBoxAdapter_box, "f").depth.getValue(); }
47
+ get source() {
48
+ return __classPrivateFieldGet(this, _ModulationBoxAdapter_context, "f").boxAdapters.adapterFor(__classPrivateFieldGet(this, _ModulationBoxAdapter_box, "f").source.targetVertex.unwrap("no modulator").box, isModulatorBoxAdapter);
49
+ }
50
+ /// `None` while the target field has no registered parameter adapter yet.
51
+ get target() {
52
+ return __classPrivateFieldGet(this, _ModulationBoxAdapter_box, "f").target.targetVertex
53
+ .flatMap(vertex => __classPrivateFieldGet(this, _ModulationBoxAdapter_context, "f").parameterFieldAdapters.opt(vertex.address));
54
+ }
55
+ get targetAudioUnit() {
56
+ return __classPrivateFieldGet(this, _ModulationBoxAdapter_box, "f").target.targetVertex.flatMap(vertex => ParameterOwner.audioUnitOf(__classPrivateFieldGet(this, _ModulationBoxAdapter_context, "f"), vertex));
57
+ }
58
+ get targetOwner() {
59
+ return __classPrivateFieldGet(this, _ModulationBoxAdapter_box, "f").target.targetVertex.flatMap(vertex => ParameterOwner.nameOf(__classPrivateFieldGet(this, _ModulationBoxAdapter_context, "f"), vertex));
60
+ }
61
+ /// The owner's name, kept current: renaming the device the target belongs to notifies again.
62
+ catchupAndSubscribeTargetOwner(observer) {
63
+ const vertex = __classPrivateFieldGet(this, _ModulationBoxAdapter_box, "f").target.targetVertex;
64
+ if (vertex.isEmpty()) {
65
+ observer("");
66
+ return Terminable.Empty;
67
+ }
68
+ return ParameterOwner.catchupAndSubscribeName(__classPrivateFieldGet(this, _ModulationBoxAdapter_context, "f"), vertex.unwrap(), observer);
69
+ }
70
+ terminate() { __classPrivateFieldGet(this, _ModulationBoxAdapter_terminator, "f").terminate(); }
71
+ }
72
+ _ModulationBoxAdapter_terminator = new WeakMap(), _ModulationBoxAdapter_context = new WeakMap(), _ModulationBoxAdapter_box = new WeakMap(), _ModulationBoxAdapter_parametric = new WeakMap();
@@ -0,0 +1,35 @@
1
+ import { Address, BooleanField, Box, Int32Field, StringField } from "@opendaw/lib-box";
2
+ import { LfoModulatorBox, MacroModulatorBox, RandomModulatorBox, StepsModulatorBox } from "@opendaw/studio-boxes";
3
+ import { AssertType, StringMapping, Terminator, unitValue, UUID } from "@opendaw/lib-std";
4
+ import { IndexedBoxAdapter } from "../IndexedBoxAdapterCollection";
5
+ import { BoxAdaptersContext } from "../BoxAdaptersContext";
6
+ import { ParameterAdapterSet } from "../ParameterAdapterSet";
7
+ import { AutomatableParameterFieldAdapter } from "../AutomatableParameterFieldAdapter";
8
+ import { FieldParameterTracks } from "../timeline/ParameterTracks";
9
+ import { ModulationBoxAdapter } from "./ModulationBoxAdapter";
10
+ export declare const rangeStringMapping: (bipolar: BooleanField) => StringMapping<unitValue>;
11
+ export declare const polarityStringMapping: (bipolar: BooleanField) => StringMapping<unitValue>;
12
+ export type ModulatorBox = LfoModulatorBox | StepsModulatorBox | MacroModulatorBox | RandomModulatorBox;
13
+ export declare const isModulatorBox: (box: Box) => box is ModulatorBox;
14
+ export declare abstract class ModulatorBoxAdapter<BOX extends ModulatorBox = ModulatorBox> implements IndexedBoxAdapter {
15
+ #private;
16
+ protected readonly terminator: Terminator;
17
+ protected readonly context: BoxAdaptersContext;
18
+ protected readonly parametric: ParameterAdapterSet;
19
+ readonly tracks: FieldParameterTracks;
20
+ readonly amount: AutomatableParameterFieldAdapter<unitValue>;
21
+ protected constructor(context: BoxAdaptersContext, box: BOX);
22
+ get box(): BOX;
23
+ get uuid(): UUID.Bytes;
24
+ get address(): Address;
25
+ get label(): string;
26
+ get labelField(): StringField;
27
+ get enabled(): boolean;
28
+ get indexField(): Int32Field;
29
+ get bipolarField(): BooleanField;
30
+ get assignments(): ReadonlyArray<ModulationBoxAdapter>;
31
+ protected registerParameterTracks(): void;
32
+ terminate(): void;
33
+ }
34
+ export declare const isModulatorBoxAdapter: AssertType<ModulatorBoxAdapter>;
35
+ //# sourceMappingURL=ModulatorBoxAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModulatorBoxAdapter.d.ts","sourceRoot":"","sources":["../../src/modulation/ModulatorBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AACpF,OAAO,EACH,eAAe,EACf,iBAAiB,EAEjB,kBAAkB,EAClB,iBAAiB,EACpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAEH,UAAU,EAGV,aAAa,EAEb,UAAU,EACV,SAAS,EACT,IAAI,EAEP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAC,gCAAgC,EAAC,MAAM,qCAAqC,CAAA;AACpF,OAAO,EAAC,oBAAoB,EAAC,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAA;AAI3D,eAAO,MAAM,kBAAkB,GAAI,SAAS,YAAY,KAAG,aAAa,CAAC,SAAS,CAOhF,CAAA;AAEF,eAAO,MAAM,qBAAqB,GAAI,SAAS,YAAY,KAAG,aAAa,CAAC,SAAS,CAQnF,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,kBAAkB,CAAA;AAEvG,eAAO,MAAM,cAAc,GAAI,KAAK,GAAG,KAAG,GAAG,IAAI,YAA6C,CAAA;AAE9F,8BAAsB,mBAAmB,CAAC,GAAG,SAAS,YAAY,GAAG,YAAY,CAAE,YAAW,iBAAiB;;IAC3G,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAmB;IAC5D,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;IAC9C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAA;IAClD,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAA;IACrC,QAAQ,CAAC,MAAM,EAAE,gCAAgC,CAAC,SAAS,CAAC,CAAA;IAI5D,SAAS,aAAa,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IAU3D,IAAI,GAAG,IAAI,GAAG,CAAmB;IACjC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,KAAK,IAAI,MAAM,CAAoC;IACvD,IAAI,UAAU,IAAI,WAAW,CAAyB;IACtD,IAAI,OAAO,IAAI,OAAO,CAAsC;IAC5D,IAAI,UAAU,IAAI,UAAU,CAAyB;IACrD,IAAI,YAAY,IAAI,YAAY,CAA2B;IAE3D,IAAI,WAAW,IAAI,aAAa,CAAC,oBAAoB,CAAC,CAGrD;IAID,SAAS,CAAC,uBAAuB,IAAI,IAAI;IAOzC,SAAS,IAAI,IAAI;CACpB;AAED,eAAO,MAAM,qBAAqB,EAAE,UAAU,CAAC,mBAAmB,CACkC,CAAA"}
@@ -0,0 +1,69 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _ModulatorBoxAdapter_box;
13
+ import { ModulationBox } from "@opendaw/studio-boxes";
14
+ import { asInstanceOf, isInstanceOf, Terminator, ValueMapping } from "@opendaw/lib-std";
15
+ import { ParameterAdapterSet } from "../ParameterAdapterSet";
16
+ import { FieldParameterTracks } from "../timeline/ParameterTracks";
17
+ import { ModulationBoxAdapter } from "./ModulationBoxAdapter";
18
+ const percent = (value) => (value * 100.0).toFixed(0);
19
+ export const rangeStringMapping = (bipolar) => ({
20
+ x: (value) => ({ value: `${bipolar.getValue() ? "±" : "+"}${percent(value)}`, unit: "%" }),
21
+ y: (text) => {
22
+ const value = parseFloat(text.replace("±", "").replace("+", "").trim());
23
+ return isNaN(value) ? { type: "unknown", value: text.trim() } : { type: "explicit", value: value / 100.0 };
24
+ }
25
+ });
26
+ export const polarityStringMapping = (bipolar) => ({
27
+ x: (value) => ({ value: percent(bipolar.getValue() ? value * 2.0 - 1.0 : value), unit: "%" }),
28
+ y: (text) => {
29
+ const value = parseFloat(text.replace("%", "").trim());
30
+ if (isNaN(value)) {
31
+ return { type: "unknown", value: text.trim() };
32
+ }
33
+ return { type: "explicit", value: bipolar.getValue() ? value / 200.0 + 0.5 : value / 100.0 };
34
+ }
35
+ });
36
+ export const isModulatorBox = (box) => box.tags.type === "modulator";
37
+ export class ModulatorBoxAdapter {
38
+ constructor(context, box) {
39
+ this.terminator = new Terminator();
40
+ _ModulatorBoxAdapter_box.set(this, void 0);
41
+ this.context = context;
42
+ __classPrivateFieldSet(this, _ModulatorBoxAdapter_box, box, "f");
43
+ this.parametric = this.terminator.own(new ParameterAdapterSet(context));
44
+ this.tracks = this.terminator.own(new FieldParameterTracks(box.graph, box.tracks, context.boxAdapters));
45
+ this.amount = this.parametric.createParameter(box.amount, ValueMapping.unipolar(), rangeStringMapping(box.bipolar), "Range");
46
+ }
47
+ get box() { return __classPrivateFieldGet(this, _ModulatorBoxAdapter_box, "f"); }
48
+ get uuid() { return __classPrivateFieldGet(this, _ModulatorBoxAdapter_box, "f").address.uuid; }
49
+ get address() { return __classPrivateFieldGet(this, _ModulatorBoxAdapter_box, "f").address; }
50
+ get label() { return __classPrivateFieldGet(this, _ModulatorBoxAdapter_box, "f").label.getValue(); }
51
+ get labelField() { return __classPrivateFieldGet(this, _ModulatorBoxAdapter_box, "f").label; }
52
+ get enabled() { return __classPrivateFieldGet(this, _ModulatorBoxAdapter_box, "f").enabled.getValue(); }
53
+ get indexField() { return __classPrivateFieldGet(this, _ModulatorBoxAdapter_box, "f").index; }
54
+ get bipolarField() { return __classPrivateFieldGet(this, _ModulatorBoxAdapter_box, "f").bipolar; }
55
+ get assignments() {
56
+ return __classPrivateFieldGet(this, _ModulatorBoxAdapter_box, "f").assignments.pointerHub.incoming()
57
+ .map(({ box }) => this.context.boxAdapters.adapterFor(asInstanceOf(box, ModulationBox), ModulationBoxAdapter));
58
+ }
59
+ /// The subclass creates its parameters, then hands them their lane owner: automation of a modulator's
60
+ /// parameter lives on the modulator, not on an audio unit.
61
+ registerParameterTracks() {
62
+ const parameters = this.parametric.parameters();
63
+ parameters.forEach(parameter => this.terminator.own(parameter.registerTracks(this.tracks)));
64
+ this.terminator.own(__classPrivateFieldGet(this, _ModulatorBoxAdapter_box, "f").bipolar.subscribe(() => parameters.forEach(parameter => parameter.notifyPrinting())));
65
+ }
66
+ terminate() { this.terminator.terminate(); }
67
+ }
68
+ _ModulatorBoxAdapter_box = new WeakMap();
69
+ export const isModulatorBoxAdapter = (adapter) => isInstanceOf(adapter, ModulatorBoxAdapter);
@@ -0,0 +1,25 @@
1
+ import { LfoModulatorBox, MacroModulatorBox, ModulationBox, RandomModulatorBox, StepsModulatorBox } from "@opendaw/studio-boxes";
2
+ import { Field } from "@opendaw/lib-box";
3
+ import { Pointers } from "@opendaw/studio-enums";
4
+ import { Func, unitValue } from "@opendaw/lib-std";
5
+ import { BoxAdaptersContext } from "../BoxAdaptersContext";
6
+ import { ModulatorBox } from "./ModulatorBoxAdapter";
7
+ export declare namespace Modulators {
8
+ const createLfo: (context: BoxAdaptersContext, label?: string) => LfoModulatorBox;
9
+ const createSteps: (context: BoxAdaptersContext, label?: string) => StepsModulatorBox;
10
+ const createMacro: (context: BoxAdaptersContext, label?: string) => MacroModulatorBox;
11
+ const createRandom: (context: BoxAdaptersContext, label?: string) => RandomModulatorBox;
12
+ type Kind = {
13
+ readonly label: string;
14
+ readonly boxName: string;
15
+ readonly create: Func<BoxAdaptersContext, ModulatorBox>;
16
+ };
17
+ const Kinds: ReadonlyArray<Kind>;
18
+ const replace: (context: BoxAdaptersContext, modulator: ModulatorBox, kind: Kind) => ModulatorBox;
19
+ const duplicate: (context: BoxAdaptersContext, modulator: ModulatorBox) => ModulatorBox;
20
+ const duplicateAll: (context: BoxAdaptersContext, modulators: ReadonlyArray<ModulatorBox>) => ReadonlyArray<ModulatorBox>;
21
+ const deleteAll: (context: BoxAdaptersContext, modulators: ReadonlyArray<ModulatorBox>) => void;
22
+ const move: (context: BoxAdaptersContext, modulators: ReadonlyArray<ModulatorBox>, target: ModulatorBox) => void;
23
+ const assign: (context: BoxAdaptersContext, modulator: ModulatorBox, target: Field<Pointers.Modulation>, depth?: unitValue) => ModulationBox;
24
+ }
25
+ //# sourceMappingURL=Modulators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modulators.d.ts","sourceRoot":"","sources":["../../src/modulation/Modulators.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAElB,iBAAiB,EACpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAM,KAAK,EAAe,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAiB,IAAI,EAAkB,SAAS,EAAO,MAAM,kBAAkB,CAAA;AACtF,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAA;AAGlD,yBAAiB,UAAU,CAAC;IACjB,MAAM,SAAS,GAAI,SAAS,kBAAkB,EAAE,QAAQ,MAAM,KAAG,eACkC,CAAA;IAEnG,MAAM,WAAW,GAAI,SAAS,kBAAkB,EAAE,QAAQ,MAAM,KAAG,iBACoC,CAAA;IAEvG,MAAM,WAAW,GAAI,SAAS,kBAAkB,EAAE,QAAQ,MAAM,KAAG,iBACoC,CAAA;IAEvG,MAAM,YAAY,GAAI,SAAS,kBAAkB,EAAE,QAAQ,MAAM,KAAG,kBACqC,CAAA;IAEhH,KAAY,IAAI,GAAG;QACf,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAA;KAC1D,CAAA;IAEM,MAAM,KAAK,EAAE,aAAa,CAAC,IAAI,CAKrC,CAAA;IAGM,MAAM,OAAO,GAAI,SAAS,kBAAkB,EAAE,WAAW,YAAY,EAAE,MAAM,IAAI,KAAG,YAgB1F,CAAA;IAGM,MAAM,SAAS,GAAI,SAAS,kBAAkB,EAAE,WAAW,YAAY,KAAG,YACxC,CAAA;IAKlC,MAAM,YAAY,GAAI,SAAS,kBAAkB,EAC3B,YAAY,aAAa,CAAC,YAAY,CAAC,KAAG,aAAa,CAAC,YAAY,CAehG,CAAA;IAGM,MAAM,SAAS,GAAI,SAAS,kBAAkB,EAAE,YAAY,aAAa,CAAC,YAAY,CAAC,KAAG,IAMhG,CAAA;IAIM,MAAM,IAAI,GAAI,SAAS,kBAAkB,EAC3B,YAAY,aAAa,CAAC,YAAY,CAAC,EACvC,QAAQ,YAAY,KAAG,IAW3C,CAAA;IAqBM,MAAM,MAAM,GAAI,SAAS,kBAAkB,EAC3B,WAAW,YAAY,EACvB,QAAQ,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAClC,QAAO,SAAgB,KAAG,aAM3C,CAAA;CACT"}
@@ -0,0 +1,101 @@
1
+ import { LfoModulatorBox, MacroModulatorBox, ModulationBox, RandomModulatorBox, StepsModulatorBox } from "@opendaw/studio-boxes";
2
+ import { ByteArrayInput, panic, Strings, UUID } from "@opendaw/lib-std";
3
+ /// Every caller is inside an `editing.modify`, so nothing here opens a transaction.
4
+ export var Modulators;
5
+ (function (Modulators) {
6
+ Modulators.createLfo = (context, label) => LfoModulatorBox.create(context.boxGraph, UUID.generate(), box => attach(context, box, label ?? "LFO"));
7
+ Modulators.createSteps = (context, label) => StepsModulatorBox.create(context.boxGraph, UUID.generate(), box => attach(context, box, label ?? "Steps"));
8
+ Modulators.createMacro = (context, label) => MacroModulatorBox.create(context.boxGraph, UUID.generate(), box => attach(context, box, label ?? "Macro"));
9
+ Modulators.createRandom = (context, label) => RandomModulatorBox.create(context.boxGraph, UUID.generate(), box => attach(context, box, label ?? "Random"));
10
+ Modulators.Kinds = [
11
+ { label: "LFO", boxName: "LfoModulatorBox", create: Modulators.createLfo },
12
+ { label: "Steps", boxName: "StepsModulatorBox", create: Modulators.createSteps },
13
+ { label: "Macro", boxName: "MacroModulatorBox", create: Modulators.createMacro },
14
+ { label: "Random", boxName: "RandomModulatorBox", create: Modulators.createRandom }
15
+ ];
16
+ /// Becomes another kind in place: the assignments move over first, so they never see the old box die.
17
+ Modulators.replace = (context, modulator, kind) => {
18
+ const replacement = kind.create(context);
19
+ modulator.assignments.pointerHub.incoming().slice()
20
+ .forEach((pointer) => pointer.refer(replacement.assignments));
21
+ const label = modulator.label.getValue();
22
+ const index = modulator.index.getValue();
23
+ const enabled = modulator.enabled.getValue();
24
+ const bipolar = modulator.bipolar.getValue();
25
+ const amount = modulator.amount.getValue();
26
+ modulator.delete();
27
+ replacement.label.setValue(label);
28
+ replacement.index.setValue(index);
29
+ replacement.enabled.setValue(enabled);
30
+ replacement.bipolar.setValue(bipolar);
31
+ replacement.amount.setValue(amount);
32
+ return replacement;
33
+ };
34
+ /// Same kind and settings, no targets. The copy reads the original's own bytes, so every kind is covered.
35
+ Modulators.duplicate = (context, modulator) => Modulators.duplicateAll(context, [modulator])[0];
36
+ /// Several at once, appended in their list order, each with its own unique name. A box created in THIS
37
+ /// transaction is not in the collection yet (its edges resolve on commit), so index and name are counted
38
+ /// forward here rather than re-read per copy.
39
+ Modulators.duplicateAll = (context, modulators) => {
40
+ const existing = context.rootBoxAdapter.modulators.adapters();
41
+ const taken = existing.map(adapter => adapter.label);
42
+ return modulators.slice()
43
+ .sort((a, b) => a.index.getValue() - b.index.getValue())
44
+ .map((modulator, offset) => {
45
+ const input = new ByteArrayInput(modulator.toArrayBuffer());
46
+ const copy = asModulatorBox(context.boxGraph.createBox(modulator.name, UUID.generate(), box => box.read(input)));
47
+ const label = Strings.getUniqueName(taken, modulator.label.getValue());
48
+ taken.push(label);
49
+ copy.index.setValue(existing.length + offset);
50
+ copy.label.setValue(label);
51
+ return copy;
52
+ });
53
+ };
54
+ /// Delete a whole selection and close the gaps it leaves, so the remaining indices stay 0..n-1.
55
+ Modulators.deleteAll = (context, modulators) => {
56
+ const doomed = new Set(modulators);
57
+ const remaining = context.rootBoxAdapter.modulators.adapters()
58
+ .filter(adapter => !doomed.has(adapter.box));
59
+ doomed.forEach(modulator => modulator.delete());
60
+ reindex(remaining.map(adapter => adapter.box));
61
+ };
62
+ /// Move a set to `target`'s place, keeping the moved ones in their own order. Dropping onto a member of
63
+ /// the set itself is a no-op, so a drag that ends where it started changes nothing.
64
+ Modulators.move = (context, modulators, target) => {
65
+ const moved = new Set(modulators);
66
+ if (moved.has(target) || moved.size === 0) {
67
+ return;
68
+ }
69
+ const ordered = context.rootBoxAdapter.modulators.adapters().map(adapter => adapter.box);
70
+ const stationary = ordered.filter(box => !moved.has(box));
71
+ const insertAt = stationary.indexOf(target);
72
+ if (insertAt < 0) {
73
+ return;
74
+ }
75
+ const dragged = ordered.filter(box => moved.has(box));
76
+ const before = ordered.indexOf(dragged[0]) < ordered.indexOf(target);
77
+ stationary.splice(before ? insertAt + 1 : insertAt, 0, ...dragged);
78
+ reindex(stationary);
79
+ };
80
+ const reindex = (modulators) => modulators.forEach((modulator, index) => modulator.index.setValue(index));
81
+ const asModulatorBox = (box) => box.accept({
82
+ visitLfoModulatorBox: (box) => box,
83
+ visitStepsModulatorBox: (box) => box,
84
+ visitMacroModulatorBox: (box) => box,
85
+ visitRandomModulatorBox: (box) => box
86
+ }) ?? panic(`${box.name} is no modulator`);
87
+ const attach = (context, box, label) => {
88
+ const rootBox = context.rootBoxAdapter.box;
89
+ const existing = context.rootBoxAdapter.modulators.adapters();
90
+ box.collection.refer(rootBox.modulators);
91
+ box.index.setValue(existing.length);
92
+ box.label.setValue(Strings.getUniqueName(existing.map(adapter => adapter.label), label));
93
+ };
94
+ /// A parameter accepts several assignments, so this never replaces an existing one. `depth` is signed.
95
+ Modulators.assign = (context, modulator, target, depth = 0.25) => ModulationBox.create(context.boxGraph, UUID.generate(), box => {
96
+ box.source.refer(modulator.assignments);
97
+ box.target.refer(target);
98
+ box.index.setValue(modulator.assignments.pointerHub.incoming().length);
99
+ box.depth.setValue(depth);
100
+ });
101
+ })(Modulators || (Modulators = {}));
@@ -0,0 +1,24 @@
1
+ import { RandomModulatorBox } from "@opendaw/studio-boxes";
2
+ import { int, unitValue } from "@opendaw/lib-std";
3
+ import { BoxAdaptersContext } from "../BoxAdaptersContext";
4
+ import { ModulatorBoxAdapter } from "./ModulatorBoxAdapter";
5
+ export declare class RandomModulatorBoxAdapter extends ModulatorBoxAdapter<RandomModulatorBox> {
6
+ #private;
7
+ static readonly MaxLoop = 64;
8
+ static readonly MaxLevels = 32;
9
+ static readonly MaxSeed = 999999;
10
+ readonly namedParameter: {
11
+ readonly loop: import("..").AutomatableParameterFieldAdapter<number>;
12
+ readonly rateSync: import("..").AutomatableParameterFieldAdapter<number>;
13
+ readonly rateAbsolute: import("..").AutomatableParameterFieldAdapter<number>;
14
+ readonly phase: import("..").AutomatableParameterFieldAdapter<number>;
15
+ readonly smooth: import("..").AutomatableParameterFieldAdapter<number>;
16
+ readonly levels: import("..").AutomatableParameterFieldAdapter<number>;
17
+ };
18
+ constructor(context: BoxAdaptersContext, box: RandomModulatorBox);
19
+ get loop(): int;
20
+ draw(index: int): unitValue;
21
+ valueAt(step: number): unitValue;
22
+ reseed(): void;
23
+ }
24
+ //# sourceMappingURL=RandomModulatorBoxAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RandomModulatorBoxAdapter.d.ts","sourceRoot":"","sources":["../../src/modulation/RandomModulatorBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAC,GAAG,EAAiB,SAAS,EAAe,MAAM,kBAAkB,CAAA;AAC5E,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAA;AAExD,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAA;AAGzD,qBAAa,yBAA0B,SAAQ,mBAAmB,CAAC,kBAAkB,CAAC;;IAClF,MAAM,CAAC,QAAQ,CAAC,OAAO,MAAK;IAC5B,MAAM,CAAC,QAAQ,CAAC,SAAS,MAAK;IAC9B,MAAM,CAAC,QAAQ,CAAC,OAAO,UAAS;IAEhC,QAAQ,CAAC,cAAc;;;;;;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,kBAAkB;IAMhE,IAAI,IAAI,IAAI,GAAG,CAAkC;IAEjD,IAAI,CAAC,KAAK,EAAE,GAAG,GAAG,SAAS;IAS3B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAUhC,MAAM,IAAI,IAAI;CAmCjB"}
@@ -0,0 +1,62 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _RandomModulatorBoxAdapter_instances, _a, _RandomModulatorBoxAdapter_localIndex, _RandomModulatorBoxAdapter_quantize, _RandomModulatorBoxAdapter_wrapParameters;
7
+ import { StringMapping, ValueMapping } from "@opendaw/lib-std";
8
+ import { LfoModulatorBoxAdapter } from "./LfoModulatorBoxAdapter";
9
+ import { ModulatorBoxAdapter } from "./ModulatorBoxAdapter";
10
+ // WASM CONTRACT: `draw` and `quantize` mirror the engine's `modulation::hash_bipolar` / `quantize`.
11
+ export class RandomModulatorBoxAdapter extends ModulatorBoxAdapter {
12
+ constructor(context, box) {
13
+ super(context, box);
14
+ _RandomModulatorBoxAdapter_instances.add(this);
15
+ this.namedParameter = __classPrivateFieldGet(this, _RandomModulatorBoxAdapter_instances, "m", _RandomModulatorBoxAdapter_wrapParameters).call(this, box);
16
+ this.registerParameterTracks();
17
+ }
18
+ get loop() { return this.box.loop.getValue(); }
19
+ draw(index) {
20
+ const seed = this.box.seed.getValue();
21
+ const local = __classPrivateFieldGet(this, _RandomModulatorBoxAdapter_instances, "m", _RandomModulatorBoxAdapter_localIndex).call(this, index);
22
+ let hash = Math.imul(seed, 0x9E3779B1) ^ Math.imul(local, 0x85EBCA77);
23
+ hash = Math.imul(hash ^ (hash >>> 15), 0x2545F491);
24
+ hash ^= hash >>> 13;
25
+ return __classPrivateFieldGet(this, _RandomModulatorBoxAdapter_instances, "m", _RandomModulatorBoxAdapter_quantize).call(this, (hash >>> 0) / 4294967295.0 * 2.0 - 1.0);
26
+ }
27
+ valueAt(step) {
28
+ const index = Math.floor(step);
29
+ const current = this.draw(index);
30
+ const smooth = this.box.smooth.getValue();
31
+ if (smooth <= 0.0) {
32
+ return current;
33
+ }
34
+ const previous = this.draw(index - 1);
35
+ const ramp = Math.min(1.0, (step - index) / smooth);
36
+ return previous + (current - previous) * ramp * ramp * (3.0 - 2.0 * ramp);
37
+ }
38
+ reseed() { this.box.seed.setValue(Math.floor(Math.random() * _a.MaxSeed)); }
39
+ }
40
+ _a = RandomModulatorBoxAdapter, _RandomModulatorBoxAdapter_instances = new WeakSet(), _RandomModulatorBoxAdapter_localIndex = function _RandomModulatorBoxAdapter_localIndex(index) {
41
+ const length = this.loop;
42
+ return length > 0 ? ((index % length) + length) % length : index | 0;
43
+ }, _RandomModulatorBoxAdapter_quantize = function _RandomModulatorBoxAdapter_quantize(value) {
44
+ const levels = this.box.levels.getValue();
45
+ if (levels < 2) {
46
+ return value;
47
+ }
48
+ const steps = levels - 1;
49
+ return Math.min(steps, Math.max(0, Math.floor((value + 1.0) * 0.5 * steps + 0.5))) / steps * 2.0 - 1.0;
50
+ }, _RandomModulatorBoxAdapter_wrapParameters = function _RandomModulatorBoxAdapter_wrapParameters(box) {
51
+ return {
52
+ loop: this.parametric.createParameter(box.loop, ValueMapping.linearInteger(0, _a.MaxLoop), StringMapping.numeric({ unit: "" }), "Loop"),
53
+ rateSync: this.parametric.createParameter(box.rateSync, ValueMapping.linearInteger(0, LfoModulatorBoxAdapter.RateStrings.length - 1), StringMapping.indices("", LfoModulatorBoxAdapter.RateStrings), "Sync"),
54
+ rateAbsolute: this.parametric.createParameter(box.rateAbsolute, ValueMapping.powerByCenter(LfoModulatorBoxAdapter.CenterAbsoluteRate, 0.0, LfoModulatorBoxAdapter.MaxAbsoluteRate), StringMapping.numeric({ unit: "Hz", fractionDigits: 2 }), "Free"),
55
+ phase: this.parametric.createParameter(box.phase, ValueMapping.unipolar(), StringMapping.percent({ fractionDigits: 0 }), "Phase"),
56
+ smooth: this.parametric.createParameter(box.smooth, ValueMapping.unipolar(), StringMapping.percent({ fractionDigits: 0 }), "Smooth"),
57
+ levels: this.parametric.createParameter(box.levels, ValueMapping.linearInteger(0, _a.MaxLevels), StringMapping.numeric({ unit: "" }), "Levels")
58
+ };
59
+ };
60
+ RandomModulatorBoxAdapter.MaxLoop = 64;
61
+ RandomModulatorBoxAdapter.MaxLevels = 32;
62
+ RandomModulatorBoxAdapter.MaxSeed = 999999;
@@ -0,0 +1,42 @@
1
+ import { Float32Field } from "@opendaw/lib-box";
2
+ import { StepsModulatorBox } from "@opendaw/studio-boxes";
3
+ import { int, unitValue } from "@opendaw/lib-std";
4
+ import { BoxAdaptersContext } from "../BoxAdaptersContext";
5
+ import { ModulatorBoxAdapter } from "./ModulatorBoxAdapter";
6
+ export declare enum StepsDirection {
7
+ Forward = 0,
8
+ Backward = 1,
9
+ PingPong = 2,
10
+ Alternate = 3,
11
+ Random = 4
12
+ }
13
+ export type StepsPass = {
14
+ ascending: boolean;
15
+ from: int;
16
+ to: int;
17
+ };
18
+ export declare class StepsModulatorBoxAdapter extends ModulatorBoxAdapter<StepsModulatorBox> {
19
+ #private;
20
+ static readonly MaxSteps = 64;
21
+ static readonly DirectionStrings: ReadonlyArray<string>;
22
+ readonly namedParameter: {
23
+ readonly count: import("..").AutomatableParameterFieldAdapter<number>;
24
+ readonly rateSync: import("..").AutomatableParameterFieldAdapter<number>;
25
+ readonly rateAbsolute: import("..").AutomatableParameterFieldAdapter<number>;
26
+ readonly phase: import("..").AutomatableParameterFieldAdapter<number>;
27
+ readonly smooth: import("..").AutomatableParameterFieldAdapter<number>;
28
+ readonly direction: import("..").AutomatableParameterFieldAdapter<number>;
29
+ };
30
+ constructor(context: BoxAdaptersContext, box: StepsModulatorBox);
31
+ get count(): int;
32
+ get steps(): ReadonlyArray<Float32Field>;
33
+ get passes(): ReadonlyArray<StepsPass>;
34
+ patternAt(step: number, ascending: boolean): unitValue;
35
+ get neutral(): unitValue;
36
+ emitted(stored: unitValue): number;
37
+ stored(emitted: number): unitValue;
38
+ clear(): void;
39
+ randomize(): void;
40
+ rotate(offset: int): void;
41
+ }
42
+ //# sourceMappingURL=StepsModulatorBoxAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepsModulatorBoxAdapter.d.ts","sourceRoot":"","sources":["../../src/modulation/StepsModulatorBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAC,GAAG,EAAiB,SAAS,EAAe,MAAM,kBAAkB,CAAA;AAC5E,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAA;AAExD,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAA;AAGzD,oBAAY,cAAc;IAAE,OAAO,IAAA;IAAE,QAAQ,IAAA;IAAE,QAAQ,IAAA;IAAE,SAAS,IAAA;IAAE,MAAM,IAAA;CAAC;AAE3E,MAAM,MAAM,SAAS,GAAG;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,EAAE,EAAE,GAAG,CAAA;CAAC,CAAA;AAEhE,qBAAa,wBAAyB,SAAQ,mBAAmB,CAAC,iBAAiB,CAAC;;IAChF,MAAM,CAAC,QAAQ,CAAC,QAAQ,MAAK;IAC7B,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,aAAa,CAAC,MAAM,CAAC,CAA8D;IAErH,QAAQ,CAAC,cAAc;;;;;;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,iBAAiB;IAM/D,IAAI,KAAK,IAAI,GAAG,CAAmC;IACnD,IAAI,KAAK,IAAI,aAAa,CAAC,YAAY,CAAC,CAAiC;IAGzE,IAAI,MAAM,IAAI,aAAa,CAAC,SAAS,CAAC,CAcrC;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,SAAS;IA6BtD,IAAI,OAAO,IAAI,SAAS,CAAiD;IAEzE,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAElC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IAElC,KAAK,IAAI,IAAI;IAKb,SAAS,IAAI,IAAI;IAEjB,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI;CAiC5B"}
@@ -0,0 +1,100 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _StepsModulatorBoxAdapter_instances, _a, _StepsModulatorBoxAdapter_predecessor, _StepsModulatorBoxAdapter_activeSteps, _StepsModulatorBoxAdapter_wrapParameters;
7
+ import { StringMapping, ValueMapping } from "@opendaw/lib-std";
8
+ import { LfoModulatorBoxAdapter } from "./LfoModulatorBoxAdapter";
9
+ import { ModulatorBoxAdapter } from "./ModulatorBoxAdapter";
10
+ // WASM CONTRACT: mirrors the engine's `modulation::DIRECTION_*` (crates/engine/src/modulation.rs).
11
+ export var StepsDirection;
12
+ (function (StepsDirection) {
13
+ StepsDirection[StepsDirection["Forward"] = 0] = "Forward";
14
+ StepsDirection[StepsDirection["Backward"] = 1] = "Backward";
15
+ StepsDirection[StepsDirection["PingPong"] = 2] = "PingPong";
16
+ StepsDirection[StepsDirection["Alternate"] = 3] = "Alternate";
17
+ StepsDirection[StepsDirection["Random"] = 4] = "Random";
18
+ })(StepsDirection || (StepsDirection = {}));
19
+ export class StepsModulatorBoxAdapter extends ModulatorBoxAdapter {
20
+ constructor(context, box) {
21
+ super(context, box);
22
+ _StepsModulatorBoxAdapter_instances.add(this);
23
+ this.namedParameter = __classPrivateFieldGet(this, _StepsModulatorBoxAdapter_instances, "m", _StepsModulatorBoxAdapter_wrapParameters).call(this, box);
24
+ this.registerParameterTracks();
25
+ }
26
+ get count() { return this.box.count.getValue(); }
27
+ get steps() { return this.box.steps.fields(); }
28
+ /// The passes the sequence makes over the pattern, each covering the steps `[from, to)` it reaches.
29
+ get passes() {
30
+ const count = Math.max(1, Math.min(this.count, _a.MaxSteps));
31
+ switch (this.box.direction.getValue()) {
32
+ case StepsDirection.Backward:
33
+ return [{ ascending: false, from: 0, to: count }];
34
+ case StepsDirection.PingPong:
35
+ return [{ ascending: true, from: 0, to: count }, { ascending: false, from: 0, to: count }];
36
+ case StepsDirection.Alternate:
37
+ return count < 3
38
+ ? [{ ascending: true, from: 0, to: count }]
39
+ : [{ ascending: true, from: 0, to: count - 1 }, { ascending: false, from: 1, to: count }];
40
+ default:
41
+ return [{ ascending: true, from: 0, to: count }];
42
+ }
43
+ }
44
+ patternAt(step, ascending) {
45
+ const count = Math.max(1, Math.min(this.count, _a.MaxSteps));
46
+ const index = ((Math.floor(step) % count) + count) % count;
47
+ const current = this.steps[index].getValue();
48
+ const smooth = this.box.smooth.getValue();
49
+ if (smooth <= 0.0) {
50
+ return current;
51
+ }
52
+ const local = step - Math.floor(step);
53
+ const traversed = ascending ? local : 1.0 - local;
54
+ const previous = this.steps[__classPrivateFieldGet(this, _StepsModulatorBoxAdapter_instances, "m", _StepsModulatorBoxAdapter_predecessor).call(this, index, count, ascending)].getValue();
55
+ const ramp = Math.min(1.0, traversed / smooth);
56
+ return previous + (current - previous) * ramp * ramp * (3.0 - 2.0 * ramp);
57
+ }
58
+ get neutral() { return this.box.bipolar.getValue() ? 0.5 : 0.0; }
59
+ emitted(stored) { return this.box.bipolar.getValue() ? stored * 2.0 - 1.0 : stored; }
60
+ stored(emitted) { return this.box.bipolar.getValue() ? emitted * 0.5 + 0.5 : emitted; }
61
+ clear() {
62
+ const neutral = this.neutral;
63
+ __classPrivateFieldGet(this, _StepsModulatorBoxAdapter_instances, "m", _StepsModulatorBoxAdapter_activeSteps).call(this).forEach(step => step.setValue(neutral));
64
+ }
65
+ randomize() { __classPrivateFieldGet(this, _StepsModulatorBoxAdapter_instances, "m", _StepsModulatorBoxAdapter_activeSteps).call(this).forEach(step => step.setValue(Math.random())); }
66
+ rotate(offset) {
67
+ const active = __classPrivateFieldGet(this, _StepsModulatorBoxAdapter_instances, "m", _StepsModulatorBoxAdapter_activeSteps).call(this);
68
+ const values = active.map(step => step.getValue());
69
+ const count = values.length;
70
+ active.forEach((step, index) => step.setValue(values[(((index - offset) % count) + count) % count]));
71
+ }
72
+ }
73
+ _a = StepsModulatorBoxAdapter, _StepsModulatorBoxAdapter_instances = new WeakSet(), _StepsModulatorBoxAdapter_predecessor = function _StepsModulatorBoxAdapter_predecessor(index, count, ascending) {
74
+ const wrap = (value) => ((value % count) + count) % count;
75
+ switch (this.box.direction.getValue()) {
76
+ case StepsDirection.PingPong:
77
+ return ascending
78
+ ? (index === 0 ? 0 : index - 1)
79
+ : (index === count - 1 ? count - 1 : index + 1);
80
+ case StepsDirection.Alternate:
81
+ return ascending
82
+ ? (index === 0 ? Math.min(1, count - 1) : index - 1)
83
+ : (index === count - 1 ? Math.max(0, count - 2) : index + 1);
84
+ default:
85
+ return ascending ? wrap(index - 1) : wrap(index + 1);
86
+ }
87
+ }, _StepsModulatorBoxAdapter_activeSteps = function _StepsModulatorBoxAdapter_activeSteps() {
88
+ return this.steps.slice(0, Math.max(1, Math.min(this.count, _a.MaxSteps)));
89
+ }, _StepsModulatorBoxAdapter_wrapParameters = function _StepsModulatorBoxAdapter_wrapParameters(box) {
90
+ return {
91
+ count: this.parametric.createParameter(box.count, ValueMapping.linearInteger(1, _a.MaxSteps), StringMapping.numeric({ unit: "" }), "Steps"),
92
+ rateSync: this.parametric.createParameter(box.rateSync, ValueMapping.linearInteger(0, LfoModulatorBoxAdapter.RateStrings.length - 1), StringMapping.indices("", LfoModulatorBoxAdapter.RateStrings), "Sync"),
93
+ rateAbsolute: this.parametric.createParameter(box.rateAbsolute, ValueMapping.powerByCenter(LfoModulatorBoxAdapter.CenterAbsoluteRate, 0.0, LfoModulatorBoxAdapter.MaxAbsoluteRate), StringMapping.numeric({ unit: "Hz", fractionDigits: 2 }), "Free"),
94
+ phase: this.parametric.createParameter(box.phase, ValueMapping.unipolar(), StringMapping.percent({ fractionDigits: 0 }), "Phase"),
95
+ smooth: this.parametric.createParameter(box.smooth, ValueMapping.unipolar(), StringMapping.percent({ fractionDigits: 0 }), "Smooth"),
96
+ direction: this.parametric.createParameter(box.direction, ValueMapping.linearInteger(0, _a.DirectionStrings.length - 1), StringMapping.indices("", _a.DirectionStrings), "Mode")
97
+ };
98
+ };
99
+ StepsModulatorBoxAdapter.MaxSteps = 64;
100
+ StepsModulatorBoxAdapter.DirectionStrings = ["Forward", "Backward", "Ping-Pong", "Alternate", "Random"];
@@ -0,0 +1,30 @@
1
+ import { int, Observer, Option, Subscription, Terminable } from "@opendaw/lib-std";
2
+ import { Pointers } from "@opendaw/studio-enums";
3
+ import { TrackBox } from "@opendaw/studio-boxes";
4
+ import { BoxGraph, Field, Vertex } from "@opendaw/lib-box";
5
+ import { IndexedAdapterCollectionListener, IndexedBoxAdapterCollection } from "../IndexedBoxAdapterCollection";
6
+ import { TrackBoxAdapter } from "./TrackBoxAdapter";
7
+ import { BoxAdapters } from "../BoxAdapters";
8
+ import { TrackType } from "./TrackType";
9
+ export interface ParameterTracks extends Terminable {
10
+ create(type: TrackType, target: Vertex<Pointers.Automation | Pointers>, index?: int): TrackBox;
11
+ controls(target: Vertex<Pointers.Automation | Pointers>): Option<TrackBoxAdapter>;
12
+ delete(adapter: TrackBoxAdapter): void;
13
+ values(): ReadonlyArray<TrackBoxAdapter>;
14
+ get collection(): IndexedBoxAdapterCollection<TrackBoxAdapter, Pointers.TrackCollection>;
15
+ catchupAndSubscribe(listener: IndexedAdapterCollectionListener<TrackBoxAdapter>): Subscription;
16
+ subscribeAnyChange(observer: Observer<void>): Subscription;
17
+ }
18
+ export declare class FieldParameterTracks implements ParameterTracks {
19
+ #private;
20
+ constructor(graph: BoxGraph, field: Field<Pointers.TrackCollection>, boxAdapters: BoxAdapters);
21
+ create(type: TrackType, target: Vertex<Pointers.Automation | Pointers>, index?: int): TrackBox;
22
+ controls(target: Vertex<Pointers.Automation | Pointers>): Option<TrackBoxAdapter>;
23
+ delete(adapter: TrackBoxAdapter): void;
24
+ get collection(): IndexedBoxAdapterCollection<TrackBoxAdapter, Pointers.TrackCollection>;
25
+ values(): ReadonlyArray<TrackBoxAdapter>;
26
+ catchupAndSubscribe(listener: IndexedAdapterCollectionListener<TrackBoxAdapter>): Subscription;
27
+ subscribeAnyChange(observer: Observer<void>): Subscription;
28
+ terminate(): void;
29
+ }
30
+ //# sourceMappingURL=ParameterTracks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParameterTracks.d.ts","sourceRoot":"","sources":["../../src/timeline/ParameterTracks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAY,QAAQ,EAAE,MAAM,EAAoB,YAAY,EAAE,UAAU,EAAO,MAAM,kBAAkB,CAAA;AAClH,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAC,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAC,gCAAgC,EAAE,2BAA2B,EAAC,MAAM,gCAAgC,CAAA;AAC5G,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAA;AAIrC,MAAM,WAAW,eAAgB,SAAQ,UAAU;IAC/C,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAA;IAC9F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,CAAA;IACjF,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAA;IACtC,MAAM,IAAI,aAAa,CAAC,eAAe,CAAC,CAAA;IACxC,IAAI,UAAU,IAAI,2BAA2B,CAAC,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAA;IACxF,mBAAmB,CAAC,QAAQ,EAAE,gCAAgC,CAAC,eAAe,CAAC,GAAG,YAAY,CAAA;IAC9F,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAA;CAC7D;AAED,qBAAa,oBAAqB,YAAW,eAAe;;gBAS5C,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,WAAW;IAgB7F,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,QAAQ;IAS9F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC;IAKjF,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAUtC,IAAI,UAAU,IAAI,2BAA2B,CAAC,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,CAA0B;IAElH,MAAM,IAAI,aAAa,CAAC,eAAe,CAAC;IAExC,mBAAmB,CAAC,QAAQ,EAAE,gCAAgC,CAAC,eAAe,CAAC,GAAG,YAAY;IAI9F,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY;IAE1D,SAAS,IAAI,IAAI;CAMpB"}
@@ -0,0 +1,75 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _FieldParameterTracks_graph, _FieldParameterTracks_field, _FieldParameterTracks_regionNotifier, _FieldParameterTracks_collection, _FieldParameterTracks_subscriptions, _FieldParameterTracks_subscription;
13
+ import { Notifier, Option, panic, UUID } from "@opendaw/lib-std";
14
+ import { Pointers } from "@opendaw/studio-enums";
15
+ import { TrackBox } from "@opendaw/studio-boxes";
16
+ import { IndexedBoxAdapterCollection } from "../IndexedBoxAdapterCollection";
17
+ import { TrackBoxAdapter } from "./TrackBoxAdapter";
18
+ export class FieldParameterTracks {
19
+ constructor(graph, field, boxAdapters) {
20
+ _FieldParameterTracks_graph.set(this, void 0);
21
+ _FieldParameterTracks_field.set(this, void 0);
22
+ _FieldParameterTracks_regionNotifier.set(this, new Notifier());
23
+ _FieldParameterTracks_collection.set(this, void 0);
24
+ _FieldParameterTracks_subscriptions.set(this, void 0);
25
+ _FieldParameterTracks_subscription.set(this, void 0);
26
+ __classPrivateFieldSet(this, _FieldParameterTracks_graph, graph, "f");
27
+ __classPrivateFieldSet(this, _FieldParameterTracks_field, field, "f");
28
+ __classPrivateFieldSet(this, _FieldParameterTracks_collection, IndexedBoxAdapterCollection.create(field, box => boxAdapters.adapterFor(box, TrackBoxAdapter), Pointers.TrackCollection), "f");
29
+ __classPrivateFieldSet(this, _FieldParameterTracks_subscriptions, UUID.newSet(({ uuid }) => uuid), "f");
30
+ __classPrivateFieldSet(this, _FieldParameterTracks_subscription, __classPrivateFieldGet(this, _FieldParameterTracks_collection, "f").catchupAndSubscribe({
31
+ onAdd: (adapter) => __classPrivateFieldGet(this, _FieldParameterTracks_subscriptions, "f").add({
32
+ uuid: adapter.uuid,
33
+ subscription: adapter.regions.subscribeChanges(() => __classPrivateFieldGet(this, _FieldParameterTracks_regionNotifier, "f").notify())
34
+ }),
35
+ onRemove: ({ uuid }) => __classPrivateFieldGet(this, _FieldParameterTracks_subscriptions, "f").removeByKey(uuid).subscription.terminate(),
36
+ onReorder: (_adapter) => { }
37
+ }), "f");
38
+ }
39
+ create(type, target, index) {
40
+ return TrackBox.create(__classPrivateFieldGet(this, _FieldParameterTracks_graph, "f"), UUID.generate(), box => {
41
+ box.index.setValue(index ?? __classPrivateFieldGet(this, _FieldParameterTracks_collection, "f").getMinFreeIndex());
42
+ box.type.setValue(type);
43
+ box.tracks.refer(__classPrivateFieldGet(this, _FieldParameterTracks_field, "f"));
44
+ box.target.refer(target);
45
+ });
46
+ }
47
+ controls(target) {
48
+ return Option.wrap(__classPrivateFieldGet(this, _FieldParameterTracks_collection, "f").adapters()
49
+ .find(adapter => adapter.target.targetVertex.contains(target), false));
50
+ }
51
+ delete(adapter) {
52
+ const adapters = __classPrivateFieldGet(this, _FieldParameterTracks_collection, "f").adapters();
53
+ const deleteIndex = adapters.indexOf(adapter);
54
+ if (deleteIndex === -1) {
55
+ return panic(`Cannot delete ${adapter}. Does not exist.`);
56
+ }
57
+ for (let index = deleteIndex + 1; index < adapters.length; index++) {
58
+ adapters[index].indexField.setValue(index - 1);
59
+ }
60
+ adapter.box.delete();
61
+ }
62
+ get collection() { return __classPrivateFieldGet(this, _FieldParameterTracks_collection, "f"); }
63
+ values() { return __classPrivateFieldGet(this, _FieldParameterTracks_collection, "f").adapters(); }
64
+ catchupAndSubscribe(listener) {
65
+ return __classPrivateFieldGet(this, _FieldParameterTracks_collection, "f").catchupAndSubscribe(listener);
66
+ }
67
+ subscribeAnyChange(observer) { return __classPrivateFieldGet(this, _FieldParameterTracks_regionNotifier, "f").subscribe(observer); }
68
+ terminate() {
69
+ __classPrivateFieldGet(this, _FieldParameterTracks_collection, "f").terminate();
70
+ __classPrivateFieldGet(this, _FieldParameterTracks_subscription, "f").terminate();
71
+ __classPrivateFieldGet(this, _FieldParameterTracks_subscriptions, "f").forEach(({ subscription }) => subscription.terminate());
72
+ __classPrivateFieldGet(this, _FieldParameterTracks_subscriptions, "f").clear();
73
+ }
74
+ }
75
+ _FieldParameterTracks_graph = new WeakMap(), _FieldParameterTracks_field = new WeakMap(), _FieldParameterTracks_regionNotifier = new WeakMap(), _FieldParameterTracks_collection = new WeakMap(), _FieldParameterTracks_subscriptions = new WeakMap(), _FieldParameterTracks_subscription = new WeakMap();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opendaw/studio-adapters",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "license": "LGPL-3.0-or-later",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -25,13 +25,13 @@
25
25
  "pregenerate-all-boxes": "npm run build -w @opendaw/studio-forge-boxes && npm run build -w @opendaw/studio-boxes"
26
26
  },
27
27
  "dependencies": {
28
- "@opendaw/lib-box": "^0.0.91",
28
+ "@opendaw/lib-box": "^0.0.92",
29
29
  "@opendaw/lib-dsp": "^0.0.91",
30
- "@opendaw/lib-fusion": "^0.0.100",
30
+ "@opendaw/lib-fusion": "^0.0.101",
31
31
  "@opendaw/lib-midi": "^0.0.72",
32
32
  "@opendaw/lib-runtime": "^0.0.84",
33
33
  "@opendaw/lib-std": "^0.0.83",
34
- "@opendaw/studio-boxes": "^0.0.106",
34
+ "@opendaw/studio-boxes": "^0.0.107",
35
35
  "@opendaw/studio-enums": "^0.1.0",
36
36
  "soundfont2": "^0.5.0"
37
37
  },
@@ -39,5 +39,5 @@
39
39
  "@opendaw/eslint-config": "^0.0.28",
40
40
  "@opendaw/typescript-config": "^0.0.32"
41
41
  },
42
- "gitHead": "4356bb141de31c0d27562bc9e8b310e90861ea10"
42
+ "gitHead": "e1495bbd78b89e262bcd72141dde0344bc328326"
43
43
  }