migration from 'smp_v1p0' dev. for 'sampler' -> skip irrelavant note msg. and keep playing
136 lines
3.9 KiB
C++
136 lines
3.9 KiB
C++
// Granular Effect Example - Pitch shift or freeze sound
|
|
//
|
|
// This example is meant to be used with 3 buttons (pin 0,
|
|
// 1, 2) and 2 knobs (pins 16/A2, 17/A3), which are present
|
|
// on the audio tutorial kit.
|
|
// https://www.pjrc.com/store/audio_tutorial_kit.html
|
|
//
|
|
// Data files to put on your SD card can be downloaded here:
|
|
// http://www.pjrc.com/teensy/td_libs_AudioDataFiles.html
|
|
//
|
|
// This example code is in the public domain.
|
|
|
|
#include <Audio.h>
|
|
#include <Wire.h>
|
|
#include <SPI.h>
|
|
#include <SD.h>
|
|
#include <SerialFlash.h>
|
|
#include <Bounce.h>
|
|
|
|
AudioPlaySdWav playSdWav1; //xy=163,135
|
|
AudioMixer4 mixer1; //xy=332,167
|
|
AudioEffectGranular granular1; //xy=504,155
|
|
AudioOutputI2S i2s1; //xy=664,185
|
|
AudioConnection patchCord1(playSdWav1, 0, mixer1, 0);
|
|
AudioConnection patchCord2(playSdWav1, 1, mixer1, 1);
|
|
AudioConnection patchCord3(mixer1, granular1);
|
|
AudioConnection patchCord4(granular1, 0, i2s1, 0);
|
|
AudioConnection patchCord5(granular1, 0, i2s1, 1);
|
|
AudioControlSGTL5000 sgtl5000_1; //xy=236,248
|
|
|
|
Bounce button0 = Bounce(0, 15);
|
|
Bounce button1 = Bounce(1, 15);
|
|
Bounce button2 = Bounce(2, 15);
|
|
|
|
#define GRANULAR_MEMORY_SIZE 12800 // enough for 290 ms at 44.1 kHz
|
|
int16_t granularMemory[GRANULAR_MEMORY_SIZE];
|
|
|
|
// 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
|
|
|
|
// Use these for the SD+Wiz820 or other adaptors
|
|
//#define SDCARD_CS_PIN 4
|
|
//#define SDCARD_MOSI_PIN 11
|
|
//#define SDCARD_SCK_PIN 13
|
|
|
|
#define NUM_FILES 4
|
|
const char *filenames[NUM_FILES]={"SDTEST1.WAV", "SDTEST2.WAV", "SDTEST3.WAV", "SDTEST4.WAV"};
|
|
int nextfile=0;
|
|
|
|
void setup() {
|
|
Serial.begin(9600);
|
|
AudioMemory(10);
|
|
|
|
pinMode(0, INPUT_PULLUP);
|
|
pinMode(1, INPUT_PULLUP);
|
|
pinMode(2, INPUT_PULLUP);
|
|
|
|
sgtl5000_1.enable();
|
|
sgtl5000_1.volume(0.5);
|
|
|
|
mixer1.gain(0, 0.5);
|
|
mixer1.gain(1, 0.5);
|
|
|
|
// the Granular effect requires memory to operate
|
|
granular1.begin(granularMemory, GRANULAR_MEMORY_SIZE);
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
void loop() {
|
|
if (playSdWav1.isPlaying() == false) {
|
|
// start the next song playing
|
|
playSdWav1.play(filenames[nextfile]);
|
|
Serial.print("Playing: ");
|
|
Serial.println(filenames[nextfile]);
|
|
delay(5); // brief delay for the library read WAV info
|
|
nextfile = nextfile + 1;
|
|
if (nextfile >= NUM_FILES) {
|
|
nextfile = 0;
|
|
}
|
|
}
|
|
|
|
// read pushbuttons
|
|
button0.update();
|
|
button1.update();
|
|
button2.update();
|
|
// read knobs, scale to 0-1.0 numbers
|
|
float knobA2 = (float)analogRead(A2) / 1023.0;
|
|
float knobA3 = (float)analogRead(A3) / 1023.0;
|
|
|
|
// Button 0 starts Freeze effect
|
|
if (button0.fallingEdge()) {
|
|
float msec = 100.0 + (knobA3 * 190.0);
|
|
granular1.beginFreeze(msec);
|
|
Serial.print("Begin granular freeze using ");
|
|
Serial.print(msec);
|
|
Serial.println(" grains");
|
|
}
|
|
if (button0.risingEdge()) {
|
|
granular1.stop();
|
|
}
|
|
|
|
// Button 1 starts Pitch Shift effect
|
|
if (button1.fallingEdge()) {
|
|
float msec = 25.0 + (knobA3 * 75.0);
|
|
granular1.beginPitchShift(msec);
|
|
Serial.print("Begin granular pitch phift using ");
|
|
Serial.print(msec);
|
|
Serial.println(" grains");
|
|
}
|
|
if (button1.risingEdge()) {
|
|
granular1.stop();
|
|
}
|
|
|
|
// Continuously adjust the speed, based on the A3 pot
|
|
float ratio;
|
|
ratio = powf(2.0, knobA2 * 2.0 - 1.0); // 0.5 to 2.0
|
|
//ratio = powf(2.0, knobA2 * 6.0 - 3.0); // 0.125 to 8.0 -- uncomment for far too much range!
|
|
granular1.setSpeed(ratio);
|
|
}
|