Code:
// based on examples: play wav, do more while playing, recorder
// instrucao: pin 0
// gravar: pin 1
#define BUTTON_PIN_1 0
#define BUTTON_PIN_2 1
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
#include <Bounce2.h>
AudioInputI2S audioIn;
AudioOutputI2S audioOut;
// AudioAnalyzePeak peak1;
AudioRecordQueue record1;
AudioPlaySdWav playWav1;
AudioPlaySdRaw playRaw1;
AudioConnection patchCord1(audioIn, 0, audioOut, 0);
AudioConnection patchCord2(audioIn, 1, audioOut, 1);
AudioConnection patchCord3(audioIn, 0, record1, 0);
AudioConnection patchCord4(playWav1, 0, audioOut, 0);
AudioConnection patchCord5(playWav1, 1, audioOut, 1);
AudioConnection patchCord6(playRaw1, 0, audioOut, 0);
AudioConnection patchCord7(playRaw1, 0, audioOut, 1);
AudioControlSGTL5000 sgtl5000_1;
Bounce buttonInstru = Bounce();
Bounce buttonRecord = Bounce(); // 8 = 8 ms debounce time
#define SDCARD_CS_PIN 10
#define SDCARD_MOSI_PIN 7
#define SDCARD_SCK_PIN 14
const byte recLedPin2 = 2;
const byte recLedPin3 = 3;
const byte instrLedPin4 = 4;
const byte instrLedPin5 = 5;
File frec;
//character array to store changing filename
char fname[11];
unsigned int i = 0;
void setup() {
Serial.begin(9600);
pinMode( BUTTON_PIN_1, INPUT_PULLUP );
buttonInstru.attach( BUTTON_PIN_1 );
buttonInstru.interval(5);
pinMode( BUTTON_PIN_2, INPUT_PULLUP );
buttonRecord.attach( BUTTON_PIN_2 );
buttonRecord.interval(5);
pinMode (2, OUTPUT);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
AudioMemory(60);
sgtl5000_1.enable();
sgtl5000_1.inputSelect(AUDIO_INPUT_LINEIN);
sgtl5000_1.volume(0.6);
SPI.setMOSI(SDCARD_MOSI_PIN);
SPI.setSCK(SDCARD_SCK_PIN);
if (!(SD.begin(SDCARD_CS_PIN))) {
// stop here if no SD card, but print a message
while (1) {
Serial.println("Unable to access the SD card");
delay(500);
}
}
sprintf(fname,"%d.RAW", (i++) % 999999 );
Serial.println(fname);
delay(1000);
}
byte modo = 0;
// 0 = antes_de_instruir, 1 = instruindo, 2 = preparado_para_gravar, 3 = gravando, 4 = tocando a gravacao.
elapsedMillis blinkTime;
byte ledState = LOW; // ledState used to set the LED
unsigned long previousMillis = 0; // will store last time LED was updated
unsigned long interv = 1000; // interval at which to blink (milliseconds)
void loop() {
unsigned long currentMillis = millis();
buttonInstru.update();
buttonRecord.update();
if ( buttonInstru.fallingEdge() ) {
if ( (modo == 0) || ( modo == 2 ) ) {
Serial.println("instru");
modo = 1;
}
}
if (modo == 0) {
digitalWrite(recLedPin2, LOW);
digitalWrite(recLedPin3, LOW);
if (currentMillis - previousMillis > interv) {
previousMillis = currentMillis;
ledState = !ledState;
digitalWrite(instrLedPin4, ledState);
digitalWrite(instrLedPin5, ledState);
}
}
if (modo == 1) {
ledState = HIGH;
digitalWrite(instrLedPin4, ledState);
digitalWrite(instrLedPin5, ledState);
if (playWav1.isPlaying() == false) {
playWav1.play("INSTRUCA.WAV");
delay(5); // wait for library to parse WAV info
}
modo = 2;
}
if (modo == 2) {
if (!playWav1.isPlaying()) {
digitalWrite(instrLedPin4, LOW);
digitalWrite(instrLedPin5, LOW);
if (currentMillis - previousMillis > interv) {
previousMillis = currentMillis;
ledState = !ledState;
digitalWrite(recLedPin2, ledState);
digitalWrite(recLedPin3, ledState);
}
}
}
if (buttonRecord.fallingEdge()) {
if ( modo == 0 || modo == 2 ) {
modo = 3;
if (SD.exists("RECORD.RAW")) {
//sprintf(fname,"%d.RAW", (i++) % 999999 );
SD.remove("RECORD.RAW");
}
frec = SD.open("RECORD.RAW", FILE_WRITE);
if (frec) {
record1.begin();
}
}
}
if (modo == 3) {
ledState = HIGH;
digitalWrite(recLedPin2, ledState);
digitalWrite(recLedPin3, ledState);
if (record1.available() >= 2) {
byte buffer[512];
memcpy(buffer, record1.readBuffer(), 256);
record1.freeBuffer();
memcpy(buffer+256, record1.readBuffer(), 256);
record1.freeBuffer();
// elapsedMicros usec = 0;
frec.write(buffer, 512);
}
}
if (buttonRecord.risingEdge()) {
if (modo == 3) {
modo = 4;
Serial.println("gravou");
record1.end();
while (record1.available() > 0) {
frec.write((byte*)record1.readBuffer(), 256);
record1.freeBuffer();
}
frec.close();
playRaw1.play("RECORD.RAW");
delay(5);
modo = 4;
}
}
if (modo == 4) {
if ( playRaw1.isPlaying() ) {
if ( blinkTime > 1000) {
ledState = !ledState;
digitalWrite(2, ledState);
digitalWrite(3, !ledState);
digitalWrite(4, ledState);
digitalWrite(5, !ledState);
}
} else {
modo = 0;
//sprintf(fname,"%8ld.RAW", random(1,10000000) );
}
}
}
// 0 = tudo tranquilo, 1 = instruindo, 2 = preparado_para_gravar, 3 = gravando, 4 = tocando
Kind regards,