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

#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