// static EffectManifest EchoEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("Echo")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr("Simple Echo with pingpong")); EffectManifestParameter* time = manifest.addParameter(); time->setId("send_amount"); time->setName(QObject::tr("Send")); time->setDescription( QObject::tr("How much of the signal to send into the delay buffer")); time->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); time->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); time->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); time->setMinimum(0.0); time->setDefault(1.0); time->setMaximum(1.0); time = manifest.addParameter(); time->setId("delay_time"); time->setName(QObject::tr("Delay")); time->setDescription(QObject::tr("Delay time (seconds)")); time->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); time->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); time->setUnitsHint(EffectManifestParameter::UNITS_TIME); time->setDefaultLinkType(EffectManifestParameter::LINK_LINKED); time->setMinimum(0.1); time->setDefault(0.25); time->setMaximum(2.0); time = manifest.addParameter(); time->setId("feedback_amount"); time->setName(QObject::tr("Feedback")); time->setDescription( QObject::tr("Amount the echo fades each time it loops")); time->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); time->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); time->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); time->setMinimum(0.00); time->setDefault(0.40); time->setMaximum(1.0); time = manifest.addParameter(); time->setId("pingpong_amount"); time->setName(QObject::tr("PingPong")); time->setDescription( QObject::tr("As the ping-pong amount increases, increasing amounts " "of the echoed signal is bounced between the left and " "right speakers.")); time->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); time->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); time->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); time->setMinimum(0.0); time->setDefault(0.0); time->setMaximum(1.0); return manifest; }
// static EffectManifest AutoPanEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("AutoPan")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr("Bounce the sound from a channel " "to another, roughly or softly, fully or partially, fastly or slowly. " "A delay, inversed on each side, is added to increase the " "spatial move and the period can be synced with the BPM.")); // Period EffectManifestParameter* period = manifest.addParameter(); period->setId("period"); period->setName(QObject::tr("Period")); period->setDescription(QObject::tr("How fast the sound goes from a side to another\n" "1/4 - 4 beats rounded to 1/2 beat if tempo is detected (decks and samplers)\n" "1/4 - 4 seconds if tempo is detected (mic & aux inputs, master mix)")); period->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); period->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); period->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); period->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); period->setDefaultLinkInversion(EffectManifestParameter::LinkInversion::INVERTED); period->setMinimum(0.0); period->setMaximum(4.0); period->setDefault(2.0); EffectManifestParameter* smoothing = manifest.addParameter(); smoothing->setId("smoothing"); smoothing->setName(QObject::tr("Smoothing")); smoothing->setShortName(QObject::tr("Smooth")); smoothing->setDescription( QObject::tr("How smoothly the signal goes from one side to the other")); smoothing->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); smoothing->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); smoothing->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); smoothing->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); smoothing->setMinimum(0.25); smoothing->setMaximum(0.50); // there are two steps per period so max is half smoothing->setDefault(0.50); // TODO(Ferran Pujol): when KnobComposedMaskedRing branch is merged to master, // make the scaleStartParameter for this be 1. // Width : applied on the channel with gain reducing. EffectManifestParameter* width = manifest.addParameter(); width->setId("width"); width->setName(QObject::tr("Width")); width->setDescription("How far the signal goes to each side"); width->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); width->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); width->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); width->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); width->setMinimum(0.0); width->setMaximum(1.0); // 0.02 * sampleRate => 20ms width->setDefault(0.5); return manifest; }
// static EffectManifest EchoEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("Echo")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr("Simple Echo. Applies " "feedback and runs a simple low-pass filter to reduce high " "frequencies")); EffectManifestParameter* time = manifest.addParameter(); time->setId("delay_time"); time->setName(QObject::tr("Delay")); time->setDescription(QObject::tr("Delay time (seconds)")); time->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); time->setValueHint(EffectManifestParameter::VALUE_FLOAT); time->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); time->setUnitsHint(EffectManifestParameter::UNITS_TIME); time->setLinkHint(EffectManifestParameter::LINK_LINKED); time->setMinimum(0.1); time->setDefault(0.25); time->setMaximum(2.0); time = manifest.addParameter(); time->setId("feedback_amount"); time->setName(QObject::tr("Feedback")); time->setDescription( QObject::tr("Amount the echo fades each time it loops")); time->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); time->setValueHint(EffectManifestParameter::VALUE_FLOAT); time->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); time->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); time->setMinimum(0.00); time->setDefault(0.40); // Allow > 1.0 feedback for DANGEROUS TESTING-ONLY feedback! time->setMaximum(1.1); time = manifest.addParameter(); time->setId("pingpong_amount"); time->setName(QObject::tr("PingPong")); time->setDescription( QObject::tr("As the ping-pong amount increases, increasing amounts " "of the echoed signal is bounced between the left and " "right speakers.")); time->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); time->setValueHint(EffectManifestParameter::VALUE_FLOAT); time->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); time->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); time->setMinimum(0.0); time->setDefault(0.0); time->setMaximum(1.0); return manifest; }
// static EffectManifest LinkwitzRiley8EQEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("LinkwitzRiley8 EQ")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr( "A Linkwitz-Riley 8th order filter equalizer (optimized crossover, constant phase shift, roll-off -48 db/Oct). " "To adjust frequency shelves see the Equalizer preferences.")); EffectManifestParameter* low = manifest.addParameter(); low->setId("low"); low->setName(QObject::tr("Low")); low->setDescription(QObject::tr("Gain for Low Filter")); low->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); low->setValueHint(EffectManifestParameter::VALUE_FLOAT); low->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); low->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); low->setNeutralPointOnScale(0.5); low->setDefault(1.0); low->setMinimum(0); low->setMaximum(4.0); EffectManifestParameter* mid = manifest.addParameter(); mid->setId("mid"); mid->setName(QObject::tr("Mid")); mid->setDescription(QObject::tr("Gain for Band Filter")); mid->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); mid->setValueHint(EffectManifestParameter::VALUE_FLOAT); mid->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); mid->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); mid->setNeutralPointOnScale(0.5); mid->setDefault(1.0); mid->setMinimum(0); mid->setMaximum(4.0); EffectManifestParameter* high = manifest.addParameter(); high->setId("high"); high->setName(QObject::tr("High")); high->setDescription(QObject::tr("Gain for High Filter")); high->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); high->setValueHint(EffectManifestParameter::VALUE_FLOAT); high->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); high->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); high->setNeutralPointOnScale(0.5); high->setDefault(1.0); high->setMinimum(0); high->setMaximum(4.0); return manifest; }
// static EffectManifest FilterEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("Filter")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr("The filter changes the tone of the " "music by allowing only high or low " "frequencies to pass through.")); manifest.setEffectRampsFromDry(true); manifest.setIsForFilterKnob(true); EffectManifestParameter* lpf = manifest.addParameter(); lpf->setId("lpf"); lpf->setName(QObject::tr("LPF")); lpf->setDescription(QObject::tr("Corner frequency ratio of the low pass filter")); lpf->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); lpf->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); lpf->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); lpf->setDefaultLinkType(EffectManifestParameter::LINK_LINKED_LEFT); lpf->setNeutralPointOnScale(1); lpf->setDefault(kMaxCorner); lpf->setMinimum(kMinCorner); lpf->setMaximum(kMaxCorner); EffectManifestParameter* q = manifest.addParameter(); q->setId("q"); q->setName(QObject::tr("Q")); q->setDescription(QObject::tr("Resonance of the filters, default = Flat top")); q->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); q->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); q->setUnitsHint(EffectManifestParameter::UNITS_SAMPLERATE); q->setDefault(2.8); // 0.707106781 = Butterworth q->setMinimum(0.4); q->setMaximum(4.0); EffectManifestParameter* hpf = manifest.addParameter(); hpf->setId("hpf"); hpf->setName(QObject::tr("HPF")); hpf->setDescription(QObject::tr("Corner frequency ratio of the high pass filter")); hpf->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); hpf->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); hpf->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); hpf->setDefaultLinkType(EffectManifestParameter::LINK_LINKED_RIGHT); hpf->setNeutralPointOnScale(0.0); hpf->setDefault(kMinCorner); hpf->setMinimum(kMinCorner); hpf->setMaximum(kMaxCorner); return manifest; }
// static EffectManifest MoogLadder4FilterEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("Moog Ladder 4 Filter")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr( "A 4-pole Moog ladder filter, based on Antti Houvilainen's non linear digital implementation")); manifest.setEffectRampsFromDry(true); manifest.setIsForFilterKnob(true); EffectManifestParameter* lpf = manifest.addParameter(); lpf->setId("lpf"); lpf->setName(QObject::tr("LPF")); lpf->setDescription(QObject::tr("Corner frequency ratio of the low pass filter")); lpf->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); lpf->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); lpf->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); lpf->setDefaultLinkType(EffectManifestParameter::LINK_LINKED_LEFT); lpf->setNeutralPointOnScale(1); lpf->setDefault(kMaxCorner); lpf->setMinimum(kMinCorner); lpf->setMaximum(kMaxCorner); EffectManifestParameter* q = manifest.addParameter(); q->setId("resonance"); q->setName(QObject::tr("Resonance")); q->setDescription(QObject::tr("Resonance of the filters. 4 = self oscillating")); q->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); q->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); q->setUnitsHint(EffectManifestParameter::UNITS_SAMPLERATE); q->setDefault(0); q->setMinimum(0.0); q->setMaximum(4.0); EffectManifestParameter* hpf = manifest.addParameter(); hpf->setId("hpf"); hpf->setName(QObject::tr("HPF")); hpf->setDescription(QObject::tr("Corner frequency ratio of the high pass filter")); hpf->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); hpf->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); hpf->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); hpf->setDefaultLinkType(EffectManifestParameter::LINK_LINKED_RIGHT); hpf->setNeutralPointOnScale(0.0); hpf->setDefault(kMinCorner); hpf->setMinimum(kMinCorner); hpf->setMaximum(kMaxCorner); return manifest; }
// static EffectManifest ButterworthEQEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("Butterworth EQ")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr( "A Butterworth filter equalizer (the default high-quality filter " "included with Mixxx). To adjust frequency shelves see the " "Equalizer preferences.")); EffectManifestParameter* low = manifest.addParameter(); low->setId("low"); low->setName(QObject::tr("Low")); low->setDescription(QObject::tr("Gain for Low Filter")); low->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); low->setValueHint(EffectManifestParameter::VALUE_FLOAT); low->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); low->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); low->setDefault(1.0); low->setMinimum(0); low->setMaximum(4.0); EffectManifestParameter* mid = manifest.addParameter(); mid->setId("mid"); mid->setName(QObject::tr("Mid")); mid->setDescription(QObject::tr("Gain for Band Filter")); mid->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); mid->setValueHint(EffectManifestParameter::VALUE_FLOAT); mid->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); mid->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); mid->setDefault(1.0); mid->setMinimum(0); mid->setMaximum(4.0); EffectManifestParameter* high = manifest.addParameter(); high->setId("high"); high->setName(QObject::tr("High")); high->setDescription(QObject::tr("Gain for High Filter")); high->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); high->setValueHint(EffectManifestParameter::VALUE_FLOAT); high->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); high->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); high->setDefault(1.0); high->setMinimum(0); high->setMaximum(4.0); return manifest; }
// static EffectManifest FlangerEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("Flanger")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr( "A simple modulation effect, created by taking the input signal " "and mixing it with a delayed, pitch modulated copy of itself.")); EffectManifestParameter* depth = manifest.addParameter(); depth->setId("depth"); depth->setName(QObject::tr("Depth")); depth->setDescription(QObject::tr("Controls the intensity of the effect.")); depth->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); depth->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); depth->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); depth->setDefaultLinkType(EffectManifestParameter::LINK_LINKED_LEFT_RIGHT); depth->setDefault(0.5); depth->setMinimum(0.0); depth->setMaximum(1.0); EffectManifestParameter* delay = manifest.addParameter(); delay->setId("delay"); delay->setName(QObject::tr("Delay")); delay->setDescription(QObject::tr("Sets the value for the delay length.")); delay->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); delay->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); delay->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); delay->setDefault(9001.0); delay->setMinimum(50.0); delay->setMaximum(10000.0); EffectManifestParameter* period = manifest.addParameter(); period->setId("period"); period->setName(QObject::tr("Period")); period->setDescription(QObject::tr("Controls the speed of the effect.")); period->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); period->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); period->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); period->setDefault(1500000.0); period->setMinimum(50000.0); period->setMaximum(2000000.0); return manifest; }
// static EffectManifest FlangerEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("Flanger")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription("TODO"); EffectManifestParameter* depth = manifest.addParameter(); depth->setId("depth"); depth->setName(QObject::tr("Depth")); depth->setDescription("TODO"); depth->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); depth->setValueHint(EffectManifestParameter::VALUE_FLOAT); depth->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); depth->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); depth->setDefault(0.0); depth->setMinimum(0.0); depth->setMaximum(1.0); EffectManifestParameter* delay = manifest.addParameter(); delay->setId("delay"); delay->setName(QObject::tr("Delay")); delay->setDescription("TODO"); delay->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); delay->setValueHint(EffectManifestParameter::VALUE_FLOAT); delay->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); delay->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); delay->setDefault(50.0); delay->setMinimum(50.0); delay->setMaximum(10000.0); EffectManifestParameter* period = manifest.addParameter(); period->setId("period"); period->setName(QObject::tr("Period")); period->setDescription("TODO"); period->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); period->setValueHint(EffectManifestParameter::VALUE_FLOAT); period->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); period->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); period->setDefault(50000.0); period->setMinimum(50000.0); period->setMaximum(2000000.0); return manifest; }
MetaLinkTest() : m_master(m_factory.getOrCreateHandle("[Master]"), "[Master]"), m_headphone(m_factory.getOrCreateHandle("[Headphone]"), "[Headphone]") { mixxx::Time::setTestMode(true); mixxx::Time::setTestElapsedTime(mixxx::Duration::fromNanos(0)); m_pEffectsManager->registerInputChannel(m_master); m_pEffectsManager->registerInputChannel(m_headphone); registerTestBackend(); EffectChainPointer pChain(new EffectChain(m_pEffectsManager.data(), "org.mixxx.test.chain1")); int iRackNumber = 0; int iChainNumber = 0; int iEffectNumber = 0; StandardEffectRackPointer pRack = m_pEffectsManager->addStandardEffectRack(); m_pChainSlot = pRack->getEffectChainSlot(iChainNumber); m_pChainSlot->loadEffectChainToSlot(pChain); m_pEffectSlot = m_pChainSlot->getEffectSlot(iEffectNumber); QString group = StandardEffectRack::formatEffectSlotGroupString( iRackNumber, iChainNumber, iEffectNumber); EffectManifest manifest; manifest.setId("org.mixxx.test.effect"); manifest.setName("Test Effect"); manifest.setMetaknobDefault(0.0); EffectManifestParameter* low = manifest.addParameter(); low->setId("low"); low->setName(QObject::tr("Low")); low->setDescription(QObject::tr("Gain for Low Filter")); low->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); low->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); low->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); low->setNeutralPointOnScale(0.25); low->setDefault(1.0); low->setMinimum(0); low->setMaximum(1.0); registerTestEffect(manifest, false); // Check the controls reflect the state of their loaded effect. EffectPointer pEffect = m_pEffectsManager->instantiateEffect(manifest.id()); m_pEffectSlot->loadEffect(pEffect, false); QString itemPrefix = EffectParameterSlot::formatItemPrefix(0); m_pControlValue.reset(new ControlProxy(group, itemPrefix)); m_pControlLinkType.reset(new ControlProxy(group, itemPrefix + QString("_link_type"))); m_pControlLinkInverse.reset(new ControlProxy(group, itemPrefix + QString("_link_inverse"))); }
// static EffectManifest BitCrusherEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("BitCrusher")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr( "The BitCrusher is an effect that adds quantisation noise to the signal " "by the reduction of the resolution or bandwidth of the samples.")); manifest.setEffectRampsFromDry(true); EffectManifestParameter* depth = manifest.addParameter(); depth->setId("bit_depth"); depth->setName(QObject::tr("Bit Depth")); depth->setDescription(QObject::tr("Adjusts the bit depth of the samples.")); depth->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); depth->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); depth->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); depth->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); depth->setDefaultLinkInversion(EffectManifestParameter::LinkInversion::INVERTED); depth->setNeutralPointOnScale(1.0); depth->setDefault(16); // for values -1 0 +1 // we do not allow a 1 bit version because this causes a distortion because of the missing sign bit depth->setMinimum(2); depth->setMaximum(16); EffectManifestParameter* frequency = manifest.addParameter(); frequency->setId("downsample"); frequency->setName(QObject::tr("Downsampling")); frequency->setShortName(QObject::tr("Down")); frequency->setDescription(QObject::tr("Adjusts the sample rate, to which the signal is downsampled.")); frequency->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); frequency->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); frequency->setUnitsHint(EffectManifestParameter::UnitsHint::SAMPLERATE); frequency->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); frequency->setDefaultLinkInversion(EffectManifestParameter::LinkInversion::INVERTED); frequency->setNeutralPointOnScale(1.0); frequency->setDefault(1.0); frequency->setMinimum(0.02); frequency->setMaximum(1.0); return manifest; }
// static EffectManifest ReverbEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("Reverb")); manifest.setAuthor("The Mixxx Team, CAPS Plugins"); manifest.setVersion("1.0"); manifest.setDescription("This is a port of the GPL'ed CAPS Reverb plugin, " "which has the following description:" "This is based on some of the famous Stanford CCRMA reverbs " "(NRev, KipRev) all based on the Chowning/Moorer/Schroeder " "reverberators, which use networks of simple allpass and comb" "delay filters."); EffectManifestParameter* time = manifest.addParameter(); time->setId("bandwidth"); time->setName(QObject::tr("Bandwidth")); time->setDescription(QObject::tr("Higher bandwidth values cause more " "bright (high-frequency) tones to be included")); time->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); time->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); time->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); time->setDefaultLinkType(EffectManifestParameter::LINK_LINKED_LEFT_RIGHT); time->setMinimum(0.0005); time->setDefault(0.5); time->setMaximum(1.0); EffectManifestParameter* damping = manifest.addParameter(); damping->setId("damping"); damping->setName(QObject::tr("Damping")); damping->setDescription(QObject::tr("Higher damping values cause " "reverberations to die out more quickly.")); damping->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); damping->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); damping->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); damping->setDefaultLinkType(EffectManifestParameter::LINK_LINKED); damping->setMinimum(0.005); damping->setDefault(0.5); damping->setMaximum(1.0); return manifest; }
// static EffectManifest BitCrusherEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("BitCrusher")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription("TODO"); manifest.setEffectRampsFromDry(true); EffectManifestParameter* depth = manifest.addParameter(); depth->setId("bit_depth"); depth->setName(QObject::tr("Bit Depth")); depth->setDescription("TODO"); depth->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); depth->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); depth->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); depth->setDefaultLinkType(EffectManifestParameter::LINK_LINKED); depth->setNeutralPointOnScale(1.0); depth->setDefault(16); // for values -1 0 +1 // we do not allow a 1 bit version because this causes a distortion because of the missing sign bit depth->setMinimum(2); depth->setMaximum(16); EffectManifestParameter* frequency = manifest.addParameter(); frequency->setId("downsample"); frequency->setName(QObject::tr("Downsampling")); frequency->setDescription("TODO"); frequency->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); frequency->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); frequency->setUnitsHint(EffectManifestParameter::UNITS_SAMPLERATE); frequency->setDefaultLinkType(EffectManifestParameter::LINK_LINKED); frequency->setNeutralPointOnScale(1.0); frequency->setDefault(1.0); frequency->setMinimum(0.02); frequency->setMaximum(1.0); return manifest; }
// static EffectManifest FilterEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("Filter")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription("TODO"); EffectManifestParameter* depth = manifest.addParameter(); depth->setId("depth"); depth->setName(QObject::tr("Depth")); depth->setDescription("TODO"); depth->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); depth->setValueHint(EffectManifestParameter::VALUE_FLOAT); depth->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); depth->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); depth->setLinkHint(EffectManifestParameter::LINK_LINKED); depth->setDefault(0.0); depth->setMinimum(-1.0); depth->setMaximum(1.0); EffectManifestParameter* bandpass_width = manifest.addParameter(); bandpass_width->setId("bandpass_width"); bandpass_width->setName(QObject::tr("Bandpass Width")); bandpass_width->setDescription("TODO"); bandpass_width->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); bandpass_width->setValueHint(EffectManifestParameter::VALUE_FLOAT); bandpass_width->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); bandpass_width->setUnitsHint(EffectManifestParameter::UNITS_SAMPLERATE); bandpass_width->setDefault(0.01); bandpass_width->setMinimum(0.001); bandpass_width->setMaximum(0.01); EffectManifestParameter* bandpass_gain = manifest.addParameter(); bandpass_gain->setId("bandpass_gain"); bandpass_gain->setName(QObject::tr("Bandpass Gain")); bandpass_gain->setDescription("TODO"); bandpass_gain->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); bandpass_gain->setValueHint(EffectManifestParameter::VALUE_FLOAT); bandpass_gain->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); bandpass_gain->setUnitsHint(EffectManifestParameter::UNITS_SAMPLERATE); bandpass_gain->setDefault(0.3); bandpass_gain->setMinimum(0.0); bandpass_gain->setMaximum(1.0); return manifest; }
// static EffectManifest GraphicEQEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("Graphic EQ")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr( "An 8 band Graphic EQ based on Biquad Filters")); manifest.setEffectRampsFromDry(true); manifest.setIsMasterEQ(true); // Display rounded center frequencies for each filter float centerFrequencies[8] = {45, 100, 220, 500, 1100, 2500, 5500, 12000}; EffectManifestParameter* low = manifest.addParameter(); low->setId(QString("low")); low->setName(QString("%1 Hz").arg(centerFrequencies[0])); low->setDescription(QObject::tr("Gain for Low Filter")); low->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); low->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); low->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); low->setNeutralPointOnScale(0.5); low->setDefault(0); low->setMinimum(-12); low->setMaximum(12); QString paramName; for (int i = 0; i < 6; i++) { if (centerFrequencies[i + 1] < 1000) { paramName = QString("%1 Hz").arg(centerFrequencies[i + 1]); } else { paramName = QString("%1 kHz").arg(centerFrequencies[i + 1] / 1000); } EffectManifestParameter* mid = manifest.addParameter(); mid->setId(QString("mid%1").arg(i)); mid->setName(paramName); mid->setDescription(QObject::tr("Gain for Band Filter %1").arg(i)); mid->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); mid->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); mid->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); mid->setNeutralPointOnScale(0.5); mid->setDefault(0); mid->setMinimum(-12); mid->setMaximum(12); } EffectManifestParameter* high = manifest.addParameter(); high->setId(QString("high")); high->setName(QString("%1 kHz").arg(centerFrequencies[7] / 1000)); high->setDescription(QObject::tr("Gain for High Filter")); high->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); high->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); high->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); high->setDefault(0); high->setMinimum(-12); high->setMaximum(12); return manifest; }
// static EffectManifest Bessel4LVMixEQEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("Bessel4 LV-Mix EQ")); manifest.setShortName(QObject::tr("Bessel4 EQ")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr( "A Bessel 4th order filter equalizer with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -24 db/Oct). " "To adjust frequency shelves see the Equalizer preferences.")); manifest.setIsMixingEQ(true); manifest.setEffectRampsFromDry(true); EffectManifestParameter* low = manifest.addParameter(); low->setId("low"); low->setName(QObject::tr("Low")); low->setDescription(QObject::tr("Gain for Low Filter")); low->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); low->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); low->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); low->setNeutralPointOnScale(0.5); low->setDefault(1.0); low->setMinimum(0); low->setMaximum(4.0); EffectManifestParameter* killLow = manifest.addParameter(); killLow->setId("killLow"); killLow->setName(QObject::tr("Kill Low")); killLow->setDescription(QObject::tr("Kill the Low Filter")); killLow->setControlHint(EffectManifestParameter::CONTROL_TOGGLE_STEPPING); killLow->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); killLow->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); killLow->setDefault(0); killLow->setMinimum(0); killLow->setMaximum(1); EffectManifestParameter* mid = manifest.addParameter(); mid->setId("mid"); mid->setName(QObject::tr("Mid")); mid->setDescription(QObject::tr("Gain for Band Filter")); mid->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); mid->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); mid->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); mid->setNeutralPointOnScale(0.5); mid->setDefault(1.0); mid->setMinimum(0); mid->setMaximum(4.0); EffectManifestParameter* killMid = manifest.addParameter(); killMid->setId("killMid"); killMid->setName(QObject::tr("Kill Mid")); killMid->setDescription(QObject::tr("Kill the Mid Filter")); killMid->setControlHint(EffectManifestParameter::CONTROL_TOGGLE_STEPPING); killMid->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); killMid->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); killMid->setDefault(0); killMid->setMinimum(0); killMid->setMaximum(1); EffectManifestParameter* high = manifest.addParameter(); high->setId("high"); high->setName(QObject::tr("High")); high->setDescription(QObject::tr("Gain for High Filter")); high->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); high->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); high->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); high->setNeutralPointOnScale(0.5); high->setDefault(1.0); high->setMinimum(0); high->setMaximum(4.0); EffectManifestParameter* killHigh = manifest.addParameter(); killHigh->setId("killHigh"); killHigh->setName(QObject::tr("Kill High")); killHigh->setDescription(QObject::tr("Kill the High Filter")); killHigh->setControlHint(EffectManifestParameter::CONTROL_TOGGLE_STEPPING); killHigh->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); killHigh->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); killHigh->setDefault(0); killHigh->setMinimum(0); killHigh->setMaximum(1); return manifest; }
// static EffectManifest FlangerEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("Flanger")); manifest.setShortName(QObject::tr("Flanger")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr( "Mixes the input with a delayed, pitch modulated copy of itself to create comb filtering")); EffectManifestParameter* speed = manifest.addParameter(); speed->setId("speed"); speed->setName(QObject::tr("Speed")); speed->setShortName(QObject::tr("Speed")); speed->setDescription(QObject::tr( "Speed of the LFO (low frequency oscillator)\n" "32 - 1/4 beats rounded to 1/2 beat per LFO cycle if tempo is detected\n" "1/32 - 4 Hz if no tempo is detected")); speed->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC_INVERSE); speed->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); speed->setMinimum(kMinLfoBeats); speed->setMaximum(kMaxLfoBeats); speed->setDefault(8); EffectManifestParameter* width = manifest.addParameter(); width->setId("width"); width->setName(QObject::tr("Width")); width->setShortName(QObject::tr("Width")); width->setDescription(QObject::tr( "Delay amplitude of the LFO (low frequency oscillator)")); width->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); width->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); width->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); width->setDefault(kMaxLfoWidthMs / 2); width->setMinimum(0.0); width->setMaximum(kMaxLfoWidthMs); EffectManifestParameter* manual = manifest.addParameter(); manual->setId("manual"); manual->setName(QObject::tr("Manual")); manual->setShortName(QObject::tr("Manual")); manual->setDescription(QObject::tr( "Delay offset of the LFO (low frequency oscillator).\n" "With width at zero, this allows for manually sweeping over the entire delay range.")); manual->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); manual->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); manual->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); manual->setDefault(kCenterDelayMs); manual->setMinimum(kMinDelayMs); manual->setMaximum(kMaxDelayMs); EffectManifestParameter* regen = manifest.addParameter(); regen->setId("regen"); regen->setName(QObject::tr("Regeneration")); regen->setShortName(QObject::tr("Regen")); regen->setDescription(QObject::tr( "How much of the delay output is feed back into the input")); regen->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); regen->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); regen->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); regen->setDefault(0.25); regen->setMinimum(0.0); regen->setMaximum(1.0); EffectManifestParameter* mix = manifest.addParameter(); mix->setId("mix"); mix->setName(QObject::tr("Mix")); mix->setShortName(QObject::tr("Mix")); mix->setDescription(QObject::tr( "Intensity of the effect")); mix->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); mix->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); mix->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); mix->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); mix->setDefault(1.0); mix->setMinimum(0.0); mix->setMaximum(1.0); EffectManifestParameter* triplet = manifest.addParameter(); triplet->setId("triplet"); triplet->setName(QObject::tr("Triplets")); triplet->setShortName(QObject::tr("Triplets")); triplet->setDescription(QObject::tr( "Divide rounded 1/2 beats of the Period parameter by 3.")); triplet->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); triplet->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); triplet->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); triplet->setDefault(0); triplet->setMinimum(0); triplet->setMaximum(1); return manifest; }
// static EffectManifest AutoPanEffect::getManifest() { EffectManifest manifest; manifest.setId(getId()); manifest.setName(QObject::tr("AutoPan")); manifest.setAuthor("The Mixxx Team"); manifest.setVersion("1.0"); manifest.setDescription(QObject::tr("Bounce the sound from a channel " "to another, roughly or softly, fully or partially, fastly or slowly. " "A delay, inversed on each side, is added to increase the " "spatial move and the period can be synced with the BPM.")); // Width : applied on the channel with gain reducing. EffectManifestParameter* width = manifest.addParameter(); width->setId("width"); width->setName(QObject::tr("Width")); width->setDescription("How far the signal goes on the left or on the right"); width->setControlHint(EffectManifestParameter::CONTROL_KNOB_LINEAR); width->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); width->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); width->setDefaultLinkType(EffectManifestParameter::LINK_LINKED); width->setMinimum(0.0); width->setMaximum(1.0); // 0.02 * sampleRate => 20ms width->setDefault(0.5); // Period unit EffectManifestParameter* periodUnit = manifest.addParameter(); periodUnit->setId("periodUnit"); periodUnit->setName(QObject::tr("Sync")); periodUnit->setDescription(QObject::tr("Synchronizes the period with the BPM if it can be retrieved")); periodUnit->setControlHint(EffectManifestParameter::CONTROL_TOGGLE_STEPPING); periodUnit->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); periodUnit->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); periodUnit->setDefault(1); periodUnit->setMinimum(0); periodUnit->setMaximum(1); // Period // The maximum is at 128 + 1 allowing 128 as max value and // enabling us to pause time when the parameter is above EffectManifestParameter* period = manifest.addParameter(); period->setId("period"); period->setName(QObject::tr("Period")); period->setDescription(QObject::tr("How fast the sound goes from a side to another," " following a logarithmic scale")); period->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); period->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); period->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); period->setDefaultLinkType(EffectManifestParameter::LINK_LINKED); period->setDefaultLinkInversion(EffectManifestParameter::LinkInversion::INVERTED); period->setMinimum(0.0625); // 1 / 16 period->setMaximum(129.0); // 128 + 1 period->setDefault(3.0); // This parameter controls the easing of the sound from a side to another. EffectManifestParameter* smoothing = manifest.addParameter(); smoothing->setId("smoothing"); smoothing->setName(QObject::tr("Smoothing")); smoothing->setShortName(QObject::tr("Smooth")); smoothing->setDescription( QObject::tr("How fast the signal goes from a channel to an other")); smoothing->setControlHint(EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC); smoothing->setSemanticHint(EffectManifestParameter::SEMANTIC_UNKNOWN); smoothing->setUnitsHint(EffectManifestParameter::UNITS_UNKNOWN); smoothing->setMinimum(0.0); smoothing->setMaximum(0.5); // there are two steps per period so max is half smoothing->setDefault(0.25); // TODO(Ferran Pujol): when KnobComposedMaskedRing branch is merged to master, // make the scaleStartParameter for this be 1. return manifest; }
TEST_F(MetaLinkTest, HalfLinkTakeover) { // An effect that is linked to half of a knob should be more tolerant of // takeover changes. m_pEffectSlot->slotEnabled(1.0); // We have to recreate the effect because we want a neutral point at // 0 or 1. QString group = StandardEffectRack::formatEffectSlotGroupString( 0, 0, 0); EffectManifest manifest; manifest.setId("org.mixxx.test.effect2"); manifest.setName("Test Effect2"); EffectManifestParameter* low = manifest.addParameter(); low->setId("low"); low->setName(QObject::tr("Low")); low->setDescription(QObject::tr("Gain for Low Filter (neutral at 1.0)")); low->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); low->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); low->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); low->setNeutralPointOnScale(1.0); low->setDefault(1.0); low->setMinimum(0); low->setMaximum(1.0); registerTestEffect(manifest, false); // Check the controls reflect the state of their loaded effect. EffectPointer pEffect = m_pEffectsManager->instantiateEffect(manifest.id()); m_pEffectSlot->loadEffect(pEffect, false); QString itemPrefix = EffectParameterSlot::formatItemPrefix(0); m_pControlValue.reset(new ControlProxy(group, itemPrefix)); m_pControlLinkType.reset(new ControlProxy(group, itemPrefix + QString("_link_type"))); m_pControlLinkInverse.reset(new ControlProxy(group, itemPrefix + QString("_link_inverse"))); // OK now the actual test. // 1.5 is a bit of a magic number, but it's enough that a regular // linked control will fail the soft takeover test and not change the // value... double newParam = 0.5 - SoftTakeover::kDefaultTakeoverThreshold * 1.5; m_pEffectSlot->slotEffectMetaParameter(newParam); EXPECT_EQ(1.0, m_pControlValue->get()); // ...but that value is still within the tolerance of a linked-left // and linked-right control. So if we set the exact same newParam, // we should see the control change as expected. m_pEffectSlot->slotEffectMetaParameter(0.5); m_pControlValue->set(1.0); m_pControlLinkType->set( static_cast<double>(EffectManifestParameter::LinkType::LINKED_LEFT)); m_pEffectSlot->syncSofttakeover(); m_pEffectSlot->slotEffectMetaParameter(newParam); EXPECT_EQ(newParam * 2.0, m_pControlValue->get()); // This tolerance change should also work for linked-right controls. m_pEffectSlot->slotEffectMetaParameter(0.5); m_pControlValue->set(1.0); m_pControlLinkType->set( static_cast<double>(EffectManifestParameter::LinkType::LINKED_RIGHT)); m_pEffectSlot->syncSofttakeover(); newParam = 0.5 + SoftTakeover::kDefaultTakeoverThreshold * 1.5; m_pEffectSlot->slotEffectMetaParameter(newParam); EXPECT_FLOAT_EQ(0.0703125, m_pControlValue->get()); }