diff --git a/packages/studio/core/src/dawproject/BuiltinDevices.ts b/packages/studio/core/src/dawproject/BuiltinDevices.ts index f73c09be..0870a445 100644 --- a/packages/studio/core/src/dawproject/BuiltinDevices.ts +++ b/packages/studio/core/src/dawproject/BuiltinDevices.ts @@ -1,65 +1,71 @@ -import {EqBandType, EqualizerSchema, ParameterDecoder} from "@opendaw/lib-dawproject" -import {RevampDeviceBox} from "@opendaw/studio-boxes" +import {BandSchema, EqBandType, EqualizerSchema, ParameterDecoder} from "@opendaw/lib-dawproject" +import {RevampDeviceBox, RevampPass, RevampShelf} from "@opendaw/studio-boxes" import {BoxGraph, Field} from "@opendaw/lib-box" -import {clamp, ifDefined, int, UUID} from "@opendaw/lib-std" +import {ifDefined, int, UUID} from "@opendaw/lib-std" import {Pointers} from "@opendaw/studio-enums" import {semitoneToHz} from "@opendaw/lib-dsp" export namespace BuiltinDevices { - const mapQ = (Qbw: number) => clamp(20 * Math.log10(Qbw), 0.01, 10) - export const equalizer = (boxGraph: BoxGraph, equalizer: EqualizerSchema, field: Field | Field, index: int): RevampDeviceBox => { + const mapOrder = (order?: int) => { + switch (order) { + case 1: + case 2: + return 0 + case 3: + case 4: + return 1 + case 5: + case 6: + return 2 + default: + return 3 + } + } + const readPass = (schema: BandSchema, pass: RevampPass) => { + const {order, frequency, q, enabled} = pass + order.setValue(mapOrder(schema.order)) + frequency.setValue(semitoneToHz(schema.freq.value)) + ifDefined(schema.Q?.value, value => q.setValue(value)) + ifDefined(schema.enabled?.value, value => enabled.setValue(value)) + } + const readShelf = (schema: BandSchema, pass: RevampShelf) => { + const {frequency, gain, enabled} = pass + frequency.setValue(ParameterDecoder.readValue(schema.freq)) + ifDefined(schema.gain?.value, value => gain.setValue(value)) + ifDefined(schema.enabled?.value, value => enabled.setValue(value)) + } return RevampDeviceBox.create(boxGraph, UUID.generate(), box => { box.host.refer(field) box.index.setValue(index) box.label.setValue(equalizer.deviceName ?? "Revamp") + let bellIndex: int = 0 equalizer.bands.forEach((band) => { switch (band.type) { - case EqBandType.HIGH_PASS: { - const {order, frequency, q, enabled} = box.highPass - // TODO order.setValue((band.order ?? 1) - 1) - frequency.setValue(semitoneToHz(band.freq.value)) - ifDefined(band.Q?.value, value => q.setValue(mapQ(value))) - ifDefined(band.enabled?.value === true, value => enabled.setValue(value)) - return - } - case EqBandType.LOW_PASS: { - const {order, frequency, q, enabled} = box.lowPass - // TODO order.setValue((band.order ?? 1) - 1) - frequency.setValue(ParameterDecoder.readValue(band.freq)) - ifDefined(band.Q?.value, value => q.setValue(mapQ(value))) - ifDefined(band.enabled?.value === true, value => enabled.setValue(value)) - return - } - case EqBandType.HIGH_SHELF: { - const {frequency, gain, enabled} = box.highShelf - frequency.setValue(ParameterDecoder.readValue(band.freq)) - ifDefined(band.gain?.value, value => gain.setValue(value)) - ifDefined(band.enabled?.value === true, value => enabled.setValue(value)) - return - } - case EqBandType.LOW_SHELF: { - const {frequency, gain, enabled} = box.lowShelf - frequency.setValue(ParameterDecoder.readValue(band.freq)) - ifDefined(band.gain?.value, value => gain.setValue(value)) - ifDefined(band.enabled?.value === true, value => enabled.setValue(value)) - return - } + case EqBandType.HIGH_PASS: + return readPass(band, box.highPass) + case EqBandType.LOW_PASS: + return readPass(band, box.lowPass) + case EqBandType.HIGH_SHELF: + return readShelf(band, box.highShelf) + case EqBandType.LOW_SHELF: + return readShelf(band, box.lowShelf) case EqBandType.BELL: { - const {frequency, gain, q, enabled} = box.lowBell // TODO use all 3 for each new node + if (bellIndex === 3) {return} + const bell = [box.lowBell, box.midBell, box.highBell][bellIndex++] + const {frequency, gain, q, enabled} = bell frequency.setValue(ParameterDecoder.readValue(band.freq)) - ifDefined(band.Q?.value, value => { - const mapped = mapQ(value) - console.debug(value, mapped) - q.setValue(mapped) - }) + ifDefined(band.Q?.value, value => q.setValue(value)) ifDefined(band.gain?.value, value => gain.setValue(value)) - ifDefined(band.enabled?.value === true, value => enabled.setValue(value)) + ifDefined(band.enabled?.value, value => enabled.setValue(value)) return } + default: + console.warn(`Cannot map band type: ${band.type} to Revamp`) + return } }) }) diff --git a/test-files/eq.dawproject b/test-files/eq.dawproject index b3433c81..19912d91 100644 Binary files a/test-files/eq.dawproject and b/test-files/eq.dawproject differ