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.
179 lines
4.1 KiB
179 lines
4.1 KiB
4 years ago
|
#pragma once
|
||
|
#ifndef DSY_SYNTHBD_H
|
||
|
#define DSY_SYNTHBD_H
|
||
|
|
||
|
#include "Filters/svf.h"
|
||
|
#include "Utility/dsp.h"
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#ifdef __cplusplus
|
||
|
|
||
|
/** @file synthbassdrum.h */
|
||
|
|
||
|
namespace daisysp
|
||
|
{
|
||
|
/**
|
||
|
@brief Click noise for SyntheticBassDrum
|
||
|
@author Ben Sergentanis
|
||
|
@date Jan 2021
|
||
|
Ported from pichenettes/eurorack/plaits/dsp/drums/synthetic_bass_drum.h \n
|
||
|
to an independent module. \n
|
||
|
Original code written by Emilie Gillet in 2016. \n
|
||
|
*/
|
||
|
class SyntheticBassDrumClick
|
||
|
{
|
||
|
public:
|
||
|
SyntheticBassDrumClick() {}
|
||
|
~SyntheticBassDrumClick() {}
|
||
|
|
||
|
/** Init the module
|
||
|
\param sample_rate Audio engine sample rate.
|
||
|
*/
|
||
|
void Init(float sample_rate);
|
||
|
|
||
|
/** Get the next sample.
|
||
|
\param in Trigger the click.
|
||
|
*/
|
||
|
float Process(float in);
|
||
|
|
||
|
private:
|
||
|
float lp_;
|
||
|
float hp_;
|
||
|
Svf filter_;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
@brief Attack Noise generator for SyntheticBassDrum.
|
||
|
@author Ben Sergentanis
|
||
|
@date Jan 2021
|
||
|
Ported from pichenettes/eurorack/plaits/dsp/drums/synthetic_bass_drum.h \n
|
||
|
to an independent module. \n
|
||
|
Original code written by Emilie Gillet in 2016. \n
|
||
|
*/
|
||
|
class SyntheticBassDrumAttackNoise
|
||
|
{
|
||
|
public:
|
||
|
SyntheticBassDrumAttackNoise() {}
|
||
|
~SyntheticBassDrumAttackNoise() {}
|
||
|
|
||
|
/** Init the module */
|
||
|
void Init();
|
||
|
|
||
|
/** Get the next sample. */
|
||
|
float Process();
|
||
|
|
||
|
private:
|
||
|
float lp_;
|
||
|
float hp_;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
@brief Naive bass drum model (modulated oscillator with FM + envelope).
|
||
|
@author Ben Sergentanis
|
||
|
@date Jan 2021
|
||
|
Inadvertently 909-ish. \n \n
|
||
|
Ported from pichenettes/eurorack/plaits/dsp/drums/synthetic_bass_drum.h \n
|
||
|
to an independent module. \n
|
||
|
Original code written by Emilie Gillet in 2016. \n
|
||
|
*/
|
||
|
class SyntheticBassDrum
|
||
|
{
|
||
|
public:
|
||
|
SyntheticBassDrum() {}
|
||
|
~SyntheticBassDrum() {}
|
||
|
|
||
|
/** Init the module
|
||
|
\param sample_rate Audio engine sample rate.
|
||
|
*/
|
||
|
void Init(float sample_rate);
|
||
|
|
||
|
/** Generates a distorted sine wave */
|
||
|
inline float DistortedSine(float phase, float phase_noise, float dirtiness);
|
||
|
|
||
|
/** Transistor VCA simulation.
|
||
|
\param s Input sample.
|
||
|
\param gain VCA gain.
|
||
|
*/
|
||
|
inline float TransistorVCA(float s, float gain);
|
||
|
|
||
|
/** Get the next sample.
|
||
|
\param trigger True triggers the BD. This is optional.
|
||
|
*/
|
||
|
float Process(bool trigger = false);
|
||
|
|
||
|
/** Trigger the drum */
|
||
|
void Trig();
|
||
|
|
||
|
/** Allows the drum to play continuously
|
||
|
\param sustain True sets the drum on infinite sustain.
|
||
|
*/
|
||
|
void SetSustain(bool sustain);
|
||
|
|
||
|
/** Sets the amount of accent.
|
||
|
\param accent Works 0-1.
|
||
|
*/
|
||
|
void SetAccent(float accent);
|
||
|
|
||
|
/** Set the bass drum's root frequency.
|
||
|
\param Frequency in Hz.
|
||
|
*/
|
||
|
void SetFreq(float freq);
|
||
|
|
||
|
/** Sets the overall bright / darkness of the drum.
|
||
|
\param tone Works 0-1.
|
||
|
*/
|
||
|
void SetTone(float tone);
|
||
|
|
||
|
/** Sets how long the drum's volume takes to decay.
|
||
|
\param Works 0-1.
|
||
|
*/
|
||
|
void SetDecay(float decay);
|
||
|
|
||
|
/** Makes things grimy
|
||
|
\param dirtiness Works 0-1.
|
||
|
*/
|
||
|
void SetDirtiness(float dirtiness);
|
||
|
|
||
|
/** Sets how much of a pitch sweep the drum experiences when triggered.
|
||
|
\param fm_envelope_amount Works 0-1.
|
||
|
*/
|
||
|
void SetFmEnvelopeAmount(float fm_envelope_amount);
|
||
|
|
||
|
/** Sets how long the initial pitch sweep takes.
|
||
|
\param fm_envelope_decay Works 0-1.
|
||
|
*/
|
||
|
void SetFmEnvelopeDecay(float fm_envelope_decay);
|
||
|
|
||
|
private:
|
||
|
float sample_rate_;
|
||
|
|
||
|
bool trig_;
|
||
|
bool sustain_;
|
||
|
float accent_, new_f0_, tone_, decay_;
|
||
|
float dirtiness_, fm_envelope_amount_, fm_envelope_decay_;
|
||
|
|
||
|
float f0_;
|
||
|
float phase_;
|
||
|
float phase_noise_;
|
||
|
|
||
|
float fm_;
|
||
|
float fm_lp_;
|
||
|
float body_env_;
|
||
|
float body_env_lp_;
|
||
|
float transient_env_;
|
||
|
float transient_env_lp_;
|
||
|
|
||
|
float sustain_gain_;
|
||
|
|
||
|
float tone_lp_;
|
||
|
|
||
|
SyntheticBassDrumClick click_;
|
||
|
SyntheticBassDrumAttackNoise noise_;
|
||
|
|
||
|
int body_env_pulse_width_;
|
||
|
int fm_pulse_width_;
|
||
|
};
|
||
|
|
||
|
} // namespace daisysp
|
||
|
#endif
|
||
|
#endif
|