kopia lustrzana https://github.com/jameshball/osci-render
Significantly reduce required code for adding effects
rodzic
3056ae3997
commit
a032a16b66
|
@ -9,7 +9,7 @@ EffectsComponent::EffectsComponent(OscirenderAudioProcessor& p) : audioProcessor
|
||||||
frequency.slider.setRange(0.0, 12000.0);
|
frequency.slider.setRange(0.0, 12000.0);
|
||||||
frequency.slider.setSkewFactorFromMidPoint(500.0);
|
frequency.slider.setSkewFactorFromMidPoint(500.0);
|
||||||
frequency.slider.setTextValueSuffix("Hz");
|
frequency.slider.setTextValueSuffix("Hz");
|
||||||
frequency.slider.setValue(440.0);
|
frequency.slider.setValue(audioProcessor.frequency, juce::dontSendNotification);
|
||||||
|
|
||||||
frequency.slider.onValueChange = [this] {
|
frequency.slider.onValueChange = [this] {
|
||||||
audioProcessor.frequency = frequency.slider.getValue();
|
audioProcessor.frequency = frequency.slider.getValue();
|
||||||
|
@ -21,7 +21,7 @@ EffectsComponent::EffectsComponent(OscirenderAudioProcessor& p) : audioProcessor
|
||||||
auto effects = audioProcessor.allEffects;
|
auto effects = audioProcessor.allEffects;
|
||||||
for (int i = 0; i < effects.size(); i++) {
|
for (int i = 0; i < effects.size(); i++) {
|
||||||
auto effect = effects[i];
|
auto effect = effects[i];
|
||||||
effect->setValue(0.5);
|
effect->setValue(effect->getValue());
|
||||||
audioProcessor.enableEffect(effect);
|
audioProcessor.enableEffect(effect);
|
||||||
itemData.data.push_back(effect);
|
itemData.data.push_back(effect);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,8 +26,8 @@ OscirenderAudioProcessor::OscirenderAudioProcessor()
|
||||||
, producer(std::make_unique<FrameProducer>(*this, parser)) {
|
, producer(std::make_unique<FrameProducer>(*this, parser)) {
|
||||||
producer->startThread();
|
producer->startThread();
|
||||||
|
|
||||||
allEffects.push_back(std::make_shared<BitCrushEffect>());
|
allEffects.push_back(std::make_shared<Effect>(std::make_unique<BitCrushEffect>(), "Bit Crush", "bitCrush"));
|
||||||
allEffects.push_back(std::make_shared<BulgeEffect>());
|
allEffects.push_back(std::make_shared<Effect>(std::make_unique<BulgeEffect>(), "Bulge", "bulge"));
|
||||||
}
|
}
|
||||||
|
|
||||||
OscirenderAudioProcessor::~OscirenderAudioProcessor()
|
OscirenderAudioProcessor::~OscirenderAudioProcessor()
|
||||||
|
|
|
@ -65,7 +65,7 @@ public:
|
||||||
void setStateInformation (const void* data, int sizeInBytes) override;
|
void setStateInformation (const void* data, int sizeInBytes) override;
|
||||||
|
|
||||||
float noteOnVel;
|
float noteOnVel;
|
||||||
float frequency = 0.0f;
|
float frequency = 440.0f;
|
||||||
|
|
||||||
double currentSampleRate = 0.0;
|
double currentSampleRate = 0.0;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ BitCrushEffect::BitCrushEffect() {}
|
||||||
BitCrushEffect::~BitCrushEffect() {}
|
BitCrushEffect::~BitCrushEffect() {}
|
||||||
|
|
||||||
// algorithm from https://www.kvraudio.com/forum/viewtopic.php?t=163880
|
// algorithm from https://www.kvraudio.com/forum/viewtopic.php?t=163880
|
||||||
Vector2 BitCrushEffect::apply(int index, Vector2 input) {
|
Vector2 BitCrushEffect::apply(int index, Vector2 input, double value) {
|
||||||
// change rage of value from 0-1 to 0.0-0.78
|
// change rage of value from 0-1 to 0.0-0.78
|
||||||
double rangedValue = value * 0.78;
|
double rangedValue = value * 0.78;
|
||||||
double powValue = pow(2.0f, 1.0 - rangedValue) - 1.0;
|
double powValue = pow(2.0f, 1.0 - rangedValue) - 1.0;
|
||||||
|
@ -15,31 +15,3 @@ Vector2 BitCrushEffect::apply(int index, Vector2 input) {
|
||||||
double dequant = 1.0f / quant;
|
double dequant = 1.0f / quant;
|
||||||
return Vector2(dequant * (int)(input.x * quant), dequant * (int)(input.y * quant));
|
return Vector2(dequant * (int)(input.x * quant), dequant * (int)(input.y * quant));
|
||||||
}
|
}
|
||||||
|
|
||||||
double BitCrushEffect::getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BitCrushEffect::setValue(double value) {
|
|
||||||
this->value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BitCrushEffect::setFrequency(double frequency) {
|
|
||||||
this->frequency = frequency;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BitCrushEffect::getPrecedence() {
|
|
||||||
return precedence;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BitCrushEffect::setPrecedence(int precedence) {
|
|
||||||
this->precedence = precedence;
|
|
||||||
}
|
|
||||||
|
|
||||||
juce::String BitCrushEffect::getName() {
|
|
||||||
return juce::String("Bit Crush");
|
|
||||||
}
|
|
||||||
|
|
||||||
juce::String BitCrushEffect::getId() {
|
|
||||||
return juce::String("bitCrush");
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,23 +1,11 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "Effect.h"
|
#include "EffectApplication.h"
|
||||||
#include "../shape/Vector2.h"
|
#include "../shape/Vector2.h"
|
||||||
|
|
||||||
class BitCrushEffect : public Effect {
|
class BitCrushEffect : public EffectApplication {
|
||||||
public:
|
public:
|
||||||
BitCrushEffect();
|
BitCrushEffect();
|
||||||
~BitCrushEffect();
|
~BitCrushEffect();
|
||||||
|
|
||||||
Vector2 apply(int index, Vector2 input) override;
|
Vector2 apply(int index, Vector2 input, double value) override;
|
||||||
double getValue() override;
|
|
||||||
void setValue(double value) override;
|
|
||||||
void setFrequency(double frequency) override;
|
|
||||||
int getPrecedence() override;
|
|
||||||
void setPrecedence(int precedence) override;
|
|
||||||
juce::String getName() override;
|
|
||||||
juce::String getId() override;
|
|
||||||
private:
|
|
||||||
|
|
||||||
double value = 0.0;
|
|
||||||
double frequency = 1.0;
|
|
||||||
int precedence = -1;
|
|
||||||
};
|
};
|
|
@ -4,7 +4,7 @@ BulgeEffect::BulgeEffect() {}
|
||||||
|
|
||||||
BulgeEffect::~BulgeEffect() {}
|
BulgeEffect::~BulgeEffect() {}
|
||||||
|
|
||||||
Vector2 BulgeEffect::apply(int index, Vector2 input) {
|
Vector2 BulgeEffect::apply(int index, Vector2 input, double value) {
|
||||||
double translatedBulge = -value + 1;
|
double translatedBulge = -value + 1;
|
||||||
|
|
||||||
double r = input.magnitude();
|
double r = input.magnitude();
|
||||||
|
@ -13,31 +13,3 @@ Vector2 BulgeEffect::apply(int index, Vector2 input) {
|
||||||
|
|
||||||
return Vector2(rn * cos(theta), rn * sin(theta));
|
return Vector2(rn * cos(theta), rn * sin(theta));
|
||||||
}
|
}
|
||||||
|
|
||||||
double BulgeEffect::getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BulgeEffect::setValue(double value) {
|
|
||||||
this->value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BulgeEffect::setFrequency(double frequency) {
|
|
||||||
this->frequency = frequency;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BulgeEffect::getPrecedence() {
|
|
||||||
return precedence;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BulgeEffect::setPrecedence(int precedence) {
|
|
||||||
this->precedence = precedence;
|
|
||||||
}
|
|
||||||
|
|
||||||
juce::String BulgeEffect::getName() {
|
|
||||||
return juce::String("Bulge");
|
|
||||||
}
|
|
||||||
|
|
||||||
juce::String BulgeEffect::getId() {
|
|
||||||
return juce::String("bulge");
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,23 +1,11 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "Effect.h"
|
#include "EffectApplication.h"
|
||||||
#include "../shape/Vector2.h"
|
#include "../shape/Vector2.h"
|
||||||
|
|
||||||
class BulgeEffect : public Effect {
|
class BulgeEffect : public EffectApplication {
|
||||||
public:
|
public:
|
||||||
BulgeEffect();
|
BulgeEffect();
|
||||||
~BulgeEffect();
|
~BulgeEffect();
|
||||||
|
|
||||||
Vector2 apply(int index, Vector2 input) override;
|
Vector2 apply(int index, Vector2 input, double value) override;
|
||||||
double getValue() override;
|
|
||||||
void setValue(double value) override;
|
|
||||||
void setFrequency(double frequency) override;
|
|
||||||
int getPrecedence() override;
|
|
||||||
void setPrecedence(int precedence) override;
|
|
||||||
juce::String getName() override;
|
|
||||||
juce::String getId() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
double value = 0.0;
|
|
||||||
double frequency = 1.0;
|
|
||||||
int precedence = -1;
|
|
||||||
};
|
};
|
|
@ -1,6 +1,37 @@
|
||||||
#include "Effect.h"
|
#include "Effect.h"
|
||||||
|
|
||||||
|
Effect::Effect(std::unique_ptr<EffectApplication> effectApplication, juce::String name, juce::String id) : name(name), id(id) {
|
||||||
Effect::Effect() {
|
this->effectApplication = std::move(effectApplication);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 Effect::apply(int index, Vector2 input) {
|
||||||
|
return effectApplication->apply(index, input, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
double Effect::getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Effect::setValue(double value) {
|
||||||
|
this->value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Effect::setFrequency(double frequency) {
|
||||||
|
this->frequency = frequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Effect::getPrecedence() {
|
||||||
|
return precedence;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Effect::setPrecedence(int precedence) {
|
||||||
|
this->precedence = precedence;
|
||||||
|
}
|
||||||
|
|
||||||
|
juce::String Effect::getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
juce::String Effect::getId() {
|
||||||
|
return id;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,17 +1,26 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "../shape/Vector2.h"
|
#include "../shape/Vector2.h"
|
||||||
#include <JuceHeader.h>
|
#include <JuceHeader.h>
|
||||||
|
#include "EffectApplication.h"
|
||||||
|
|
||||||
class Effect {
|
class Effect {
|
||||||
public:
|
public:
|
||||||
Effect();
|
Effect(std::unique_ptr<EffectApplication> effectApplication, juce::String name, juce::String id);
|
||||||
|
|
||||||
virtual Vector2 apply(int index, Vector2 input) = 0;
|
Vector2 apply(int index, Vector2 input);
|
||||||
virtual double getValue() = 0;
|
double getValue();
|
||||||
virtual void setValue(double value) = 0;
|
void setValue(double value);
|
||||||
virtual void setFrequency(double frequency) = 0;
|
void setFrequency(double frequency);
|
||||||
virtual int getPrecedence() = 0;
|
int getPrecedence();
|
||||||
virtual void setPrecedence(int precedence) = 0;
|
void setPrecedence(int precedence);
|
||||||
virtual juce::String getName() = 0;
|
juce::String getName();
|
||||||
virtual juce::String getId() = 0;
|
juce::String getId();
|
||||||
|
private:
|
||||||
|
double value = 0.0;
|
||||||
|
double frequency = 1.0;
|
||||||
|
int precedence = -1;
|
||||||
|
juce::String name;
|
||||||
|
juce::String id;
|
||||||
|
|
||||||
|
std::unique_ptr<EffectApplication> effectApplication;
|
||||||
};
|
};
|
|
@ -0,0 +1 @@
|
||||||
|
#include "EffectApplication.h"
|
|
@ -0,0 +1,10 @@
|
||||||
|
#pragma once
|
||||||
|
#include "../shape/Vector2.h"
|
||||||
|
#include <JuceHeader.h>
|
||||||
|
|
||||||
|
class EffectApplication {
|
||||||
|
public:
|
||||||
|
EffectApplication() {};
|
||||||
|
|
||||||
|
virtual Vector2 apply(int index, Vector2 input, double value) = 0;
|
||||||
|
};
|
|
@ -26,6 +26,10 @@
|
||||||
<FILE id="lOXxYe" name="BulgeEffect.h" compile="0" resource="0" file="Source/audio/BulgeEffect.h"/>
|
<FILE id="lOXxYe" name="BulgeEffect.h" compile="0" resource="0" file="Source/audio/BulgeEffect.h"/>
|
||||||
<FILE id="mP5lpY" name="Effect.cpp" compile="1" resource="0" file="Source/audio/Effect.cpp"/>
|
<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="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"/>
|
||||||
</GROUP>
|
</GROUP>
|
||||||
<GROUP id="{E81B1D7B-B0F7-1967-B271-71B3F838720F}" name="txt">
|
<GROUP id="{E81B1D7B-B0F7-1967-B271-71B3F838720F}" name="txt">
|
||||||
<FILE id="vIYWRG" name="TextParser.cpp" compile="1" resource="0" file="Source/txt/TextParser.cpp"/>
|
<FILE id="vIYWRG" name="TextParser.cpp" compile="1" resource="0" file="Source/txt/TextParser.cpp"/>
|
||||||
|
|
Ładowanie…
Reference in New Issue