@opendaw/studio-adapters 0.2.0 → 0.3.0
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.
- package/dist/AutomatableParameterFieldAdapter.d.ts +3 -2
- package/dist/AutomatableParameterFieldAdapter.d.ts.map +1 -1
- package/dist/AutomatableParameterFieldAdapter.js +6 -3
- package/dist/BoxAdapters.d.ts.map +1 -1
- package/dist/BoxAdapters.js +2 -0
- package/dist/ParameterAdapterSet.d.ts +2 -2
- package/dist/ParameterAdapterSet.d.ts.map +1 -1
- package/dist/ScriptCompiler.d.ts.map +1 -1
- package/dist/ScriptCompiler.js +4 -2
- package/dist/ScriptDeclaration.d.ts +1 -0
- package/dist/ScriptDeclaration.d.ts.map +1 -1
- package/dist/ScriptDeclaration.js +20 -5
- package/dist/audio-unit/AudioUnitBoxAdapter.js +4 -4
- package/dist/devices/audio-effects/DelayDeviceBoxAdapter.js +13 -13
- package/dist/devices/audio-effects/NeuralAmpDeviceBoxAdapter.js +2 -2
- package/dist/devices/audio-effects/RevampDeviceBoxAdapter.js +3 -3
- package/dist/devices/audio-effects/ReverbDeviceBoxAdapter.js +4 -4
- package/dist/devices/audio-effects/StereoToolDeviceBoxAdapter.js +1 -1
- package/dist/devices/instruments/Cubed/AblPattern.d.ts +42 -0
- package/dist/devices/instruments/Cubed/AblPattern.d.ts.map +1 -0
- package/dist/devices/instruments/Cubed/AblPattern.js +66 -0
- package/dist/devices/instruments/Cubed/CubedPatternData.d.ts +16 -0
- package/dist/devices/instruments/Cubed/CubedPatternData.d.ts.map +1 -0
- package/dist/devices/instruments/Cubed/CubedPatternData.js +75 -0
- package/dist/devices/instruments/Cubed/CubedRandomize.d.ts +22 -0
- package/dist/devices/instruments/Cubed/CubedRandomize.d.ts.map +1 -0
- package/dist/devices/instruments/Cubed/CubedRandomize.js +51 -0
- package/dist/devices/instruments/Cubed/CubedStep.d.ts +13 -0
- package/dist/devices/instruments/Cubed/CubedStep.d.ts.map +1 -0
- package/dist/devices/instruments/Cubed/CubedStep.js +15 -0
- package/dist/devices/instruments/CubedDeviceBoxAdapter.d.ts +48 -0
- package/dist/devices/instruments/CubedDeviceBoxAdapter.d.ts.map +1 -0
- package/dist/devices/instruments/CubedDeviceBoxAdapter.js +100 -0
- package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.js +19 -3
- package/dist/devices/instruments/NanoDeviceBoxAdapter.js +2 -2
- package/dist/devices/instruments/Playfield/ChopModel.d.ts +21 -0
- package/dist/devices/instruments/Playfield/ChopModel.d.ts.map +1 -0
- package/dist/devices/instruments/Playfield/ChopModel.js +109 -0
- package/dist/devices/instruments/PlayfieldDeviceBoxAdapter.d.ts +12 -2
- package/dist/devices/instruments/PlayfieldDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/instruments/PlayfieldDeviceBoxAdapter.js +21 -1
- package/dist/devices/instruments/TapeDeviceBoxAdapter.js +4 -4
- package/dist/devices/midi-effects/ArpeggioDeviceBoxAdapter.js +1 -1
- package/dist/devices/midi-effects/PitchDeviceBoxAdapter.js +3 -3
- package/dist/factories/InstrumentBox.d.ts +2 -2
- package/dist/factories/InstrumentBox.d.ts.map +1 -1
- package/dist/factories/InstrumentFactories.d.ts +5 -9
- package/dist/factories/InstrumentFactories.d.ts.map +1 -1
- package/dist/factories/InstrumentFactories.js +20 -4
- package/dist/grooves/GrooveShuffleBoxAdapter.js +2 -2
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/timeline/TrackBoxAdapter.d.ts +1 -0
- package/dist/timeline/TrackBoxAdapter.d.ts.map +1 -1
- package/dist/timeline/TrackBoxAdapter.js +20 -11
- package/dist/timeline/event/InterpolationFieldAdapter.d.ts +3 -1
- package/dist/timeline/event/InterpolationFieldAdapter.d.ts.map +1 -1
- package/dist/timeline/event/InterpolationFieldAdapter.js +2 -0
- package/package.json +10 -10
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ControlSourceListener, Observer, Option, Parameter, StringMapping, StringResult, Subscription, Terminable, unitValue, ValueMapping } from "@opendaw/lib-std";
|
|
1
|
+
import { ControlSourceListener, ObservableValue, Observer, Option, Parameter, StringMapping, StringResult, Subscription, Terminable, unitValue, ValueMapping } from "@opendaw/lib-std";
|
|
2
2
|
import { ppqn } from "@opendaw/lib-dsp";
|
|
3
3
|
import { Address, PrimitiveField, PrimitiveType, PrimitiveValues } from "@opendaw/lib-box";
|
|
4
4
|
import { Pointers } from "@opendaw/studio-enums";
|
|
@@ -7,7 +7,7 @@ import { AudioUnitTracks } from "./audio-unit/AudioUnitTracks";
|
|
|
7
7
|
import { BoxAdaptersContext } from "./BoxAdaptersContext";
|
|
8
8
|
export declare class AutomatableParameterFieldAdapter<T extends PrimitiveValues = any> implements Parameter<T>, Terminable {
|
|
9
9
|
#private;
|
|
10
|
-
constructor(context: BoxAdaptersContext, field: PrimitiveField<T, any>, valueMapping: ValueMapping<T>, stringMapping: StringMapping<T>, name: string
|
|
10
|
+
constructor(context: BoxAdaptersContext, field: PrimitiveField<T, any>, valueMapping: ValueMapping<T>, stringMapping: StringMapping<T>, name: string | ObservableValue<string>, anchor?: unitValue, resetValue?: T);
|
|
11
11
|
registerMidiControl(): Terminable;
|
|
12
12
|
get field(): PrimitiveField<T, Pointers.Automation>;
|
|
13
13
|
get valueMapping(): ValueMapping<T>;
|
|
@@ -17,6 +17,7 @@ export declare class AutomatableParameterFieldAdapter<T extends PrimitiveValues
|
|
|
17
17
|
get type(): PrimitiveType;
|
|
18
18
|
get address(): Address;
|
|
19
19
|
get track(): Option<TrackBoxAdapter>;
|
|
20
|
+
catchupAndSubscribeName(observer: Observer<string>): Subscription;
|
|
20
21
|
registerTracks(tracks: AudioUnitTracks): Terminable;
|
|
21
22
|
touchStart(): void;
|
|
22
23
|
touchEnd(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutomatableParameterFieldAdapter.d.ts","sourceRoot":"","sources":["../src/AutomatableParameterFieldAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,qBAAqB,EAKrB,QAAQ,EACR,MAAM,EAEN,SAAS,EACT,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,UAAU,EAEV,SAAS,EACT,YAAY,EACf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAC,OAAO,EAA8B,cAAc,EAAE,aAAa,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAA;AACpH,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAE9C,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AAQvD,qBAAa,gCAAgC,CAAC,CAAC,SAAS,eAAe,GAAG,GAAG,CAAE,YAAW,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU;;gBAmBlG,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,EAC7B,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAC7B,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,EAC/B,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"AutomatableParameterFieldAdapter.d.ts","sourceRoot":"","sources":["../src/AutomatableParameterFieldAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,qBAAqB,EAKrB,eAAe,EACf,QAAQ,EACR,MAAM,EAEN,SAAS,EACT,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,UAAU,EAEV,SAAS,EACT,YAAY,EACf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAC,OAAO,EAA8B,cAAc,EAAE,aAAa,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAA;AACpH,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAE9C,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AAQvD,qBAAa,gCAAgC,CAAC,CAAC,SAAS,eAAe,GAAG,GAAG,CAAE,YAAW,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU;;gBAmBlG,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,EAC7B,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAC7B,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,EAC/B,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,EACtC,MAAM,CAAC,EAAE,SAAS,EAClB,UAAU,CAAC,EAAE,CAAC;IAsE1B,mBAAmB,IAAI,UAAU;IAWjC,IAAI,KAAK,IAAI,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAqB;IACxE,IAAI,YAAY,IAAI,YAAY,CAAC,CAAC,CAAC,CAA4B;IAC/D,IAAI,aAAa,IAAI,aAAa,CAAC,CAAC,CAAC,CAA6B;IAClE,IAAI,IAAI,IAAI,MAAM,CAA+B;IACjD,IAAI,MAAM,IAAI,SAAS,CAAsB;IAC7C,IAAI,IAAI,IAAI,aAAa,CAA0B;IACnD,IAAI,OAAO,IAAI,OAAO,CAA6B;IACnD,IAAI,KAAK,IAAI,MAAM,CAAC,eAAe,CAAC,CAA+B;IAEnE,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,YAAY;IAIjE,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,UAAU;IAGnD,UAAU,IAAI,IAAI;IAIlB,QAAQ,IAAI,IAAI;IAEhB,cAAc,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;IAMpF,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC;IAW1B,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY;IAIhF,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY;IAK1F,iCAAiC,CAAC,QAAQ,EAAE,qBAAqB,GAAG,YAAY;IAMhF,QAAQ,IAAI,CAAC;IACb,QAAQ,CAAC,KAAK,EAAE,CAAC;IAMjB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IACpC,YAAY,IAAI,SAAS;IACzB,kBAAkB,IAAI,CAAC;IACvB,sBAAsB,IAAI,SAAS;IACnC,uBAAuB,IAAI,QAAQ,CAAC,YAAY,CAAC;IACjD,aAAa,IAAI,QAAQ,CAAC,YAAY,CAAC;IACvC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWjC,KAAK,IAAI,IAAI;IAEb,SAAS,IAAI,IAAI;CAKpB"}
|
|
@@ -10,7 +10,7 @@ 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 _AutomatableParameterFieldAdapter_context, _AutomatableParameterFieldAdapter_field, _AutomatableParameterFieldAdapter_name, _AutomatableParameterFieldAdapter_anchor, _AutomatableParameterFieldAdapter_resetValue, _AutomatableParameterFieldAdapter_terminator, _AutomatableParameterFieldAdapter_valueChangeNotifier, _AutomatableParameterFieldAdapter_controlSource, _AutomatableParameterFieldAdapter_valueMapping, _AutomatableParameterFieldAdapter_stringMapping, _AutomatableParameterFieldAdapter_trackBoxAdapter, _AutomatableParameterFieldAdapter_automationHandle, _AutomatableParameterFieldAdapter_controlledValue, _AutomatableParameterFieldAdapter_midiControlled;
|
|
13
|
-
import { assert, clamp, isNull, Listeners, Notifier, Option, panic, Terminator } from "@opendaw/lib-std";
|
|
13
|
+
import { assert, clamp, isNull, Listeners, Notifier, ObservableValue, Option, panic, Terminator } from "@opendaw/lib-std";
|
|
14
14
|
import { Pointers } from "@opendaw/studio-enums";
|
|
15
15
|
import { TrackBoxAdapter } from "./timeline/TrackBoxAdapter";
|
|
16
16
|
const ExternalControlTypes = [
|
|
@@ -39,7 +39,7 @@ export class AutomatableParameterFieldAdapter {
|
|
|
39
39
|
__classPrivateFieldSet(this, _AutomatableParameterFieldAdapter_field, field, "f");
|
|
40
40
|
__classPrivateFieldSet(this, _AutomatableParameterFieldAdapter_valueMapping, valueMapping, "f");
|
|
41
41
|
__classPrivateFieldSet(this, _AutomatableParameterFieldAdapter_stringMapping, stringMapping, "f");
|
|
42
|
-
__classPrivateFieldSet(this, _AutomatableParameterFieldAdapter_name, name, "f");
|
|
42
|
+
__classPrivateFieldSet(this, _AutomatableParameterFieldAdapter_name, typeof name === "string" ? ObservableValue.seal(name) : name, "f");
|
|
43
43
|
__classPrivateFieldSet(this, _AutomatableParameterFieldAdapter_anchor, anchor ?? 0.0, "f");
|
|
44
44
|
__classPrivateFieldSet(this, _AutomatableParameterFieldAdapter_resetValue, Option.wrap(resetValue), "f");
|
|
45
45
|
__classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_terminator, "f").own(__classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_context, "f").parameterFieldAdapters.register(this));
|
|
@@ -119,11 +119,14 @@ export class AutomatableParameterFieldAdapter {
|
|
|
119
119
|
get field() { return __classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_field, "f"); }
|
|
120
120
|
get valueMapping() { return __classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_valueMapping, "f"); }
|
|
121
121
|
get stringMapping() { return __classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_stringMapping, "f"); }
|
|
122
|
-
get name() { return __classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_name, "f"); }
|
|
122
|
+
get name() { return __classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_name, "f").getValue(); }
|
|
123
123
|
get anchor() { return __classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_anchor, "f"); }
|
|
124
124
|
get type() { return __classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_field, "f").type; }
|
|
125
125
|
get address() { return __classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_field, "f").address; }
|
|
126
126
|
get track() { return __classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_trackBoxAdapter, "f"); }
|
|
127
|
+
catchupAndSubscribeName(observer) {
|
|
128
|
+
return __classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_name, "f").catchupAndSubscribe(owner => observer(owner.getValue()));
|
|
129
|
+
}
|
|
127
130
|
registerTracks(tracks) {
|
|
128
131
|
return __classPrivateFieldGet(this, _AutomatableParameterFieldAdapter_context, "f").parameterFieldAdapters.registerTracks(this.address, tracks);
|
|
129
132
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BoxAdapters.d.ts","sourceRoot":"","sources":["../src/BoxAdapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,UAAU,EACV,KAAK,EAEL,MAAM,EAIN,UAAU,EAEb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,GAAG,EAAS,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"BoxAdapters.d.ts","sourceRoot":"","sources":["../src/BoxAdapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,UAAU,EACV,KAAK,EAEL,MAAM,EAIN,UAAU,EAEb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,GAAG,EAAS,MAAM,kBAAkB,CAAA;AA2H5C,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AA6BvC,qBAAa,WAAY,YAAW,UAAU;;gBAO9B,OAAO,EAAE,kBAAkB;IAkBvC,SAAS,IAAI,IAAI;IAMjB,UAAU,CAAC,GAAG,SAAS,GAAG,EAAE,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;IAkBnG,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC;CA+E3C"}
|
package/dist/BoxAdapters.js
CHANGED
|
@@ -47,6 +47,7 @@ import { ArpeggioDeviceBoxAdapter } from "./devices/midi-effects/ArpeggioDeviceB
|
|
|
47
47
|
import { PitchDeviceBoxAdapter } from "./devices/midi-effects/PitchDeviceBoxAdapter";
|
|
48
48
|
import { SpielwerkDeviceBoxAdapter } from "./devices/midi-effects/SpielwerkDeviceBoxAdapter";
|
|
49
49
|
import { ApparatDeviceBoxAdapter } from "./devices/instruments/ApparatDeviceBoxAdapter";
|
|
50
|
+
import { CubedDeviceBoxAdapter } from "./devices/instruments/CubedDeviceBoxAdapter";
|
|
50
51
|
import { NeonDeviceBoxAdapter } from "./devices/instruments/NeonDeviceBoxAdapter";
|
|
51
52
|
import { NanoDeviceBoxAdapter } from "./devices/instruments/NanoDeviceBoxAdapter";
|
|
52
53
|
import { PlayfieldDeviceBoxAdapter } from "./devices/instruments/PlayfieldDeviceBoxAdapter";
|
|
@@ -141,6 +142,7 @@ _BoxAdapters_context = new WeakMap(), _BoxAdapters_adapters = new WeakMap(), _Bo
|
|
|
141
142
|
visitTransientMarkerBox: (box) => new TransientMarkerBoxAdapter(box),
|
|
142
143
|
visitWarpMarkerBox: (box) => new WarpMarkerBoxAdapter(__classPrivateFieldGet(this, _BoxAdapters_context, "f"), box),
|
|
143
144
|
visitApparatDeviceBox: (box) => new ApparatDeviceBoxAdapter(__classPrivateFieldGet(this, _BoxAdapters_context, "f"), box),
|
|
145
|
+
visitCubedDeviceBox: (box) => new CubedDeviceBoxAdapter(__classPrivateFieldGet(this, _BoxAdapters_context, "f"), box),
|
|
144
146
|
visitAudioRegionBox: (box) => new AudioRegionBoxAdapter(__classPrivateFieldGet(this, _BoxAdapters_context, "f"), box),
|
|
145
147
|
visitAudioUnitBox: (box) => new AudioUnitBoxAdapter(__classPrivateFieldGet(this, _BoxAdapters_context, "f"), box),
|
|
146
148
|
visitAuxSendBox: (box) => new AuxSendBoxAdapter(__classPrivateFieldGet(this, _BoxAdapters_context, "f"), box),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Address, PointerTypes, PrimitiveField, PrimitiveValues } from "@opendaw/lib-box";
|
|
2
|
-
import { StringMapping, Terminable, unitValue, ValueMapping } from "@opendaw/lib-std";
|
|
2
|
+
import { ObservableValue, StringMapping, Terminable, unitValue, ValueMapping } from "@opendaw/lib-std";
|
|
3
3
|
import { AutomatableParameterFieldAdapter } from "./AutomatableParameterFieldAdapter";
|
|
4
4
|
import { BoxAdaptersContext } from "./BoxAdaptersContext";
|
|
5
5
|
export declare class ParameterAdapterSet implements Terminable {
|
|
@@ -8,7 +8,7 @@ export declare class ParameterAdapterSet implements Terminable {
|
|
|
8
8
|
terminate(): void;
|
|
9
9
|
parameters(): ReadonlyArray<AutomatableParameterFieldAdapter>;
|
|
10
10
|
parameterAt(address: Address): AutomatableParameterFieldAdapter;
|
|
11
|
-
createParameter<T extends PrimitiveValues>(field: PrimitiveField<T, PointerTypes>, valueMapping: ValueMapping<T>, stringMapping: StringMapping<T>, name: string
|
|
11
|
+
createParameter<T extends PrimitiveValues>(field: PrimitiveField<T, PointerTypes>, valueMapping: ValueMapping<T>, stringMapping: StringMapping<T>, name: string | ObservableValue<string>, anchor?: unitValue, resetValue?: T): AutomatableParameterFieldAdapter<T>;
|
|
12
12
|
removeParameter<T extends PrimitiveValues>(address: Address): AutomatableParameterFieldAdapter<T>;
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=ParameterAdapterSet.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParameterAdapterSet.d.ts","sourceRoot":"","sources":["../src/ParameterAdapterSet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAA;AACvF,OAAO,
|
|
1
|
+
{"version":3,"file":"ParameterAdapterSet.d.ts","sourceRoot":"","sources":["../src/ParameterAdapterSet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAA;AACvF,OAAO,EAEH,eAAe,EAEf,aAAa,EACb,UAAU,EACV,SAAS,EACT,YAAY,EACf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,gCAAgC,EAAC,MAAM,oCAAoC,CAAA;AAEnF,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AAEvD,qBAAa,mBAAoB,YAAW,UAAU;;gBAItC,OAAO,EAAE,kBAAkB;IAKvC,SAAS,IAAI,IAAI;IAKjB,UAAU,IAAI,aAAa,CAAC,gCAAgC,CAAC;IAC7D,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,gCAAgC;IAK/D,eAAe,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,YAAY,CAAC,EACtC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAC7B,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,EAC/B,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,EACtC,MAAM,CAAC,EAAE,SAAS,EAClB,UAAU,CAAC,EAAE,CAAC,GAAG,gCAAgC,CAAC,CAAC,CAAC;IAQ/F,eAAe,CAAC,CAAC,SAAS,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,gCAAgC,CAAC,CAAC,CAAC;CAGpG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScriptCompiler.d.ts","sourceRoot":"","sources":["../src/ScriptCompiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,OAAO,EAAkB,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAG9C,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"ScriptCompiler.d.ts","sourceRoot":"","sources":["../src/ScriptCompiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,OAAO,EAAkB,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAG9C,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAA;AAuJrC,yBAAiB,cAAc,CAAC;IAC5B,UAAiB,eAAgB,SAAQ,SAAS;QAC9C,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;QACxB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;QAC1B,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QAC9C,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;KAC3C;IAED,KAAY,MAAM,GAAG;QACjB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;QAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;QAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;KAChC,CAAA;IAKM,MAAM,IAAI,WAtDO,cAAc,CAAC,MAAM,QAAQ,MAAM,UAAU,MAAM,YAAY,MAAM,KAAG,MAsDlE,CAAA;IAEvB,MAAM,MAAM,GAAI,QAAQ,MAAM;8BAMP,MAAM,KAAG,MAAM;6BACV,gBAAgB,aAAa,eAAe,KAAG,OAAO,CAAC,IAAI,CAAC;gCAYzD,gBAAgB,WACrB,OAAO,aACL,eAAe,UAClB,MAAM,WACN,OAAO,KAAW,OAAO,CAAC,IAAI,CAAC;KA2B9D,CAAA;CACJ"}
|
package/dist/ScriptCompiler.js
CHANGED
|
@@ -113,7 +113,8 @@ const reconcileSamples = (deviceBox, declared, order) => {
|
|
|
113
113
|
}
|
|
114
114
|
};
|
|
115
115
|
// Wrap the user script for registration into `globalThis.openDAW.<registry>[uuid]`. Beyond `{update, create}`
|
|
116
|
-
// (consumed by the TS core-processors engine), the entry also carries the
|
|
116
|
+
// (consumed by the TS core-processors engine), the entry also carries the `@no-pass` verdict (`pass`, read by
|
|
117
|
+
// the Spielwerk bridge) plus the PARSED `@param` / `@sample`
|
|
117
118
|
// declarations (with their declaration index, matching the `WerkstattParameterBox.index` the engine keys by):
|
|
118
119
|
// the WASM script bridge needs them to map a param's raw automation value through the right `ValueMapping` and
|
|
119
120
|
// to label each param / sample, since the worklet has no box graph to read those from. The TS engine ignores
|
|
@@ -137,7 +138,8 @@ const wrapScript = (config, uuid, update, userCode) => {
|
|
|
137
138
|
return Processor
|
|
138
139
|
})(),
|
|
139
140
|
params: ${JSON.stringify(params)},
|
|
140
|
-
samples: ${JSON.stringify(samples)}
|
|
141
|
+
samples: ${JSON.stringify(samples)},
|
|
142
|
+
pass: ${ScriptDeclaration.parsePassThrough(userCode)}
|
|
141
143
|
}
|
|
142
144
|
`;
|
|
143
145
|
};
|
|
@@ -32,6 +32,7 @@ export interface DeclarationSection {
|
|
|
32
32
|
export declare namespace ScriptDeclaration {
|
|
33
33
|
export const isEqual: (a: ParamDeclaration, b: ParamDeclaration) => boolean;
|
|
34
34
|
export const parseLabel: (code: string) => Option<string>;
|
|
35
|
+
export const parsePassThrough: (code: string) => boolean;
|
|
35
36
|
export const parseParams: (code: string) => ReadonlyArray<ParamDeclaration>;
|
|
36
37
|
export const parseSamples: (code: string) => ReadonlyArray<SampleDeclaration>;
|
|
37
38
|
export const parseDeclarationOrder: (code: string) => Map<string, number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScriptDeclaration.d.ts","sourceRoot":"","sources":["../src/ScriptDeclaration.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ScriptDeclaration.d.ts","sourceRoot":"","sources":["../src/ScriptDeclaration.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,QAAQ,EACR,UAAU,EACV,MAAM,EACN,aAAa,EAEb,UAAU,EACV,YAAY,EACf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,KAAK,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAE9C,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAA;AAEzD,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;AAEzE,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,MAAM,eAAe,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAA;CAAE,GAClE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAA;CAAE,CAAA;AAE1E,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAA;IAC1C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;CACjD;AA0FD,yBAAiB,iBAAiB,CAAC;IAC/B,MAAM,CAAC,MAAM,OAAO,MAJU,gBAAgB,KAAK,gBAAgB,KAAG,OAI1B,CAAA;IAE5C,MAAM,CAAC,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,CAMtD,CAAA;IAID,MAAM,CAAC,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,OAK/C,CAAA;IAED,MAAM,CAAC,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,gBAAgB,CAQxE,CAAA;IAED,MAAM,CAAC,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,iBAAiB,CAe1E,CAAA;IAED,MAAM,CAAC,MAAM,qBAAqB,GAAI,MAAM,MAAM,KAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAYtE,CAAA;IAED,MAAM,CAAC,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,kBAAkB,CA8B1E,CAAA;IAED,MAAM,CAAC,MAAM,mBAAmB,GAAI,aAAa,gBAAgB,KAAG,YAAY,CAAC,MAAM,CAatF,CAAA;IAED,MAAM,CAAC,MAAM,oBAAoB,GAAI,aAAa,gBAAgB,KAAG,aAAa,CAAC,MAAM,CAaxF,CAAA;IAED,KAAK,YAAY,GAAG;QAChB,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC,CAAA;QAClC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KACvC,CAAA;IAED,MAAM,CAAC,MAAM,oBAAoB,GAAI,aAAa,gBAAgB,KAAG,YAGnE,CAAA;IAEF,MAAM,MAAM,mBAAmB,GAAG;QAC9B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;QAC/B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;KACzC,CAAA;IAED,MAAM,CAAC,MAAM,qBAAqB,GAAI,YAAY,mBAAmB,EAC/B,WAAW,WAAW,EACtB,iBAAiB,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAG,mBA4ClF,CAAA;;CACJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { asInstanceOf, isDefined, Notifier, Option, StringMapping, Terminable, ValueMapping } from "@opendaw/lib-std";
|
|
1
|
+
import { asInstanceOf, isDefined, Notifier, Option, StringMapping, Strings, Terminable, ValueMapping } from "@opendaw/lib-std";
|
|
2
2
|
import { WerkstattParameterBox } from "@opendaw/studio-boxes";
|
|
3
3
|
const LABEL_LINE = /^\/\/ @label .+$/m;
|
|
4
4
|
const PARAM_LINE = /^\/\/ @param .+$/gm;
|
|
@@ -6,6 +6,7 @@ const SAMPLE_LINE = /^\/\/ @sample .+$/gm;
|
|
|
6
6
|
const GROUP_LINE = /^\/\/ @group .+$/gm;
|
|
7
7
|
const DIRECTIVE_LINE = /^\/\/ @(group|param|sample) .+$/gm;
|
|
8
8
|
const DECLARATION_LINE = /^\/\/ @(?:param|sample) \S+/gm;
|
|
9
|
+
const NO_PASS_LINE = /^\/\/ @no-pass\b(.*)$/m;
|
|
9
10
|
const FLOAT_TOLERANCE = 1e-6;
|
|
10
11
|
const VALID_MAPPINGS = ["linear", "exp", "int", "bool"];
|
|
11
12
|
const BoolStringMapping = new class {
|
|
@@ -94,6 +95,18 @@ export var ScriptDeclaration;
|
|
|
94
95
|
}
|
|
95
96
|
return Option.wrap(label);
|
|
96
97
|
};
|
|
98
|
+
// A note transformer forwards its input VERBATIM unless the script opts out with `// @no-pass`, so a device
|
|
99
|
+
// with no (or a broken) script never eats the note stream.
|
|
100
|
+
ScriptDeclaration.parsePassThrough = (code) => {
|
|
101
|
+
const match = NO_PASS_LINE.exec(code);
|
|
102
|
+
if (match === null) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
if (match[1].trim().length > 0) {
|
|
106
|
+
throw new Error("Malformed @no-pass: expected: // @no-pass");
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
};
|
|
97
110
|
ScriptDeclaration.parseParams = (code) => {
|
|
98
111
|
const params = [];
|
|
99
112
|
let match;
|
|
@@ -212,7 +225,9 @@ export var ScriptDeclaration;
|
|
|
212
225
|
valueMapping: ValueMapping.unipolar(),
|
|
213
226
|
stringMapping: StringMapping.percent({ fractionDigits: 1 })
|
|
214
227
|
};
|
|
215
|
-
|
|
228
|
+
// Script authors write `@param` names in any case they like. The stored label stays verbatim
|
|
229
|
+
// (ScriptCompiler keys parameter boxes by it), only the displayed name is normalised.
|
|
230
|
+
parametric.createParameter(paramBox.value, valueMapping, stringMapping, Strings.capitalize(label), undefined, paramBox.defaultValue.getValue());
|
|
216
231
|
if (isDefined(declaration)) {
|
|
217
232
|
cachedDeclarations.set(label, declaration);
|
|
218
233
|
}
|
|
@@ -225,17 +240,17 @@ export var ScriptDeclaration;
|
|
|
225
240
|
}), codeField.subscribe(() => {
|
|
226
241
|
const declarations = ScriptDeclaration.parseParams(codeField.getValue());
|
|
227
242
|
for (const adapter of parametric.parameters()) {
|
|
228
|
-
const newDeclaration = declarations.find(decl => decl.label === adapter.name);
|
|
243
|
+
const newDeclaration = declarations.find(decl => Strings.capitalize(decl.label) === adapter.name);
|
|
229
244
|
if (!isDefined(newDeclaration)) {
|
|
230
245
|
continue;
|
|
231
246
|
}
|
|
232
|
-
const oldDeclaration = cachedDeclarations.get(
|
|
247
|
+
const oldDeclaration = cachedDeclarations.get(newDeclaration.label);
|
|
233
248
|
if (isDefined(oldDeclaration) && declarationEquals(oldDeclaration, newDeclaration)) {
|
|
234
249
|
continue;
|
|
235
250
|
}
|
|
236
251
|
const { valueMapping, stringMapping } = ScriptDeclaration.resolveParamMappings(newDeclaration);
|
|
237
252
|
adapter.updateMappings(valueMapping, stringMapping);
|
|
238
|
-
cachedDeclarations.set(
|
|
253
|
+
cachedDeclarations.set(newDeclaration.label, newDeclaration);
|
|
239
254
|
}
|
|
240
255
|
codeChangedNotifier.notify();
|
|
241
256
|
}), codeChangedNotifier);
|
|
@@ -126,10 +126,10 @@ export class AudioUnitBoxAdapter {
|
|
|
126
126
|
}
|
|
127
127
|
_a = AudioUnitBoxAdapter, _AudioUnitBoxAdapter_terminator = new WeakMap(), _AudioUnitBoxAdapter_context = new WeakMap(), _AudioUnitBoxAdapter_box = new WeakMap(), _AudioUnitBoxAdapter_parametric = new WeakMap(), _AudioUnitBoxAdapter_tracks = new WeakMap(), _AudioUnitBoxAdapter_input = new WeakMap(), _AudioUnitBoxAdapter_midiEffects = new WeakMap(), _AudioUnitBoxAdapter_audioEffects = new WeakMap(), _AudioUnitBoxAdapter_auxSends = new WeakMap(), _AudioUnitBoxAdapter_output = new WeakMap(), _AudioUnitBoxAdapter_instances = new WeakSet(), _AudioUnitBoxAdapter_wrapParameters = function _AudioUnitBoxAdapter_wrapParameters(box) {
|
|
128
128
|
return {
|
|
129
|
-
volume: __classPrivateFieldGet(this, _AudioUnitBoxAdapter_parametric, "f").createParameter(box.volume, _a.VolumeMapper, StringMapping.decible, "
|
|
130
|
-
panning: __classPrivateFieldGet(this, _AudioUnitBoxAdapter_parametric, "f").createParameter(box.panning, ValueMapping.bipolar(), StringMapping.panning, "
|
|
131
|
-
mute: __classPrivateFieldGet(this, _AudioUnitBoxAdapter_parametric, "f").createParameter(box.mute, ValueMapping.bool, StringMapping.bool, "
|
|
132
|
-
solo: __classPrivateFieldGet(this, _AudioUnitBoxAdapter_parametric, "f").createParameter(box.solo, ValueMapping.bool, StringMapping.bool, "
|
|
129
|
+
volume: __classPrivateFieldGet(this, _AudioUnitBoxAdapter_parametric, "f").createParameter(box.volume, _a.VolumeMapper, StringMapping.decible, "Volume"),
|
|
130
|
+
panning: __classPrivateFieldGet(this, _AudioUnitBoxAdapter_parametric, "f").createParameter(box.panning, ValueMapping.bipolar(), StringMapping.panning, "Panning", 0.5),
|
|
131
|
+
mute: __classPrivateFieldGet(this, _AudioUnitBoxAdapter_parametric, "f").createParameter(box.mute, ValueMapping.bool, StringMapping.bool, "Mute"),
|
|
132
|
+
solo: __classPrivateFieldGet(this, _AudioUnitBoxAdapter_parametric, "f").createParameter(box.solo, ValueMapping.bool, StringMapping.bool, "Solo")
|
|
133
133
|
};
|
|
134
134
|
}, _AudioUnitBoxAdapter_sanityCheck = function _AudioUnitBoxAdapter_sanityCheck() {
|
|
135
135
|
const address = this.address.toString();
|
|
@@ -51,19 +51,19 @@ export class DelayDeviceBoxAdapter {
|
|
|
51
51
|
}
|
|
52
52
|
_a = DelayDeviceBoxAdapter, _DelayDeviceBoxAdapter_context = new WeakMap(), _DelayDeviceBoxAdapter_box = new WeakMap(), _DelayDeviceBoxAdapter_parametric = new WeakMap(), _DelayDeviceBoxAdapter_instances = new WeakSet(), _DelayDeviceBoxAdapter_wrapParameters = function _DelayDeviceBoxAdapter_wrapParameters(box) {
|
|
53
53
|
return {
|
|
54
|
-
preSyncTimeLeft: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.preSyncTimeLeft, ValueMapping.linearInteger(0, _a.Fractions.length - 1), _a.FractionsStringMapping, "
|
|
55
|
-
preMillisTimeLeft: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.preMillisTimeLeft, ValueMapping.powerByCenter(100.0, 0.0, _a.MAX_MILLIS_TIME), StringMapping.numeric({ unit: "ms", fractionDigits: 1 }), "
|
|
56
|
-
preSyncTimeRight: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.preSyncTimeRight, ValueMapping.linearInteger(0, _a.Fractions.length - 1), _a.FractionsStringMapping, "
|
|
57
|
-
preMillisTimeRight: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.preMillisTimeRight, ValueMapping.powerByCenter(100.0, 0.0, _a.MAX_MILLIS_TIME), StringMapping.numeric({ unit: "ms", fractionDigits: 1 }), "
|
|
58
|
-
delay: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.delayMusical, ValueMapping.linearInteger(0, _a.Fractions.length - 1), _a.FractionsStringMapping, "
|
|
59
|
-
millisTime: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.delayMillis, ValueMapping.powerByCenter(100.0, 0.0, _a.MAX_MILLIS_TIME), StringMapping.numeric({ unit: "ms", fractionDigits: 1 }), "
|
|
60
|
-
feedback: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.feedback, ValueMapping.unipolar(), StringMapping.numeric({ unit: "%", fractionDigits: 0 }), "
|
|
61
|
-
cross: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.cross, ValueMapping.unipolar(), StringMapping.numeric({ unit: "%", fractionDigits: 0 }), "
|
|
62
|
-
lfoSpeed: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.lfoSpeed, ValueMapping.exponential(_a.LFO_SPEED_MIN, _a.LFO_SPEED_MAX), StringMapping.numeric({ unit: "Hz", fractionDigits: 2 }), "
|
|
63
|
-
lfoDepth: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.lfoDepth, ValueMapping.power(4.0, 0.0, _a.LFO_DEPTH_MAX), StringMapping.numeric({ unit: "ms", fractionDigits: 1 }), "
|
|
64
|
-
filter: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.filter, ValueMapping.bipolar(), StringMapping.numeric({ unit: "%", fractionDigits: 0 }), "
|
|
65
|
-
dry: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.dry, ValueMapping.DefaultDecibel, StringMapping.numeric({ unit: "db", fractionDigits: 1 }), "
|
|
66
|
-
wet: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.wet, ValueMapping.DefaultDecibel, StringMapping.numeric({ unit: "db", fractionDigits: 1 }), "
|
|
54
|
+
preSyncTimeLeft: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.preSyncTimeLeft, ValueMapping.linearInteger(0, _a.Fractions.length - 1), _a.FractionsStringMapping, "Pre Sync L"),
|
|
55
|
+
preMillisTimeLeft: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.preMillisTimeLeft, ValueMapping.powerByCenter(100.0, 0.0, _a.MAX_MILLIS_TIME), StringMapping.numeric({ unit: "ms", fractionDigits: 1 }), "Pre MS L"),
|
|
56
|
+
preSyncTimeRight: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.preSyncTimeRight, ValueMapping.linearInteger(0, _a.Fractions.length - 1), _a.FractionsStringMapping, "Pre Sync R"),
|
|
57
|
+
preMillisTimeRight: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.preMillisTimeRight, ValueMapping.powerByCenter(100.0, 0.0, _a.MAX_MILLIS_TIME), StringMapping.numeric({ unit: "ms", fractionDigits: 1 }), "Pre MS R"),
|
|
58
|
+
delay: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.delayMusical, ValueMapping.linearInteger(0, _a.Fractions.length - 1), _a.FractionsStringMapping, "Delay"),
|
|
59
|
+
millisTime: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.delayMillis, ValueMapping.powerByCenter(100.0, 0.0, _a.MAX_MILLIS_TIME), StringMapping.numeric({ unit: "ms", fractionDigits: 1 }), "MS"),
|
|
60
|
+
feedback: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.feedback, ValueMapping.unipolar(), StringMapping.numeric({ unit: "%", fractionDigits: 0 }), "Feedback"),
|
|
61
|
+
cross: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.cross, ValueMapping.unipolar(), StringMapping.numeric({ unit: "%", fractionDigits: 0 }), "Cross"),
|
|
62
|
+
lfoSpeed: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.lfoSpeed, ValueMapping.exponential(_a.LFO_SPEED_MIN, _a.LFO_SPEED_MAX), StringMapping.numeric({ unit: "Hz", fractionDigits: 2 }), "LFO Speed"),
|
|
63
|
+
lfoDepth: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.lfoDepth, ValueMapping.power(4.0, 0.0, _a.LFO_DEPTH_MAX), StringMapping.numeric({ unit: "ms", fractionDigits: 1 }), "LFO Depth"),
|
|
64
|
+
filter: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.filter, ValueMapping.bipolar(), StringMapping.numeric({ unit: "%", fractionDigits: 0 }), "Filter", 0.5),
|
|
65
|
+
dry: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.dry, ValueMapping.DefaultDecibel, StringMapping.numeric({ unit: "db", fractionDigits: 1 }), "Dry"),
|
|
66
|
+
wet: __classPrivateFieldGet(this, _DelayDeviceBoxAdapter_parametric, "f").createParameter(box.wet, ValueMapping.DefaultDecibel, StringMapping.numeric({ unit: "db", fractionDigits: 1 }), "Wet")
|
|
67
67
|
};
|
|
68
68
|
};
|
|
69
69
|
DelayDeviceBoxAdapter.Fractions = Fraction.builder()
|
|
@@ -68,8 +68,8 @@ export class NeuralAmpDeviceBoxAdapter {
|
|
|
68
68
|
}
|
|
69
69
|
_NeuralAmpDeviceBoxAdapter_context = new WeakMap(), _NeuralAmpDeviceBoxAdapter_box = new WeakMap(), _NeuralAmpDeviceBoxAdapter_parametric = new WeakMap(), _NeuralAmpDeviceBoxAdapter_instances = new WeakSet(), _NeuralAmpDeviceBoxAdapter_wrapParameters = function _NeuralAmpDeviceBoxAdapter_wrapParameters(box) {
|
|
70
70
|
return {
|
|
71
|
-
inputGain: __classPrivateFieldGet(this, _NeuralAmpDeviceBoxAdapter_parametric, "f").createParameter(box.inputGain, ValueMapping.decibel(-72.0, 0.0, 12.0), StringMapping.numeric({ unit: "dB", fractionDigits: 1 }), "
|
|
72
|
-
outputGain: __classPrivateFieldGet(this, _NeuralAmpDeviceBoxAdapter_parametric, "f").createParameter(box.outputGain, ValueMapping.decibel(-72.0, 0.0, 12.0), StringMapping.numeric({ unit: "dB", fractionDigits: 1 }), "
|
|
71
|
+
inputGain: __classPrivateFieldGet(this, _NeuralAmpDeviceBoxAdapter_parametric, "f").createParameter(box.inputGain, ValueMapping.decibel(-72.0, 0.0, 12.0), StringMapping.numeric({ unit: "dB", fractionDigits: 1 }), "Input"),
|
|
72
|
+
outputGain: __classPrivateFieldGet(this, _NeuralAmpDeviceBoxAdapter_parametric, "f").createParameter(box.outputGain, ValueMapping.decibel(-72.0, 0.0, 12.0), StringMapping.numeric({ unit: "dB", fractionDigits: 1 }), "Output"),
|
|
73
73
|
mix: __classPrivateFieldGet(this, _NeuralAmpDeviceBoxAdapter_parametric, "f").createParameter(box.mix, ValueMapping.linear(0.0, 1.0), StringMapping.percent(), "Mix")
|
|
74
74
|
};
|
|
75
75
|
};
|
|
@@ -65,19 +65,19 @@ const GainMapping = ValueMapping.linear(-24.0, 24.0);
|
|
|
65
65
|
const QMapping = ValueMapping.exponential(0.01, 10.0);
|
|
66
66
|
const createPass = (parametric, pass, name) => {
|
|
67
67
|
return ({
|
|
68
|
-
enabled: parametric.createParameter(pass.enabled, ValueMapping.bool, StringMapping.bool, "
|
|
68
|
+
enabled: parametric.createParameter(pass.enabled, ValueMapping.bool, StringMapping.bool, "Enabled"),
|
|
69
69
|
frequency: parametric.createParameter(pass.frequency, FrequencyMapping, StringMapping.numeric({ unit: "Hz", fractionDigits: 0 }), `${name} Freq`),
|
|
70
70
|
order: parametric.createParameter(pass.order, ValueMapping.linearInteger(0, 3), StringMapping.indices("db", ["12", "24", "36", "48"]), `${name} Order`),
|
|
71
71
|
q: parametric.createParameter(pass.q, QMapping, StringMapping.numeric({ fractionDigits: 3 }), `${name} Q`)
|
|
72
72
|
});
|
|
73
73
|
};
|
|
74
74
|
const createShelf = (parametric, shelf, name) => ({
|
|
75
|
-
enabled: parametric.createParameter(shelf.enabled, ValueMapping.bool, StringMapping.bool, "
|
|
75
|
+
enabled: parametric.createParameter(shelf.enabled, ValueMapping.bool, StringMapping.bool, "Enabled"),
|
|
76
76
|
frequency: parametric.createParameter(shelf.frequency, FrequencyMapping, StringMapping.numeric({ unit: "Hz", fractionDigits: 0 }), `${name} Freq`),
|
|
77
77
|
gain: parametric.createParameter(shelf.gain, GainMapping, StringMapping.numeric({ unit: "db", fractionDigits: 1, bipolar: true }), `${name} Gain`, 0.5)
|
|
78
78
|
});
|
|
79
79
|
const createBell = (parametric, bell, name) => ({
|
|
80
|
-
enabled: parametric.createParameter(bell.enabled, ValueMapping.bool, StringMapping.bool, "
|
|
80
|
+
enabled: parametric.createParameter(bell.enabled, ValueMapping.bool, StringMapping.bool, "Enabled"),
|
|
81
81
|
frequency: parametric.createParameter(bell.frequency, FrequencyMapping, StringMapping.numeric({ unit: "Hz", fractionDigits: 0 }), `${name} Freq`),
|
|
82
82
|
gain: parametric.createParameter(bell.gain, GainMapping, StringMapping.numeric({ unit: "db", fractionDigits: 1, bipolar: true }), `${name} Gain`, 0.5),
|
|
83
83
|
q: parametric.createParameter(bell.q, QMapping, StringMapping.numeric({ fractionDigits: 3 }), `${name} Q`)
|
|
@@ -54,9 +54,9 @@ _ReverbDeviceBoxAdapter_context = new WeakMap(), _ReverbDeviceBoxAdapter_box = n
|
|
|
54
54
|
preDelay: __classPrivateFieldGet(this, _ReverbDeviceBoxAdapter_parametric, "f").createParameter(box.preDelay, ValueMapping.exponential(0.001, 0.500), StringMapping.numeric({
|
|
55
55
|
unit: "s", fractionDigits: 1, unitPrefix: true
|
|
56
56
|
}), "Pre-Delay"),
|
|
57
|
-
damp: __classPrivateFieldGet(this, _ReverbDeviceBoxAdapter_parametric, "f").createParameter(box.damp, ValueMapping.unipolar(), StringMapping.numeric({ unit: "%", fractionDigits: 0 }), "
|
|
58
|
-
filter: __classPrivateFieldGet(this, _ReverbDeviceBoxAdapter_parametric, "f").createParameter(box.filter, ValueMapping.bipolar(), StringMapping.numeric({ unit: "%", fractionDigits: 0 }), "
|
|
59
|
-
dry: __classPrivateFieldGet(this, _ReverbDeviceBoxAdapter_parametric, "f").createParameter(box.dry, ValueMapping.DefaultDecibel, StringMapping.numeric({ unit: "db", fractionDigits: 1 }), "
|
|
60
|
-
wet: __classPrivateFieldGet(this, _ReverbDeviceBoxAdapter_parametric, "f").createParameter(box.wet, ValueMapping.DefaultDecibel, StringMapping.numeric({ unit: "db", fractionDigits: 1 }), "
|
|
57
|
+
damp: __classPrivateFieldGet(this, _ReverbDeviceBoxAdapter_parametric, "f").createParameter(box.damp, ValueMapping.unipolar(), StringMapping.numeric({ unit: "%", fractionDigits: 0 }), "Damping"),
|
|
58
|
+
filter: __classPrivateFieldGet(this, _ReverbDeviceBoxAdapter_parametric, "f").createParameter(box.filter, ValueMapping.bipolar(), StringMapping.numeric({ unit: "%", fractionDigits: 0 }), "Filter"),
|
|
59
|
+
dry: __classPrivateFieldGet(this, _ReverbDeviceBoxAdapter_parametric, "f").createParameter(box.dry, ValueMapping.DefaultDecibel, StringMapping.numeric({ unit: "db", fractionDigits: 1 }), "Dry"),
|
|
60
|
+
wet: __classPrivateFieldGet(this, _ReverbDeviceBoxAdapter_parametric, "f").createParameter(box.wet, ValueMapping.DefaultDecibel, StringMapping.numeric({ unit: "db", fractionDigits: 1 }), "Wet")
|
|
61
61
|
};
|
|
62
62
|
};
|
|
@@ -52,7 +52,7 @@ _StereoToolDeviceBoxAdapter_context = new WeakMap(), _StereoToolDeviceBoxAdapter
|
|
|
52
52
|
return {
|
|
53
53
|
volume: __classPrivateFieldGet(this, _StereoToolDeviceBoxAdapter_parametric, "f").createParameter(box.volume, ValueMapping.decibel(-72.0, 0.0, 12.0), StringMapping.numeric({ unit: "db", fractionDigits: 1 }), "Volume"),
|
|
54
54
|
panning: __classPrivateFieldGet(this, _StereoToolDeviceBoxAdapter_parametric, "f").createParameter(box.panning, ValueMapping.bipolar(), StringMapping.panning, "Panning", 0.5),
|
|
55
|
-
stereo: __classPrivateFieldGet(this, _StereoToolDeviceBoxAdapter_parametric, "f").createParameter(box.stereo, ValueMapping.bipolar(), StringMapping.numeric({ unit: "%", fractionDigits: 0 }), "
|
|
55
|
+
stereo: __classPrivateFieldGet(this, _StereoToolDeviceBoxAdapter_parametric, "f").createParameter(box.stereo, ValueMapping.bipolar(), StringMapping.numeric({ unit: "%", fractionDigits: 0 }), "Stereo", 0.5),
|
|
56
56
|
invertL: __classPrivateFieldGet(this, _StereoToolDeviceBoxAdapter_parametric, "f").createParameter(box.invertL, ValueMapping.bool, StringMapping.bool, "Invert Left"),
|
|
57
57
|
invertR: __classPrivateFieldGet(this, _StereoToolDeviceBoxAdapter_parametric, "f").createParameter(box.invertR, ValueMapping.bool, StringMapping.bool, "Invert Right"),
|
|
58
58
|
swap: __classPrivateFieldGet(this, _StereoToolDeviceBoxAdapter_parametric, "f").createParameter(box.swap, ValueMapping.bool, StringMapping.bool, "Swap")
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { int } from "@opendaw/lib-std";
|
|
2
|
+
import { CubedStep } from "./CubedStep";
|
|
3
|
+
/**
|
|
4
|
+
* Reader for AudioRealism ABL `.pat` files (the pattern library shipped with ABL2 / ABL3).
|
|
5
|
+
*
|
|
6
|
+
* Plain text: comment lines starting with `;` carry the meta header, every other non-empty line is
|
|
7
|
+
* one step. Two dialects exist in the same library and both appear in the factory folders:
|
|
8
|
+
*
|
|
9
|
+
* ABL3 `10 0 1 0 1 1` pitch down up accent slide gate
|
|
10
|
+
* ABL2 `a#3 1 0 1` note gate accent slide (octave lives in the note name, so the
|
|
11
|
+
* down/up flags are absent)
|
|
12
|
+
*
|
|
13
|
+
* The ABL3 order is VERIFIED, not guessed: `userlab.pat` was loaded into the plugin and the
|
|
14
|
+
* resulting pattern bank dumped, and all 16 steps line up only under this order. Note that GATE
|
|
15
|
+
* COMES LAST and does NOT match the order of the same fields in the plugin's own state XML
|
|
16
|
+
* (pitch gate down up accent slide) - reading the file in XML order silently swaps gate with the
|
|
17
|
+
* octave flags, which loads as a transposed pattern full of wrong rests.
|
|
18
|
+
*
|
|
19
|
+
* The two dialects do NOT agree on where gate goes: ABL2 puts it FIRST. That is measured, not
|
|
20
|
+
* assumed - across the 238 ABL2 factory files, reading gate as the last column leaves 13 patterns
|
|
21
|
+
* completely silent and finds only 1415 gated steps, while reading it as the first finds 5664 and
|
|
22
|
+
* no silent pattern at all.
|
|
23
|
+
*
|
|
24
|
+
* Which of the remaining two columns is accent and which is slide is still inference: they occur at
|
|
25
|
+
* near-identical rates (22% vs 24% of gated steps) and both are followed by a gated step ~93% of the
|
|
26
|
+
* time, so the data cannot separate them. The order here follows ABL3, where accent precedes slide.
|
|
27
|
+
*/
|
|
28
|
+
export type AblPattern = {
|
|
29
|
+
steps: ReadonlyArray<CubedStep>;
|
|
30
|
+
length: int;
|
|
31
|
+
};
|
|
32
|
+
export declare namespace AblPattern {
|
|
33
|
+
/**
|
|
34
|
+
* MIDI note for the plugin's pitch 0. VERIFIED twice against captured plugin state: decoding the
|
|
35
|
+
* `scream` and `userlab` banks with this base reproduces their known note sequences exactly.
|
|
36
|
+
*
|
|
37
|
+
* NOT the Cubed step default of 60 - using that loads every pattern two octaves high.
|
|
38
|
+
*/
|
|
39
|
+
const BASE_NOTE: int;
|
|
40
|
+
const parse: (text: string) => AblPattern;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=AblPattern.d.ts.map
|
|
@@ -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"}
|