26#ifndef LMMS_OSCILLATOR_H
27#define LMMS_OSCILLATOR_H
83 const float &detuning_div_samplerate,
84 const float &phase_offset,
92 static void waveTableInit();
93 static void destroyFFTPlans();
94 static std::unique_ptr<OscillatorConstants::waveform_t> generateAntiAliasUserWaveTable(
const SampleBuffer* sampleBuffer);
116 return std::sin(_sample * 2 * std::numbers::pi_v<float>);
126 else if( ph <= 0.75f )
128 return 2.0f - ph * 4.0f;
130 return ph * 4.0f - 4.0f;
140 return (
absFraction( _sample ) > 0.5f ) ? -1.0f : 1.0f;
148 return -1.0f + ph * 4.0f;
150 return 1.0f - 2.0f * ph;
160 return -1.0f + 8.0f * ph * ph;
170 if (buffer ==
nullptr || buffer->size() == 0) {
return 0; }
171 const auto frames = buffer->size();
173 const auto f1 =
static_cast<f_cnt_t>(frame);
175 return std::lerp(buffer->data()[f1][0], buffer->data()[(f1 + 1) % frames][0],
fraction(frame));
292 inline bool syncOk(
float _osc_coeff );
294 template<WaveShape W>
297 template<WaveShape W>
300 template<WaveShape W>
303 template<WaveShape W>
306 template<WaveShape W>
309 template<WaveShape W>
313 template<WaveShape W>
static long waveform[8]
Definition adlibemu.c:197
static AudioEngine * audioEngine()
Definition Engine.h:59
Definition AutomatableModel.h:481
const float & m_ext_phaseOffset
Definition Oscillator.h:249
static fftwf_plan s_ifftPlan
Definition Oscillator.h:263
static constexpr auto NumWaveShapes
Definition Oscillator.h:63
bool m_useWaveTable
Definition Oscillator.h:255
std::shared_ptr< const OscillatorConstants::waveform_t > m_userAntiAliasWaveTable
Definition Oscillator.h:254
sample_t getSample(const float _sample)
const IntModel * m_waveShapeModel
Definition Oscillator.h:244
static constexpr auto NumModulationAlgos
Definition Oscillator.h:78
sample_t wtSample(const OscillatorConstants::waveform_t *table, const float sample) const
Definition Oscillator.h:207
static sample_t squareSample(const float _sample)
Definition Oscillator.h:138
static sample_t expSample(const float _sample)
Definition Oscillator.h:153
bool syncOk(float _osc_coeff)
Definition Oscillator.cpp:556
Oscillator * m_subOsc
Definition Oscillator.h:250
static sample_t userWaveSample(const SampleBuffer *buffer, const float sample)
Definition Oscillator.h:168
static constexpr auto NumWaveShapeTables
Number of band-limited wave shapes to be generated.
Definition Oscillator.h:67
static void generateSquareWaveTable(int bands, sample_t *table, int firstBand=1)
Definition Oscillator.cpp:155
static sample_t sawSample(const float _sample)
Definition Oscillator.h:133
void updateMix(SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
Definition Oscillator.cpp:433
static constexpr auto FirstWaveShapeTable
First wave shape that has a pre-generated table.
Definition Oscillator.h:65
void updatePM(SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
Definition Oscillator.cpp:361
static float freqFromWaveTableBand(int band)
Definition Oscillator.h:238
static void generateSawWaveTable(int bands, sample_t *table, int firstBand=1)
Definition Oscillator.cpp:119
static void generateFromFFT(int bands, sample_t *table)
Definition Oscillator.cpp:175
std::shared_ptr< const SampleBuffer > m_userWave
Definition Oscillator.h:253
static fftwf_plan s_fftPlan
Definition Oscillator.h:262
sample_t wtSample(const sample_t table[OscillatorConstants::WAVE_TABLES_PER_WAVEFORM_COUNT][OscillatorConstants::WAVETABLE_LENGTH], const float sample) const
Definition Oscillator.h:198
void recalcPhase()
Definition Oscillator.cpp:542
const float & m_volume
Definition Oscillator.h:248
static sample_t noiseSample(const float)
Definition Oscillator.h:163
void updateNoSub(SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
Definition Oscillator.cpp:325
void setUseWaveTable(bool n)
Definition Oscillator.h:96
const IntModel * m_modulationAlgoModel
Definition Oscillator.h:245
bool m_isModulator
Definition Oscillator.h:258
static sample_t triangleSample(const float _sample)
Definition Oscillator.h:119
void setUserWave(std::shared_ptr< const SampleBuffer > _wave)
Definition Oscillator.h:101
const float & m_freq
Definition Oscillator.h:246
void updateSync(SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
Definition Oscillator.cpp:469
virtual ~Oscillator()
Definition Oscillator.h:87
static void createFFTPlans()
Definition Oscillator.cpp:223
const float & m_detuning_div_samplerate
Definition Oscillator.h:247
wtSampleControl getWtSampleControl(const float sample) const
Definition Oscillator.h:185
float m_phaseOffset
Definition Oscillator.h:251
static sample_t s_waveTables[NumWaveShapeTables][OscillatorConstants::WAVE_TABLES_PER_WAVEFORM_COUNT][OscillatorConstants::WAVETABLE_LENGTH]
Definition Oscillator.h:261
static void generateTriangleWaveTable(int bands, sample_t *table, int firstBand=1)
Definition Oscillator.cpp:137
static sample_t sinSample(const float _sample)
Definition Oscillator.h:114
ModulationAlgo
Definition Oscillator.h:70
@ Count
Definition Oscillator.h:76
static fftwf_complex * s_specBuf
Definition Oscillator.h:264
float m_phase
Definition Oscillator.h:252
float syncInit(SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
Definition Oscillator.cpp:567
static void generateWaveTables()
Definition Oscillator.cpp:243
static std::array< float, OscillatorConstants::WAVETABLE_LENGTH > s_sampleBuffer
Definition Oscillator.h:265
WaveShape
Definition Oscillator.h:52
@ Triangle
Definition Oscillator.h:54
@ WhiteNoise
Definition Oscillator.h:59
@ Count
Number of all available wave shapes.
Definition Oscillator.h:61
void updateAM(SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
Definition Oscillator.cpp:397
void updateFM(SampleFrame *_ab, const f_cnt_t _frames, const ch_cnt_t _chnl)
Definition Oscillator.cpp:505
sample_t wtSample(sample_t **table, const float sample) const
Definition Oscillator.h:218
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)
Definition Oscillator.cpp:55
static int waveTableBandFromFreq(float freq)
Definition Oscillator.h:225
void setUserAntiAliasWaveTable(std::shared_ptr< const OscillatorConstants::waveform_t > waveform)
Definition Oscillator.h:106
static sample_t moogSawSample(const float _sample)
Definition Oscillator.h:143
Definition SampleBuffer.h:39
static auto emptyBuffer() -> std::shared_ptr< const SampleBuffer >
Definition SampleBuffer.cpp:67
Definition SampleFrame.h:41
JHUFF_TBL long freq[]
Definition jchuff.h:50
float control
Definition lilv_test.c:1462
const int SEMITONES_PER_TABLE
Definition OscillatorConstants.h:45
constexpr int WAVETABLE_LENGTH
Definition OscillatorConstants.h:39
std::array< wavetable_t, WAVE_TABLES_PER_WAVEFORM_COUNT > waveform_t
Definition OscillatorConstants.h:54
const int WAVE_TABLES_PER_WAVEFORM_COUNT
Definition OscillatorConstants.h:46
Definition AudioAlsa.cpp:35
T fastRandInc(T upper) noexcept
Returns a pseudorandom number within [0, upper] (inclusive upper bound).
Definition lmms_math.h:126
std::uint16_t ch_cnt_t
Definition LmmsTypes.h:44
float sample_t
Definition LmmsTypes.h:39
auto absFraction(std::floating_point auto x) noexcept
Returns the wrapped fractional part of a float, a value between 0.0f and 1.0f.
Definition lmms_math.h:80
@ Sine
Definition Sfxr.h:43
@ Saw
Definition Sfxr.h:43
@ Square
Definition Sfxr.h:43
@ Count
Definition Sfxr.h:43
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43
auto fraction(std::floating_point auto x) noexcept
Returns the fractional part of a float, a value between -1.0f and 1.0f.
Definition lmms_math.h:63
static float volume(float level)
Definition nekobee_voice_render.c:99
Definition Oscillator.h:178
f_cnt_t f1
Definition Oscillator.h:180
int band
Definition Oscillator.h:182
f_cnt_t f2
Definition Oscillator.h:181
float frame
Definition Oscillator.h:179
signed int sample
Definition tap_dynamics_m.c:41
int n
Definition crypt.c:458