From f5688e9bad227aee418777b6b77ddcba7c7a5901 Mon Sep 17 00:00:00 2001 From: Lost Robot <34612565+LostRobotMusic@users.noreply.github.com> Date: Sun, 1 Mar 2026 09:04:51 -0600 Subject: [PATCH] Add Frequency Shifter effect (not a pitch shifter) (#8140) --- cmake/modules/PluginList.cmake | 1 + data/themes/classic/style.css | 11 + data/themes/default/style.css | 11 + plugins/FrequencyShifter/CMakeLists.txt | 3 + .../FrequencyShifterControlDialog.cpp | 259 ++++++++++++++++ .../FrequencyShifterControlDialog.h | 70 +++++ .../FrequencyShifterControls.cpp | 112 +++++++ .../FrequencyShifterControls.h | 86 ++++++ .../FrequencyShifterEffect.cpp | 278 ++++++++++++++++++ .../FrequencyShifter/FrequencyShifterEffect.h | 115 ++++++++ plugins/FrequencyShifter/HilbertTransform.h | 225 ++++++++++++++ plugins/FrequencyShifter/antireflect_off.png | Bin 0 -> 745 bytes plugins/FrequencyShifter/antireflect_on.png | Bin 0 -> 2622 bytes plugins/FrequencyShifter/artwork.png | Bin 0 -> 80170 bytes plugins/FrequencyShifter/help_off.png | Bin 0 -> 517 bytes plugins/FrequencyShifter/help_on.png | Bin 0 -> 532 bytes plugins/FrequencyShifter/mute_off.png | Bin 0 -> 569 bytes plugins/FrequencyShifter/mute_on.png | Bin 0 -> 2329 bytes plugins/FrequencyShifter/pass_off.png | Bin 0 -> 563 bytes plugins/FrequencyShifter/pass_on.png | Bin 0 -> 2293 bytes plugins/FrequencyShifter/reset_lfo_off.png | Bin 0 -> 1435 bytes plugins/FrequencyShifter/reset_lfo_on.png | Bin 0 -> 1450 bytes .../FrequencyShifter/reset_shifter_off.png | Bin 0 -> 1388 bytes plugins/FrequencyShifter/reset_shifter_on.png | Bin 0 -> 1452 bytes plugins/FrequencyShifter/send_off.png | Bin 0 -> 573 bytes plugins/FrequencyShifter/send_on.png | Bin 0 -> 2350 bytes 26 files changed, 1171 insertions(+) create mode 100755 plugins/FrequencyShifter/CMakeLists.txt create mode 100755 plugins/FrequencyShifter/FrequencyShifterControlDialog.cpp create mode 100755 plugins/FrequencyShifter/FrequencyShifterControlDialog.h create mode 100755 plugins/FrequencyShifter/FrequencyShifterControls.cpp create mode 100755 plugins/FrequencyShifter/FrequencyShifterControls.h create mode 100755 plugins/FrequencyShifter/FrequencyShifterEffect.cpp create mode 100755 plugins/FrequencyShifter/FrequencyShifterEffect.h create mode 100644 plugins/FrequencyShifter/HilbertTransform.h create mode 100644 plugins/FrequencyShifter/antireflect_off.png create mode 100644 plugins/FrequencyShifter/antireflect_on.png create mode 100644 plugins/FrequencyShifter/artwork.png create mode 100644 plugins/FrequencyShifter/help_off.png create mode 100644 plugins/FrequencyShifter/help_on.png create mode 100644 plugins/FrequencyShifter/mute_off.png create mode 100644 plugins/FrequencyShifter/mute_on.png create mode 100644 plugins/FrequencyShifter/pass_off.png create mode 100644 plugins/FrequencyShifter/pass_on.png create mode 100644 plugins/FrequencyShifter/reset_lfo_off.png create mode 100644 plugins/FrequencyShifter/reset_lfo_on.png create mode 100644 plugins/FrequencyShifter/reset_shifter_off.png create mode 100644 plugins/FrequencyShifter/reset_shifter_on.png create mode 100644 plugins/FrequencyShifter/send_off.png create mode 100644 plugins/FrequencyShifter/send_on.png diff --git a/cmake/modules/PluginList.cmake b/cmake/modules/PluginList.cmake index 7a6b266cf..8dc1f72f6 100644 --- a/cmake/modules/PluginList.cmake +++ b/cmake/modules/PluginList.cmake @@ -38,6 +38,7 @@ SET(LMMS_PLUGIN_LIST DynamicsProcessor Eq Flanger + FrequencyShifter GranularPitchShifter HydrogenImport LadspaBrowser diff --git a/data/themes/classic/style.css b/data/themes/classic/style.css index baaaab6ec..a8503970b 100644 --- a/data/themes/classic/style.css +++ b/data/themes/classic/style.css @@ -1105,6 +1105,17 @@ lmms--gui--CompressorControlDialog lmms--gui--Knob { qproperty-lineWidth: 2; } +lmms--gui--FrequencyShifterControlDialog lmms--gui--Knob { + color: #ffffff; + qproperty-outerColor: #ffffff; + qproperty-lineWidth: 3; +} +lmms--gui--FrequencyShifterControlDialog lmms--gui--Knob#fs_glide, +lmms--gui--FrequencyShifterControlDialog lmms--gui--Knob#fs_dglide, +lmms--gui--FrequencyShifterControlDialog lmms--gui--Knob#fs_phase { + qproperty-lineWidth: 2; +} + lmms--gui--VectorView { qproperty-colorTrace: rgba(255, 170, 33, 255); qproperty-colorGrid: rgba(76, 80, 84, 128); diff --git a/data/themes/default/style.css b/data/themes/default/style.css index 583ef8ec7..1a511a4dc 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -1165,6 +1165,17 @@ lmms--gui--CompressorControlDialog lmms--gui--Knob { qproperty-lineWidth: 2; } +lmms--gui--FrequencyShifterControlDialog lmms--gui--Knob { + color: #ffffff; + qproperty-outerColor: #ffffff; + qproperty-lineWidth: 3; +} +lmms--gui--FrequencyShifterControlDialog lmms--gui--Knob#fs_glide, +lmms--gui--FrequencyShifterControlDialog lmms--gui--Knob#fs_dglide, +lmms--gui--FrequencyShifterControlDialog lmms--gui--Knob#fs_phase { + qproperty-lineWidth: 2; +} + lmms--gui--VectorView { qproperty-colorTrace: rgba(60, 255, 130, 255); qproperty-colorGrid: rgba(76, 80, 84, 128); diff --git a/plugins/FrequencyShifter/CMakeLists.txt b/plugins/FrequencyShifter/CMakeLists.txt new file mode 100755 index 000000000..41fc694db --- /dev/null +++ b/plugins/FrequencyShifter/CMakeLists.txt @@ -0,0 +1,3 @@ +INCLUDE(BuildPlugin) + +BUILD_PLUGIN(frequencyshifter FrequencyShifterEffect.cpp FrequencyShifterControls.cpp FrequencyShifterControlDialog.cpp MOCFILES FrequencyShifterEffect.h FrequencyShifterControls.h FrequencyShifterControlDialog.h EMBEDDED_RESOURCES *.png) diff --git a/plugins/FrequencyShifter/FrequencyShifterControlDialog.cpp b/plugins/FrequencyShifter/FrequencyShifterControlDialog.cpp new file mode 100755 index 000000000..6c7edf2b6 --- /dev/null +++ b/plugins/FrequencyShifter/FrequencyShifterControlDialog.cpp @@ -0,0 +1,259 @@ +/* + * FrequencyShifterControlDialog.cpp + * + * Copyright (c) 2025 Lost Robot + * + * This file is part of LMMS - https://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#include "FrequencyShifterControlDialog.h" +#include "FrequencyShifterControls.h" + +#include + +#include "AutomatableButton.h" +#include "embed.h" +#include "GuiApplication.h" +#include "Knob.h" +#include "LcdFloatSpinBox.h" +#include "MainWindow.h" +#include "PixmapButton.h" + +namespace lmms::gui +{ + +static inline void setupKnobGeometry(Knob* k, int w, int h) +{ + k->setFixedSize(w, h); + + const int cx = w / 2; + const int cy = h / 2; + k->setCenterPointX(cx); + k->setCenterPointY(cy); + + int outer = std::max(1, cx - 3); + int inner = std::max(1, outer - ((w >= 40) ? 16 : (w >= 24) ? 10 : 6)); + + if (w <= 16) + { + outer = cx - 2; + inner = 2; + } + + k->setOuterRadius(outer); + k->setInnerRadius(inner); +} + +FrequencyShifterControlDialog::FrequencyShifterControlDialog(FrequencyShifterControls* c) : + EffectControlDialog(c) +{ + setAutoFillBackground(true); + QPalette pal; + pal.setBrush(backgroundRole(), PLUGIN_NAME::getIconPixmap("artwork")); + setPalette(pal); + setFixedSize(288, 360); + + auto mk = [this](int x, int y, + const QString& lbl, FloatModel* m, const QString& unit, + const char* objName, + QSize sz) + { + Knob* k = new Knob(KnobType::Styled, this); + k->setObjectName(objName); + k->move(x, y); + k->setModel(m); + k->setHintText(lbl, unit); + setupKnobGeometry(k, sz.width(), sz.height()); + return k; + }; + + const QSize K60(60, 60); + const QSize K36(36, 36); + const QSize K24(24, 24); + const QSize K19(19, 19); + + LcdFloatSpinBox* shiftSpin = new LcdFloatSpinBox(6, 3, "19red", tr("Frequency Shift"), this); + shiftSpin->move(100, 43); + shiftSpin->setModel(&c->m_freqShift); + shiftSpin->setSeamless(true, true); + + mk(18, 30, "Mix", &c->m_mix, "", "fs_mix", K60); + mk(235, 24, "Spread", &c->m_spreadShift,"Hz", "fs_spread", K24); + mk(235, 72, "Phase",&c->m_phase, "", "fs_phase", K24); + mk(24, 115, "Ring", &c->m_ring, "", "fs_ring", K36); + mk(72, 115, "Harmonics", &c->m_harmonics, "", "fs_harm", K36); + mk(120, 115, "Tone",&c->m_tone, "Hz", "fs_tone", K36); + mk(200, 147, "Glide", &c->m_glide, "", "fs_glide", K19); + + mk(18, 200, "LFO", &c->m_lfoAmount, "Hz", "fs_lfo", K36); + mk(66, 200, "LFO Rate", &c->m_lfoRate, "Hz", "fs_lforate", K36); + mk(114, 200, "LFO Stereo Phase", &c->m_lfoStereoPhase, "", "fs_lfost", K36); + + mk(18, 282, "Delay Length", &c->m_delayLengthLong, "ms", "fs_delay", K36); + mk(114, 282, "Feedback", &c->m_feedback, "", "fs_feedback", K36); + mk(24, 324, "Delay Length (fine)", &c->m_delayLengthShort, "ms", "fs_finedelay", K24); + mk(120, 324, "Delay Damping", &c->m_delayDamp, "Hz", "fs_damp", K24); + mk(245, 315, "Delay Glide", &c->m_delayGlide, "", "fs_dglide", K19); + + PixmapButton* antireflectButton = new PixmapButton(this, "Antireflect"); + antireflectButton->setActiveGraphic(PLUGIN_NAME::getIconPixmap("antireflect_on")); + antireflectButton->setInactiveGraphic(PLUGIN_NAME::getIconPixmap("antireflect_off")); + antireflectButton->setToolTip("Anti-reflect"); + antireflectButton->move(188, 122); + antireflectButton->setCheckable(true); + antireflectButton->setModel(&c->m_antireflect); + + PixmapButton* routeSend = new PixmapButton(this, tr("Send")); + routeSend->setActiveGraphic(PLUGIN_NAME::getIconPixmap("send_on")); + routeSend->setInactiveGraphic(PLUGIN_NAME::getIconPixmap("send_off")); + routeSend->setToolTip(tr("Route: Send")); + routeSend->setCheckable(true); + routeSend->move(188, 199); + + PixmapButton* routePass = new PixmapButton(this, tr("Pass")); + routePass->setActiveGraphic(PLUGIN_NAME::getIconPixmap("pass_on")); + routePass->setInactiveGraphic(PLUGIN_NAME::getIconPixmap("pass_off")); + routePass->setToolTip(tr("Route: Pass")); + routePass->setCheckable(true); + routePass->move(188, 217); + + PixmapButton* routeMute = new PixmapButton(this, tr("Mute")); + routeMute->setActiveGraphic(PLUGIN_NAME::getIconPixmap("mute_on")); + routeMute->setInactiveGraphic(PLUGIN_NAME::getIconPixmap("mute_off")); + routeMute->setToolTip(tr("Route: Mute")); + routeMute->setCheckable(true); + routeMute->move(188, 235); + + AutomatableButtonGroup* routeGroup = new AutomatableButtonGroup(this); + routeGroup->addButton(routeSend); + routeGroup->addButton(routePass); + routeGroup->addButton(routeMute); + routeGroup->setModel(&c->m_routeMode); + + PixmapButton* resetShifterBtn = new PixmapButton(this, tr("Reset Shifter")); + resetShifterBtn->setActiveGraphic(PLUGIN_NAME::getIconPixmap("reset_shifter_on")); + resetShifterBtn->setInactiveGraphic(PLUGIN_NAME::getIconPixmap("reset_shifter_off")); + resetShifterBtn->setToolTip(tr("Reset the shifter's oscillator phases to 0 (automatable)")); + resetShifterBtn->setCheckable(false); + resetShifterBtn->move(77, 5); + resetShifterBtn->setModel(&c->m_resetShifter); + + PixmapButton* resetLfoBtn = new PixmapButton(this, tr("Reset LFO")); + resetLfoBtn->setActiveGraphic(PLUGIN_NAME::getIconPixmap("reset_lfo_on")); + resetLfoBtn->setInactiveGraphic(PLUGIN_NAME::getIconPixmap("reset_lfo_off")); + resetLfoBtn->setToolTip(tr("Reset the LFO phase to 0 (automatable)")); + resetLfoBtn->setCheckable(false); + resetLfoBtn->move(60, 179); + resetLfoBtn->setModel(&c->m_resetLfo); + + PixmapButton* helpBtn = new PixmapButton(this, nullptr); + helpBtn->move(256, 278); + helpBtn->setActiveGraphic(PLUGIN_NAME::getIconPixmap("help_on")); + helpBtn->setInactiveGraphic(PLUGIN_NAME::getIconPixmap("help_off")); + helpBtn->setToolTip(tr("Open help window")); + connect(helpBtn, &PixmapButton::clicked, this, &FrequencyShifterControlDialog::showHelpWindow); +} + +void FrequencyShifterControlDialog::showHelpWindow() +{ + FrequencyShifterHelpView::getInstance()->close(); + FrequencyShifterHelpView::getInstance()->show(); +} + +QString FrequencyShifterHelpView::s_helpText = tr( +"
" +"Frequency Shifter

" +"Plugin by Lost Robot
" +"GUI by Haeleon
" +"
" +"

Overview:

" +"Frequency Shifter is not a pitch shifter.

" +"While "frequency" refers to Hz, "pitch" refers to octaves, semitones, cents, etc.
" +"So, pitch shifting impacts all partials in the audio multiplicatively, while frequency shifting impacts it additively.
" +"For example: If you have frequencies 100, 200, and 300 Hz, a pitch shift upward by 1.2x would result in 120, 240, and 360 Hz. " +"Meanwhile, a frequency shift upward by 20 Hz would result in 120, 220, and 320 Hz.
" +"Notice that a pitch shifter preserves the harmonic relationships between these frequencies, while frequency shifting destroys them entirely, " +"resulting in an inharmonic timbre.

" +"A frequency shifter can also be used as a "barberpole phaser". This is similar to other phasers, but unlike those, " +"it can audibly move upward or downward infinitely, similar to a Shepard tone.
" +"To achieve this, simply set the frequency shift amount to your desired phaser rate, and set the Mix to 50%. " +"The resulting phase cancellation will filter the audio.
" +"You may also achieve this by simply increasing the delay feedback, and keeping the delay length very low.

" +"This frequency shifter sports a unique "anti-reflect" algorithm which eliminates all frequencies aliasing through Nyquist and 0 Hz.

" +"This plugin may also be used as a ring modulator via the RING parameter. " +"Ring modulation is the result of frequency shifting the audio upward and downward by the same amount in parallel.
" +"

Shifter:

" +"Mix - Blends between the wet and dry signals.
" +"Frequency Shift - The amount of frequency shifting, in Hz.
" +"Spread - Offsets the frequency shift amount in opposite directions for the left and right channels.
" +"Even very small amounts will add a lot of stereo width to the signal.
" +"Phase - Gives you manual control over the phase of the frequency shifter's internal oscillators.
" +"When using the frequency shifter as a barberpole phaser, it is recommended to set the frequency shift amount to 0 and " +"automate this Phase parameter.
" +"Ring - Blends in ring modulation, instead of just frequency shifting.
" +"Harm - Distorts the frequency shifter's internal sine oscillators. This brings them much closer to a smoothed square shape.
" +"Tone - A basic 1-pole lowpass on the frequency shifter's output, helpful for taming harsh high frequencies.
" +"Glide - Lowpass filters any frequency shift and phase parameter movements, so they move slowly over time rather than snapping " +"to their target value instantly.
" +"Reset - Instantly resets the phases of the frequency shifter's internal oscillators. This is automatable.
" +"Anti-reflect - Magic.
" +"It removes all aliased frequencies through Nyquist and through 0 Hz. " +"This is done via clean and CPU-efficient math tricks, not oversampling.
" +"

LFO:

" +"This modulates the frequency shift amount. Audio-rate modulation is fully supported.

" +"Amount - The amplitude of the LFO.
" +"Rate - LFO rate, in Hz.
" +"Stereo Phase - Offsets the phase of the LFO's right channel, making things stereo.
" +"Reset - Instantly resets the phases of the LFO's oscillators. This is automatable.
" +"

Routing:

" +"Send - Sends the frequency shifter output into the delay.
" +"Pass - The audio input bypasses the frequency shifter, and is sent to both the delay and the output. " +"The frequency shifter is now located inside of the delay line. Use this if you want the frequency shifter to only impact the echoes.
" +"Mute - Like "Pass" routing, except the input signal isn't sent to the output, " +"so all you hear is the output from the delay line.
" +"

Delay:

" +"Length - Delay time in milliseconds.
" +"Fine - Identical to delay Length, but with a smaller knob range. " +"This is helpful when using the feedback to cause comb filtering, giving you access to a unique phaser/flanger hybrid.
" +"Feedback - Feeds the output of the delay back into the input of the frequency shifter.
" +"The delay's feedback path has very gentle saturation at high amplitudes, so the plugin can't break from high feedback values.
" +"Damping - A 1-pole lowpass filter in the feedback loop, so high frequencies fade out sooner than low frequencies.
" +"Glide - Lowpass filters any delay length changes, so they move slowly over time rather than snapping to their target value instantly.
" +"Help - Instantly spawns a kiwano in a randomized location on the planet. 30 second cooldown.
" +); + +FrequencyShifterHelpView::FrequencyShifterHelpView() : + QTextEdit(s_helpText) +{ +#if (QT_VERSION < QT_VERSION_CHECK(5,12,0)) + // Bug workaround: https://codereview.qt-project.org/c/qt/qtbase/+/225348 + using ::operator|; +#endif + setWindowTitle(tr("Frequency Shifter Help")); + setTextInteractionFlags(Qt::TextSelectableByKeyboard | Qt::TextSelectableByMouse); + getGUI()->mainWindow()->addWindowedWidget(this); + parentWidget()->setAttribute(Qt::WA_DeleteOnClose, false); + + // No maximize button + Qt::WindowFlags flags = parentWidget()->windowFlags(); + flags &= ~Qt::WindowMaximizeButtonHint; + parentWidget()->setWindowFlags(flags); +} + +} // namespace lmms::gui + diff --git a/plugins/FrequencyShifter/FrequencyShifterControlDialog.h b/plugins/FrequencyShifter/FrequencyShifterControlDialog.h new file mode 100755 index 000000000..09a177967 --- /dev/null +++ b/plugins/FrequencyShifter/FrequencyShifterControlDialog.h @@ -0,0 +1,70 @@ +/* + * FrequencyShifterControlDialog.h + * + * Copyright (c) 2025 Lost Robot + * + * This file is part of LMMS - https://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#ifndef LMMS_FREQUENCY_SHIFTER_CONTROL_DIALOG_H +#define LMMS_FREQUENCY_SHIFTER_CONTROL_DIALOG_H + +#include "EffectControlDialog.h" + +#include + +namespace lmms +{ + +class FrequencyShifterControls; + +namespace gui +{ + +class FrequencyShifterControlDialog : public EffectControlDialog +{ + Q_OBJECT +public: + FrequencyShifterControlDialog(FrequencyShifterControls* c); + ~FrequencyShifterControlDialog() override = default; + +public slots: + void showHelpWindow(); +}; + + +class FrequencyShifterHelpView : public QTextEdit +{ + Q_OBJECT +public: + static FrequencyShifterHelpView* getInstance() + { + static FrequencyShifterHelpView* instance = new FrequencyShifterHelpView; + return instance; + } + +private: + FrequencyShifterHelpView(); + static QString s_helpText; +}; + +} // namespace gui + +} // namespace lmms + +#endif // LMMS_FREQUENCY_SHIFTER_CONTROL_DIALOG_H diff --git a/plugins/FrequencyShifter/FrequencyShifterControls.cpp b/plugins/FrequencyShifter/FrequencyShifterControls.cpp new file mode 100755 index 000000000..e9988ae73 --- /dev/null +++ b/plugins/FrequencyShifter/FrequencyShifterControls.cpp @@ -0,0 +1,112 @@ +/* + * FrequencyShifterControls.cpp + * + * Copyright (c) 2025 Lost Robot + * + * This file is part of LMMS - https://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#include "FrequencyShifterEffect.h" +#include "FrequencyShifterControls.h" + +#include + +namespace lmms +{ + +FrequencyShifterControls::FrequencyShifterControls(FrequencyShifterEffect* e) : + EffectControls(e), + m_effect(e), + m_mix(1.f, 0.f, 1.f, 0.01f, this, "Mix"), + m_freqShift(0.f, -20000.f, 20000.f, 0.001f, this, "Frequency Shift"), + m_spreadShift(0.f, -50.f, 50.f, 0.01f, this, "Spread Shift"), + m_ring(0.f, 0.f, 1.f, 0.01f, this, "Ring"), + m_feedback(0.f, 0.f, 1.f, 0.001f, this, "Feedback"), + m_delayLengthLong(0.f, 0.f, 2000.f, 0.001f, this, "Delay Length"), + m_delayLengthShort(0.f, 0.f, 20.f, 0.001f, this, "Fine Delay Length"), + m_delayDamp(22000.f, 100.f, 22000.f, 0.1f, this, "Delay Damping"), + m_delayGlide(0.05f, 0.f, 1.f, 0.0001f, this, "Delay Glide"), + m_lfoAmount(0.f, 0.f, 2000.f, 0.001f, this, "LFO Amount"), + m_lfoRate(0.2f, 0.f, 200.f, 0.001f, this, "LFO Rate"), + m_lfoStereoPhase(0.f, 0.f, 1.f, 0.001f, this, "LFO StereoPhase"), + m_glide(0.05f, 0.f, 1.f, 0.0001f, this, "Glide"), + m_tone(22000.f, 100.f, 22000.f, 0.1f, this, "Tone"), + m_phase(0.f, -2.f, 2.f, 0.00001f, this, "Phase"), + m_antireflect(false, this, "Antireflect"), + m_routeMode(0, 0, 2, this, "Route Mode"), + m_harmonics(0.f, 0.f, 1.f, 0.0001f, this, "Harmonics"), + m_resetShifter(false, this, "Reset Shifter"), + m_resetLfo(false, this, "Reset LFO") +{ + m_spreadShift.setScaleLogarithmic(true); + m_delayLengthLong.setScaleLogarithmic(true); + m_delayLengthShort.setScaleLogarithmic(true); + m_delayDamp.setScaleLogarithmic(true); + m_delayGlide.setScaleLogarithmic(true); + m_lfoAmount.setScaleLogarithmic(true); + m_lfoRate.setScaleLogarithmic(true); + m_glide.setScaleLogarithmic(true); + m_tone.setScaleLogarithmic(true); +} + +void FrequencyShifterControls::loadSettings(const QDomElement& e) +{ + m_mix.loadSettings(e, "mix"); + m_freqShift.loadSettings(e, "freqShift"); + m_spreadShift.loadSettings(e, "spreadShift"); + m_ring.loadSettings(e, "ring"); + m_feedback.loadSettings(e, "feedback"); + m_delayLengthLong.loadSettings(e, "m_delayLengthLong"); + m_delayLengthShort.loadSettings(e, "delayLengthShort"); + m_delayDamp.loadSettings(e, "delayDamp"); + m_delayGlide.loadSettings(e, "delayGlide"); + m_lfoAmount.loadSettings(e, "lfoAmount"); + m_lfoRate.loadSettings(e, "lfoRate"); + m_lfoStereoPhase.loadSettings(e, "lfoStereoPhase"); + m_antireflect.loadSettings(e, "antireflect"); + m_routeMode.loadSettings(e, "routeMode"); + m_harmonics.loadSettings(e, "harmonics"); + m_glide.loadSettings(e, "glide"); + m_tone.loadSettings(e, "tone"); + m_phase.loadSettings(e, "phase"); +} + +void FrequencyShifterControls::saveSettings(QDomDocument& doc, QDomElement& e) +{ + m_mix.saveSettings(doc, e, "mix"); + m_freqShift.saveSettings(doc, e, "freqShift"); + m_spreadShift.saveSettings(doc, e, "spreadShift"); + m_ring.saveSettings(doc, e, "ring"); + m_feedback.saveSettings(doc, e, "feedback"); + m_delayLengthLong.saveSettings(doc, e, "m_delayLengthLong"); + m_delayLengthShort.saveSettings(doc, e, "delayLengthShort"); + m_delayDamp.saveSettings(doc, e, "delayDamp"); + m_delayGlide.saveSettings(doc, e, "delayGlide"); + m_lfoAmount.saveSettings(doc, e, "lfoAmount"); + m_lfoRate.saveSettings(doc, e, "lfoRate"); + m_lfoStereoPhase.saveSettings(doc, e, "lfoStereoPhase"); + m_antireflect.saveSettings(doc, e, "antireflect"); + m_routeMode.saveSettings(doc, e, "routeMode"); + m_harmonics.saveSettings(doc, e, "harmonics"); + m_glide.saveSettings(doc, e, "glide"); + m_tone.saveSettings(doc, e, "tone"); + m_phase.saveSettings(doc, e, "phase"); +} + +} // namespace lmms + diff --git a/plugins/FrequencyShifter/FrequencyShifterControls.h b/plugins/FrequencyShifter/FrequencyShifterControls.h new file mode 100755 index 000000000..bcdb86f36 --- /dev/null +++ b/plugins/FrequencyShifter/FrequencyShifterControls.h @@ -0,0 +1,86 @@ +/* + * FrequencyShifterControls.h + * + * Copyright (c) 2025 Lost Robot + * + * This file is part of LMMS - https://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#ifndef LMMS_FREQUENCY_SHIFTER_CONTROLS_H +#define LMMS_FREQUENCY_SHIFTER_CONTROLS_H + +#include "EffectControls.h" +#include "FrequencyShifterControlDialog.h" + +namespace lmms +{ + +class FrequencyShifterEffect; + +class FrequencyShifterControls : public EffectControls +{ + Q_OBJECT +public: + FrequencyShifterControls(FrequencyShifterEffect* e); + ~FrequencyShifterControls() override = default; + + void saveSettings(QDomDocument& doc, QDomElement& e) override; + void loadSettings(const QDomElement& e) override; + QString nodeName() const override + { + return "FrequencyShifterControls"; + } + gui::EffectControlDialog* createView() override + { + return new gui::FrequencyShifterControlDialog(this); + } + int controlCount() override + { + return 20; + } + + FrequencyShifterEffect* m_effect; + FloatModel m_mix; + FloatModel m_freqShift; + FloatModel m_spreadShift; + FloatModel m_ring; + FloatModel m_feedback; + FloatModel m_delayLengthLong; + FloatModel m_delayLengthShort; + FloatModel m_delayDamp; + FloatModel m_delayGlide; + FloatModel m_lfoAmount; + FloatModel m_lfoRate; + FloatModel m_lfoStereoPhase; + FloatModel m_glide; + FloatModel m_tone; + + FloatModel m_phase; + + BoolModel m_antireflect; + IntModel m_routeMode; + + FloatModel m_harmonics; + + BoolModel m_resetShifter; + BoolModel m_resetLfo; +}; + +} // namespace lmms + +#endif // LMMS_FREQUENCY_SHIFTER_CONTROLS_H diff --git a/plugins/FrequencyShifter/FrequencyShifterEffect.cpp b/plugins/FrequencyShifter/FrequencyShifterEffect.cpp new file mode 100755 index 000000000..5ae17c77a --- /dev/null +++ b/plugins/FrequencyShifter/FrequencyShifterEffect.cpp @@ -0,0 +1,278 @@ +/* + * FrequencyShifter.cpp + * + * Copyright (c) 2025 Lost Robot + * + * This file is part of LMMS - https://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#include "FrequencyShifterEffect.h" + +#include "embed.h" +#include "plugin_export.h" + +#include +#include +#include + +namespace lmms +{ + +extern "C" +{ +Plugin::Descriptor PLUGIN_EXPORT frequencyshifter_plugin_descriptor = +{ + LMMS_STRINGIFY(PLUGIN_NAME), + "Frequency Shifter", + QT_TRANSLATE_NOOP("PluginBrowser", "A frequency shifter (not a pitch shifter) and barberpole phaser plugin"), + "Lost Robot ", + 0x0100, + Plugin::Type::Effect, + new PixmapLoader("lmms-plugin-logo"), + nullptr, + nullptr, +}; +PLUGIN_EXPORT Plugin* lmms_plugin_main(Model* parent, void* data) +{ + return new FrequencyShifterEffect(parent, static_cast(data)); +} +}// extern "C" + +FrequencyShifterEffect::FrequencyShifterEffect(Model* parent, const Descriptor::SubPluginFeatures::Key* key) : + Effect(&frequencyshifter_plugin_descriptor, parent, key), + m_controls(this) +{ + connect(Engine::audioEngine(), &AudioEngine::sampleRateChanged, + this, &FrequencyShifterEffect::updateSampleRate); + updateSampleRate(); +} + +Effect::ProcessStatus FrequencyShifterEffect::processImpl(SampleFrame* buf, const fpp_t frames) +{ + constexpr float twoPi = std::numbers::pi_v * 2.0f; + + const float mix = m_controls.m_mix.value() * wetLevel(); + const float fs = m_controls.m_freqShift.value(); + const float spread = m_controls.m_spreadShift.value(); + const float ring = m_controls.m_ring.value(); + const float feedback = m_controls.m_feedback.value(); + const float delayLen = (m_controls.m_delayLengthLong.value() + m_controls.m_delayLengthShort.value()) * 0.001f * m_sampleRate; + const float delayDamp = m_controls.m_delayDamp.value(); + const float delayGlide = m_controls.m_delayGlide.value(); + const float lfoAmt = m_controls.m_lfoAmount.value(); + const float lfoRate = (m_controls.m_lfoRate.value() / m_sampleRate) * twoPi; + const float lfoSt = m_controls.m_lfoStereoPhase.value() * twoPi; + const bool antireflect = m_controls.m_antireflect.value(); + const int routeMode = m_controls.m_routeMode.value(); + const float harmonics = m_controls.m_harmonics.value(); + const float glide = m_controls.m_glide.value(); + const float tone = m_controls.m_tone.value(); + const float phase = m_controls.m_phase.value() * twoPi; + + const bool resetShifterBtn = m_controls.m_resetShifter.value(); + const bool resetLfoBtn = m_controls.m_resetLfo.value(); + + if (!m_prevResetShifter && resetShifterBtn) + { + m_phase[0] = 0.f; + m_phase[1] = 0.f; + } + if (!m_prevResetLfo && resetLfoBtn) { m_lfoPhase = 0.f; } + m_prevResetShifter = resetShifterBtn; + m_prevResetLfo = resetLfoBtn; + + const float invRing = 1.f - ring; + const bool parallelFB = (routeMode >= 1); + const bool routeAdd = (routeMode == 1); + + const bool doHarm = (harmonics > 0.f); + const float harmFactor = harmonics * 20.f + 1.f; + const float harmDiv = 1.f / (harmonics * 0.3f + 1.f); + + const float dampCoeff = std::exp(-m_twoPiOverSr * delayDamp); + const float toneCoeff = std::exp(-m_twoPiOverSr * tone); + const float delayGlideCoeff = delayGlide ? std::exp(-1.f / (delayGlide * m_sampleRate)) : 0.f; + const float glideCoeff = glide ? std::exp(-1.f / (glide * m_sampleRate)) : 0.f; + + // we only bother with wrapping phases once per buffer + m_lfoPhase = std::fmod(m_lfoPhase, twoPi); + for (int ch = 0; ch < 2; ++ch) + { + m_phase[ch] = std::fmod(m_phase[ch], twoPi); + } + + for (size_t i = 0; i < frames; ++i) + { + float lfo0; + float lfo1; + if (lfoAmt > 0.f) + { + lfo0 = std::sin(m_lfoPhase) * lfoAmt; + lfo1 = std::sin(m_lfoPhase + lfoSt) * lfoAmt; + } + else + { + lfo0 = 0.f; + lfo1 = 0.f; + } + m_lfoPhase += lfoRate; + + // parameter interpolation (glide) + const float base0 = fs - spread; + const float base1 = fs + spread; + m_trueShift[0] = (1.f - glideCoeff) * base0 + glideCoeff * m_trueShift[0]; + m_trueShift[1] = (1.f - glideCoeff) * base1 + glideCoeff * m_trueShift[1]; + m_trueDelay = std::max((1.f - delayGlideCoeff) * delayLen + delayGlideCoeff * m_trueDelay, 1.f); + m_truePhase = (1.f - glideCoeff) * phase + glideCoeff * m_truePhase; + + // delay line with 4-point hermite interpolation + float readIndex = static_cast(m_writeIndex) - m_trueDelay; + if (readIndex < 0.f) { readIndex += static_cast(m_ringBufSize); } + const int indexFloor = static_cast(readIndex); + const float frac = readIndex - static_cast(indexFloor); + const std::array dly = getHermiteSample(indexFloor, frac); + if (++m_writeIndex == m_ringBufSize) { m_writeIndex = 0; } + + // routing stuff + const float inL = buf[i][0]; + const float inR = buf[i][1]; + const float fxInL = parallelFB ? (dly[0] * feedback) : (inL + dly[0] * feedback); + const float fxInR = parallelFB ? (dly[1] * feedback) : (inR + dly[1] * feedback); + + // delta phase + const float dPh0 = (m_trueShift[0] + lfo0) * m_twoPiOverSr; + const float dPh1 = (m_trueShift[1] + lfo1) * m_twoPiOverSr; + + float outL; + float outR; + + { + float fxIn[2] = {fxInL, fxInR}; + float dPh[2] = {dPh0, dPh1}; + float out[2]; + + for (int ch = 0; ch < 2; ++ch) + { + const float phaseValue = m_phase[ch] + m_truePhase; + + float sinP = std::sin(phaseValue); + float cosP = std::cos(phaseValue); + + if (doHarm) + { + // arbitrary distortion function, crossfaded with original signal + const float xc = std::clamp(harmFactor * cosP, -3.f, 3.f); + const float xs = std::clamp(harmFactor * sinP, -3.f, 3.f); + const float xc2 = xc * xc; + const float xs2 = xs * xs; + const float tc = xc * (27.f + xc2) / (27.f + 9.f * xc2); + const float ts = xs * (27.f + xs2) / (27.f + 9.f * xs2); + cosP = std::lerp(cosP, tc * harmDiv, harmonics); + sinP = std::lerp(sinP, ts * harmDiv, harmonics); + } + + float analytic1[2]; + m_hilbert1.processReal(fxIn[ch], ch, analytic1); + + // ring modulation frequency shifts both downward and upward simultaneously + // oscI alongside the hilbert-transformed signal cancels out one of those two sidebands + // so fading it out will bring us closer to ring modulation + const float oscR = cosP; + const float oscI = sinP * invRing; + + const float modR = analytic1[0] * oscR - analytic1[1] * oscI; + const float modI = analytic1[0] * oscI + analytic1[1] * oscR; + + float shiftedR; + + if (antireflect) + { + // use a second hilbert transform on the complex signal + // in order to remove negative frequencies to + // prevent aliasing through 0 Hz and Nyquist + float mod[2] = {modR, modI}; + float analytic2[2]; + m_hilbert2.processComplex(mod, ch, analytic2); + shiftedR = analytic2[0] * 0.5f; + } + else + { + shiftedR = modR; + } + + m_phase[ch] += dPh[ch]; + out[ch] = shiftedR; + } + + outL = out[0]; + outR = out[1]; + } + + float delayInL = outL + (parallelFB ? inL : 0.f); + float delayInR = outR + (parallelFB ? inR : 0.f); + + // saturate feedback loop to ensure it doesn't explode + constexpr float FbSaturation = 16.f; + delayInL = (FbSaturation * delayInL) / (FbSaturation + std::fabs(delayInL)); + delayInR = (FbSaturation * delayInR) / (FbSaturation + std::fabs(delayInR)); + + // 1-pole lowpass in feedback loop + m_dampState[0] = (1.f - dampCoeff) * delayInL + dampCoeff * m_dampState[0]; + m_dampState[1] = (1.f - dampCoeff) * delayInR + dampCoeff * m_dampState[1]; + m_ringBuf[m_writeIndex][0] = m_dampState[0]; + m_ringBuf[m_writeIndex][1] = m_dampState[1]; + + // 1-pole lowpass on entire signal + m_toneState[0] = (1.f - toneCoeff) * outL + toneCoeff * m_toneState[0]; + m_toneState[1] = (1.f - toneCoeff) * outR + toneCoeff * m_toneState[1]; + outL = m_toneState[0]; + outR = m_toneState[1]; + + if (routeAdd) + { + buf[i][0] = inL + mix * outL; + buf[i][1] = inR + mix * outR; + } + else + { + const float dry = 1.f - mix; + buf[i][0] = dry * inL + mix * outL; + buf[i][1] = dry * inR + mix * outR; + } + } + + return ProcessStatus::ContinueIfNotQuiet; +} + +void FrequencyShifterEffect::updateSampleRate() +{ + m_sampleRate = Engine::audioEngine()->outputSampleRate(); + + constexpr float twoPi = std::numbers::pi_v * 2.0f; + m_twoPiOverSr = twoPi / m_sampleRate; + + m_hilbert1 = HilbertIIRFloat<2>(m_sampleRate, 2.0f); + m_hilbert2 = HilbertIIRFloat<2>(m_sampleRate, 2.0f); + + // +6 provides space for interpolation + m_ringBufSize = (m_controls.m_delayLengthLong.maxValue() + m_controls.m_delayLengthShort.maxValue()) * 0.001f * m_sampleRate + 6.f; + m_ringBuf.resize(m_ringBufSize); +} + +} // namespace lmms + diff --git a/plugins/FrequencyShifter/FrequencyShifterEffect.h b/plugins/FrequencyShifter/FrequencyShifterEffect.h new file mode 100755 index 000000000..e28f7c31a --- /dev/null +++ b/plugins/FrequencyShifter/FrequencyShifterEffect.h @@ -0,0 +1,115 @@ +/* + * FrequencyShifter.h + * + * Copyright (c) 2025 Lost Robot + * + * This file is part of LMMS - https://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#ifndef LMMS_FREQUENCY_SHIFTER_EFFECT_H +#define LMMS_FREQUENCY_SHIFTER_EFFECT_H + +#include "Effect.h" +#include "FrequencyShifterControls.h" + +#include "HilbertTransform.h" +#include "interpolation.h" +#include "lmms_math.h" + +#include +#include +#include +#include + +namespace lmms +{ + +class FrequencyShifterEffect : public Effect +{ + Q_OBJECT +public: + FrequencyShifterEffect(Model* parent, const Descriptor::SubPluginFeatures::Key* key); + ~FrequencyShifterEffect() override = default; + + ProcessStatus processImpl(SampleFrame* buf, const fpp_t frames) override; + EffectControls* controls() override + { + return &m_controls; + } + +private slots: + void updateSampleRate(); + +private: + std::array getHermiteSample(int indexFloor, float fraction) + { + const int size = m_ringBufSize; + + const int i0 = (indexFloor == 0) ? (size - 1) : (indexFloor - 1); + const int i1 = indexFloor; + + int i2 = indexFloor + 1; + int i3 = indexFloor + 2; + if (i2 >= size) i2 -= size; + if (i3 >= size) i3 -= size; + + std::array out; + + for (int ch = 0; ch < 2; ++ch) + { + const float v0 = m_ringBuf[i0][ch]; + const float v1 = m_ringBuf[i1][ch]; + const float v2 = m_ringBuf[i2][ch]; + const float v3 = m_ringBuf[i3][ch]; + + out[ch] = hermiteInterpolate(v0, v1, v2, v3, fraction); + } + + return out; + } + + HilbertIIRFloat<2> m_hilbert1; + HilbertIIRFloat<2> m_hilbert2; + + std::vector> m_ringBuf; + + std::array m_phase{}; + std::array m_trueShift{}; + std::array m_dampState{}; + std::array m_toneState{}; + + float m_lfoPhase{}; + float m_truePhase{}; + float m_trueDelay{1.f}; + + float m_twoPiOverSr{}; + float m_sampleRate{}; + + int m_ringBufSize{}; + int m_writeIndex{}; + + bool m_prevResetShifter{}; + bool m_prevResetLfo{}; + + FrequencyShifterControls m_controls; +}; + +} // namespace lmms + +#endif // LMMS_FREQUENCY_SHIFTER_EFFECT_H + diff --git a/plugins/FrequencyShifter/HilbertTransform.h b/plugins/FrequencyShifter/HilbertTransform.h new file mode 100644 index 000000000..812128d0e --- /dev/null +++ b/plugins/FrequencyShifter/HilbertTransform.h @@ -0,0 +1,225 @@ +/* + * HilbertTransform.h + * + * Copyright (c) 2025 Lost Robot + * + * This file is part of LMMS - https://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + * ------------------------------------------------------------------------- + * Full credit for the Hilbert IIR coefficients and general usage goes to: + * + * Copyright (c) 2024 Geraint Luff / Signalsmith Audio Ltd. + * Released under the 0BSD (Zero-Clause BSD) License. + * + * https://github.com/Signalsmith-Audio/hilbert-iir/blob/main/hilbert.h + * ------------------------------------------------------------------------- + */ + +#ifndef LMMS_HILBERT_TRANSFORM_H +#define LMMS_HILBERT_TRANSFORM_H +#include + +#ifdef __SSE2__ + #include +#endif + +namespace lmms +{ + +template +struct HilbertIIRFloat +{ + static constexpr int order = 12; + + alignas(16) static constexpr float baseCoeffsR[order] = { + -0.000224352093802f, 0.0107500557815f, -0.0456795873917f, + 0.11282500582f, -0.208067578452f, 0.28717837501f, + -0.254675294431f, 0.0481081835026f, 0.227861357867f, + -0.365411839137f, 0.280729061131f, -0.0935061787728f + }; + alignas(16) static constexpr float baseCoeffsI[order] = { + 0.00543499018201f, -0.0173890685681f, 0.0229166931429f, + 0.00278413661237f, -0.104628958675f, 0.33619239719f, + -0.683033899655f, 0.954061589374f, -0.891273574569f, + 0.525088317271f, -0.155131206606f, 0.00512245855404f + }; + alignas(16) static constexpr float basePolesR[order] = { + -0.00495335976478f, -0.017859491302f, -0.0413714373155f, + -0.0882148408885f, -0.17922965812f, -0.338261800753f, + -0.557688699732f, -0.735157736148f, -0.719057381172f, + -0.517871025209f, -0.280197469471f, -0.0852751354531f + }; + alignas(16) static constexpr float basePolesI[order] = { + 0.0092579876872f, 0.0273493725543f, 0.0744756910287f, + 0.178349677457f, 0.39601340223f, 0.829229533354f, + 1.61298538328f, 2.79987398682f, 4.16396166128f, + 5.29724826804f, 5.99598602388f, 6.3048492377f + }; + static constexpr float baseDirect = 0.000262057212648f; + + alignas(16) float coeffsR[order]; + alignas(16) float coeffsI[order]; + alignas(16) float polesR[order]; + alignas(16) float polesI[order]; + alignas(16) float stateR[Channels][order]; + alignas(16) float stateI[Channels][order]; + float direct; + + HilbertIIRFloat(float sampleRate = 48000.0f, float passbandGain = 2.0f) + { + const float freqFactor = std::fmin(0.46f, 20000.0f / sampleRate); + const float coeffScale = freqFactor * passbandGain; + direct = baseDirect * 2.0f * passbandGain * freqFactor; + for (int i = 0; i < order; ++i) + { + coeffsR[i] = baseCoeffsR[i] * coeffScale; + coeffsI[i] = baseCoeffsI[i] * coeffScale; + const float a = basePolesR[i] * freqFactor; + const float b = basePolesI[i] * freqFactor; + const float ea = std::exp(a); + polesR[i] = ea * std::cos(b); + polesI[i] = ea * std::sin(b); + } + reset(); + } + + inline void reset() + { + for (int ch = 0; ch < Channels; ++ch) + { + for (int i = 0; i < order; ++i) + { + stateR[ch][i] = stateI[ch][i] = 0.0f; + } + } + } + + inline void processReal(float x, int channel, float *out) + { + float *sR = stateR[channel], *sI = stateI[channel]; +#ifdef __SSE2__ + const __m128 vx = _mm_set1_ps(x); + __m128 sumR = _mm_setzero_ps(), sumI = _mm_setzero_ps(); + for (int i = 0; i < order; i += 4) + { + __m128 vr = _mm_load_ps(&sR[i]); + __m128 vi = _mm_load_ps(&sI[i]); + __m128 vpr = _mm_load_ps(&polesR[i]); + __m128 vpi = _mm_load_ps(&polesI[i]); + __m128 vcr = _mm_load_ps(&coeffsR[i]); + __m128 vci = _mm_load_ps(&coeffsI[i]); + + __m128 rpr = _mm_mul_ps(vr, vpr); + __m128 impi = _mm_mul_ps(vi, vpi); + __m128 xcr = _mm_mul_ps(vx, vcr); + __m128 nr = _mm_add_ps(_mm_sub_ps(rpr, impi), xcr); + + __m128 rpi = _mm_mul_ps(vr, vpi); + __m128 impr = _mm_mul_ps(vi, vpr); + __m128 xci = _mm_mul_ps(vx, vci); + __m128 ni = _mm_add_ps(_mm_add_ps(rpi, impr), xci); + + _mm_store_ps(&sR[i], nr); + _mm_store_ps(&sI[i], ni); + + sumR = _mm_add_ps(sumR, nr); + sumI = _mm_add_ps(sumI, ni); + } + float tmpR[4], tmpI[4]; + _mm_storeu_ps(tmpR, sumR); + _mm_storeu_ps(tmpI, sumI); + out[0] = x * direct + (tmpR[0] + tmpR[1] + tmpR[2] + tmpR[3]); + out[1] = (tmpI[0] + tmpI[1] + tmpI[2] + tmpI[3]); +#else + float sumR = 0.0f, sumI = 0.0f; + for (int i = 0; i < order; ++i) + { + const float r = sR[i], im = sI[i], pr = polesR[i], pi = polesI[i]; + const float nr = r * pr - im * pi + x * coeffsR[i]; + const float ni = r * pi + im * pr + x * coeffsI[i]; + sR[i] = nr; sI[i] = ni; + sumR += nr; sumI += ni; + } + out[0] = x * direct + sumR; + out[1] = sumI; +#endif + } + + inline void processComplex(const float *x, int channel, float *out) + { + const float xr = x[0], xi = x[1]; + float *sR = stateR[channel], *sI = stateI[channel]; +#ifdef __SSE2__ + const __m128 vxr = _mm_set1_ps(xr), vxi = _mm_set1_ps(xi); + __m128 sumR = _mm_setzero_ps(), sumI = _mm_setzero_ps(); + for (int i = 0; i < order; i += 4) + { + __m128 vr = _mm_load_ps(&sR[i]); + __m128 vi = _mm_load_ps(&sI[i]); + __m128 vpr = _mm_load_ps(&polesR[i]); + __m128 vpi = _mm_load_ps(&polesI[i]); + __m128 vcr = _mm_load_ps(&coeffsR[i]); + __m128 vci = _mm_load_ps(&coeffsI[i]); + + __m128 xrcr = _mm_mul_ps(vxr, vcr); + __m128 xici = _mm_mul_ps(vxi, vci); + __m128 xrci = _mm_mul_ps(vxr, vci); + __m128 xicr = _mm_mul_ps(vxi, vcr); + + __m128 rpr = _mm_mul_ps(vr, vpr); + __m128 impi = _mm_mul_ps(vi, vpi); + __m128 rpi = _mm_mul_ps(vr, vpi); + __m128 impr = _mm_mul_ps(vi, vpr); + + __m128 nr = _mm_add_ps(_mm_sub_ps(rpr, impi), _mm_sub_ps(xrcr, xici)); + __m128 ni = _mm_add_ps(_mm_add_ps(rpi, impr), _mm_add_ps(xrci, xicr)); + + _mm_store_ps(&sR[i], nr); + _mm_store_ps(&sI[i], ni); + + sumR = _mm_add_ps(sumR, nr); + sumI = _mm_add_ps(sumI, ni); + } + float tmpR[4], tmpI[4]; + _mm_storeu_ps(tmpR, sumR); + _mm_storeu_ps(tmpI, sumI); + const float sr = tmpR[0] + tmpR[1] + tmpR[2] + tmpR[3]; + const float si = tmpI[0] + tmpI[1] + tmpI[2] + tmpI[3]; + out[0] = xr * direct + sr; + out[1] = xi * direct + si; +#else + float sumR = 0.0f, sumI = 0.0f; + for (int i = 0; i < order; ++i) + { + const float r = sR[i], im = sI[i]; + const float pr = polesR[i], pi = polesI[i], cr = coeffsR[i], ci = coeffsI[i]; + const float xrcr = xr * cr, xici = xi * ci, xrci = xr * ci, xicr = xi * cr; + const float nr = r * pr - im * pi + (xrcr - xici); + const float ni = r * pi + im * pr + (xrci + xicr); + sR[i] = nr; sI[i] = ni; + sumR += nr; sumI += ni; + } + out[0] = xr * direct + sumR; + out[1] = xi * direct + sumI; +#endif + } +}; + +} // namespace lmms + +#endif // LMMS_HILBERT_TRANSFORM_H diff --git a/plugins/FrequencyShifter/antireflect_off.png b/plugins/FrequencyShifter/antireflect_off.png new file mode 100644 index 0000000000000000000000000000000000000000..1afa8f28952148877d208cfe1b1adc883a1c6a5e GIT binary patch literal 745 zcmVHBl~-VR{)hMtp!lcST%L*B{4$q$R*rKG`@QC>vaxa5JBQF`Cp$4@8E z_COXq^YNj()o3&>&1SPuo3&c)((QIHolYkhbFEY=_srw?)l$GEYUAe$6;a~$`@QXUJ1Y{d;sTqe z)5(g$4dU#(-2jV`>2zwN(J0tSzhc;Jc3O@gc)eZ+&!B@e?$Irm%di@@+ik2rZ4P7r zY_S&mnu8>KGFBJ3_6&$ytyb^iS8Vw8;{)w>JFtTeyTpYp#^~fLiklTjwNWKF!f3Qz z(IYq@Ac$fNc%DEJ5k-)G1xA5hf#VnS`~Bbw@eqT32!<%xRnk$AJYXFnBK_DQ2A%w2 zhkUWAxm?8g!Nr|(=;ef~Dno>mU|ax@ql)&=Bvp>qV2?5LY=V4XThDMs7X_O{eEwRs zpmbV`_%<~chpVlMVI`(2B0=VTBJv*gRE_NVEfIHC4F-eoo_La4Jq}c`zt)dE@40xD zIJKaENHQkjq!P{ol21#(Y&NsJpv992%KP?BBo2cRHNNo{it z#Ln6{;$$}uAnuowr>H_z6?Le-*P;3mV3UT!VOZsKziB^^l7Yx$Lt(eC1lz5Si^KzfXI^J;gfkWVVF7Q^DAq{04gIsW0M bC$fG6=%JCZtLY9H00000NkvXXu0mjf^w3(U literal 0 HcmV?d00001 diff --git a/plugins/FrequencyShifter/antireflect_on.png b/plugins/FrequencyShifter/antireflect_on.png new file mode 100644 index 0000000000000000000000000000000000000000..7d40cf69bd335f6d393e6c2926af3132e51f540d GIT binary patch literal 2622 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 literal 0 HcmV?d00001 diff --git a/plugins/FrequencyShifter/pass_off.png b/plugins/FrequencyShifter/pass_off.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c0c446b71dc31afc84cd99226436acef013976 GIT binary patch literal 563 zcmV-30?hr1P)0EO&wh-_uwybBOeT}bz?e)XlV$lQ`VaOm_%mn}5{X12kw|DDQSP4iu7?HI{g`#; z0uJxY>;3XF+=p}S1)@(`Y?pmvtKPrbWxrBQ`Knu+?f+ zz+Ntwy7W9x0}}xtK%zg(GCdEaNi_lz3l|~!&;|sk97TYEHo!<3hT#`T0uB)>^GvG| zkVsDv7VS7rv3QKtK}+-jqC_YnR#F=gjCs4=t{5|&+K{mqSB@NI+xEBP3{CN=Ug_h5 zNKL2HN*{w&3|lccea-qc7K?@AZNTIUxq74)3y~-XOIZ?)vLBWu`)PR(H6f(-nf*d7 zkfir!v(d2N@_xsWrqf;yBH0&F$14=t00{fOPp0LP!4&w5k-9Mbuti)OM_)bF4cWz) zjdg+9>;JN)av<|h@m_qOD^%T<-fY`^y0EeY-aD9j_LAvbdyoJC002ovPDHLkV1oSb B^8x?> literal 0 HcmV?d00001 diff --git a/plugins/FrequencyShifter/pass_on.png b/plugins/FrequencyShifter/pass_on.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9fcb2d8359bc1b6275f6104306e1c07a76a4ae GIT binary patch literal 2293 zcmV}p`d6M zev*X?KS5lmv@IwSzYSuHn#81SV>+G0?l#@;#dnYAvu?d-i{9@0Zr!ST>sI~he@>k$ zg!P-il;wBgIjhaCCpHD+k!CicA?*gzS zup`6&O-OAStq>y)X?~ z{rXg{xBmT&#`}PJi?CFdp&&AB(mYQIHZZ*k%F3aFrtPkR0(Mb*?mzs_aiO$&oEx~Y zfLE%|Oc706NkG`ID=mTLq30!SzmSo9sVbr7V^(KfXMoLW1t`p3dSv8`64YHIs6Bvo z8eNU9xe|z)IX~I1+EL<)bcEy}`LE4+j-B({rslGq7_oY^BmI{2x%!nkm!QybIV8QJ z-|00;o^+6v*D!Uu$!e*C?l5z|fq^ZQw>o8IU2tgaQXRCt#v(QgCTziBZH^I z<6B?vu!;Rgzl0C=jl=Wr?+9h;KxC(fF?%Rw&kp~W{auX`N~M*`s}-hT9F69y8>m!~ z{+6U2X1fMlRS?50GNR)Fag!B8h%fa zFZdW(15JxU9^;z{AJBr9(4cM4ET$K@57#hA42og zNf;jZD~xTr4UQh4qN!v1VC#k3;JcZ9@Z8%E!SdcdRYGrChX4NCS#a@LTj0s@`{Bsk z6b%oI;Ia8>knf0+EC2-e+yW7_C8Bo*5xyVEAX*5}^iS%&{c?LEW0xLmqjD^DSbVb))A(sCV^>|KQruvtj4NgIehn zg9=}JVs4tj?T4X(RmcEosDC9)eEt&5%pVbdC5Ek&+))1r9-TYP3jJ8X;q>fx3edlo z!x!r6K)%N!@Y&meLrhrwj154{=1`WY$JLO{CL87Cv6lq{I#L3(kt|$D0m&V-_&oK0ls&2F zmQ!sEpA$L0_JNjzY*tOkt0S~%R2n1sGK34&f{tqc@!HnqLIoYC!=?&NfA$&Se!96H<;jEtO-? zb`Gh0S*g}9AWtx})37jZ1*g+KJJ|}0kfv?kOC7O*%7MCqiO?uQb@`43@V4q{F(?DM zs2WT@f<6Hqr+2mya1nvzNY=bjT-ymhMa^UY=b_hP2dO#h{Do)y$0qK9CN*u{4OJ0S0+Jhg5p?IkT|ud+96IFk2=_gXE!-`c zt&a1#5xNeK+ic|#vv$npnA5g&jF}x%R-(V>dX0sk4?uW$54l5`Va^Og-w`rTxbj4&Q3(d9FX9>yuf2F%bHse-#U0ub}(faE8DO6XktxJ)W>9KfVJKA0({uaEbjEa4{ z`e9$HyRslw&Zg2>(}C>}8RS}(#diRUhNFfdl(*K3<+X2SbZ=fzjw#At|LfQZs<${| zAWB%J+9HcO_gx)D=Qdg#V|;Ecc7n*C#sVfR1>5gqbh`4La%~z=cxm5Z?0~5Fb4R_| zMI_j<`w~?F#6D5pzQ{3Nsjg!E*|9}d!ogxYvAd7nhvS_7Q~>h%mSp|{Jki_Gi#~^5 P00000NkvXXu0mjfW({vT literal 0 HcmV?d00001 diff --git a/plugins/FrequencyShifter/reset_lfo_off.png b/plugins/FrequencyShifter/reset_lfo_off.png new file mode 100644 index 0000000000000000000000000000000000000000..c16e9fa4c0e03cadb505f0c94910b8492b7ad719 GIT binary patch literal 1435 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 LNkvXXu0mjfJWl+R literal 0 HcmV?d00001 diff --git a/plugins/FrequencyShifter/send_on.png b/plugins/FrequencyShifter/send_on.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0646a444a1558f2bbea4f67161b7f2581d9809 GIT binary patch literal 2350 zcmV+}3DNe6P)2Kr5^971B2>*tL=p@MA@Knd<3xxiCTe^zF)?a2F+BKU zOnC7Y@JVB0;ss2saat-CBCUm{>9pJmy_dGMGehT`Gu`{=zplN`=@2+)_UyI)we~t| zee1uih0uJa5b;MubPJc)@I`#F2w6lJjpCU<`pjimrY^q|?W{MuqZF*xZh$Q1_xQ=1 z5yXR)D&UpcXQqgzTS-9Jf7i4GCPSAc9lwwfxpb9K<(Rdz=`+A)Z3QUIUS?$Ej1n|c zBWOH;P8wYsUFS+5YUbRss;j7RjdX{BLv)i@oM=F$TzlCdHn9C2>m^%kalbIo<3w4`Fm#fN$~Df)X1>KU zNLzvE?J;z=d0+5pdz|>dBz)(dM`6q4C*jQ830OTeDi{9zsqez`ukHY|enXnf$GD@3 z=%JL|7l!}K{;ol3+J!e?a~GVSKMe;@>}%j)hK7MA%UM>1*)xU8z-c|VMg?2fwh&n7 z80Jd2W*|(eF;UepoqU2;n5_CasckI-ST(WKTev# zoQBOUfcxKw^kG4T2838NNrQ@NTCED6HODi60bb}qT%ka!x&@|>nU=!amjy8zD}-VXbZ?A9SZc;`3Zg(LsP zJ2u|~>qaKv9BbR3c0UI5?K$F~$4}kx1-Rw9&%nyT5!`j?NgWCI4=Y-O3M!>qwbD#k z(I^aAK!(U=RJ}unr~Z!X%_G;IO`t+-iNEEwNS=UH+^3As!>I=c@qrLQ01FfMa&nXn z#L!L;H_6OBv|0hTK)&bZPr{AsZ-tvS+>RT^KgQakUv57D18D``IC(4Ff7>+feQ78B z@#$Z}k&_4ED^uTtm914U+*(ODZ~QcT{^MVQ+1HkYsWW%dvNkGiK5ujp;=ZdtRQ@U1VN0sHzBo5?IPH!Q??Hc2=&O5 zlZQ_+eD_n92}liGnGom5WFBAqgSs{ChdlH4sJiRWQ*`b4W_;+bZ^Jli+^V4whIO^-P_$z#N%l&ZG$kp)H!WsSTrw{yv>-Vc+K6m(EFu87{ z{_=)(*W;lR`{4ht?Na}D@c16sy6L{02!u-WG zLzUv(4zP)OLj%=)s)3&c+$Z-CaseC6AQsYQ4J#dTu}2!I=Y4SMf}yje;R8_ zBg13(z-?cHySF?D&&>Wqjcs!6N8p=Zd^9KJSB*|Uo7%8gEvj!jb@3>5>W)rqzI{Pc zmnB-lp}|#fmNot|U8V>oZ+GUkKBBbW(Mz5?);Ul`9X;ITL|lB5r$zJwHCIQ8(RMH)rPg9_q>#dGw(*Je=sT8CjR z)k`#cVlV!7=4Vjugvy1Nc5Q|#)4a?8#o2eL1DES17-pDDbr*AjZIN30C5VU|Nle|7 zD{A2I=VQc~lBW?x4l@sHddtN!7!0 zTtoLc7!u$6M5_RWlWVVo({smxwG1w{&*NG)<95}~3Av|3dC}Uejf=FXX&P&yf@s%m zeEIAFc;NPjrCz7|!Ljw~Bc)B3I#?v$YC!=?u8Ja2=enATfRwe_N?E(BoXmR)8z3MnlV<3>Rh_iWmB$@LBj0meQ;{- z4S3?~&w#vhYVH`k^5y|Cb?DaJCh1WCfaHc=B;6QklY&yEa_ErjBi;8rwy+j5Tb{tw^>xm(JJMgiI;8b7?B-Q) z3!OQ{Uh^(?J2@>U+Y;6K?&`r&IC=36KiqK5;lJ3mSjsN%xn?2c{ddMzfDSqIord+@ zcgi@Y_+bW`EWL!etjwpalaho2n!U3p+MwpIJ~k3>z$;FIz&&=@NBCav0DL2(lk^0D z;$_Nl)DBfFyHKg^K1)dM|7$%ZvWQ#feRUmMN1LnbPoZ_?-nvw>vOFCPwxOLx;=93% z&We+eqOot)U9%u|&ZecYrvp17g1n1?zL1g`#UY$Rg6t{t_Sz3K`VTLt)YSanzda{G z%@Ic|Lh#H-a$_1$cxgXj?12ao zWXzO(Wgu7goW4X?0C7%~k1ukLS87+W|Li#;E8$>qoY+4{pTk>Ren9~8wL^sO0P-=> URb0k`R{#J207*qoM6N<$g5-&$fB*mh literal 0 HcmV?d00001