Is that on flash or sdcard?
//CORE_PIN11_CONFIG = PORT_PCR_DSE | PORT_PCR_MUX(2);
CORE_PIN7_CONFIG = PORT_PCR_DSE | PORT_PCR_MUX(2);
CORE_PIN12_CONFIG = PORT_PCR_MUX(2);
//CORE_PIN13_CONFIG = PORT_PCR_DSE | PORT_PCR_MUX(2);
CORE_PIN14_CONFIG = PORT_PCR_DSE | PORT_PCR_MUX(2);
#include "SD.h"
#include "SdFat.h"
SdFat SD;
bool AudioPlaySdRaw::play(const char *filename):
rawfile = SD.open(filename);
if (!rawfile) {
if (!rawfile.open(filename,O_READ)) {
#include "SD.h"
#include "SdFat.h"
SdFat SD;
// Record sound as raw data to a SD card, and play it back.
//
// Requires the audio shield:
// http://www.pjrc.com/store/teensy3_audio.html
//
// Three pushbuttons need to be connected:
// Record Button: pin 0 to GND
// Stop Button: pin 1 to GND
// Play Button: pin 2 to GND
//
// This example code is in the public domain.
//
#include <Bounce.h>
#include <Audio.h>
#include <Wire.h>
#include <SdFat.h>
// define below to print timing information
#define WRITE_TEST 1
#ifdef WRITE_TEST
uint32_t mintime,maxtime,tottime,navg;
#endif
// GUItool: begin automatically generated code
AudioInputI2S i2s2; //xy=105,63
AudioAnalyzePeak peak1; //xy=278,108
AudioRecordQueue queue1; //xy=281,63
AudioPlaySdRaw playRaw1; //xy=302,157
AudioOutputI2S i2s1; //xy=470,120
AudioConnection patchCord1(i2s2, 0, queue1, 0);
AudioConnection patchCord2(i2s2, 0, peak1, 0);
AudioConnection patchCord3(playRaw1, 0, i2s1, 0);
AudioConnection patchCord4(playRaw1, 0, i2s1, 1);
AudioControlSGTL5000 sgtl5000_1; //xy=265,212
// GUItool: end automatically generated code
const int pinRec=24;
const int pinStop=25;
const int pinPlay=26;
// Bounce objects to easily and reliably read the buttons
Bounce buttonRecord = Bounce(pinRec, 8);
Bounce buttonStop = Bounce(pinStop, 8); // 8 = 8 ms debounce time
Bounce buttonPlay = Bounce(pinPlay, 8);
// which input on the audio shield will be used?
const int myInput = AUDIO_INPUT_LINEIN;
//const int myInput = AUDIO_INPUT_MIC;
// Remember which mode we're doing
int mode = 0; // 0=stopped, 1=recording, 2=playing
SdFat SD;
// The file where data is recorded
File frec;
void setup() {
// Configure the pushbutton pins
pinMode(pinRec, INPUT_PULLUP);
pinMode(pinStop, INPUT_PULLUP);
pinMode(pinPlay, INPUT_PULLUP);
#ifdef WRITE_TEST
mintime=1000000;
maxtime=0;
tottime=0;
navg=0;
#endif
// Audio connections require memory, and the record queue
// uses this memory to buffer incoming audio.
AudioMemory(60);
// Enable the audio shield, select input, and enable output
sgtl5000_1.enable();
sgtl5000_1.inputSelect(myInput);
sgtl5000_1.volume(0.5);
// Initialize the SD card
if (!(SD.begin(10))) {
// stop here if no SD card, but print a message
while (1) {
Serial.println("Unable to access the SD card");
delay(500);
}
}
}
void loop() {
// First, read the buttons
buttonRecord.update();
buttonStop.update();
buttonPlay.update();
// Respond to button presses
if (buttonRecord.fallingEdge()) {
Serial.println("Record Button Press");
if (mode == 2) stopPlaying();
if (mode == 0) startRecording();
}
if (buttonStop.fallingEdge()) {
Serial.println("Stop Button Press");
if (mode == 1) stopRecording();
if (mode == 2) stopPlaying();
}
if (buttonPlay.fallingEdge()) {
Serial.println("Play Button Press");
if (mode == 1) stopRecording();
if (mode == 0) startPlaying();
}
// If we're playing or recording, carry on...
if (mode == 1) {
continueRecording();
}
if (mode == 2) {
continuePlaying();
}
// when using a microphone, continuously adjust gain
if (myInput == AUDIO_INPUT_MIC) adjustMicLevel();
}
void startRecording() {
Serial.println("startRecording");
if (SD.exists("RECORD.RAW")) {
// The SD library writes new data to the end of the
// file, so to start a new recording, the old file
// must be deleted before new data is written.
SD.remove("RECORD.RAW");
}
frec = SD.open("RECORD.RAW", FILE_WRITE);
if (frec) {
queue1.begin();
mode = 1;
}
}
void continueRecording() {
if (queue1.available() >= 2) {
byte buffer[512];
// Fetch 2 blocks from the audio library and copy
// into a 512 byte buffer. The Arduino SD library
// is most efficient when full 512 byte sector size
// writes are used.
memcpy(buffer, queue1.readBuffer(), 256);
queue1.freeBuffer();
memcpy(buffer+256, queue1.readBuffer(), 256);
queue1.freeBuffer();
// write all 512 bytes to the SD card
#ifdef WRITE_TEST
elapsedMicros usec = 0;
#endif
frec.write(buffer, 512);
// Uncomment these lines to see how long SD writes
// are taking. A pair of audio blocks arrives every
// 5802 microseconds, so hopefully most of the writes
// take well under 5802 us. Some will take more, as
// the SD library also must write to the FAT tables
// and the SD card controller manages media erase and
// wear leveling. The queue1 object can buffer
// approximately 301700 us of audio, to allow time
// for occasional high SD card latency, as long as
// the average write time is under 5802 us.
#ifdef WRITE_TEST
uint32_t t=usec;
tottime+=t;
navg++;
if (t>maxtime) {
maxtime=t;
}
if (t<mintime) {
mintime=t;
}
#endif
}
}
void stopRecording() {
Serial.println("stopRecording");
queue1.end();
if (mode == 1) {
while (queue1.available() > 0) {
frec.write((byte*)queue1.readBuffer(), 256);
queue1.freeBuffer();
}
frec.close();
#ifdef WRITE_TEST
Serial.println("sdcard write timing (usec)");
Serial.print("minimum write time=");
Serial.println(mintime);
Serial.print("maximum write time=");
Serial.println(maxtime);
Serial.print("average write time=");
Serial.println(tottime/(float)navg);
mintime=1000000;
maxtime=0;
tottime=0;
navg=0;
#endif
}
mode = 0;
}
void startPlaying() {
Serial.println("startPlaying");
playRaw1.play("RECORD.RAW");
mode = 2;
}
void continuePlaying() {
if (!playRaw1.isPlaying()) {
playRaw1.stop();
mode = 0;
}
}
void stopPlaying() {
Serial.println("stopPlaying");
if (mode == 2) playRaw1.stop();
mode = 0;
}
void adjustMicLevel() {
// TODO: read the peak1 object and adjust sgtl5000_1.micGain()
// if anyone gets this working, please submit a github pull request :-)
}
Using the playMem to play out of program memory
View attachment 5716View attachment 5717View attachment 5718
Sorry, on upload the order turned out to be:
0.1 amplitude direct from DAC
0.5 amplitude via amp chip
0.01 amplitude via amp chip
... and would like to save it to store it directly in memory (not SD card) for subsequent processing. I have been unable to find a means of recording such an internally-generated sound.
Hi If by #1266 you mean the WavFilePlayer example, I also now have it outputting chirp WAV files generated by Audacity. I have been studying your LED array example but the mention of the 12bit DAC makes me think I should perhaps stick to the queue object. I just want files I can convert to FFT-processable numbers. It's quite disconcerting how compact and powerful the Teensyduino code is, and it took me a week to figure out that a fresh audio design page can be obtained by dragging a box around the objects and deleting them!I'm running the code from #1266 with a SD card loaded with the WAV file from #1263. It's playing the file correctly.
I'm running the code from #1266 with a SD card loaded with the WAV file from #1263. It's playing the file correctly.
Do you have any idea what the problem might be?