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.
182 lines
4.4 KiB
182 lines
4.4 KiB
4 years ago
|
#pragma once
|
||
|
#ifndef DSY_CHORUS_H
|
||
|
#define DSY_CHORUS_H
|
||
|
#ifdef __cplusplus
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include "Utility/delayline.h"
|
||
|
|
||
|
/** @file chorus.h */
|
||
|
|
||
|
namespace daisysp
|
||
|
{
|
||
|
/**
|
||
|
@brief Single Chorus engine. Used in Chorus.
|
||
|
@author Ben Sergentanis
|
||
|
*/
|
||
|
class ChorusEngine
|
||
|
{
|
||
|
public:
|
||
|
ChorusEngine() {}
|
||
|
~ChorusEngine() {}
|
||
|
|
||
|
/** Initialize the module
|
||
|
\param sample_rate Audio engine sample rate.
|
||
|
*/
|
||
|
void Init(float sample_rate);
|
||
|
|
||
|
/** Get the next sample
|
||
|
\param in Sample to process
|
||
|
*/
|
||
|
float Process(float in);
|
||
|
|
||
|
/** How much to modulate the delay by.
|
||
|
\param depth Works 0-1.
|
||
|
*/
|
||
|
void SetLfoDepth(float depth);
|
||
|
|
||
|
/** Set lfo frequency.
|
||
|
\param freq Frequency in Hz
|
||
|
*/
|
||
|
void SetLfoFreq(float freq);
|
||
|
|
||
|
/** Set the internal delay rate.
|
||
|
\param delay Tuned for 0-1. Maps to .1 to 50 ms.
|
||
|
*/
|
||
|
void SetDelay(float delay);
|
||
|
|
||
|
/** Set the delay time in ms.
|
||
|
\param ms Delay time in ms.
|
||
|
*/
|
||
|
void SetDelayMs(float ms);
|
||
|
|
||
|
/** Set the feedback amount.
|
||
|
\param feedback Amount from 0-1.
|
||
|
*/
|
||
|
void SetFeedback(float feedback);
|
||
|
|
||
|
private:
|
||
|
float sample_rate_;
|
||
|
static constexpr int32_t kDelayLength
|
||
|
= 2400; // 50 ms at 48kHz = .05 * 48000
|
||
|
|
||
|
//triangle lfos
|
||
|
float lfo_phase_;
|
||
|
float lfo_freq_;
|
||
|
float lfo_amp_;
|
||
|
|
||
|
float feedback_;
|
||
|
|
||
|
float delay_;
|
||
|
|
||
|
DelayLine<float, kDelayLength> del_;
|
||
|
|
||
|
float ProcessLfo();
|
||
|
};
|
||
|
|
||
|
//wraps up all of the chorus engines
|
||
|
/**
|
||
|
@brief Chorus Effect.
|
||
|
@author Ben Sergentanis
|
||
|
@date Jan 2021
|
||
|
Based on https://www.izotope.com/en/learn/understanding-chorus-flangers-and-phasers-in-audio-production.html \n
|
||
|
and https://www.researchgate.net/publication/236629475_Implementing_Professional_Audio_Effects_with_DSPs \n
|
||
|
*/
|
||
|
class Chorus
|
||
|
{
|
||
|
public:
|
||
|
Chorus() {}
|
||
|
~Chorus() {}
|
||
|
|
||
|
/** Initialize the module
|
||
|
\param sample_rate Audio engine sample rate
|
||
|
*/
|
||
|
void Init(float sample_rate);
|
||
|
|
||
|
/** Get the net floating point sample. Defaults to left channel.
|
||
|
\param in Sample to process
|
||
|
*/
|
||
|
float Process(float in);
|
||
|
|
||
|
/** Get the left channel's last sample */
|
||
|
float GetLeft();
|
||
|
|
||
|
/** Get the right channel's last sample */
|
||
|
float GetRight();
|
||
|
|
||
|
/** Pan both channels individually.
|
||
|
\param panl Pan the left channel. 0 is left, 1 is right.
|
||
|
\param panr Pan the right channel.
|
||
|
*/
|
||
|
void SetPan(float panl, float panr);
|
||
|
|
||
|
/** Pan both channels.
|
||
|
\param pan Where to pan both channels to. 0 is left, 1 is right.
|
||
|
*/
|
||
|
void SetPan(float pan);
|
||
|
|
||
|
/** Set both lfo depths individually.
|
||
|
\param depthl Left channel lfo depth. Works 0-1.
|
||
|
\param depthr Right channel lfo depth.
|
||
|
*/
|
||
|
void SetLfoDepth(float depthl, float depthr);
|
||
|
|
||
|
/** Set both lfo depths.
|
||
|
\param depth Both channels lfo depth. Works 0-1.
|
||
|
*/
|
||
|
void SetLfoDepth(float depth);
|
||
|
|
||
|
/** Set both lfo frequencies individually.
|
||
|
\param depthl Left channel lfo freq in Hz.
|
||
|
\param depthr Right channel lfo freq in Hz.
|
||
|
*/
|
||
|
void SetLfoFreq(float freql, float freqr);
|
||
|
|
||
|
/** Set both lfo frequencies.
|
||
|
\param depth Both channel lfo freqs in Hz.
|
||
|
*/
|
||
|
void SetLfoFreq(float freq);
|
||
|
|
||
|
/** Set both channel delay amounts individually.
|
||
|
\param delayl Left channel delay amount. Works 0-1.
|
||
|
\param delayr Right channel delay amount.
|
||
|
*/
|
||
|
void SetDelay(float delayl, float delayr);
|
||
|
|
||
|
/** Set both channel delay amounts.
|
||
|
\param delay Both channel delay amount. Works 0-1.
|
||
|
*/
|
||
|
void SetDelay(float delay);
|
||
|
|
||
|
/** Set both channel delay individually.
|
||
|
\param msl Left channel delay in ms.
|
||
|
\param msr Right channel delay in ms.
|
||
|
*/
|
||
|
void SetDelayMs(float msl, float msr);
|
||
|
|
||
|
/** Set both channel delay in ms.
|
||
|
\param ms Both channel delay amounts in ms.
|
||
|
*/
|
||
|
void SetDelayMs(float ms);
|
||
|
|
||
|
/** Set both channels feedback individually.
|
||
|
\param feedbackl Left channel feedback. Works 0-1.
|
||
|
\param feedbackr Right channel feedback.
|
||
|
*/
|
||
|
void SetFeedback(float feedbackl, float feedbackr);
|
||
|
|
||
|
/** Set both channels feedback.
|
||
|
\param feedback Both channel feedback. Works 0-1.
|
||
|
*/
|
||
|
void SetFeedback(float feedback);
|
||
|
|
||
|
private:
|
||
|
ChorusEngine engines_[2];
|
||
|
float gain_frac_;
|
||
|
float pan_[2];
|
||
|
|
||
|
float sigl_, sigr_;
|
||
|
};
|
||
|
} //namespace daisysp
|
||
|
#endif
|
||
|
#endif
|