airwindows/plugins/MacSignedVST/LRFlipTimer/source/LRFlipTimerProc.cpp
2022-11-21 09:20:21 -05:00

152 lines
4.5 KiB
C++
Executable file

/* ========================================
* LRFlipTimer - LRFlipTimer.h
* Copyright (c) 2016 airwindows, Airwindows uses the MIT license
* ======================================== */
#ifndef __LRFlipTimer_H
#include "LRFlipTimer.h"
#endif
void LRFlipTimer::processReplacing(float **inputs, float **outputs, VstInt32 sampleFrames)
{
float* in1 = inputs[0];
float* in2 = inputs[1];
float* out1 = outputs[0];
float* out2 = outputs[1];
uint32_t time = (uint32_t)(((A*9.0)+1.0) * 60.0 * getSampleRate());
uint32_t transition = (uint32_t)(getSampleRate()*0.1);
//number of minutes * 60 seconds * samples per second
//transition: tenth of a second crossfade
while (--sampleFrames >= 0)
{
float inputSampleL = *in1;
float inputSampleR = *in2;
float outputSampleL = inputSampleL;
float outputSampleR = inputSampleR;
tick++;
if (tick > time*2) tick = 0;
if (tick < time) {
if (tick < transition) {
double crossfade;
crossfade = tick;
crossfade /= transition;
//0 to 1 from beginning swapped to end as direct stereo out
if (crossfade < 0.5) {
outputSampleL = (inputSampleL*crossfade)+(inputSampleR*(1.0-crossfade));
outputSampleR = (inputSampleR*crossfade)+(inputSampleL*(1.0-crossfade));
} else {
crossfade = fabs(crossfade-1.0);
outputSampleL = (inputSampleR*crossfade)+(inputSampleL*(1.0-crossfade));
outputSampleR = (inputSampleL*crossfade)+(inputSampleR*(1.0-crossfade));
}
} else {
outputSampleL = inputSampleL;
outputSampleR = inputSampleR;
//direct stereo out
}
} else {
if ((tick - time) < transition) {
double crossfade;
crossfade = tick-time;
crossfade /= transition;
//0 to 1 from beginning direct to end as swapped stereo
if (crossfade < 0.5) {
outputSampleL = (inputSampleR*crossfade)+(inputSampleL*(1.0-crossfade));
outputSampleR = (inputSampleL*crossfade)+(inputSampleR*(1.0-crossfade));
} else {
crossfade = fabs(crossfade-1.0);
outputSampleL = (inputSampleL*crossfade)+(inputSampleR*(1.0-crossfade));
outputSampleR = (inputSampleR*crossfade)+(inputSampleL*(1.0-crossfade));
}
} else {
outputSampleL = inputSampleR;
outputSampleR = inputSampleL;
//swapped stereo out
}
}
*out1 = outputSampleL;
*out2 = outputSampleR;
*in1++;
*in2++;
*out1++;
*out2++;
}
}
void LRFlipTimer::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sampleFrames)
{
double* in1 = inputs[0];
double* in2 = inputs[1];
double* out1 = outputs[0];
double* out2 = outputs[1];
uint32_t time = (uint32_t)(((A*9.0)+1.0) * 60.0 * getSampleRate());
uint32_t transition = (uint32_t)(getSampleRate()*0.1);
//number of minutes * 60 seconds * samples per second
//transition: tenth of a second crossfade
while (--sampleFrames >= 0)
{
double inputSampleL = *in1;
double inputSampleR = *in2;
double outputSampleL = inputSampleL;
double outputSampleR = inputSampleR;
tick++;
if (tick > time*2) tick = 0;
if (tick < time) {
if (tick < transition) {
double crossfade;
crossfade = tick;
crossfade /= transition;
//0 to 1 from beginning swapped to end as direct stereo out
if (crossfade < 0.5) {
outputSampleL = (inputSampleL*crossfade)+(inputSampleR*(1.0-crossfade));
outputSampleR = (inputSampleR*crossfade)+(inputSampleL*(1.0-crossfade));
} else {
crossfade = fabs(crossfade-1.0);
outputSampleL = (inputSampleR*crossfade)+(inputSampleL*(1.0-crossfade));
outputSampleR = (inputSampleL*crossfade)+(inputSampleR*(1.0-crossfade));
}
} else {
outputSampleL = inputSampleL;
outputSampleR = inputSampleR;
//direct stereo out
}
} else {
if ((tick - time) < transition) {
double crossfade;
crossfade = tick-time;
crossfade /= transition;
//0 to 1 from beginning direct to end as swapped stereo
if (crossfade < 0.5) {
outputSampleL = (inputSampleR*crossfade)+(inputSampleL*(1.0-crossfade));
outputSampleR = (inputSampleL*crossfade)+(inputSampleR*(1.0-crossfade));
} else {
crossfade = fabs(crossfade-1.0);
outputSampleL = (inputSampleL*crossfade)+(inputSampleR*(1.0-crossfade));
outputSampleR = (inputSampleR*crossfade)+(inputSampleL*(1.0-crossfade));
}
} else {
outputSampleL = inputSampleR;
outputSampleR = inputSampleL;
//swapped stereo out
}
}
*out1 = outputSampleL;
*out2 = outputSampleR;
*in1++;
*in2++;
*out1++;
*out2++;
}
}