/* ======================================== * Pressure4 - Pressure4.h * Copyright (c) 2016 airwindows, Airwindows uses the MIT license * ======================================== */ #ifndef __Pressure4_H #include "Pressure4.h" #endif void Pressure4::processReplacing(float **inputs, float **outputs, VstInt32 sampleFrames) { float* inputL = inputs[0]; float* inputR = inputs[1]; float* outputL = outputs[0]; float* outputR = outputs[1]; double overallscale = 1.0; overallscale /= 44100.0; overallscale *= getSampleRate(); double threshold = 1.0 - (A * 0.95); double muMakeupGain = 1.0 / threshold; //gain settings around threshold double release = pow((1.28-B),5)*32768.0; release /= overallscale; double fastest = sqrt(release); //speed settings around release double bridgerectifier; double coefficient; double inputSense; double mewiness = (C*2.0)-1.0; double unmewiness; double outputGain = D; bool positivemu; if (mewiness >= 0) { positivemu = true; unmewiness = 1.0-mewiness; } else { positivemu = false; mewiness = -mewiness; unmewiness = 1.0-mewiness; } // µ µ µ µ µ µ µ µ µ µ µ µ is the kitten song o/~ double inputSampleL; double inputSampleR; while (--sampleFrames >= 0) { inputSampleL = *inputL; inputSampleR = *inputR; if (fabs(inputSampleL)<1.18e-23) inputSampleL = fpdL * 1.18e-17; if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17; inputSampleL = inputSampleL * muMakeupGain; inputSampleR = inputSampleR * muMakeupGain; inputSense = fabs(inputSampleL); if (fabs(inputSampleR) > inputSense) inputSense = fabs(inputSampleR); //we will take the greater of either channel and just use that, then apply the result //to both stereo channels. if (flip) { if (inputSense > threshold) { muVary = threshold / inputSense; muAttack = sqrt(fabs(muSpeedA)); muCoefficientA = muCoefficientA * (muAttack-1.0); if (muVary < threshold) { muCoefficientA = muCoefficientA + threshold; } else { muCoefficientA = muCoefficientA + muVary; } muCoefficientA = muCoefficientA / muAttack; } else { muCoefficientA = muCoefficientA * ((muSpeedA * muSpeedA)-1.0); muCoefficientA = muCoefficientA + 1.0; muCoefficientA = muCoefficientA / (muSpeedA * muSpeedA); } muNewSpeed = muSpeedA * (muSpeedA-1); muNewSpeed = muNewSpeed + fabs(inputSense*release)+fastest; muSpeedA = muNewSpeed / muSpeedA; } else { if (inputSense > threshold) { muVary = threshold / inputSense; muAttack = sqrt(fabs(muSpeedB)); muCoefficientB = muCoefficientB * (muAttack-1); if (muVary < threshold) { muCoefficientB = muCoefficientB + threshold; } else { muCoefficientB = muCoefficientB + muVary; } muCoefficientB = muCoefficientB / muAttack; } else { muCoefficientB = muCoefficientB * ((muSpeedB * muSpeedB)-1.0); muCoefficientB = muCoefficientB + 1.0; muCoefficientB = muCoefficientB / (muSpeedB * muSpeedB); } muNewSpeed = muSpeedB * (muSpeedB-1); muNewSpeed = muNewSpeed + fabs(inputSense*release)+fastest; muSpeedB = muNewSpeed / muSpeedB; } //got coefficients, adjusted speeds if (flip) { if (positivemu) coefficient = pow(muCoefficientA,2); else coefficient = sqrt(muCoefficientA); coefficient = (coefficient*mewiness)+(muCoefficientA*unmewiness); inputSampleL *= coefficient; inputSampleR *= coefficient; } else { if (positivemu) coefficient = pow(muCoefficientB,2); else coefficient = sqrt(muCoefficientB); coefficient = (coefficient*mewiness)+(muCoefficientB*unmewiness); inputSampleL *= coefficient; inputSampleR *= coefficient; } //applied compression with vari-vari-µ-µ-µ-µ-µ-µ-is-the-kitten-song o/~ //applied gain correction to control output level- tends to constrain sound rather than inflate it if (outputGain != 1.0) { inputSampleL *= outputGain; inputSampleR *= outputGain; } bridgerectifier = fabs(inputSampleL); if (bridgerectifier > 1.57079633) bridgerectifier = 1.0; else bridgerectifier = sin(bridgerectifier); if (inputSampleL > 0){inputSampleL = bridgerectifier;} else {inputSampleL = -bridgerectifier;} //second stage of overdrive to prevent overs and allow bloody loud extremeness bridgerectifier = fabs(inputSampleR); if (bridgerectifier > 1.57079633) bridgerectifier = 1.0; else bridgerectifier = sin(bridgerectifier); if (inputSampleR > 0){inputSampleR = bridgerectifier;} else {inputSampleR = -bridgerectifier;} //second stage of overdrive to prevent overs and allow bloody loud extremeness //begin 32 bit stereo floating point dither int expon; frexpf((float)inputSampleL, &expon); fpdL ^= fpdL << 13; fpdL ^= fpdL >> 17; fpdL ^= fpdL << 5; inputSampleL += ((double(fpdL)-uint32_t(0x7fffffff)) * 5.5e-36l * pow(2,expon+62)); frexpf((float)inputSampleR, &expon); fpdR ^= fpdR << 13; fpdR ^= fpdR >> 17; fpdR ^= fpdR << 5; inputSampleR += ((double(fpdR)-uint32_t(0x7fffffff)) * 5.5e-36l * pow(2,expon+62)); //end 32 bit stereo floating point dither *outputL = inputSampleL; *outputR = inputSampleR; *inputL++; *inputR++; *outputL++; *outputR++; } } void Pressure4::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sampleFrames) { double* inputL = inputs[0]; double* inputR = inputs[1]; double* outputL = outputs[0]; double* outputR = outputs[1]; double overallscale = 1.0; overallscale /= 44100.0; overallscale *= getSampleRate(); double threshold = 1.0 - (A * 0.95); double muMakeupGain = 1.0 / threshold; //gain settings around threshold double release = pow((1.28-B),5)*32768.0; release /= overallscale; double fastest = sqrt(release); //speed settings around release double bridgerectifier; double coefficient; double inputSense; double mewiness = (C*2.0)-1.0; double unmewiness; double outputGain = D; bool positivemu; if (mewiness >= 0) { positivemu = true; unmewiness = 1.0-mewiness; } else { positivemu = false; mewiness = -mewiness; unmewiness = 1.0-mewiness; } // µ µ µ µ µ µ µ µ µ µ µ µ is the kitten song o/~ double inputSampleL; double inputSampleR; while (--sampleFrames >= 0) { inputSampleL = *inputL; inputSampleR = *inputR; if (fabs(inputSampleL)<1.18e-23) inputSampleL = fpdL * 1.18e-17; if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17; inputSampleL = inputSampleL * muMakeupGain; inputSampleR = inputSampleR * muMakeupGain; inputSense = fabs(inputSampleL); if (fabs(inputSampleR) > inputSense) inputSense = fabs(inputSampleR); //we will take the greater of either channel and just use that, then apply the result //to both stereo channels. if (flip) { if (inputSense > threshold) { muVary = threshold / inputSense; muAttack = sqrt(fabs(muSpeedA)); muCoefficientA = muCoefficientA * (muAttack-1.0); if (muVary < threshold) { muCoefficientA = muCoefficientA + threshold; } else { muCoefficientA = muCoefficientA + muVary; } muCoefficientA = muCoefficientA / muAttack; } else { muCoefficientA = muCoefficientA * ((muSpeedA * muSpeedA)-1.0); muCoefficientA = muCoefficientA + 1.0; muCoefficientA = muCoefficientA / (muSpeedA * muSpeedA); } muNewSpeed = muSpeedA * (muSpeedA-1); muNewSpeed = muNewSpeed + fabs(inputSense*release)+fastest; muSpeedA = muNewSpeed / muSpeedA; } else { if (inputSense > threshold) { muVary = threshold / inputSense; muAttack = sqrt(fabs(muSpeedB)); muCoefficientB = muCoefficientB * (muAttack-1); if (muVary < threshold) { muCoefficientB = muCoefficientB + threshold; } else { muCoefficientB = muCoefficientB + muVary; } muCoefficientB = muCoefficientB / muAttack; } else { muCoefficientB = muCoefficientB * ((muSpeedB * muSpeedB)-1.0); muCoefficientB = muCoefficientB + 1.0; muCoefficientB = muCoefficientB / (muSpeedB * muSpeedB); } muNewSpeed = muSpeedB * (muSpeedB-1); muNewSpeed = muNewSpeed + fabs(inputSense*release)+fastest; muSpeedB = muNewSpeed / muSpeedB; } //got coefficients, adjusted speeds if (flip) { if (positivemu) coefficient = pow(muCoefficientA,2); else coefficient = sqrt(muCoefficientA); coefficient = (coefficient*mewiness)+(muCoefficientA*unmewiness); inputSampleL *= coefficient; inputSampleR *= coefficient; } else { if (positivemu) coefficient = pow(muCoefficientB,2); else coefficient = sqrt(muCoefficientB); coefficient = (coefficient*mewiness)+(muCoefficientB*unmewiness); inputSampleL *= coefficient; inputSampleR *= coefficient; } //applied compression with vari-vari-µ-µ-µ-µ-µ-µ-is-the-kitten-song o/~ //applied gain correction to control output level- tends to constrain sound rather than inflate it if (outputGain != 1.0) { inputSampleL *= outputGain; inputSampleR *= outputGain; } bridgerectifier = fabs(inputSampleL); if (bridgerectifier > 1.57079633) bridgerectifier = 1.0; else bridgerectifier = sin(bridgerectifier); if (inputSampleL > 0){inputSampleL = bridgerectifier;} else {inputSampleL = -bridgerectifier;} //second stage of overdrive to prevent overs and allow bloody loud extremeness bridgerectifier = fabs(inputSampleR); if (bridgerectifier > 1.57079633) bridgerectifier = 1.0; else bridgerectifier = sin(bridgerectifier); if (inputSampleR > 0){inputSampleR = bridgerectifier;} else {inputSampleR = -bridgerectifier;} //second stage of overdrive to prevent overs and allow bloody loud extremeness //begin 64 bit stereo floating point dither //int expon; frexp((double)inputSampleL, &expon); fpdL ^= fpdL << 13; fpdL ^= fpdL >> 17; fpdL ^= fpdL << 5; //inputSampleL += ((double(fpdL)-uint32_t(0x7fffffff)) * 1.1e-44l * pow(2,expon+62)); //frexp((double)inputSampleR, &expon); fpdR ^= fpdR << 13; fpdR ^= fpdR >> 17; fpdR ^= fpdR << 5; //inputSampleR += ((double(fpdR)-uint32_t(0x7fffffff)) * 1.1e-44l * pow(2,expon+62)); //end 64 bit stereo floating point dither *outputL = inputSampleL; *outputR = inputSampleR; *inputL++; *inputR++; *outputL++; *outputR++; } }