Hello.
I’m making a simple AM and RM plug-in, and I need to generate different modulator waves.
Generating a sine way was simple enough, as this was built into the soul::oscillators namespace, so I could simply use the following line:
let oscSine = soul::oscillators::Sine (float, 10.0f);
However the namespace doesn’t allow for easy generation of other waves, and after having seemingly tried everything I can not get it to even recognize any other object, so I hope you can help.
Code is below (sorry about the shotty formatting, couldn’t figure out how to properly attach it):
/**
This is an auto-generated SOUL patch template.
This example code simply performs a simple gain between its input
and output. Now it's your turn to build this up into a real effect!
*/
graph TopLevelGraph [[main]]
{
//Declare input and output
input stream float audioInDry;
input stream float sineIn;
input stream float sawIn;
output stream float audioOut;
//Overall Dry/Wet
input event float onDryWetChange [[name: "Dry/Wet", min: 0.0f, max: 100.0f,
init: 0.0f, step: 1, unit: "%"]];
//Sine wave freq (modulation)
input event float sineFrequency [[name: "Sine Frequency", min: 5.0f, max: 500.0f,
init: 10.0f, step: 0.01, unit: "Hz"]];
//Saw wave freq (modulation)
input event float sawFrequency [[name: "Saw Frequency", min: 5.0f, max: 500.0f,
init: 10.0f, step: 0.01, unit: "Hz"]];
//We want an instance of our effect
let dryWetMixer = Tremolo;
//SOULs built in oscillator for Sine
let oscSine = soul::oscillators::Sine (float, 10.0f);
//let oscSaw = soul::oscillators; //This is the one I can't find a solution for
connection
{
//Various input sources
audioInDry -> dryWetMixer.audioInDry;
sawIn -> dryWetMixer.sawIn;
sineFrequency -> oscSine.frequencyIn;
//sawFrequency -> oscSaw.frequencyIn;
oscSine -> dryWetMixer.sineIn;
//Output
dryWetMixer.audioOut -> audioOut;
//User input
onDryWetChange -> dryWetMixer.onDryWetChange;
sineFrequency -> dryWetMixer.sineFrequency;
}
}
processor Tremolo
{
//Declare inputs and outputs
input stream float audioInDry;
input stream float audioInWet;
input stream float sineIn;
input stream float sawIn;
output stream float audioOut;
//Declare events
input event float onDryWetChange;
input event float sineFrequency;
input event float sineInFrequency;
//Notes (lowest octave)
float c = 16.35f;
float cSharp = 17.32f;
float d = 18.35f;
float dSharp = 19.45f;
float e = 20.60f;
float f = 21.83f;
float fSharp = 23.12f;
float g = 24.50f;
float gSharp = 25.96f;
float a = 27.50f;
float aSharp = 29.14f;
float b = 30.87f;
//Initialize variables
//Dry/wet
float dryWetValue = 0.0f;
//Carrier frequency "hack"
//float carrierFrequency = f * 2.0^5.0; //should be f5, but exponents doesn't work like this
float carrierFrequency = 698.46f;
//Sine wave
float modFrequency = 10.0f;
let fs = processor.frequency;
//Output values
float outDry = 0.0f;
float outAm = 0.0f;
float outRm = 0.0f;
//Change to dry/wet slider
event onDryWetChange(float incomingValue)
{
dryWetValue = incomingValue / 100.0f;
}
//Change to frequency slider (Sine wave mod)
event sineFrequency(float incomingValue)
{
modFrequency = incomingValue;
}
void run()
{
loop
{
//Set the dry signal
outDry = (1-dryWetValue) * audioInDry;
//Set the AM/Tremolo signal
//AM
outAm = sineIn * cos(carrierFrequency) * cos(modFrequency) * audioInDry;
outAm = outAm * dryWetValue;
//Tremolo
//outAm = audioInDry * (sineValue * dryWetValue);
//Set the RM Signal
outRm = sineIn * cos(carrierFrequency) * cos(modFrequency);
outRm = outRm * dryWetValue;
//Output
audioOut << outDry + outAm ;
advance();
}
}
}