Skip to content
Snippets Groups Projects
Commit 93d59028 authored by David Huss's avatar David Huss :speech_balloon:
Browse files

Add log envelope

parent 8b166f21
No related branches found
No related tags found
No related merge requests found
......@@ -20,8 +20,8 @@
int wave[SAMPLES];
EnvelopeSimpleLinear kick_volume_envelope;
EnvelopeSimpleLog kick_pitch_envelope;
float pitch_envelope = 0.0;
float pitch_sigh = 0.0;
double last_trigger = 0;
......@@ -34,8 +34,6 @@ int chord_pot;
float volume_decay;
int inv_pot;
float pitch_decay;
float pitch_envelope_amount;
float pitch_sigh_amount = KICK_SIGH_AMOUNT;
float pitch_sigh_speed = KICK_SIGH_SPEED;
float sigh_incrementer = 0.0;
......@@ -91,9 +89,10 @@ void loop() {
osc_freq = KICK_BASE_FREQ + freq_pot/1023.0*KICK_FREQ_RANGE;
// Bigger decay values make the envelope shorter
kick_volume_envelope.setSpeed(0.000005 + (float)chord_pot/1023.0/3000.0);
pitch_decay = 0.00001 + (float)inv_pot/1023.0/300.0;
kick_pitch_envelope.setSpeed(0.00001 + (float)inv_pot/1023.0/800.0);
// Increase the amount of the pitch envelope if the pitch decay is longer
pitch_envelope_amount = 0.5 + (1023.0-(float)inv_pot)/1023.0*1.5;
kick_pitch_envelope.setAmount(2.0 + (1023.0-(float)inv_pot)/1023.0*8.5);
// kick_pitch_envelope.setAmount(0.0);
// -------------------push sw , play wave-------------------------------
readGates();
......@@ -113,12 +112,7 @@ void updateKickEnvelopes() {
}
}
// Decrement the pitch envelope
pitch_envelope -= pitch_decay;
if (pitch_envelope < 0.0001) {
pitch_envelope = 0.0;
}
kick_pitch_envelope.update();
kick_volume_envelope.update();
}
......@@ -134,7 +128,7 @@ void on_pwm_wrap() {
pwm_set_chan_level(slice_num, PWM_CHAN_A, kick_volume_envelope.value*wave[(int)osc_progress]/2+511);
// Advance the oscillator and reset it if it reached the end
osc_progress += osc_freq + pitch_envelope + pitch_sigh * pitch_sigh_amount;
osc_progress += osc_freq + kick_pitch_envelope.value + pitch_sigh * pitch_sigh_amount;
if (osc_progress > SAMPLES) {
osc_progress = 0;
}
......@@ -167,7 +161,7 @@ void readGates() {
void resetEnvelopes() {
kick_volume_envelope.reset();
pitch_envelope = pitch_envelope_amount;
kick_pitch_envelope.reset();
pitch_sigh = 0.0;
sigh_incrementer = 0.0;
}
\ No newline at end of file
// A linear falling
// ---- A simple linear falling envelope -------
class EnvelopeSimpleLinear {
public:
float incrementer = 1.0;
float counter = 1.0;
float value;
float speed = 0.001;
float amount = 1.0;
......@@ -12,15 +12,15 @@ class EnvelopeSimpleLinear {
};
void EnvelopeSimpleLinear::update() {
this->incrementer -= this->speed;
if (this->incrementer <= 0.0) {
this->incrementer = 0.0;
this->counter -= this->speed;
if (this->counter <= 0.0) {
this->counter = 0.0;
}
this->value = this->incrementer * this->amount;
this->value = this->counter * this->amount;
}
void EnvelopeSimpleLinear::reset() {
this->incrementer = 1.0;
this->counter = 1.0;
this->value = 0.0;
}
......@@ -28,6 +28,76 @@ void EnvelopeSimpleLinear::setSpeed(float speed) {
this->speed = speed;
}
void EnvelopeSimpleLinear::setAmount(float speed) {
void EnvelopeSimpleLinear::setAmount(float amount) {
this->amount = amount;
}
// ---- A simple logarithmic falling envelope -------
class EnvelopeSimpleLog {
public:
float counter = 1.0;
float value;
float speed = 0.001;
float amount = 1.0;
void update();
void reset();
void setAmount(float speed);
void setSpeed(float speed);
};
void EnvelopeSimpleLog::update() {
this->counter -= this->speed;
if (this->counter <= 0.0) {
this->counter = 0.0;
}
this->value = max(0.0, (log10(0.005 + 1.0 - this->counter)*-1.0))/2.3 * this->amount;
}
void EnvelopeSimpleLog::reset() {
this->counter = 1.0;
this->value = 0.0;
}
void EnvelopeSimpleLog::setSpeed(float speed) {
this->speed = speed;
}
void EnvelopeSimpleLog::setAmount(float amount) {
this->amount = amount;
}
// // ---- A simple logarithmic falling envelope -------
// class EnvelopeSigh {
// public:
// float counter = 0.0;
// float value;
// float speed = 0.001;
// float delay = 300;
// float amount = 1.0;
// void update();
// void reset();
// void setAmount(float speed);
// void setSpeed(float speed);
// void setDelay(float speed);
// };
// void EnvelopeSimpleLog::update() {
// this->counter -= this->speed;
// if (this->counter <= 0.0) {
// this->counter = 0.0;
// }
// this->value = max(0.0, (log10(0.005 + 1.0 - this->counter)*-1.0))/2.3 * this->amount;
// }
// void EnvelopeSimpleLog::reset() {
// this->counter = 1.0;
// this->value = 0.0;
// }
// void EnvelopeSimpleLog::setSpeed(float speed) {
// this->speed = speed;
// }
// void EnvelopeSimpleLog::setAmount(float amount) {
// this->amount = amount;
// }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment