From d44210ce59a8db1ff68a673c28bf9a24530e2932 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 30 Jun 2025 09:44:44 +0200 Subject: [PATCH] found some bugs now 4 samples play simultaneous without errors --- soundcube-firmware/ringbuffer.h | 10 ++-- soundcube-firmware/soundcube-firmware.ino | 63 ++++++++++++++--------- soundcube-firmware/wavestream.h | 13 +++-- 3 files changed, 53 insertions(+), 33 deletions(-) diff --git a/soundcube-firmware/ringbuffer.h b/soundcube-firmware/ringbuffer.h index 99531f6..ebf9d3e 100644 --- a/soundcube-firmware/ringbuffer.h +++ b/soundcube-firmware/ringbuffer.h @@ -64,7 +64,7 @@ class RingBuffer{ void advance(int nbytes){ for(int i = 0; i < nbytes/2; ++i){ - if(counter < bufferSize){ + if(counter < (bufferSize-1)){ write++; // % bufferSize; if(write == bufferSize) write = 0; counter++; @@ -73,7 +73,7 @@ class RingBuffer{ } void popDMA(int32_t *target){ - if(counter > 0) { + if(counter > 1) { counter -= 2; rp2040.memcpyDMA(target, &buffer[read], 4); read += 2; @@ -86,13 +86,17 @@ class RingBuffer{ } bool isFull(){ - return counter == bufferSize; + return counter == (bufferSize-2); } int size(){ return counter; } + int remains(){ + return (bufferSize-2) - counter; + } + private: size_t bufferSize = 0; int counter = 0; diff --git a/soundcube-firmware/soundcube-firmware.ino b/soundcube-firmware/soundcube-firmware.ino index 76472b7..321c462 100644 --- a/soundcube-firmware/soundcube-firmware.ino +++ b/soundcube-firmware/soundcube-firmware.ino @@ -22,7 +22,7 @@ bool core1_disable_systick = true; #define AURAL 1 #define UI_SAMPLERATE 22050 -#define BUFFERSIZE 64 +#define BUFFERSIZE 256 #define NSTREAMS 16 I2S i2s(INPUT_PULLUP); @@ -51,6 +51,10 @@ enum BUTTON {MODE, LOOP, INL, INR, OUTR, OUTL, TEMPO, RESET, BACK, POWER, SELECT int lut_ring_cw[48] = {39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,50,49,48,47,46,45,44,43,42,41,40}; int lut_ring_ccw[48] = {40,41,42,43,44,45,46,47,48,49,50,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39}; + +int lut_ring_cw_3[48] = {40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,50,49,48,47,46,45,44,43,42,41}; +int lut_ring_ccw_3[48] = {39,40,41,42,43,44,45,46,47,48,49,50,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38}; + int lut_matrix[13] = {56,55,57,58,59,62,61,60,63,64,65,67,66}; int lut_banks[4] = {56,55,67,66}; @@ -174,21 +178,23 @@ void codec_transmit() { for(int k = 0; k < NSTREAMS; k++){ //int32_t twosamples; int16_t twosamples[2]; - stream[k].getDMA((int32_t*)&twosamples); + if(stream[k].isPlaying()){ + stream[k].getDMA((int32_t*)&twosamples); - int16_t sample_l = twosamples[0];// >> 16; - int16_t sample_r = twosamples[1];// & 0xFFFF; + int16_t sample_l = twosamples[0];// >> 16; + int16_t sample_r = twosamples[1];// & 0xFFFF; - // int16_t *sample_l = stream[k].wavefile.buffer.getReadPointer(); //twosamples >> 16; - // stream[k].wavefile.buffer.pointerPop(2); - // int16_t *sample_r = stream[k].wavefile.buffer.getReadPointer(); //twosamples & 0xFFFF; - // stream[k].wavefile.buffer.pointerPop(2); + // int16_t *sample_l = stream[k].wavefile.buffer.getReadPointer(); //twosamples >> 16; + // stream[k].wavefile.buffer.pointerPop(2); + // int16_t *sample_r = stream[k].wavefile.buffer.getReadPointer(); //twosamples & 0xFFFF; + // stream[k].wavefile.buffer.pointerPop(2); - // buffer[i] += (*sample_l / 16); - // buffer[i+1] += (*sample_r / 16); - - buffer[i] += (sample_l / 16); - buffer[i+1] += (sample_r / 16); + // buffer[i] += (*sample_l / 16); + // buffer[i+1] += (*sample_r / 16); + + buffer[i] += (sample_l / 16); + buffer[i+1] += (sample_r / 16); + } } } } @@ -708,13 +714,13 @@ void loop1() { for(int i = 0; i < 48; i++){ int step = floor(i/3); if(step == set_bar){ - ui_leds[lut_ring_cw[i]] = CRGB(config.ring_color.r_active, config.ring_color.g_active, config.ring_color.b_active); + ui_leds[lut_ring_cw_3[i]] = CRGB(config.ring_color.r_active, config.ring_color.g_active, config.ring_color.b_active); } if(step == bar){ - ui_leds[lut_ring_cw[i]] = CRGB(config.ring_color.r, config.ring_color.g, config.ring_color.b); + ui_leds[lut_ring_cw_3[i]] = CRGB(config.ring_color.r, config.ring_color.g, config.ring_color.b); } if(steps[step].len > 0) { - ui_leds[lut_ring_cw[i]] = CRGB(0, 10, 0); + ui_leds[lut_ring_cw_3[i]] = CRGB(0, 10, 0); } } @@ -733,7 +739,7 @@ void loop1() { } } //int sc = 0; -int cnt = 0; +int streamcnt = 0; void loop(){ if(setup1_finished && setup0_finished){ @@ -741,11 +747,19 @@ void loop(){ uint32_t delta = millis() - last; if(delta >= delta_bpm) { + + bar = (bar + 1) % 16; if(steps[bar].len > 0) { steps[bar].trigger(); - // Serial.print("trigger "); - // Serial.println(bar); + } + + if(streams_loaded) { + for(int i = 0; i < NSTREAMS; i++){ + Serial.print(stream[i].wavefile.buffer.size()); + Serial.print("\t"); + } + Serial.println(); } // Serial.print(delta_bpm); @@ -755,14 +769,13 @@ void loop(){ last = millis(); } - // stream[cnt].stream(); - // cnt++; - // if(cnt == 16) cnt = 0; if(streams_loaded) { - for(int i = 0; i < NSTREAMS; i++){ - stream[i].stream(); - } +// for(int i = 0; i < NSTREAMS; i++){ + stream[streamcnt].stream(); +// } } + streamcnt = (streamcnt + 1) % 16; + // int16_t sample_l = 0; // int16_t sample_r = 0; // diff --git a/soundcube-firmware/wavestream.h b/soundcube-firmware/wavestream.h index 13467fa..046302b 100644 --- a/soundcube-firmware/wavestream.h +++ b/soundcube-firmware/wavestream.h @@ -108,9 +108,9 @@ struct WaveFile{ bool readblockDMA128(){ void *bufferStart = buffer.getWritePointer(); - - int adv = 128; - adv = file.read((uint8_t*)bufferStart, 128); + + remains = min(buffer.remains(), 128); + adv = file.readBytes((char*)bufferStart, remains); buffer.advance(adv); if(!file.available() && loop) file.seek(44, SeekSet); @@ -141,6 +141,9 @@ struct WaveFile{ uint16_t blockalign = 0; uint16_t bitspersample = 0; + int adv = 0; + int remains = 0; + RingBuffer buffer; }; @@ -149,7 +152,7 @@ class WaveStream{ WaveStream(){} void begin(){ - wavefile.buffer.setSize(1024); + wavefile.buffer.setSize(2048); wavefile.buffer.begin(); } @@ -174,7 +177,7 @@ class WaveStream{ void stream(){ int cnt = 0; - while (!wavefile.buffer.isFull() && cnt < 128) { + while (!wavefile.buffer.isFull() && cnt < 1024) { bool ok = wavefile.readblockDMA(); if(!ok) playing = false; cnt += 2;