Add smoothing effect to visualiser

pull/261/head
James H Ball 2024-11-09 22:51:42 +00:00 zatwierdzone przez James H Ball
rodzic a106e09876
commit 1e112425e4
8 zmienionych plików z 33 dodań i 10 usunięć

Wyświetl plik

@ -119,9 +119,9 @@ OscirenderAudioProcessorEditor::OscirenderAudioProcessorEditor(OscirenderAudioPr
visualiserSettingsWindow.setUsingNativeTitleBar(true); visualiserSettingsWindow.setUsingNativeTitleBar(true);
#endif #endif
visualiserSettings.setLookAndFeel(&getLookAndFeel()); visualiserSettings.setLookAndFeel(&getLookAndFeel());
visualiserSettings.setSize(550, 370); visualiserSettings.setSize(550, 400);
visualiserSettingsWindow.setContentNonOwned(&visualiserSettings, true); visualiserSettingsWindow.setContentNonOwned(&visualiserSettings, true);
visualiserSettingsWindow.centreWithSize(550, 370); visualiserSettingsWindow.centreWithSize(550, 400);
tooltipDropShadow.setOwner(&tooltipWindow); tooltipDropShadow.setOwner(&tooltipWindow);
} }

Wyświetl plik

@ -29,7 +29,7 @@ OscirenderAudioProcessor::OscirenderAudioProcessor()
#endif #endif
) )
#endif #endif
{ {
// locking isn't necessary here because we are in the constructor // locking isn't necessary here because we are in the constructor
toggleableEffects.push_back(std::make_shared<Effect>( toggleableEffects.push_back(std::make_shared<Effect>(
@ -161,6 +161,7 @@ OscirenderAudioProcessor::OscirenderAudioProcessor()
allEffects = toggleableEffects; allEffects = toggleableEffects;
allEffects.insert(allEffects.end(), permanentEffects.begin(), permanentEffects.end()); allEffects.insert(allEffects.end(), permanentEffects.begin(), permanentEffects.end());
allEffects.insert(allEffects.end(), luaEffects.begin(), luaEffects.end()); allEffects.insert(allEffects.end(), luaEffects.begin(), luaEffects.end());
allEffects.push_back(visualiserParameters.smoothEffect);
for (auto effect : allEffects) { for (auto effect : allEffects) {
for (auto effectParameter : effect->parameters) { for (auto effectParameter : effect->parameters) {

Wyświetl plik

@ -51,9 +51,9 @@ SosciPluginEditor::SosciPluginEditor(SosciAudioProcessor& p)
visualiserSettingsWindow.setUsingNativeTitleBar(true); visualiserSettingsWindow.setUsingNativeTitleBar(true);
#endif #endif
visualiserSettings.setLookAndFeel(&getLookAndFeel()); visualiserSettings.setLookAndFeel(&getLookAndFeel());
visualiserSettings.setSize(550, 370); visualiserSettings.setSize(550, 400);
visualiserSettingsWindow.setContentNonOwned(&visualiserSettings, true); visualiserSettingsWindow.setContentNonOwned(&visualiserSettings, true);
visualiserSettingsWindow.centreWithSize(550, 370); visualiserSettingsWindow.centreWithSize(550, 400);
menuBar.toFront(true); menuBar.toFront(true);

Wyświetl plik

@ -22,6 +22,8 @@ SosciAudioProcessor::SosciAudioProcessor()
for (auto effect : parameters.effects) { for (auto effect : parameters.effects) {
allEffects.push_back(effect); allEffects.push_back(effect);
} }
allEffects.push_back(parameters.smoothEffect);
for (auto effect : allEffects) { for (auto effect : allEffects) {
for (auto effectParameter : effect->parameters) { for (auto effectParameter : effect->parameters) {

Wyświetl plik

@ -86,9 +86,10 @@ void VisualiserComponent::setBuffer(const std::vector<OsciPoint>& buffer) {
ySamples.clear(); ySamples.clear();
zSamples.clear(); zSamples.clear();
for (auto& point : buffer) { for (auto& point : buffer) {
xSamples.push_back(point.x); OsciPoint smoothPoint = settings.parameters.smoothEffect->apply(0, point);
ySamples.push_back(point.y); xSamples.push_back(smoothPoint.x);
zSamples.push_back(point.z); ySamples.push_back(smoothPoint.y);
zSamples.push_back(smoothPoint.z);
} }
triggerAsyncUpdate(); triggerAsyncUpdate();

Wyświetl plik

@ -12,6 +12,7 @@ VisualiserSettings::VisualiserSettings(VisualiserParameters& parameters, int num
addAndMakeVisible(focus); addAndMakeVisible(focus);
addAndMakeVisible(noise); addAndMakeVisible(noise);
addAndMakeVisible(glow); addAndMakeVisible(glow);
addAndMakeVisible(smooth);
addAndMakeVisible(graticuleToggle); addAndMakeVisible(graticuleToggle);
addAndMakeVisible(smudgeToggle); addAndMakeVisible(smudgeToggle);
addAndMakeVisible(upsamplingToggle); addAndMakeVisible(upsamplingToggle);
@ -24,6 +25,7 @@ VisualiserSettings::VisualiserSettings(VisualiserParameters& parameters, int num
focus.setSliderOnValueChange(); focus.setSliderOnValueChange();
noise.setSliderOnValueChange(); noise.setSliderOnValueChange();
glow.setSliderOnValueChange(); glow.setSliderOnValueChange();
smooth.setSliderOnValueChange();
} }
VisualiserSettings::~VisualiserSettings() {} VisualiserSettings::~VisualiserSettings() {}
@ -39,6 +41,7 @@ void VisualiserSettings::resized() {
focus.setBounds(area.removeFromTop(rowHeight)); focus.setBounds(area.removeFromTop(rowHeight));
noise.setBounds(area.removeFromTop(rowHeight)); noise.setBounds(area.removeFromTop(rowHeight));
glow.setBounds(area.removeFromTop(rowHeight)); glow.setBounds(area.removeFromTop(rowHeight));
smooth.setBounds(area.removeFromTop(rowHeight));
graticuleToggle.setBounds(area.removeFromTop(rowHeight)); graticuleToggle.setBounds(area.removeFromTop(rowHeight));
smudgeToggle.setBounds(area.removeFromTop(rowHeight)); smudgeToggle.setBounds(area.removeFromTop(rowHeight));
upsamplingToggle.setBounds(area.removeFromTop(rowHeight)); upsamplingToggle.setBounds(area.removeFromTop(rowHeight));

Wyświetl plik

@ -7,12 +7,14 @@
#include "../components/SvgButton.h" #include "../components/SvgButton.h"
#include "../LookAndFeel.h" #include "../LookAndFeel.h"
#include "../components/SwitchButton.h" #include "../components/SwitchButton.h"
#include "../audio/SmoothEffect.h"
class VisualiserParameters { class VisualiserParameters {
public: public:
BooleanParameter* graticuleEnabled = new BooleanParameter("Show Graticule", "graticuleEnabled", VERSION_HINT, true, "Show the graticule or grid lines over the oscilloscope display."); BooleanParameter* graticuleEnabled = new BooleanParameter("Show Graticule", "graticuleEnabled", VERSION_HINT, true, "Show the graticule or grid lines over the oscilloscope display.");
BooleanParameter* smudgesEnabled = new BooleanParameter("Show Smudges", "smudgesEnabled", VERSION_HINT, true, "Adds a subtle layer of dirt/smudges to the oscilloscope display to make it look more realistic."); BooleanParameter* smudgesEnabled = new BooleanParameter("Show Smudges", "smudgesEnabled", VERSION_HINT, true, "Adds a subtle layer of dirt/smudges to the oscilloscope display to make it look more realistic.");
BooleanParameter* upsamplingEnabled = new BooleanParameter("Upsample Audio", "upsamplingEnabled", VERSION_HINT, true, "Upsamples the audio before visualising it to make it appear more realistic, at the expense of performance."); BooleanParameter* upsamplingEnabled = new BooleanParameter("Upsample Audio", "upsamplingEnabled", VERSION_HINT, true, "Upsamples the audio before visualising it to make it appear more realistic, at the expense of performance.");
BooleanParameter* sweepEnabled = new BooleanParameter("Sweep", "sweepEnabled", VERSION_HINT, true, "Plots the audio signal over time, sweeping from left to right");
BooleanParameter* visualiserFullScreen = new BooleanParameter("Visualiser Fullscreen", "visualiserFullScreen", VERSION_HINT, false, "Makes the software visualiser fullscreen."); BooleanParameter* visualiserFullScreen = new BooleanParameter("Visualiser Fullscreen", "visualiserFullScreen", VERSION_HINT, false, "Makes the software visualiser fullscreen.");
std::shared_ptr<Effect> persistenceEffect = std::make_shared<Effect>( std::shared_ptr<Effect> persistenceEffect = std::make_shared<Effect>(
@ -36,7 +38,7 @@ public:
"Brightness", "Brightness",
"Controls how bright the light glows for on the oscilloscope display.", "Controls how bright the light glows for on the oscilloscope display.",
"brightness", "brightness",
VERSION_HINT, 3.0, 0.0, 10.0 VERSION_HINT, 2.0, 0.0, 10.0
) )
); );
std::shared_ptr<Effect> intensityEffect = std::make_shared<Effect>( std::shared_ptr<Effect> intensityEffect = std::make_shared<Effect>(
@ -80,8 +82,18 @@ public:
) )
); );
std::shared_ptr<Effect> smoothEffect = std::make_shared<Effect>(
std::make_shared<SmoothEffect>(),
new EffectParameter(
"Smoothing",
"This works as a low-pass frequency filter, effectively reducing the sample rate of the audio being visualised.",
"visualiserSmoothing",
VERSION_HINT, 0, 0.0, 1.0
)
);
std::vector<std::shared_ptr<Effect>> effects = {persistenceEffect, hueEffect, brightnessEffect, intensityEffect, saturationEffect, focusEffect, noiseEffect, glowEffect}; std::vector<std::shared_ptr<Effect>> effects = {persistenceEffect, hueEffect, brightnessEffect, intensityEffect, saturationEffect, focusEffect, noiseEffect, glowEffect};
std::vector<BooleanParameter*> booleans = {graticuleEnabled, smudgesEnabled, upsamplingEnabled, visualiserFullScreen}; std::vector<BooleanParameter*> booleans = {graticuleEnabled, smudgesEnabled, upsamplingEnabled, visualiserFullScreen, sweepEnabled};
}; };
class VisualiserSettings : public juce::Component { class VisualiserSettings : public juce::Component {
@ -147,6 +159,7 @@ private:
EffectComponent focus{*parameters.focusEffect}; EffectComponent focus{*parameters.focusEffect};
EffectComponent noise{*parameters.noiseEffect}; EffectComponent noise{*parameters.noiseEffect};
EffectComponent glow{*parameters.glowEffect}; EffectComponent glow{*parameters.glowEffect};
EffectComponent smooth{*parameters.smoothEffect};
jux::SwitchButton graticuleToggle{parameters.graticuleEnabled}; jux::SwitchButton graticuleToggle{parameters.graticuleEnabled};
jux::SwitchButton smudgeToggle{parameters.smudgesEnabled}; jux::SwitchButton smudgeToggle{parameters.smudgesEnabled};

Wyświetl plik

@ -55,6 +55,9 @@
file="Source/audio/EffectParameter.h"/> file="Source/audio/EffectParameter.h"/>
<FILE id="aziWU2" name="SampleRateManager.h" compile="0" resource="0" <FILE id="aziWU2" name="SampleRateManager.h" compile="0" resource="0"
file="Source/audio/SampleRateManager.h"/> file="Source/audio/SampleRateManager.h"/>
<FILE id="vj5mRC" name="SmoothEffect.cpp" compile="1" resource="0"
file="Source/audio/SmoothEffect.cpp"/>
<FILE id="GSnwBW" name="SmoothEffect.h" compile="0" resource="0" file="Source/audio/SmoothEffect.h"/>
</GROUP> </GROUP>
<GROUP id="{CD81913A-7F0E-5898-DA77-5EBEB369DEB1}" name="components"> <GROUP id="{CD81913A-7F0E-5898-DA77-5EBEB369DEB1}" name="components">
<FILE id="URb7Ok" name="AboutComponent.cpp" compile="1" resource="0" <FILE id="URb7Ok" name="AboutComponent.cpp" compile="1" resource="0"