@opendaw/studio-adapters 0.3.3 → 0.3.5

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 (76) hide show
  1. package/dist/BoxAdapters.d.ts.map +1 -1
  2. package/dist/BoxAdapters.js +8 -0
  3. package/dist/DeviceAdapter.d.ts +17 -1
  4. package/dist/DeviceAdapter.d.ts.map +1 -1
  5. package/dist/DeviceManualUrls.d.ts +3 -0
  6. package/dist/DeviceManualUrls.d.ts.map +1 -1
  7. package/dist/DeviceManualUrls.js +3 -0
  8. package/dist/Validator.d.ts.map +1 -1
  9. package/dist/Validator.js +4 -19
  10. package/dist/audio-unit/AudioUnitBoxAdapter.d.ts +2 -1
  11. package/dist/audio-unit/AudioUnitBoxAdapter.d.ts.map +1 -1
  12. package/dist/audio-unit/AudioUnitBoxAdapter.js +1 -0
  13. package/dist/audio-unit/AuxSendBoxAdapter.d.ts +1 -0
  14. package/dist/audio-unit/AuxSendBoxAdapter.d.ts.map +1 -1
  15. package/dist/audio-unit/AuxSendBoxAdapter.js +1 -0
  16. package/dist/devices/audio-effects/AudioEffectComposite/AudioCompositeAdapter.d.ts +2 -1
  17. package/dist/devices/audio-effects/AudioEffectComposite/AudioCompositeAdapter.d.ts.map +1 -1
  18. package/dist/devices/audio-effects/AudioEffectComposite/AudioEffectCompositeCellBoxAdapter.d.ts +8 -5
  19. package/dist/devices/audio-effects/AudioEffectComposite/AudioEffectCompositeCellBoxAdapter.d.ts.map +1 -1
  20. package/dist/devices/audio-effects/AudioEffectComposite/AudioEffectCompositeCellBoxAdapter.js +9 -3
  21. package/dist/devices/audio-effects/AudioEffectCompositeBoxAdapter.d.ts +2 -0
  22. package/dist/devices/audio-effects/AudioEffectCompositeBoxAdapter.d.ts.map +1 -1
  23. package/dist/devices/audio-effects/AudioEffectCompositeBoxAdapter.js +1 -0
  24. package/dist/devices/audio-effects/AudioSinkDeviceBoxAdapter.d.ts +33 -0
  25. package/dist/devices/audio-effects/AudioSinkDeviceBoxAdapter.d.ts.map +1 -0
  26. package/dist/devices/audio-effects/AudioSinkDeviceBoxAdapter.js +60 -0
  27. package/dist/devices/audio-effects/CrusherDeviceBoxAdapter.js +1 -1
  28. package/dist/devices/audio-effects/FrequencySplitBoxAdapter.d.ts +3 -0
  29. package/dist/devices/audio-effects/FrequencySplitBoxAdapter.d.ts.map +1 -1
  30. package/dist/devices/audio-effects/FrequencySplitBoxAdapter.js +8 -0
  31. package/dist/devices/audio-effects/StereoCompositeBoxAdapter.d.ts +2 -0
  32. package/dist/devices/audio-effects/StereoCompositeBoxAdapter.d.ts.map +1 -1
  33. package/dist/devices/audio-effects/StereoCompositeBoxAdapter.js +1 -0
  34. package/dist/devices/instruments/Cubed/CubedStep.js +1 -1
  35. package/dist/devices/instruments/InstrumentComposite/InstrumentCompositeCellBoxAdapter.d.ts +49 -0
  36. package/dist/devices/instruments/InstrumentComposite/InstrumentCompositeCellBoxAdapter.d.ts.map +1 -0
  37. package/dist/devices/instruments/InstrumentComposite/InstrumentCompositeCellBoxAdapter.js +88 -0
  38. package/dist/devices/instruments/InstrumentCompositeBoxAdapter.d.ts +33 -0
  39. package/dist/devices/instruments/InstrumentCompositeBoxAdapter.d.ts.map +1 -0
  40. package/dist/devices/instruments/InstrumentCompositeBoxAdapter.js +55 -0
  41. package/dist/devices/instruments/NanoDeviceBoxAdapter.d.ts +14 -1
  42. package/dist/devices/instruments/NanoDeviceBoxAdapter.d.ts.map +1 -1
  43. package/dist/devices/instruments/NanoDeviceBoxAdapter.js +28 -5
  44. package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.d.ts +2 -1
  45. package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.d.ts.map +1 -1
  46. package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.js +1 -0
  47. package/dist/devices/instruments/Tubular/Dx7Sysex.d.ts +23 -0
  48. package/dist/devices/instruments/Tubular/Dx7Sysex.d.ts.map +1 -0
  49. package/dist/devices/instruments/Tubular/Dx7Sysex.js +159 -0
  50. package/dist/devices/instruments/Tubular/TubularPreset.d.ts +6 -0
  51. package/dist/devices/instruments/Tubular/TubularPreset.d.ts.map +1 -0
  52. package/dist/devices/instruments/Tubular/TubularPreset.js +39 -0
  53. package/dist/devices/instruments/TubularDeviceBoxAdapter.d.ts +100 -0
  54. package/dist/devices/instruments/TubularDeviceBoxAdapter.d.ts.map +1 -0
  55. package/dist/devices/instruments/TubularDeviceBoxAdapter.js +177 -0
  56. package/dist/factories/InstrumentBox.d.ts +2 -2
  57. package/dist/factories/InstrumentBox.d.ts.map +1 -1
  58. package/dist/factories/InstrumentFactories.d.ts +9 -2
  59. package/dist/factories/InstrumentFactories.d.ts.map +1 -1
  60. package/dist/factories/InstrumentFactories.js +40 -4
  61. package/dist/index.d.ts +7 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +7 -0
  64. package/dist/preset/PresetDecoder.d.ts +3 -2
  65. package/dist/preset/PresetDecoder.d.ts.map +1 -1
  66. package/dist/preset/PresetDecoder.js +51 -6
  67. package/dist/preset/PresetEncoder.d.ts +1 -0
  68. package/dist/preset/PresetEncoder.d.ts.map +1 -1
  69. package/dist/preset/PresetEncoder.js +36 -0
  70. package/dist/timeline/RegionOverlap.d.ts +13 -0
  71. package/dist/timeline/RegionOverlap.d.ts.map +1 -0
  72. package/dist/timeline/RegionOverlap.js +32 -0
  73. package/dist/transfer/TransferUtils.d.ts +4 -1
  74. package/dist/transfer/TransferUtils.d.ts.map +1 -1
  75. package/dist/transfer/TransferUtils.js +18 -0
  76. package/package.json +11 -11
@@ -1,6 +1,6 @@
1
1
  export var CubedStep;
2
2
  (function (CubedStep) {
3
- CubedStep.DefaultNote = 60;
3
+ CubedStep.DefaultNote = 36;
4
4
  // one int32 per step: midi-note 0..6, active 7, slide 8, accent 9
5
5
  CubedStep.pack = (step) => (step.note & 0x7F)
6
6
  | ((step.active ? 1 : 0) << 7)
@@ -0,0 +1,49 @@
1
+ import { Pointers } from "@opendaw/studio-enums";
2
+ import { InstrumentCompositeCellBox } from "@opendaw/studio-boxes";
3
+ import { Option, Procedure, Subscription, UUID } from "@opendaw/lib-std";
4
+ import { Address, BooleanField, Field, Int32Field } from "@opendaw/lib-box";
5
+ import { AudioEffectDeviceAdapter, CompositeCell, DeviceHost, MidiEffectDeviceAdapter } from "../../../DeviceAdapter";
6
+ import { LabeledAudioOutput } from "../../../LabeledAudioOutputsOwner";
7
+ import { IndexedBoxAdapter, IndexedBoxAdapterCollection } from "../../../IndexedBoxAdapterCollection";
8
+ import { BoxAdaptersContext } from "../../../BoxAdaptersContext";
9
+ import { AudioUnitInput } from "../../../audio-unit/AudioUnitInput";
10
+ import { AudioUnitInputAdapter } from "../../../audio-unit/AudioUnitInputAdapter";
11
+ import { AudioUnitBoxAdapter } from "../../../audio-unit/AudioUnitBoxAdapter";
12
+ import { InstrumentCompositeBoxAdapter } from "../InstrumentCompositeBoxAdapter";
13
+ export declare class InstrumentCompositeCellBoxAdapter implements CompositeCell, IndexedBoxAdapter {
14
+ #private;
15
+ readonly class = "device-host";
16
+ readonly cellKind = "instrument";
17
+ readonly namedParameter: {
18
+ readonly gain: import("../../..").AutomatableParameterFieldAdapter<number>;
19
+ readonly pan: import("../../..").AutomatableParameterFieldAdapter<number>;
20
+ readonly mute: import("../../..").AutomatableParameterFieldAdapter<boolean>;
21
+ readonly solo: import("../../..").AutomatableParameterFieldAdapter<boolean>;
22
+ };
23
+ constructor(context: BoxAdaptersContext, box: InstrumentCompositeCellBox);
24
+ get box(): InstrumentCompositeCellBox;
25
+ get uuid(): UUID.Bytes;
26
+ get address(): Address;
27
+ get indexField(): Int32Field;
28
+ get minimizedField(): BooleanField;
29
+ get label(): string;
30
+ get input(): AudioUnitInput;
31
+ get midiEffects(): Option<IndexedBoxAdapterCollection<MidiEffectDeviceAdapter, Pointers.MIDIEffectHost>>;
32
+ get audioEffects(): Option<IndexedBoxAdapterCollection<AudioEffectDeviceAdapter, Pointers.AudioEffectHost>>;
33
+ get midiEffectsField(): Option<Field<Pointers.MIDIEffectHost>>;
34
+ get audioEffectsField(): Option<Field<Pointers.AudioEffectHost>>;
35
+ get inputAdapter(): Option<AudioUnitInputAdapter>;
36
+ get inputField(): Field<Pointers.InstrumentHost | Pointers.AudioOutput>;
37
+ get tracksField(): Field<Pointers.TrackCollection>;
38
+ get hostsInstrument(): boolean;
39
+ get isAudioUnit(): boolean;
40
+ compositeDevice(): InstrumentCompositeBoxAdapter;
41
+ deviceHost(): DeviceHost;
42
+ asCompositeCell(): Option<CompositeCell>;
43
+ siblings(): ReadonlyArray<CompositeCell>;
44
+ subscribeSiblings(observer: Procedure<ReadonlyArray<CompositeCell>>): Subscription;
45
+ audioUnitBoxAdapter(): AudioUnitBoxAdapter;
46
+ labeledAudioOutputs(): Iterable<LabeledAudioOutput>;
47
+ terminate(): void;
48
+ }
49
+ //# sourceMappingURL=InstrumentCompositeCellBoxAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstrumentCompositeCellBoxAdapter.d.ts","sourceRoot":"","sources":["../../../../src/devices/instruments/InstrumentComposite/InstrumentCompositeCellBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAC,0BAA0B,EAAC,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAC,MAAM,EAAE,SAAS,EAAiB,YAAY,EAAc,IAAI,EAAe,MAAM,kBAAkB,CAAA;AAC/G,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAC,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAC,wBAAwB,EAAE,aAAa,EAAE,UAAU,EAAW,uBAAuB,EAAC,MAAM,wBAAwB,CAAA;AAC5H,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,iBAAiB,EAAE,2BAA2B,EAAC,MAAM,sCAAsC,CAAA;AACnG,OAAO,EAAC,kBAAkB,EAAC,MAAM,6BAA6B,CAAA;AAE9D,OAAO,EAAC,cAAc,EAAC,MAAM,oCAAoC,CAAA;AACjE,OAAO,EAAC,qBAAqB,EAAC,MAAM,2CAA2C,CAAA;AAC/E,OAAO,EAAC,mBAAmB,EAAC,MAAM,yCAAyC,CAAA;AAC3E,OAAO,EAAC,6BAA6B,EAAC,MAAM,kCAAkC,CAAA;AAE9E,qBAAa,iCAAkC,YAAW,aAAa,EAAE,iBAAiB;;IACtF,QAAQ,CAAC,KAAK,iBAAgB;IAC9B,QAAQ,CAAC,QAAQ,gBAAe;IAYhC,QAAQ,CAAC,cAAc;;;;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,0BAA0B;IAYxE,IAAI,GAAG,IAAI,0BAA0B,CAAmB;IACxD,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,UAAU,IAAI,UAAU,CAAyB;IACrD,IAAI,cAAc,IAAI,YAAY,CAA6B;IAC/D,IAAI,KAAK,IAAI,MAAM,CAAyF;IAC5G,IAAI,KAAK,IAAI,cAAc,CAAqB;IAEhD,IAAI,WAAW,IAAI,MAAM,CAAC,2BAA2B,CAAC,uBAAuB,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAEvG;IACD,IAAI,YAAY,IAAI,MAAM,CAAC,2BAA2B,CAAC,wBAAwB,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC,CAE1G;IACD,IAAI,gBAAgB,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAA4C;IAC1G,IAAI,iBAAiB,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAA6C;IAC7G,IAAI,YAAY,IAAI,MAAM,CAAC,qBAAqB,CAAC,CAA+B;IAChF,IAAI,UAAU,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,GAAG,QAAQ,CAAC,WAAW,CAAC,CAA8B;IACrG,IAAI,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,CAA+C;IACjG,IAAI,eAAe,IAAI,OAAO,CAAc;IAC5C,IAAI,WAAW,IAAI,OAAO,CAAe;IAEzC,eAAe,IAAI,6BAA6B;IAKhD,UAAU,IAAI,UAAU;IACxB,eAAe,IAAI,MAAM,CAAC,aAAa,CAAC;IACxC,QAAQ,IAAI,aAAa,CAAC,aAAa,CAAC;IACxC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,GAAG,YAAY;IAKlF,mBAAmB,IAAI,mBAAmB;IAExC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAOrD,SAAS,IAAI,IAAI;CAWpB"}
@@ -0,0 +1,88 @@
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 _InstrumentCompositeCellBoxAdapter_instances, _InstrumentCompositeCellBoxAdapter_terminator, _InstrumentCompositeCellBoxAdapter_context, _InstrumentCompositeCellBoxAdapter_box, _InstrumentCompositeCellBoxAdapter_input, _InstrumentCompositeCellBoxAdapter_midiEffects, _InstrumentCompositeCellBoxAdapter_audioEffects, _InstrumentCompositeCellBoxAdapter_parametric, _InstrumentCompositeCellBoxAdapter_wrapParameters;
13
+ import { Pointers } from "@opendaw/studio-enums";
14
+ import { Option, StringMapping, Terminator, ValueMapping } from "@opendaw/lib-std";
15
+ import { Devices } from "../../../DeviceAdapter";
16
+ import { IndexedBoxAdapterCollection } from "../../../IndexedBoxAdapterCollection";
17
+ import { ParameterAdapterSet } from "../../../ParameterAdapterSet";
18
+ import { AudioUnitInput } from "../../../audio-unit/AudioUnitInput";
19
+ import { InstrumentCompositeBoxAdapter } from "../InstrumentCompositeBoxAdapter";
20
+ export class InstrumentCompositeCellBoxAdapter {
21
+ constructor(context, box) {
22
+ _InstrumentCompositeCellBoxAdapter_instances.add(this);
23
+ this.class = "device-host";
24
+ this.cellKind = "instrument";
25
+ _InstrumentCompositeCellBoxAdapter_terminator.set(this, new Terminator());
26
+ _InstrumentCompositeCellBoxAdapter_context.set(this, void 0);
27
+ _InstrumentCompositeCellBoxAdapter_box.set(this, void 0);
28
+ _InstrumentCompositeCellBoxAdapter_input.set(this, void 0);
29
+ _InstrumentCompositeCellBoxAdapter_midiEffects.set(this, void 0);
30
+ _InstrumentCompositeCellBoxAdapter_audioEffects.set(this, void 0);
31
+ _InstrumentCompositeCellBoxAdapter_parametric.set(this, void 0);
32
+ __classPrivateFieldSet(this, _InstrumentCompositeCellBoxAdapter_context, context, "f");
33
+ __classPrivateFieldSet(this, _InstrumentCompositeCellBoxAdapter_box, box, "f");
34
+ __classPrivateFieldSet(this, _InstrumentCompositeCellBoxAdapter_input, __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_terminator, "f").own(new AudioUnitInput(box.instrument.pointerHub, context.boxAdapters)), "f");
35
+ __classPrivateFieldSet(this, _InstrumentCompositeCellBoxAdapter_midiEffects, __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_terminator, "f").own(IndexedBoxAdapterCollection.create(box.midiEffects, box => context.boxAdapters.adapterFor(box, Devices.isMidiEffect), Pointers.MIDIEffectHost)), "f");
36
+ __classPrivateFieldSet(this, _InstrumentCompositeCellBoxAdapter_audioEffects, __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_terminator, "f").own(IndexedBoxAdapterCollection.create(box.audioEffects, box => context.boxAdapters.adapterFor(box, Devices.isAudioEffect), Pointers.AudioEffectHost)), "f");
37
+ __classPrivateFieldSet(this, _InstrumentCompositeCellBoxAdapter_parametric, __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_terminator, "f").own(new ParameterAdapterSet(context)), "f");
38
+ this.namedParameter = __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_instances, "m", _InstrumentCompositeCellBoxAdapter_wrapParameters).call(this, box);
39
+ }
40
+ get box() { return __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_box, "f"); }
41
+ get uuid() { return __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_box, "f").address.uuid; }
42
+ get address() { return __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_box, "f").address; }
43
+ get indexField() { return __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_box, "f").index; }
44
+ get minimizedField() { return __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_box, "f").minimized; }
45
+ get label() { return __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_input, "f").label.unwrapOrElse(() => `Layer ${__classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_box, "f").index.getValue() + 1}`); }
46
+ get input() { return __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_input, "f"); }
47
+ get midiEffects() {
48
+ return Option.wrap(__classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_midiEffects, "f"));
49
+ }
50
+ get audioEffects() {
51
+ return Option.wrap(__classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_audioEffects, "f"));
52
+ }
53
+ get midiEffectsField() { return Option.wrap(__classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_box, "f").midiEffects); }
54
+ get audioEffectsField() { return Option.wrap(__classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_box, "f").audioEffects); }
55
+ get inputAdapter() { return __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_input, "f").adapter(); }
56
+ get inputField() { return __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_box, "f").instrument; }
57
+ get tracksField() { return this.audioUnitBoxAdapter().box.tracks; }
58
+ get hostsInstrument() { return true; }
59
+ get isAudioUnit() { return false; }
60
+ compositeDevice() {
61
+ return __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_context, "f").boxAdapters
62
+ .adapterFor(__classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_box, "f").composite.targetVertex.unwrap("composite.target").box, InstrumentCompositeBoxAdapter);
63
+ }
64
+ deviceHost() { return this.compositeDevice().deviceHost(); }
65
+ asCompositeCell() { return Option.wrap(this); }
66
+ siblings() { return this.compositeDevice().cells.adapters(); }
67
+ subscribeSiblings(observer) {
68
+ const { cells } = this.compositeDevice();
69
+ const notify = () => observer(cells.adapters());
70
+ return cells.subscribe({ onAdd: notify, onRemove: notify, onReorder: notify });
71
+ }
72
+ audioUnitBoxAdapter() { return this.deviceHost().audioUnitBoxAdapter(); }
73
+ *labeledAudioOutputs() {
74
+ yield* __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_input, "f").adapter().mapOr(input => input.labeledAudioOutputs(), []);
75
+ for (const effect of __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_audioEffects, "f").adapters()) {
76
+ yield* effect.labeledAudioOutputs();
77
+ }
78
+ }
79
+ terminate() { __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_terminator, "f").terminate(); }
80
+ }
81
+ _InstrumentCompositeCellBoxAdapter_terminator = new WeakMap(), _InstrumentCompositeCellBoxAdapter_context = new WeakMap(), _InstrumentCompositeCellBoxAdapter_box = new WeakMap(), _InstrumentCompositeCellBoxAdapter_input = new WeakMap(), _InstrumentCompositeCellBoxAdapter_midiEffects = new WeakMap(), _InstrumentCompositeCellBoxAdapter_audioEffects = new WeakMap(), _InstrumentCompositeCellBoxAdapter_parametric = new WeakMap(), _InstrumentCompositeCellBoxAdapter_instances = new WeakSet(), _InstrumentCompositeCellBoxAdapter_wrapParameters = function _InstrumentCompositeCellBoxAdapter_wrapParameters(box) {
82
+ return {
83
+ gain: __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_parametric, "f").createParameter(box.gain, ValueMapping.DefaultDecibel, StringMapping.numeric({ unit: "dB", fractionDigits: 1 }), "Gain"),
84
+ pan: __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_parametric, "f").createParameter(box.pan, ValueMapping.bipolar(), StringMapping.panning, "Pan", 0.5),
85
+ mute: __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_parametric, "f").createParameter(box.mute, ValueMapping.bool, StringMapping.bool, "Mute"),
86
+ solo: __classPrivateFieldGet(this, _InstrumentCompositeCellBoxAdapter_parametric, "f").createParameter(box.solo, ValueMapping.bool, StringMapping.bool, "Solo")
87
+ };
88
+ };
@@ -0,0 +1,33 @@
1
+ import { InstrumentCompositeBox } from "@opendaw/studio-boxes";
2
+ import { Address, BooleanField, StringField } from "@opendaw/lib-box";
3
+ import { Pointers } from "@opendaw/studio-enums";
4
+ import { UUID } from "@opendaw/lib-std";
5
+ import { DeviceHost, InstrumentDeviceBoxAdapter } from "../../DeviceAdapter";
6
+ import { BoxAdaptersContext } from "../../BoxAdaptersContext";
7
+ import { IndexedBoxAdapterCollection } from "../../IndexedBoxAdapterCollection";
8
+ import { TrackType } from "../../timeline/TrackType";
9
+ import { AudioUnitBoxAdapter } from "../../audio-unit/AudioUnitBoxAdapter";
10
+ import { LabeledAudioOutput } from "../../LabeledAudioOutputsOwner";
11
+ import { InstrumentCompositeCellBoxAdapter } from "./InstrumentComposite/InstrumentCompositeCellBoxAdapter";
12
+ export declare class InstrumentCompositeBoxAdapter implements InstrumentDeviceBoxAdapter {
13
+ #private;
14
+ readonly type = "instrument";
15
+ readonly accepts = "midi";
16
+ readonly manualUrl = "manuals/devices/instruments/composite";
17
+ constructor(context: BoxAdaptersContext, box: InstrumentCompositeBox);
18
+ get box(): InstrumentCompositeBox;
19
+ get uuid(): UUID.Bytes;
20
+ get address(): Address;
21
+ get labelField(): StringField;
22
+ get iconField(): StringField;
23
+ get defaultTrackType(): TrackType;
24
+ get enabledField(): BooleanField;
25
+ get minimizedField(): BooleanField;
26
+ get acceptsMidiEvents(): boolean;
27
+ get cells(): IndexedBoxAdapterCollection<InstrumentCompositeCellBoxAdapter, Pointers.InstrumentCompositeCell>;
28
+ deviceHost(): DeviceHost;
29
+ audioUnitBoxAdapter(): AudioUnitBoxAdapter;
30
+ labeledAudioOutputs(): Iterable<LabeledAudioOutput>;
31
+ terminate(): void;
32
+ }
33
+ //# sourceMappingURL=InstrumentCompositeBoxAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstrumentCompositeBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/instruments/InstrumentCompositeBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAS,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAC,UAAU,EAAW,0BAA0B,EAAC,MAAM,qBAAqB,CAAA;AACnF,OAAO,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAA;AAE3D,OAAO,EAAC,2BAA2B,EAAC,MAAM,mCAAmC,CAAA;AAC7E,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAA;AACxE,OAAO,EAAC,kBAAkB,EAAC,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAC,iCAAiC,EAAC,MAAM,yDAAyD,CAAA;AAEzG,qBAAa,6BAA8B,YAAW,0BAA0B;;IAC5E,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,OAAO,UAAS;IACzB,QAAQ,CAAC,SAAS,2CAAuC;gBAO7C,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,sBAAsB;IAOpE,IAAI,GAAG,IAAI,sBAAsB,CAAmB;IACpD,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,KAAK,IAAI,2BAA2B,CAAC,iCAAiC,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAqB;IAElI,UAAU,IAAI,UAAU;IAKxB,mBAAmB,IAAI,mBAAmB;IAExC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAOrD,SAAS,IAAI,IAAI;CACpB"}
@@ -0,0 +1,55 @@
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 _InstrumentCompositeBoxAdapter_context, _InstrumentCompositeBoxAdapter_box, _InstrumentCompositeBoxAdapter_cells;
13
+ import { Pointers } from "@opendaw/studio-enums";
14
+ import { Option } from "@opendaw/lib-std";
15
+ import { Devices } from "../../DeviceAdapter";
16
+ import { DeviceManualUrls } from "../../DeviceManualUrls";
17
+ import { IndexedBoxAdapterCollection } from "../../IndexedBoxAdapterCollection";
18
+ import { TrackType } from "../../timeline/TrackType";
19
+ import { InstrumentCompositeCellBoxAdapter } from "./InstrumentComposite/InstrumentCompositeCellBoxAdapter";
20
+ export class InstrumentCompositeBoxAdapter {
21
+ constructor(context, box) {
22
+ this.type = "instrument";
23
+ this.accepts = "midi";
24
+ this.manualUrl = DeviceManualUrls.InstrumentComposite;
25
+ _InstrumentCompositeBoxAdapter_context.set(this, void 0);
26
+ _InstrumentCompositeBoxAdapter_box.set(this, void 0);
27
+ _InstrumentCompositeBoxAdapter_cells.set(this, void 0);
28
+ __classPrivateFieldSet(this, _InstrumentCompositeBoxAdapter_context, context, "f");
29
+ __classPrivateFieldSet(this, _InstrumentCompositeBoxAdapter_box, box, "f");
30
+ __classPrivateFieldSet(this, _InstrumentCompositeBoxAdapter_cells, IndexedBoxAdapterCollection.create(box.cells, box => context.boxAdapters.adapterFor(box, InstrumentCompositeCellBoxAdapter), Pointers.InstrumentCompositeCell), "f");
31
+ }
32
+ get box() { return __classPrivateFieldGet(this, _InstrumentCompositeBoxAdapter_box, "f"); }
33
+ get uuid() { return __classPrivateFieldGet(this, _InstrumentCompositeBoxAdapter_box, "f").address.uuid; }
34
+ get address() { return __classPrivateFieldGet(this, _InstrumentCompositeBoxAdapter_box, "f").address; }
35
+ get labelField() { return __classPrivateFieldGet(this, _InstrumentCompositeBoxAdapter_box, "f").label; }
36
+ get iconField() { return __classPrivateFieldGet(this, _InstrumentCompositeBoxAdapter_box, "f").icon; }
37
+ get defaultTrackType() { return TrackType.Notes; }
38
+ get enabledField() { return __classPrivateFieldGet(this, _InstrumentCompositeBoxAdapter_box, "f").enabled; }
39
+ get minimizedField() { return __classPrivateFieldGet(this, _InstrumentCompositeBoxAdapter_box, "f").minimized; }
40
+ get acceptsMidiEvents() { return true; }
41
+ get cells() { return __classPrivateFieldGet(this, _InstrumentCompositeBoxAdapter_cells, "f"); }
42
+ deviceHost() {
43
+ return __classPrivateFieldGet(this, _InstrumentCompositeBoxAdapter_context, "f").boxAdapters
44
+ .adapterFor(__classPrivateFieldGet(this, _InstrumentCompositeBoxAdapter_box, "f").host.targetVertex.unwrap("no device-host").box, Devices.isHost);
45
+ }
46
+ audioUnitBoxAdapter() { return this.deviceHost().audioUnitBoxAdapter(); }
47
+ *labeledAudioOutputs() {
48
+ yield { address: this.address, label: this.labelField.getValue(), children: () => Option.None };
49
+ for (const cell of __classPrivateFieldGet(this, _InstrumentCompositeBoxAdapter_cells, "f").adapters()) {
50
+ yield { address: cell.address, label: cell.label, children: () => Option.wrap(cell.labeledAudioOutputs()) };
51
+ }
52
+ }
53
+ terminate() { __classPrivateFieldGet(this, _InstrumentCompositeBoxAdapter_cells, "f").terminate(); }
54
+ }
55
+ _InstrumentCompositeBoxAdapter_context = new WeakMap(), _InstrumentCompositeBoxAdapter_box = new WeakMap(), _InstrumentCompositeBoxAdapter_cells = new WeakMap();
@@ -1,11 +1,12 @@
1
1
  import { NanoDeviceBox } from "@opendaw/studio-boxes";
2
- import { UUID } from "@opendaw/lib-std";
2
+ import { Option, UUID } from "@opendaw/lib-std";
3
3
  import { Address, BooleanField, StringField } from "@opendaw/lib-box";
4
4
  import { DeviceHost, InstrumentDeviceBoxAdapter } from "../../DeviceAdapter";
5
5
  import { LabeledAudioOutput } from "../../LabeledAudioOutputsOwner";
6
6
  import { BoxAdaptersContext } from "../../BoxAdaptersContext";
7
7
  import { TrackType } from "../../timeline/TrackType";
8
8
  import { AudioUnitBoxAdapter } from "../../audio-unit/AudioUnitBoxAdapter";
9
+ import { AudioFileBoxAdapter } from "../../audio/AudioFileBoxAdapter";
9
10
  export declare class NanoDeviceBoxAdapter implements InstrumentDeviceBoxAdapter {
10
11
  #private;
11
12
  readonly type = "instrument";
@@ -13,7 +14,17 @@ export declare class NanoDeviceBoxAdapter implements InstrumentDeviceBoxAdapter
13
14
  readonly manualUrl = "manuals/devices/instruments/nano";
14
15
  readonly namedParameter: {
15
16
  readonly volume: import("../..").AutomatableParameterFieldAdapter<number>;
17
+ readonly octave: import("../..").AutomatableParameterFieldAdapter<number>;
18
+ readonly tune: import("../..").AutomatableParameterFieldAdapter<number>;
19
+ readonly rootKey: import("../..").AutomatableParameterFieldAdapter<number>;
16
20
  readonly release: import("../..").AutomatableParameterFieldAdapter<number>;
21
+ readonly attack: import("../..").AutomatableParameterFieldAdapter<number>;
22
+ readonly sampleStart: import("../..").AutomatableParameterFieldAdapter<number>;
23
+ readonly sampleEnd: import("../..").AutomatableParameterFieldAdapter<number>;
24
+ readonly loop: import("../..").AutomatableParameterFieldAdapter<boolean>;
25
+ readonly loopFade: import("../..").AutomatableParameterFieldAdapter<number>;
26
+ readonly loopStart: import("../..").AutomatableParameterFieldAdapter<number>;
27
+ readonly loopEnd: import("../..").AutomatableParameterFieldAdapter<number>;
17
28
  };
18
29
  constructor(context: BoxAdaptersContext, box: NanoDeviceBox);
19
30
  get box(): NanoDeviceBox;
@@ -25,6 +36,8 @@ export declare class NanoDeviceBoxAdapter implements InstrumentDeviceBoxAdapter
25
36
  get enabledField(): BooleanField;
26
37
  get minimizedField(): BooleanField;
27
38
  get acceptsMidiEvents(): boolean;
39
+ get positionsAddress(): Address;
40
+ file(): Option<AudioFileBoxAdapter>;
28
41
  deviceHost(): DeviceHost;
29
42
  audioUnitBoxAdapter(): AudioUnitBoxAdapter;
30
43
  labeledAudioOutputs(): Iterable<LabeledAudioOutput>;
@@ -1 +1 @@
1
- {"version":3,"file":"NanoDeviceBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/instruments/NanoDeviceBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAwB,IAAI,EAAe,MAAM,kBAAkB,CAAA;AAC1E,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;AAG3D,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAA;AAExE,qBAAa,oBAAqB,YAAW,0BAA0B;;IACnE,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,OAAO,UAAS;IACzB,QAAQ,CAAC,SAAS,sCAAwB;IAM1C,QAAQ,CAAC,cAAc;;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,aAAa;IAO3D,IAAI,GAAG,IAAI,aAAa,CAAmB;IAC3C,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;IAE9C,UAAU,IAAI,UAAU;IAKxB,mBAAmB,IAAI,mBAAmB;IAEzC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAIpD,SAAS,IAAI,IAAI;CAgBpB"}
1
+ {"version":3,"file":"NanoDeviceBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/instruments/NanoDeviceBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAC,MAAM,EAA6B,IAAI,EAAe,MAAM,kBAAkB,CAAA;AAEtF,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;AAG3D,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAA;AACxE,OAAO,EAAC,mBAAmB,EAAC,MAAM,iCAAiC,CAAA;AAInE,qBAAa,oBAAqB,YAAW,0BAA0B;;IACnE,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,OAAO,UAAS;IACzB,QAAQ,CAAC,SAAS,sCAAwB;IAO1C,QAAQ,CAAC,cAAc;;;;;;;;;;;;;MAAA;gBAIX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,aAAa;IAY3D,IAAI,GAAG,IAAI,aAAa,CAAmB;IAC3C,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,gBAAgB,IAAI,OAAO,CAAwC;IAEvE,IAAI,IAAI,MAAM,CAAC,mBAAmB,CAAC;IAEnC,UAAU,IAAI,UAAU;IAKxB,mBAAmB,IAAI,mBAAmB;IAEzC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAIpD,SAAS,IAAI,IAAI;CAyDpB"}
@@ -9,12 +9,15 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
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
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _NanoDeviceBoxAdapter_instances, _NanoDeviceBoxAdapter_context, _NanoDeviceBoxAdapter_box, _NanoDeviceBoxAdapter_parametric, _NanoDeviceBoxAdapter_wrapParameters;
13
- import { Option, StringMapping, ValueMapping } from "@opendaw/lib-std";
12
+ var _NanoDeviceBoxAdapter_instances, _NanoDeviceBoxAdapter_context, _NanoDeviceBoxAdapter_box, _NanoDeviceBoxAdapter_terminator, _NanoDeviceBoxAdapter_parametric, _NanoDeviceBoxAdapter_file, _NanoDeviceBoxAdapter_wrapParameters;
13
+ import { Option, StringMapping, Terminator, ValueMapping } from "@opendaw/lib-std";
14
+ import { MidiKeys } from "@opendaw/lib-dsp";
14
15
  import { Devices } from "../../DeviceAdapter";
15
16
  import { DeviceManualUrls } from "../../DeviceManualUrls";
16
17
  import { ParameterAdapterSet } from "../../ParameterAdapterSet";
17
18
  import { TrackType } from "../../timeline/TrackType";
19
+ import { AudioFileBoxAdapter } from "../../audio/AudioFileBoxAdapter";
20
+ const RootKeyLabels = Array.from({ length: 128 }, (_, note) => MidiKeys.toFullString(note));
18
21
  export class NanoDeviceBoxAdapter {
19
22
  constructor(context, box) {
20
23
  _NanoDeviceBoxAdapter_instances.add(this);
@@ -23,11 +26,18 @@ export class NanoDeviceBoxAdapter {
23
26
  this.manualUrl = DeviceManualUrls.Nano;
24
27
  _NanoDeviceBoxAdapter_context.set(this, void 0);
25
28
  _NanoDeviceBoxAdapter_box.set(this, void 0);
29
+ _NanoDeviceBoxAdapter_terminator.set(this, void 0);
26
30
  _NanoDeviceBoxAdapter_parametric.set(this, void 0);
31
+ _NanoDeviceBoxAdapter_file.set(this, Option.None);
27
32
  __classPrivateFieldSet(this, _NanoDeviceBoxAdapter_context, context, "f");
28
33
  __classPrivateFieldSet(this, _NanoDeviceBoxAdapter_box, box, "f");
34
+ __classPrivateFieldSet(this, _NanoDeviceBoxAdapter_terminator, new Terminator(), "f");
29
35
  __classPrivateFieldSet(this, _NanoDeviceBoxAdapter_parametric, new ParameterAdapterSet(__classPrivateFieldGet(this, _NanoDeviceBoxAdapter_context, "f")), "f");
30
36
  this.namedParameter = __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_instances, "m", _NanoDeviceBoxAdapter_wrapParameters).call(this, box);
37
+ __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_terminator, "f").own(__classPrivateFieldGet(this, _NanoDeviceBoxAdapter_box, "f").file.catchupAndSubscribe(pointer => {
38
+ __classPrivateFieldSet(this, _NanoDeviceBoxAdapter_file, pointer.targetVertex.map(({ box }) => __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_context, "f").boxAdapters.adapterFor(box, AudioFileBoxAdapter)), "f");
39
+ __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_file, "f").ifSome(file => file.getOrCreateLoader());
40
+ }));
31
41
  }
32
42
  get box() { return __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_box, "f"); }
33
43
  get uuid() { return __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_box, "f").address.uuid; }
@@ -38,6 +48,8 @@ export class NanoDeviceBoxAdapter {
38
48
  get enabledField() { return __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_box, "f").enabled; }
39
49
  get minimizedField() { return __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_box, "f").minimized; }
40
50
  get acceptsMidiEvents() { return true; }
51
+ get positionsAddress() { return __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_box, "f").address.append(1001); }
52
+ file() { return __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_file, "f"); }
41
53
  deviceHost() {
42
54
  return __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_context, "f").boxAdapters
43
55
  .adapterFor(__classPrivateFieldGet(this, _NanoDeviceBoxAdapter_box, "f").host.targetVertex.unwrap("no device-host").box, Devices.isHost);
@@ -47,12 +59,23 @@ export class NanoDeviceBoxAdapter {
47
59
  yield { address: this.address, label: this.labelField.getValue(), children: () => Option.None };
48
60
  }
49
61
  terminate() {
62
+ __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_terminator, "f").terminate();
50
63
  __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").terminate();
51
64
  }
52
65
  }
53
- _NanoDeviceBoxAdapter_context = new WeakMap(), _NanoDeviceBoxAdapter_box = new WeakMap(), _NanoDeviceBoxAdapter_parametric = new WeakMap(), _NanoDeviceBoxAdapter_instances = new WeakSet(), _NanoDeviceBoxAdapter_wrapParameters = function _NanoDeviceBoxAdapter_wrapParameters(box) {
66
+ _NanoDeviceBoxAdapter_context = new WeakMap(), _NanoDeviceBoxAdapter_box = new WeakMap(), _NanoDeviceBoxAdapter_terminator = new WeakMap(), _NanoDeviceBoxAdapter_parametric = new WeakMap(), _NanoDeviceBoxAdapter_file = new WeakMap(), _NanoDeviceBoxAdapter_instances = new WeakSet(), _NanoDeviceBoxAdapter_wrapParameters = function _NanoDeviceBoxAdapter_wrapParameters(box) {
54
67
  return {
55
- volume: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.volume, ValueMapping.DefaultDecibel, StringMapping.numeric({ unit: "db", fractionDigits: 1 }), "Volume"),
56
- release: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.release, ValueMapping.exponential(0.001, 8.0), StringMapping.numeric({ unit: "s", fractionDigits: 3 }), "Release")
68
+ volume: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.volume, ValueMapping.DefaultDecibel, StringMapping.numeric({ unit: "db", fractionDigits: 1 }), "Gain"),
69
+ octave: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.octave, ValueMapping.linearInteger(-3, 3), StringMapping.numeric({ unit: "oct" }), "Octave", 0.5),
70
+ tune: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.tune, ValueMapping.linear(-1200.0, 1200.0), StringMapping.numeric({ unit: "ct", fractionDigits: 0 }), "Tune", 0.5),
71
+ rootKey: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.rootKey, ValueMapping.linearInteger(0, 127), StringMapping.indices("", RootKeyLabels), "Root", 60 / 127),
72
+ release: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.release, ValueMapping.exponential(0.001, 8.0), StringMapping.numeric({ unit: "s", fractionDigits: 3 }), "Release"),
73
+ attack: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.attack, ValueMapping.exponential(0.001, 5.0), StringMapping.numeric({ unit: "s", fractionDigits: 3 }), "Attack"),
74
+ sampleStart: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.sampleStart, ValueMapping.unipolar(), StringMapping.percent(), "Start", 0.0),
75
+ sampleEnd: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.sampleEnd, ValueMapping.unipolar(), StringMapping.percent(), "End", 1.0),
76
+ loop: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.loop, ValueMapping.bool, StringMapping.bool, "Loop"),
77
+ loopFade: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.loopFade, ValueMapping.exponential(0.001, 1.0), StringMapping.numeric({ unit: "s", fractionDigits: 3 }), "Fade"),
78
+ loopStart: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.loopStart, ValueMapping.unipolar(), StringMapping.percent(), "Loop Start", 0.0),
79
+ loopEnd: __classPrivateFieldGet(this, _NanoDeviceBoxAdapter_parametric, "f").createParameter(box.loopEnd, ValueMapping.unipolar(), StringMapping.percent(), "Loop End", 1.0)
57
80
  };
58
81
  };
@@ -2,7 +2,7 @@ import { Pointers } from "@opendaw/studio-enums";
2
2
  import { PlayfieldSampleBox } from "@opendaw/studio-boxes";
3
3
  import { int, Option, UUID } from "@opendaw/lib-std";
4
4
  import { Address, BooleanField, Field, Int32Field, StringField } from "@opendaw/lib-box";
5
- import { AudioEffectDeviceAdapter, DeviceAccepts, DeviceHost, InstrumentDeviceBoxAdapter, MidiEffectDeviceAdapter } from "../../../DeviceAdapter";
5
+ import { AudioEffectDeviceAdapter, CompositeCell, DeviceAccepts, DeviceHost, InstrumentDeviceBoxAdapter, MidiEffectDeviceAdapter } from "../../../DeviceAdapter";
6
6
  import { LabeledAudioOutput } from "../../../LabeledAudioOutputsOwner";
7
7
  import { IndexedBoxAdapter, IndexedBoxAdapterCollection } from "../../../IndexedBoxAdapterCollection";
8
8
  import { BoxAdaptersContext } from "../../../BoxAdaptersContext";
@@ -63,6 +63,7 @@ export declare class PlayfieldSampleBoxAdapter implements DeviceHost, Instrument
63
63
  get minimizedField(): BooleanField;
64
64
  device(): PlayfieldDeviceBoxAdapter;
65
65
  deviceHost(): DeviceHost;
66
+ asCompositeCell(): Option<CompositeCell>;
66
67
  audioUnitBoxAdapter(): AudioUnitBoxAdapter;
67
68
  labeledAudioOutputs(): Iterable<LabeledAudioOutput>;
68
69
  terminate(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"PlayfieldSampleBoxAdapter.d.ts","sourceRoot":"","sources":["../../../../src/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PlayfieldSampleBoxAdapter.d.ts","sourceRoot":"","sources":["../../../../src/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.ts"],"names":[],"mappings":"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"}
@@ -117,6 +117,7 @@ export class PlayfieldSampleBoxAdapter {
117
117
  .adapterFor(__classPrivateFieldGet(this, _PlayfieldSampleBoxAdapter_box, "f").device.targetVertex.unwrap("device.target").box, PlayfieldDeviceBoxAdapter);
118
118
  }
119
119
  deviceHost() { return this.device().deviceHost(); }
120
+ asCompositeCell() { return Option.None; }
120
121
  audioUnitBoxAdapter() { return this.deviceHost().audioUnitBoxAdapter(); }
121
122
  *labeledAudioOutputs() {
122
123
  yield {
@@ -0,0 +1,23 @@
1
+ import { int } from "@opendaw/lib-std";
2
+ export type Dx7Voice = {
3
+ readonly name: string;
4
+ readonly data: Uint8Array;
5
+ };
6
+ export declare namespace Dx7Sysex {
7
+ const PATCH_SIZE = 155;
8
+ const PACKED_SIZE = 128;
9
+ const BANK_SIZE = 4104;
10
+ const BANK_BODY = 4096;
11
+ const VOICE_SIZE = 163;
12
+ const NAME_OFFSET = 145;
13
+ const NAME_LENGTH = 10;
14
+ const checksum: (bytes: Uint8Array) => int;
15
+ const unpack: (bulk: Uint8Array) => Uint8Array;
16
+ const pack: (patch: Uint8Array) => Uint8Array;
17
+ const voiceName: (patch: Uint8Array) => string;
18
+ const withName: (patch: Uint8Array, name: string) => Uint8Array;
19
+ const decode: (bytes: Uint8Array) => ReadonlyArray<Dx7Voice>;
20
+ const encodeBank: (voices: ReadonlyArray<Uint8Array>) => Uint8Array;
21
+ const encodeVoice: (patch: Uint8Array) => Uint8Array;
22
+ }
23
+ //# sourceMappingURL=Dx7Sysex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dx7Sysex.d.ts","sourceRoot":"","sources":["../../../../src/devices/instruments/Tubular/Dx7Sysex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AAMpC,MAAM,MAAM,QAAQ,GAAG;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAC5B,CAAA;AAED,yBAAiB,QAAQ,CAAC;IACf,MAAM,UAAU,MAAM,CAAA;IACtB,MAAM,WAAW,MAAM,CAAA;IACvB,MAAM,SAAS,OAAO,CAAA;IACtB,MAAM,SAAS,OAAO,CAAA;IACtB,MAAM,UAAU,MAAM,CAAA;IACtB,MAAM,WAAW,MAAM,CAAA;IACvB,MAAM,WAAW,KAAK,CAAA;IAEtB,MAAM,QAAQ,GAAI,OAAO,UAAU,KAAG,GAI5C,CAAA;IAEM,MAAM,MAAM,GAAI,MAAM,UAAU,KAAG,UAqCzC,CAAA;IAEM,MAAM,IAAI,GAAI,OAAO,UAAU,KAAG,UAqBxC,CAAA;IAEM,MAAM,SAAS,GAAI,OAAO,UAAU,KAAG,MAGtB,CAAA;IAEjB,MAAM,QAAQ,GAAI,OAAO,UAAU,EAAE,MAAM,MAAM,KAAG,UAO1D,CAAA;IA6BM,MAAM,MAAM,GAAI,OAAO,UAAU,KAAG,aAAa,CAAC,QAAQ,CAchE,CAAA;IAEM,MAAM,UAAU,GAAI,QAAQ,aAAa,CAAC,UAAU,CAAC,KAAG,UAQ9D,CAAA;IAEM,MAAM,WAAW,GAAI,OAAO,UAAU,KAAG,UAO/C,CAAA;CACJ"}
@@ -0,0 +1,159 @@
1
+ export var Dx7Sysex;
2
+ (function (Dx7Sysex) {
3
+ Dx7Sysex.PATCH_SIZE = 155;
4
+ Dx7Sysex.PACKED_SIZE = 128;
5
+ Dx7Sysex.BANK_SIZE = 4104;
6
+ Dx7Sysex.BANK_BODY = 4096;
7
+ Dx7Sysex.VOICE_SIZE = 163;
8
+ Dx7Sysex.NAME_OFFSET = 145;
9
+ Dx7Sysex.NAME_LENGTH = 10;
10
+ Dx7Sysex.checksum = (bytes) => {
11
+ let sum = 0;
12
+ for (const byte of bytes) {
13
+ sum -= byte;
14
+ }
15
+ return sum & 0x7F;
16
+ };
17
+ Dx7Sysex.unpack = (bulk) => {
18
+ const patch = new Uint8Array(Dx7Sysex.PATCH_SIZE);
19
+ for (let op = 0; op < 6; op++) {
20
+ const src = op * 17;
21
+ const dst = op * 21;
22
+ for (let index = 0; index < 11; index++) {
23
+ patch[dst + index] = bulk[src + index] & 0x7F;
24
+ }
25
+ const leftRightCurves = bulk[src + 11] & 0xF;
26
+ patch[dst + 11] = leftRightCurves & 3;
27
+ patch[dst + 12] = (leftRightCurves >> 2) & 3;
28
+ const detuneRateScaling = bulk[src + 12] & 0x7F;
29
+ patch[dst + 13] = detuneRateScaling & 7;
30
+ const velocityAmpMod = bulk[src + 13] & 0x1F;
31
+ patch[dst + 14] = velocityAmpMod & 3;
32
+ patch[dst + 15] = (velocityAmpMod >> 2) & 7;
33
+ patch[dst + 16] = bulk[src + 14] & 0x7F;
34
+ const coarseMode = bulk[src + 15] & 0x3F;
35
+ patch[dst + 17] = coarseMode & 1;
36
+ patch[dst + 18] = (coarseMode >> 1) & 0x1F;
37
+ patch[dst + 19] = bulk[src + 16] & 0x7F;
38
+ patch[dst + 20] = (detuneRateScaling >> 3) & 0x7F;
39
+ }
40
+ for (let index = 0; index < 8; index++) {
41
+ patch[126 + index] = bulk[102 + index] & 0x7F;
42
+ }
43
+ patch[134] = bulk[110] & 0x1F;
44
+ const syncFeedback = bulk[111] & 0xF;
45
+ patch[135] = syncFeedback & 7;
46
+ patch[136] = syncFeedback >> 3;
47
+ patch[137] = bulk[112] & 0x7F;
48
+ patch[138] = bulk[113] & 0x7F;
49
+ patch[139] = bulk[114] & 0x7F;
50
+ patch[140] = bulk[115] & 0x7F;
51
+ const sensWaveSync = bulk[116] & 0x7F;
52
+ patch[141] = sensWaveSync & 1;
53
+ patch[142] = (sensWaveSync >> 1) & 7;
54
+ patch[143] = sensWaveSync >> 4;
55
+ patch[144] = bulk[117] & 0x7F;
56
+ for (let index = 0; index < Dx7Sysex.NAME_LENGTH; index++) {
57
+ patch[Dx7Sysex.NAME_OFFSET + index] = bulk[118 + index] & 0x7F;
58
+ }
59
+ return patch;
60
+ };
61
+ Dx7Sysex.pack = (patch) => {
62
+ const bulk = new Uint8Array(Dx7Sysex.PACKED_SIZE);
63
+ for (let op = 0; op < 6; op++) {
64
+ const src = op * 21;
65
+ const dst = op * 17;
66
+ bulk.set(patch.subarray(src, src + 11), dst);
67
+ bulk[dst + 11] = ((patch[src + 12] & 3) << 2) | (patch[src + 11] & 3);
68
+ bulk[dst + 12] = ((patch[src + 20] & 0x0F) << 3) | (patch[src + 13] & 7);
69
+ bulk[dst + 13] = ((patch[src + 15] & 7) << 2) | (patch[src + 14] & 3);
70
+ bulk[dst + 14] = patch[src + 16];
71
+ bulk[dst + 15] = ((patch[src + 18] & 0x1F) << 1) | (patch[src + 17] & 1);
72
+ bulk[dst + 16] = patch[src + 19];
73
+ }
74
+ bulk.set(patch.subarray(126, 134), 102);
75
+ bulk[110] = patch[134] & 0x1F;
76
+ bulk[111] = ((patch[136] & 1) << 3) | (patch[135] & 7);
77
+ bulk.set(patch.subarray(137, 141), 112);
78
+ bulk[116] = ((patch[143] & 7) << 4) | ((patch[142] & 7) << 1) | (patch[141] & 1);
79
+ bulk[117] = patch[144];
80
+ bulk.set(patch.subarray(Dx7Sysex.NAME_OFFSET, Dx7Sysex.NAME_OFFSET + Dx7Sysex.NAME_LENGTH), 118);
81
+ return bulk;
82
+ };
83
+ Dx7Sysex.voiceName = (patch) => Array.from(patch.subarray(Dx7Sysex.NAME_OFFSET, Dx7Sysex.NAME_OFFSET + Dx7Sysex.NAME_LENGTH))
84
+ .map(code => code >= 32 && code < 127 ? String.fromCharCode(code) : " ")
85
+ .join("").trim();
86
+ Dx7Sysex.withName = (patch, name) => {
87
+ const copy = new Uint8Array(patch);
88
+ for (let index = 0; index < Dx7Sysex.NAME_LENGTH; index++) {
89
+ const code = name.charCodeAt(index);
90
+ copy[Dx7Sysex.NAME_OFFSET + index] = Number.isNaN(code) ? 32 : code >= 32 && code < 127 ? code : 32;
91
+ }
92
+ return copy;
93
+ };
94
+ const isBankHeader = (bytes) => bytes[0] === 0xF0 && bytes[1] === 0x43 && (bytes[2] & 0xF0) === 0 && bytes[3] === 0x09 && bytes[4] === 0x20 && bytes[5] === 0x00;
95
+ const isVoiceHeader = (bytes) => bytes[0] === 0xF0 && bytes[1] === 0x43 && (bytes[2] & 0xF0) === 0 && bytes[3] === 0x00 && bytes[4] === 0x01 && bytes[5] === 0x1B;
96
+ const toVoice = (data) => ({ name: Dx7Sysex.voiceName(data), data });
97
+ const decodeBankBody = (body) => Array.from({ length: 32 }, (_, index) => toVoice(Dx7Sysex.unpack(body.subarray(index * Dx7Sysex.PACKED_SIZE, (index + 1) * Dx7Sysex.PACKED_SIZE))));
98
+ // One sysex message (F0..F7): a bank dump or a single voice dump. Throws on anything else.
99
+ const decodeMessage = (message) => {
100
+ if (message.length === Dx7Sysex.BANK_SIZE && isBankHeader(message)) {
101
+ const body = message.subarray(6, 6 + Dx7Sysex.BANK_BODY);
102
+ if (Dx7Sysex.checksum(body) !== message[6 + Dx7Sysex.BANK_BODY]) {
103
+ throw new Error("bank checksum mismatch");
104
+ }
105
+ return decodeBankBody(body);
106
+ }
107
+ if (message.length === Dx7Sysex.VOICE_SIZE && isVoiceHeader(message)) {
108
+ const data = message.slice(6, 6 + Dx7Sysex.PATCH_SIZE);
109
+ if (Dx7Sysex.checksum(data) !== message[6 + Dx7Sysex.PATCH_SIZE]) {
110
+ throw new Error("voice checksum mismatch");
111
+ }
112
+ return [toVoice(data)];
113
+ }
114
+ throw new Error(`not a DX7 dump (${message.length} bytes)`);
115
+ };
116
+ // Every voice in a .syx file: a headerless 4096-byte cartridge, or one or more sysex messages.
117
+ Dx7Sysex.decode = (bytes) => {
118
+ if (bytes.length === Dx7Sysex.BANK_BODY && bytes[0] !== 0xF0) {
119
+ return decodeBankBody(bytes);
120
+ }
121
+ const voices = [];
122
+ let cursor = 0;
123
+ while (cursor < bytes.length) {
124
+ const start = bytes.indexOf(0xF0, cursor);
125
+ if (start < 0) {
126
+ break;
127
+ }
128
+ const end = bytes.indexOf(0xF7, start);
129
+ if (end < 0) {
130
+ throw new Error("unterminated sysex message");
131
+ }
132
+ voices.push(...decodeMessage(bytes.subarray(start, end + 1)));
133
+ cursor = end + 1;
134
+ }
135
+ if (voices.length === 0) {
136
+ throw new Error("no DX7 voices found");
137
+ }
138
+ return voices;
139
+ };
140
+ Dx7Sysex.encodeBank = (voices) => {
141
+ if (voices.length !== 32) {
142
+ throw new Error("a cartridge holds 32 voices");
143
+ }
144
+ const bank = new Uint8Array(Dx7Sysex.BANK_SIZE);
145
+ bank.set([0xF0, 0x43, 0x00, 0x09, 0x20, 0x00], 0);
146
+ voices.forEach((voice, index) => bank.set(Dx7Sysex.pack(voice), 6 + index * Dx7Sysex.PACKED_SIZE));
147
+ bank[6 + Dx7Sysex.BANK_BODY] = Dx7Sysex.checksum(bank.subarray(6, 6 + Dx7Sysex.BANK_BODY));
148
+ bank[Dx7Sysex.BANK_SIZE - 1] = 0xF7;
149
+ return bank;
150
+ };
151
+ Dx7Sysex.encodeVoice = (patch) => {
152
+ const message = new Uint8Array(Dx7Sysex.VOICE_SIZE);
153
+ message.set([0xF0, 0x43, 0x00, 0x00, 0x01, 0x1B], 0);
154
+ message.set(patch.subarray(0, Dx7Sysex.PATCH_SIZE), 6);
155
+ message[6 + Dx7Sysex.PATCH_SIZE] = Dx7Sysex.checksum(patch.subarray(0, Dx7Sysex.PATCH_SIZE));
156
+ message[Dx7Sysex.VOICE_SIZE - 1] = 0xF7;
157
+ return message;
158
+ };
159
+ })(Dx7Sysex || (Dx7Sysex = {}));
@@ -0,0 +1,6 @@
1
+ import { TubularDeviceBox } from "@opendaw/studio-boxes";
2
+ export declare namespace TubularPreset {
3
+ const apply: (box: TubularDeviceBox, voice: Uint8Array) => void;
4
+ const read: (box: TubularDeviceBox) => Uint8Array;
5
+ }
6
+ //# sourceMappingURL=TubularPreset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TubularPreset.d.ts","sourceRoot":"","sources":["../../../../src/devices/instruments/Tubular/TubularPreset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAkB,MAAM,uBAAuB,CAAA;AASvE,yBAAiB,aAAa,CAAC;IAiBpB,MAAM,KAAK,GAAI,KAAK,gBAAgB,EAAE,OAAO,UAAU,KAAG,IAShE,CAAA;IAEM,MAAM,IAAI,GAAI,KAAK,gBAAgB,KAAG,UAQ5C,CAAA;CACJ"}