LMMS
Loading...
Searching...
No Matches
lmms::Oscillator Class Reference

#include <Oscillator.h>

Classes

struct  wtSampleControl

Public Types

enum class  WaveShape {
  Sine , Triangle , Saw , Square ,
  MoogSaw , Exponential , WhiteNoise , UserDefined ,
  Count
}
enum class  ModulationAlgo {
  PhaseModulation , AmplitudeModulation , SignalMix , SynchronizedBySubOsc ,
  FrequencyModulation , Count
}

Public Member Functions

 Oscillator (const IntModel *wave_shape_model, const IntModel *mod_algo_model, const float &freq, const float &detuning_div_samplerate, const float &phase_offset, const float &volume, Oscillator *m_subOsc=nullptr)
virtual ~Oscillator ()
void setUseWaveTable (bool n)
void setUserWave (std::shared_ptr< const SampleBuffer > _wave)
void setUserAntiAliasWaveTable (std::shared_ptr< const OscillatorConstants::waveform_t > waveform)
void update (SampleFrame *ab, const f_cnt_t frames, const ch_cnt_t chnl, bool modulator=false)
wtSampleControl getWtSampleControl (const float sample) const
sample_t wtSample (const sample_t table[OscillatorConstants::WAVE_TABLES_PER_WAVEFORM_COUNT][OscillatorConstants::WAVETABLE_LENGTH], const float sample) const
sample_t wtSample (const OscillatorConstants::waveform_t *table, const float sample) const
sample_t wtSample (sample_t **table, const float sample) const

Static Public Member Functions

static void waveTableInit ()
static void destroyFFTPlans ()
static std::unique_ptr< OscillatorConstants::waveform_tgenerateAntiAliasUserWaveTable (const SampleBuffer *sampleBuffer)
static sample_t sinSample (const float _sample)
static sample_t triangleSample (const float _sample)
static sample_t sawSample (const float _sample)
static sample_t squareSample (const float _sample)
static sample_t moogSawSample (const float _sample)
static sample_t expSample (const float _sample)
static sample_t noiseSample (const float)
static sample_t userWaveSample (const SampleBuffer *buffer, const float sample)
static int waveTableBandFromFreq (float freq)
static float freqFromWaveTableBand (int band)

Static Public Attributes

static constexpr auto NumWaveShapes = static_cast<std::size_t>(WaveShape::Count)
static constexpr auto FirstWaveShapeTable = static_cast<std::size_t>(WaveShape::Triangle)
 First wave shape that has a pre-generated table.
static constexpr auto NumWaveShapeTables = static_cast<std::size_t>(WaveShape::WhiteNoise) - FirstWaveShapeTable
 Number of band-limited wave shapes to be generated.
static constexpr auto NumModulationAlgos = static_cast<std::size_t>(ModulationAlgo::Count)

Private Member Functions

void updateNoSub (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
void updatePM (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
void updateAM (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
void updateMix (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
void updateSync (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
void updateFM (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
float syncInit (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
bool syncOk (float _osc_coeff)
template<WaveShape W>
void updateNoSub (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
template<WaveShape W>
void updatePM (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
template<WaveShape W>
void updateAM (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
template<WaveShape W>
void updateMix (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
template<WaveShape W>
void updateSync (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
template<WaveShape W>
void updateFM (SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
template<WaveShape W>
sample_t getSample (const float _sample)
void recalcPhase ()

Static Private Member Functions

static void generateSawWaveTable (int bands, sample_t *table, int firstBand=1)
static void generateTriangleWaveTable (int bands, sample_t *table, int firstBand=1)
static void generateSquareWaveTable (int bands, sample_t *table, int firstBand=1)
static void generateFromFFT (int bands, sample_t *table)
static void generateWaveTables ()
static void createFFTPlans ()

Private Attributes

const IntModelm_waveShapeModel
const IntModelm_modulationAlgoModel
const float & m_freq
const float & m_detuning_div_samplerate
const float & m_volume
const float & m_ext_phaseOffset
Oscillatorm_subOsc
float m_phaseOffset
float m_phase
std::shared_ptr< const SampleBufferm_userWave = SampleBuffer::emptyBuffer()
std::shared_ptr< const OscillatorConstants::waveform_tm_userAntiAliasWaveTable
bool m_useWaveTable
bool m_isModulator

Static Private Attributes

static sample_t s_waveTables [NumWaveShapeTables][OscillatorConstants::WAVE_TABLES_PER_WAVEFORM_COUNT][OscillatorConstants::WAVETABLE_LENGTH]
static fftwf_plan s_fftPlan
static fftwf_plan s_ifftPlan
static fftwf_complex * s_specBuf
static std::array< float, OscillatorConstants::WAVETABLE_LENGTHs_sampleBuffer

Member Enumeration Documentation

◆ ModulationAlgo

Enumerator
PhaseModulation 
AmplitudeModulation 
SignalMix 
SynchronizedBySubOsc 
FrequencyModulation 
Count 

◆ WaveShape

enum class lmms::Oscillator::WaveShape
strong
Enumerator
Sine 
Triangle 
Saw 
Square 
MoogSaw 
Exponential 
WhiteNoise 
UserDefined 
Count 

Number of all available wave shapes.

Constructor & Destructor Documentation

◆ Oscillator()

lmms::Oscillator::Oscillator ( const IntModel * wave_shape_model,
const IntModel * mod_algo_model,
const float & freq,
const float & detuning_div_samplerate,
const float & phase_offset,
const float & volume,
Oscillator * m_subOsc = nullptr )

◆ ~Oscillator()

virtual lmms::Oscillator::~Oscillator ( )
inlinevirtual

Member Function Documentation

◆ createFFTPlans()

void lmms::Oscillator::createFFTPlans ( )
staticprivate

◆ destroyFFTPlans()

void lmms::Oscillator::destroyFFTPlans ( )
static

◆ expSample()

sample_t lmms::Oscillator::expSample ( const float _sample)
inlinestatic

◆ freqFromWaveTableBand()

float lmms::Oscillator::freqFromWaveTableBand ( int band)
inlinestatic

◆ generateAntiAliasUserWaveTable()

std::unique_ptr< OscillatorConstants::waveform_t > lmms::Oscillator::generateAntiAliasUserWaveTable ( const SampleBuffer * sampleBuffer)
static

◆ generateFromFFT()

void lmms::Oscillator::generateFromFFT ( int bands,
sample_t * table )
staticprivate

◆ generateSawWaveTable()

void lmms::Oscillator::generateSawWaveTable ( int bands,
sample_t * table,
int firstBand = 1 )
staticprivate

◆ generateSquareWaveTable()

void lmms::Oscillator::generateSquareWaveTable ( int bands,
sample_t * table,
int firstBand = 1 )
staticprivate

◆ generateTriangleWaveTable()

void lmms::Oscillator::generateTriangleWaveTable ( int bands,
sample_t * table,
int firstBand = 1 )
staticprivate

◆ generateWaveTables()

void lmms::Oscillator::generateWaveTables ( )
staticprivate

◆ getSample()

template<WaveShape W>
sample_t lmms::Oscillator::getSample ( const float _sample)
inlineprivate

◆ getWtSampleControl()

wtSampleControl lmms::Oscillator::getWtSampleControl ( const float sample) const
inline

◆ moogSawSample()

sample_t lmms::Oscillator::moogSawSample ( const float _sample)
inlinestatic

◆ noiseSample()

sample_t lmms::Oscillator::noiseSample ( const float )
inlinestatic

◆ recalcPhase()

void lmms::Oscillator::recalcPhase ( )
inlineprivate

◆ sawSample()

sample_t lmms::Oscillator::sawSample ( const float _sample)
inlinestatic

◆ setUserAntiAliasWaveTable()

void lmms::Oscillator::setUserAntiAliasWaveTable ( std::shared_ptr< const OscillatorConstants::waveform_t > waveform)
inline

◆ setUserWave()

void lmms::Oscillator::setUserWave ( std::shared_ptr< const SampleBuffer > _wave)
inline

◆ setUseWaveTable()

void lmms::Oscillator::setUseWaveTable ( bool n)
inline

◆ sinSample()

sample_t lmms::Oscillator::sinSample ( const float _sample)
inlinestatic

◆ squareSample()

sample_t lmms::Oscillator::squareSample ( const float _sample)
inlinestatic

◆ syncInit()

float lmms::Oscillator::syncInit ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ syncOk()

bool lmms::Oscillator::syncOk ( float _osc_coeff)
inlineprivate

◆ triangleSample()

sample_t lmms::Oscillator::triangleSample ( const float _sample)
inlinestatic

◆ update()

void lmms::Oscillator::update ( SampleFrame * ab,
const f_cnt_t frames,
const ch_cnt_t chnl,
bool modulator = false )

◆ updateAM() [1/2]

template<Oscillator::WaveShape W>
void lmms::Oscillator::updateAM ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ updateAM() [2/2]

void lmms::Oscillator::updateAM ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ updateFM() [1/2]

template<Oscillator::WaveShape W>
void lmms::Oscillator::updateFM ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ updateFM() [2/2]

void lmms::Oscillator::updateFM ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ updateMix() [1/2]

template<Oscillator::WaveShape W>
void lmms::Oscillator::updateMix ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ updateMix() [2/2]

void lmms::Oscillator::updateMix ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ updateNoSub() [1/2]

template<Oscillator::WaveShape W>
void lmms::Oscillator::updateNoSub ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ updateNoSub() [2/2]

void lmms::Oscillator::updateNoSub ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ updatePM() [1/2]

template<Oscillator::WaveShape W>
void lmms::Oscillator::updatePM ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ updatePM() [2/2]

void lmms::Oscillator::updatePM ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ updateSync() [1/2]

template<Oscillator::WaveShape W>
void lmms::Oscillator::updateSync ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ updateSync() [2/2]

void lmms::Oscillator::updateSync ( SampleFrame * _ab,
const f_cnt_t _frames,
const ch_cnt_t _chnl )
private

◆ userWaveSample()

sample_t lmms::Oscillator::userWaveSample ( const SampleBuffer * buffer,
const float sample )
inlinestatic

◆ waveTableBandFromFreq()

int lmms::Oscillator::waveTableBandFromFreq ( float freq)
inlinestatic

◆ waveTableInit()

void lmms::Oscillator::waveTableInit ( )
static

◆ wtSample() [1/3]

sample_t lmms::Oscillator::wtSample ( const OscillatorConstants::waveform_t * table,
const float sample ) const
inline

◆ wtSample() [2/3]

sample_t lmms::Oscillator::wtSample ( const sample_t table[OscillatorConstants::WAVE_TABLES_PER_WAVEFORM_COUNT][OscillatorConstants::WAVETABLE_LENGTH],
const float sample ) const
inline

◆ wtSample() [3/3]

sample_t lmms::Oscillator::wtSample ( sample_t ** table,
const float sample ) const
inline

Member Data Documentation

◆ FirstWaveShapeTable

auto lmms::Oscillator::FirstWaveShapeTable = static_cast<std::size_t>(WaveShape::Triangle)
staticconstexpr

First wave shape that has a pre-generated table.

◆ m_detuning_div_samplerate

const float& lmms::Oscillator::m_detuning_div_samplerate
private

◆ m_ext_phaseOffset

const float& lmms::Oscillator::m_ext_phaseOffset
private

◆ m_freq

const float& lmms::Oscillator::m_freq
private

◆ m_isModulator

bool lmms::Oscillator::m_isModulator
private

◆ m_modulationAlgoModel

const IntModel* lmms::Oscillator::m_modulationAlgoModel
private

◆ m_phase

float lmms::Oscillator::m_phase
private

◆ m_phaseOffset

float lmms::Oscillator::m_phaseOffset
private

◆ m_subOsc

Oscillator* lmms::Oscillator::m_subOsc
private

◆ m_userAntiAliasWaveTable

std::shared_ptr<const OscillatorConstants::waveform_t> lmms::Oscillator::m_userAntiAliasWaveTable
private

◆ m_userWave

std::shared_ptr<const SampleBuffer> lmms::Oscillator::m_userWave = SampleBuffer::emptyBuffer()
private

◆ m_useWaveTable

bool lmms::Oscillator::m_useWaveTable
private

◆ m_volume

const float& lmms::Oscillator::m_volume
private

◆ m_waveShapeModel

const IntModel* lmms::Oscillator::m_waveShapeModel
private

◆ NumModulationAlgos

auto lmms::Oscillator::NumModulationAlgos = static_cast<std::size_t>(ModulationAlgo::Count)
staticconstexpr

◆ NumWaveShapes

auto lmms::Oscillator::NumWaveShapes = static_cast<std::size_t>(WaveShape::Count)
staticconstexpr

◆ NumWaveShapeTables

auto lmms::Oscillator::NumWaveShapeTables = static_cast<std::size_t>(WaveShape::WhiteNoise) - FirstWaveShapeTable
staticconstexpr

Number of band-limited wave shapes to be generated.

◆ s_fftPlan

fftwf_plan lmms::Oscillator::s_fftPlan
staticprivate

◆ s_ifftPlan

fftwf_plan lmms::Oscillator::s_ifftPlan
staticprivate

◆ s_sampleBuffer

std::array< float, OscillatorConstants::WAVETABLE_LENGTH > lmms::Oscillator::s_sampleBuffer
staticprivate

◆ s_specBuf

fftwf_complex * lmms::Oscillator::s_specBuf
staticprivate

◆ s_waveTables

sample_t lmms::Oscillator::s_waveTables
staticprivate

The documentation for this class was generated from the following files: