You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

214 lines
5.8 KiB

4 years ago
#include "drip.h"
#include <math.h>
#include <cstdlib>
#include "../utility/dsp.h"
using namespace daisysp;
#define WUTR_SOUND_DECAY 0.95f
#define WUTR_SYSTEM_DECAY 0.996f
#define WUTR_GAIN 1.0f
#define WUTR_NUM_SOURCES 10.0f
#define WUTR_CENTER_FREQ0 450.0f
#define WUTR_CENTER_FREQ1 600.0f
#define WUTR_CENTER_FREQ2 750.0f
#define WUTR_RESON 0.9985f
#define WUTR_FREQ_SWEEP 1.0001f
#define MAX_SHAKE 2000.0f
int Drip::my_random(int max)
{
return (rand() % (max + 1));
}
float Drip::noise_tick()
{
float temp;
temp = 1.0f * rand() - 1073741823.5f;
return temp * (1.0f / 1073741823.0f);
}
void Drip::Init(float sample_rate, float dettack)
{
sample_rate_ = sample_rate;
float temp;
dettack_ = dettack;
num_tubes_ = 10;
damp_ = 0.2f;
shake_max_ = 0.0f;
freq_ = 450.0f;
freq1_ = 600.0f;
freq2_ = 720.0f;
amp_ = 0.3f;
snd_level_ = 0.0;
float tpidsr = 2.0 * PI_F / sample_rate_;
kloop_ = (sample_rate_ * dettack_);
outputs00_ = 0.0f;
outputs01_ = 0.0f;
outputs10_ = 0.0f;
outputs11_ = 0.0f;
outputs20_ = 0.0f;
outputs21_ = 0.0f;
total_energy_ = 0.0f;
center_freqs0_ = res_freq0_ = WUTR_CENTER_FREQ0;
center_freqs1_ = res_freq1_ = WUTR_CENTER_FREQ1;
center_freqs2_ = res_freq2_ = WUTR_CENTER_FREQ2;
num_objects_save_ = num_objects_ = WUTR_NUM_SOURCES;
sound_decay_ = WUTR_SOUND_DECAY;
system_decay_ = WUTR_SYSTEM_DECAY;
temp = logf(WUTR_NUM_SOURCES) * WUTR_GAIN / WUTR_NUM_SOURCES;
gains0_ = gains1_ = gains2_ = temp;
coeffs01_ = WUTR_RESON * WUTR_RESON;
coeffs00_ = -WUTR_RESON * 2.0f * cosf(WUTR_CENTER_FREQ0 * tpidsr);
coeffs11_ = WUTR_RESON * WUTR_RESON;
coeffs10_ = -WUTR_RESON * 2.0f * cosf(WUTR_CENTER_FREQ1 * tpidsr);
coeffs21_ = WUTR_RESON * WUTR_RESON;
coeffs20_ = -WUTR_RESON * 2.0f * cosf(WUTR_CENTER_FREQ2 * tpidsr);
shake_energy_ = amp_ * 1.0f * MAX_SHAKE * 0.1f;
shake_damp_ = 0.0f;
if(shake_energy_ > MAX_SHAKE)
shake_energy_ = MAX_SHAKE;
shake_max_save_ = 0.0f;
num_objects_ = 10.0f;
finalZ0_ = finalZ1_ = finalZ2_ = 0.0f;
}
float Drip::Process(bool trig)
{
float data;
float lastOutput;
float tpidsr = 2.0f * PI_F / sample_rate_;
if(trig)
{
Init(sample_rate_, dettack_);
}
if(num_tubes_ != 0.0f && num_tubes_ != num_objects_)
{
num_objects_ = num_tubes_;
if(num_objects_ < 1.0f)
{
num_objects_ = 1.0f;
}
}
if(freq_ != 0.0f && freq_ != res_freq0_)
{
res_freq0_ = freq_;
coeffs00_ = -WUTR_RESON * 2.0f * cosf(res_freq0_ * tpidsr);
}
if(damp_ != 0.0f && damp_ != shake_damp_)
{
shake_damp_ = damp_;
system_decay_ = WUTR_SYSTEM_DECAY + (shake_damp_ * 0.002f);
}
if(shake_max_ != 0.0f && shake_max_ != shake_max_save_)
{
shake_max_save_ = shake_max_;
shake_energy_ += shake_max_save_ * MAX_SHAKE * 0.1f;
if(shake_energy_ > MAX_SHAKE)
shake_energy_ = MAX_SHAKE;
}
if(freq1_ != 0.0f && freq1_ != res_freq1_)
{
res_freq1_ = freq1_;
coeffs10_ = -WUTR_RESON * 2.0f * cosf(res_freq1_ * tpidsr);
}
if(freq2_ != 0.0f && freq2_ != res_freq2_)
{
res_freq2_ = freq2_;
coeffs20_ = -WUTR_RESON * 2.0f * cosf(res_freq2_ * tpidsr);
}
if((--kloop_) == 0.0f)
{
shake_energy_ = 0.0f;
}
float shakeEnergy = shake_energy_;
float systemDecay = system_decay_;
float sndLevel = snd_level_;
float num_objects = num_objects_;
float soundDecay = sound_decay_;
float inputs0, inputs1, inputs2;
shakeEnergy *= systemDecay; /* Exponential system decay */
sndLevel = shakeEnergy;
if(my_random(32767) < num_objects)
{
int j;
j = my_random(3);
if(j == 0)
{
center_freqs0_ = res_freq1_ * (0.75f + (0.25f * noise_tick()));
gains0_ = fabsf(noise_tick());
}
else if(j == 1)
{
center_freqs1_ = res_freq1_ * (1.0f + (0.25f * noise_tick()));
gains1_ = fabsf(noise_tick());
}
else
{
center_freqs2_ = res_freq1_ * (1.25f + (0.25f * noise_tick()));
gains2_ = fabsf(noise_tick());
}
}
gains0_ *= WUTR_RESON;
if(gains0_ > 0.001f)
{
center_freqs0_ *= WUTR_FREQ_SWEEP;
coeffs00_ = -WUTR_RESON * 2.0f * cosf(center_freqs0_ * tpidsr);
}
gains1_ *= WUTR_RESON;
if(gains1_ > 0.00f)
{
center_freqs1_ *= WUTR_FREQ_SWEEP;
coeffs10_ = -WUTR_RESON * 2.0f * cosf(center_freqs1_ * tpidsr);
}
gains2_ *= WUTR_RESON;
if(gains2_ > 0.001f)
{
center_freqs2_ *= WUTR_FREQ_SWEEP;
coeffs20_ = -WUTR_RESON * 2.0f * cosf(center_freqs2_ * tpidsr);
}
sndLevel *= soundDecay;
inputs0 = sndLevel;
inputs0 *= noise_tick();
inputs1 = inputs0 * gains1_;
inputs2 = inputs0 * gains2_;
inputs0 *= gains0_;
inputs0 -= outputs00_ * coeffs00_;
inputs0 -= outputs01_ * coeffs01_;
outputs01_ = outputs00_;
outputs00_ = inputs0;
data = gains0_ * outputs00_;
inputs1 -= outputs10_ * coeffs10_;
inputs1 -= outputs11_ * coeffs11_;
outputs11_ = outputs10_;
outputs10_ = inputs1_;
data += gains1_ * outputs10_;
inputs2 -= outputs20_ * coeffs20_;
inputs2 -= outputs21_ * coeffs21_;
outputs21_ = outputs20_;
outputs20_ = inputs2_;
data += gains2_ * outputs20_;
finalZ2_ = finalZ1_;
finalZ1_ = finalZ0_;
finalZ0_ = data * 4.0f;
lastOutput = finalZ2_ - finalZ0_;
lastOutput *= 0.005f;
shake_energy_ = shakeEnergy;
snd_level_ = sndLevel;
return lastOutput;
}