Skip to content

Commit 9906cd4

Browse files
committed
synth: voice end fixup
1 parent 748f62c commit 9906cd4

2 files changed

Lines changed: 13 additions & 15 deletions

File tree

ports/rp2/sdio/sdio_voice.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -647,31 +647,29 @@ uint32_t sdio_voice_fill_chunk(sdio_voice_manager_t *manager)
647647
{
648648
sdio_voice_t *voice = &manager->voices[i];
649649

650-
if (voice->state == VOICE_INIT && voice->sectors_filled == RING_SIZE)
650+
if (voice->state == VOICE_INIT && voice->sectors_filled >= RING_SIZE/2)
651651
{
652652
voice->state = VOICE_RUNNING;
653653
}
654654

655-
if (voice->state == VOICE_RUNNING)
655+
if ((voice->state == VOICE_RUNNING) && (voice->adsr != NULL))
656656
{
657-
if (voice->adsr != NULL)
657+
// Generate ADSR envelope into amplitude_buffer (reused as q16_t scratch)
658+
adsr_process_block(voice->adsr, (q16_t *)manager->amplitude_buffer,
659+
manager->chunk_size);
660+
// Convert q16_t [0..0xFFFF] → Q1_14_t [0..0x3FFF] in-place
661+
for (uint32_t j = 0; j < manager->chunk_size; j++)
658662
{
659-
// Generate ADSR envelope into amplitude_buffer (reused as q16_t scratch)
660-
adsr_process_block(voice->adsr, (q16_t *)manager->amplitude_buffer,
661-
manager->chunk_size);
662-
// Convert q16_t [0..0xFFFF] → Q1_14_t [0..0x3FFF] in-place
663-
for (uint32_t j = 0; j < manager->chunk_size; j++)
664-
{
665-
manager->amplitude_buffer[j] =
666-
(Q1_14_t)(((uint16_t *)manager->amplitude_buffer)[j] >> 2);
667-
}
663+
manager->amplitude_buffer[j] =
664+
(Q1_14_t)(((uint16_t *)manager->amplitude_buffer)[j] >> 4);
668665
}
666+
669667
_voice_fill_bloc(voice, manager->amplitude_buffer,
670668
manager->accumulator_buffer, manager->chunk_size);
671669
nb_active += 1;
672670
}
673671

674-
if (voice->state == VOICE_CANCEL && manager->active_voice_idx != (int)i)
672+
if (((voice->state == VOICE_CANCEL) || (voice->state == VOICE_DONE)) && manager->active_voice_idx != (int)i)
675673
{
676674
voice->state = VOICE_FREE;
677675
}

ports/rp2/sdio/sdio_voice.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include "sdio_adsr.h"
99

1010
//Number of bits to index ring buffer
11-
#define RING_BITS 12 // 12 13
11+
#define RING_BITS 14 // 12 13
1212
#define RING_BYTES (1<<RING_BITS) // 4096 8192 bytes ring buffer
1313
#define RING_SAMPLES (RING_BYTES/sizeof(int16_t)) // 2048 4096 samples in ring
1414
#define RING_SIZE (RING_BYTES/SDIO_BLOCK_SIZE) // 8 16 sectors in ring
@@ -55,7 +55,7 @@ typedef struct Sample {
5555

5656

5757
// Number of samples in loop cache (half the ring buffer)
58-
#define LOOP_CACHE_SAMPLES (RING_SAMPLES)
58+
#define LOOP_CACHE_SAMPLES (RING_SAMPLES/2)
5959

6060
// Voice structure, every counter / size is in sample
6161
typedef struct {

0 commit comments

Comments
 (0)