SlewSonic

This commit is contained in:
Christopher Johnson 2023-02-27 07:20:12 -05:00
parent 264864c15e
commit 09cdb13d58
27 changed files with 1181 additions and 934 deletions

View file

@ -15,7 +15,7 @@ Bass: Hermepass, BassKit, DubCenter, DubSub, Floor, Infrasonic, FathomFive
Biquads: BiquadPlus, Biquad, BiquadDouble, BiquadOneHalf, BiquadTriple, Biquad2
Brightness: DeBess, Acceleration2, DeEss, Smooth, Slew3, Slew2, Slew, Air2, Air, PurestAir, Acceleration, DeHiss, Hypersonic, HypersonX, Ultrasonic, UltrasonicLite, UltrasonicMed, UltrasonX
Brightness: SlewSonic, DeBess, Acceleration2, DeEss, Smooth, Slew3, Slew2, Slew, Air2, Air, PurestAir, Acceleration, DeHiss, Hypersonic, HypersonX, Ultrasonic, UltrasonicLite, UltrasonicMed, UltrasonX
Clipping: ClipOnly2, ClipSoftly, OneCornerClip, ADClip7, AQuickVoiceClip, ClipOnly
@ -2974,6 +2974,20 @@ SubsOnly does the same thing for subsonic bass. It sounds a little like a house
Lastly, these are calibrated (in SlewOnly quite literally: pink noise will be about the same amplitude with or without it, though the tone will be way different) so that you can switch them in and out, and expect roughly the same loudnesses. Its okay if SubsOnly is louder for fullbodied bass: with that, its not so much about level-matching, its about getting your sound (at whatever desired loudness) and then having the bass still make sense through SubsOnly. If youre madly overloading it, there wont be groove, just a lot of thunder and noise, at elevated levels. These go on at the end of your master buss, so you can hear what your 2-buss chain did to the sound. Especially if you try and go for commercially loud volumes, sanity checking with these tools can be a real silver bullet.
############ SlewSonic combines SlewOnly with ultrasonic filtering to solo brightness.
This plugin was a journey! The video isn't even its final form. The idea was to find out whether SlewOnly aliases. Could you filter out ultrasonics and get a smoother SlewOnly?
The answer is 'kinda', but then things got out of hand…
SlewSonic lets you stack up as many as three instances of SlewOnly, each with ultrasonic filtering around them to resist aliasing. Except it's not always ultrasonic, because now you can set it from 25k all the way down to 5k. When you do that, you get the smoothest, darkest SlewOnly ever!
But what even is SlewOnly? It's a monitoring plugin, very simple, that shows only the extreme treble, and balances the levels in a calibrated way to help you mix. SlewOnly is in all versions of Airwindows Monitoring, alongside SubsOnly and PeakOnly. It's there to show you stuff you wouldn't hear off just the regular mix. So if you switch over to SlewOnly, it should still be a mix, still about the same volume, still about the same density.
The thing is, when you stack those up, the calibrated volume adjustment gets more and more extreme. So mega-boosts can create really LOUD super-treble. And this could be useful highlighting cymbals, whispers… anything where you want to solo those frequencies. The Bright control fades between the direct sound and one, two or three stages of SlewOnly, and the Mute control specifies the highest frequencies you keep, so it could fight aliasing even at lower sample rates.
I'm imagining this as a tool for dedicated hi-hat tracks, stuff like that. You should be able to get exactly what you want. Hope you like SlewSonic!
############ Smooth can tame pointy sounds or make drums explode.
Heres one of the classic Airwindows secret weapons, up to date and VST and free (yes, Patreon blah blah, you know the drill). It can be subtle or incredibly aggressive, and its named Smooth.

View file

@ -96,7 +96,7 @@ float SlewSonic::getParameter(VstInt32 index) {
void SlewSonic::getParameterName(VstInt32 index, char *text) {
switch (index) {
case kParamA: vst_strncpy (text, "Freq", kVstMaxParamStrLen); break;
case kParamA: vst_strncpy (text, "Mute", kVstMaxParamStrLen); break;
case kParamB: vst_strncpy (text, "Bright", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} //this is our labels for displaying in the VST host
@ -104,7 +104,7 @@ void SlewSonic::getParameterName(VstInt32 index, char *text) {
void SlewSonic::getParameterDisplay(VstInt32 index, char *text) {
switch (index) {
case kParamA: float2string ((A*20.0)+10.0, text, kVstMaxParamStrLen); break;
case kParamA: float2string ((A*20.0)+5.0, text, kVstMaxParamStrLen); break;
case kParamB: float2string (B, text, kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} //this displays the values and handles 'popups' where it's discrete choices

View file

@ -15,7 +15,7 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
float* out2 = outputs[1];
double trim = 2.302585092994045684017991; //natural logarithm of 10
double freq = ((A*20000.0)+10000.0) / getSampleRate();
double freq = ((A*20000.0)+5000.0) / getSampleRate();
if (freq > 0.499) freq = 0.499;
biquadD[0] = biquadC[0] = biquadB[0] = biquadA[0] = freq;
biquadA[1] = 2.24697960; //tenth order Butterworth out of five biquads
@ -57,11 +57,11 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
double aWet = 0.0;
double bWet = 0.0;
double cWet = B;
double cWet = B * 3.0;
//eight-stage wet/dry control using progressive stages that bypass when not engaged
if (cWet < 1.0) {aWet = cWet; cWet = 0.0;}
else if (cWet < 2.0) {bWet = cWet - 1.0; aWet = 1.0; cWet = 0.0;}
else {cWet -= 7.0; cWet = bWet = aWet = 1.0;}
else {cWet -= 2.0; bWet = aWet = 1.0;}
//this is one way to make a little set of dry/wet stages that are successively added to the
//output as the control is turned up. Each one independently goes from 0-1 and stays at 1
//beyond that point: this is a way to progressively add a 'black box' sound processing
@ -75,6 +75,12 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17;
double drySampleL = inputSampleL;
double drySampleR = inputSampleR;
double dryStageAL = 0.0;
double dryStageBL = 0.0;
double dryStageAR = 0.0;
double dryStageBR = 0.0;
double dryFinalBiquadL = 0.0;
double dryFinalBiquadR = 0.0;
double outSampleL = 0.0;
double outSampleR = 0.0;
@ -85,11 +91,11 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
biquadA[12] = biquadA[11]; biquadA[11] = inputSampleR; inputSampleR = outSampleR; biquadA[14] = biquadA[13]; biquadA[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleAL)*trim;
lastSampleAL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
dryStageAL = inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
outSampleR = (inputSampleR - lastSampleAR)*trim;
lastSampleAR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
dryStageAR = inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
}
@ -100,11 +106,11 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
biquadB[12] = biquadB[11]; biquadB[11] = inputSampleR; inputSampleR = outSampleR; biquadB[14] = biquadB[13]; biquadB[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleBL)*trim;
lastSampleBL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * bWet) + (lastSampleAL * (1.0-bWet));
dryStageBL = inputSampleL = (inputSampleL * bWet) + (dryStageAL * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
outSampleR = (inputSampleR - lastSampleBR)*trim;
lastSampleBR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * bWet) + (lastSampleAR * (1.0-bWet));
dryStageBR = inputSampleR = (inputSampleR * bWet) + (dryStageAR * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
}
@ -115,20 +121,26 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
biquadC[12] = biquadC[11]; biquadC[11] = inputSampleR; inputSampleR = outSampleR; biquadC[14] = biquadC[13]; biquadC[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleCL)*trim;
lastSampleCL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * cWet) + (lastSampleBL * (1.0-cWet));
inputSampleL = (inputSampleL * cWet) + (dryStageBL * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
outSampleR = (inputSampleR - lastSampleCR)*trim;
lastSampleCR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * cWet) + (lastSampleBR * (1.0-cWet));
inputSampleR = (inputSampleR * cWet) + (dryStageBR * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
}
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
if (aWet > 0.0) {
dryFinalBiquadL = inputSampleL;
dryFinalBiquadR = inputSampleR;
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
inputSampleL = (inputSampleL * aWet) + (dryFinalBiquadL * (1.0-aWet));
inputSampleR = (inputSampleR * aWet) + (dryFinalBiquadR * (1.0-aWet));
}
if (inputSampleL > 1.0) inputSampleL = 1.0;
if (inputSampleL < -1.0) inputSampleL = -1.0;
@ -162,7 +174,7 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
double* out2 = outputs[1];
double trim = 2.302585092994045684017991; //natural logarithm of 10
double freq = ((A*20000.0)+10000.0) / getSampleRate();
double freq = ((A*20000.0)+5000.0) / getSampleRate();
if (freq > 0.499) freq = 0.499;
biquadD[0] = biquadC[0] = biquadB[0] = biquadA[0] = freq;
biquadA[1] = 2.24697960; //tenth order Butterworth out of five biquads
@ -204,11 +216,11 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
double aWet = 0.0;
double bWet = 0.0;
double cWet = B;
double cWet = B * 3.0;
//eight-stage wet/dry control using progressive stages that bypass when not engaged
if (cWet < 1.0) {aWet = cWet; cWet = 0.0;}
else if (cWet < 2.0) {bWet = cWet - 1.0; aWet = 1.0; cWet = 0.0;}
else {cWet -= 7.0; cWet = bWet = aWet = 1.0;}
else {cWet -= 2.0; bWet = aWet = 1.0;}
//this is one way to make a little set of dry/wet stages that are successively added to the
//output as the control is turned up. Each one independently goes from 0-1 and stays at 1
//beyond that point: this is a way to progressively add a 'black box' sound processing
@ -222,6 +234,12 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17;
double drySampleL = inputSampleL;
double drySampleR = inputSampleR;
double dryStageAL = 0.0;
double dryStageBL = 0.0;
double dryStageAR = 0.0;
double dryStageBR = 0.0;
double dryFinalBiquadL = 0.0;
double dryFinalBiquadR = 0.0;
double outSampleL = 0.0;
double outSampleR = 0.0;
@ -232,11 +250,11 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
biquadA[12] = biquadA[11]; biquadA[11] = inputSampleR; inputSampleR = outSampleR; biquadA[14] = biquadA[13]; biquadA[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleAL)*trim;
lastSampleAL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
dryStageAL = inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
outSampleR = (inputSampleR - lastSampleAR)*trim;
lastSampleAR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
dryStageAR = inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
}
@ -247,11 +265,11 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
biquadB[12] = biquadB[11]; biquadB[11] = inputSampleR; inputSampleR = outSampleR; biquadB[14] = biquadB[13]; biquadB[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleBL)*trim;
lastSampleBL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * bWet) + (lastSampleAL * (1.0-bWet));
dryStageBL = inputSampleL = (inputSampleL * bWet) + (dryStageAL * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
outSampleR = (inputSampleR - lastSampleBR)*trim;
lastSampleBR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * bWet) + (lastSampleAR * (1.0-bWet));
dryStageBR = inputSampleR = (inputSampleR * bWet) + (dryStageAR * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
}
@ -262,20 +280,26 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
biquadC[12] = biquadC[11]; biquadC[11] = inputSampleR; inputSampleR = outSampleR; biquadC[14] = biquadC[13]; biquadC[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleCL)*trim;
lastSampleCL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * cWet) + (lastSampleBL * (1.0-cWet));
inputSampleL = (inputSampleL * cWet) + (dryStageBL * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
outSampleR = (inputSampleR - lastSampleCR)*trim;
lastSampleCR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * cWet) + (lastSampleBR * (1.0-cWet));
inputSampleR = (inputSampleR * cWet) + (dryStageBR * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
}
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
if (aWet > 0.0) {
dryFinalBiquadL = inputSampleL;
dryFinalBiquadR = inputSampleR;
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
inputSampleL = (inputSampleL * aWet) + (dryFinalBiquadL * (1.0-aWet));
inputSampleR = (inputSampleR * aWet) + (dryFinalBiquadR * (1.0-aWet));
}
if (inputSampleL > 1.0) inputSampleL = 1.0;
if (inputSampleL < -1.0) inputSampleL = -1.0;

View file

@ -101,8 +101,8 @@ ComponentResult SlewSonic::GetParameterInfo(AudioUnitScope inScope,
AUBase::FillInParameterName (outParameterInfo, kParameterOneName, false);
outParameterInfo.unit = kAudioUnitParameterUnit_CustomUnit;
outParameterInfo.unitName = kParameterOneUnit;
outParameterInfo.minValue = 10.0;
outParameterInfo.maxValue = 30.0;
outParameterInfo.minValue = 5.0;
outParameterInfo.maxValue = 25.0;
outParameterInfo.defaultValue = kDefaultValue_ParamOne;
break;
case kParam_Two:
@ -194,7 +194,7 @@ void SlewSonic::SlewSonicKernel::Process( const Float32 *inSourceP,
double freq = (GetParameter( kParam_One )*1000.0) / GetSampleRate();
if (freq > 0.499) freq = 0.499;
biquadD[0] = biquadC[0] = biquadB[0] = biquadA[0] = freq;
biquadA[1] = 2.24697960; //tenth order Butterworth out of five biquads
biquadA[1] = 2.24697960;
biquadB[1] = 0.80193774;
biquadC[1] = 0.55495813;
biquadD[1] = 0.5;
@ -233,11 +233,11 @@ void SlewSonic::SlewSonicKernel::Process( const Float32 *inSourceP,
Float64 aWet = 0.0;
Float64 bWet = 0.0;
Float64 cWet = GetParameter( kParam_Two );
Float64 cWet = GetParameter( kParam_Two )*3.0;
//eight-stage wet/dry control using progressive stages that bypass when not engaged
if (cWet < 1.0) {aWet = cWet; cWet = 0.0;}
else if (cWet < 2.0) {bWet = cWet - 1.0; aWet = 1.0; cWet = 0.0;}
else {cWet -= 7.0; cWet = bWet = aWet = 1.0;}
else {cWet -= 2.0; bWet = aWet = 1.0;}
//this is one way to make a little set of dry/wet stages that are successively added to the
//output as the control is turned up. Each one independently goes from 0-1 and stays at 1
//beyond that point: this is a way to progressively add a 'black box' sound processing
@ -248,6 +248,9 @@ void SlewSonic::SlewSonicKernel::Process( const Float32 *inSourceP,
double inputSample = *sourceP;
if (fabs(inputSample)<1.18e-23) inputSample = fpd * 1.18e-17;
double drySample = inputSample;
double dryStageA = 0.0;
double dryStageB = 0.0;
double dryFinalBiquad = 0.0;
double tempSample = 0.0;
double outputSample = 0.0;
@ -257,7 +260,7 @@ void SlewSonic::SlewSonicKernel::Process( const Float32 *inSourceP,
biquadA[10] = biquadA[9]; biquadA[9] = inputSample; //DF1
outputSample = (inputSample - lastSampleA)*trim;
lastSampleA = inputSample; inputSample = outputSample;
inputSample = (inputSample * aWet) + (drySample * (1.0-aWet));
dryStageA = inputSample = (inputSample * aWet) + (drySample * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
}
@ -267,7 +270,7 @@ void SlewSonic::SlewSonicKernel::Process( const Float32 *inSourceP,
biquadB[10] = biquadB[9]; biquadB[9] = inputSample; //DF1
outputSample = (inputSample - lastSampleB)*trim;
lastSampleB = inputSample; inputSample = outputSample;
inputSample = (inputSample * bWet) + (lastSampleA * (1.0-bWet));
dryStageB = inputSample = (inputSample * bWet) + (dryStageA * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
}
@ -277,14 +280,20 @@ void SlewSonic::SlewSonicKernel::Process( const Float32 *inSourceP,
biquadC[10] = biquadC[9]; biquadC[9] = inputSample; //DF1
outputSample = (inputSample - lastSampleC)*trim;
lastSampleC = inputSample; inputSample = outputSample;
inputSample = (inputSample * cWet) + (lastSampleB * (1.0-cWet));
inputSample = (inputSample * cWet) + (dryStageB * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
}
tempSample = biquadD[2]*inputSample+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSample; inputSample = tempSample;
biquadD[10] = biquadD[9]; biquadD[9] = inputSample; //DF1
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
if (aWet > 0.0) {
dryFinalBiquad = inputSample;
tempSample = biquadD[2]*inputSample+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSample; inputSample = tempSample;
biquadD[10] = biquadD[9]; biquadD[9] = inputSample; //DF1
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
inputSample = (inputSample * aWet) + (dryFinalBiquad * (1.0-aWet));
}
if (inputSample > 1.0) inputSample = 1.0;
if (inputSample < -1.0) inputSample = -1.0;

View file

@ -54,10 +54,10 @@
#pragma mark ____SlewSonic Parameters
// parameters
static const float kDefaultValue_ParamOne = 20.0;
static const float kDefaultValue_ParamOne = 15.0;
static const float kDefaultValue_ParamTwo = 0.0;
static CFStringRef kParameterOneName = CFSTR("Frequency");
static CFStringRef kParameterOneName = CFSTR("Mute");
static CFStringRef kParameterOneUnit = CFSTR("kHz");
static CFStringRef kParameterTwoName = CFSTR("Bright");
//Alter the name if desired, but using the plugin name is a start

View file

@ -49,13 +49,14 @@
PBXFileDataSource_Warnings_ColumnID,
);
};
PBXPerProjectTemplateStateSaveDate = 697672882;
PBXWorkspaceStateSaveDate = 697672882;
PBXPerProjectTemplateStateSaveDate = 699182734;
PBXWorkspaceStateSaveDate = 699182734;
};
perUserProjectItems = {
8BA6F6B929ACAEB5004C4F8C /* PBXTextBookmark */ = 8BA6F6B929ACAEB5004C4F8C /* PBXTextBookmark */;
8BA6F6BA29ACAEB5004C4F8C /* PBXBookmark */ = 8BA6F6BA29ACAEB5004C4F8C /* PBXBookmark */;
8BA6F6BB29ACAEB5004C4F8C /* PBXTextBookmark */ = 8BA6F6BB29ACAEB5004C4F8C /* PBXTextBookmark */;
8BB5EF2429946A3F009402F6 /* PlistBookmark */ = 8BB5EF2429946A3F009402F6 /* PlistBookmark */;
8BB5F0AC2995AD26009402F6 /* PBXTextBookmark */ = 8BB5F0AC2995AD26009402F6 /* PBXTextBookmark */;
8BB5F0AD2995AD26009402F6 /* PBXTextBookmark */ = 8BB5F0AD2995AD26009402F6 /* PBXTextBookmark */;
};
sourceControlManager = 8BD3CCB8148830B20062E48C /* Source Control */;
userBuildSettings = {
@ -63,10 +64,10 @@
};
8BA05A660720730100365D66 /* SlewSonic.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1245, 5292}}";
sepNavSelRange = "{8357, 0}";
sepNavVisRange = "{11395, 668}";
sepNavWindowFrame = "{{499, 43}, {1129, 835}}";
sepNavIntBoundsRect = "{{0, 0}, {1245, 5544}}";
sepNavSelRange = "{8310, 0}";
sepNavVisRange = "{11447, 404}";
sepNavWindowFrame = "{{724, 43}, {1129, 835}}";
};
};
8BA05A690720730100365D66 /* SlewSonicVersion.h */ = {
@ -77,6 +78,30 @@
sepNavWindowFrame = "{{15, 38}, {1129, 835}}";
};
};
8BA6F6B929ACAEB5004C4F8C /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 8BA05A660720730100365D66 /* SlewSonic.cpp */;
name = "SlewSonic.cpp: 200";
rLen = 0;
rLoc = 8310;
rType = 0;
vrLen = 404;
vrLoc = 11447;
};
8BA6F6BA29ACAEB5004C4F8C /* PBXBookmark */ = {
isa = PBXBookmark;
fRef = 8BC6025B073B072D006C4272 /* SlewSonic.h */;
};
8BA6F6BB29ACAEB5004C4F8C /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 8BC6025B073B072D006C4272 /* SlewSonic.h */;
name = "SlewSonic.h: 57";
rLen = 0;
rLoc = 2876;
rType = 0;
vrLen = 207;
vrLoc = 2777;
};
8BB5EF2429946A3F009402F6 /* PlistBookmark */ = {
isa = PlistBookmark;
fRef = 8D01CCD10486CAD60068D4B7 /* Info.plist */;
@ -89,32 +114,12 @@
rLen = 0;
rLoc = 9223372036854775808;
};
8BB5F0AC2995AD26009402F6 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 8BA05A660720730100365D66 /* SlewSonic.cpp */;
name = "SlewSonic.cpp: 190";
rLen = 0;
rLoc = 8357;
rType = 0;
vrLen = 520;
vrLoc = 11578;
};
8BB5F0AD2995AD26009402F6 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 8BA05A660720730100365D66 /* SlewSonic.cpp */;
name = "SlewSonic.cpp: 200";
rLen = 0;
rLoc = 8357;
rType = 0;
vrLen = 668;
vrLoc = 11395;
};
8BC6025B073B072D006C4272 /* SlewSonic.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1082, 2394}}";
sepNavIntBoundsRect = "{{0, 0}, {975, 2934}}";
sepNavSelRange = "{2876, 0}";
sepNavVisRange = "{2534, 912}";
sepNavWindowFrame = "{{743, 43}, {1129, 835}}";
sepNavVisRange = "{2777, 207}";
sepNavWindowFrame = "{{311, 43}, {1129, 835}}";
};
};
8BD3CCB8148830B20062E48C /* Source Control */ = {

View file

@ -302,7 +302,7 @@
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array>
<array>
<integer>4</integer>
<integer>3</integer>
<integer>2</integer>
<integer>1</integer>
<integer>0</integer>
@ -326,7 +326,7 @@
<real>288</real>
</array>
<key>RubberWindowFrame</key>
<string>588 172 841 654 0 0 1440 878 </string>
<string>71 221 841 654 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
@ -342,7 +342,7 @@
<key>PBXProjectModuleGUID</key>
<string>8BD7274A1D46E5A5000176F0</string>
<key>PBXProjectModuleLabel</key>
<string>SlewSonic.cpp</string>
<string>SlewSonic.h</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
@ -350,15 +350,16 @@
<key>PBXProjectModuleGUID</key>
<string>8BD7274B1D46E5A5000176F0</string>
<key>PBXProjectModuleLabel</key>
<string>SlewSonic.cpp</string>
<string>SlewSonic.h</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>8BB5F0AD2995AD26009402F6</string>
<string>8BA6F6BB29ACAEB5004C4F8C</string>
<key>history</key>
<array>
<string>8BB5EF2429946A3F009402F6</string>
<string>8BB5F0AC2995AD26009402F6</string>
<string>8BA6F6B929ACAEB5004C4F8C</string>
<string>8BA6F6BA29ACAEB5004C4F8C</string>
</array>
</dict>
<key>SplitCount</key>
@ -372,18 +373,18 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {531, 216}}</string>
<string>{{0, 0}, {531, 142}}</string>
<key>RubberWindowFrame</key>
<string>588 172 841 654 0 0 1440 878 </string>
<string>71 221 841 654 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
<string>216pt</string>
<string>142pt</string>
</dict>
<dict>
<key>Proportion</key>
<string>392pt</string>
<string>466pt</string>
<key>Tabs</key>
<array>
<dict>
@ -397,9 +398,9 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{10, 27}, {531, 365}}</string>
<string>{{10, 27}, {531, 439}}</string>
<key>RubberWindowFrame</key>
<string>588 172 841 654 0 0 1440 878 </string>
<string>71 221 841 654 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>XCDetailModule</string>
@ -453,7 +454,7 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{10, 27}, {531, 352}}</string>
<string>{{10, 27}, {531, 379}}</string>
</dict>
<key>Module</key>
<string>PBXBuildResultsModule</string>
@ -481,11 +482,11 @@
</array>
<key>TableOfContents</key>
<array>
<string>8BB5F0AE2995AD26009402F6</string>
<string>8BA6F6BC29ACAEB5004C4F8C</string>
<string>1CA23ED40692098700951B8B</string>
<string>8BB5F0AF2995AD26009402F6</string>
<string>8BA6F6BD29ACAEB5004C4F8C</string>
<string>8BD7274A1D46E5A5000176F0</string>
<string>8BB5F0B02995AD26009402F6</string>
<string>8BA6F6BE29ACAEB5004C4F8C</string>
<string>1CA23EDF0692099D00951B8B</string>
<string>1CA23EE00692099D00951B8B</string>
<string>1CA23EE10692099D00951B8B</string>
@ -658,7 +659,7 @@
<key>StatusbarIsVisible</key>
<true/>
<key>TimeStamp</key>
<real>697675046.89322102</real>
<real>699182773.51533401</real>
<key>ToolbarConfigUserDefaultsMinorVersion</key>
<string>2</string>
<key>ToolbarDisplayMode</key>
@ -675,11 +676,11 @@
<integer>5</integer>
<key>WindowOrderList</key>
<array>
<string>8BB5F0B12995AD26009402F6</string>
<string>8BA6F6BF29ACAEB5004C4F8C</string>
<string>/Users/christopherjohnson/Desktop/airwindows/plugins/MacAU/SlewSonic/SlewSonic.xcodeproj</string>
</array>
<key>WindowString</key>
<string>588 172 841 654 0 0 1440 878 </string>
<string>71 221 841 654 0 0 1440 878 </string>
<key>WindowToolsV3</key>
<array>
<dict>

View file

@ -101,8 +101,8 @@ ComponentResult SlewSonic::GetParameterInfo(AudioUnitScope inScope,
AUBase::FillInParameterName (outParameterInfo, kParameterOneName, false);
outParameterInfo.unit = kAudioUnitParameterUnit_CustomUnit;
outParameterInfo.unitName = kParameterOneUnit;
outParameterInfo.minValue = 10.0;
outParameterInfo.maxValue = 30.0;
outParameterInfo.minValue = 5.0;
outParameterInfo.maxValue = 25.0;
outParameterInfo.defaultValue = kDefaultValue_ParamOne;
break;
case kParam_Two:
@ -194,7 +194,7 @@ void SlewSonic::SlewSonicKernel::Process( const Float32 *inSourceP,
double freq = (GetParameter( kParam_One )*1000.0) / GetSampleRate();
if (freq > 0.499) freq = 0.499;
biquadD[0] = biquadC[0] = biquadB[0] = biquadA[0] = freq;
biquadA[1] = 2.24697960; //tenth order Butterworth out of five biquads
biquadA[1] = 2.24697960;
biquadB[1] = 0.80193774;
biquadC[1] = 0.55495813;
biquadD[1] = 0.5;
@ -233,11 +233,11 @@ void SlewSonic::SlewSonicKernel::Process( const Float32 *inSourceP,
Float64 aWet = 0.0;
Float64 bWet = 0.0;
Float64 cWet = GetParameter( kParam_Two );
Float64 cWet = GetParameter( kParam_Two )*3.0;
//eight-stage wet/dry control using progressive stages that bypass when not engaged
if (cWet < 1.0) {aWet = cWet; cWet = 0.0;}
else if (cWet < 2.0) {bWet = cWet - 1.0; aWet = 1.0; cWet = 0.0;}
else {cWet -= 7.0; cWet = bWet = aWet = 1.0;}
else {cWet -= 2.0; bWet = aWet = 1.0;}
//this is one way to make a little set of dry/wet stages that are successively added to the
//output as the control is turned up. Each one independently goes from 0-1 and stays at 1
//beyond that point: this is a way to progressively add a 'black box' sound processing
@ -248,6 +248,9 @@ void SlewSonic::SlewSonicKernel::Process( const Float32 *inSourceP,
double inputSample = *sourceP;
if (fabs(inputSample)<1.18e-23) inputSample = fpd * 1.18e-17;
double drySample = inputSample;
double dryStageA = 0.0;
double dryStageB = 0.0;
double dryFinalBiquad = 0.0;
double tempSample = 0.0;
double outputSample = 0.0;
@ -257,7 +260,7 @@ void SlewSonic::SlewSonicKernel::Process( const Float32 *inSourceP,
biquadA[10] = biquadA[9]; biquadA[9] = inputSample; //DF1
outputSample = (inputSample - lastSampleA)*trim;
lastSampleA = inputSample; inputSample = outputSample;
inputSample = (inputSample * aWet) + (drySample * (1.0-aWet));
dryStageA = inputSample = (inputSample * aWet) + (drySample * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
}
@ -267,7 +270,7 @@ void SlewSonic::SlewSonicKernel::Process( const Float32 *inSourceP,
biquadB[10] = biquadB[9]; biquadB[9] = inputSample; //DF1
outputSample = (inputSample - lastSampleB)*trim;
lastSampleB = inputSample; inputSample = outputSample;
inputSample = (inputSample * bWet) + (lastSampleA * (1.0-bWet));
dryStageB = inputSample = (inputSample * bWet) + (dryStageA * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
}
@ -277,14 +280,20 @@ void SlewSonic::SlewSonicKernel::Process( const Float32 *inSourceP,
biquadC[10] = biquadC[9]; biquadC[9] = inputSample; //DF1
outputSample = (inputSample - lastSampleC)*trim;
lastSampleC = inputSample; inputSample = outputSample;
inputSample = (inputSample * cWet) + (lastSampleB * (1.0-cWet));
inputSample = (inputSample * cWet) + (dryStageB * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
}
tempSample = biquadD[2]*inputSample+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSample; inputSample = tempSample;
biquadD[10] = biquadD[9]; biquadD[9] = inputSample; //DF1
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
if (aWet > 0.0) {
dryFinalBiquad = inputSample;
tempSample = biquadD[2]*inputSample+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSample; inputSample = tempSample;
biquadD[10] = biquadD[9]; biquadD[9] = inputSample; //DF1
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
inputSample = (inputSample * aWet) + (dryFinalBiquad * (1.0-aWet));
}
if (inputSample > 1.0) inputSample = 1.0;
if (inputSample < -1.0) inputSample = -1.0;

View file

@ -54,10 +54,10 @@
#pragma mark ____SlewSonic Parameters
// parameters
static const float kDefaultValue_ParamOne = 20.0;
static const float kDefaultValue_ParamOne = 15.0;
static const float kDefaultValue_ParamTwo = 0.0;
static CFStringRef kParameterOneName = CFSTR("Frequency");
static CFStringRef kParameterOneName = CFSTR("Mute");
static CFStringRef kParameterOneUnit = CFSTR("kHz");
static CFStringRef kParameterTwoName = CFSTR("Bright");
//Alter the name if desired, but using the plugin name is a start

View file

@ -49,13 +49,14 @@
PBXFileDataSource_Warnings_ColumnID,
);
};
PBXPerProjectTemplateStateSaveDate = 697672882;
PBXWorkspaceStateSaveDate = 697672882;
PBXPerProjectTemplateStateSaveDate = 699182734;
PBXWorkspaceStateSaveDate = 699182734;
};
perUserProjectItems = {
8BA6F6B929ACAEB5004C4F8C /* PBXTextBookmark */ = 8BA6F6B929ACAEB5004C4F8C /* PBXTextBookmark */;
8BA6F6BA29ACAEB5004C4F8C /* PBXBookmark */ = 8BA6F6BA29ACAEB5004C4F8C /* PBXBookmark */;
8BA6F6BB29ACAEB5004C4F8C /* PBXTextBookmark */ = 8BA6F6BB29ACAEB5004C4F8C /* PBXTextBookmark */;
8BB5EF2429946A3F009402F6 /* PlistBookmark */ = 8BB5EF2429946A3F009402F6 /* PlistBookmark */;
8BB5F0AC2995AD26009402F6 /* PBXTextBookmark */ = 8BB5F0AC2995AD26009402F6 /* PBXTextBookmark */;
8BB5F0AD2995AD26009402F6 /* PBXTextBookmark */ = 8BB5F0AD2995AD26009402F6 /* PBXTextBookmark */;
};
sourceControlManager = 8BD3CCB8148830B20062E48C /* Source Control */;
userBuildSettings = {
@ -63,10 +64,10 @@
};
8BA05A660720730100365D66 /* SlewSonic.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1245, 5292}}";
sepNavSelRange = "{8357, 0}";
sepNavVisRange = "{11395, 668}";
sepNavWindowFrame = "{{499, 43}, {1129, 835}}";
sepNavIntBoundsRect = "{{0, 0}, {1245, 5544}}";
sepNavSelRange = "{8310, 0}";
sepNavVisRange = "{11447, 404}";
sepNavWindowFrame = "{{724, 43}, {1129, 835}}";
};
};
8BA05A690720730100365D66 /* SlewSonicVersion.h */ = {
@ -77,6 +78,30 @@
sepNavWindowFrame = "{{15, 38}, {1129, 835}}";
};
};
8BA6F6B929ACAEB5004C4F8C /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 8BA05A660720730100365D66 /* SlewSonic.cpp */;
name = "SlewSonic.cpp: 200";
rLen = 0;
rLoc = 8310;
rType = 0;
vrLen = 404;
vrLoc = 11447;
};
8BA6F6BA29ACAEB5004C4F8C /* PBXBookmark */ = {
isa = PBXBookmark;
fRef = 8BC6025B073B072D006C4272 /* SlewSonic.h */;
};
8BA6F6BB29ACAEB5004C4F8C /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 8BC6025B073B072D006C4272 /* SlewSonic.h */;
name = "SlewSonic.h: 57";
rLen = 0;
rLoc = 2876;
rType = 0;
vrLen = 207;
vrLoc = 2777;
};
8BB5EF2429946A3F009402F6 /* PlistBookmark */ = {
isa = PlistBookmark;
fRef = 8D01CCD10486CAD60068D4B7 /* Info.plist */;
@ -89,32 +114,12 @@
rLen = 0;
rLoc = 9223372036854775808;
};
8BB5F0AC2995AD26009402F6 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 8BA05A660720730100365D66 /* SlewSonic.cpp */;
name = "SlewSonic.cpp: 190";
rLen = 0;
rLoc = 8357;
rType = 0;
vrLen = 520;
vrLoc = 11578;
};
8BB5F0AD2995AD26009402F6 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 8BA05A660720730100365D66 /* SlewSonic.cpp */;
name = "SlewSonic.cpp: 200";
rLen = 0;
rLoc = 8357;
rType = 0;
vrLen = 668;
vrLoc = 11395;
};
8BC6025B073B072D006C4272 /* SlewSonic.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1082, 2394}}";
sepNavIntBoundsRect = "{{0, 0}, {975, 2934}}";
sepNavSelRange = "{2876, 0}";
sepNavVisRange = "{2534, 912}";
sepNavWindowFrame = "{{743, 43}, {1129, 835}}";
sepNavVisRange = "{2777, 207}";
sepNavWindowFrame = "{{311, 43}, {1129, 835}}";
};
};
8BD3CCB8148830B20062E48C /* Source Control */ = {

View file

@ -302,7 +302,7 @@
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array>
<array>
<integer>4</integer>
<integer>3</integer>
<integer>2</integer>
<integer>1</integer>
<integer>0</integer>
@ -326,7 +326,7 @@
<real>288</real>
</array>
<key>RubberWindowFrame</key>
<string>588 172 841 654 0 0 1440 878 </string>
<string>71 221 841 654 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
@ -342,7 +342,7 @@
<key>PBXProjectModuleGUID</key>
<string>8BD7274A1D46E5A5000176F0</string>
<key>PBXProjectModuleLabel</key>
<string>SlewSonic.cpp</string>
<string>SlewSonic.h</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
@ -350,15 +350,16 @@
<key>PBXProjectModuleGUID</key>
<string>8BD7274B1D46E5A5000176F0</string>
<key>PBXProjectModuleLabel</key>
<string>SlewSonic.cpp</string>
<string>SlewSonic.h</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>8BB5F0AD2995AD26009402F6</string>
<string>8BA6F6BB29ACAEB5004C4F8C</string>
<key>history</key>
<array>
<string>8BB5EF2429946A3F009402F6</string>
<string>8BB5F0AC2995AD26009402F6</string>
<string>8BA6F6B929ACAEB5004C4F8C</string>
<string>8BA6F6BA29ACAEB5004C4F8C</string>
</array>
</dict>
<key>SplitCount</key>
@ -372,18 +373,18 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {531, 216}}</string>
<string>{{0, 0}, {531, 142}}</string>
<key>RubberWindowFrame</key>
<string>588 172 841 654 0 0 1440 878 </string>
<string>71 221 841 654 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
<string>216pt</string>
<string>142pt</string>
</dict>
<dict>
<key>Proportion</key>
<string>392pt</string>
<string>466pt</string>
<key>Tabs</key>
<array>
<dict>
@ -397,9 +398,9 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{10, 27}, {531, 365}}</string>
<string>{{10, 27}, {531, 439}}</string>
<key>RubberWindowFrame</key>
<string>588 172 841 654 0 0 1440 878 </string>
<string>71 221 841 654 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>XCDetailModule</string>
@ -453,7 +454,7 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{10, 27}, {531, 352}}</string>
<string>{{10, 27}, {531, 379}}</string>
</dict>
<key>Module</key>
<string>PBXBuildResultsModule</string>
@ -481,11 +482,11 @@
</array>
<key>TableOfContents</key>
<array>
<string>8BB5F0AE2995AD26009402F6</string>
<string>8BA6F6BC29ACAEB5004C4F8C</string>
<string>1CA23ED40692098700951B8B</string>
<string>8BB5F0AF2995AD26009402F6</string>
<string>8BA6F6BD29ACAEB5004C4F8C</string>
<string>8BD7274A1D46E5A5000176F0</string>
<string>8BB5F0B02995AD26009402F6</string>
<string>8BA6F6BE29ACAEB5004C4F8C</string>
<string>1CA23EDF0692099D00951B8B</string>
<string>1CA23EE00692099D00951B8B</string>
<string>1CA23EE10692099D00951B8B</string>
@ -658,7 +659,7 @@
<key>StatusbarIsVisible</key>
<true/>
<key>TimeStamp</key>
<real>697675046.89322102</real>
<real>699182773.51533401</real>
<key>ToolbarConfigUserDefaultsMinorVersion</key>
<string>2</string>
<key>ToolbarDisplayMode</key>
@ -675,11 +676,11 @@
<integer>5</integer>
<key>WindowOrderList</key>
<array>
<string>8BB5F0B12995AD26009402F6</string>
<string>8BA6F6BF29ACAEB5004C4F8C</string>
<string>/Users/christopherjohnson/Desktop/airwindows/plugins/MacAU/SlewSonic/SlewSonic.xcodeproj</string>
</array>
<key>WindowString</key>
<string>588 172 841 654 0 0 1440 878 </string>
<string>71 221 841 654 0 0 1440 878 </string>
<key>WindowToolsV3</key>
<array>
<dict>

View file

@ -49,8 +49,14 @@
PBXFileDataSource_Warnings_ColumnID,
);
};
PBXPerProjectTemplateStateSaveDate = 697672528;
PBXWorkspaceStateSaveDate = 697672528;
PBXPerProjectTemplateStateSaveDate = 699182730;
PBXWorkspaceStateSaveDate = 699182730;
};
perUserProjectItems = {
8BA6F6C629ACAEDF004C4F8C /* PBXTextBookmark */ = 8BA6F6C629ACAEDF004C4F8C /* PBXTextBookmark */;
8BA6F6C729ACAEDF004C4F8C /* PBXTextBookmark */ = 8BA6F6C729ACAEDF004C4F8C /* PBXTextBookmark */;
8BA6F6C829ACAEDF004C4F8C /* PBXBookmark */ = 8BA6F6C829ACAEDF004C4F8C /* PBXBookmark */;
8BA6F6C929ACAEDF004C4F8C /* PBXTextBookmark */ = 8BA6F6C929ACAEDF004C4F8C /* PBXTextBookmark */;
};
sourceControlManager = 8B02375E1D42B1C400E1E8C8 /* Source Control */;
userBuildSettings = {
@ -58,17 +64,17 @@
};
2407DEB6089929BA00EB68BF /* SlewSonic.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {948, 2466}}";
sepNavSelRange = "{4263, 0}";
sepNavVisRange = "{0, 1443}";
sepNavIntBoundsRect = "{{0, 0}, {948, 2376}}";
sepNavSelRange = "{3513, 0}";
sepNavVisRange = "{3446, 1561}";
sepNavWindowFrame = "{{12, 47}, {895, 831}}";
};
};
245463B80991757100464AD3 /* SlewSonic.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1110, 1386}}";
sepNavIntBoundsRect = "{{0, 0}, {1110, 1620}}";
sepNavSelRange = "{2698, 0}";
sepNavVisRange = "{0, 1292}";
sepNavVisRange = "{1035, 257}";
sepNavWindowFrame = "{{20, 47}, {895, 831}}";
};
};
@ -82,10 +88,10 @@
};
24D8286F09A914000093AEF8 /* SlewSonicProc.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1452, 5976}}";
sepNavSelRange = "{13290, 0}";
sepNavVisRange = "{10165, 2823}";
sepNavWindowFrame = "{{47, 41}, {1331, 837}}";
sepNavIntBoundsRect = "{{0, 0}, {885, 6444}}";
sepNavSelRange = "{9946, 0}";
sepNavVisRange = "{9550, 97}";
sepNavWindowFrame = "{{8, 41}, {1331, 837}}";
};
};
8B02375E1D42B1C400E1E8C8 /* Source Control */ = {
@ -102,6 +108,40 @@
isa = PBXCodeSenseManager;
indexTemplatePath = "";
};
8BA6F6C629ACAEDF004C4F8C /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2407DEB6089929BA00EB68BF /* SlewSonic.cpp */;
name = "SlewSonic.cpp: 115";
rLen = 0;
rLoc = 4262;
rType = 0;
vrLen = 115;
vrLoc = 1328;
};
8BA6F6C729ACAEDF004C4F8C /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 24D8286F09A914000093AEF8 /* SlewSonicProc.cpp */;
name = "SlewSonicProc.cpp: 223";
rLen = 0;
rLoc = 9946;
rType = 0;
vrLen = 97;
vrLoc = 9550;
};
8BA6F6C829ACAEDF004C4F8C /* PBXBookmark */ = {
isa = PBXBookmark;
fRef = 245463B80991757100464AD3 /* SlewSonic.h */;
};
8BA6F6C929ACAEDF004C4F8C /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 245463B80991757100464AD3 /* SlewSonic.h */;
name = "SlewSonic.h: 73";
rLen = 0;
rLoc = 2698;
rType = 0;
vrLen = 257;
vrLoc = 1035;
};
8D01CCC60486CAD60068D4B7 /* SlewSonic */ = {
activeExec = 0;
};

View file

@ -256,6 +256,8 @@
<key>Layout</key>
<array>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXBottomSmartGroupGIDs</key>
@ -337,7 +339,7 @@
<key>PBXProjectModuleGUID</key>
<string>8B0237581D42B1C400E1E8C8</string>
<key>PBXProjectModuleLabel</key>
<string>Gain.h</string>
<string>SlewSonic.h</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
@ -345,7 +347,17 @@
<key>PBXProjectModuleGUID</key>
<string>8B0237591D42B1C400E1E8C8</string>
<key>PBXProjectModuleLabel</key>
<string>Gain.h</string>
<string>SlewSonic.h</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>8BA6F6C929ACAEDF004C4F8C</string>
<key>history</key>
<array>
<string>8BA6F6C629ACAEDF004C4F8C</string>
<string>8BA6F6C729ACAEDF004C4F8C</string>
<string>8BA6F6C829ACAEDF004C4F8C</string>
</array>
</dict>
<key>SplitCount</key>
<string>1</string>
@ -358,18 +370,18 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {603, 0}}</string>
<string>{{0, 0}, {603, 86}}</string>
<key>RubberWindowFrame</key>
<string>16 274 810 487 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
<string>0pt</string>
<string>86pt</string>
</dict>
<dict>
<key>Proportion</key>
<string>441pt</string>
<string>355pt</string>
<key>Tabs</key>
<array>
<dict>
@ -383,7 +395,9 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{10, 27}, {603, 414}}</string>
<string>{{10, 27}, {603, 328}}</string>
<key>RubberWindowFrame</key>
<string>16 274 810 487 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>XCDetailModule</string>
@ -438,8 +452,6 @@
<dict>
<key>Frame</key>
<string>{{10, 27}, {603, 414}}</string>
<key>RubberWindowFrame</key>
<string>16 274 810 487 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXBuildResultsModule</string>
@ -467,11 +479,11 @@
</array>
<key>TableOfContents</key>
<array>
<string>8BB5F0C32995AFF7009402F6</string>
<string>8BA6F6CA29ACAEDF004C4F8C</string>
<string>1CA23ED40692098700951B8B</string>
<string>8BB5F0C42995AFF7009402F6</string>
<string>8BA6F6CB29ACAEDF004C4F8C</string>
<string>8B0237581D42B1C400E1E8C8</string>
<string>8BB5F0C52995AFF7009402F6</string>
<string>8BA6F6CC29ACAEDF004C4F8C</string>
<string>1CA23EDF0692099D00951B8B</string>
<string>1CA23EE00692099D00951B8B</string>
<string>1CA23EE10692099D00951B8B</string>
@ -624,7 +636,7 @@
<key>StatusbarIsVisible</key>
<true/>
<key>TimeStamp</key>
<real>697675767.751562</real>
<real>699182815.98788404</real>
<key>ToolbarConfigUserDefaultsMinorVersion</key>
<string>2</string>
<key>ToolbarDisplayMode</key>
@ -641,7 +653,8 @@
<integer>5</integer>
<key>WindowOrderList</key>
<array>
<string>/Users/christopherjohnson/Desktop/SlewSonic/SlewSonic.xcodeproj</string>
<string>8BA6F6CD29ACAEDF004C4F8C</string>
<string>/Users/christopherjohnson/Desktop/airwindows/plugins/MacVST/SlewSonic/SlewSonic.xcodeproj</string>
</array>
<key>WindowString</key>
<string>16 274 810 487 0 0 1440 878 </string>

View file

@ -12,15 +12,15 @@
24CFB70407E7A0220081BD57 /* PkgInfo in Resources */ = {isa = PBXBuildFile; fileRef = 24CFB70307E7A0220081BD57 /* PkgInfo */; };
24D8287009A914000093AEF8 /* SlewSonicProc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 24D8286F09A914000093AEF8 /* SlewSonicProc.cpp */; };
24D8287F09A9164A0093AEF8 /* xcode_vst_prefix.h in Headers */ = {isa = PBXBuildFile; fileRef = 24D8287E09A9164A0093AEF8 /* xcode_vst_prefix.h */; };
8B2634C42997204400E024FE /* vstfxstore.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B2634B82997204400E024FE /* vstfxstore.h */; };
8B2634C52997204400E024FE /* aeffect.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B2634B92997204400E024FE /* aeffect.h */; };
8B2634C62997204400E024FE /* aeffectx.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B2634BA2997204400E024FE /* aeffectx.h */; };
8B2634C72997204400E024FE /* audioeffectx.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B2634BE2997204400E024FE /* audioeffectx.h */; };
8B2634C82997204400E024FE /* audioeffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B2634BF2997204400E024FE /* audioeffect.cpp */; };
8B2634C92997204400E024FE /* audioeffectx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B2634C02997204400E024FE /* audioeffectx.cpp */; };
8B2634CA2997204400E024FE /* aeffeditor.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B2634C12997204400E024FE /* aeffeditor.h */; };
8B2634CB2997204400E024FE /* vstplugmain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B2634C22997204400E024FE /* vstplugmain.cpp */; };
8B2634CC2997204400E024FE /* audioeffect.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B2634C32997204400E024FE /* audioeffect.h */; };
8B77EF8329ACCC5B001BA298 /* vstfxstore.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B77EF7729ACCC5B001BA298 /* vstfxstore.h */; };
8B77EF8429ACCC5B001BA298 /* aeffect.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B77EF7829ACCC5B001BA298 /* aeffect.h */; };
8B77EF8529ACCC5B001BA298 /* aeffectx.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B77EF7929ACCC5B001BA298 /* aeffectx.h */; };
8B77EF8629ACCC5B001BA298 /* audioeffectx.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B77EF7D29ACCC5B001BA298 /* audioeffectx.h */; };
8B77EF8729ACCC5B001BA298 /* audioeffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B77EF7E29ACCC5B001BA298 /* audioeffect.cpp */; };
8B77EF8829ACCC5B001BA298 /* audioeffectx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B77EF7F29ACCC5B001BA298 /* audioeffectx.cpp */; };
8B77EF8929ACCC5B001BA298 /* aeffeditor.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B77EF8029ACCC5B001BA298 /* aeffeditor.h */; };
8B77EF8A29ACCC5B001BA298 /* vstplugmain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B77EF8129ACCC5B001BA298 /* vstplugmain.cpp */; };
8B77EF8B29ACCC5B001BA298 /* audioeffect.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B77EF8229ACCC5B001BA298 /* audioeffect.h */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@ -30,15 +30,15 @@
24CFB70307E7A0220081BD57 /* PkgInfo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = PkgInfo; path = mac/PkgInfo; sourceTree = "<group>"; };
24D8286F09A914000093AEF8 /* SlewSonicProc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SlewSonicProc.cpp; path = source/SlewSonicProc.cpp; sourceTree = "<group>"; };
24D8287E09A9164A0093AEF8 /* xcode_vst_prefix.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = xcode_vst_prefix.h; path = mac/xcode_vst_prefix.h; sourceTree = SOURCE_ROOT; };
8B2634B82997204400E024FE /* vstfxstore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vstfxstore.h; sourceTree = "<group>"; };
8B2634B92997204400E024FE /* aeffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aeffect.h; sourceTree = "<group>"; };
8B2634BA2997204400E024FE /* aeffectx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aeffectx.h; sourceTree = "<group>"; };
8B2634BE2997204400E024FE /* audioeffectx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audioeffectx.h; sourceTree = "<group>"; };
8B2634BF2997204400E024FE /* audioeffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audioeffect.cpp; sourceTree = "<group>"; };
8B2634C02997204400E024FE /* audioeffectx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audioeffectx.cpp; sourceTree = "<group>"; };
8B2634C12997204400E024FE /* aeffeditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aeffeditor.h; sourceTree = "<group>"; };
8B2634C22997204400E024FE /* vstplugmain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vstplugmain.cpp; sourceTree = "<group>"; };
8B2634C32997204400E024FE /* audioeffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audioeffect.h; sourceTree = "<group>"; };
8B77EF7729ACCC5B001BA298 /* vstfxstore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vstfxstore.h; sourceTree = "<group>"; };
8B77EF7829ACCC5B001BA298 /* aeffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aeffect.h; sourceTree = "<group>"; };
8B77EF7929ACCC5B001BA298 /* aeffectx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aeffectx.h; sourceTree = "<group>"; };
8B77EF7D29ACCC5B001BA298 /* audioeffectx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audioeffectx.h; sourceTree = "<group>"; };
8B77EF7E29ACCC5B001BA298 /* audioeffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audioeffect.cpp; sourceTree = "<group>"; };
8B77EF7F29ACCC5B001BA298 /* audioeffectx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audioeffectx.cpp; sourceTree = "<group>"; };
8B77EF8029ACCC5B001BA298 /* aeffeditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aeffeditor.h; sourceTree = "<group>"; };
8B77EF8129ACCC5B001BA298 /* vstplugmain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vstplugmain.cpp; sourceTree = "<group>"; };
8B77EF8229ACCC5B001BA298 /* audioeffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audioeffect.h; sourceTree = "<group>"; };
8D01CCD10486CAD60068D4B7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = mac/Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */
@ -66,7 +66,7 @@
08FB77ADFE841716C02AAC07 /* Source */ = {
isa = PBXGroup;
children = (
8B2634B52997204400E024FE /* vstsdk2.4 */,
8B77EF7429ACCC5B001BA298 /* vstsdk2.4 */,
2407DEB6089929BA00EB68BF /* SlewSonic.cpp */,
24D8286F09A914000093AEF8 /* SlewSonicProc.cpp */,
245463B80991757100464AD3 /* SlewSonic.h */,
@ -82,59 +82,59 @@
name = Products;
sourceTree = "<group>";
};
8B2634B52997204400E024FE /* vstsdk2.4 */ = {
8B77EF7429ACCC5B001BA298 /* vstsdk2.4 */ = {
isa = PBXGroup;
children = (
8B2634B62997204400E024FE /* pluginterfaces */,
8B2634BB2997204400E024FE /* public.sdk */,
8B77EF7529ACCC5B001BA298 /* pluginterfaces */,
8B77EF7A29ACCC5B001BA298 /* public.sdk */,
);
name = vstsdk2.4;
path = ../../../../vstsdk2.4;
sourceTree = "<group>";
};
8B2634B62997204400E024FE /* pluginterfaces */ = {
8B77EF7529ACCC5B001BA298 /* pluginterfaces */ = {
isa = PBXGroup;
children = (
8B2634B72997204400E024FE /* vst2.x */,
8B77EF7629ACCC5B001BA298 /* vst2.x */,
);
path = pluginterfaces;
sourceTree = "<group>";
};
8B2634B72997204400E024FE /* vst2.x */ = {
8B77EF7629ACCC5B001BA298 /* vst2.x */ = {
isa = PBXGroup;
children = (
8B2634B82997204400E024FE /* vstfxstore.h */,
8B2634B92997204400E024FE /* aeffect.h */,
8B2634BA2997204400E024FE /* aeffectx.h */,
8B77EF7729ACCC5B001BA298 /* vstfxstore.h */,
8B77EF7829ACCC5B001BA298 /* aeffect.h */,
8B77EF7929ACCC5B001BA298 /* aeffectx.h */,
);
path = vst2.x;
sourceTree = "<group>";
};
8B2634BB2997204400E024FE /* public.sdk */ = {
8B77EF7A29ACCC5B001BA298 /* public.sdk */ = {
isa = PBXGroup;
children = (
8B2634BC2997204400E024FE /* source */,
8B77EF7B29ACCC5B001BA298 /* source */,
);
path = public.sdk;
sourceTree = "<group>";
};
8B2634BC2997204400E024FE /* source */ = {
8B77EF7B29ACCC5B001BA298 /* source */ = {
isa = PBXGroup;
children = (
8B2634BD2997204400E024FE /* vst2.x */,
8B77EF7C29ACCC5B001BA298 /* vst2.x */,
);
path = source;
sourceTree = "<group>";
};
8B2634BD2997204400E024FE /* vst2.x */ = {
8B77EF7C29ACCC5B001BA298 /* vst2.x */ = {
isa = PBXGroup;
children = (
8B2634BE2997204400E024FE /* audioeffectx.h */,
8B2634BF2997204400E024FE /* audioeffect.cpp */,
8B2634C02997204400E024FE /* audioeffectx.cpp */,
8B2634C12997204400E024FE /* aeffeditor.h */,
8B2634C22997204400E024FE /* vstplugmain.cpp */,
8B2634C32997204400E024FE /* audioeffect.h */,
8B77EF7D29ACCC5B001BA298 /* audioeffectx.h */,
8B77EF7E29ACCC5B001BA298 /* audioeffect.cpp */,
8B77EF7F29ACCC5B001BA298 /* audioeffectx.cpp */,
8B77EF8029ACCC5B001BA298 /* aeffeditor.h */,
8B77EF8129ACCC5B001BA298 /* vstplugmain.cpp */,
8B77EF8229ACCC5B001BA298 /* audioeffect.h */,
);
path = vst2.x;
sourceTree = "<group>";
@ -146,14 +146,14 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
8B2634CA2997204400E024FE /* aeffeditor.h in Headers */,
8B77EF8929ACCC5B001BA298 /* aeffeditor.h in Headers */,
245463B90991757100464AD3 /* SlewSonic.h in Headers */,
8B2634CC2997204400E024FE /* audioeffect.h in Headers */,
8B2634C52997204400E024FE /* aeffect.h in Headers */,
8B77EF8B29ACCC5B001BA298 /* audioeffect.h in Headers */,
8B77EF8429ACCC5B001BA298 /* aeffect.h in Headers */,
24D8287F09A9164A0093AEF8 /* xcode_vst_prefix.h in Headers */,
8B2634C72997204400E024FE /* audioeffectx.h in Headers */,
8B2634C42997204400E024FE /* vstfxstore.h in Headers */,
8B2634C62997204400E024FE /* aeffectx.h in Headers */,
8B77EF8629ACCC5B001BA298 /* audioeffectx.h in Headers */,
8B77EF8329ACCC5B001BA298 /* vstfxstore.h in Headers */,
8B77EF8529ACCC5B001BA298 /* aeffectx.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -192,9 +192,9 @@
developmentRegion = en;
hasScannedForEncodings = 1;
knownRegions = (
fr,
ja,
en,
ja,
fr,
Base,
de,
);
@ -240,10 +240,10 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8B2634C92997204400E024FE /* audioeffectx.cpp in Sources */,
8B77EF8829ACCC5B001BA298 /* audioeffectx.cpp in Sources */,
2407DEB9089929BA00EB68BF /* SlewSonic.cpp in Sources */,
8B2634C82997204400E024FE /* audioeffect.cpp in Sources */,
8B2634CB2997204400E024FE /* vstplugmain.cpp in Sources */,
8B77EF8729ACCC5B001BA298 /* audioeffect.cpp in Sources */,
8B77EF8A29ACCC5B001BA298 /* vstplugmain.cpp in Sources */,
24D8287009A914000093AEF8 /* SlewSonicProc.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;

View file

@ -96,7 +96,7 @@ float SlewSonic::getParameter(VstInt32 index) {
void SlewSonic::getParameterName(VstInt32 index, char *text) {
switch (index) {
case kParamA: vst_strncpy (text, "Freq", kVstMaxParamStrLen); break;
case kParamA: vst_strncpy (text, "Mute", kVstMaxParamStrLen); break;
case kParamB: vst_strncpy (text, "Bright", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} //this is our labels for displaying in the VST host
@ -104,7 +104,7 @@ void SlewSonic::getParameterName(VstInt32 index, char *text) {
void SlewSonic::getParameterDisplay(VstInt32 index, char *text) {
switch (index) {
case kParamA: float2string ((A*20.0)+10.0, text, kVstMaxParamStrLen); break;
case kParamA: float2string ((A*20.0)+5.0, text, kVstMaxParamStrLen); break;
case kParamB: float2string (B, text, kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} //this displays the values and handles 'popups' where it's discrete choices

View file

@ -15,7 +15,7 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
float* out2 = outputs[1];
double trim = 2.302585092994045684017991; //natural logarithm of 10
double freq = ((A*20000.0)+10000.0) / getSampleRate();
double freq = ((A*20000.0)+5000.0) / getSampleRate();
if (freq > 0.499) freq = 0.499;
biquadD[0] = biquadC[0] = biquadB[0] = biquadA[0] = freq;
biquadA[1] = 2.24697960; //tenth order Butterworth out of five biquads
@ -57,11 +57,11 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
double aWet = 0.0;
double bWet = 0.0;
double cWet = B;
double cWet = B * 3.0;
//eight-stage wet/dry control using progressive stages that bypass when not engaged
if (cWet < 1.0) {aWet = cWet; cWet = 0.0;}
else if (cWet < 2.0) {bWet = cWet - 1.0; aWet = 1.0; cWet = 0.0;}
else {cWet -= 7.0; cWet = bWet = aWet = 1.0;}
else {cWet -= 2.0; bWet = aWet = 1.0;}
//this is one way to make a little set of dry/wet stages that are successively added to the
//output as the control is turned up. Each one independently goes from 0-1 and stays at 1
//beyond that point: this is a way to progressively add a 'black box' sound processing
@ -75,6 +75,12 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17;
double drySampleL = inputSampleL;
double drySampleR = inputSampleR;
double dryStageAL = 0.0;
double dryStageBL = 0.0;
double dryStageAR = 0.0;
double dryStageBR = 0.0;
double dryFinalBiquadL = 0.0;
double dryFinalBiquadR = 0.0;
double outSampleL = 0.0;
double outSampleR = 0.0;
@ -85,11 +91,11 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
biquadA[12] = biquadA[11]; biquadA[11] = inputSampleR; inputSampleR = outSampleR; biquadA[14] = biquadA[13]; biquadA[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleAL)*trim;
lastSampleAL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
dryStageAL = inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
outSampleR = (inputSampleR - lastSampleAR)*trim;
lastSampleAR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
dryStageAR = inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
}
@ -100,11 +106,11 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
biquadB[12] = biquadB[11]; biquadB[11] = inputSampleR; inputSampleR = outSampleR; biquadB[14] = biquadB[13]; biquadB[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleBL)*trim;
lastSampleBL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * bWet) + (lastSampleAL * (1.0-bWet));
dryStageBL = inputSampleL = (inputSampleL * bWet) + (dryStageAL * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
outSampleR = (inputSampleR - lastSampleBR)*trim;
lastSampleBR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * bWet) + (lastSampleAR * (1.0-bWet));
dryStageBR = inputSampleR = (inputSampleR * bWet) + (dryStageAR * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
}
@ -115,20 +121,26 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
biquadC[12] = biquadC[11]; biquadC[11] = inputSampleR; inputSampleR = outSampleR; biquadC[14] = biquadC[13]; biquadC[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleCL)*trim;
lastSampleCL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * cWet) + (lastSampleBL * (1.0-cWet));
inputSampleL = (inputSampleL * cWet) + (dryStageBL * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
outSampleR = (inputSampleR - lastSampleCR)*trim;
lastSampleCR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * cWet) + (lastSampleBR * (1.0-cWet));
inputSampleR = (inputSampleR * cWet) + (dryStageBR * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
}
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
if (aWet > 0.0) {
dryFinalBiquadL = inputSampleL;
dryFinalBiquadR = inputSampleR;
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
inputSampleL = (inputSampleL * aWet) + (dryFinalBiquadL * (1.0-aWet));
inputSampleR = (inputSampleR * aWet) + (dryFinalBiquadR * (1.0-aWet));
}
if (inputSampleL > 1.0) inputSampleL = 1.0;
if (inputSampleL < -1.0) inputSampleL = -1.0;
@ -162,7 +174,7 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
double* out2 = outputs[1];
double trim = 2.302585092994045684017991; //natural logarithm of 10
double freq = ((A*20000.0)+10000.0) / getSampleRate();
double freq = ((A*20000.0)+5000.0) / getSampleRate();
if (freq > 0.499) freq = 0.499;
biquadD[0] = biquadC[0] = biquadB[0] = biquadA[0] = freq;
biquadA[1] = 2.24697960; //tenth order Butterworth out of five biquads
@ -204,11 +216,11 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
double aWet = 0.0;
double bWet = 0.0;
double cWet = B;
double cWet = B * 3.0;
//eight-stage wet/dry control using progressive stages that bypass when not engaged
if (cWet < 1.0) {aWet = cWet; cWet = 0.0;}
else if (cWet < 2.0) {bWet = cWet - 1.0; aWet = 1.0; cWet = 0.0;}
else {cWet -= 7.0; cWet = bWet = aWet = 1.0;}
else {cWet -= 2.0; bWet = aWet = 1.0;}
//this is one way to make a little set of dry/wet stages that are successively added to the
//output as the control is turned up. Each one independently goes from 0-1 and stays at 1
//beyond that point: this is a way to progressively add a 'black box' sound processing
@ -222,6 +234,12 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17;
double drySampleL = inputSampleL;
double drySampleR = inputSampleR;
double dryStageAL = 0.0;
double dryStageBL = 0.0;
double dryStageAR = 0.0;
double dryStageBR = 0.0;
double dryFinalBiquadL = 0.0;
double dryFinalBiquadR = 0.0;
double outSampleL = 0.0;
double outSampleR = 0.0;
@ -232,11 +250,11 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
biquadA[12] = biquadA[11]; biquadA[11] = inputSampleR; inputSampleR = outSampleR; biquadA[14] = biquadA[13]; biquadA[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleAL)*trim;
lastSampleAL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
dryStageAL = inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
outSampleR = (inputSampleR - lastSampleAR)*trim;
lastSampleAR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
dryStageAR = inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
}
@ -247,11 +265,11 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
biquadB[12] = biquadB[11]; biquadB[11] = inputSampleR; inputSampleR = outSampleR; biquadB[14] = biquadB[13]; biquadB[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleBL)*trim;
lastSampleBL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * bWet) + (lastSampleAL * (1.0-bWet));
dryStageBL = inputSampleL = (inputSampleL * bWet) + (dryStageAL * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
outSampleR = (inputSampleR - lastSampleBR)*trim;
lastSampleBR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * bWet) + (lastSampleAR * (1.0-bWet));
dryStageBR = inputSampleR = (inputSampleR * bWet) + (dryStageAR * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
}
@ -262,20 +280,26 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
biquadC[12] = biquadC[11]; biquadC[11] = inputSampleR; inputSampleR = outSampleR; biquadC[14] = biquadC[13]; biquadC[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleCL)*trim;
lastSampleCL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * cWet) + (lastSampleBL * (1.0-cWet));
inputSampleL = (inputSampleL * cWet) + (dryStageBL * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
outSampleR = (inputSampleR - lastSampleCR)*trim;
lastSampleCR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * cWet) + (lastSampleBR * (1.0-cWet));
inputSampleR = (inputSampleR * cWet) + (dryStageBR * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
}
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
if (aWet > 0.0) {
dryFinalBiquadL = inputSampleL;
dryFinalBiquadR = inputSampleR;
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
inputSampleL = (inputSampleL * aWet) + (dryFinalBiquadL * (1.0-aWet));
inputSampleR = (inputSampleR * aWet) + (dryFinalBiquadR * (1.0-aWet));
}
if (inputSampleL > 1.0) inputSampleL = 1.0;
if (inputSampleL < -1.0) inputSampleL = -1.0;

View file

@ -49,8 +49,14 @@
PBXFileDataSource_Warnings_ColumnID,
);
};
PBXPerProjectTemplateStateSaveDate = 697672528;
PBXWorkspaceStateSaveDate = 697672528;
PBXPerProjectTemplateStateSaveDate = 699182730;
PBXWorkspaceStateSaveDate = 699182730;
};
perUserProjectItems = {
8BA6F6C629ACAEDF004C4F8C /* PBXTextBookmark */ = 8BA6F6C629ACAEDF004C4F8C /* PBXTextBookmark */;
8BA6F6C729ACAEDF004C4F8C /* PBXTextBookmark */ = 8BA6F6C729ACAEDF004C4F8C /* PBXTextBookmark */;
8BA6F6C829ACAEDF004C4F8C /* PBXBookmark */ = 8BA6F6C829ACAEDF004C4F8C /* PBXBookmark */;
8BA6F6C929ACAEDF004C4F8C /* PBXTextBookmark */ = 8BA6F6C929ACAEDF004C4F8C /* PBXTextBookmark */;
};
sourceControlManager = 8B02375E1D42B1C400E1E8C8 /* Source Control */;
userBuildSettings = {
@ -58,17 +64,17 @@
};
2407DEB6089929BA00EB68BF /* SlewSonic.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {948, 2466}}";
sepNavSelRange = "{4263, 0}";
sepNavVisRange = "{0, 1443}";
sepNavIntBoundsRect = "{{0, 0}, {948, 2376}}";
sepNavSelRange = "{3513, 0}";
sepNavVisRange = "{3446, 1561}";
sepNavWindowFrame = "{{12, 47}, {895, 831}}";
};
};
245463B80991757100464AD3 /* SlewSonic.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1110, 1386}}";
sepNavIntBoundsRect = "{{0, 0}, {1110, 1620}}";
sepNavSelRange = "{2698, 0}";
sepNavVisRange = "{0, 1292}";
sepNavVisRange = "{1035, 257}";
sepNavWindowFrame = "{{20, 47}, {895, 831}}";
};
};
@ -82,10 +88,10 @@
};
24D8286F09A914000093AEF8 /* SlewSonicProc.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1452, 5976}}";
sepNavSelRange = "{13290, 0}";
sepNavVisRange = "{10165, 2823}";
sepNavWindowFrame = "{{47, 41}, {1331, 837}}";
sepNavIntBoundsRect = "{{0, 0}, {885, 6444}}";
sepNavSelRange = "{9946, 0}";
sepNavVisRange = "{9550, 97}";
sepNavWindowFrame = "{{8, 41}, {1331, 837}}";
};
};
8B02375E1D42B1C400E1E8C8 /* Source Control */ = {
@ -102,6 +108,40 @@
isa = PBXCodeSenseManager;
indexTemplatePath = "";
};
8BA6F6C629ACAEDF004C4F8C /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2407DEB6089929BA00EB68BF /* SlewSonic.cpp */;
name = "SlewSonic.cpp: 115";
rLen = 0;
rLoc = 4262;
rType = 0;
vrLen = 115;
vrLoc = 1328;
};
8BA6F6C729ACAEDF004C4F8C /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 24D8286F09A914000093AEF8 /* SlewSonicProc.cpp */;
name = "SlewSonicProc.cpp: 223";
rLen = 0;
rLoc = 9946;
rType = 0;
vrLen = 97;
vrLoc = 9550;
};
8BA6F6C829ACAEDF004C4F8C /* PBXBookmark */ = {
isa = PBXBookmark;
fRef = 245463B80991757100464AD3 /* SlewSonic.h */;
};
8BA6F6C929ACAEDF004C4F8C /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 245463B80991757100464AD3 /* SlewSonic.h */;
name = "SlewSonic.h: 73";
rLen = 0;
rLoc = 2698;
rType = 0;
vrLen = 257;
vrLoc = 1035;
};
8D01CCC60486CAD60068D4B7 /* SlewSonic */ = {
activeExec = 0;
};

View file

@ -256,6 +256,8 @@
<key>Layout</key>
<array>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXBottomSmartGroupGIDs</key>
@ -337,7 +339,7 @@
<key>PBXProjectModuleGUID</key>
<string>8B0237581D42B1C400E1E8C8</string>
<key>PBXProjectModuleLabel</key>
<string>Gain.h</string>
<string>SlewSonic.h</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
@ -345,7 +347,17 @@
<key>PBXProjectModuleGUID</key>
<string>8B0237591D42B1C400E1E8C8</string>
<key>PBXProjectModuleLabel</key>
<string>Gain.h</string>
<string>SlewSonic.h</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>8BA6F6C929ACAEDF004C4F8C</string>
<key>history</key>
<array>
<string>8BA6F6C629ACAEDF004C4F8C</string>
<string>8BA6F6C729ACAEDF004C4F8C</string>
<string>8BA6F6C829ACAEDF004C4F8C</string>
</array>
</dict>
<key>SplitCount</key>
<string>1</string>
@ -358,18 +370,18 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {603, 0}}</string>
<string>{{0, 0}, {603, 86}}</string>
<key>RubberWindowFrame</key>
<string>16 274 810 487 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
<string>0pt</string>
<string>86pt</string>
</dict>
<dict>
<key>Proportion</key>
<string>441pt</string>
<string>355pt</string>
<key>Tabs</key>
<array>
<dict>
@ -383,7 +395,9 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{10, 27}, {603, 414}}</string>
<string>{{10, 27}, {603, 328}}</string>
<key>RubberWindowFrame</key>
<string>16 274 810 487 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>XCDetailModule</string>
@ -438,8 +452,6 @@
<dict>
<key>Frame</key>
<string>{{10, 27}, {603, 414}}</string>
<key>RubberWindowFrame</key>
<string>16 274 810 487 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXBuildResultsModule</string>
@ -467,11 +479,11 @@
</array>
<key>TableOfContents</key>
<array>
<string>8BB5F0C32995AFF7009402F6</string>
<string>8BA6F6CA29ACAEDF004C4F8C</string>
<string>1CA23ED40692098700951B8B</string>
<string>8BB5F0C42995AFF7009402F6</string>
<string>8BA6F6CB29ACAEDF004C4F8C</string>
<string>8B0237581D42B1C400E1E8C8</string>
<string>8BB5F0C52995AFF7009402F6</string>
<string>8BA6F6CC29ACAEDF004C4F8C</string>
<string>1CA23EDF0692099D00951B8B</string>
<string>1CA23EE00692099D00951B8B</string>
<string>1CA23EE10692099D00951B8B</string>
@ -624,7 +636,7 @@
<key>StatusbarIsVisible</key>
<true/>
<key>TimeStamp</key>
<real>697675767.751562</real>
<real>699182815.98788404</real>
<key>ToolbarConfigUserDefaultsMinorVersion</key>
<string>2</string>
<key>ToolbarDisplayMode</key>
@ -641,7 +653,8 @@
<integer>5</integer>
<key>WindowOrderList</key>
<array>
<string>/Users/christopherjohnson/Desktop/SlewSonic/SlewSonic.xcodeproj</string>
<string>8BA6F6CD29ACAEDF004C4F8C</string>
<string>/Users/christopherjohnson/Desktop/airwindows/plugins/MacVST/SlewSonic/SlewSonic.xcodeproj</string>
</array>
<key>WindowString</key>
<string>16 274 810 487 0 0 1440 878 </string>

View file

@ -96,7 +96,7 @@ float SlewSonic::getParameter(VstInt32 index) {
void SlewSonic::getParameterName(VstInt32 index, char *text) {
switch (index) {
case kParamA: vst_strncpy (text, "Freq", kVstMaxParamStrLen); break;
case kParamA: vst_strncpy (text, "Mute", kVstMaxParamStrLen); break;
case kParamB: vst_strncpy (text, "Bright", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} //this is our labels for displaying in the VST host
@ -104,7 +104,7 @@ void SlewSonic::getParameterName(VstInt32 index, char *text) {
void SlewSonic::getParameterDisplay(VstInt32 index, char *text) {
switch (index) {
case kParamA: float2string ((A*20.0)+10.0, text, kVstMaxParamStrLen); break;
case kParamA: float2string ((A*20.0)+5.0, text, kVstMaxParamStrLen); break;
case kParamB: float2string (B, text, kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} //this displays the values and handles 'popups' where it's discrete choices

View file

@ -15,7 +15,7 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
float* out2 = outputs[1];
double trim = 2.302585092994045684017991; //natural logarithm of 10
double freq = ((A*20000.0)+10000.0) / getSampleRate();
double freq = ((A*20000.0)+5000.0) / getSampleRate();
if (freq > 0.499) freq = 0.499;
biquadD[0] = biquadC[0] = biquadB[0] = biquadA[0] = freq;
biquadA[1] = 2.24697960; //tenth order Butterworth out of five biquads
@ -57,11 +57,11 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
double aWet = 0.0;
double bWet = 0.0;
double cWet = B;
double cWet = B * 3.0;
//eight-stage wet/dry control using progressive stages that bypass when not engaged
if (cWet < 1.0) {aWet = cWet; cWet = 0.0;}
else if (cWet < 2.0) {bWet = cWet - 1.0; aWet = 1.0; cWet = 0.0;}
else {cWet -= 7.0; cWet = bWet = aWet = 1.0;}
else {cWet -= 2.0; bWet = aWet = 1.0;}
//this is one way to make a little set of dry/wet stages that are successively added to the
//output as the control is turned up. Each one independently goes from 0-1 and stays at 1
//beyond that point: this is a way to progressively add a 'black box' sound processing
@ -75,6 +75,12 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17;
double drySampleL = inputSampleL;
double drySampleR = inputSampleR;
double dryStageAL = 0.0;
double dryStageBL = 0.0;
double dryStageAR = 0.0;
double dryStageBR = 0.0;
double dryFinalBiquadL = 0.0;
double dryFinalBiquadR = 0.0;
double outSampleL = 0.0;
double outSampleR = 0.0;
@ -85,11 +91,11 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
biquadA[12] = biquadA[11]; biquadA[11] = inputSampleR; inputSampleR = outSampleR; biquadA[14] = biquadA[13]; biquadA[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleAL)*trim;
lastSampleAL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
dryStageAL = inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
outSampleR = (inputSampleR - lastSampleAR)*trim;
lastSampleAR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
dryStageAR = inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
}
@ -100,11 +106,11 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
biquadB[12] = biquadB[11]; biquadB[11] = inputSampleR; inputSampleR = outSampleR; biquadB[14] = biquadB[13]; biquadB[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleBL)*trim;
lastSampleBL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * bWet) + (lastSampleAL * (1.0-bWet));
dryStageBL = inputSampleL = (inputSampleL * bWet) + (dryStageAL * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
outSampleR = (inputSampleR - lastSampleBR)*trim;
lastSampleBR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * bWet) + (lastSampleAR * (1.0-bWet));
dryStageBR = inputSampleR = (inputSampleR * bWet) + (dryStageAR * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
}
@ -115,20 +121,26 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
biquadC[12] = biquadC[11]; biquadC[11] = inputSampleR; inputSampleR = outSampleR; biquadC[14] = biquadC[13]; biquadC[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleCL)*trim;
lastSampleCL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * cWet) + (lastSampleBL * (1.0-cWet));
inputSampleL = (inputSampleL * cWet) + (dryStageBL * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
outSampleR = (inputSampleR - lastSampleCR)*trim;
lastSampleCR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * cWet) + (lastSampleBR * (1.0-cWet));
inputSampleR = (inputSampleR * cWet) + (dryStageBR * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
}
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
if (aWet > 0.0) {
dryFinalBiquadL = inputSampleL;
dryFinalBiquadR = inputSampleR;
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
inputSampleL = (inputSampleL * aWet) + (dryFinalBiquadL * (1.0-aWet));
inputSampleR = (inputSampleR * aWet) + (dryFinalBiquadR * (1.0-aWet));
}
if (inputSampleL > 1.0) inputSampleL = 1.0;
if (inputSampleL < -1.0) inputSampleL = -1.0;
@ -162,7 +174,7 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
double* out2 = outputs[1];
double trim = 2.302585092994045684017991; //natural logarithm of 10
double freq = ((A*20000.0)+10000.0) / getSampleRate();
double freq = ((A*20000.0)+5000.0) / getSampleRate();
if (freq > 0.499) freq = 0.499;
biquadD[0] = biquadC[0] = biquadB[0] = biquadA[0] = freq;
biquadA[1] = 2.24697960; //tenth order Butterworth out of five biquads
@ -204,11 +216,11 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
double aWet = 0.0;
double bWet = 0.0;
double cWet = B;
double cWet = B * 3.0;
//eight-stage wet/dry control using progressive stages that bypass when not engaged
if (cWet < 1.0) {aWet = cWet; cWet = 0.0;}
else if (cWet < 2.0) {bWet = cWet - 1.0; aWet = 1.0; cWet = 0.0;}
else {cWet -= 7.0; cWet = bWet = aWet = 1.0;}
else {cWet -= 2.0; bWet = aWet = 1.0;}
//this is one way to make a little set of dry/wet stages that are successively added to the
//output as the control is turned up. Each one independently goes from 0-1 and stays at 1
//beyond that point: this is a way to progressively add a 'black box' sound processing
@ -222,6 +234,12 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17;
double drySampleL = inputSampleL;
double drySampleR = inputSampleR;
double dryStageAL = 0.0;
double dryStageBL = 0.0;
double dryStageAR = 0.0;
double dryStageBR = 0.0;
double dryFinalBiquadL = 0.0;
double dryFinalBiquadR = 0.0;
double outSampleL = 0.0;
double outSampleR = 0.0;
@ -232,11 +250,11 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
biquadA[12] = biquadA[11]; biquadA[11] = inputSampleR; inputSampleR = outSampleR; biquadA[14] = biquadA[13]; biquadA[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleAL)*trim;
lastSampleAL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
dryStageAL = inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
outSampleR = (inputSampleR - lastSampleAR)*trim;
lastSampleAR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
dryStageAR = inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
}
@ -247,11 +265,11 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
biquadB[12] = biquadB[11]; biquadB[11] = inputSampleR; inputSampleR = outSampleR; biquadB[14] = biquadB[13]; biquadB[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleBL)*trim;
lastSampleBL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * bWet) + (lastSampleAL * (1.0-bWet));
dryStageBL = inputSampleL = (inputSampleL * bWet) + (dryStageAL * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
outSampleR = (inputSampleR - lastSampleBR)*trim;
lastSampleBR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * bWet) + (lastSampleAR * (1.0-bWet));
dryStageBR = inputSampleR = (inputSampleR * bWet) + (dryStageAR * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
}
@ -262,20 +280,26 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
biquadC[12] = biquadC[11]; biquadC[11] = inputSampleR; inputSampleR = outSampleR; biquadC[14] = biquadC[13]; biquadC[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleCL)*trim;
lastSampleCL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * cWet) + (lastSampleBL * (1.0-cWet));
inputSampleL = (inputSampleL * cWet) + (dryStageBL * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
outSampleR = (inputSampleR - lastSampleCR)*trim;
lastSampleCR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * cWet) + (lastSampleBR * (1.0-cWet));
inputSampleR = (inputSampleR * cWet) + (dryStageBR * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
}
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
if (aWet > 0.0) {
dryFinalBiquadL = inputSampleL;
dryFinalBiquadR = inputSampleR;
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
inputSampleL = (inputSampleL * aWet) + (dryFinalBiquadL * (1.0-aWet));
inputSampleR = (inputSampleR * aWet) + (dryFinalBiquadR * (1.0-aWet));
}
if (inputSampleL > 1.0) inputSampleL = 1.0;
if (inputSampleL < -1.0) inputSampleL = -1.0;

View file

@ -96,7 +96,7 @@ float SlewSonic::getParameter(VstInt32 index) {
void SlewSonic::getParameterName(VstInt32 index, char *text) {
switch (index) {
case kParamA: vst_strncpy (text, "Freq", kVstMaxParamStrLen); break;
case kParamA: vst_strncpy (text, "Mute", kVstMaxParamStrLen); break;
case kParamB: vst_strncpy (text, "Bright", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} //this is our labels for displaying in the VST host
@ -104,7 +104,7 @@ void SlewSonic::getParameterName(VstInt32 index, char *text) {
void SlewSonic::getParameterDisplay(VstInt32 index, char *text) {
switch (index) {
case kParamA: float2string ((A*20.0)+10.0, text, kVstMaxParamStrLen); break;
case kParamA: float2string ((A*20.0)+5.0, text, kVstMaxParamStrLen); break;
case kParamB: float2string (B, text, kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} //this displays the values and handles 'popups' where it's discrete choices

View file

@ -15,7 +15,7 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
float* out2 = outputs[1];
double trim = 2.302585092994045684017991; //natural logarithm of 10
double freq = ((A*20000.0)+10000.0) / getSampleRate();
double freq = ((A*20000.0)+5000.0) / getSampleRate();
if (freq > 0.499) freq = 0.499;
biquadD[0] = biquadC[0] = biquadB[0] = biquadA[0] = freq;
biquadA[1] = 2.24697960; //tenth order Butterworth out of five biquads
@ -57,11 +57,11 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
double aWet = 0.0;
double bWet = 0.0;
double cWet = B;
double cWet = B * 3.0;
//eight-stage wet/dry control using progressive stages that bypass when not engaged
if (cWet < 1.0) {aWet = cWet; cWet = 0.0;}
else if (cWet < 2.0) {bWet = cWet - 1.0; aWet = 1.0; cWet = 0.0;}
else {cWet -= 7.0; cWet = bWet = aWet = 1.0;}
else {cWet -= 2.0; bWet = aWet = 1.0;}
//this is one way to make a little set of dry/wet stages that are successively added to the
//output as the control is turned up. Each one independently goes from 0-1 and stays at 1
//beyond that point: this is a way to progressively add a 'black box' sound processing
@ -75,6 +75,12 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17;
double drySampleL = inputSampleL;
double drySampleR = inputSampleR;
double dryStageAL = 0.0;
double dryStageBL = 0.0;
double dryStageAR = 0.0;
double dryStageBR = 0.0;
double dryFinalBiquadL = 0.0;
double dryFinalBiquadR = 0.0;
double outSampleL = 0.0;
double outSampleR = 0.0;
@ -85,11 +91,11 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
biquadA[12] = biquadA[11]; biquadA[11] = inputSampleR; inputSampleR = outSampleR; biquadA[14] = biquadA[13]; biquadA[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleAL)*trim;
lastSampleAL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
dryStageAL = inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
outSampleR = (inputSampleR - lastSampleAR)*trim;
lastSampleAR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
dryStageAR = inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
}
@ -100,11 +106,11 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
biquadB[12] = biquadB[11]; biquadB[11] = inputSampleR; inputSampleR = outSampleR; biquadB[14] = biquadB[13]; biquadB[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleBL)*trim;
lastSampleBL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * bWet) + (lastSampleAL * (1.0-bWet));
dryStageBL = inputSampleL = (inputSampleL * bWet) + (dryStageAL * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
outSampleR = (inputSampleR - lastSampleBR)*trim;
lastSampleBR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * bWet) + (lastSampleAR * (1.0-bWet));
dryStageBR = inputSampleR = (inputSampleR * bWet) + (dryStageAR * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
}
@ -115,20 +121,26 @@ void SlewSonic::processReplacing(float **inputs, float **outputs, VstInt32 sampl
biquadC[12] = biquadC[11]; biquadC[11] = inputSampleR; inputSampleR = outSampleR; biquadC[14] = biquadC[13]; biquadC[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleCL)*trim;
lastSampleCL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * cWet) + (lastSampleBL * (1.0-cWet));
inputSampleL = (inputSampleL * cWet) + (dryStageBL * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
outSampleR = (inputSampleR - lastSampleCR)*trim;
lastSampleCR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * cWet) + (lastSampleBR * (1.0-cWet));
inputSampleR = (inputSampleR * cWet) + (dryStageBR * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
}
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
if (aWet > 0.0) {
dryFinalBiquadL = inputSampleL;
dryFinalBiquadR = inputSampleR;
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
inputSampleL = (inputSampleL * aWet) + (dryFinalBiquadL * (1.0-aWet));
inputSampleR = (inputSampleR * aWet) + (dryFinalBiquadR * (1.0-aWet));
}
if (inputSampleL > 1.0) inputSampleL = 1.0;
if (inputSampleL < -1.0) inputSampleL = -1.0;
@ -162,7 +174,7 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
double* out2 = outputs[1];
double trim = 2.302585092994045684017991; //natural logarithm of 10
double freq = ((A*20000.0)+10000.0) / getSampleRate();
double freq = ((A*20000.0)+5000.0) / getSampleRate();
if (freq > 0.499) freq = 0.499;
biquadD[0] = biquadC[0] = biquadB[0] = biquadA[0] = freq;
biquadA[1] = 2.24697960; //tenth order Butterworth out of five biquads
@ -204,11 +216,11 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
double aWet = 0.0;
double bWet = 0.0;
double cWet = B;
double cWet = B * 3.0;
//eight-stage wet/dry control using progressive stages that bypass when not engaged
if (cWet < 1.0) {aWet = cWet; cWet = 0.0;}
else if (cWet < 2.0) {bWet = cWet - 1.0; aWet = 1.0; cWet = 0.0;}
else {cWet -= 7.0; cWet = bWet = aWet = 1.0;}
else {cWet -= 2.0; bWet = aWet = 1.0;}
//this is one way to make a little set of dry/wet stages that are successively added to the
//output as the control is turned up. Each one independently goes from 0-1 and stays at 1
//beyond that point: this is a way to progressively add a 'black box' sound processing
@ -222,6 +234,12 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17;
double drySampleL = inputSampleL;
double drySampleR = inputSampleR;
double dryStageAL = 0.0;
double dryStageBL = 0.0;
double dryStageAR = 0.0;
double dryStageBR = 0.0;
double dryFinalBiquadL = 0.0;
double dryFinalBiquadR = 0.0;
double outSampleL = 0.0;
double outSampleR = 0.0;
@ -232,11 +250,11 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
biquadA[12] = biquadA[11]; biquadA[11] = inputSampleR; inputSampleR = outSampleR; biquadA[14] = biquadA[13]; biquadA[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleAL)*trim;
lastSampleAL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
dryStageAL = inputSampleL = (inputSampleL * aWet) + (drySampleL * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
outSampleR = (inputSampleR - lastSampleAR)*trim;
lastSampleAR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
dryStageAR = inputSampleR = (inputSampleR * aWet) + (drySampleR * (1.0-aWet));
//first stage always runs, dry/wet between raw signal and this
}
@ -247,11 +265,11 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
biquadB[12] = biquadB[11]; biquadB[11] = inputSampleR; inputSampleR = outSampleR; biquadB[14] = biquadB[13]; biquadB[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleBL)*trim;
lastSampleBL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * bWet) + (lastSampleAL * (1.0-bWet));
dryStageBL = inputSampleL = (inputSampleL * bWet) + (dryStageAL * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
outSampleR = (inputSampleR - lastSampleBR)*trim;
lastSampleBR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * bWet) + (lastSampleAR * (1.0-bWet));
dryStageBR = inputSampleR = (inputSampleR * bWet) + (dryStageAR * (1.0-bWet));
//second stage adds upon first stage, crossfade between them
}
@ -262,20 +280,26 @@ void SlewSonic::processDoubleReplacing(double **inputs, double **outputs, VstInt
biquadC[12] = biquadC[11]; biquadC[11] = inputSampleR; inputSampleR = outSampleR; biquadC[14] = biquadC[13]; biquadC[13] = inputSampleR; //DF1 right
outSampleL = (inputSampleL - lastSampleCL)*trim;
lastSampleCL = inputSampleL; inputSampleL = outSampleL;
inputSampleL = (inputSampleL * cWet) + (lastSampleBL * (1.0-cWet));
inputSampleL = (inputSampleL * cWet) + (dryStageBL * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
outSampleR = (inputSampleR - lastSampleCR)*trim;
lastSampleCR = inputSampleR; inputSampleR = outSampleR;
inputSampleR = (inputSampleR * cWet) + (lastSampleBR * (1.0-cWet));
inputSampleR = (inputSampleR * cWet) + (dryStageBR * (1.0-cWet));
//third stage adds upon second stage, crossfade between them
}
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
if (aWet > 0.0) {
dryFinalBiquadL = inputSampleL;
dryFinalBiquadR = inputSampleR;
outSampleL = biquadD[2]*inputSampleL+biquadD[3]*biquadD[7]+biquadD[4]*biquadD[8]-biquadD[5]*biquadD[9]-biquadD[6]*biquadD[10];
biquadD[8] = biquadD[7]; biquadD[7] = inputSampleL; inputSampleL = outSampleL; biquadD[10] = biquadD[9]; biquadD[9] = inputSampleL; //DF1 left
outSampleR = biquadD[2]*inputSampleR+biquadD[3]*biquadD[11]+biquadD[4]*biquadD[12]-biquadD[5]*biquadD[13]-biquadD[6]*biquadD[14];
biquadD[12] = biquadD[11]; biquadD[11] = inputSampleR; inputSampleR = outSampleR; biquadD[14] = biquadD[13]; biquadD[13] = inputSampleR; //DF1 right
//final post-slew-only stage always runs, minimum of one stage on dry and two on single slew-only
inputSampleL = (inputSampleL * aWet) + (dryFinalBiquadL * (1.0-aWet));
inputSampleR = (inputSampleR * aWet) + (dryFinalBiquadR * (1.0-aWet));
}
if (inputSampleL > 1.0) inputSampleL = 1.0;
if (inputSampleL < -1.0) inputSampleL = -1.0;

View file

@ -256,6 +256,7 @@ Slew is a slew clipper, which darkens treble in an unusual way.
Slew2 works like a de-esser or acceleration limiter: controls extreme highs.
Slew3 is a new approach to slew clipping meant for a more analog-like darkening effect.
SlewOnly is a mix check plugin that shows you only the extreme highs.
SlewSonic combines SlewOnly with ultrasonic filtering to solo brightness.
Smooth can tame pointy sounds or make drums explode.
SoftGate is a gate that can mute hiss and smooth sample tails.
SpatializeDither is a high-performance clarity and accuracy dither.