136 lines
2.6 KiB
C++
136 lines
2.6 KiB
C++
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
#define ID 0x50F7BA11
|
|
#define LABEL "crap_tube"
|
|
#define NAME "crap Tube Distortion"
|
|
#define AUTHOR "Connor Olding"
|
|
#define COPYRIGHT "MIT"
|
|
#define PARAMETERS 2
|
|
|
|
#define OVERSAMPLING 2
|
|
#define BLOCK_SIZE 256
|
|
#define FULL_SIZE (BLOCK_SIZE*OVERSAMPLING)
|
|
|
|
#include "util.hpp"
|
|
#include "param.hpp"
|
|
#include "os2piir_stereo.hpp"
|
|
|
|
typedef struct {
|
|
double desired, actual, speed;
|
|
int log; // use multiplication instead of addition for speed
|
|
} smoothval;
|
|
|
|
typedef struct {
|
|
halfband_t hb_up, hb_down;
|
|
smoothval drive, wet;
|
|
} personal;
|
|
|
|
INNER double
|
|
smooth(smoothval *val)
|
|
{
|
|
double a = val->actual;
|
|
double d = val->desired;
|
|
double s = val->speed;
|
|
double l = val->log;
|
|
if (a < d) {
|
|
if (l) a *= s;
|
|
else a += s;
|
|
if (a > d) a = d;
|
|
} else if (a > d) {
|
|
if (l) a /= s;
|
|
else a -= s;
|
|
if (a < d) a = d;
|
|
}
|
|
val->actual = a;
|
|
return a;
|
|
}
|
|
|
|
INNER CONST v2df
|
|
distort(v2df x)
|
|
{
|
|
return (V(27.)*x + V(9.)) / (V(9.)*x*x + V(6.)*x + V(19.)) - V(9./19.);
|
|
}
|
|
|
|
INNER CONST v2df
|
|
process_one(v2df x, v2df drive, v2df wet)
|
|
{
|
|
return (distort(x*drive)/drive*V(0.79) - x)*wet + x;
|
|
}
|
|
|
|
static void
|
|
process_double(personal *data,
|
|
double *in_L, double *in_R,
|
|
double *out_L, double *out_R,
|
|
ulong count)
|
|
#include "process_nonlinear.hpp"
|
|
|
|
static void
|
|
process(personal *data,
|
|
float *in_L, float *in_R,
|
|
float *out_L, float *out_R,
|
|
ulong count)
|
|
#include "process_nonlinear.hpp"
|
|
|
|
INNER void
|
|
resume(personal *data)
|
|
{
|
|
memset(&data->hb_up, 0, sizeof(halfband_t));
|
|
memset(&data->hb_down, 0, sizeof(halfband_t));
|
|
}
|
|
|
|
INNER void
|
|
pause(personal *data)
|
|
{}
|
|
|
|
INNER void
|
|
construct(personal *data)
|
|
{
|
|
memset(data, 0, sizeof(personal));
|
|
}
|
|
|
|
INNER void
|
|
construct_params(param *params)
|
|
{
|
|
sprintf(params[0].name, "Drive");
|
|
params[0].min = -30;
|
|
params[0].max = 15;
|
|
params[0].scale = SCALE_DB;
|
|
params[0].def = DEFAULT_0;
|
|
|
|
sprintf(params[1].name, "Wetness");
|
|
params[1].min = 0;
|
|
params[1].max = 1;
|
|
params[1].scale = SCALE_FLOAT;
|
|
params[1].def = DEFAULT_1;
|
|
|
|
param_reset(¶ms[0]);
|
|
param_reset(¶ms[1]);
|
|
}
|
|
|
|
INNER void
|
|
destruct(personal *data)
|
|
{}
|
|
|
|
INNER void
|
|
adjust(personal *data, param *params, ulong fs_long)
|
|
{
|
|
resume(data);
|
|
double fs = fs_long;
|
|
data->drive.desired = DB2LIN(params[0].value);
|
|
data->wet.desired = params[1].value;
|
|
data->drive.actual = data->drive.desired;
|
|
data->wet.actual = data->wet.desired;
|
|
data->drive.speed = 1 + 20/fs/OVERSAMPLING;
|
|
data->wet.speed = 20/fs/OVERSAMPLING;
|
|
data->drive.log = 1;
|
|
data->wet.log = 0;
|
|
}
|
|
|
|
INNER void
|
|
adjust_one(personal *data, param *params, unsigned int index)
|
|
{
|
|
data->drive.desired = DB2LIN(params[0].value);
|
|
data->wet.desired = params[1].value;
|
|
}
|