diff --git a/Resources/audio/sosci.flac b/Resources/audio/sosci.flac index 7c1c515..354beef 100644 Binary files a/Resources/audio/sosci.flac and b/Resources/audio/sosci.flac differ diff --git a/Source/audio/StereoEffect.cpp b/Source/audio/StereoEffect.cpp new file mode 100644 index 0000000..4de3770 --- /dev/null +++ b/Source/audio/StereoEffect.cpp @@ -0,0 +1,35 @@ +#include "StereoEffect.h" + +StereoEffect::StereoEffect() {} + +StereoEffect::~StereoEffect() {} + +OsciPoint StereoEffect::apply(int index, OsciPoint input, const std::vector>& values, double sampleRate) { + if (this->sampleRate != sampleRate) { + this->sampleRate = sampleRate; + initialiseBuffer(sampleRate); + } + double sampleOffset = values[0].load() / 10; + sampleOffset = juce::jlimit(0.0, 1.0, sampleOffset); + sampleOffset *= buffer.size(); + + head++; + if (head >= buffer.size()) { + head = 0; + } + + buffer[head] = input; + + int readHead = head - sampleOffset; + if (readHead < 0) { + readHead += buffer.size(); + } + + return OsciPoint(input.x, buffer[readHead].y, input.z); +} + +void StereoEffect::initialiseBuffer(double sampleRate) { + buffer.clear(); + buffer.resize(bufferLength * sampleRate); + head = 0; +} diff --git a/Source/audio/StereoEffect.h b/Source/audio/StereoEffect.h new file mode 100644 index 0000000..39d0911 --- /dev/null +++ b/Source/audio/StereoEffect.h @@ -0,0 +1,19 @@ +#pragma once +#include "EffectApplication.h" +#include "../shape/OsciPoint.h" + +class StereoEffect : public EffectApplication { +public: + StereoEffect(); + ~StereoEffect(); + + OsciPoint apply(int index, OsciPoint input, const std::vector>& values, double sampleRate) override; + +private: + void initialiseBuffer(double sampleRate); + + const double bufferLength = 0.1; + double sampleRate = -1; + std::vector buffer; + int head = 0; +}; diff --git a/Source/visualiser/VisualiserSettings.cpp b/Source/visualiser/VisualiserSettings.cpp index decf045..570dd50 100644 --- a/Source/visualiser/VisualiserSettings.cpp +++ b/Source/visualiser/VisualiserSettings.cpp @@ -21,6 +21,7 @@ VisualiserSettings::VisualiserSettings(VisualiserParameters& p, int numChannels) addAndMakeVisible(screenOverlay); #if SOSCI_FEATURES addAndMakeVisible(screenSaturation); + addAndMakeVisible(stereo); addAndMakeVisible(xOffset); addAndMakeVisible(yOffset); addAndMakeVisible(xScale); @@ -62,6 +63,7 @@ VisualiserSettings::VisualiserSettings(VisualiserParameters& p, int numChannels) #if SOSCI_FEATURES screenSaturation.setSliderOnValueChange(); + stereo.setSliderOnValueChange(); xOffset.setSliderOnValueChange(); yOffset.setSliderOnValueChange(); xScale.setSliderOnValueChange(); @@ -102,6 +104,7 @@ void VisualiserSettings::resized() { smooth.setBounds(area.removeFromTop(rowHeight)); #if SOSCI_FEATURES + stereo.setBounds(area.removeFromTop(rowHeight)); xScale.setBounds(area.removeFromTop(rowHeight)); yScale.setBounds(area.removeFromTop(rowHeight)); xOffset.setBounds(area.removeFromTop(rowHeight)); diff --git a/Source/visualiser/VisualiserSettings.h b/Source/visualiser/VisualiserSettings.h index e2283cb..6d165c4 100644 --- a/Source/visualiser/VisualiserSettings.h +++ b/Source/visualiser/VisualiserSettings.h @@ -8,6 +8,7 @@ #include "../LookAndFeel.h" #include "../components/SwitchButton.h" #include "../audio/SmoothEffect.h" +#include "../audio/StereoEffect.h" enum class ScreenOverlay : int { Empty = 1, @@ -105,6 +106,16 @@ public: VERSION_HINT, 1.0, 0.0, 5.0 ) ); + std::shared_ptr stereoEffectApplication = std::make_shared(); + std::shared_ptr stereoEffect = std::make_shared( + stereoEffectApplication, + new EffectParameter( + "Stereo", + "Turns mono audio that is uninteresting to visualise into stereo audio that is interesting to visualise.", + "stereo", + VERSION_HINT, 0.0, 0.0, 1.0 + ) + ); std::shared_ptr scaleEffect = std::make_shared( [this](int index, OsciPoint input, const std::vector>& values, double sampleRate) { input.scale(values[0].load(), values[1].load(), 1.0); @@ -249,6 +260,7 @@ public: smoothEffect, #if SOSCI_FEATURES screenSaturationEffect, + stereoEffect, scaleEffect, offsetEffect, #endif @@ -367,6 +379,7 @@ private: #if SOSCI_FEATURES EffectComponent screenSaturation{*parameters.screenSaturationEffect}; + EffectComponent stereo{*parameters.stereoEffect}; EffectComponent xScale{*parameters.scaleEffect, 0}; EffectComponent yScale{*parameters.scaleEffect, 1}; EffectComponent xOffset{*parameters.offsetEffect, 0}; diff --git a/sosci.jucer b/sosci.jucer index 27261c2..3bea5d4 100644 --- a/sosci.jucer +++ b/sosci.jucer @@ -108,6 +108,9 @@ + +