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.
105 lines
2.3 KiB
105 lines
2.3 KiB
4 years ago
|
#pragma once
|
||
|
#ifndef DSY_ANALOG_BD_H
|
||
|
#define DSY_ANALOG_BD_H
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#ifdef __cplusplus
|
||
|
|
||
|
#include "Synthesis/oscillator.h"
|
||
|
#include "Filters/svf.h"
|
||
|
|
||
|
/** @file analogbassdrum.h */
|
||
|
|
||
|
namespace daisysp
|
||
|
{
|
||
|
/**
|
||
|
@brief 808 bass drum model, revisited.
|
||
|
@author Ben Sergentanis
|
||
|
@date Jan 2021
|
||
|
Ported from pichenettes/eurorack/plaits/dsp/drums/analog_bass_drum.h \n
|
||
|
to an independent module. \n
|
||
|
Original code written by Emilie Gillet in 2016. \n
|
||
|
*/
|
||
|
class AnalogBassDrum
|
||
|
{
|
||
|
public:
|
||
|
AnalogBassDrum() {}
|
||
|
~AnalogBassDrum() {}
|
||
|
|
||
|
/** Initialize the module
|
||
|
\param sample_rate Audio engine sample rate
|
||
|
*/
|
||
|
void Init(float sample_rate);
|
||
|
|
||
|
/** Get the next sample.
|
||
|
\param trigger True strikes the drum. Defaults to false.
|
||
|
*/
|
||
|
float Process(bool trigger = false);
|
||
|
|
||
|
/** Strikes the drum. */
|
||
|
void Trig();
|
||
|
|
||
|
/** Set the bassdrum to play infinitely
|
||
|
\param sustain True = infinite length
|
||
|
*/
|
||
|
void SetSustain(bool sustain);
|
||
|
|
||
|
/** Set a small accent.
|
||
|
\param accent Works 0-1
|
||
|
*/
|
||
|
void SetAccent(float accent);
|
||
|
|
||
|
/** Set the drum's root frequency
|
||
|
\param f0 Frequency in Hz
|
||
|
*/
|
||
|
void SetFreq(float f0);
|
||
|
|
||
|
/** Set the amount of click.
|
||
|
\param tone Works 0-1.
|
||
|
*/
|
||
|
void SetTone(float tone);
|
||
|
|
||
|
/** Set the decay length of the drum.
|
||
|
\param decay Works best 0-1.
|
||
|
*/
|
||
|
void SetDecay(float decay);
|
||
|
|
||
|
/** Set the amount of fm attack. Works together with self fm.
|
||
|
\param attack_fm_amount Works best 0-1.
|
||
|
*/
|
||
|
void SetAttackFmAmount(float attack_fm_amount);
|
||
|
|
||
|
/**Set the amount of self fm. Also affects fm attack, and volume decay.
|
||
|
\param self_fm_amount Works best 0-1.
|
||
|
*/
|
||
|
void SetSelfFmAmount(float self_fm_amount);
|
||
|
|
||
|
private:
|
||
|
inline float Diode(float x);
|
||
|
|
||
|
float sample_rate_;
|
||
|
|
||
|
float accent_, f0_, tone_, decay_;
|
||
|
float attack_fm_amount_, self_fm_amount_;
|
||
|
|
||
|
bool trig_, sustain_;
|
||
|
|
||
|
int pulse_remaining_samples_;
|
||
|
int fm_pulse_remaining_samples_;
|
||
|
float pulse_;
|
||
|
float pulse_height_;
|
||
|
float pulse_lp_;
|
||
|
float fm_pulse_lp_;
|
||
|
float retrig_pulse_;
|
||
|
float lp_out_;
|
||
|
float tone_lp_;
|
||
|
float sustain_gain_;
|
||
|
|
||
|
Svf resonator_;
|
||
|
|
||
|
//for use in sin + cos osc. in sustain mode
|
||
|
float phase_;
|
||
|
};
|
||
|
} // namespace daisysp
|
||
|
#endif
|
||
|
#endif
|