|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- /*
- VERSION 2 - use modified library which has been changed to handle
- one channel instead of two
-
- Proc = 21 (22), Mem = 4 (6)
- 140529
- 2a
- - default at startup is to have passthru ON and the button
- switches the flange effect in.
-
-
- From: http://www.cs.cf.ac.uk/Dave/CM0268/PDF/10_CM0268_Audio_FX.pdf
- about Comb filter effects
- Effect Delay range (ms) Modulation
- Resonator 0 - 20 None
- Flanger 0 - 15 Sinusoidal (approx 1Hz)
- Chorus 25 - 50 None
- Echo >50 None
-
- FMI:
- The audio board uses the following pins.
- 6 - MEMCS
- 7 - MOSI
- 9 - BCLK
- 10 - SDCS
- 11 - MCLK
- 12 - MISO
- 13 - RX
- 14 - SCLK
- 15 - VOL
- 18 - SDA
- 19 - SCL
- 22 - TX
- 23 - LRCLK
-
-
- AudioProcessorUsage()
- AudioProcessorUsageMax()
- AudioProcessorUsageMaxReset()
- AudioMemoryUsage()
- AudioMemoryUsageMax()
- AudioMemoryUsageMaxReset()
-
- The CPU usage is an integer from 0 to 100, and the memory is from 0 to however
- many blocks you provided with AudioMemory().
-
-
- */
-
- #include <Audio.h>
- #include <Wire.h>
- #include <SD.h>
- #include <SPI.h>
- #include <Bounce.h>
-
- // Number of samples in each delay line
- #define FLANGE_DELAY_LENGTH (6*AUDIO_BLOCK_SAMPLES)
- // Allocate the delay lines for left and right channels
- short l_delayline[FLANGE_DELAY_LENGTH];
- short r_delayline[FLANGE_DELAY_LENGTH];
-
- // Default is to just pass the audio through. Grounding this pin
- // applies the flange effect
- // Don't use any of the pins listed above
- #define PASSTHRU_PIN 1
-
- Bounce b_passthru = Bounce(PASSTHRU_PIN,15);
-
- //const int myInput = AUDIO_INPUT_MIC;
- const int myInput = AUDIO_INPUT_LINEIN;
-
- AudioInputI2S audioInput; // audio shield: mic or line-in
- AudioEffectFlange l_myEffect;
- AudioEffectFlange r_myEffect;
- AudioOutputI2S audioOutput; // audio shield: headphones & line-out
-
- // Create Audio connections between the components
- // Both channels of the audio input go to the flange effect
- AudioConnection c1(audioInput, 0, l_myEffect, 0);
- AudioConnection c2(audioInput, 1, r_myEffect, 0);
- // both channels from the flange effect go to the audio output
- AudioConnection c3(l_myEffect, 0, audioOutput, 0);
- AudioConnection c4(r_myEffect, 0, audioOutput, 1);
-
- AudioControlSGTL5000 audioShield;
-
-
- int s_idx = FLANGE_DELAY_LENGTH/4;
- int s_depth = FLANGE_DELAY_LENGTH/4;
- double s_freq = .5;
- void setup() {
-
- Serial.begin(9600);
- while (!Serial) ;
- delay(3000);
-
- pinMode(PASSTHRU_PIN,INPUT_PULLUP);
-
- // It doesn't work properly with any less than 8
- // but that was an earlier version. Processor and
- // memory usage are now (ver j)
- // Proc = 24 (24), Mem = 4 (4)
- AudioMemory(8);
-
- audioShield.enable();
- audioShield.inputSelect(myInput);
- audioShield.volume(0.5);
-
- // Warn that the passthru pin is grounded
- if(!digitalRead(PASSTHRU_PIN)) {
- Serial.print("PASSTHRU_PIN (");
- Serial.print(PASSTHRU_PIN);
- Serial.println(") is grounded");
- }
-
- // Set up the flange effect:
- // address of delayline
- // total number of samples in the delay line
- // Index (in samples) into the delay line for the added voice
- // Depth of the flange effect
- // frequency of the flange effect
- l_myEffect.begin(l_delayline,FLANGE_DELAY_LENGTH,s_idx,s_depth,s_freq);
- r_myEffect.begin(r_delayline,FLANGE_DELAY_LENGTH,s_idx,s_depth,s_freq);
- // Initially the effect is off. It is switched on when the
- // PASSTHRU button is pushed.
- l_myEffect.voices(FLANGE_DELAY_PASSTHRU,0,0);
- r_myEffect.voices(FLANGE_DELAY_PASSTHRU,0,0);
-
- Serial.println("setup done");
- AudioProcessorUsageMaxReset();
- AudioMemoryUsageMaxReset();
- }
-
-
- // audio volume
- int volume = 0;
-
- unsigned long last_time = millis();
- void loop()
- {
- // Volume control
- int n = analogRead(15);
- if (n != volume) {
- volume = n;
- audioShield.volume((float)n / 10.23);
- }
- if(0) {
- if(millis() - last_time >= 5000) {
- Serial.print("Proc = ");
- Serial.print(AudioProcessorUsage());
- Serial.print(" (");
- Serial.print(AudioProcessorUsageMax());
- Serial.print("), Mem = ");
- Serial.print(AudioMemoryUsage());
- Serial.print(" (");
- Serial.print(AudioMemoryUsageMax());
- Serial.println(")");
- last_time = millis();
- }
- }
- // update the button
- b_passthru.update();
-
- // If the passthru button is pushed
- // turn the flange effect on
- // filter index and then switch the effect to passthru
- if(b_passthru.fallingEdge()) {
- l_myEffect.voices(s_idx,s_depth,s_freq);
- r_myEffect.voices(s_idx,s_depth,s_freq);
- }
-
- // If passthru button is released restore passthru
- if(b_passthru.risingEdge()) {
- l_myEffect.voices(FLANGE_DELAY_PASSTHRU,0,0);
- r_myEffect.voices(FLANGE_DELAY_PASSTHRU,0,0);
- }
-
- }
|