@opendaw/studio-adapters 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/AutomatableParameterFieldAdapter.d.ts +3 -2
  2. package/dist/AutomatableParameterFieldAdapter.d.ts.map +1 -1
  3. package/dist/AutomatableParameterFieldAdapter.js +6 -3
  4. package/dist/BoxAdapters.d.ts.map +1 -1
  5. package/dist/BoxAdapters.js +2 -0
  6. package/dist/DeviceManualUrls.d.ts +3 -3
  7. package/dist/DeviceManualUrls.d.ts.map +1 -1
  8. package/dist/DeviceManualUrls.js +3 -3
  9. package/dist/ParameterAdapterSet.d.ts +2 -2
  10. package/dist/ParameterAdapterSet.d.ts.map +1 -1
  11. package/dist/ParameterOwner.d.ts +10 -0
  12. package/dist/ParameterOwner.d.ts.map +1 -0
  13. package/dist/ParameterOwner.js +73 -0
  14. package/dist/ScriptCompiler.d.ts.map +1 -1
  15. package/dist/ScriptCompiler.js +4 -2
  16. package/dist/ScriptDeclaration.d.ts +1 -0
  17. package/dist/ScriptDeclaration.d.ts.map +1 -1
  18. package/dist/ScriptDeclaration.js +20 -5
  19. package/dist/audio-unit/AudioUnitBoxAdapter.js +4 -4
  20. package/dist/devices/audio-effects/DelayDeviceBoxAdapter.js +13 -13
  21. package/dist/devices/audio-effects/NeuralAmpDeviceBoxAdapter.js +2 -2
  22. package/dist/devices/audio-effects/RevampDeviceBoxAdapter.js +3 -3
  23. package/dist/devices/audio-effects/ReverbDeviceBoxAdapter.d.ts +1 -1
  24. package/dist/devices/audio-effects/ReverbDeviceBoxAdapter.d.ts.map +1 -1
  25. package/dist/devices/audio-effects/ReverbDeviceBoxAdapter.js +4 -4
  26. package/dist/devices/audio-effects/StereoToolDeviceBoxAdapter.d.ts +1 -1
  27. package/dist/devices/audio-effects/StereoToolDeviceBoxAdapter.d.ts.map +1 -1
  28. package/dist/devices/audio-effects/StereoToolDeviceBoxAdapter.js +1 -1
  29. package/dist/devices/instruments/Cubed/AblPattern.d.ts +42 -0
  30. package/dist/devices/instruments/Cubed/AblPattern.d.ts.map +1 -0
  31. package/dist/devices/instruments/Cubed/AblPattern.js +66 -0
  32. package/dist/devices/instruments/Cubed/CubedPatternData.d.ts +16 -0
  33. package/dist/devices/instruments/Cubed/CubedPatternData.d.ts.map +1 -0
  34. package/dist/devices/instruments/Cubed/CubedPatternData.js +75 -0
  35. package/dist/devices/instruments/Cubed/CubedRandomize.d.ts +22 -0
  36. package/dist/devices/instruments/Cubed/CubedRandomize.d.ts.map +1 -0
  37. package/dist/devices/instruments/Cubed/CubedRandomize.js +51 -0
  38. package/dist/devices/instruments/Cubed/CubedStep.d.ts +13 -0
  39. package/dist/devices/instruments/Cubed/CubedStep.d.ts.map +1 -0
  40. package/dist/devices/instruments/Cubed/CubedStep.js +15 -0
  41. package/dist/devices/instruments/CubedDeviceBoxAdapter.d.ts +48 -0
  42. package/dist/devices/instruments/CubedDeviceBoxAdapter.d.ts.map +1 -0
  43. package/dist/devices/instruments/CubedDeviceBoxAdapter.js +100 -0
  44. package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.d.ts +1 -1
  45. package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.d.ts.map +1 -1
  46. package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.js +19 -3
  47. package/dist/devices/instruments/NanoDeviceBoxAdapter.js +2 -2
  48. package/dist/devices/instruments/Playfield/ChopModel.d.ts +21 -0
  49. package/dist/devices/instruments/Playfield/ChopModel.d.ts.map +1 -0
  50. package/dist/devices/instruments/Playfield/ChopModel.js +109 -0
  51. package/dist/devices/instruments/PlayfieldDeviceBoxAdapter.d.ts +12 -2
  52. package/dist/devices/instruments/PlayfieldDeviceBoxAdapter.d.ts.map +1 -1
  53. package/dist/devices/instruments/PlayfieldDeviceBoxAdapter.js +21 -1
  54. package/dist/devices/instruments/TapeDeviceBoxAdapter.js +4 -4
  55. package/dist/devices/midi-effects/ArpeggioDeviceBoxAdapter.js +1 -1
  56. package/dist/devices/midi-effects/PitchDeviceBoxAdapter.js +3 -3
  57. package/dist/factories/InstrumentBox.d.ts +2 -2
  58. package/dist/factories/InstrumentBox.d.ts.map +1 -1
  59. package/dist/factories/InstrumentFactories.d.ts +5 -9
  60. package/dist/factories/InstrumentFactories.d.ts.map +1 -1
  61. package/dist/factories/InstrumentFactories.js +20 -4
  62. package/dist/grooves/GrooveShuffleBoxAdapter.js +2 -2
  63. package/dist/index.d.ts +6 -0
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +6 -0
  66. package/dist/modulation/LfoModulatorBoxAdapter.d.ts +31 -0
  67. package/dist/modulation/LfoModulatorBoxAdapter.d.ts.map +1 -0
  68. package/dist/modulation/LfoModulatorBoxAdapter.js +48 -0
  69. package/dist/modulation/MacroModulatorBoxAdapter.d.ts +11 -0
  70. package/dist/modulation/MacroModulatorBoxAdapter.d.ts.map +1 -0
  71. package/dist/modulation/MacroModulatorBoxAdapter.js +21 -0
  72. package/dist/modulation/ModulationBoxAdapter.d.ts +27 -0
  73. package/dist/modulation/ModulationBoxAdapter.d.ts.map +1 -0
  74. package/dist/modulation/ModulationBoxAdapter.js +72 -0
  75. package/dist/modulation/ModulatorBoxAdapter.d.ts +35 -0
  76. package/dist/modulation/ModulatorBoxAdapter.d.ts.map +1 -0
  77. package/dist/modulation/ModulatorBoxAdapter.js +69 -0
  78. package/dist/modulation/Modulators.d.ts +25 -0
  79. package/dist/modulation/Modulators.d.ts.map +1 -0
  80. package/dist/modulation/Modulators.js +101 -0
  81. package/dist/modulation/RandomModulatorBoxAdapter.d.ts +24 -0
  82. package/dist/modulation/RandomModulatorBoxAdapter.d.ts.map +1 -0
  83. package/dist/modulation/RandomModulatorBoxAdapter.js +62 -0
  84. package/dist/modulation/StepsModulatorBoxAdapter.d.ts +42 -0
  85. package/dist/modulation/StepsModulatorBoxAdapter.d.ts.map +1 -0
  86. package/dist/modulation/StepsModulatorBoxAdapter.js +100 -0
  87. package/dist/timeline/ParameterTracks.d.ts +30 -0
  88. package/dist/timeline/ParameterTracks.d.ts.map +1 -0
  89. package/dist/timeline/ParameterTracks.js +75 -0
  90. package/dist/timeline/TrackBoxAdapter.d.ts +1 -0
  91. package/dist/timeline/TrackBoxAdapter.d.ts.map +1 -1
  92. package/dist/timeline/TrackBoxAdapter.js +20 -11
  93. package/dist/timeline/event/InterpolationFieldAdapter.d.ts +3 -1
  94. package/dist/timeline/event/InterpolationFieldAdapter.d.ts.map +1 -1
  95. package/dist/timeline/event/InterpolationFieldAdapter.js +2 -0
  96. package/package.json +10 -10
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AblPattern.d.ts","sourceRoot":"","sources":["../../../../src/devices/instruments/Cubed/AblPattern.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAS,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAA;AAErC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IAC/B,MAAM,EAAE,GAAG,CAAA;CACd,CAAA;AAED,yBAAiB,UAAU,CAAC;IACxB;;;;;OAKG;IACI,MAAM,SAAS,EAAE,GAAQ,CAAA;IAoBzB,MAAM,KAAK,GAAI,MAAM,MAAM,KAAG,UA+BpC,CAAA;CACJ"}
@@ -0,0 +1,66 @@
1
+ import { Option } from "@opendaw/lib-std";
2
+ export var AblPattern;
3
+ (function (AblPattern) {
4
+ /**
5
+ * MIDI note for the plugin's pitch 0. VERIFIED twice against captured plugin state: decoding the
6
+ * `scream` and `userlab` banks with this base reproduces their known note sequences exactly.
7
+ *
8
+ * NOT the Cubed step default of 60 - using that loads every pattern two octaves high.
9
+ */
10
+ AblPattern.BASE_NOTE = 36;
11
+ const NOTE_NAMES = {
12
+ c: 0, "c#": 1, d: 2, "d#": 3, e: 4, f: 5, "f#": 6, g: 7, "g#": 8, a: 9, "a#": 10, b: 11
13
+ };
14
+ /** `a#3` / `c-5` -> MIDI note. The `-` is a placeholder for "no accidental", not a minus sign. */
15
+ const parseNoteName = (text) => {
16
+ const match = text.toLowerCase().match(/^([a-g][#-]?)(-?\d+)$/);
17
+ if (match === null) {
18
+ return Option.None;
19
+ }
20
+ const semitone = NOTE_NAMES[match[1].replace("-", "")];
21
+ if (semitone === undefined) {
22
+ return Option.None;
23
+ }
24
+ // The named octave maps directly, which puts the plugin's base note (pitch 0 = MIDI 36) at
25
+ // `c-3` and middle C at `c-5` - consistent with the verified ABL3 base.
26
+ const note = semitone + parseInt(match[2], 10) * 12;
27
+ return note >= 0 && note <= 127 ? Option.wrap(note) : Option.None;
28
+ };
29
+ const flag = (text) => text !== undefined && parseInt(text, 10) !== 0;
30
+ AblPattern.parse = (text) => {
31
+ const steps = [];
32
+ for (const raw of text.split(/\r?\n/)) {
33
+ const line = raw.trim();
34
+ if (line.length === 0 || line.startsWith(";")) {
35
+ continue;
36
+ }
37
+ const columns = line.split(/\s+/);
38
+ const named = parseNoteName(columns[0]);
39
+ if (named.nonEmpty()) {
40
+ // ABL2: note gate accent slide
41
+ steps.push({
42
+ note: named.unwrap(),
43
+ active: flag(columns[1]),
44
+ accent: flag(columns[2]),
45
+ slide: flag(columns[3])
46
+ });
47
+ continue;
48
+ }
49
+ const pitch = parseInt(columns[0], 10);
50
+ if (!Number.isFinite(pitch)) {
51
+ continue;
52
+ }
53
+ // ABL3: pitch down up accent slide gate. Pitch is a semitone offset from the plugin's
54
+ // BASE NOTE, and the down/up flags shift it an octave.
55
+ const octave = (flag(columns[2]) ? 12 : 0) - (flag(columns[1]) ? 12 : 0);
56
+ const note = AblPattern.BASE_NOTE + pitch + octave;
57
+ steps.push({
58
+ note: Math.max(0, Math.min(127, note)),
59
+ accent: flag(columns[3]),
60
+ slide: flag(columns[4]),
61
+ active: flag(columns[5])
62
+ });
63
+ }
64
+ return { steps, length: steps.length };
65
+ };
66
+ })(AblPattern || (AblPattern = {}));
@@ -0,0 +1,16 @@
1
+ import { int, Option } from "@opendaw/lib-std";
2
+ import { CubedStep } from "./CubedStep";
3
+ export type CubedPatternData = {
4
+ length: int;
5
+ steps: ReadonlyArray<CubedStep>;
6
+ };
7
+ export declare namespace CubedPatternData {
8
+ const MaxSteps: int;
9
+ const Type = "cubed-pattern";
10
+ const Version = 1;
11
+ /** Accepts `60`, `C3` or `C#3`. The octave offset matches MidiKeys.toFullString. */
12
+ const parseNote: (text: string) => Option<int>;
13
+ const toJSON: ({ length, steps }: CubedPatternData) => string;
14
+ const fromJSON: (text: string) => Option<CubedPatternData>;
15
+ }
16
+ //# sourceMappingURL=CubedPatternData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CubedPatternData.d.ts","sourceRoot":"","sources":["../../../../src/devices/instruments/Cubed/CubedPatternData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,GAAG,EAAa,MAAM,EAAC,MAAM,kBAAkB,CAAA;AAE9D,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAA;AAErC,MAAM,MAAM,gBAAgB,GAAG;IAC3B,MAAM,EAAE,GAAG,CAAA;IACX,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;CAClC,CAAA;AAED,yBAAiB,gBAAgB,CAAC;IACvB,MAAM,QAAQ,EAAE,GAAQ,CAAA;IACxB,MAAM,IAAI,kBAAkB,CAAA;IAC5B,MAAM,OAAO,IAAI,CAAA;IAExB,oFAAoF;IAC7E,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,GAAG,CAYlD,CAAA;IAEM,MAAM,MAAM,GAAI,mBAAiB,gBAAgB,KAAG,MAOhD,CAAA;IAEJ,MAAM,QAAQ,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,gBAAgB,CACA,CAAA;CAmClE"}
@@ -0,0 +1,75 @@
1
+ import { clamp, isDefined, Option } from "@opendaw/lib-std";
2
+ import { MidiKeys } from "@opendaw/lib-dsp";
3
+ export var CubedPatternData;
4
+ (function (CubedPatternData) {
5
+ CubedPatternData.MaxSteps = 64;
6
+ CubedPatternData.Type = "cubed-pattern";
7
+ CubedPatternData.Version = 1;
8
+ /** Accepts `60`, `C3` or `C#3`. The octave offset matches MidiKeys.toFullString. */
9
+ CubedPatternData.parseNote = (text) => {
10
+ const trimmed = text.trim();
11
+ if (/^\d+$/.test(trimmed)) {
12
+ const value = parseInt(trimmed, 10);
13
+ return value >= 0 && value <= 127 ? Option.wrap(value) : Option.None;
14
+ }
15
+ const match = trimmed.match(/^([A-Ga-g])([#b]?)(-?\d+)$/);
16
+ if (match === null) {
17
+ return Option.None;
18
+ }
19
+ const bases = { C: 0, D: 2, E: 4, F: 5, G: 7, A: 9, B: 11 };
20
+ const accidental = match[2] === "#" ? 1 : match[2] === "b" ? -1 : 0;
21
+ const note = bases[match[1].toUpperCase()] + accidental + (parseInt(match[3], 10) + 2) * 12;
22
+ return note >= 0 && note <= 127 ? Option.wrap(note) : Option.None;
23
+ };
24
+ CubedPatternData.toJSON = ({ length, steps }) => JSON.stringify({
25
+ type: CubedPatternData.Type,
26
+ version: CubedPatternData.Version,
27
+ length,
28
+ steps: steps.map(({ note, active, slide, accent }) => ({
29
+ note: MidiKeys.toFullString(note), gate: active, slide, accent
30
+ }))
31
+ }, null, 2);
32
+ CubedPatternData.fromJSON = (text) => Option.tryCatch(() => JSON.parse(text)).flatMap(readObject);
33
+ const readNote = (value) => {
34
+ if (typeof value === "number" && Number.isFinite(value)) {
35
+ return Option.wrap(clamp(Math.round(value), 0, 127));
36
+ }
37
+ return typeof value === "string" ? CubedPatternData.parseNote(value) : Option.None;
38
+ };
39
+ const readFlag = (value) => value === true;
40
+ const readStep = (value) => {
41
+ if (typeof value !== "object" || value === null) {
42
+ return Option.None;
43
+ }
44
+ const source = value;
45
+ return readNote(source.note).map(note => ({
46
+ note,
47
+ active: readFlag(isDefined(source.gate) ? source.gate : source.active),
48
+ slide: readFlag(source.slide),
49
+ accent: readFlag(source.accent)
50
+ }));
51
+ };
52
+ const readObject = (value) => {
53
+ if (typeof value !== "object" || value === null) {
54
+ return Option.None;
55
+ }
56
+ const source = value;
57
+ if (isDefined(source.type) && source.type !== CubedPatternData.Type) {
58
+ return Option.None;
59
+ }
60
+ if (!Array.isArray(source.steps)) {
61
+ return Option.None;
62
+ }
63
+ const steps = source.steps.slice(0, CubedPatternData.MaxSteps).map(readStep);
64
+ if (steps.some(step => step.isEmpty())) {
65
+ return Option.None;
66
+ }
67
+ if (steps.length === 0) {
68
+ return Option.None;
69
+ }
70
+ const length = typeof source.length === "number" && Number.isFinite(source.length)
71
+ ? clamp(Math.round(source.length), 1, steps.length)
72
+ : steps.length;
73
+ return Option.wrap({ length, steps: steps.map(step => step.unwrap()) });
74
+ };
75
+ })(CubedPatternData || (CubedPatternData = {}));
@@ -0,0 +1,22 @@
1
+ import { int, unitValue } from "@opendaw/lib-std";
2
+ import { MidiKeys } from "@opendaw/lib-dsp";
3
+ export type CubedContour = "free" | "walk" | "rise" | "fall";
4
+ export type CubedRandomizeOptions = {
5
+ root: int;
6
+ scale: MidiKeys.PredefinedScale;
7
+ octave: int;
8
+ octaves: int;
9
+ density: unitValue;
10
+ accent: unitValue;
11
+ slide: unitValue;
12
+ motif: int;
13
+ contour: CubedContour;
14
+ rootFirst: boolean;
15
+ };
16
+ export declare namespace CubedRandomize {
17
+ const Contours: ReadonlyArray<CubedContour>;
18
+ const Motifs: ReadonlyArray<int>;
19
+ const Default: CubedRandomizeOptions;
20
+ const steps: (options: CubedRandomizeOptions, count: int) => ReadonlyArray<int>;
21
+ }
22
+ //# sourceMappingURL=CubedRandomize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CubedRandomize.d.ts","sourceRoot":"","sources":["../../../../src/devices/instruments/Cubed/CubedRandomize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,GAAG,EAAE,SAAS,EAAC,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAGzC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAE5D,MAAM,MAAM,qBAAqB,GAAG;IAChC,IAAI,EAAE,GAAG,CAAA;IACT,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAA;IAC/B,MAAM,EAAE,GAAG,CAAA;IACX,OAAO,EAAE,GAAG,CAAA;IACZ,OAAO,EAAE,SAAS,CAAA;IAClB,MAAM,EAAE,SAAS,CAAA;IACjB,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,GAAG,CAAA;IACV,OAAO,EAAE,YAAY,CAAA;IACrB,SAAS,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,yBAAiB,cAAc,CAAC;IACrB,MAAM,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAoC,CAAA;IAC9E,MAAM,MAAM,EAAE,aAAa,CAAC,GAAG,CAAmB,CAAA;IAElD,MAAM,OAAO,EAAE,qBAWrB,CAAA;IAOM,MAAM,KAAK,GAAI,SAAS,qBAAqB,EAAE,OAAO,GAAG,KAAG,aAAa,CAAC,GAAG,CA2BnF,CAAA;CACJ"}
@@ -0,0 +1,51 @@
1
+ import { Arrays, clamp } from "@opendaw/lib-std";
2
+ import { MidiKeys } from "@opendaw/lib-dsp";
3
+ import { CubedStep } from "./CubedStep";
4
+ export var CubedRandomize;
5
+ (function (CubedRandomize) {
6
+ CubedRandomize.Contours = ["free", "walk", "rise", "fall"];
7
+ CubedRandomize.Motifs = [0, 2, 3, 4, 8];
8
+ CubedRandomize.Default = {
9
+ root: 0,
10
+ scale: MidiKeys.StockScales[1],
11
+ octave: 1,
12
+ octaves: 3,
13
+ density: 0.6,
14
+ accent: 0.3,
15
+ slide: 0.2,
16
+ motif: 0,
17
+ contour: "free",
18
+ rootFirst: true
19
+ };
20
+ const keysOf = (scale) => {
21
+ const keys = Arrays.create(index => index, 12).filter(key => scale.has(key));
22
+ return keys.length === 0 ? [0] : keys;
23
+ };
24
+ CubedRandomize.steps = (options, count) => {
25
+ const keys = keysOf(options.scale);
26
+ const octaves = Math.max(1, options.octaves);
27
+ const span = keys.length * octaves;
28
+ const base = (options.octave + 2) * 12 + options.root;
29
+ const noteOf = (degree) => {
30
+ const bounded = clamp(degree, 0, span - 1);
31
+ return clamp(base + keys[bounded % keys.length] + Math.floor(bounded / keys.length) * 12, 0, 127);
32
+ };
33
+ const period = options.motif > 0 ? Math.min(options.motif, count) : count;
34
+ const jitter = (amount) => Math.round((Math.random() * 2 - 1) * amount);
35
+ const degrees = new Array(period);
36
+ for (let index = 0; index < period; index++) {
37
+ const ramp = period < 2 ? 0 : (index / (period - 1)) * (span - 1);
38
+ degrees[index] = options.rootFirst && index === 0 ? 0 : clamp(options.contour === "walk" ? (index === 0 ? span >> 1 : degrees[index - 1] + jitter(2))
39
+ : options.contour === "rise" ? Math.round(ramp) + jitter(1)
40
+ : options.contour === "fall" ? Math.round(span - 1 - ramp) + jitter(1)
41
+ : Math.floor(Math.random() * span), 0, span - 1);
42
+ }
43
+ const motif = Arrays.create(index => CubedStep.pack({
44
+ note: noteOf(degrees[index]),
45
+ active: (options.rootFirst && index === 0) || Math.random() < options.density,
46
+ slide: Math.random() < options.slide,
47
+ accent: Math.random() < options.accent
48
+ }), period);
49
+ return Arrays.create(index => motif[index % period], count);
50
+ };
51
+ })(CubedRandomize || (CubedRandomize = {}));
@@ -0,0 +1,13 @@
1
+ import { int } from "@opendaw/lib-std";
2
+ export type CubedStep = {
3
+ note: int;
4
+ active: boolean;
5
+ slide: boolean;
6
+ accent: boolean;
7
+ };
8
+ export declare namespace CubedStep {
9
+ const DefaultNote: int;
10
+ const pack: (step: CubedStep) => int;
11
+ const unpack: (bits: int) => CubedStep;
12
+ }
13
+ //# sourceMappingURL=CubedStep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CubedStep.d.ts","sourceRoot":"","sources":["../../../../src/devices/instruments/Cubed/CubedStep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AAEpC,MAAM,MAAM,SAAS,GAAG;IACpB,IAAI,EAAE,GAAG,CAAA;IACT,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,yBAAiB,SAAS,CAAC;IAChB,MAAM,WAAW,EAAE,GAAQ,CAAA;IAG3B,MAAM,IAAI,GAAI,MAAM,SAAS,KAAG,GAIL,CAAA;IAE3B,MAAM,MAAM,GAAI,MAAM,GAAG,KAAG,SAKjC,CAAA;CACL"}
@@ -0,0 +1,15 @@
1
+ export var CubedStep;
2
+ (function (CubedStep) {
3
+ CubedStep.DefaultNote = 60;
4
+ // one int32 per step: midi-note 0..6, active 7, slide 8, accent 9
5
+ CubedStep.pack = (step) => (step.note & 0x7F)
6
+ | ((step.active ? 1 : 0) << 7)
7
+ | ((step.slide ? 1 : 0) << 8)
8
+ | ((step.accent ? 1 : 0) << 9);
9
+ CubedStep.unpack = (bits) => ({
10
+ note: bits & 0x7F,
11
+ active: ((bits >> 7) & 1) === 1,
12
+ slide: ((bits >> 8) & 1) === 1,
13
+ accent: ((bits >> 9) & 1) === 1
14
+ });
15
+ })(CubedStep || (CubedStep = {}));
@@ -0,0 +1,48 @@
1
+ import { int, UUID } from "@opendaw/lib-std";
2
+ import { CubedDeviceBox, CubedPattern } 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
+ import { CubedPatternData } from "./Cubed/CubedPatternData";
10
+ import { CubedRandomizeOptions } from "./Cubed/CubedRandomize";
11
+ export declare class CubedDeviceBoxAdapter implements InstrumentDeviceBoxAdapter {
12
+ #private;
13
+ readonly type = "instrument";
14
+ readonly accepts = "midi";
15
+ readonly manualUrl = "manuals/devices/instruments/cubed";
16
+ readonly namedParameter: {
17
+ readonly tuning: import("../..").AutomatableParameterFieldAdapter<number>;
18
+ readonly cutoff: import("../..").AutomatableParameterFieldAdapter<import("@opendaw/lib-box").PrimitiveValues>;
19
+ readonly resonance: import("../..").AutomatableParameterFieldAdapter<import("@opendaw/lib-box").PrimitiveValues>;
20
+ readonly envMod: import("../..").AutomatableParameterFieldAdapter<import("@opendaw/lib-box").PrimitiveValues>;
21
+ readonly decay: import("../..").AutomatableParameterFieldAdapter<import("@opendaw/lib-box").PrimitiveValues>;
22
+ readonly accent: import("../..").AutomatableParameterFieldAdapter<import("@opendaw/lib-box").PrimitiveValues>;
23
+ readonly volume: import("../..").AutomatableParameterFieldAdapter<number>;
24
+ readonly waveform: import("../..").AutomatableParameterFieldAdapter<number>;
25
+ readonly patternIndex: import("../..").AutomatableParameterFieldAdapter<number>;
26
+ };
27
+ constructor(context: BoxAdaptersContext, box: CubedDeviceBox);
28
+ get box(): CubedDeviceBox;
29
+ get uuid(): UUID.Bytes;
30
+ get address(): Address;
31
+ get labelField(): StringField;
32
+ get iconField(): StringField;
33
+ get defaultTrackType(): TrackType;
34
+ get enabledField(): BooleanField;
35
+ get minimizedField(): BooleanField;
36
+ get acceptsMidiEvents(): boolean;
37
+ currentPattern(): CubedPattern;
38
+ readCurrentPattern(): CubedPatternData;
39
+ writeCurrentPattern({ length, steps }: CubedPatternData): void;
40
+ clearCurrentPattern(): void;
41
+ randomizeCurrentPattern(options?: CubedRandomizeOptions): void;
42
+ rotateCurrentPattern(offset: int): void;
43
+ deviceHost(): DeviceHost;
44
+ audioUnitBoxAdapter(): AudioUnitBoxAdapter;
45
+ labeledAudioOutputs(): Iterable<LabeledAudioOutput>;
46
+ terminate(): void;
47
+ }
48
+ //# sourceMappingURL=CubedDeviceBoxAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CubedDeviceBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/instruments/CubedDeviceBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,GAAG,EAAyB,IAAI,EAAe,MAAM,kBAAkB,CAAA;AACtF,OAAO,EAAC,cAAc,EAAE,YAAY,EAAC,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAC,UAAU,EAAW,0BAA0B,EAAC,MAAM,qBAAqB,CAAA;AACnF,OAAO,EAAC,kBAAkB,EAAC,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAA;AAE3D,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAA;AAExE,OAAO,EAAC,gBAAgB,EAAC,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAiB,qBAAqB,EAAC,MAAM,wBAAwB,CAAA;AAI5E,qBAAa,qBAAsB,YAAW,0BAA0B;;IACpE,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,OAAO,UAAS;IACzB,QAAQ,CAAC,SAAS,uCAAsC;IAMxD,QAAQ,CAAC,cAAc;;;;;;;;;;MAAA;gBAEX,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,cAAc;IAO5D,IAAI,GAAG,IAAI,cAAc,CAAmB;IAC5C,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,cAAc,IAAI,YAAY;IAE9B,kBAAkB,IAAI,gBAAgB;IAStC,mBAAmB,CAAC,EAAC,MAAM,EAAE,KAAK,EAAC,EAAE,gBAAgB,GAAG,IAAI;IAS5D,mBAAmB,IAAI,IAAI;IAI3B,uBAAuB,CAAC,OAAO,GAAE,qBAA8C,GAAG,IAAI;IAOtF,oBAAoB,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI;IAQvC,UAAU,IAAI,UAAU;IAKxB,mBAAmB,IAAI,mBAAmB;IAExC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAIrD,SAAS,IAAI,IAAI;CAwBpB"}
@@ -0,0 +1,100 @@
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 _CubedDeviceBoxAdapter_instances, _CubedDeviceBoxAdapter_context, _CubedDeviceBoxAdapter_box, _CubedDeviceBoxAdapter_parametric, _CubedDeviceBoxAdapter_wrapParameters;
13
+ import { clamp, Option, StringMapping, ValueMapping } from "@opendaw/lib-std";
14
+ import { Devices } from "../../DeviceAdapter";
15
+ import { ParameterAdapterSet } from "../../ParameterAdapterSet";
16
+ import { TrackType } from "../../timeline/TrackType";
17
+ import { CubedStep } from "./Cubed/CubedStep";
18
+ import { CubedRandomize } from "./Cubed/CubedRandomize";
19
+ const DefaultStep = CubedStep.pack({ note: CubedStep.DefaultNote, active: false, slide: false, accent: false });
20
+ export class CubedDeviceBoxAdapter {
21
+ constructor(context, box) {
22
+ _CubedDeviceBoxAdapter_instances.add(this);
23
+ this.type = "instrument";
24
+ this.accepts = "midi";
25
+ this.manualUrl = "manuals/devices/instruments/cubed";
26
+ _CubedDeviceBoxAdapter_context.set(this, void 0);
27
+ _CubedDeviceBoxAdapter_box.set(this, void 0);
28
+ _CubedDeviceBoxAdapter_parametric.set(this, void 0);
29
+ __classPrivateFieldSet(this, _CubedDeviceBoxAdapter_context, context, "f");
30
+ __classPrivateFieldSet(this, _CubedDeviceBoxAdapter_box, box, "f");
31
+ __classPrivateFieldSet(this, _CubedDeviceBoxAdapter_parametric, new ParameterAdapterSet(__classPrivateFieldGet(this, _CubedDeviceBoxAdapter_context, "f")), "f");
32
+ this.namedParameter = __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_instances, "m", _CubedDeviceBoxAdapter_wrapParameters).call(this, box);
33
+ }
34
+ get box() { return __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_box, "f"); }
35
+ get uuid() { return __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_box, "f").address.uuid; }
36
+ get address() { return __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_box, "f").address; }
37
+ get labelField() { return __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_box, "f").label; }
38
+ get iconField() { return __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_box, "f").icon; }
39
+ get defaultTrackType() { return TrackType.Notes; }
40
+ get enabledField() { return __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_box, "f").enabled; }
41
+ get minimizedField() { return __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_box, "f").minimized; }
42
+ get acceptsMidiEvents() { return true; }
43
+ currentPattern() { return __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_box, "f").patterns.getField(__classPrivateFieldGet(this, _CubedDeviceBoxAdapter_box, "f").patternIndex.getValue()); }
44
+ readCurrentPattern() {
45
+ const pattern = this.currentPattern();
46
+ const length = pattern.length.getValue();
47
+ return {
48
+ length,
49
+ steps: pattern.steps.fields().slice(0, length).map(field => CubedStep.unpack(field.getValue()))
50
+ };
51
+ }
52
+ writeCurrentPattern({ length, steps }) {
53
+ const pattern = this.currentPattern();
54
+ const fields = pattern.steps.fields();
55
+ const used = Math.min(steps.length, fields.length);
56
+ fields.forEach((field, index) => field.setValue(index < used ? CubedStep.pack(steps[index]) : DefaultStep));
57
+ pattern.length.setValue(clamp(length, 1, fields.length));
58
+ }
59
+ clearCurrentPattern() {
60
+ this.currentPattern().steps.fields().forEach(field => field.setValue(DefaultStep));
61
+ }
62
+ randomizeCurrentPattern(options = CubedRandomize.Default) {
63
+ const pattern = this.currentPattern();
64
+ const length = pattern.length.getValue();
65
+ const steps = CubedRandomize.steps(options, length);
66
+ pattern.steps.fields().forEach((field, index) => field.setValue(index < length ? steps[index] : DefaultStep));
67
+ }
68
+ rotateCurrentPattern(offset) {
69
+ const pattern = this.currentPattern();
70
+ const length = pattern.length.getValue();
71
+ const fields = pattern.steps.fields().slice(0, length);
72
+ const values = fields.map(field => field.getValue());
73
+ fields.forEach((field, index) => field.setValue(values[(index + offset + length) % length]));
74
+ }
75
+ deviceHost() {
76
+ return __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_context, "f").boxAdapters
77
+ .adapterFor(__classPrivateFieldGet(this, _CubedDeviceBoxAdapter_box, "f").host.targetVertex.unwrap("no device-host").box, Devices.isHost);
78
+ }
79
+ audioUnitBoxAdapter() { return this.deviceHost().audioUnitBoxAdapter(); }
80
+ *labeledAudioOutputs() {
81
+ yield { address: this.address, label: this.labelField.getValue(), children: () => Option.None };
82
+ }
83
+ terminate() {
84
+ __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_parametric, "f").terminate();
85
+ }
86
+ }
87
+ _CubedDeviceBoxAdapter_context = new WeakMap(), _CubedDeviceBoxAdapter_box = new WeakMap(), _CubedDeviceBoxAdapter_parametric = new WeakMap(), _CubedDeviceBoxAdapter_instances = new WeakSet(), _CubedDeviceBoxAdapter_wrapParameters = function _CubedDeviceBoxAdapter_wrapParameters(box) {
88
+ const unipolar = (field, name, anchor) => __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_parametric, "f").createParameter(field, ValueMapping.unipolar(), StringMapping.percent({ fractionDigits: 0 }), name, anchor);
89
+ return {
90
+ tuning: __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_parametric, "f").createParameter(box.tuning, ValueMapping.linear(-1200, 1200), StringMapping.numeric({ unit: "ct", fractionDigits: 0 }), "Tuning", 0.5),
91
+ cutoff: unipolar(box.cutoff, "Cutoff"),
92
+ resonance: unipolar(box.resonance, "Resonance"),
93
+ envMod: unipolar(box.envMod, "Env Mod"),
94
+ decay: unipolar(box.decay, "Decay"),
95
+ accent: unipolar(box.accent, "Accent"),
96
+ volume: __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_parametric, "f").createParameter(box.volume, ValueMapping.DefaultDecibel, StringMapping.numeric({ unit: "dB", fractionDigits: 1 }), "Volume"),
97
+ waveform: __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_parametric, "f").createParameter(box.waveform, ValueMapping.linearInteger(0, 1), StringMapping.indices("", ["Sawtooth", "Square"]), "Waveform", 0.5),
98
+ patternIndex: __classPrivateFieldGet(this, _CubedDeviceBoxAdapter_parametric, "f").createParameter(box.patternIndex, ValueMapping.linearInteger(0, box.patterns.fields().length - 1), StringMapping.oneBasedIndex(), "Pattern")
99
+ };
100
+ };
@@ -11,7 +11,7 @@ export declare class MIDIOutputDeviceBoxAdapter implements InstrumentDeviceBoxAd
11
11
  #private;
12
12
  readonly type = "instrument";
13
13
  readonly accepts = "midi";
14
- readonly manualUrl = "manuals/devices/instruments/midi-output";
14
+ readonly manualUrl = "manuals/devices/instruments/midioutput";
15
15
  constructor(context: BoxAdaptersContext, box: MIDIOutputDeviceBox);
16
16
  get box(): MIDIOutputDeviceBox;
17
17
  get uuid(): UUID.Bytes;
@@ -1 +1 @@
1
- {"version":3,"file":"MIDIOutputDeviceBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/instruments/MIDIOutputDeviceBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,gBAAgB,EAIhB,IAAI,EAEP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,aAAa,EAAE,mBAAmB,EAAyB,MAAM,uBAAuB,CAAA;AAChG,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAC,UAAU,EAAW,0BAA0B,EAAC,MAAM,qBAAqB,CAAA;AACnF,OAAO,EAAC,kBAAkB,EAAC,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAA;AAE3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAA;AAExE,qBAAa,0BAA2B,YAAW,0BAA0B;;IAGzE,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,OAAO,UAAS;IACzB,QAAQ,CAAC,SAAS,6CAA8B;gBAQpC,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,mBAAmB;IAqBjE,IAAI,GAAG,IAAI,mBAAmB,CAAmB;IACjD,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,UAAU,IAAI,WAAW,CAAyB;IACtD,IAAI,SAAS,IAAI,WAAW,CAAwB;IACpD,IAAI,gBAAgB,IAAI,SAAS,CAAyB;IAC1D,IAAI,YAAY,IAAI,YAAY,CAA2B;IAC3D,IAAI,cAAc,IAAI,YAAY,CAA6B;IAC/D,IAAI,iBAAiB,IAAI,OAAO,CAAc;IAC9C,IAAI,UAAU,IAAI,mBAAmB,CAA0B;IAC/D,IAAI,UAAU,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAA0B;IAE3E,UAAU,IAAI,UAAU;IAKxB,mBAAmB,IAAI,mBAAmB;IAEzC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAIpD,SAAS,IAAI,IAAI;CACpB"}
1
+ {"version":3,"file":"MIDIOutputDeviceBoxAdapter.d.ts","sourceRoot":"","sources":["../../../src/devices/instruments/MIDIOutputDeviceBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,gBAAgB,EAQhB,IAAI,EAEP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,aAAa,EAAE,mBAAmB,EAAyB,MAAM,uBAAuB,CAAA;AAChG,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAC,UAAU,EAAW,0BAA0B,EAAC,MAAM,qBAAqB,CAAA;AACnF,OAAO,EAAC,kBAAkB,EAAC,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAA;AAE3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAA;AAoBxE,qBAAa,0BAA2B,YAAW,0BAA0B;;IAGzE,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,OAAO,UAAS;IACzB,QAAQ,CAAC,SAAS,4CAA8B;gBAQpC,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,mBAAmB;IAuBjE,IAAI,GAAG,IAAI,mBAAmB,CAAmB;IACjD,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,UAAU,IAAI,WAAW,CAAyB;IACtD,IAAI,SAAS,IAAI,WAAW,CAAwB;IACpD,IAAI,gBAAgB,IAAI,SAAS,CAAyB;IAC1D,IAAI,YAAY,IAAI,YAAY,CAA2B;IAC3D,IAAI,cAAc,IAAI,YAAY,CAA6B;IAC/D,IAAI,iBAAiB,IAAI,OAAO,CAAc;IAC9C,IAAI,UAAU,IAAI,mBAAmB,CAA0B;IAC/D,IAAI,UAAU,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAA0B;IAE3E,UAAU,IAAI,UAAU;IAKxB,mBAAmB,IAAI,mBAAmB;IAEzC,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IAIpD,SAAS,IAAI,IAAI;CACpB"}
@@ -10,12 +10,26 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
12
  var _MIDIOutputDeviceBoxAdapter_terminator, _MIDIOutputDeviceBoxAdapter_context, _MIDIOutputDeviceBoxAdapter_box, _MIDIOutputDeviceBoxAdapter_midiDevice, _MIDIOutputDeviceBoxAdapter_parametric;
13
- import { asInstanceOf, MutableObservableOption, Option, StringMapping, Terminator, ValueMapping } from "@opendaw/lib-std";
13
+ import { asInstanceOf, MutableObservableOption, Option, StringMapping, Terminable, Terminator, ValueMapping } from "@opendaw/lib-std";
14
14
  import { MIDIOutputBox, MIDIOutputParameterBox } from "@opendaw/studio-boxes";
15
15
  import { Devices } from "../../DeviceAdapter";
16
16
  import { DeviceManualUrls } from "../../DeviceManualUrls";
17
17
  import { ParameterAdapterSet } from "../../ParameterAdapterSet";
18
18
  import { TrackType } from "../../timeline/TrackType";
19
+ const parameterName = (box) => new class {
20
+ getValue() {
21
+ const label = box.label.getValue().trim();
22
+ const controller = box.controller.getValue();
23
+ return label.length === 0 ? String(controller) : `${label} ${controller}`;
24
+ }
25
+ subscribe(observer) {
26
+ return Terminable.many(box.label.subscribe(() => observer(this)), box.controller.subscribe(() => observer(this)));
27
+ }
28
+ catchupAndSubscribe(observer) {
29
+ observer(this);
30
+ return this.subscribe(observer);
31
+ }
32
+ };
19
33
  export class MIDIOutputDeviceBoxAdapter {
20
34
  constructor(context, box) {
21
35
  _MIDIOutputDeviceBoxAdapter_terminator.set(this, new Terminator());
@@ -31,8 +45,10 @@ export class MIDIOutputDeviceBoxAdapter {
31
45
  __classPrivateFieldSet(this, _MIDIOutputDeviceBoxAdapter_midiDevice, new MutableObservableOption(), "f");
32
46
  __classPrivateFieldSet(this, _MIDIOutputDeviceBoxAdapter_parametric, __classPrivateFieldGet(this, _MIDIOutputDeviceBoxAdapter_terminator, "f").own(new ParameterAdapterSet(__classPrivateFieldGet(this, _MIDIOutputDeviceBoxAdapter_context, "f"))), "f");
33
47
  __classPrivateFieldGet(this, _MIDIOutputDeviceBoxAdapter_terminator, "f").ownAll(box.parameters.pointerHub.catchupAndSubscribe({
34
- onAdded: (({ box }) => __classPrivateFieldGet(this, _MIDIOutputDeviceBoxAdapter_parametric, "f")
35
- .createParameter(asInstanceOf(box, MIDIOutputParameterBox).value, ValueMapping.unipolar(), StringMapping.percent({ fractionDigits: 1 }), "", 0.0)),
48
+ onAdded: (({ box }) => {
49
+ const parameterBox = asInstanceOf(box, MIDIOutputParameterBox);
50
+ __classPrivateFieldGet(this, _MIDIOutputDeviceBoxAdapter_parametric, "f").createParameter(parameterBox.value, ValueMapping.unipolar(), StringMapping.percent({ fractionDigits: 1 }), parameterName(parameterBox), 0.0);
51
+ }),
36
52
  onRemoved: (({ box }) => __classPrivateFieldGet(this, _MIDIOutputDeviceBoxAdapter_parametric, "f")
37
53
  .removeParameter(asInstanceOf(box, MIDIOutputParameterBox).value.address))
38
54
  }), __classPrivateFieldGet(this, _MIDIOutputDeviceBoxAdapter_box, "f").device.catchupAndSubscribe(({ targetVertex }) => targetVertex.match({
@@ -52,7 +52,7 @@ export class NanoDeviceBoxAdapter {
52
52
  }
53
53
  _NanoDeviceBoxAdapter_context = new WeakMap(), _NanoDeviceBoxAdapter_box = new WeakMap(), _NanoDeviceBoxAdapter_parametric = new WeakMap(), _NanoDeviceBoxAdapter_instances = new WeakSet(), _NanoDeviceBoxAdapter_wrapParameters = function _NanoDeviceBoxAdapter_wrapParameters(box) {
54
54
  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")
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")
57
57
  };
58
58
  };
@@ -0,0 +1,21 @@
1
+ import { int, unitValue } from "@opendaw/lib-std";
2
+ import { PlayfieldChopSlice } from "../PlayfieldDeviceBoxAdapter";
3
+ export type ChopMode = "transients" | "grid";
4
+ export declare const GridDivisions: readonly [number, number, number, number];
5
+ export type GridDivision = (typeof GridDivisions)[number];
6
+ export declare namespace ChopMath {
7
+ const MAX_KEY = 128;
8
+ const fitBpmPow2: (durationInSeconds: number) => number;
9
+ const sliceSecondsForGrid: (bpm: number, division: GridDivision) => number;
10
+ }
11
+ export declare class ChopModel {
12
+ #private;
13
+ get boundaries(): ReadonlyArray<unitValue>;
14
+ fromTransients(transientSeconds: ReadonlyArray<number>, durationInSeconds: number, maxSlices: int): void;
15
+ fromGrid(bpm: number, division: GridDivision, durationInSeconds: number, maxSlices: int): void;
16
+ dragBoundary(index: int, position: unitValue): void;
17
+ splitAt(position: unitValue): void;
18
+ removeBoundary(index: int): void;
19
+ slices(startKey: int): ReadonlyArray<PlayfieldChopSlice>;
20
+ }
21
+ //# sourceMappingURL=ChopModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChopModel.d.ts","sourceRoot":"","sources":["../../../../src/devices/instruments/Playfield/ChopModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,GAAG,EAAE,SAAS,EAAC,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAC,kBAAkB,EAAC,MAAM,8BAA8B,CAAA;AAE/D,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,MAAM,CAAA;AAE5C,eAAO,MAAM,aAAa,2CAA0C,CAAA;AACpE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAEzD,yBAAiB,QAAQ,CAAC;IACf,MAAM,OAAO,MAAM,CAAA;IAEnB,MAAM,UAAU,GAAI,mBAAmB,MAAM,KAAG,MAMtD,CAAA;IAEM,MAAM,mBAAmB,GAAI,KAAK,MAAM,EAAE,UAAU,YAAY,KAAG,MAAqC,CAAA;CAClH;AAED,qBAAa,SAAS;;IAGlB,IAAI,UAAU,IAAI,aAAa,CAAC,SAAS,CAAC,CAA0B;IAepE,cAAc,CAAC,gBAAgB,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI;IAKxG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI;IAY9F,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,GAAG,IAAI;IAOnD,OAAO,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IASlC,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAKhC,MAAM,CAAC,QAAQ,EAAE,GAAG,GAAG,aAAa,CAAC,kBAAkB,CAAC;CAQ3D"}