Hi forum,
I'm working with a Capacitive touch keyboard that triggers ".raw" samples from the SD card (using T3.2 +audioShield).
I wish to have the keyboard as polyphonic as possible (i.e play at least 4 files at once).
here's the sketch :
My problem is that as soon as I play a bit faster, it either not-play every third key or so, or that it breaks down and gets stuck on static noise (then I have to reboot).
When I make it monophonic, the keyboard works perfectly.
Here's the monophonic sketch:
Here are my error messages :
* I tried first with the playSdWav object but it felt more flimsy and tended to break more easily.
I converted the files from wav to raw with Audacity.
Any suggestions on how to tackle this matter?
Thank you
I'm working with a Capacitive touch keyboard that triggers ".raw" samples from the SD card (using T3.2 +audioShield).
I wish to have the keyboard as polyphonic as possible (i.e play at least 4 files at once).
here's the sketch :
Code:
#include <Bounce.h>
#include "pitches.h"
///////CAP TOUCH///////////////////
#include <Wire.h>
#include "Adafruit_MPR121.h"
#ifndef _BV
#define _BV(bit) (1 << (bit))
#endif
#define SDCARD_CS_PIN 10
#define SDCARD_MOSI_PIN 7
#define SDCARD_SCK_PIN 14
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
// GUItool: begin automatically generated code
AudioPlaySdRaw playSdRaw1; //xy=185,103
AudioPlaySdRaw playSdRaw2; //xy=185,145
AudioPlaySdRaw playSdRaw3; //xy=190,197
AudioPlaySdRaw playSdRaw4; //xy=211,244
AudioMixer4 mixer1; //xy=476,179
AudioOutputI2S i2s1; //xy=747,191
AudioConnection patchCord1(playSdRaw1, 0, mixer1, 0);
AudioConnection patchCord2(playSdRaw2, 0, mixer1, 1);
AudioConnection patchCord3(playSdRaw3, 0, mixer1, 2);
AudioConnection patchCord4(playSdRaw4, 0, mixer1, 3);
AudioConnection patchCord5(mixer1, 0, i2s1, 0);
AudioConnection patchCord6(mixer1, 0, i2s1, 1);
AudioControlSGTL5000 sgtl5000_1; //xy=592,392
// GUItool: end automatically generated code
//CAP TOUCH Vars//
Adafruit_MPR121 cap = Adafruit_MPR121();
uint16_t lasttouched = 0;
uint16_t currtouched = 0;
int SdRawMode = 0;
///////////////////NOTES ARRAY/////////////////////////////
char* notes[] = {
"C4.Raw", "D4.Raw", "G4.Raw","A4.Raw", "C5.Raw", "E4.Raw", "F4.Raw", "B4.Raw"
};
void setup() {
Serial.begin(9600);
///////CAP TOUCH STUFF////////////////////////
// Default address is 0x5A, if tied to 3.3V its 0x5B
// If tied to SDA its 0x5C and if SCL then 0x5D
if (!cap.begin(0x5A)) {
// Serial.println("MPR121 not found, check wiring?");
while (1);
}
// Serial.println("MPR121 found!");
AudioMemory(10);
sgtl5000_1.enable();
sgtl5000_1.volume(0.5);
mixer1.gain(0, 0.6);
mixer1.gain(1, 0.6);
mixer1.gain(2, 0.6);
mixer1.gain(3, 0.6);
SPI.setMOSI(SDCARD_MOSI_PIN);
SPI.setSCK(SDCARD_SCK_PIN);
if (!(SD.begin(SDCARD_CS_PIN))) {
while (1) {
Serial.println("Unable to access the SD card");
delay(500);
}
}
delay(1000);
}
void loop() {
//////////////////CAPTOUCH KEYBOARD PLAY////////////////////////
currtouched = cap.touched();
for (uint8_t i=0; i<8; i++) {
//if key "i" is pressed - play notes[i]
if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) {
Serial.println(SdRawMode);
if (SdRawMode == 0){
playSdRaw1.play(notes[i]);
} else if (SdRawMode == 1){
playSdRaw2.play(notes[i]);
} else if (SdRawMode == 2){
playSdRaw3.play(notes[i]);
} else if (SdRawMode == 3){
playSdRaw4.play(notes[i]);
}
///Toggle modes to play the next "playSdRaw" object to make polyphonic
SdRawMode ++;
}
}
// return to "playSdRaw1"
if (SdRawMode > 3){
SdRawMode = 0;
}
lasttouched = currtouched;
}
My problem is that as soon as I play a bit faster, it either not-play every third key or so, or that it breaks down and gets stuck on static noise (then I have to reboot).
When I make it monophonic, the keyboard works perfectly.
Here's the monophonic sketch:
Code:
#include <Bounce.h>
#include "pitches.h"
///////CAP TOUCH///////////////////
#include <Wire.h>
#include "Adafruit_MPR121.h"
#ifndef _BV
#define _BV(bit) (1 << (bit))
#endif
#define SDCARD_CS_PIN 10
#define SDCARD_MOSI_PIN 7
#define SDCARD_SCK_PIN 14
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
// GUItool: begin automatically generated code
AudioPlaySdRaw playSdRaw1; //xy=185,103
AudioPlaySdRaw playSdRaw2; //xy=185,145
AudioPlaySdRaw playSdRaw3; //xy=190,197
AudioPlaySdRaw playSdRaw4; //xy=211,244
AudioMixer4 mixer1; //xy=476,179
AudioOutputI2S i2s1; //xy=747,191
AudioConnection patchCord1(playSdRaw1, 0, mixer1, 0);
AudioConnection patchCord2(playSdRaw2, 0, mixer1, 1);
AudioConnection patchCord3(playSdRaw3, 0, mixer1, 2);
AudioConnection patchCord4(playSdRaw4, 0, mixer1, 3);
AudioConnection patchCord5(mixer1, 0, i2s1, 0);
AudioConnection patchCord6(mixer1, 0, i2s1, 1);
AudioControlSGTL5000 sgtl5000_1; //xy=592,392
// GUItool: end automatically generated code
//CAP TOUCH Vars//
Adafruit_MPR121 cap = Adafruit_MPR121();
uint16_t lasttouched = 0;
uint16_t currtouched = 0;
int SdRawMode = 0;
///////////////////NOTES ARRAY/////////////////////////////
char* notes[] = {
"C4.Raw", "D4.Raw", "G4.Raw","A4.Raw", "C5.Raw", "E4.Raw", "F4.Raw", "B4.Raw"
};
void setup() {
Serial.begin(9600);
///////CAP TOUCH STUFF////////////////////////
// Default address is 0x5A, if tied to 3.3V its 0x5B
// If tied to SDA its 0x5C and if SCL then 0x5D
if (!cap.begin(0x5A)) {
// Serial.println("MPR121 not found, check wiring?");
while (1);
}
// Serial.println("MPR121 found!");
////////////////////////////////////////////////
AudioMemory(10);
sgtl5000_1.enable();
sgtl5000_1.volume(0.5);
mixer1.gain(0, 0.6);
mixer1.gain(1, 0.6);
mixer1.gain(2, 0.6);
mixer1.gain(3, 0.6);
SPI.setMOSI(SDCARD_MOSI_PIN);
SPI.setSCK(SDCARD_SCK_PIN);
if (!(SD.begin(SDCARD_CS_PIN))) {
while (1) {
Serial.println("Unable to access the SD card");
delay(500);
}
}
delay(1000);
}
void loop() {
//////////////////CAPTOUCH KEYBOARD PLAY////////////////////////
currtouched = cap.touched();
for (uint8_t i=0; i<8; i++) {
//if key "i" is pressed - play notes[i]
if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) {
Serial.println(SdRawMode);
playSdRaw1.play(notes[i]);
}
}
lasttouched = currtouched;
}
Here are my error messages :
Code:
Looper_sampleTest_SD_new_doup_poly:56: warning: ISO C++ forbids converting a string constant to 'char*'
};
^
Looper_sampleTest_SD_new_doup_poly:56: warning: ISO C++ forbids converting a string constant to 'char*'
Looper_sampleTest_SD_new_doup_poly:56: warning: ISO C++ forbids converting a string constant to 'char*'
Looper_sampleTest_SD_new_doup_poly:56: warning: ISO C++ forbids converting a string constant to 'char*'
Looper_sampleTest_SD_new_doup_poly:56: warning: ISO C++ forbids converting a string constant to 'char*'
Looper_sampleTest_SD_new_doup_poly:56: warning: ISO C++ forbids converting a string constant to 'char*'
Looper_sampleTest_SD_new_doup_poly:56: warning: ISO C++ forbids converting a string constant to 'char*'
Looper_sampleTest_SD_new_doup_poly:56: warning: ISO C++ forbids converting a string constant to 'char*'
/Users/ayalrosenberg/Documents/Arduino/libraries/Adafruit_MPR121/Adafruit_MPR121.cpp: In member function 'boolean Adafruit_MPR121::begin(uint8_t)':
/Users/ayalrosenberg/Documents/Arduino/libraries/Adafruit_MPR121/Adafruit_MPR121.cpp:67:3: warning: 'void Adafruit_MPR121::setThreshholds(uint8_t, uint8_t)' is deprecated [-Wdeprecated-declarations]
setThreshholds(12, 6);
^
In file included from /Users/ayalrosenberg/Documents/Arduino/libraries/Adafruit_MPR121/Adafruit_MPR121.cpp:29:0:
/Users/ayalrosenberg/Documents/Arduino/libraries/Adafruit_MPR121/Adafruit_MPR121.h:101:8: note: declared here
void setThreshholds(uint8_t touch, uint8_t release) __attribute__((deprecated));
^
/Users/ayalrosenberg/Documents/Arduino/libraries/Adafruit_MPR121/Adafruit_MPR121.cpp:67:23: warning: 'void Adafruit_MPR121::setThreshholds(uint8_t, uint8_t)' is deprecated [-Wdeprecated-declarations]
setThreshholds(12, 6);
^
In file included from /Users/ayalrosenberg/Documents/Arduino/libraries/Adafruit_MPR121/Adafruit_MPR121.cpp:29:0:
/Users/ayalrosenberg/Documents/Arduino/libraries/Adafruit_MPR121/Adafruit_MPR121.h:101:8: note: declared here
void setThreshholds(uint8_t touch, uint8_t release) __attribute__((deprecated));
^
Sketch uses 31628 bytes (12%) of program storage space. Maximum is 262144 bytes.
Global variables use 10232 bytes (15%) of dynamic memory, leaving 55304 bytes for local variables. Maximum is 65536 bytes.
* I tried first with the playSdWav object but it felt more flimsy and tended to break more easily.
I converted the files from wav to raw with Audacity.
Any suggestions on how to tackle this matter?
Thank you