Skip to content
Merged

Flanger #1362

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
a470792
Rename Depth to Mix and added the standard flanger parameters without…
daschuer Oct 14, 2017
7303e59
Make flanger sample rate independent
daschuer Oct 14, 2017
bc06153
Enable width and manual parameter
daschuer Oct 14, 2017
daeecad
enable regen parameter and added a tanh clipper
daschuer Oct 14, 2017
0e5110d
Rvert parameter speed back to period
daschuer Oct 14, 2017
138ecfc
De-crackel period knob
daschuer Oct 14, 2017
d313ceb
De-crackle mix and regen knob
daschuer Oct 14, 2017
54aa94c
De-crackle width and manual knob
daschuer Oct 14, 2017
408a182
tweak min an max delay
daschuer Oct 16, 2017
3b78e41
use override keyword in controlbehaviour.h
daschuer Oct 18, 2017
49078e7
Disable broken midi access to COs where no behaviour is installed
daschuer Oct 18, 2017
12c286d
clean up function names a bit
daschuer Oct 19, 2017
fbf7b45
verify lokal pBehavior
daschuer Oct 21, 2017
af7ea00
Warn about missing Midi representation
daschuer Oct 21, 2017
e797489
Added KNOB_LINEAR_INVERSE and KNOB_LOGARITHMIC_INVERSE
daschuer Oct 21, 2017
99cd401
Made a logarithmic flanger speed knob
daschuer Oct 21, 2017
6ec565c
Added long name for Regeneration parameter
daschuer Oct 24, 2017
87d5863
default Regen to 0.25
daschuer Oct 24, 2017
2ba1e81
fix typo and code style
daschuer Oct 24, 2017
c52cfd7
Added new rampingvalue helper class template
daschuer Oct 24, 2017
8defca7
default speed to 8 beats
daschuer Oct 24, 2017
e076f3a
tweak defauts and move super connection to mix parameter
daschuer Oct 24, 2017
e4a8b3f
clear the buffer with the right size
daschuer Oct 29, 2017
f287686
Fix constexpr issue
daschuer Nov 5, 2017
141fb99
fix include guard
daschuer Nov 5, 2017
4ed3a2d
Fix the constexpr issue again
daschuer Nov 5, 2017
7778953
Implement missing midi convert functions
daschuer Nov 6, 2017
c3d91cc
make manual logarthmic
daschuer Nov 16, 2017
78fe9fe
Added gain correction
daschuer Nov 16, 2017
d492f57
Fix typo to remove click noise when starting flanger
daschuer Nov 16, 2017
4776def
Fix typo in c-tor
daschuer Nov 18, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 14 additions & 13 deletions src/control/control.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -233,30 +233,31 @@ double ControlDoublePrivate::getParameterForValue(double value) const {
return value;
}

double ControlDoublePrivate::getParameterForMidiValue(double midiValue) const {
double ControlDoublePrivate::getParameterForMidi(double midiParam) const {
QSharedPointer<ControlNumericBehavior> pBehavior = m_pBehavior;
if (!pBehavior.isNull()) {
return pBehavior->midiValueToParameter(midiValue);
VERIFY_OR_DEBUG_ASSERT(pBehavior) {
qWarning() << "Cannot set" << m_key << "by Midi";
return 0;
}
return midiValue;
return pBehavior->midiToParameter(midiParam);
}

void ControlDoublePrivate::setMidiParameter(MidiOpCode opcode, double dParam) {
void ControlDoublePrivate::setValueFromMidi(MidiOpCode opcode, double midiParam) {
QSharedPointer<ControlNumericBehavior> pBehavior = m_pBehavior;
if (!pBehavior.isNull()) {
pBehavior->setValueFromMidiParameter(opcode, dParam, this);
} else {
set(dParam, NULL);
VERIFY_OR_DEBUG_ASSERT(pBehavior) {
qWarning() << "Cannot set" << m_key << "by Midi";
return;
}
pBehavior->setValueFromMidi(opcode, midiParam, this);
}

double ControlDoublePrivate::getMidiParameter() const {
QSharedPointer<ControlNumericBehavior> pBehavior = m_pBehavior;
double value = get();
if (!pBehavior.isNull()) {
value = pBehavior->valueToMidiParameter(value);
VERIFY_OR_DEBUG_ASSERT(pBehavior) {
qWarning() << "Cannot get" << m_key << "by Midi";
return 0;
}
return value;
return pBehavior->valueToMidiParameter(get());
}

bool ControlDoublePrivate::connectValueChangeRequest(const QObject* receiver,
Expand Down
4 changes: 2 additions & 2 deletions src/control/control.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ class ControlDoublePrivate : public QObject {
void setParameter(double dParam, QObject* pSender);
double getParameter() const;
double getParameterForValue(double value) const;
double getParameterForMidiValue(double midiValue) const;
double getParameterForMidi(double midiValue) const;

void setMidiParameter(MidiOpCode opcode, double dParam);
void setValueFromMidi(MidiOpCode opcode, double dParam);
double getMidiParameter() const;

inline bool ignoreNops() const {
Expand Down
67 changes: 41 additions & 26 deletions src/control/controlbehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,23 @@ double ControlNumericBehavior::valueToParameter(double dValue) {
return dValue;
}

double ControlNumericBehavior::midiValueToParameter(double midiValue) {
return midiValue;
double ControlNumericBehavior::midiToParameter(double midiValue) {
return midiValue / 127.0;
}

double ControlNumericBehavior::parameterToValue(double dParam) {
return dParam;
}

double ControlNumericBehavior::valueToMidiParameter(double dValue) {
return dValue;
double dParam = valueToParameter(dValue);
return dParam * 127.0;
}

void ControlNumericBehavior::setValueFromMidiParameter(MidiOpCode o, double dParam,
ControlDoublePrivate* pControl) {
void ControlNumericBehavior::setValueFromMidi(
MidiOpCode o, double dParam, ControlDoublePrivate* pControl) {
Q_UNUSED(o);
double dNorm = midiValueToParameter(dParam);
double dNorm = midiToParameter(dParam);
pControl->set(parameterToValue(dNorm), NULL);
}

Expand All @@ -38,9 +39,6 @@ ControlPotmeterBehavior::ControlPotmeterBehavior(double dMinValue, double dMaxVa
m_bAllowOutOfBounds(allowOutOfBounds) {
}

ControlPotmeterBehavior::~ControlPotmeterBehavior() {
}

bool ControlPotmeterBehavior::setFilter(double* dValue) {
if (!m_bAllowOutOfBounds) {
if (*dValue > m_dMaxValue) {
Expand All @@ -64,7 +62,7 @@ double ControlPotmeterBehavior::valueToParameter(double dValue) {
return (dValue - m_dMinValue) / m_dValueRange;
}

double ControlPotmeterBehavior::midiValueToParameter(double midiValue) {
double ControlPotmeterBehavior::midiToParameter(double midiValue) {
double parameter;
if (midiValue > 64) {
parameter = (midiValue - 1) / 126.0;
Expand Down Expand Up @@ -98,7 +96,8 @@ double ControlPotmeterBehavior::valueToMidiParameter(double dValue) {
#define middlePosition ((maxPosition - minPosition) / 2.0)
#define positionrange (maxPosition - minPosition)

ControlLogPotmeterBehavior::ControlLogPotmeterBehavior(double dMinValue, double dMaxValue, double minDB)
ControlLogPotmeterBehavior::ControlLogPotmeterBehavior(double dMinValue,
double dMaxValue, double minDB)
: ControlPotmeterBehavior(dMinValue, dMaxValue, false) {
if (minDB >= 0) {
qWarning() << "ControlLogPotmeterBehavior::ControlLogPotmeterBehavior() minDB must be negative";
Expand All @@ -109,9 +108,6 @@ ControlLogPotmeterBehavior::ControlLogPotmeterBehavior(double dMinValue, double
m_minOffset = db2ratio(m_minDB);
}

ControlLogPotmeterBehavior::~ControlLogPotmeterBehavior() {
}

double ControlLogPotmeterBehavior::valueToParameter(double dValue) {
if (m_dValueRange == 0.0) {
return 0;
Expand All @@ -132,12 +128,35 @@ double ControlLogPotmeterBehavior::parameterToValue(double dParam) {
return m_dMinValue + (linPrameter * m_dValueRange);
}

ControlLinPotmeterBehavior::ControlLinPotmeterBehavior(double dMinValue, double dMaxValue,
bool allowOutOfBounds)
ControlLogInvPotmeterBehavior::ControlLogInvPotmeterBehavior(
double dMinValue, double dMaxValue, double minDB)
: ControlLogPotmeterBehavior(dMinValue, dMaxValue, minDB) {
}

double ControlLogInvPotmeterBehavior::valueToParameter(double dValue) {
return 1 - ControlLogPotmeterBehavior::valueToParameter(dValue);
}

double ControlLogInvPotmeterBehavior::parameterToValue(double dParam) {
return ControlLogPotmeterBehavior::parameterToValue(1 - dParam);
}

ControlLinPotmeterBehavior::ControlLinPotmeterBehavior(
double dMinValue, double dMaxValue, bool allowOutOfBounds)
: ControlPotmeterBehavior(dMinValue, dMaxValue, allowOutOfBounds) {
}

ControlLinInvPotmeterBehavior::ControlLinInvPotmeterBehavior(
double dMinValue, double dMaxValue, bool allowOutOfBounds)
: ControlPotmeterBehavior(dMinValue, dMaxValue, allowOutOfBounds) {
}

ControlLinPotmeterBehavior::~ControlLinPotmeterBehavior() {
double ControlLinInvPotmeterBehavior::valueToParameter(double dValue) {
return 1 - ControlPotmeterBehavior::valueToParameter(dValue);
}

double ControlLinInvPotmeterBehavior::parameterToValue(double dParam) {
return ControlPotmeterBehavior::parameterToValue(1 - dParam);
}

ControlAudioTaperPotBehavior::ControlAudioTaperPotBehavior(
Expand All @@ -151,9 +170,6 @@ ControlAudioTaperPotBehavior::ControlAudioTaperPotBehavior(
m_midiCorrection = ceil(m_neutralParameter * 127) - (m_neutralParameter * 127);
}

ControlAudioTaperPotBehavior::~ControlAudioTaperPotBehavior() {
}

double ControlAudioTaperPotBehavior::valueToParameter(double dValue) {
double dParam = 1.0;
if (dValue <= 0.0) {
Expand Down Expand Up @@ -206,7 +222,7 @@ double ControlAudioTaperPotBehavior::parameterToValue(double dParam) {
return dValue;
}

double ControlAudioTaperPotBehavior::midiValueToParameter(double midiValue) {
double ControlAudioTaperPotBehavior::midiToParameter(double midiValue) {
double dParam;
if (m_neutralParameter && m_neutralParameter != 1.0) {
double neutralTest = (midiValue - m_midiCorrection) / 127.0;
Expand Down Expand Up @@ -241,14 +257,13 @@ double ControlAudioTaperPotBehavior::valueToMidiParameter(double dValue) {
return dMidiParam;
}

void ControlAudioTaperPotBehavior::setValueFromMidiParameter(MidiOpCode o, double dMidiParam,
ControlDoublePrivate* pControl) {
void ControlAudioTaperPotBehavior::setValueFromMidi(
MidiOpCode o, double dMidiParam, ControlDoublePrivate* pControl) {
Q_UNUSED(o);
double dParam = midiValueToParameter(dMidiParam);
double dParam = midiToParameter(dMidiParam);
pControl->set(parameterToValue(dParam), NULL);
}


double ControlTTRotaryBehavior::valueToParameter(double dValue) {
return (dValue * 200.0 + 64) / 127.0;
}
Expand All @@ -273,7 +288,7 @@ ControlPushButtonBehavior::ControlPushButtonBehavior(ButtonMode buttonMode,
m_iNumStates(iNumStates) {
}

void ControlPushButtonBehavior::setValueFromMidiParameter(
void ControlPushButtonBehavior::setValueFromMidi(
MidiOpCode o, double dParam, ControlDoublePrivate* pControl) {
// Calculate pressed State of the midi Button
// Some controller like the RMX2 are sending always MIDI_NOTE_ON
Expand Down
76 changes: 48 additions & 28 deletions src/control/controlbehavior.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,33 +8,38 @@

class ControlDoublePrivate;

// A linear 0 .. 1 control without Midi representation
class ControlNumericBehavior {
public:
virtual ~ControlNumericBehavior() { };

// Returns true if the set should occur. Mutates dValue if the value should
// be changed.
// this may change the dValue in place before it is adopted
// Returns false to reject the new value entirely
virtual bool setFilter(double* dValue);

// returns the normalized parameter range 0..1
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for adding these comments.

virtual double valueToParameter(double dValue);
virtual double midiValueToParameter(double midiValue);
// returns the normalized parameter range 0..1
virtual double midiToParameter(double midiValue);
// returns the scaled user visible value
virtual double parameterToValue(double dParam);
// returns the midi range parameter 0..127
virtual double valueToMidiParameter(double dValue);
virtual void setValueFromMidiParameter(MidiOpCode o, double dParam,
ControlDoublePrivate* pControl);

virtual void setValueFromMidi(
MidiOpCode o, double dParam, ControlDoublePrivate* pControl);
};

class ControlPotmeterBehavior : public ControlNumericBehavior {
public:
ControlPotmeterBehavior(double dMinValue, double dMaxValue,
bool allowOutOfBounds);
virtual ~ControlPotmeterBehavior();

virtual bool setFilter(double* dValue);
virtual double valueToParameter(double dValue);
virtual double midiValueToParameter(double midiValue);
virtual double parameterToValue(double dParam);
virtual double valueToMidiParameter(double dValue);
bool setFilter(double* dValue) override;
double valueToParameter(double dValue) override;
double midiToParameter(double midiValue) override;
double parameterToValue(double dParam) override;
double valueToMidiParameter(double dValue) override;

protected:
double m_dMinValue;
Expand All @@ -46,35 +51,49 @@ class ControlPotmeterBehavior : public ControlNumericBehavior {
class ControlLogPotmeterBehavior : public ControlPotmeterBehavior {
public:
ControlLogPotmeterBehavior(double dMinValue, double dMaxValue, double minDB);
virtual ~ControlLogPotmeterBehavior();

virtual double valueToParameter(double dValue);
virtual double parameterToValue(double dParam);
double valueToParameter(double dValue) override;
double parameterToValue(double dParam) override;

protected:
double m_minDB;
double m_minOffset;
};

class ControlLogInvPotmeterBehavior : public ControlLogPotmeterBehavior {
public:
ControlLogInvPotmeterBehavior(double dMinValue, double dMaxValue, double minDB);

double valueToParameter(double dValue) override;
double parameterToValue(double dParam) override;
};

class ControlLinPotmeterBehavior : public ControlPotmeterBehavior {
public:
ControlLinPotmeterBehavior(double dMinValue, double dMaxValue,
bool allowOutOfBounds);
virtual ~ControlLinPotmeterBehavior();
ControlLinPotmeterBehavior(
double dMinValue, double dMaxValue, bool allowOutOfBounds);
};

class ControlLinInvPotmeterBehavior : public ControlPotmeterBehavior {
public:
ControlLinInvPotmeterBehavior(
double dMinValue, double dMaxValue, bool allowOutOfBounds);
double valueToParameter(double dValue) override;
double parameterToValue(double dParam) override;
};

class ControlAudioTaperPotBehavior : public ControlPotmeterBehavior {
public:
ControlAudioTaperPotBehavior(double minDB, double maxDB,
double neutralParameter);
virtual ~ControlAudioTaperPotBehavior();

virtual double valueToParameter(double dValue);
virtual double parameterToValue(double dParam);
virtual double midiValueToParameter(double midiValue);
virtual double valueToMidiParameter(double dValue);
virtual void setValueFromMidiParameter(MidiOpCode o, double dParam,
ControlDoublePrivate* pControl);
double valueToParameter(double dValue) override;
double parameterToValue(double dParam) override;
double midiToParameter(double midiValue) override;
double valueToMidiParameter(double dValue) override;
void setValueFromMidi(
MidiOpCode o, double dParam, ControlDoublePrivate* pControl)
override;

protected:
// a knob position between 0 and 1 where the gain is 1 (0dB)
Expand All @@ -94,8 +113,8 @@ class ControlAudioTaperPotBehavior : public ControlPotmeterBehavior {

class ControlTTRotaryBehavior : public ControlNumericBehavior {
public:
virtual double valueToParameter(double dValue);
virtual double parameterToValue(double dParam);
double valueToParameter(double dValue) override;
double parameterToValue(double dParam) override;
};

class ControlPushButtonBehavior : public ControlNumericBehavior {
Expand All @@ -114,8 +133,9 @@ class ControlPushButtonBehavior : public ControlNumericBehavior {
};

ControlPushButtonBehavior(ButtonMode buttonMode, int iNumStates);
virtual void setValueFromMidiParameter(MidiOpCode o, double dParam,
ControlDoublePrivate* pControl);
void setValueFromMidi(
MidiOpCode o, double dParam, ControlDoublePrivate* pControl)
override;

private:
// We create many hundreds of push buttons at Mixxx startup and most of them
Expand Down
6 changes: 6 additions & 0 deletions src/control/controleffectknob.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ void ControlEffectKnob::setBehaviour(EffectManifestParameter::ControlHint type,
if (type == EffectManifestParameter::ControlHint::KNOB_LINEAR) {
m_pControl->setBehavior(new ControlLinPotmeterBehavior(
dMinValue, dMaxValue, false));
} else if (type == EffectManifestParameter::ControlHint::KNOB_LINEAR_INVERSE) {
m_pControl->setBehavior(new ControlLinInvPotmeterBehavior(
dMinValue, dMaxValue, false));
} else if (type == EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC) {
if (dMinValue == 0) {
if (dMaxValue == 1.0) {
Expand All @@ -34,5 +37,8 @@ void ControlEffectKnob::setBehaviour(EffectManifestParameter::ControlHint type,
m_pControl->setBehavior(
new ControlLogPotmeterBehavior(dMinValue, dMaxValue, -40));
}
} else if (type == EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC_INVERSE) {
m_pControl->setBehavior(
new ControlLogInvPotmeterBehavior(dMinValue, dMaxValue, -40));
}
}
6 changes: 3 additions & 3 deletions src/control/controlobject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ ControlObject* ControlObject::getControl(const ConfigKey& key, bool warn) {

void ControlObject::setValueFromMidi(MidiOpCode o, double v) {
if (m_pControl) {
m_pControl->setMidiParameter(o, v);
m_pControl->setValueFromMidi(o, v);
}
}

Expand All @@ -102,8 +102,8 @@ double ControlObject::getParameterForValue(double value) const {
return m_pControl ? m_pControl->getParameterForValue(value) : 0.0;
}

double ControlObject::getParameterForMidiValue(double midiValue) const {
return m_pControl ? m_pControl->getParameterForMidiValue(midiValue) : 0.0;
double ControlObject::getParameterForMidi(double midiParameter) const {
return m_pControl ? m_pControl->getParameterForMidi(midiParameter) : 0.0;
}

void ControlObject::setParameter(double v) {
Expand Down
2 changes: 1 addition & 1 deletion src/control/controlobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ class ControlObject : public QObject {
virtual double getParameterForValue(double value) const;

// Returns the parameterized value of the object. Thread safe, non-blocking.
virtual double getParameterForMidiValue(double midiValue) const;
virtual double getParameterForMidi(double midiValue) const;

// Sets the control parameterized value to v. Thread safe, non-blocking.
virtual void setParameter(double v);
Expand Down
Loading