1 #include "effects/builtin/bessel8lvmixeqeffect.h"
2
3 #include "effects/builtin/equalizer_util.h"
4 #include "util/math.h"
5
6 // static
getId()7 QString Bessel8LVMixEQEffect::getId() {
8 return "org.mixxx.effects.bessel8lvmixeq";
9 }
10
11 // static
getManifest()12 EffectManifestPointer Bessel8LVMixEQEffect::getManifest() {
13 EffectManifestPointer pManifest(new EffectManifest());
14 pManifest->setId(getId());
15 pManifest->setName(QObject::tr("Bessel8 LV-Mix Isolator"));
16 pManifest->setShortName(QObject::tr("Bessel8 ISO"));
17 pManifest->setAuthor("The Mixxx Team");
18 pManifest->setVersion("1.0");
19 pManifest->setDescription(QObject::tr(
20 "A Bessel 8th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -48 dB/octave).") + " " + EqualizerUtil::adjustFrequencyShelvesTip());
21 pManifest->setIsMixingEQ(true);
22 pManifest->setEffectRampsFromDry(true);
23
24 EqualizerUtil::createCommonParameters(pManifest.data(), false);
25 return pManifest;
26 }
27
Bessel8LVMixEQEffect(EngineEffect * pEffect)28 Bessel8LVMixEQEffect::Bessel8LVMixEQEffect(EngineEffect* pEffect)
29 : m_pPotLow(pEffect->getParameterById("low")),
30 m_pPotMid(pEffect->getParameterById("mid")),
31 m_pPotHigh(pEffect->getParameterById("high")),
32 m_pKillLow(pEffect->getParameterById("killLow")),
33 m_pKillMid(pEffect->getParameterById("killMid")),
34 m_pKillHigh(pEffect->getParameterById("killHigh")) {
35 m_pLoFreqCorner = new ControlProxy("[Mixer Profile]", "LoEQFrequency");
36 m_pHiFreqCorner = new ControlProxy("[Mixer Profile]", "HiEQFrequency");
37 }
38
~Bessel8LVMixEQEffect()39 Bessel8LVMixEQEffect::~Bessel8LVMixEQEffect() {
40 delete m_pLoFreqCorner;
41 delete m_pHiFreqCorner;
42 }
43
processChannel(const ChannelHandle & handle,Bessel8LVMixEQEffectGroupState * pState,const CSAMPLE * pInput,CSAMPLE * pOutput,const mixxx::EngineParameters & bufferParameters,const EffectEnableState enableState,const GroupFeatureState & groupFeatures)44 void Bessel8LVMixEQEffect::processChannel(const ChannelHandle& handle,
45 Bessel8LVMixEQEffectGroupState* pState,
46 const CSAMPLE* pInput, CSAMPLE* pOutput,
47 const mixxx::EngineParameters& bufferParameters,
48 const EffectEnableState enableState,
49 const GroupFeatureState& groupFeatures) {
50 Q_UNUSED(handle);
51 Q_UNUSED(groupFeatures);
52
53 if (enableState == EffectEnableState::Disabling) {
54 // Ramp to dry, when disabling, this will ramp from dry when enabling as well
55 pState->processChannelAndPause(pInput, pOutput, bufferParameters.samplesPerBuffer());
56 } else {
57 double fLow;
58 double fMid;
59 double fHigh;
60 if (!m_pKillLow->toBool()) {
61 fLow = m_pPotLow->value();
62 } else {
63 fLow = 0;
64 }
65 if (!m_pKillMid->toBool()) {
66 fMid = m_pPotMid->value();
67 } else {
68 fMid = 0;
69 }
70 if (!m_pKillHigh->toBool()) {
71 fHigh = m_pPotHigh->value();
72 } else {
73 fHigh = 0;
74 }
75 pState->processChannel(
76 pInput, pOutput,
77 bufferParameters.samplesPerBuffer(), bufferParameters.sampleRate(),
78 fLow, fMid, fHigh,
79 m_pLoFreqCorner->get(), m_pHiFreqCorner->get());
80 }
81 }
82