From 3049a21c661d9df9817bfdcec044e2f6c0588338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Michelle?= Date: Mon, 11 Aug 2025 13:52:50 +0200 Subject: [PATCH] migrate EQ+ to Revamp --- .../core/src/dawproject/BuiltinDevices.ts | 90 ++++++++++-------- test-files/eq.dawproject | Bin 1587 -> 1802 bytes 2 files changed, 48 insertions(+), 42 deletions(-) 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 b3433c81236863cc10076b432ec75ca846827caf..19912d91dada080749c09fe0b25cff6a0c79efba 100644 GIT binary patch delta 1473 zcmV;y1wQ(-42lj7P)h>@6aWYa2msn_3y}@!1KMm0k@*~d)tXy#qc#-B-}5OL`q(i> z0(61VX!pAK>njjr;ORCRw`l4SK(d4 z#4h7Tz>`!8Fp*|U)0L}sG0)noDi~<9o-1iDRwCPf`9+|8fsFb87=D@vo`~Crt;`}x zg*4NMQWkI-QZC|6aM)z}Imv|qOt~;B)PLG+JZz)lI*w(arD=8=rOwBDmLxnfSmAVi zkxQpcxv5+fdn%0&0~eb{mPS$|<9EA=WwOpvWNB_#l(&gEO8ipex1HdP%e|*jlXmgM zzQ65%(rcDfwFLc2s)bC_EM`&oFAv&!+LqU=rq_tcn1fm?o&@>f{q{4}5lOlz3$smg z(W-y}2ihQtiq=(?~*fk{3~!@S;4e4}Ge=7M5aD$3z$N;?n__=0|Mm zWeA^`p#uVksz%5w+`0hU9k?R75U-oD^Opvoqmm{S(R#x{s+DwHD zfXI>yP;m~{y92%5ITP`Ml#)THq%k2b&{4GYaB-DrZ}VWGo&|wp(+-sW@#{{11PXv^ zwUCm>E0S`cjTLP@Qiu}mZIVJfixNOUM@s+r^`;`lwjgx@XkUent>iJ`nc@INTZ0@2;a%FajUY#Y1{WA47yO|58ok zITLwnv^vCT9xoK@nRopp9jf5RDBR}FoY_9yOc`xlp?w3Pp`mVH0X|EA!EIl*XmE1g zlW-rE=-pV%_xx}E(%|#{g7QWq(49o(T`6#%%U2@ZHobjVKl!E~ zBKy$*U3tj!0_?d@Pw=*M<%oCK?t2GM^bQ{->oo810e4UI4iEm>;VItXQ@9-UPT|fu z)jLh@ur7C4n>(z_9Z|S{b5Hb+XmUq%xg*-#5nb+x!ku@jcbeQ0UG9iBcSM&vs&F^< zC+29o6NID%{~yz0>55>T*Z5xud$=0b2o&oM;}fHOT|EE_%S$W)Ij; zgs;AkA1~(hf5ACF`wvh{2MC379|l|n006}!002-+0Rj{N6aWYY2nYb$YzvdQ1vd`b bYzte3avug<1polWBa{9GF9v}I00000EKJqX delta 1256 zcmV@6aWYa2msrJ3Xu)z1KWfOk@*~d%~{)Wq&5(J_g7HtV`>J( zRa7zF+KZjqswB2E-mSc9K#Y}um<6#}=j+p4XTZQ8n` zto7#l#WgTG7|iMr35J#l#Bbv14O}70c0w1NP|UM5^%Ip)gwlQ^WlMTPGg0XOgDoZm{MU=xhVHk z5zj))Rh2A_0VAXPA|@H+89+8_MB=;)#2omqFn%orZCUQEcG|GZ6{q}mrniLGxkUX; z4im|L(<~t|`-g^IKJ~TT%ck9efzMH_E#+bUbiVsGWCWBhs>B@9Ty!XCgn`b@6(_rR zoD16=3#zmHlExsaMO?&;(=t6B4}DeJomk3EO@aDa`E`UPZGxs=gvK)?G?8N%xQ);eq#ZhlHt|Y zqEdMVfaSVR9|6I_$VM2icEpKRR*0#v5#xx6m zX;vm=+ORUd&gj>smP~uCyN+QRjaHGpwy=W@)QUBy2@}xE@=mWdhNHzXUDQ!zwt-hs zA*J+RKwo^E+d>t|&xAE6oT>MVW@Qe`CZqw|(Ri}5ku?aTbbdC1yBgjqy_pWSk2Pyp zo`)xD7S15gvD~g^kv+h^I}1Fc1mp~Vyxq+1!`I4XQwLdBG-IdPWW7yyEredPZ6W=2 z`j++5zU91D-?IO2eG3gD^!~%XrOe#^tm8e3yv@7Uokyf6Xef zymM9Z9&e6F7@l!&||dU%h2XqT6W z&Eue1>5XOZL(C3&dm-1KZl>}!kKlF}`mx(@AHjGLLMida!RQmC2VtFs=uP>XDsB-omAE`?%XGTx_c&f?&$mMIo!ERbUDl2KzHU+?j&{R%IeOQ)}1S> zJ3P>xwU9e3sXHvIJ1ng`EUP;_(4D=MJ4xMPS>0i2-C~?e{Vnd4J5N$~o~-UX zY2A6Uy7LCQbC+@_sXI?rcb>HFJXzf#eIPu%kUXSIDi7(h(nGqm_K^N9Oz|}X`0Q)V z|0*so{smA=2MF)pQCNip008b7002-+0Rj{N6aWYa2msrJ3X_lqHxAo`3R~~qQCNip S008b7lhp<<2C4-B0000U9ckkL