diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index f874220a..9061e133 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -10,6 +10,9 @@ #include "PluginEditor.h" #include "parser/FileParser.h" #include "parser/FrameProducer.h" +#include "audio/RotateEffect.h" +#include "audio/VectorCancellingEffect.h" +#include "audio/DistortEffect.h" //============================================================================== OscirenderAudioProcessor::OscirenderAudioProcessor() @@ -28,6 +31,10 @@ OscirenderAudioProcessor::OscirenderAudioProcessor() allEffects.push_back(std::make_shared(std::make_unique(), "Bit Crush", "bitCrush")); allEffects.push_back(std::make_shared(std::make_unique(), "Bulge", "bulge")); + allEffects.push_back(std::make_shared(std::make_unique(), "2D Rotate Speed", "rotateSpeed")); + allEffects.push_back(std::make_shared(std::make_unique(), "Vector cancelling", "vectorCancelling")); + allEffects.push_back(std::make_shared(std::make_unique(true), "Vertical shift", "verticalDistort")); + allEffects.push_back(std::make_shared(std::make_unique(false), "Horizontal shift", "horizontalDistort")); } OscirenderAudioProcessor::~OscirenderAudioProcessor() diff --git a/Source/audio/BitCrushEffect.cpp b/Source/audio/BitCrushEffect.cpp index 8028aabf..5e8ede36 100644 --- a/Source/audio/BitCrushEffect.cpp +++ b/Source/audio/BitCrushEffect.cpp @@ -5,7 +5,7 @@ BitCrushEffect::BitCrushEffect() {} BitCrushEffect::~BitCrushEffect() {} // algorithm from https://www.kvraudio.com/forum/viewtopic.php?t=163880 -Vector2 BitCrushEffect::apply(int index, Vector2 input, double value) { +Vector2 BitCrushEffect::apply(int index, Vector2 input, double value, double frequency, double sampleRate) { // change rage of value from 0-1 to 0.0-0.78 double rangedValue = value * 0.78; double powValue = pow(2.0f, 1.0 - rangedValue) - 1.0; diff --git a/Source/audio/BitCrushEffect.h b/Source/audio/BitCrushEffect.h index a7adbbfc..69eebe72 100644 --- a/Source/audio/BitCrushEffect.h +++ b/Source/audio/BitCrushEffect.h @@ -7,5 +7,5 @@ public: BitCrushEffect(); ~BitCrushEffect(); - Vector2 apply(int index, Vector2 input, double value) override; + Vector2 apply(int index, Vector2 input, double value, double frequency, double sampleRate) override; }; \ No newline at end of file diff --git a/Source/audio/BulgeEffect.cpp b/Source/audio/BulgeEffect.cpp index 43986c50..fa8e5821 100644 --- a/Source/audio/BulgeEffect.cpp +++ b/Source/audio/BulgeEffect.cpp @@ -4,7 +4,7 @@ BulgeEffect::BulgeEffect() {} BulgeEffect::~BulgeEffect() {} -Vector2 BulgeEffect::apply(int index, Vector2 input, double value) { +Vector2 BulgeEffect::apply(int index, Vector2 input, double value, double frequency, double sampleRate) { double translatedBulge = -value + 1; double r = input.magnitude(); diff --git a/Source/audio/BulgeEffect.h b/Source/audio/BulgeEffect.h index bb379899..c6171b7e 100644 --- a/Source/audio/BulgeEffect.h +++ b/Source/audio/BulgeEffect.h @@ -7,5 +7,5 @@ public: BulgeEffect(); ~BulgeEffect(); - Vector2 apply(int index, Vector2 input, double value) override; + Vector2 apply(int index, Vector2 input, double value, double frequency, double sampleRate) override; }; \ No newline at end of file diff --git a/Source/audio/DistortEffect.cpp b/Source/audio/DistortEffect.cpp new file mode 100644 index 00000000..92c81ced --- /dev/null +++ b/Source/audio/DistortEffect.cpp @@ -0,0 +1,15 @@ +#include "DistortEffect.h" + +DistortEffect::DistortEffect(bool vertical) : vertical(vertical) {} + +DistortEffect::~DistortEffect() {} + +Vector2 DistortEffect::apply(int index, Vector2 input, double value, double frequency, double sampleRate) { + int vertical = (int)this->vertical; + if (index % 2 == 0) { + input.translate((1 - vertical) * value, vertical * value); + } else { + input.translate((1 - vertical) * -value, vertical * -value); + } + return input; +} diff --git a/Source/audio/DistortEffect.h b/Source/audio/DistortEffect.h new file mode 100644 index 00000000..746e66c4 --- /dev/null +++ b/Source/audio/DistortEffect.h @@ -0,0 +1,13 @@ +#pragma once +#include "EffectApplication.h" +#include "../shape/Vector2.h" + +class DistortEffect : public EffectApplication { +public: + DistortEffect(bool vertical); + ~DistortEffect(); + + Vector2 apply(int index, Vector2 input, double value, double frequency, double sampleRate) override; +private: + bool vertical; +}; \ No newline at end of file diff --git a/Source/audio/Effect.cpp b/Source/audio/Effect.cpp index 136631c5..48c7912a 100644 --- a/Source/audio/Effect.cpp +++ b/Source/audio/Effect.cpp @@ -5,7 +5,7 @@ Effect::Effect(std::unique_ptr effectApplication, juce::Strin } Vector2 Effect::apply(int index, Vector2 input) { - return effectApplication->apply(index, input, value); + return effectApplication->apply(index, input, value, frequency, sampleRate); } double Effect::getValue() { diff --git a/Source/audio/Effect.h b/Source/audio/Effect.h index 2f4a6ef4..594a33d4 100644 --- a/Source/audio/Effect.h +++ b/Source/audio/Effect.h @@ -19,6 +19,7 @@ private: double value = 0.0; double frequency = 1.0; int precedence = -1; + int sampleRate = 192000; juce::String name; juce::String id; diff --git a/Source/audio/EffectApplication.cpp b/Source/audio/EffectApplication.cpp index 6dc9b233..08de7b40 100644 --- a/Source/audio/EffectApplication.cpp +++ b/Source/audio/EffectApplication.cpp @@ -1 +1,16 @@ #include "EffectApplication.h" +#include + +void EffectApplication::resetPhase() { + phase = 0.0; +} + +double EffectApplication::nextPhase(double frequency, double sampleRate) { + phase += frequency / sampleRate; + + if (phase > 1) { + phase -= 1; + } + + return phase * 2 * std::numbers::pi; +} diff --git a/Source/audio/EffectApplication.h b/Source/audio/EffectApplication.h index 516603c2..a851e765 100644 --- a/Source/audio/EffectApplication.h +++ b/Source/audio/EffectApplication.h @@ -6,5 +6,10 @@ class EffectApplication { public: EffectApplication() {}; - virtual Vector2 apply(int index, Vector2 input, double value) = 0; + virtual Vector2 apply(int index, Vector2 input, double value, double frequency, double sampleRate) = 0; + + void resetPhase(); + double nextPhase(double frequency, double sampleRate); +private: + double phase = 0.0; }; \ No newline at end of file diff --git a/Source/audio/RotateEffect.cpp b/Source/audio/RotateEffect.cpp new file mode 100644 index 00000000..48fa0980 --- /dev/null +++ b/Source/audio/RotateEffect.cpp @@ -0,0 +1,10 @@ +#include "RotateEffect.h" + +RotateEffect::RotateEffect() {} + +RotateEffect::~RotateEffect() {} + +Vector2 RotateEffect::apply(int index, Vector2 input, double value, double frequency, double sampleRate) { + input.rotate(nextPhase(value, sampleRate)); + return input; +} diff --git a/Source/audio/RotateEffect.h b/Source/audio/RotateEffect.h new file mode 100644 index 00000000..c2c981e8 --- /dev/null +++ b/Source/audio/RotateEffect.h @@ -0,0 +1,11 @@ +#pragma once +#include "EffectApplication.h" +#include "../shape/Vector2.h" + +class RotateEffect : public EffectApplication { +public: + RotateEffect(); + ~RotateEffect(); + + Vector2 apply(int index, Vector2 input, double value, double frequency, double sampleRate) override; +}; \ No newline at end of file diff --git a/Source/audio/VectorCancellingEffect.cpp b/Source/audio/VectorCancellingEffect.cpp new file mode 100644 index 00000000..57355042 --- /dev/null +++ b/Source/audio/VectorCancellingEffect.cpp @@ -0,0 +1,19 @@ +#include "VectorCancellingEffect.h" + +VectorCancellingEffect::VectorCancellingEffect() {} + +VectorCancellingEffect::~VectorCancellingEffect() {} + +Vector2 VectorCancellingEffect::apply(int index, Vector2 input, double value, double frequency, double sampleRate) { + frequency = 1.0 + 9.0 * value; + if (index < lastIndex) { + nextInvert = nextInvert - lastIndex + frequency; + } + lastIndex = index; + if (index >= nextInvert) { + nextInvert += frequency; + } else { + input.scale(-1, -1); + } + return input; +} diff --git a/Source/audio/VectorCancellingEffect.h b/Source/audio/VectorCancellingEffect.h new file mode 100644 index 00000000..2d7ab4fa --- /dev/null +++ b/Source/audio/VectorCancellingEffect.h @@ -0,0 +1,14 @@ +#pragma once +#include "EffectApplication.h" +#include "../shape/Vector2.h" + +class VectorCancellingEffect : public EffectApplication { +public: + VectorCancellingEffect(); + ~VectorCancellingEffect(); + + Vector2 apply(int index, Vector2 input, double value, double frequency, double sampleRate) override; +private: + int lastIndex = 0; + double nextInvert = 0; +}; \ No newline at end of file diff --git a/osci-render.jucer b/osci-render.jucer index b83a8efa..1c93a1bc 100644 --- a/osci-render.jucer +++ b/osci-render.jucer @@ -24,12 +24,22 @@ file="Source/audio/BitCrushEffect.h"/> + + + + + +