| #include "analyze_fft1024.h" | #include "analyze_fft1024.h" | ||||
| #include "analyze_print.h" | #include "analyze_print.h" | ||||
| #include "analyze_tonedetect.h" | #include "analyze_tonedetect.h" | ||||
| #include "analyze_peakdetect.h" | |||||
| #include "analyze_peak.h" | |||||
| #include "control_sgtl5000.h" | #include "control_sgtl5000.h" | ||||
| #include "control_wm8731.h" | #include "control_wm8731.h" | ||||
| #include "effect_chorus.h" | #include "effect_chorus.h" |
| * THE SOFTWARE. | * THE SOFTWARE. | ||||
| */ | */ | ||||
| #include "analyze_peakdetect.h" | |||||
| #include "analyze_peak.h" | |||||
| void AudioAnalyzePeak::update(void) | void AudioAnalyzePeak::update(void) | ||||
| { | { | ||||
| audio_block_t *block; | audio_block_t *block; | ||||
| const int16_t *p, *end; | const int16_t *p, *end; | ||||
| int32_t min, max; | |||||
| block = receiveReadOnly(); | block = receiveReadOnly(); | ||||
| if (!block) { | if (!block) { | ||||
| return; | return; | ||||
| } | } | ||||
| if (!m_enabled) { | |||||
| release(block); | |||||
| return; | |||||
| } | |||||
| p = block->data; | p = block->data; | ||||
| end = p + AUDIO_BLOCK_SAMPLES; | end = p + AUDIO_BLOCK_SAMPLES; | ||||
| min = min_sample; | |||||
| max = max_sample; | |||||
| do { | do { | ||||
| int16_t d=*p++; | int16_t d=*p++; | ||||
| if(d<min) min=d; | |||||
| if(d>max) max=d; | |||||
| if (d<min) min=d; | |||||
| if (d>max) max=d; | |||||
| } while (p < end); | } while (p < end); | ||||
| min_sample = min; | |||||
| max_sample = max; | |||||
| new_output = true; | |||||
| release(block); | release(block); | ||||
| } | } | ||||
| void AudioAnalyzePeak::begin(bool noReset) | |||||
| { | |||||
| if(!noReset) | |||||
| { | |||||
| min=32767; | |||||
| max=-32767; | |||||
| } | |||||
| m_enabled=true; | |||||
| } | |||||
| uint16_t AudioAnalyzePeak::Dpp(void) | |||||
| { | |||||
| if(max>min) return max-min; else return 0; | |||||
| } | |||||
| #include "AudioStream.h" | #include "AudioStream.h" | ||||
| // TODO: this needs to be renamed to AudioAnalyzePeak | |||||
| class AudioAnalyzePeak : public AudioStream | class AudioAnalyzePeak : public AudioStream | ||||
| { | { | ||||
| public: | public: | ||||
| AudioAnalyzePeak(void) : AudioStream(1, inputQueueArray) { } | |||||
| AudioAnalyzePeak(void) : AudioStream(1, inputQueueArray) { | |||||
| min_sample = 32767; | |||||
| max_sample = -32768; | |||||
| } | |||||
| bool available(void) { | |||||
| __disable_irq(); | |||||
| bool flag = new_output; | |||||
| if (flag) new_output = false; | |||||
| __enable_irq(); | |||||
| return flag; | |||||
| } | |||||
| float read(void) { | |||||
| __disable_irq(); | |||||
| int diff = max_sample - min_sample; | |||||
| min_sample = 32767; | |||||
| max_sample = -32768; | |||||
| __enable_irq(); | |||||
| return diff / 65535.0; | |||||
| } | |||||
| virtual void update(void); | virtual void update(void); | ||||
| void begin(bool noReset); | |||||
| void begin(void) { begin(false); } | |||||
| void stop(void) { m_enabled=false; } | |||||
| uint16_t Dpp(void); | |||||
| private: | private: | ||||
| audio_block_t *inputQueueArray[1]; | audio_block_t *inputQueueArray[1]; | ||||
| bool m_enabled; | |||||
| int16_t max; | |||||
| int16_t min; | |||||
| volatile bool new_output; | |||||
| int16_t min_sample; | |||||
| int16_t max_sample; | |||||
| }; | }; | ||||
| #endif | #endif |
| #include <SPI.h> | #include <SPI.h> | ||||
| #include <SD.h> | #include <SD.h> | ||||
| const int myInput = AUDIO_INPUT_LINEIN; | |||||
| // const int myInput = AUDIO_INPUT_MIC; | |||||
| AudioInputAnalog audioInput(A0); // A0 is pin 14, feel free to change. | AudioInputAnalog audioInput(A0); // A0 is pin 14, feel free to change. | ||||
| AudioAnalyzePeak peak_M; | |||||
| AudioAnalyzePeak peak; | |||||
| AudioOutputAnalog audioOutput; // DAC pin. | AudioOutputAnalog audioOutput; // DAC pin. | ||||
| AudioConnection c1(audioInput,peak_M); | |||||
| AudioConnection c1(audioInput,peak); | |||||
| AudioConnection c2(audioInput,audioOutput); | AudioConnection c2(audioInput,audioOutput); | ||||
| void setup() { | void setup() { | ||||
| AudioMemory(4); | AudioMemory(4); | ||||
| Serial.begin(Serial.baud()); | |||||
| Serial.begin(9600); | |||||
| } | } | ||||
| // for best effect make your terminal/monitor a minimum of 31 chars wide and as high as you can. | |||||
| elapsedMillis fps; | elapsedMillis fps; | ||||
| void loop() { | void loop() { | ||||
| if(fps>24) { // for best effect make your terminal/monitor a minimum of 31 chars wide and as high as you can. | |||||
| Serial.println(); | |||||
| fps=0; | |||||
| uint8_t monoPeak=peak_M.Dpp()/2184.5321; | |||||
| Serial.print("|"); | |||||
| for(uint8_t cnt=0;cnt<monoPeak;cnt++) Serial.print(">"); | |||||
| peak_M.begin(); | |||||
| if (fps > 24) { | |||||
| if (peak.available()) { | |||||
| fps = 0; | |||||
| uint8_t monoPeak = peak.read() * 30.0; | |||||
| Serial.print("|"); | |||||
| for (uint8_t cnt=0;cnt<monoPeak;cnt++) { | |||||
| Serial.print(">"); | |||||
| } | |||||
| Serial.println(); | |||||
| } | |||||
| } | } | ||||
| } | } |
| audioShield.inputSelect(myInput); | audioShield.inputSelect(myInput); | ||||
| audioShield.volume(0.75); | audioShield.volume(0.75); | ||||
| audioShield.unmuteLineout(); | audioShield.unmuteLineout(); | ||||
| Serial.begin(Serial.baud()); | |||||
| Serial.begin(9600); | |||||
| } | } | ||||
| // for best effect make your terminal/monitor a minimum of 62 chars wide and as high as you can. | |||||
| elapsedMillis fps; | elapsedMillis fps; | ||||
| uint8_t cnt=0; | uint8_t cnt=0; | ||||
| void loop() { | void loop() { | ||||
| if(fps>24) { // for best effect make your terminal/monitor a minimum of 62 chars wide and as high as you can. | |||||
| Serial.println(); | |||||
| fps=0; | |||||
| uint8_t leftPeak=peak_L.Dpp()/2184.5321; // 65536 / 2184.5321 ~ 30. | |||||
| for(cnt=0;cnt<30-leftPeak;cnt++) Serial.print(" "); | |||||
| while(cnt++<30) Serial.print("<"); | |||||
| Serial.print("||"); | |||||
| uint8_t rightPeak=peak_R.Dpp()/2184.5321; | |||||
| for(cnt=0;cnt<rightPeak;cnt++) Serial.print(">"); | |||||
| while(cnt++<30) Serial.print(" "); | |||||
| peak_L.begin(); // no need to call .stop if all you want | |||||
| peak_R.begin(); // is to zero it. | |||||
| if(fps > 24) { | |||||
| if (peak_L.available() && peak_R.available()) { | |||||
| fps=0; | |||||
| uint8_t leftPeak=peak_L.read() * 30.0; | |||||
| uint8_t rightPeak=peak_R.read() * 30.0; | |||||
| for(cnt=0;cnt<30-leftPeak;cnt++) { | |||||
| Serial.print(" "); | |||||
| } | |||||
| while(cnt++<30) { | |||||
| Serial.print("<"); | |||||
| } | |||||
| Serial.print("||"); | |||||
| for(cnt=0;cnt<rightPeak;cnt++) { | |||||
| Serial.print(">"); | |||||
| } | |||||
| while(cnt++<30) { | |||||
| Serial.print(" "); | |||||
| } | |||||
| Serial.println(); | |||||
| } | |||||
| } | } | ||||
| } | } |