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.
65 lines
1.2 KiB
65 lines
1.2 KiB
#pragma once
|
|
#ifndef DSY_FM2_H
|
|
#define DSY_FM2_H
|
|
|
|
#include <stdint.h>
|
|
#include "Synthesis/oscillator.h"
|
|
#ifdef __cplusplus
|
|
|
|
namespace daisysp
|
|
{
|
|
/** Simple 2 operator FM synth voice.
|
|
|
|
Date: November, 2020
|
|
|
|
Author: Ben Sergentanis
|
|
*/
|
|
|
|
class Fm2
|
|
{
|
|
public:
|
|
Fm2() {}
|
|
~Fm2() {}
|
|
|
|
/** Initializes the FM2 module.
|
|
\param samplerate - The sample rate of the audio engine being run.
|
|
*/
|
|
void Init(float samplerate);
|
|
|
|
|
|
/** Returns the next sample
|
|
*/
|
|
float Process();
|
|
|
|
/** Carrier freq. setter
|
|
\param freq Carrier frequency in Hz
|
|
*/
|
|
void SetFrequency(float freq);
|
|
|
|
/** Set modulator freq. relative to carrier
|
|
\param ratio New modulator freq = carrier freq. * ratio
|
|
*/
|
|
void SetRatio(float ratio);
|
|
|
|
/** Index setter
|
|
\param FM depth, 5 = 2PI rads
|
|
*/
|
|
void SetIndex(float index);
|
|
|
|
/** Returns the current FM index. */
|
|
float GetIndex();
|
|
|
|
/** Resets both oscillators */
|
|
void Reset();
|
|
|
|
private:
|
|
static constexpr float kIdxScalar = 0.2f;
|
|
static constexpr float kIdxScalarRecip = 1.f / kIdxScalar;
|
|
|
|
Oscillator mod_, car_;
|
|
float idx_;
|
|
float freq_, lfreq_, ratio_, lratio_;
|
|
};
|
|
} // namespace daisysp
|
|
#endif
|
|
#endif
|
|
|