found some bugs now 4 samples play simultaneous without errors

This commit is contained in:
Sebastian
2025-06-30 09:44:44 +02:00
parent 7418cdfd35
commit d44210ce59
3 changed files with 53 additions and 33 deletions

View File

@ -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;

View File

@ -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;
//

View File

@ -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;