#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(); | |||||
} | |||||
} | } | ||||
} | } |