/*
Teensy Audio Library test of different audio outputs:
a) I2S (e.g. UDA1334A breakout board or Teensy Audio Shield)
b) USB
c) Teensy 3.6 built-in DAC
Based on Teensy Audio Library SamplePlayer example, but using
Elegoo IR Keypad and TSOP38238 IR Receiver as actuator
UDA1334A Connections:
VIN - 3.3V on Teensy
GND - GND on Teensy
DIN - OUT1A on Teensy (pin 7)
WSEL - LRCLK1 on Teensy (pin 20)
BCLK - BCLK1 on Teensy (pin 21)
MCLK1 on Teensy (pin 23) can be left disconnected
Teensy 3.6 DAC Connections:
Audio output - DAC0 (pin 21) on Teensy
TSOP38238 Connections:
TSOP38238 module with curved face forward, from left to right:
Pin1 (Signal) - pin 2 on Teensy
Pin2 (GND) - GND on Teensy
Pin3 (VCC) - 3.3V on Teensy
*/
//#define DACOUT
//#define I2SOUT_SGTL5000
#define I2SOUT_UDA1334
//#define USBOUT // if using USB out, set Tools...USB Type to 'Audio'
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
#include <IRremote.h>
#include "IRElegoo.h"
// WAV files converted to code by wav2sketch
#include "AudioSampleSnare.h" // http://www.freesound.org/people/KEVOY/sounds/82583/
#include "AudioSampleTomtom.h" // http://www.freesound.org/people/zgump/sounds/86334/
#include "AudioSampleHihat.h" // http://www.freesound.org/people/mhc/sounds/102790/
#include "AudioSampleKick.h" // http://www.freesound.org/people/DWSD/sounds/171104/
#include "AudioSampleGong.h" // http://www.freesound.org/people/juskiddink/sounds/86773/
#include "AudioSampleCashregister.h" // http://www.freesound.org/people/kiddpark/sounds/201159/
// Use these with the Teensy Audio Shield
//#define SDCARD_CS_PIN 10
//#define SDCARD_MOSI_PIN 7
//#define SDCARD_SCK_PIN 14
// Use these with the Teensy 3.5 & 3.6 SD card
#define SDCARD_CS_PIN BUILTIN_SDCARD
#define SDCARD_MOSI_PIN 11 // not actually used
#define SDCARD_SCK_PIN 13 // not actually used
#define IRRECV_PIN 2
#define LED_PIN LED_BUILTIN
// Create the IR Receiver
//
IRrecv irrecv(IRRECV_PIN);
decode_results results;
// Create the Audio components. These should be created in the
// order data flows, inputs/sources -> processing -> outputs
//
AudioPlayMemory sound0;
AudioPlayMemory sound1; // six memory players, so we can play
AudioPlayMemory sound2; // all six sounds simultaneously
AudioPlayMemory sound3;
AudioPlayMemory sound4;
AudioPlayMemory sound5;
AudioPlaySdWav wav1;
AudioMixer4 mix1; // two 4-channel mixers are needed in
AudioMixer4 mix2; // tandem to combine 6 audio sources
AudioAmplifier amp1;
#if defined(I2SOUT_SGTL5000)
AudioOutputI2S audio;
#elif defined(I2SOUT_UDA1334)
AudioOutputI2S audio;
#elif defined(USBOUT)
AudioOutputUSB audio;
#elif defined(DACOUT)
AudioOutputAnalog audio;
#endif
// Create Audio connections between the components
//
AudioConnection c1(sound0, 0, mix1, 0);
AudioConnection c2(sound1, 0, mix1, 1);
AudioConnection c3(sound2, 0, mix1, 2);
AudioConnection c4(sound3, 0, mix1, 3);
AudioConnection c5(mix1, 0, mix2, 0); // output of mix1 into 1st input on mix2
AudioConnection c6(sound4, 0, mix2, 1);
AudioConnection c7(sound5, 0, mix2, 2);
AudioConnection c8(wav1, 0, mix2, 3);
AudioConnection c9(mix2, amp1);
AudioConnection c10(amp1, 0, audio, 0);
AudioConnection c11(amp1, 0, audio, 1);
#if defined(I2SOUT_SGTL5000)
AudioControlSGTL5000 audioShield;
#endif
float vol = 1.0;
bool pwr = true;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(LED_PIN, OUTPUT);
AudioMemory(10);
// Setup built-in SD card reading
SPI.setMOSI(SDCARD_MOSI_PIN);
SPI.setSCK(SDCARD_SCK_PIN);
if (!(SD.begin(SDCARD_CS_PIN))) {
// stop here, but print a message repetitively
while (1) {
Serial.println("Unable to access the SD card");
delay(500);
}
}
// Turn on the audio shield output
#if defined(I2SOUT_SGTL5000)
audioShield.enable();
audioShield.volume(0.5);
#endif
// Reduce the gain on mixer channels, so more than 1
// sound can play simultaneously without clipping
mix1.gain(0, 0.4);
mix1.gain(1, 0.4);
mix1.gain(2, 0.4);
mix1.gain(3, 0.4);
mix2.gain(1, 0.4);
mix2.gain(2, 0.4);
mix2.gain(3, 0.4);
amp1.gain(1.0);
}
void loop() {
if (irrecv.decode(&results)) {
switch (results.value) {
case BTN_0:
//Serial.println("Snare");
sound0.play(AudioSampleSnare);
break;
case BTN_1:
//Serial.println("TomTom");
sound1.play(AudioSampleTomtom);
break;
case BTN_2:
//Serial.println("HiHat");
sound2.play(AudioSampleHihat);
break;
case BTN_3:
//Serial.println("Kick");
sound3.play(AudioSampleKick);
break;
case BTN_4:
//Serial.println("Gong");
sound4.play(AudioSampleGong);
break;
case BTN_5:
//Serial.println("Cash Register");
sound5.play(AudioSampleCashregister);
break;
case BTN_6:
//Serial.println("WAV file on SD card");
wav1.play("SDTEST1.WAV");
break;
case BTN_7:
//Serial.println("WAV file on SD card");
wav1.play("SDTEST2.WAV");
break;
case BTN_8:
//Serial.println("WAV file on SD card");
wav1.play("SDTEST3.WAV");
break;
case BTN_9:
//Serial.println("WAV file on SD card");
wav1.play("SDTEST4.WAV");
break;
case BTN_VINC:
//Serial.println("Volume up");
if (vol < 1.0) {
vol += 0.1;
amp1.gain(vol);
}
break;
case BTN_VDEC:
//Serial.println("Volume down");
if (vol > 0.0) {
vol -= 0.1;
amp1.gain(vol);
}
break;
case BTN_FNC:
//Serial.println("Stop all playback");
sound0.stop();
sound1.stop();
sound2.stop();
sound3.stop();
sound4.stop();
sound5.stop();
wav1.stop();
break;
case BTN_PWR:
pwr = !pwr;
digitalWrite(LED_PIN, pwr); // used to provide visual check of IR connectivity
break;
default:
// Serial.println("Unknown button");
break;
}
irrecv.resume();
}
}