Bladeren bron

Merge remote-tracking branch 'upstream/master'

dds
Nantonos 10 jaren geleden
bovenliggende
commit
c8e3500a80
19 gewijzigde bestanden met toevoegingen van 228 en 202 verwijderingen
  1. +1
    -1
      analyze_fft256.h
  2. +54
    -48
      control_sgtl5000.cpp
  3. +9
    -16
      control_sgtl5000.h
  4. +11
    -4
      examples/Analysis/FFT/FFT.ino
  5. +1
    -2
      examples/Analysis/StereoPeakMeter/StereoPeakMeter.ino
  6. +1
    -2
      examples/Effects/CalcBiquadToneControl/CalcBiquadToneControl.ino
  7. +0
    -4
      examples/Effects/Chorus/Chorus.ino
  8. +1
    -4
      examples/Effects/Flange/Flange.ino
  9. +3
    -3
      examples/HardwareTesting/SGTL5000_Specific/CalcBiquadToneControlDAP/CalcBiquadToneControlDAP.ino
  10. +2
    -2
      examples/HardwareTesting/SGTL5000_Specific/balanceDAC/balanceDAC.ino
  11. +2
    -2
      examples/HardwareTesting/SGTL5000_Specific/balanceHP/balanceHP.ino
  12. +4
    -3
      examples/HardwareTesting/SGTL5000_Specific/dap_avc_agc/dap_avc_agc.ino
  13. +4
    -3
      examples/HardwareTesting/SGTL5000_Specific/dap_bass_enhance/dap_bass_enhance.ino
  14. +0
    -3
      examples/HardwareTesting/ToneSweep/ToneSweep.ino
  15. +0
    -3
      examples/Synthesis/PlaySynthMusic/PlaySynthMusic.ino
  16. +3
    -0
      gui/index.html
  17. +109
    -57
      gui/list.html
  18. +3
    -29
      gui/red/main.js
  19. +20
    -16
      keywords.txt

+ 1
- 1
analyze_fft256.h Bestand weergeven

return (float)sum * (1.0 / 16384.0); return (float)sum * (1.0 / 16384.0);
} }
void averageTogether(uint8_t n) { void averageTogether(uint8_t n) {
if (n == 0) n == 1;
if (n == 0) n = 1;
naverage = n; naverage = n;
} }
void windowFunction(const int16_t *w) { void windowFunction(const int16_t *w) {

+ 54
- 48
control_sgtl5000.cpp Bestand weergeven

return val1; return val1;
} }


unsigned short AudioControlSGTL5000::route(uint8_t i2s_out, uint8_t dac, uint8_t dap, uint8_t dap_mix)
{
i2s_out&=3;
dac&=3;
dap&=3;
dap_mix&=3;
if((i2s_out==SGTL_AUDIO_PROCESSOR)||(dac==SGTL_AUDIO_PROCESSOR)) modify(DAP_CONTROL,1,1); // enable DAP
return modify(CHIP_SSS_CTRL,(dap_mix<<8)|(dap<<6)|(dac<<4)|i2s_out,(3<<8)|(3<<6)|(3<<4)|3);
}

bool AudioControlSGTL5000::volumeInteger(unsigned int n) bool AudioControlSGTL5000::volumeInteger(unsigned int n)
{ {
if (n == 0) { if (n == 0) {


unsigned short AudioControlSGTL5000::dacVolume(float n) // set both directly unsigned short AudioControlSGTL5000::dacVolume(float n) // set both directly
{ {
if(read(CHIP_ADCDAC_CTRL)&(3<<2)!=((n>0 ? 0:3)<<2)) modify(CHIP_ADCDAC_CTRL,(n>0 ? 0:3)<<2,3<<2);
if ((read(CHIP_ADCDAC_CTRL)&(3<<2)) != ((n>0 ? 0:3)<<2)) {
modify(CHIP_ADCDAC_CTRL,(n>0 ? 0:3)<<2,3<<2);
}
unsigned char m=calcVol(n,0xC0); unsigned char m=calcVol(n,0xC0);
return modify(CHIP_DAC_VOL,((0xFC-m)<<8)|(0xFC-m),65535); return modify(CHIP_DAC_VOL,((0xFC-m)<<8)|(0xFC-m),65535);
} }
unsigned short AudioControlSGTL5000::dacVolume(float left, float right) unsigned short AudioControlSGTL5000::dacVolume(float left, float right)
{ {
unsigned short adcdac=((right>0 ? 0:2)|(left>0 ? 0:1))<<2; unsigned short adcdac=((right>0 ? 0:2)|(left>0 ? 0:1))<<2;
if(read(CHIP_ADCDAC_CTRL)&(3<<2)!=adcdac) modify(CHIP_ADCDAC_CTRL,adcdac,1<<2);
if ((read(CHIP_ADCDAC_CTRL)&(3<<2)) != adcdac) {
modify(CHIP_ADCDAC_CTRL,adcdac,1<<2);
}
unsigned short m=(0xFC-calcVol(right,0xC0))<<8|(0xFC-calcVol(left,0xC0)); unsigned short m=(0xFC-calcVol(right,0xC0))<<8|(0xFC-calcVol(left,0xC0));
return modify(CHIP_DAC_VOL,m,65535); return modify(CHIP_DAC_VOL,m,65535);
} }


unsigned short AudioControlSGTL5000::adcHighPassFilterControl(uint8_t bypass, uint8_t freeze)
unsigned short AudioControlSGTL5000::adcHighPassFilterEnable(void)
{ {
return modify(CHIP_ADCDAC_CTRL, (freeze&1)<<1|bypass&1,3);
return modify(CHIP_ADCDAC_CTRL, 0, 3);
} }


unsigned short AudioControlSGTL5000::adcHighPassFilterControl(uint8_t bypass)
unsigned short AudioControlSGTL5000::adcHighPassFilterFreeze(void)
{ {
return modify(CHIP_ADCDAC_CTRL, bypass&1,1);
return modify(CHIP_ADCDAC_CTRL, 2, 3);
}

unsigned short AudioControlSGTL5000::adcHighPassFilterDisable(void)
{
return modify(CHIP_ADCDAC_CTRL, 1, 3);
} }




// DAP_CONTROL // DAP_CONTROL
unsigned short AudioControlSGTL5000::audioMixerEnable(uint8_t n)

unsigned short AudioControlSGTL5000::audioPreProcessorEnable(void)
{ {
return modify(DAP_CONTROL,(n&1)<<4,1<<4);
// audio processor used to pre-process analog input before Teensy
return write(DAP_CONTROL, 1) && write(CHIP_SSS_CTRL, 0x0013);
} }
unsigned short AudioControlSGTL5000::audioProcessorEnable(uint8_t n)

unsigned short AudioControlSGTL5000::audioPostProcessorEnable(void)
{ {
if(n) n=1;
unsigned char i2s_sel=3*n; // ADC if n==0 else DAP
modify(DAP_CONTROL,n,1);
return route(i2s_sel,SGTL_I2S_TEENSY,SGTL_ADC);
// audio processor used to post-process Teensy output before headphones/lineout
return write(DAP_CONTROL, 1) && write(CHIP_SSS_CTRL, 0x0070);
} }


unsigned short AudioControlSGTL5000::audioProcessorEnable(void)
unsigned short AudioControlSGTL5000::audioProcessorDisable(void)
{ {
return audioProcessorEnable(1);
return write(CHIP_SSS_CTRL, 0x0010) && write(DAP_CONTROL, 0);
} }



// DAP_PEQ // DAP_PEQ
unsigned short AudioControlSGTL5000::eqFilterCount(uint8_t n) // valid to n&7, 0 thru 7 filters enabled. unsigned short AudioControlSGTL5000::eqFilterCount(uint8_t n) // valid to n&7, 0 thru 7 filters enabled.
{ {
*/ */
unsigned short AudioControlSGTL5000::autoVolumeControl(uint8_t maxGain, uint8_t lbiResponse, uint8_t hardLimit, float threshold, float attack, float decay) unsigned short AudioControlSGTL5000::autoVolumeControl(uint8_t maxGain, uint8_t lbiResponse, uint8_t hardLimit, float threshold, float attack, float decay)
{ {
if(semi_automated&&(!read(DAP_CONTROL)&1)) audioProcessorEnable(1);
//if(semi_automated&&(!read(DAP_CONTROL)&1)) audioProcessorEnable();
if(maxGain>2) maxGain=2; if(maxGain>2) maxGain=2;
lbiResponse&=3; lbiResponse&=3;
hardLimit&=1; hardLimit&=1;
write(DAP_AVC_DECAY,dec); write(DAP_AVC_DECAY,dec);
return modify(DAP_AVC_CTRL,maxGain<<12|lbiResponse<<8|hardLimit<<5,3<<12|3<<8|1<<5); return modify(DAP_AVC_CTRL,maxGain<<12|lbiResponse<<8|hardLimit<<5,3<<12|3<<8|1<<5);
} }
unsigned short AudioControlSGTL5000::autoVolumeEnable(uint8_t n)
unsigned short AudioControlSGTL5000::autoVolumeEnable(void)
{ {
n&=1;
return modify(DAP_AVC_CTRL,n,1);
return modify(DAP_AVC_CTRL, 1, 1);
} }
unsigned short AudioControlSGTL5000::autoVolumeEnable(void)
unsigned short AudioControlSGTL5000::autoVolumeDisable(void)
{ {
return modify(DAP_AVC_CTRL,1,1);
return modify(DAP_AVC_CTRL, 0, 1);
} }


unsigned short AudioControlSGTL5000::enhanceBass(float lr_lev, float bass_lev) unsigned short AudioControlSGTL5000::enhanceBass(float lr_lev, float bass_lev)
{ {
return modify(DAP_BASS_ENHANCE_CTRL,(0x3F-calcVol(lr_lev,0x3F))<<8|0x7F-calcVol(bass_lev,0x7F),0x3F<<8|0x7F);
return modify(DAP_BASS_ENHANCE_CTRL,((0x3F-calcVol(lr_lev,0x3F))<<8) | (0x7F-calcVol(bass_lev,0x7F)), (0x3F<<8) | 0x7F);
} }
unsigned short AudioControlSGTL5000::enhanceBass(float lr_lev, float bass_lev, uint8_t hpf_bypass, uint8_t cutoff) unsigned short AudioControlSGTL5000::enhanceBass(float lr_lev, float bass_lev, uint8_t hpf_bypass, uint8_t cutoff)
{ {
modify(DAP_BASS_ENHANCE,(hpf_bypass&1)<<8|(cutoff&7)<<4,1<<8|7<<4); modify(DAP_BASS_ENHANCE,(hpf_bypass&1)<<8|(cutoff&7)<<4,1<<8|7<<4);
return enhanceBass(lr_lev,bass_lev); return enhanceBass(lr_lev,bass_lev);
} }
unsigned short AudioControlSGTL5000::enhanceBassEnable(uint8_t n)
unsigned short AudioControlSGTL5000::enhanceBassEnable(void)
{ {
return modify(DAP_BASS_ENHANCE,n&1,1);
return modify(DAP_BASS_ENHANCE, 1, 1);
} }
unsigned short AudioControlSGTL5000::enhanceBassEnable(void)
unsigned short AudioControlSGTL5000::enhanceBassDisable(void)
{ {
return enhanceBassEnable(1);
return modify(DAP_BASS_ENHANCE, 0, 1);
} }
unsigned short AudioControlSGTL5000::surroundSound(uint8_t width) unsigned short AudioControlSGTL5000::surroundSound(uint8_t width)
{ {
} }
unsigned short AudioControlSGTL5000::surroundSound(uint8_t width, uint8_t select) unsigned short AudioControlSGTL5000::surroundSound(uint8_t width, uint8_t select)
{ {
return modify(DAP_SGTL_SURROUND,(width&7)<<4|select&3,7<<4|3);
return modify(DAP_SGTL_SURROUND,((width&7)<<4)|(select&3), (7<<4)|3);
} }
unsigned short AudioControlSGTL5000::surroundSoundEnable(uint8_t n)
unsigned short AudioControlSGTL5000::surroundSoundEnable(void)
{ {
if(n) n=3;
return modify(DAP_SGTL_SURROUND,n,3);
return modify(DAP_SGTL_SURROUND, 3, 3);
} }
unsigned short AudioControlSGTL5000::surroundSoundEnable(void)
unsigned short AudioControlSGTL5000::surroundSoundDisable(void)
{ {
surroundSoundEnable(1);
return modify(DAP_SGTL_SURROUND, 0, 3);
} }


unsigned char AudioControlSGTL5000::calcVol(float n, unsigned char range) unsigned char AudioControlSGTL5000::calcVol(float n, unsigned char range)


void AudioControlSGTL5000::automate(uint8_t dap, uint8_t eq) void AudioControlSGTL5000::automate(uint8_t dap, uint8_t eq)
{ {
if((dap!=0)&&(!read(DAP_CONTROL)&1)) audioProcessorEnable(1);
if(read(DAP_AUDIO_EQ)&3!=eq) eqSelect(eq);
//if((dap!=0)&&(!(read(DAP_CONTROL)&1))) audioProcessorEnable();
if((read(DAP_AUDIO_EQ)&3) != eq) eqSelect(eq);
} }


void AudioControlSGTL5000::automate(uint8_t dap, uint8_t eq, uint8_t filterCount) void AudioControlSGTL5000::automate(uint8_t dap, uint8_t eq, uint8_t filterCount)
{ {
automate(dap,eq); automate(dap,eq);
if(filterCount>read(DAP_PEQ)&7) eqFilterCount(filterCount);
if (filterCount > (read(DAP_PEQ)&7)) eqFilterCount(filterCount);
} }




float A; float A;
if(filtertype<FILTER_PARAEQ) A=pow(10,dB_Gain/20); else A=pow(10,dB_Gain/40); if(filtertype<FILTER_PARAEQ) A=pow(10,dB_Gain/20); else A=pow(10,dB_Gain/40);
float W0 = 2*3.14159265358979323846*fC/fS; float W0 = 2*3.14159265358979323846*fC/fS;
float cosw=cos(W0);
float sinw=sin(W0);
float cosw=cosf(W0);
float sinw=sinf(W0);
//float alpha = sinw*sinh((log(2)/2)*BW*W0/sinw); //float alpha = sinw*sinh((log(2)/2)*BW*W0/sinw);
//float beta = sqrt(2*A); //float beta = sqrt(2*A);
float alpha = sinw / (2 * Q); float alpha = sinw / (2 * Q);
float beta = sqrt(A)/Q;
float beta = sqrtf(A)/Q;
float b0,b1,b2,a0,a1,a2; float b0,b1,b2,a0,a1,a2;


switch(filtertype) { switch(filtertype) {
a0 = (A+1.0F) - ((A-1.0F)*cosw) + (beta*sinw); a0 = (A+1.0F) - ((A-1.0F)*cosw) + (beta*sinw);
a1 = -2.0F * ((A-1.0F) - ((A+1.0F)*cosw)); a1 = -2.0F * ((A-1.0F) - ((A+1.0F)*cosw));
a2 = -((A+1.0F) - ((A-1.0F)*cosw) - (beta*sinw)); a2 = -((A+1.0F) - ((A-1.0F)*cosw) - (beta*sinw));
default:
b0 = 0.5;
b1 = 0.0;
b2 = 0.0;
a0 = 1.0;
a1 = 0.0;
a2 = 0.0;
} }


a0=(a0*2)/(float)quantization_unit; // once here instead of five times there... a0=(a0*2)/(float)quantization_unit; // once here instead of five times there...

+ 9
- 16
control_sgtl5000.h Bestand weergeven



#include "AudioControl.h" #include "AudioControl.h"


#define SGTL_ADC 0
#define SGTL_I2S_TEENSY 1
#define SGTL_AUDIO_PROCESSOR 3

class AudioControlSGTL5000 : public AudioControl class AudioControlSGTL5000 : public AudioControl
{ {
public: public:
return false; return false;
} }
} }
unsigned short route(uint8_t i2s_out, uint8_t dac, uint8_t dap, uint8_t dap_mix);
unsigned short route(uint8_t i2s_out, uint8_t dac, uint8_t dap) { return route(i2s_out,dac,dap,0); }
bool volume(float left, float right); bool volume(float left, float right);
bool micGain(unsigned int dB); bool micGain(unsigned int dB);
bool lineInLevel(uint8_t n) { return lineInLevel(n, n); } bool lineInLevel(uint8_t n) { return lineInLevel(n, n); }
unsigned short lineOutLevel(uint8_t left, uint8_t right); unsigned short lineOutLevel(uint8_t left, uint8_t right);
unsigned short dacVolume(float n); unsigned short dacVolume(float n);
unsigned short dacVolume(float left, float right); unsigned short dacVolume(float left, float right);
unsigned short adcHighPassFilterControl(uint8_t bypass, uint8_t freeze);
unsigned short adcHighPassFilterControl(uint8_t bypass);
unsigned short audioMixerEnable(uint8_t n);
unsigned short audioProcessorEnable(uint8_t n);
unsigned short audioProcessorEnable(void);
unsigned short adcHighPassFilterEnable(void);
unsigned short adcHighPassFilterFreeze(void);
unsigned short adcHighPassFilterDisable(void);
unsigned short audioPreProcessorEnable(void);
unsigned short audioPostProcessorEnable(void);
unsigned short audioProcessorDisable(void);
unsigned short eqFilterCount(uint8_t n); unsigned short eqFilterCount(uint8_t n);
unsigned short eqSelect(uint8_t n); unsigned short eqSelect(uint8_t n);
unsigned short eqBand(uint8_t bandNum, float n); unsigned short eqBand(uint8_t bandNum, float n);
void eqBands(float bass, float treble); void eqBands(float bass, float treble);
void eqFilter(uint8_t filterNum, int *filterParameters); void eqFilter(uint8_t filterNum, int *filterParameters);
unsigned short autoVolumeControl(uint8_t maxGain, uint8_t lbiResponse, uint8_t hardLimit, float threshold, float attack, float decay); unsigned short autoVolumeControl(uint8_t maxGain, uint8_t lbiResponse, uint8_t hardLimit, float threshold, float attack, float decay);
unsigned short autoVolumeEnable(uint8_t n);
unsigned short autoVolumeEnable(void); unsigned short autoVolumeEnable(void);
unsigned short autoVolumeDisable(void);
unsigned short enhanceBass(float lr_lev, float bass_lev); unsigned short enhanceBass(float lr_lev, float bass_lev);
unsigned short enhanceBass(float lr_lev, float bass_lev, uint8_t hpf_bypass, uint8_t cutoff); unsigned short enhanceBass(float lr_lev, float bass_lev, uint8_t hpf_bypass, uint8_t cutoff);
unsigned short enhanceBassEnable(uint8_t n);
unsigned short enhanceBassEnable(void); unsigned short enhanceBassEnable(void);
unsigned short enhanceBassDisable(void);
unsigned short surroundSound(uint8_t width); unsigned short surroundSound(uint8_t width);
unsigned short surroundSound(uint8_t width, uint8_t select); unsigned short surroundSound(uint8_t width, uint8_t select);
unsigned short surroundSoundEnable(uint8_t n);
unsigned short surroundSoundEnable(void); unsigned short surroundSoundEnable(void);
unsigned short surroundSoundDisable(void);
void killAutomation(void) { semi_automated=false; } void killAutomation(void) { semi_automated=false; }


protected: protected:
bool muted; bool muted;
bool volumeInteger(unsigned int n); // range: 0x00 to 0x80 bool volumeInteger(unsigned int n); // range: 0x00 to 0x80
uint16_t ana_ctrl; uint16_t ana_ctrl;

unsigned char calcVol(float n, unsigned char range); unsigned char calcVol(float n, unsigned char range);

unsigned int read(unsigned int reg); unsigned int read(unsigned int reg);
bool write(unsigned int reg, unsigned int val); bool write(unsigned int reg, unsigned int val);
unsigned int modify(unsigned int reg, unsigned int val, unsigned int iMask); unsigned int modify(unsigned int reg, unsigned int val, unsigned int iMask);

+ 11
- 4
examples/Analysis/FFT/FFT.ino Bestand weergeven

} }


void loop() { void loop() {
float n;
int i;

if (myFFT.available()) { if (myFFT.available()) {
// each time new FFT data is available // each time new FFT data is available
// print it all to the Arduino Serial Monitor // print it all to the Arduino Serial Monitor
Serial.print("FFT: "); Serial.print("FFT: ");
for (int i=0; i<40; i++) {
Serial.print(myFFT.read(i));
//Serial.print(myFFT.output[i]);
Serial.print(" ");
for (i=0; i<40; i++) {
n = myFFT.read(i);
if (n >= 0.01) {
Serial.print(n);
Serial.print(" ");
} else {
Serial.print(" - ");
}
} }
Serial.println(); Serial.println();
} }

+ 1
- 2
examples/Analysis/StereoPeakMeter/StereoPeakMeter.ino Bestand weergeven

AudioMemory(6); AudioMemory(6);
audioShield.enable(); audioShield.enable();
audioShield.inputSelect(myInput); audioShield.inputSelect(myInput);
audioShield.volume(0.75);
audioShield.unmuteLineout();
audioShield.volume(0.5);
Serial.begin(9600); Serial.begin(9600);
} }



+ 1
- 2
examples/Effects/CalcBiquadToneControl/CalcBiquadToneControl.ino Bestand weergeven

// Enable the audio shield, select the input and set the output volume. // Enable the audio shield, select the input and set the output volume.
audioShield.enable(); audioShield.enable();
audioShield.inputSelect(myInput); audioShield.inputSelect(myInput);
audioShield.volume(0.75);
audioShield.unmuteLineout();
audioShield.volume(0.5);


calcBiquad(FILTER_PARAEQ,110,0,0.2,2147483648,44100,updateFilter); calcBiquad(FILTER_PARAEQ,110,0,0.2,2147483648,44100,updateFilter);
filterTone_L.updateCoefs(updateFilter); // default set updateCoefs(0,updateFilter); filterTone_L.updateCoefs(updateFilter); // default set updateCoefs(0,updateFilter);

+ 0
- 4
examples/Effects/Chorus/Chorus.ino Bestand weergeven

l_myEffect.voices(0); l_myEffect.voices(0);
r_myEffect.voices(0); r_myEffect.voices(0);


// I want output on the line out too
audioShield.unmuteLineout();
// audioShield.muteHeadphone();
Serial.println("setup done"); Serial.println("setup done");
AudioProcessorUsageMaxReset(); AudioProcessorUsageMaxReset();
AudioMemoryUsageMaxReset(); AudioMemoryUsageMaxReset();

+ 1
- 4
examples/Effects/Flange/Flange.ino Bestand weergeven



audioShield.enable(); audioShield.enable();
audioShield.inputSelect(myInput); audioShield.inputSelect(myInput);
audioShield.volume(0.65);
audioShield.volume(0.5);
// Warn that the passthru pin is grounded // Warn that the passthru pin is grounded
if(!digitalRead(PASSTHRU_PIN)) { if(!digitalRead(PASSTHRU_PIN)) {
// PASSTHRU button is pushed. // PASSTHRU button is pushed.
l_myEffect.voices(FLANGE_DELAY_PASSTHRU,0,0); l_myEffect.voices(FLANGE_DELAY_PASSTHRU,0,0);
r_myEffect.voices(FLANGE_DELAY_PASSTHRU,0,0); r_myEffect.voices(FLANGE_DELAY_PASSTHRU,0,0);

// I want output on the line out too
audioShield.unmuteLineout();
Serial.println("setup done"); Serial.println("setup done");
AudioProcessorUsageMaxReset(); AudioProcessorUsageMaxReset();

+ 3
- 3
examples/HardwareTesting/SGTL5000_Specific/CalcBiquadToneControlDAP/CalcBiquadToneControlDAP.ino Bestand weergeven

*/ */
#include <Audio.h> #include <Audio.h>
#include <Wire.h> #include <Wire.h>
#include <SPI.h>
#include <SD.h> #include <SD.h>


const int myInput = AUDIO_INPUT_LINEIN; const int myInput = AUDIO_INPUT_LINEIN;
// Enable the audio shield, select the input and set the output volume. // Enable the audio shield, select the input and set the output volume.
audioShield.enable(); audioShield.enable();
audioShield.inputSelect(myInput); audioShield.inputSelect(myInput);
audioShield.volume(0.75);
audioShield.unmuteLineout();
// audioShield.audioProcessorEnable(); // enable the DAP block in SGTL5000
audioShield.volume(0.5);
audioShield.audioPostProcessorEnable(); // enable the DAP block in SGTL5000
// audioShield.eqSelect(1); // using PEQ Biquad filters // audioShield.eqSelect(1); // using PEQ Biquad filters
// audioShield.eqFilterCount(2); // enable filter 0 & filter 1 // audioShield.eqFilterCount(2); // enable filter 0 & filter 1
calcBiquad(FILTER_PARAEQ,110,0,0.2,524288,44100,updateFilter); // automation negates the need calcBiquad(FILTER_PARAEQ,110,0,0.2,524288,44100,updateFilter); // automation negates the need

+ 2
- 2
examples/HardwareTesting/SGTL5000_Specific/balanceDAC/balanceDAC.ino Bestand weergeven



#include <Audio.h> #include <Audio.h>
#include <Wire.h> #include <Wire.h>
#include <SPI.h>
#include <SD.h> #include <SD.h>




// Enable the audio shield and set the output volume. // Enable the audio shield and set the output volume.
audioShield.enable(); audioShield.enable();
audioShield.inputSelect(myInput); audioShield.inputSelect(myInput);
audioShield.volume(0.75);
audioShield.unmuteLineout();
audioShield.volume(0.5);
} }


elapsedMillis chgMsec=0; elapsedMillis chgMsec=0;

+ 2
- 2
examples/HardwareTesting/SGTL5000_Specific/balanceHP/balanceHP.ino Bestand weergeven



#include <Audio.h> #include <Audio.h>
#include <Wire.h> #include <Wire.h>
#include <SPI.h>
#include <SD.h> #include <SD.h>


const int myInput = AUDIO_INPUT_LINEIN; const int myInput = AUDIO_INPUT_LINEIN;
// Enable the audio shield and set the output volume. // Enable the audio shield and set the output volume.
audioShield.enable(); audioShield.enable();
audioShield.inputSelect(myInput); audioShield.inputSelect(myInput);
audioShield.volume(0.75);
audioShield.unmuteLineout();
audioShield.volume(0.5);
} }


elapsedMillis chgMsec=0; elapsedMillis chgMsec=0;

+ 4
- 3
examples/HardwareTesting/SGTL5000_Specific/dap_avc_agc/dap_avc_agc.ino Bestand weergeven



#include <Audio.h> #include <Audio.h>
#include <Wire.h> #include <Wire.h>
#include <SPI.h>
#include <SD.h> #include <SD.h>




// Enable the audio shield and set the output volume. // Enable the audio shield and set the output volume.
audioShield.enable(); audioShield.enable();
audioShield.inputSelect(myInput); audioShield.inputSelect(myInput);
audioShield.volume(0.75);
audioShield.unmuteLineout();
audioShield.volume(0.5);
audioShield.audioPreProcessorEnable();
// here are some settings for AVC that have a fairly obvious effect // here are some settings for AVC that have a fairly obvious effect
audioShield.autoVolumeControl(2,1,0,-5,0.5,0.5); // see comments starting line #699 of control_sgtl5000.cpp in ./libraries/audio/ audioShield.autoVolumeControl(2,1,0,-5,0.5,0.5); // see comments starting line #699 of control_sgtl5000.cpp in ./libraries/audio/
// AVC has its own enable/disable bit // AVC has its own enable/disable bit
void loop() { void loop() {
// every 10 ms, check for adjustment // every 10 ms, check for adjustment
if (chgMsec > 10) { if (chgMsec > 10) {
float vol1=analogRead(15)/10.23;
float vol1=analogRead(15)/1023.0;
vol1=(int)vol1; vol1=(int)vol1;
if(lastVol!=vol1) if(lastVol!=vol1)
{ {

+ 4
- 3
examples/HardwareTesting/SGTL5000_Specific/dap_bass_enhance/dap_bass_enhance.ino Bestand weergeven



#include <Audio.h> #include <Audio.h>
#include <Wire.h> #include <Wire.h>
#include <SPI.h>
#include <SD.h> #include <SD.h>




// Enable the audio shield and set the output volume. // Enable the audio shield and set the output volume.
audioShield.enable(); audioShield.enable();
audioShield.inputSelect(myInput); audioShield.inputSelect(myInput);
audioShield.volume(0.75);
audioShield.unmuteLineout();
audioShield.volume(0.5);
// just enable it to use default settings. // just enable it to use default settings.
audioShield.audioPostProcessorEnable();
audioShield.enhanceBassEnable(); // all we need to do for default bass enhancement settings. audioShield.enhanceBassEnable(); // all we need to do for default bass enhancement settings.
// audioShield.enhanceBass((float)lr_level,(float)bass_level); // audioShield.enhanceBass((float)lr_level,(float)bass_level);
// audioShield.enhanceBass((float)lr_level,(float)bass_level,(uint8_t)hpf_bypass,(uint8_t)cutoff); // audioShield.enhanceBass((float)lr_level,(float)bass_level,(uint8_t)hpf_bypass,(uint8_t)cutoff);
void loop() { void loop() {
// every 10 ms, check for adjustment // every 10 ms, check for adjustment
if (chgMsec > 10) { // more regular updates for actual changes seems better. if (chgMsec > 10) { // more regular updates for actual changes seems better.
float vol1=analogRead(15)/10.23;
float vol1=analogRead(15)/1023.0;
vol1=(int)vol1; vol1=(int)vol1;
if(lastVol!=vol1) if(lastVol!=vol1)
{ {

+ 0
- 3
examples/HardwareTesting/ToneSweep/ToneSweep.ino Bestand weergeven



audioShield.enable(); audioShield.enable();
audioShield.volume(0.5); audioShield.volume(0.5);
// I want output on the line out too
audioShield.unmuteLineout();
// audioShield.muteHeadphone();


Serial.println("setup done"); Serial.println("setup done");



+ 0
- 3
examples/Synthesis/PlaySynthMusic/PlaySynthMusic.ino Bestand weergeven

codec.enable(); codec.enable();
codec.volume(0.45); codec.volume(0.45);
// I want output on the line out too
// Comment this if you don't it
codec.unmuteLineout();


// reduce the gain on some channels, so half of the channels // reduce the gain on some channels, so half of the channels
// are "positioned" to the left, half to the right, but all // are "positioned" to the left, half to the right, but all

+ 3
- 0
gui/index.html Bestand weergeven

tr.even {background-color:#E0E0E0} tr.even {background-color:#E0E0E0}
p.func {padding-bottom:0; margin:0px} p.func {padding-bottom:0; margin:0px}
p.desc {padding-left:2em; margin:0px; padding-top:0.2em; padding-bottom:0.8em; font-size:0.75em} p.desc {padding-left:2em; margin:0px; padding-top:0.2em; padding-bottom:0.8em; font-size:0.75em}
pre.desc {padding-left:3em; margin:0px; padding-top:0em; padding-bottom:0.8em; font-size:0.75em;
background-color:#FFFFFF; border:0px; line-height:100%;
}
span.indent {padding-left:2em} span.indent {padding-left:2em}
span.literal {color: #006699} span.literal {color: #006699}
span.comment {color: #777755} span.comment {color: #777755}

+ 109
- 57
gui/list.html Bestand weergeven

The input number is in decibels, from 0 to 63. The input number is in decibels, from 0 to 63.
</p> </p>


<h3>Signal Adjustment</h3>
<h3>Signal Levels</h3>


<p>The SGTL5000 supports flexible signal routing (inside the chip) and
many optional signal conditioning features.</p>
<p>The default signal levels should be used for most applications,
but these functions allow you to customize the analog signals.</p>


<p class=func><span class=keyword>route</span>(i2s, dac, dap);</p>
<p class=desc>blah blah blah blah
</p>
<p class=func><span class=keyword>route</span>(i2s, dac, dap, dapmix);</p>
<p class=desc>blah blah blah blah
</p>
<p class=func><span class=keyword>muteHeadphone</span>();</p> <p class=func><span class=keyword>muteHeadphone</span>();</p>
<p class=desc>Silence the headphone output. <p class=desc>Silence the headphone output.
</p> </p>
<p class=func><span class=keyword>unmuteHeadphone</span>();</p> <p class=func><span class=keyword>unmuteHeadphone</span>();</p>
<p class=desc>Turn the headphone output on. <p class=desc>Turn the headphone output on.
</p> </p>
<p class=func><span class=keyword>unmuteLineout</span>();</p>
<p class=desc>Turn the line level outputs on.
</p>
<p class=func><span class=keyword>muteLineout</span>();</p> <p class=func><span class=keyword>muteLineout</span>();</p>
<p class=desc>Silence the line level outputs. <p class=desc>Silence the line level outputs.
</p> </p>
<p class=func><span class=keyword>lineInLevel</span>(both);</p>
<p class=desc>blah blah blah blah
<p class=func><span class=keyword>unmuteLineout</span>();</p>
<p class=desc>Turn the line level outputs on.
</p> </p>
<p class=func><span class=keyword>lineInLevel</span>(both);</p>
<p class=desc style="padding-bottom:0.2em;">Adjust the sensitivity of the line-level inputs.
Fifteen settings are possible:
</p>
<pre class="desc">
0: 3.12 Volts p-p
1: 2.63 Volts p-p
2: 2.22 Volts p-p
3: 1.87 Volts p-p
4: 1.58 Volts p-p
5: 1.33 Volts p-p (default)
6: 1.11 Volts p-p
7: 0.94 Volts p-p
8: 0.79 Volts p-p
9: 0.67 Volts p-p
10: 0.56 Volts p-p
11: 0.48 Volts p-p
12: 0.40 Volts p-p
13: 0.34 Volts p-p
14: 0.29 Volts p-p
15: 0.24 Volts p-p
</pre>
<p class=func><span class=keyword>lineInLevel</span>(left, right);</p> <p class=func><span class=keyword>lineInLevel</span>(left, right);</p>
<p class=desc>blah blah blah blah
<p class=desc>Adjust the sensitivity of the line-level inputs, with different
settings for left and right. The same 15 settings are available.
</p> </p>
<p class=func><span class=keyword>lineOutLevel</span>(both);</p> <p class=func><span class=keyword>lineOutLevel</span>(both);</p>
<p class=desc>blah blah blah blah
</p>
<p class=desc style="padding-bottom:0.2em;">Adjust the line level output
voltage range. The following settings are possible:
</p>
<pre class="desc">
13: 3.16 Volts p-p
14: 2.98 Volts p-p
15: 2.83 Volts p-p
16: 2.67 Volts p-p
17: 2.53 Volts p-p
18: 2.39 Volts p-p
19: 2.26 Volts p-p
20: 2.14 Volts p-p
21: 2.02 Volts p-p
22: 1.91 Volts p-p
23: 1.80 Volts p-p
24: 1.71 Volts p-p
25: 1.62 Volts p-p
26: 1.53 Volts p-p
27: 1.44 Volts p-p
28: 1.37 Volts p-p
29: 1.29 Volts p-p (default)
30: 1.22 Volts p-p
31: 1.16 Volts p-p
</pre>
<p class=func><span class=keyword>lineOutLevel</span>(left, right);</p> <p class=func><span class=keyword>lineOutLevel</span>(left, right);</p>
<p class=desc>blah blah blah blah
<p class=desc>Adjust the line level outout voltage range, with separate
settings for left and right. The same settings (13 to 31) are available.
</p> </p>
<p class=func><span class=keyword>dacVolume</span>(both);</p>
<p class=desc>blah blah blah blah


<h3>Signal Conditioning</h3>

<p>Usually these digital signal conditioning features should be left at their
default settings.
</p> </p>
<p class=func><span class=keyword>dacVolume</span>(left, right);</p>
<p class=desc>blah blah blah blah

<p class=func><span class=keyword>adcHighPassFilterFreeze</span>();</p>
<p class=desc>By default, the analog input (either line-level inputs or mic)
is high-pass filtered, to remove any DC component. This function
freezes the filter, so the DC component is still substracted, but
the filter stops tracking any DC or low frequency changes.
</p> </p>
<p class=func><span class=keyword>adcHighPassFilterControl</span>(bypass, freeze);</p>
<p class=desc>blah blah blah blah
<p class=func><span class=keyword>adcHighPassFilterDisable</span>();</p>
<p class=desc>Completely disable the analog input filter. DC and sub-audible
low frequencies are allowed to enter the digital signal.
</p> </p>
<p class=func><span class=keyword>adcHighPassFilterControl</span>(bypass);</p>
<p class=desc>blah blah blah blah
<p class=func><span class=keyword>adcHighPassFilterEnable</span>();</p>
<p class=desc>Turn the DC-blocking filter back on, if disabled, or
allows it to resume tracking DC and low frequency changes, if
previously frozen.
</p> </p>
<p class=func><span class=keyword>audioMixerEnable</span>(n);</p>
<p class=desc>blah blah blah blah
<p class=func><span class=keyword>dacVolume</span>(both);</p>
<p class=desc>Normally output volume should be used with volume(), which
changes the analog gain in the headphone amplifier. This function
controls digital attenuation before conversion to analog, which
reduces resolution, but allows another fine control of output
signal level. The ranges is 0 to 1.0, with the default at 1.0.
</p>
<p class=func><span class=keyword>dacVolume</span>(left, right);</p>
<p class=desc>Adjust the digital output volume separately on left and
right channels.
</p> </p>



<h3>Audio Processor</h3> <h3>Audio Processor</h3>


<p>An optional digital audio processor, capable of implementing a
<p>The optional digital audio processor is capable of implementing
automatic volume control, a
simple equalizer, filtering, bass enhancement and surround sound simple equalizer, filtering, bass enhancement and surround sound
is available. It can process audio input before the SGTL5000
sends it by I2S to Teensy, or it can process Teensy's I2S output
before converting the digital data to analog signals.</p>
is available.
</p>
<p>These signal processing features are implemented in the SGTL5000 chip,
so they do not consume CPU time on Teensy.
</p>


<p class=func><span class=keyword>audioProcessorEnable</span>(n);</p>
<p class=desc>blah blah blah blah
<p class=func><span class=keyword>audioPreProcessorEnable</span>();</p>
<p class=desc>Enable the audio processor to pre-process the input
(from either line-level inputs or microphone) before it's sent
to Teensy by I2S.
</p> </p>
<p class=func><span class=keyword>audioProcessorEnable</span>();</p>
<p class=desc>blah blah blah blah
<p class=func><span class=keyword>audioPostProcessorEnable</span>();</p>
<p class=desc>Enable the audio processor to post-process Teensy's
I2S output before it's turned into analog signals for the
headphones and/or line level outputs.
</p>
<p class=func><span class=keyword>audioProcessorDisable</span>();</p>
<p class=desc>Disable the audio processor.
</p> </p>
<p class=func><span class=keyword>eqFilterCount</span>(n);</p> <p class=func><span class=keyword>eqFilterCount</span>(n);</p>
<p class=desc>blah blah blah blah <p class=desc>blah blah blah blah
<p class=func><span class=keyword>autoVolumeControl</span>(maxGain, response, hardLimit, threshold, attack, decay);</p> <p class=func><span class=keyword>autoVolumeControl</span>(maxGain, response, hardLimit, threshold, attack, decay);</p>
<p class=desc>blah blah blah blah <p class=desc>blah blah blah blah
</p> </p>
<p class=func><span class=keyword>autoVolumeEnable</span>(n);</p>
<p class=func><span class=keyword>autoVolumeEnable</span>();</p>
<p class=desc>blah blah blah blah <p class=desc>blah blah blah blah
</p> </p>
<p class=func><span class=keyword>autoVolumeEnable</span>();</p>
<p class=func><span class=keyword>autoVolumeDisable</span>();</p>
<p class=desc>blah blah blah blah <p class=desc>blah blah blah blah
</p> </p>
<p class=func><span class=keyword>enhanceBass</span>(lr_lev, bass_lev);</p> <p class=func><span class=keyword>enhanceBass</span>(lr_lev, bass_lev);</p>
<p class=func><span class=keyword>enhanceBass</span>(lr_lev, bass_lev, hpf_bypass, cutoff);</p> <p class=func><span class=keyword>enhanceBass</span>(lr_lev, bass_lev, hpf_bypass, cutoff);</p>
<p class=desc>blah blah blah blah <p class=desc>blah blah blah blah
</p> </p>
<p class=func><span class=keyword>enhanceBassEnable</span>(n);</p>
<p class=func><span class=keyword>enhanceBassEnable</span>();</p>
<p class=desc>blah blah blah blah <p class=desc>blah blah blah blah
</p> </p>
<p class=func><span class=keyword>enhanceBassEnable</span>();</p>
<p class=func><span class=keyword>enhanceBassDisable</span>();</p>
<p class=desc>blah blah blah blah <p class=desc>blah blah blah blah
</p> </p>
<p class=func><span class=keyword>surroundSound</span>(width);</p> <p class=func><span class=keyword>surroundSound</span>(width);</p>
<p class=func><span class=keyword>surroundSound</span>(width, select);</p> <p class=func><span class=keyword>surroundSound</span>(width, select);</p>
<p class=desc>blah blah blah blah <p class=desc>blah blah blah blah
</p> </p>
<p class=func><span class=keyword>surroundSoundEnable</span>(n);</p>
<p class=desc>blah blah blah blah
</p>
<p class=func><span class=keyword>surroundSoundEnable</span>();</p> <p class=func><span class=keyword>surroundSoundEnable</span>();</p>
<p class=desc>blah blah blah blah <p class=desc>blah blah blah blah
</p> </p>
<p class=func><span class=keyword>killAutomation</span>();</p>
<p class=func><span class=keyword>surroundSoundDisable</span>();</p>
<p class=desc>blah blah blah blah <p class=desc>blah blah blah blah
</p> </p>
<h3>Notes</h3> <h3>Notes</h3>
<p>TODO: how does the input AGC work
</p>
<p>TODO: document signal routing
</p>
<p>TODO: line level output adjust is weird arbitrary integers. Should this be
made into more sensible numbers, or do we just document the integer-voltage
measurements that correspond to the audio shield's hardware?
</p>
<p>TODO: make some sense out of the terribly complex audio processor features &amp; options!
</p>
<p>TODO: can some of these enable functions be eliminated and have those features
automatically enabled or disabled depending on whether the route() function has
configured signals to/from them?
<p>TODO: document the many audio processor features &amp; functions!
</p> </p>
</script> </script>
<script type="text/x-red" data-template-name="AudioControlSGTL5000"> <script type="text/x-red" data-template-name="AudioControlSGTL5000">

+ 3
- 29
gui/red/main.js Bestand weergeven

function save(force) { function save(force) {
RED.storage.update(); RED.storage.update();


if (RED.view.dirty()) {

if (!force) {
var invalid = false;
var unknownNodes = [];
RED.nodes.eachNode(function(node) {
invalid = invalid || !node.valid;
if (node.type === "unknown") {
if (unknownNodes.indexOf(node.name) == -1) {
unknownNodes.push(node.name);
}
invalid = true;
}
});
if (invalid) {
if (unknownNodes.length > 0) {
$( "#node-dialog-confirm-deploy-config" ).hide();
$( "#node-dialog-confirm-deploy-unknown" ).show();
var list = "<li>"+unknownNodes.join("</li><li>")+"</li>";
$( "#node-dialog-confirm-deploy-unknown-list" ).html(list);
} else {
$( "#node-dialog-confirm-deploy-config" ).show();
$( "#node-dialog-confirm-deploy-unknown" ).hide();
}
$( "#node-dialog-confirm-deploy" ).dialog( "open" );
return;
}
}
if (1) {
var nns = RED.nodes.createCompleteNodeSet(); var nns = RED.nodes.createCompleteNodeSet();
// sort by horizontal position, plus slight vertical position, // sort by horizontal position, plus slight vertical position,
// for well defined update order that follows signal flow // for well defined update order that follows signal flow
RED.view.redraw(); RED.view.redraw();
setTimeout(function() { setTimeout(function() {
$("#btn-deploy").removeClass("disabled").addClass("btn-danger"); $("#btn-deploy").removeClass("disabled").addClass("btn-danger");
}, 1500);
}, 1500);
$('#btn-deploy').click(function() { save(); });
}, "html"); }, "html");
} }



+ 20
- 16
keywords.txt Bestand weergeven

micGain KEYWORD2 micGain KEYWORD2
lineInLevel KEYWORD2 lineInLevel KEYWORD2
lineOutLevel KEYWORD2 lineOutLevel KEYWORD2
lo_lvl KEYWORD2
dac_vol KEYWORD2
dap_mix_enable KEYWORD2
dap_enable KEYWORD2
dap_peqs KEYWORD2
dap_audio_eq KEYWORD2
dap_audio_eq_band KEYWORD2
dap_audio_eq_geq KEYWORD2
dap_audio_eq_tone KEYWORD2
load_peq KEYWORD2
dap_avc KEYWORD2
dap_avc_enable KEYWORD2
dap_bass_enhance KEYWORD2
dap_bass_enhance_enable KEYWORD2
dap_surround KEYWORD2
dap_surround_enable KEYWORD2
dacVolume KEYWORD2
adcHighPassFilterEnable KEYWORD2
adcHighPassFilterFreeze KEYWORD2
adcHighPassFilterDisable KEYWORD2
audioPreProcessorEnable KEYWORD2
audioPostProcessorEnable KEYWORD2
audioProcessorDisable KEYWORD2
eqFilterCount KEYWORD2
eqSelect KEYWORD2
eqBand KEYWORD2
eqBands KEYWORD2
eqFilter KEYWORD2
autoVolumeControl KEYWORD2
autoVolumeEnable KEYWORD2
autoVolumeDisable KEYWORD2
enhanceBass KEYWORD2
enhanceBassEnable KEYWORD2
enhanceBassDisable KEYWORD2
surroundSound KEYWORD2
surroundSoundEnable KEYWORD2
calcBiquad KEYWORD2 calcBiquad KEYWORD2





Laden…
Annuleren
Opslaan