Synth controls
This commit is contained in:
+23
-12
@@ -23,7 +23,8 @@ SynthEngine::SynthEngine(uint32_t sampleRate)
|
||||
_phase(0),
|
||||
_increment(0),
|
||||
_volume(0.5f),
|
||||
_waveform(SAWTOOTH)
|
||||
_waveform(SAWTOOTH),
|
||||
_isGateOpen(false)
|
||||
{
|
||||
fill_sine_table();
|
||||
// Initialize with a default frequency
|
||||
@@ -49,22 +50,32 @@ void SynthEngine::setWaveform(Waveform form) {
|
||||
_waveform = form;
|
||||
}
|
||||
|
||||
void SynthEngine::setGate(bool isOpen) {
|
||||
_isGateOpen = isOpen;
|
||||
}
|
||||
|
||||
float SynthEngine::getFrequency() const {
|
||||
return (float)((double)_increment * (double)_sampleRate / 4294967296.0);
|
||||
}
|
||||
|
||||
void SynthEngine::process(int16_t* buffer, uint32_t numFrames) {
|
||||
for (uint32_t i = 0; i < numFrames; ++i) {
|
||||
_phase += _increment;
|
||||
|
||||
int16_t sample = 0;
|
||||
switch (_waveform) {
|
||||
case SAWTOOTH:
|
||||
sample = static_cast<int16_t>(_phase >> 16);
|
||||
break;
|
||||
case SQUARE:
|
||||
sample = (_phase < 0x80000000) ? 32767 : -32768;
|
||||
break;
|
||||
case SINE:
|
||||
// Use top 8 bits of phase as index into sine table
|
||||
sample = sine_table[(_phase >> 24) & 0xFF];
|
||||
break;
|
||||
if (_isGateOpen) {
|
||||
switch (_waveform) {
|
||||
case SAWTOOTH:
|
||||
sample = static_cast<int16_t>(_phase >> 16);
|
||||
break;
|
||||
case SQUARE:
|
||||
sample = (_phase < 0x80000000) ? 32767 : -32768;
|
||||
break;
|
||||
case SINE:
|
||||
// Use top 8 bits of phase as index into sine table
|
||||
sample = sine_table[(_phase >> 24) & 0xFF];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply volume and write to buffer
|
||||
|
||||
Reference in New Issue
Block a user