Synth controls

This commit is contained in:
Dejvino
2026-02-27 21:59:14 +01:00
parent 5240eb990b
commit c8bdf3ee13
3 changed files with 182 additions and 29 deletions
+23 -12
View File
@@ -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