ArduinoSound - SDWaveFile


Create an audio in source for a Wave file on an SD card




filename: filename of wave file on the SD card


 This reads a wave file from an SD card and plays it using the I2S interface to
 a MAX98357 I2S Amp Breakout board.

 * Arduino Zero, MKR Zero or MKR1000 board
 * SD breakout or shield connected
 * MAX98357:
   * GND connected GND
   * VIN connected 5V
   * LRC connected to pin 0 (Zero) or pin 3 (MKR1000, MKR Zero)
   * BCLK connected to pin 1 (Zero) or pin 2 (MKR1000, MKR Zero)
   * DIN connected to pin 9 (Zero) or pin A6 (MKR1000, MKR Zero)

 created 15 November 2016
 by Sandeep Mistry

#include <SD.h>
#include <ArduinoSound.h>

// filename of wave file to play
const char filename[] = "MUSIC.WAV";

// variable representing the Wave File
SDWaveFile waveFile;

void setup() {
  // Open serial communications and wait for port to open:
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only

  // setup the SD card, depending on your shield of breakout board
  // you may need to pass a pin number in begin for SS
  Serial.print("Initializing SD card...");
  if (!SD.begin()) {
    Serial.println("initialization failed!");
  Serial.println("initialization done.");

  // create a SDWaveFile
  waveFile = SDWaveFile(filename);

  // check if the WaveFile is valid
  if (!waveFile) {
    Serial.println("wave file is invalid!");
    while (1); // do nothing

  // print out some info. about the wave file
  Serial.print("Bits per sample = ");

  long channels = waveFile.channels();
  Serial.print("Channels = ");

  long sampleRate = waveFile.sampleRate();
  Serial.print("Sample rate = ");
  Serial.println(" Hz");

  long duration = waveFile.duration();
  Serial.print("Duration = ");
  Serial.println(" seconds");

  // adjust the playback volume

  // check if the I2S output can play the wave file
  if (!AudioOutI2S.canPlay(waveFile)) {
    Serial.println("unable to play wave file using I2S!");
    while (1); // do nothing

  // start playback
  Serial.println("starting playback");;

void loop() {
  // check if playback is still going on
  if (!AudioOutI2S.isPlaying()) {
    // playback has stopped

    Serial.println("playback stopped");
    while (1); // do nothing