Add vertical/horizontal distort, rotate, and vector cancelling effects

pull/170/head
James Ball 2023-03-28 14:33:56 +01:00
rodzic a032a16b66
commit e6c9cee6b1
16 zmienionych plików z 126 dodań i 6 usunięć

Wyświetl plik

@ -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<Effect>(std::make_unique<BitCrushEffect>(), "Bit Crush", "bitCrush"));
allEffects.push_back(std::make_shared<Effect>(std::make_unique<BulgeEffect>(), "Bulge", "bulge"));
allEffects.push_back(std::make_shared<Effect>(std::make_unique<RotateEffect>(), "2D Rotate Speed", "rotateSpeed"));
allEffects.push_back(std::make_shared<Effect>(std::make_unique<VectorCancellingEffect>(), "Vector cancelling", "vectorCancelling"));
allEffects.push_back(std::make_shared<Effect>(std::make_unique<DistortEffect>(true), "Vertical shift", "verticalDistort"));
allEffects.push_back(std::make_shared<Effect>(std::make_unique<DistortEffect>(false), "Horizontal shift", "horizontalDistort"));
}
OscirenderAudioProcessor::~OscirenderAudioProcessor()

Wyświetl plik

@ -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;

Wyświetl plik

@ -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;
};

Wyświetl plik

@ -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();

Wyświetl plik

@ -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;
};

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -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;
};

Wyświetl plik

@ -5,7 +5,7 @@ Effect::Effect(std::unique_ptr<EffectApplication> 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() {

Wyświetl plik

@ -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;

Wyświetl plik

@ -1 +1,16 @@
#include "EffectApplication.h"
#include <numbers>
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;
}

Wyświetl plik

@ -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;
};

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -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;
};

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -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;
};

Wyświetl plik

@ -24,12 +24,22 @@
file="Source/audio/BitCrushEffect.h"/>
<FILE id="ATOFA9" name="BulgeEffect.cpp" compile="1" resource="0" file="Source/audio/BulgeEffect.cpp"/>
<FILE id="lOXxYe" name="BulgeEffect.h" compile="0" resource="0" file="Source/audio/BulgeEffect.h"/>
<FILE id="DiIoN4" name="DistortEffect.cpp" compile="1" resource="0"
file="Source/audio/DistortEffect.cpp"/>
<FILE id="ux2dO2" name="DistortEffect.h" compile="0" resource="0" file="Source/audio/DistortEffect.h"/>
<FILE id="mP5lpY" name="Effect.cpp" compile="1" resource="0" file="Source/audio/Effect.cpp"/>
<FILE id="LKeNnY" name="Effect.h" compile="0" resource="0" file="Source/audio/Effect.h"/>
<FILE id="ca2VrC" name="EffectApplication.cpp" compile="1" resource="0"
file="Source/audio/EffectApplication.cpp"/>
<FILE id="MIYJ9y" name="EffectApplication.h" compile="0" resource="0"
file="Source/audio/EffectApplication.h"/>
<FILE id="PbbNqz" name="RotateEffect.cpp" compile="1" resource="0"
file="Source/audio/RotateEffect.cpp"/>
<FILE id="tUwNZV" name="RotateEffect.h" compile="0" resource="0" file="Source/audio/RotateEffect.h"/>
<FILE id="VBskjq" name="VectorCancellingEffect.cpp" compile="1" resource="0"
file="Source/audio/VectorCancellingEffect.cpp"/>
<FILE id="Be21D0" name="VectorCancellingEffect.h" compile="0" resource="0"
file="Source/audio/VectorCancellingEffect.h"/>
</GROUP>
<GROUP id="{E81B1D7B-B0F7-1967-B271-71B3F838720F}" name="txt">
<FILE id="vIYWRG" name="TextParser.cpp" compile="1" resource="0" file="Source/txt/TextParser.cpp"/>