@@ -55,7 +55,7 @@ | |||
#include "analyze_fft1024.h" | |||
#include "analyze_print.h" | |||
#include "analyze_tonedetect.h" | |||
#include "analyze_peakdetect.h" | |||
#include "analyze_peak.h" | |||
#include "control_sgtl5000.h" | |||
#include "control_wm8731.h" | |||
#include "effect_chorus.h" |
@@ -24,41 +24,30 @@ | |||
* THE SOFTWARE. | |||
*/ | |||
#include "analyze_peakdetect.h" | |||
#include "analyze_peak.h" | |||
void AudioAnalyzePeak::update(void) | |||
{ | |||
audio_block_t *block; | |||
const int16_t *p, *end; | |||
int32_t min, max; | |||
block = receiveReadOnly(); | |||
if (!block) { | |||
return; | |||
} | |||
if (!m_enabled) { | |||
release(block); | |||
return; | |||
} | |||
p = block->data; | |||
end = p + AUDIO_BLOCK_SAMPLES; | |||
min = min_sample; | |||
max = max_sample; | |||
do { | |||
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); | |||
min_sample = min; | |||
max_sample = max; | |||
new_output = true; | |||
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; | |||
} | |||
@@ -29,23 +29,34 @@ | |||
#include "AudioStream.h" | |||
// TODO: this needs to be renamed to AudioAnalyzePeak | |||
class AudioAnalyzePeak : public AudioStream | |||
{ | |||
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); | |||
void begin(bool noReset); | |||
void begin(void) { begin(false); } | |||
void stop(void) { m_enabled=false; } | |||
uint16_t Dpp(void); | |||
private: | |||
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 |
@@ -11,30 +11,32 @@ This example code is in the public domain | |||
#include <SPI.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. | |||
AudioAnalyzePeak peak_M; | |||
AudioAnalyzePeak peak; | |||
AudioOutputAnalog audioOutput; // DAC pin. | |||
AudioConnection c1(audioInput,peak_M); | |||
AudioConnection c1(audioInput,peak); | |||
AudioConnection c2(audioInput,audioOutput); | |||
void setup() { | |||
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; | |||
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(); | |||
} | |||
} | |||
} |
@@ -30,25 +30,35 @@ void setup() { | |||
audioShield.inputSelect(myInput); | |||
audioShield.volume(0.75); | |||
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; | |||
uint8_t cnt=0; | |||
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(); | |||
} | |||
} | |||
} |