@opendaw/studio-adapters 0.3.4 → 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 (73) 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/Playfield/PlayfieldSampleBoxAdapter.d.ts +2 -1
  42. package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.d.ts.map +1 -1
  43. package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.js +1 -0
  44. package/dist/devices/instruments/Tubular/Dx7Sysex.d.ts +23 -0
  45. package/dist/devices/instruments/Tubular/Dx7Sysex.d.ts.map +1 -0
  46. package/dist/devices/instruments/Tubular/Dx7Sysex.js +159 -0
  47. package/dist/devices/instruments/Tubular/TubularPreset.d.ts +6 -0
  48. package/dist/devices/instruments/Tubular/TubularPreset.d.ts.map +1 -0
  49. package/dist/devices/instruments/Tubular/TubularPreset.js +39 -0
  50. package/dist/devices/instruments/TubularDeviceBoxAdapter.d.ts +100 -0
  51. package/dist/devices/instruments/TubularDeviceBoxAdapter.d.ts.map +1 -0
  52. package/dist/devices/instruments/TubularDeviceBoxAdapter.js +177 -0
  53. package/dist/factories/InstrumentBox.d.ts +2 -2
  54. package/dist/factories/InstrumentBox.d.ts.map +1 -1
  55. package/dist/factories/InstrumentFactories.d.ts +9 -2
  56. package/dist/factories/InstrumentFactories.d.ts.map +1 -1
  57. package/dist/factories/InstrumentFactories.js +38 -2
  58. package/dist/index.d.ts +7 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +7 -0
  61. package/dist/preset/PresetDecoder.d.ts +3 -2
  62. package/dist/preset/PresetDecoder.d.ts.map +1 -1
  63. package/dist/preset/PresetDecoder.js +51 -6
  64. package/dist/preset/PresetEncoder.d.ts +1 -0
  65. package/dist/preset/PresetEncoder.d.ts.map +1 -1
  66. package/dist/preset/PresetEncoder.js +36 -0
  67. package/dist/timeline/RegionOverlap.d.ts +13 -0
  68. package/dist/timeline/RegionOverlap.d.ts.map +1 -0
  69. package/dist/timeline/RegionOverlap.js +32 -0
  70. package/dist/transfer/TransferUtils.d.ts +4 -1
  71. package/dist/transfer/TransferUtils.d.ts.map +1 -1
  72. package/dist/transfer/TransferUtils.js +18 -0
  73. package/package.json +11 -11
@@ -0,0 +1,100 @@
1
+ import { UUID } from "@opendaw/lib-std";
2
+ import { TubularDeviceBox } from "@opendaw/studio-boxes";
3
+ import { Address, BooleanField, StringField } from "@opendaw/lib-box";
4
+ import { DeviceHost, InstrumentDeviceBoxAdapter } from "../../DeviceAdapter";
5
+ import { LabeledAudioOutput } from "../../LabeledAudioOutputsOwner";
6
+ import { BoxAdaptersContext } from "../../BoxAdaptersContext";
7
+ import { TrackType } from "../../timeline/TrackType";
8
+ import { AudioUnitBoxAdapter } from "../../audio-unit/AudioUnitBoxAdapter";
9
+ export declare namespace Tubular {
10
+ const Algorithms: string[];
11
+ const Curves: string[];
12
+ const Modes: string[];
13
+ const Detunes: string[];
14
+ const LfoWaves: string[];
15
+ const Switch: string[];
16
+ const Engines: string[];
17
+ type OperatorRole = {
18
+ carrier: boolean;
19
+ targets: ReadonlyArray<number>;
20
+ feedback: boolean;
21
+ };
22
+ const roles: (algorithm: number) => ReadonlyArray<OperatorRole>;
23
+ const Transposes: string[];
24
+ }
25
+ export declare class TubularDeviceBoxAdapter implements InstrumentDeviceBoxAdapter {
26
+ #private;
27
+ readonly type = "instrument";
28
+ readonly accepts = "midi";
29
+ readonly manualUrl = "manuals/devices/instruments/tubular";
30
+ readonly namedParameter: {
31
+ readonly cutoff: import("../..").AutomatableParameterFieldAdapter<number>;
32
+ readonly resonance: import("../..").AutomatableParameterFieldAdapter<number>;
33
+ readonly volume: import("../..").AutomatableParameterFieldAdapter<number>;
34
+ readonly voicingMode: import("../..").AutomatableParameterFieldAdapter<number>;
35
+ readonly tune: import("../..").AutomatableParameterFieldAdapter<number>;
36
+ readonly algorithm: import("../..").AutomatableParameterFieldAdapter<number>;
37
+ readonly feedback: import("../..").AutomatableParameterFieldAdapter<number>;
38
+ readonly oscKeySync: import("../..").AutomatableParameterFieldAdapter<number>;
39
+ readonly lfo: {
40
+ readonly speed: import("../..").AutomatableParameterFieldAdapter<number>;
41
+ readonly delay: import("../..").AutomatableParameterFieldAdapter<number>;
42
+ readonly pmDepth: import("../..").AutomatableParameterFieldAdapter<number>;
43
+ readonly amDepth: import("../..").AutomatableParameterFieldAdapter<number>;
44
+ readonly sync: import("../..").AutomatableParameterFieldAdapter<number>;
45
+ readonly wave: import("../..").AutomatableParameterFieldAdapter<number>;
46
+ };
47
+ readonly pitchModSens: import("../..").AutomatableParameterFieldAdapter<number>;
48
+ readonly transpose: import("../..").AutomatableParameterFieldAdapter<number>;
49
+ readonly pitchEnvelope: {
50
+ readonly rate1: import("../..").AutomatableParameterFieldAdapter<number>;
51
+ readonly rate2: import("../..").AutomatableParameterFieldAdapter<number>;
52
+ readonly rate3: import("../..").AutomatableParameterFieldAdapter<number>;
53
+ readonly rate4: import("../..").AutomatableParameterFieldAdapter<number>;
54
+ readonly level1: import("../..").AutomatableParameterFieldAdapter<number>;
55
+ readonly level2: import("../..").AutomatableParameterFieldAdapter<number>;
56
+ readonly level3: import("../..").AutomatableParameterFieldAdapter<number>;
57
+ readonly level4: import("../..").AutomatableParameterFieldAdapter<number>;
58
+ };
59
+ readonly operators: {
60
+ rate1: import("../..").AutomatableParameterFieldAdapter<number>;
61
+ rate2: import("../..").AutomatableParameterFieldAdapter<number>;
62
+ rate3: import("../..").AutomatableParameterFieldAdapter<number>;
63
+ rate4: import("../..").AutomatableParameterFieldAdapter<number>;
64
+ level1: import("../..").AutomatableParameterFieldAdapter<number>;
65
+ level2: import("../..").AutomatableParameterFieldAdapter<number>;
66
+ level3: import("../..").AutomatableParameterFieldAdapter<number>;
67
+ level4: import("../..").AutomatableParameterFieldAdapter<number>;
68
+ breakPoint: import("../..").AutomatableParameterFieldAdapter<number>;
69
+ leftDepth: import("../..").AutomatableParameterFieldAdapter<number>;
70
+ rightDepth: import("../..").AutomatableParameterFieldAdapter<number>;
71
+ leftCurve: import("../..").AutomatableParameterFieldAdapter<number>;
72
+ rightCurve: import("../..").AutomatableParameterFieldAdapter<number>;
73
+ rateScaling: import("../..").AutomatableParameterFieldAdapter<number>;
74
+ ampModSens: import("../..").AutomatableParameterFieldAdapter<number>;
75
+ velocitySens: import("../..").AutomatableParameterFieldAdapter<number>;
76
+ outputLevel: import("../..").AutomatableParameterFieldAdapter<number>;
77
+ mode: import("../..").AutomatableParameterFieldAdapter<number>;
78
+ coarse: import("../..").AutomatableParameterFieldAdapter<number>;
79
+ fine: import("../..").AutomatableParameterFieldAdapter<number>;
80
+ detune: import("../..").AutomatableParameterFieldAdapter<number>;
81
+ enabled: import("../..").AutomatableParameterFieldAdapter<number>;
82
+ }[];
83
+ };
84
+ constructor(context: BoxAdaptersContext, box: TubularDeviceBox);
85
+ get box(): TubularDeviceBox;
86
+ get uuid(): UUID.Bytes;
87
+ get address(): Address;
88
+ get spectrum(): Address;
89
+ get labelField(): StringField;
90
+ get iconField(): StringField;
91
+ get defaultTrackType(): TrackType;
92
+ get enabledField(): BooleanField;
93
+ get minimizedField(): BooleanField;
94
+ get acceptsMidiEvents(): boolean;
95
+ deviceHost(): DeviceHost;
96
+ audioUnitBoxAdapter(): AudioUnitBoxAdapter;
97
+ labeledAudioOutputs(): Iterable<LabeledAudioOutput>;
98
+ terminate(): void;
99
+ }
100
+ //# sourceMappingURL=TubularDeviceBoxAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TubularDeviceBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/instruments/TubularDeviceBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,IAAI,EAAe,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAC,gBAAgB,EAAkB,MAAM,uBAAuB,CAAA;AACvE,OAAO,EAAC,OAAO,EAAE,YAAY,EAAc,WAAW,EAAC,MAAM,kBAAkB,CAAA;AAE/E,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,yBAAiB,OAAO,CAAC;IACd,MAAM,UAAU,UAA4D,CAAA;IAC5E,MAAM,MAAM,UAAmC,CAAA;IAC/C,MAAM,KAAK,UAAqB,CAAA;IAChC,MAAM,OAAO,UAA8G,CAAA;IAC3H,MAAM,QAAQ,UAA8D,CAAA;IAC5E,MAAM,MAAM,UAAgB,CAAA;IAC5B,MAAM,OAAO,UAAuB,CAAA;IAiB3C,KAAY,YAAY,GAAG;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAC,CAAA;IAMzF,MAAM,KAAK,GAAI,WAAW,MAAM,KAAG,aAAa,CAAC,YAAY,CAsBnE,CAAA;IAGM,MAAM,UAAU,UAGrB,CAAA;CACL;AAID,qBAAa,uBAAwB,YAAW,0BAA0B;;IACtE,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,OAAO,UAAS;IACzB,QAAQ,CAAC,SAAS,yCAA2B;IAM7C,QAAQ,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,gBAAgB;IAO9D,IAAI,GAAG,IAAI,gBAAgB,CAAmB;IAC9C,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,QAAQ,IAAI,OAAO,CAAyC;IAChE,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;CA8EpB"}
@@ -0,0 +1,177 @@
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 _TubularDeviceBoxAdapter_instances, _TubularDeviceBoxAdapter_context, _TubularDeviceBoxAdapter_box, _TubularDeviceBoxAdapter_parametric, _TubularDeviceBoxAdapter_wrapParameters;
13
+ import { Option, StringMapping, ValueMapping } from "@opendaw/lib-std";
14
+ import { VoicingMode } from "@opendaw/studio-enums";
15
+ import { Devices } from "../../DeviceAdapter";
16
+ import { DeviceManualUrls } from "../../DeviceManualUrls";
17
+ import { ParameterAdapterSet } from "../../ParameterAdapterSet";
18
+ import { TrackType } from "../../timeline/TrackType";
19
+ export var Tubular;
20
+ (function (Tubular) {
21
+ Tubular.Algorithms = Array.from({ length: 32 }, (_, index) => String(index + 1));
22
+ Tubular.Curves = ["-LIN", "-EXP", "+EXP", "+LIN"];
23
+ Tubular.Modes = ["Ratio", "Fixed"];
24
+ Tubular.Detunes = Array.from({ length: 15 }, (_, index) => index === 7 ? "0" : index > 7 ? `+${index - 7}` : String(index - 7));
25
+ Tubular.LfoWaves = ["Triangle", "Saw Down", "Saw Up", "Square", "Sine", "S&H"];
26
+ Tubular.Switch = ["Off", "On"];
27
+ Tubular.Engines = ["Mark I", "Modern"];
28
+ // The 32 algorithms as msfa bus flags per operator in SYSEX order (OP6 first): bits 0-1 out bus (0 =
29
+ // output), bit 2 add to bus, bits 4-5 in bus, bits 6-7 feedback. Mirrors `ALGORITHMS` in fm.rs.
30
+ const ALGORITHMS = [
31
+ [0xc1, 0x11, 0x11, 0x14, 0x01, 0x14], [0x01, 0x11, 0x11, 0x14, 0xc1, 0x14], [0xc1, 0x11, 0x14, 0x01, 0x11, 0x14],
32
+ [0xc1, 0x11, 0x94, 0x01, 0x11, 0x14], [0xc1, 0x14, 0x01, 0x14, 0x01, 0x14], [0xc1, 0x94, 0x01, 0x14, 0x01, 0x14],
33
+ [0xc1, 0x11, 0x05, 0x14, 0x01, 0x14], [0x01, 0x11, 0xc5, 0x14, 0x01, 0x14], [0x01, 0x11, 0x05, 0x14, 0xc1, 0x14],
34
+ [0x01, 0x05, 0x14, 0xc1, 0x11, 0x14], [0xc1, 0x05, 0x14, 0x01, 0x11, 0x14], [0x01, 0x05, 0x05, 0x14, 0xc1, 0x14],
35
+ [0xc1, 0x05, 0x05, 0x14, 0x01, 0x14], [0xc1, 0x05, 0x11, 0x14, 0x01, 0x14], [0x01, 0x05, 0x11, 0x14, 0xc1, 0x14],
36
+ [0xc1, 0x11, 0x02, 0x25, 0x05, 0x14], [0x01, 0x11, 0x02, 0x25, 0xc5, 0x14], [0x01, 0x11, 0x11, 0xc5, 0x05, 0x14],
37
+ [0xc1, 0x14, 0x14, 0x01, 0x11, 0x14], [0x01, 0x05, 0x14, 0xc1, 0x14, 0x14], [0x01, 0x14, 0x14, 0xc1, 0x14, 0x14],
38
+ [0xc1, 0x14, 0x14, 0x14, 0x01, 0x14], [0xc1, 0x14, 0x14, 0x01, 0x14, 0x04], [0xc1, 0x14, 0x14, 0x14, 0x04, 0x04],
39
+ [0xc1, 0x14, 0x14, 0x04, 0x04, 0x04], [0xc1, 0x05, 0x14, 0x01, 0x14, 0x04], [0x01, 0x05, 0x14, 0xc1, 0x14, 0x04],
40
+ [0x04, 0xc1, 0x11, 0x14, 0x01, 0x14], [0xc1, 0x14, 0x01, 0x14, 0x04, 0x04], [0x04, 0xc1, 0x11, 0x14, 0x04, 0x04],
41
+ [0xc1, 0x14, 0x04, 0x04, 0x04, 0x04], [0xc4, 0x04, 0x04, 0x04, 0x04, 0x04]
42
+ ];
43
+ // Each operator's role in `algorithm` (0-based), indexed by PANEL operator (0 = OP1): what it modulates
44
+ // (panel numbers 1-6), whether it reaches the output, whether it feeds back into itself. Follows the
45
+ // engine's bus walk: an operator writing a bus replaces (or adds to) its content, a reader takes all
46
+ // current writers.
47
+ Tubular.roles = (algorithm) => {
48
+ const flags = ALGORITHMS[Math.max(0, Math.min(31, algorithm))];
49
+ const result = Array.from({ length: 6 }, () => ({ carrier: false, targets: [], feedback: false }));
50
+ const writers = [[], []];
51
+ flags.forEach((flag, index) => {
52
+ const panel = 5 - index;
53
+ const outBus = flag & 3;
54
+ const add = (flag & 4) !== 0;
55
+ const inBus = (flag >> 4) & 3;
56
+ result[panel].feedback = (flag & 0xc0) === 0xc0;
57
+ if (inBus > 0) {
58
+ writers[inBus - 1].forEach(writer => result[writer].targets.push(panel + 1));
59
+ }
60
+ if (outBus === 0) {
61
+ result[panel].carrier = true;
62
+ }
63
+ else if (add) {
64
+ writers[outBus - 1].push(panel);
65
+ }
66
+ else {
67
+ writers[outBus - 1] = [panel];
68
+ }
69
+ });
70
+ result.forEach(role => role.targets.sort((a, b) => a - b));
71
+ return result;
72
+ };
73
+ // Transpose 0..48 around 24 = C3 (the DX7 panel's key display)
74
+ Tubular.Transposes = Array.from({ length: 49 }, (_, index) => {
75
+ const names = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
76
+ return `${names[index % 12]}${Math.floor(index / 12) + 1}`;
77
+ });
78
+ })(Tubular || (Tubular = {}));
79
+ export class TubularDeviceBoxAdapter {
80
+ constructor(context, box) {
81
+ _TubularDeviceBoxAdapter_instances.add(this);
82
+ this.type = "instrument";
83
+ this.accepts = "midi";
84
+ this.manualUrl = DeviceManualUrls.Tubular;
85
+ _TubularDeviceBoxAdapter_context.set(this, void 0);
86
+ _TubularDeviceBoxAdapter_box.set(this, void 0);
87
+ _TubularDeviceBoxAdapter_parametric.set(this, void 0);
88
+ __classPrivateFieldSet(this, _TubularDeviceBoxAdapter_context, context, "f");
89
+ __classPrivateFieldSet(this, _TubularDeviceBoxAdapter_box, box, "f");
90
+ __classPrivateFieldSet(this, _TubularDeviceBoxAdapter_parametric, new ParameterAdapterSet(__classPrivateFieldGet(this, _TubularDeviceBoxAdapter_context, "f")), "f");
91
+ this.namedParameter = __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_instances, "m", _TubularDeviceBoxAdapter_wrapParameters).call(this, box);
92
+ }
93
+ get box() { return __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_box, "f"); }
94
+ get uuid() { return __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_box, "f").address.uuid; }
95
+ get address() { return __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_box, "f").address; }
96
+ get spectrum() { return __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_box, "f").address.append(0xFFF); }
97
+ get labelField() { return __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_box, "f").label; }
98
+ get iconField() { return __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_box, "f").icon; }
99
+ get defaultTrackType() { return TrackType.Notes; }
100
+ get enabledField() { return __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_box, "f").enabled; }
101
+ get minimizedField() { return __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_box, "f").minimized; }
102
+ get acceptsMidiEvents() { return true; }
103
+ deviceHost() {
104
+ return __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_context, "f").boxAdapters
105
+ .adapterFor(__classPrivateFieldGet(this, _TubularDeviceBoxAdapter_box, "f").host.targetVertex.unwrap("no device-host").box, Devices.isHost);
106
+ }
107
+ audioUnitBoxAdapter() { return this.deviceHost().audioUnitBoxAdapter(); }
108
+ *labeledAudioOutputs() {
109
+ yield { address: this.address, label: this.labelField.getValue(), children: () => Option.None };
110
+ }
111
+ terminate() {
112
+ __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_parametric, "f").terminate();
113
+ }
114
+ }
115
+ _TubularDeviceBoxAdapter_context = new WeakMap(), _TubularDeviceBoxAdapter_box = new WeakMap(), _TubularDeviceBoxAdapter_parametric = new WeakMap(), _TubularDeviceBoxAdapter_instances = new WeakSet(), _TubularDeviceBoxAdapter_wrapParameters = function _TubularDeviceBoxAdapter_wrapParameters(box) {
116
+ const VoiceModes = [VoicingMode.Monophonic, VoicingMode.Polyphonic];
117
+ const byte = (field, max, name) => __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_parametric, "f").createParameter(field, ValueMapping.linearInteger(0, max), StringMapping.numeric({ unit: "", fractionDigits: 0 }), name);
118
+ const choice = (field, labels, name) => __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_parametric, "f").createParameter(field, ValueMapping.linearInteger(0, labels.length - 1), StringMapping.indices("", labels), name);
119
+ const operator = (fields, index) => {
120
+ const prefix = `OP${index + 1}`;
121
+ return {
122
+ rate1: byte(fields.rate1, 99, `${prefix} Rate 1`),
123
+ rate2: byte(fields.rate2, 99, `${prefix} Rate 2`),
124
+ rate3: byte(fields.rate3, 99, `${prefix} Rate 3`),
125
+ rate4: byte(fields.rate4, 99, `${prefix} Rate 4`),
126
+ level1: byte(fields.level1, 99, `${prefix} Level 1`),
127
+ level2: byte(fields.level2, 99, `${prefix} Level 2`),
128
+ level3: byte(fields.level3, 99, `${prefix} Level 3`),
129
+ level4: byte(fields.level4, 99, `${prefix} Level 4`),
130
+ breakPoint: byte(fields.breakPoint, 99, `${prefix} Break Point`),
131
+ leftDepth: byte(fields.leftDepth, 99, `${prefix} Left Depth`),
132
+ rightDepth: byte(fields.rightDepth, 99, `${prefix} Right Depth`),
133
+ leftCurve: choice(fields.leftCurve, Tubular.Curves, `${prefix} Left Curve`),
134
+ rightCurve: choice(fields.rightCurve, Tubular.Curves, `${prefix} Right Curve`),
135
+ rateScaling: byte(fields.rateScaling, 7, `${prefix} Rate Scaling`),
136
+ ampModSens: byte(fields.ampModSens, 3, `${prefix} Amp Mod Sens`),
137
+ velocitySens: byte(fields.velocitySens, 7, `${prefix} Velocity Sens`),
138
+ outputLevel: byte(fields.outputLevel, 99, `${prefix} Level`),
139
+ mode: choice(fields.mode, Tubular.Modes, `${prefix} Mode`),
140
+ coarse: byte(fields.coarse, 31, `${prefix} Coarse`),
141
+ fine: byte(fields.fine, 99, `${prefix} Fine`),
142
+ detune: choice(fields.detune, Tubular.Detunes, `${prefix} Detune`),
143
+ enabled: choice(fields.enabled, Tubular.Switch, `${prefix} Switch`)
144
+ };
145
+ };
146
+ return {
147
+ cutoff: __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_parametric, "f").createParameter(box.cutoff, ValueMapping.unipolar(), StringMapping.percent({ fractionDigits: 0 }), "Cutoff", 1.0),
148
+ resonance: __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_parametric, "f").createParameter(box.resonance, ValueMapping.unipolar(), StringMapping.percent({ fractionDigits: 0 }), "Resonance"),
149
+ volume: __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_parametric, "f").createParameter(box.volume, ValueMapping.unipolar(), StringMapping.percent({ fractionDigits: 0 }), "Volume", 1.0),
150
+ voicingMode: __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_parametric, "f").createParameter(box.voicingMode, ValueMapping.values(VoiceModes), StringMapping.values("", VoiceModes, ["mono", "poly"]), "Play Mode", 0.5),
151
+ tune: __classPrivateFieldGet(this, _TubularDeviceBoxAdapter_parametric, "f").createParameter(box.tune, ValueMapping.linear(-100, 100), StringMapping.numeric({ unit: "ct", fractionDigits: 0 }), "Tune", 0.5),
152
+ algorithm: choice(box.algorithm, Tubular.Algorithms, "Algorithm"),
153
+ feedback: byte(box.feedback, 7, "Feedback"),
154
+ oscKeySync: choice(box.oscKeySync, Tubular.Switch, "Osc Key Sync"),
155
+ lfo: {
156
+ speed: byte(box.lfo.speed, 99, "LFO Speed"),
157
+ delay: byte(box.lfo.delay, 99, "LFO Delay"),
158
+ pmDepth: byte(box.lfo.pmDepth, 99, "LFO PM Depth"),
159
+ amDepth: byte(box.lfo.amDepth, 99, "LFO AM Depth"),
160
+ sync: choice(box.lfo.sync, Tubular.Switch, "LFO Key Sync"),
161
+ wave: choice(box.lfo.wave, Tubular.LfoWaves, "LFO Wave")
162
+ },
163
+ pitchModSens: byte(box.pitchModSens, 7, "Pitch Mod Sens"),
164
+ transpose: choice(box.transpose, Tubular.Transposes, "Transpose"),
165
+ pitchEnvelope: {
166
+ rate1: byte(box.pitchEnvelope.rate1, 99, "Pitch EG Rate 1"),
167
+ rate2: byte(box.pitchEnvelope.rate2, 99, "Pitch EG Rate 2"),
168
+ rate3: byte(box.pitchEnvelope.rate3, 99, "Pitch EG Rate 3"),
169
+ rate4: byte(box.pitchEnvelope.rate4, 99, "Pitch EG Rate 4"),
170
+ level1: byte(box.pitchEnvelope.level1, 99, "Pitch EG Level 1"),
171
+ level2: byte(box.pitchEnvelope.level2, 99, "Pitch EG Level 2"),
172
+ level3: byte(box.pitchEnvelope.level3, 99, "Pitch EG Level 3"),
173
+ level4: byte(box.pitchEnvelope.level4, 99, "Pitch EG Level 4")
174
+ },
175
+ operators: box.operators.fields().map(operator)
176
+ };
177
+ };
@@ -1,3 +1,3 @@
1
- import { ApparatDeviceBox, CubedDeviceBox, NeonDeviceBox, MIDIOutputDeviceBox, NanoDeviceBox, PlayfieldDeviceBox, SoundfontDeviceBox, TapeDeviceBox, VaporisateurDeviceBox } from "@opendaw/studio-boxes";
2
- export type InstrumentBox = ApparatDeviceBox | CubedDeviceBox | TapeDeviceBox | VaporisateurDeviceBox | NeonDeviceBox | NanoDeviceBox | PlayfieldDeviceBox | SoundfontDeviceBox | MIDIOutputDeviceBox;
1
+ import { ApparatDeviceBox, CubedDeviceBox, NeonDeviceBox, TubularDeviceBox, MIDIOutputDeviceBox, NanoDeviceBox, InstrumentCompositeBox, PlayfieldDeviceBox, SoundfontDeviceBox, TapeDeviceBox, VaporisateurDeviceBox } from "@opendaw/studio-boxes";
2
+ export type InstrumentBox = ApparatDeviceBox | CubedDeviceBox | TapeDeviceBox | VaporisateurDeviceBox | NeonDeviceBox | TubularDeviceBox | NanoDeviceBox | PlayfieldDeviceBox | InstrumentCompositeBox | SoundfontDeviceBox | MIDIOutputDeviceBox;
3
3
  //# sourceMappingURL=InstrumentBox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InstrumentBox.d.ts","sourceRoot":"","sources":["../../src/factories/InstrumentBox.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACxB,MAAM,uBAAuB,CAAA;AAE9B,MAAM,MAAM,aAAa,GACnB,gBAAgB,GAChB,cAAc,GACd,aAAa,GACb,qBAAqB,GACrB,aAAa,GACb,aAAa,GACb,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,CAAA"}
1
+ {"version":3,"file":"InstrumentBox.d.ts","sourceRoot":"","sources":["../../src/factories/InstrumentBox.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACxB,MAAM,uBAAuB,CAAA;AAE9B,MAAM,MAAM,aAAa,GACnB,gBAAgB,GAChB,cAAc,GACd,aAAa,GACb,qBAAqB,GACrB,aAAa,GACb,gBAAgB,GAChB,aAAa,GACb,kBAAkB,GAClB,sBAAsB,GACtB,kBAAkB,GAClB,mBAAmB,CAAA"}
@@ -1,5 +1,6 @@
1
- import { ApparatDeviceBox, AudioFileBox, CubedDeviceBox, NeonDeviceBox, MIDIOutputDeviceBox, NanoDeviceBox, PlayfieldDeviceBox, SoundfontDeviceBox, SoundfontFileBox, TapeDeviceBox, VaporisateurDeviceBox } from "@opendaw/studio-boxes";
2
- import { byte, UUID } from "@opendaw/lib-std";
1
+ import { ApparatDeviceBox, AudioFileBox, CubedDeviceBox, NeonDeviceBox, TubularDeviceBox, MIDIOutputDeviceBox, NanoDeviceBox, InstrumentCompositeBox, PlayfieldDeviceBox, SoundfontDeviceBox, SoundfontFileBox, TapeDeviceBox, VaporisateurDeviceBox } from "@opendaw/studio-boxes";
2
+ import { byte, Optional, UUID } from "@opendaw/lib-std";
3
+ import { Box } from "@opendaw/lib-box";
3
4
  import { InstrumentFactory } from "./InstrumentFactory";
4
5
  export declare namespace InstrumentFactories {
5
6
  const Tape: InstrumentFactory<void, TapeDeviceBox>;
@@ -18,10 +19,15 @@ export declare namespace InstrumentFactories {
18
19
  const MIDIOutput: InstrumentFactory<void, MIDIOutputDeviceBox>;
19
20
  const Soundfont: InstrumentFactory<SoundfontFileBox, SoundfontDeviceBox>;
20
21
  const Apparat: InstrumentFactory<void, ApparatDeviceBox>;
22
+ const InstrumentComposite: InstrumentFactory<void, InstrumentCompositeBox>;
23
+ const isLayerInstrument: (factory: InstrumentFactory<any, any>) => boolean;
24
+ const Tubular: InstrumentFactory<void, TubularDeviceBox>;
21
25
  const Named: {
22
26
  Apparat: InstrumentFactory<void, ApparatDeviceBox>;
23
27
  Cubed: InstrumentFactory<void, CubedDeviceBox>;
28
+ InstrumentComposite: InstrumentFactory<void, InstrumentCompositeBox>;
24
29
  Neon: InstrumentFactory<void, NeonDeviceBox>;
30
+ Tubular: InstrumentFactory<void, TubularDeviceBox>;
25
31
  MIDIOutput: InstrumentFactory<void, MIDIOutputDeviceBox>;
26
32
  Nano: InstrumentFactory<AudioFileBox, NanoDeviceBox>;
27
33
  Playfield: InstrumentFactory<PlayfieldAttachment, PlayfieldDeviceBox>;
@@ -30,5 +36,6 @@ export declare namespace InstrumentFactories {
30
36
  Vaporisateur: InstrumentFactory<void, VaporisateurDeviceBox>;
31
37
  };
32
38
  type Keys = keyof typeof Named;
39
+ const keyOfBox: (box: Box) => Optional<Keys>;
33
40
  }
34
41
  //# sourceMappingURL=InstrumentFactories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InstrumentFactories.d.ts","sourceRoot":"","sources":["../../src/factories/InstrumentFactories.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gBAAgB,EAChB,YAAY,EAEZ,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAElB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACxB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAC,IAAI,EAAa,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAKtD,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAA;AAGrD,yBAAiB,mBAAmB,CAAC;IAC1B,MAAM,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAoBvD,CAAA;IAEM,MAAM,IAAI,EAAE,iBAAiB,CAAC,YAAY,EAAE,aAAa,CAiB/D,CAAA;IAED,KAAY,mBAAmB,GAAG,aAAa,CAAC;QAC5C,IAAI,EAAE,IAAI,CAAA;QACV,IAAI,EAAE,IAAI,CAAC,KAAK,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,iBAAiB,EAAE,MAAM,CAAA;QACzB,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC,CAAA;IAEK,MAAM,SAAS,EAAE,iBAAiB,CAAC,mBAAmB,EAAE,kBAAkB,CA8BhF,CAAA;IAEM,MAAM,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAiCvD,CAAA;IAEM,MAAM,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAiBzD,CAAA;IAEM,MAAM,YAAY,EAAE,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,CA8BvE,CAAA;IAEM,MAAM,UAAU,EAAE,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,CAiBnE,CAAA;IAEM,MAAM,SAAS,EAAE,iBAAiB,CAAC,gBAAgB,EAAE,kBAAkB,CAkB7E,CAAA;IAEM,MAAM,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,CAe7D,CAAA;IAEM,MAAM,KAAK;;;;;;;;;;KAAqF,CAAA;IACvG,KAAY,IAAI,GAAG,MAAM,OAAO,KAAK,CAAA;CAYxC"}
1
+ {"version":3,"file":"InstrumentFactories.d.ts","sourceRoot":"","sources":["../../src/factories/InstrumentFactories.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gBAAgB,EAChB,YAAY,EAEZ,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,kBAAkB,EAElB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACxB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAC,IAAI,EAAa,QAAQ,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAEhE,OAAO,EAAC,GAAG,EAAkB,MAAM,kBAAkB,CAAA;AAGrD,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAA;AAGrD,yBAAiB,mBAAmB,CAAC;IAC1B,MAAM,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAoBvD,CAAA;IAEM,MAAM,IAAI,EAAE,iBAAiB,CAAC,YAAY,EAAE,aAAa,CAiB/D,CAAA;IAED,KAAY,mBAAmB,GAAG,aAAa,CAAC;QAC5C,IAAI,EAAE,IAAI,CAAA;QACV,IAAI,EAAE,IAAI,CAAC,KAAK,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,iBAAiB,EAAE,MAAM,CAAA;QACzB,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC,CAAA;IAEK,MAAM,SAAS,EAAE,iBAAiB,CAAC,mBAAmB,EAAE,kBAAkB,CA8BhF,CAAA;IAEM,MAAM,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAiCvD,CAAA;IAEM,MAAM,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAiBzD,CAAA;IAEM,MAAM,YAAY,EAAE,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,CA8BvE,CAAA;IAEM,MAAM,UAAU,EAAE,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,CAiBnE,CAAA;IAEM,MAAM,SAAS,EAAE,iBAAiB,CAAC,gBAAgB,EAAE,kBAAkB,CAkB7E,CAAA;IAEM,MAAM,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,CAe7D,CAAA;IAEM,MAAM,mBAAmB,EAAE,iBAAiB,CAAC,IAAI,EAAE,sBAAsB,CAiB/E,CAAA;IAGM,MAAM,iBAAiB,GAAI,SAAS,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,KAAG,OACN,CAAA;IAE5D,MAAM,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,CAmB7D,CAAA;IAEM,MAAM,KAAK;;;;;;;;;;;;KAAmH,CAAA;IACrI,KAAY,IAAI,GAAG,MAAM,OAAO,KAAK,CAAA;IAE9B,MAAM,QAAQ,GAAI,KAAK,GAAG,KAAG,QAAQ,CAAC,IAAI,CAGhD,CAAA;CAYJ"}
@@ -1,4 +1,4 @@
1
- import { ApparatDeviceBox, AudioFileBox, CubedDeviceBox, NeonDeviceBox, MIDIOutputDeviceBox, NanoDeviceBox, PlayfieldDeviceBox, PlayfieldSampleBox, SoundfontDeviceBox, SoundfontFileBox, TapeDeviceBox, VaporisateurDeviceBox } from "@opendaw/studio-boxes";
1
+ import { ApparatDeviceBox, AudioFileBox, CubedDeviceBox, NeonDeviceBox, TubularDeviceBox, MIDIOutputDeviceBox, NanoDeviceBox, InstrumentCompositeBox, PlayfieldDeviceBox, PlayfieldSampleBox, SoundfontDeviceBox, SoundfontFileBox, TapeDeviceBox, VaporisateurDeviceBox } from "@opendaw/studio-boxes";
2
2
  import { isDefined, UUID } from "@opendaw/lib-std";
3
3
  import { ClassicWaveform } from "@opendaw/lib-dsp";
4
4
  import { IconSymbol, VoicingMode } from "@opendaw/studio-enums";
@@ -176,7 +176,43 @@ export var InstrumentFactories;
176
176
  box.host.refer(host);
177
177
  })
178
178
  };
179
- InstrumentFactories.Named = { Apparat: InstrumentFactories.Apparat, Cubed: InstrumentFactories.Cubed, Neon: InstrumentFactories.Neon, MIDIOutput: InstrumentFactories.MIDIOutput, Nano: InstrumentFactories.Nano, Playfield: InstrumentFactories.Playfield, Soundfont: InstrumentFactories.Soundfont, Tape: InstrumentFactories.Tape, Vaporisateur: InstrumentFactories.Vaporisateur };
179
+ InstrumentFactories.InstrumentComposite = {
180
+ defaultName: "Composite",
181
+ defaultIcon: IconSymbol.Stack,
182
+ briefDescription: "Layered instruments",
183
+ description: "Plays several instruments at once, each layer with its own effects, volume and panning",
184
+ manualPage: DeviceManualUrls.InstrumentComposite,
185
+ trackType: TrackType.Notes,
186
+ create: (boxGraph, host, name, icon) => {
187
+ return InstrumentCompositeBox.create(boxGraph, UUID.generate(), box => {
188
+ box.label.setValue(name);
189
+ box.icon.setValue(IconSymbol.toName(icon));
190
+ box.host.refer(host);
191
+ });
192
+ }
193
+ };
194
+ // MIDI Output is wired at unit level only
195
+ InstrumentFactories.isLayerInstrument = (factory) => factory.trackType === TrackType.Notes && factory !== InstrumentFactories.MIDIOutput;
196
+ InstrumentFactories.Tubular = {
197
+ defaultName: "Tubular",
198
+ defaultIcon: IconSymbol.Tubular,
199
+ briefDescription: "6-op FM Synth",
200
+ description: "Six-operator FM synthesizer, DX7 compatible",
201
+ manualPage: DeviceManualUrls.Tubular,
202
+ trackType: TrackType.Notes,
203
+ create: (boxGraph, host, name, icon, _attachment) => TubularDeviceBox.create(boxGraph, UUID.generate(), box => {
204
+ box.label.setValue(name);
205
+ box.icon.setValue(IconSymbol.toName(icon));
206
+ // The INIT VOICE: OP1 is the only sounding carrier (operators are OP1..OP6 in panel order).
207
+ box.operators.fields()[0].outputLevel.setInitValue(99);
208
+ box.host.refer(host);
209
+ })
210
+ };
211
+ InstrumentFactories.Named = { Apparat: InstrumentFactories.Apparat, Cubed: InstrumentFactories.Cubed, InstrumentComposite: InstrumentFactories.InstrumentComposite, Neon: InstrumentFactories.Neon, Tubular: InstrumentFactories.Tubular, MIDIOutput: InstrumentFactories.MIDIOutput, Nano: InstrumentFactories.Nano, Playfield: InstrumentFactories.Playfield, Soundfont: InstrumentFactories.Soundfont, Tape: InstrumentFactories.Tape, Vaporisateur: InstrumentFactories.Vaporisateur };
212
+ InstrumentFactories.keyOfBox = (box) => {
213
+ const stripped = box.name.replace(/DeviceBox$/, "").replace(/Box$/, "");
214
+ return Object.hasOwn(InstrumentFactories.Named, stripped) ? stripped : undefined;
215
+ };
180
216
  const useAudioFile = (boxGraph, fileUUID, name, duration) => boxGraph.findBox(fileUUID)
181
217
  .unwrapOrElse(() => AudioFileBox.create(boxGraph, fileUUID, box => {
182
218
  box.fileName.setValue(name);
package/dist/index.d.ts CHANGED
@@ -55,6 +55,7 @@ export * from "./audio/WarpMarkerBoxAdapter";
55
55
  export * from "./devices/audio-effects/AudioEffectComposite/AudioCompositeAdapter";
56
56
  export * from "./devices/audio-effects/AudioEffectComposite/AudioEffectCompositeCellBoxAdapter";
57
57
  export * from "./devices/audio-effects/AudioEffectCompositeBoxAdapter";
58
+ export * from "./devices/audio-effects/AudioSinkDeviceBoxAdapter";
58
59
  export * from "./devices/audio-effects/AutotuneDeviceBoxAdapter";
59
60
  export * from "./devices/audio-effects/CompressorDeviceBoxAdapter";
60
61
  export * from "./devices/audio-effects/ConvolverDeviceBoxAdapter";
@@ -82,6 +83,8 @@ export * from "./devices/instruments/Cubed/CubedPatternData";
82
83
  export * from "./devices/instruments/Cubed/CubedRandomize";
83
84
  export * from "./devices/instruments/Cubed/CubedStep";
84
85
  export * from "./devices/instruments/CubedDeviceBoxAdapter";
86
+ export * from "./devices/instruments/InstrumentComposite/InstrumentCompositeCellBoxAdapter";
87
+ export * from "./devices/instruments/InstrumentCompositeBoxAdapter";
85
88
  export * from "./devices/instruments/MIDIOutputDeviceBoxAdapter";
86
89
  export * from "./devices/instruments/NanoDeviceBoxAdapter";
87
90
  export * from "./devices/instruments/Neon/CzSysex";
@@ -93,6 +96,9 @@ export * from "./devices/instruments/Playfield/PlayfieldSampleBoxAdapter";
93
96
  export * from "./devices/instruments/PlayfieldDeviceBoxAdapter";
94
97
  export * from "./devices/instruments/SoundfontDeviceBoxAdapter";
95
98
  export * from "./devices/instruments/TapeDeviceBoxAdapter";
99
+ export * from "./devices/instruments/Tubular/Dx7Sysex";
100
+ export * from "./devices/instruments/Tubular/TubularPreset";
101
+ export * from "./devices/instruments/TubularDeviceBoxAdapter";
96
102
  export * from "./devices/instruments/VaporisateurDeviceBoxAdapter";
97
103
  export * from "./devices/instruments/VaporisateurSettings";
98
104
  export * from "./devices/midi-effects/ArpeggioDeviceBoxAdapter";
@@ -170,6 +176,7 @@ export * from "./timeline/MarkerTrackAdapter";
170
176
  export * from "./timeline/ParameterTracks";
171
177
  export * from "./timeline/RegionBoxAdapter";
172
178
  export * from "./timeline/RegionEditing";
179
+ export * from "./timeline/RegionOverlap";
173
180
  export * from "./timeline/SignatureEventBoxAdapter";
174
181
  export * from "./timeline/SignatureTrackAdapter";
175
182
  export * from "./timeline/TimelineBoxAdapter";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -57,6 +57,7 @@ export * from "./audio/WarpMarkerBoxAdapter";
57
57
  export * from "./devices/audio-effects/AudioEffectComposite/AudioCompositeAdapter";
58
58
  export * from "./devices/audio-effects/AudioEffectComposite/AudioEffectCompositeCellBoxAdapter";
59
59
  export * from "./devices/audio-effects/AudioEffectCompositeBoxAdapter";
60
+ export * from "./devices/audio-effects/AudioSinkDeviceBoxAdapter";
60
61
  export * from "./devices/audio-effects/AutotuneDeviceBoxAdapter";
61
62
  export * from "./devices/audio-effects/CompressorDeviceBoxAdapter";
62
63
  export * from "./devices/audio-effects/ConvolverDeviceBoxAdapter";
@@ -84,6 +85,8 @@ export * from "./devices/instruments/Cubed/CubedPatternData";
84
85
  export * from "./devices/instruments/Cubed/CubedRandomize";
85
86
  export * from "./devices/instruments/Cubed/CubedStep";
86
87
  export * from "./devices/instruments/CubedDeviceBoxAdapter";
88
+ export * from "./devices/instruments/InstrumentComposite/InstrumentCompositeCellBoxAdapter";
89
+ export * from "./devices/instruments/InstrumentCompositeBoxAdapter";
87
90
  export * from "./devices/instruments/MIDIOutputDeviceBoxAdapter";
88
91
  export * from "./devices/instruments/NanoDeviceBoxAdapter";
89
92
  export * from "./devices/instruments/Neon/CzSysex";
@@ -95,6 +98,9 @@ export * from "./devices/instruments/Playfield/PlayfieldSampleBoxAdapter";
95
98
  export * from "./devices/instruments/PlayfieldDeviceBoxAdapter";
96
99
  export * from "./devices/instruments/SoundfontDeviceBoxAdapter";
97
100
  export * from "./devices/instruments/TapeDeviceBoxAdapter";
101
+ export * from "./devices/instruments/Tubular/Dx7Sysex";
102
+ export * from "./devices/instruments/Tubular/TubularPreset";
103
+ export * from "./devices/instruments/TubularDeviceBoxAdapter";
98
104
  export * from "./devices/instruments/VaporisateurDeviceBoxAdapter";
99
105
  export * from "./devices/instruments/VaporisateurSettings";
100
106
  export * from "./devices/midi-effects/ArpeggioDeviceBoxAdapter";
@@ -172,6 +178,7 @@ export * from "./timeline/MarkerTrackAdapter";
172
178
  export * from "./timeline/ParameterTracks";
173
179
  export * from "./timeline/RegionBoxAdapter";
174
180
  export * from "./timeline/RegionEditing";
181
+ export * from "./timeline/RegionOverlap";
175
182
  export * from "./timeline/SignatureEventBoxAdapter";
176
183
  export * from "./timeline/SignatureTrackAdapter";
177
184
  export * from "./timeline/TimelineBoxAdapter";
@@ -1,11 +1,11 @@
1
1
  import { Attempt, int } from "@opendaw/lib-std";
2
2
  import { Field } from "@opendaw/lib-box";
3
3
  import { EffectPointerType } from "../DeviceAdapter";
4
- import { AudioUnitBox } from "@opendaw/studio-boxes";
4
+ import { AudioUnitBox, InstrumentCompositeCellBox } from "@opendaw/studio-boxes";
5
5
  import { ProjectSkeleton } from "../project/ProjectSkeleton";
6
6
  import { PresetHeader } from "./PresetHeader";
7
7
  export declare namespace PresetDecoder {
8
- const decode: (bytes: ArrayBufferLike, target: ProjectSkeleton) => ReadonlyArray<AudioUnitBox>;
8
+ const decode: (bytes: ArrayBufferLike, target: ProjectSkeleton, insertIndex?: int) => ReadonlyArray<AudioUnitBox>;
9
9
  const peekHasTimeline: (arrayBuffer: ArrayBuffer) => boolean;
10
10
  const replaceAudioUnit: (arrayBuffer: ArrayBuffer, targetAudioUnitBox: AudioUnitBox, options?: {
11
11
  keepMIDIEffects?: boolean;
@@ -13,5 +13,6 @@ export declare namespace PresetDecoder {
13
13
  keepTimeline?: boolean;
14
14
  }) => Attempt<void, string>;
15
15
  const insertEffectChain: (bytes: ArrayBufferLike, targetField: Field<EffectPointerType>, insertIndex: int, kind: PresetHeader.ChainKind) => Attempt<void, string>;
16
+ const replaceLayerInstrument: (bytes: ArrayBufferLike, cellBox: InstrumentCompositeCellBox) => Attempt<void, string>;
16
17
  }
17
18
  //# sourceMappingURL=PresetDecoder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PresetDecoder.d.ts","sourceRoot":"","sources":["../../src/preset/PresetDecoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,OAAO,EAGP,GAAG,EAQN,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAyB,KAAK,EAA2B,MAAM,kBAAkB,CAAA;AACxF,OAAO,EAAC,iBAAiB,EAAC,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAEH,YAAY,EAOf,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAA;AAE1D,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAA;AAI3C,yBAAiB,aAAa,CAAC;IACpB,MAAM,MAAM,GAAI,OAAO,eAAe,EAAE,QAAQ,eAAe,KAAG,aAAa,CAAC,YAAY,CAqElG,CAAA;IAEM,MAAM,eAAe,GAAI,aAAa,WAAW,KAAG,OAY1D,CAAA;IAEM,MAAM,gBAAgB,GAAI,aAAa,WAAW,EAAE,oBAAoB,YAAY,EAAE,UAAU;QACnG,eAAe,CAAC,EAAE,OAAO,CAAA;QACzB,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,YAAY,CAAC,EAAE,OAAO,CAAA;KACzB,KAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CA6GvB,CAAA;IAEM,MAAM,iBAAiB,GAC1B,OAAO,eAAe,EACtB,aAAa,KAAK,CAAC,iBAAiB,CAAC,EACrC,aAAa,GAAG,EAChB,MAAM,YAAY,CAAC,SAAS,KAC7B,OAAO,CAAC,IAAI,EAAE,MAAM,CAqGtB,CAAA;CACJ"}
1
+ {"version":3,"file":"PresetDecoder.d.ts","sourceRoot":"","sources":["../../src/preset/PresetDecoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,OAAO,EAGP,GAAG,EAQN,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAyB,KAAK,EAA2B,MAAM,kBAAkB,CAAA;AACxF,OAAO,EAAC,iBAAiB,EAAC,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAEH,YAAY,EAKZ,0BAA0B,EAG7B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAA;AAE1D,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAA;AAK3C,yBAAiB,aAAa,CAAC;IACpB,MAAM,MAAM,GAAI,OAAO,eAAe,EACtB,QAAQ,eAAe,EACvB,cAAc,GAAG,KAAG,aAAa,CAAC,YAAY,CAuEpE,CAAA;IAEM,MAAM,eAAe,GAAI,aAAa,WAAW,KAAG,OAY1D,CAAA;IAEM,MAAM,gBAAgB,GAAI,aAAa,WAAW,EAAE,oBAAoB,YAAY,EAAE,UAAU;QACnG,eAAe,CAAC,EAAE,OAAO,CAAA;QACzB,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,YAAY,CAAC,EAAE,OAAO,CAAA;KACzB,KAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CA6GvB,CAAA;IAyBM,MAAM,iBAAiB,GAC1B,OAAO,eAAe,EACtB,aAAa,KAAK,CAAC,iBAAiB,CAAC,EACrC,aAAa,GAAG,EAChB,MAAM,YAAY,CAAC,SAAS,KAC7B,OAAO,CAAC,IAAI,EAAE,MAAM,CAkFtB,CAAA;IAGM,MAAM,sBAAsB,GAAI,OAAO,eAAe,EAAE,SAAS,0BAA0B,KAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAkCxH,CAAA;CACJ"}
@@ -7,9 +7,10 @@ import { TransferUtils } from "../transfer";
7
7
  import { PresetHeader } from "./PresetHeader";
8
8
  import { TrackType } from "../timeline/TrackType";
9
9
  import { isModulatorBox } from "../modulation/ModulatorBoxAdapter";
10
+ import { InstrumentFactories } from "../factories/InstrumentFactories";
10
11
  export var PresetDecoder;
11
12
  (function (PresetDecoder) {
12
- PresetDecoder.decode = (bytes, target) => {
13
+ PresetDecoder.decode = (bytes, target, insertIndex) => {
13
14
  const header = new ByteArrayInput(bytes.slice(0, 8));
14
15
  if (header.readInt() !== PresetHeader.MAGIC_HEADER_OPEN) {
15
16
  RuntimeNotifier.notify({ message: "Invalid preset file.", icon: "Warning" });
@@ -47,7 +48,9 @@ export var PresetDecoder;
47
48
  const { mandatoryBoxes: { rootBox, primaryAudioBusBox } } = target;
48
49
  const uuidMap = TransferUtils.generateMap(sourceAudioUnitBoxes, dependencies, rootBox.audioUnits.address.uuid, primaryAudioBusBox.address.uuid);
49
50
  TransferUtils.copyBoxes(uuidMap, target.boxGraph, sourceAudioUnitBoxes, dependencies);
50
- TransferUtils.reorderAudioUnits(uuidMap, sourceAudioUnitBoxes, rootBox);
51
+ // A slot is a place among the instruments; a rack that carries buses keeps the by-type placement.
52
+ const allInstruments = sourceAudioUnitBoxes.every(box => box.type.getValue() === AudioUnitType.Instrument);
53
+ TransferUtils.reorderAudioUnits(uuidMap, sourceAudioUnitBoxes, rootBox, allInstruments ? insertIndex : undefined);
51
54
  const importedAudioUnits = sourceAudioUnitBoxes
52
55
  .map(source => asInstanceOf(rootBox.graph
53
56
  .findBox(uuidMap.get(source.address.uuid, "uuid mapping").target)
@@ -214,7 +217,7 @@ export var PresetDecoder;
214
217
  });
215
218
  return Attempts.Ok;
216
219
  };
217
- PresetDecoder.insertEffectChain = (bytes, targetField, insertIndex, kind) => {
220
+ const readSourceUnit = (bytes) => {
218
221
  if (bytes.byteLength < 8) {
219
222
  return Attempts.err("Invalid preset header");
220
223
  }
@@ -235,9 +238,14 @@ export var PresetDecoder;
235
238
  .filter(box => isInstanceOf(box, AudioUnitBox))
236
239
  .map(box => asInstanceOf(box, AudioUnitBox))
237
240
  .find(box => box.type.getValue() !== AudioUnitType.Output);
238
- if (isAbsent(sourceAudioUnit)) {
239
- return Attempts.err("Preset contains no audio unit");
241
+ return isAbsent(sourceAudioUnit) ? Attempts.err("Preset contains no audio unit") : Attempts.ok(sourceAudioUnit);
242
+ };
243
+ PresetDecoder.insertEffectChain = (bytes, targetField, insertIndex, kind) => {
244
+ const source = readSourceUnit(bytes);
245
+ if (source.isFailure()) {
246
+ return Attempts.err(source.failureReason());
240
247
  }
248
+ const sourceAudioUnit = source.result();
241
249
  const sourceField = kind === PresetHeader.ChainKind.Audio
242
250
  ? sourceAudioUnit.audioEffects
243
251
  : sourceAudioUnit.midiEffects;
@@ -263,7 +271,7 @@ export var PresetDecoder;
263
271
  || TransferUtils.excludeTimelinePredicate(box)
264
272
  || box instanceof AudioUnitBox;
265
273
  const effectSet = new Set(effects);
266
- const dependencies = TransferUtils.withModulators(Array.from(sourceGraph.dependenciesOf(effects, {
274
+ const dependencies = TransferUtils.withModulators(Array.from(sourceAudioUnit.graph.dependenciesOf(effects, {
267
275
  alwaysFollowMandatory: true,
268
276
  stopAtResources: true,
269
277
  excludeBox
@@ -322,4 +330,41 @@ export var PresetDecoder;
322
330
  });
323
331
  return Attempts.Ok;
324
332
  };
333
+ // only the instrument travels: the layer keeps its strip and chains
334
+ PresetDecoder.replaceLayerInstrument = (bytes, cellBox) => {
335
+ const source = readSourceUnit(bytes);
336
+ if (source.isFailure()) {
337
+ return Attempts.err(source.failureReason());
338
+ }
339
+ const sourceAudioUnit = source.result();
340
+ const instrument = sourceAudioUnit.input.pointerHub.incoming().at(0)?.box;
341
+ if (isAbsent(instrument) || instrument.tags.deviceType !== "instrument") {
342
+ return Attempts.err("Preset contains no instrument");
343
+ }
344
+ const factoryKey = InstrumentFactories.keyOfBox(instrument);
345
+ if (!isDefined(factoryKey) || !InstrumentFactories.isLayerInstrument(InstrumentFactories.Named[factoryKey])) {
346
+ return Attempts.err(`${instrument.name} cannot be used as a layer`);
347
+ }
348
+ const targetGraph = cellBox.graph;
349
+ const targetFieldAddress = cellBox.instrument.address;
350
+ const dependencies = TransferUtils.deviceDependencies(instrument);
351
+ const uuidMap = TransferUtils.mapUuids([instrument, ...dependencies]);
352
+ const fresh = dependencies.filter(source => !TransferUtils.keepsIdentity(source) || targetGraph.findBox(source.address.uuid).isEmpty());
353
+ cellBox.instrument.pointerHub.incoming().forEach(({ box }) => box.delete());
354
+ PointerField.decodeWith({
355
+ map: (pointer, address) => {
356
+ const internal = address.flatMap(addr => uuidMap.opt(addr.uuid).map(({ target }) => addr.moveTo(target)));
357
+ if (internal.nonEmpty()) {
358
+ return internal;
359
+ }
360
+ if (pointer.pointerType === Pointers.InstrumentHost) {
361
+ return Option.wrap(targetFieldAddress);
362
+ }
363
+ return address.flatMap(addr => targetGraph.findBox(addr.uuid).nonEmpty()
364
+ ? Option.wrap(addr)
365
+ : TransferUtils.mapModulatorCollection(pointer, targetGraph));
366
+ }
367
+ }, () => TransferUtils.cloneBoxes([instrument, ...fresh], uuidMap, targetGraph));
368
+ return Attempts.Ok;
369
+ };
325
370
  })(PresetDecoder || (PresetDecoder = {}));