forest-all-around/@sampler/Audio_SdFat.latest/examples/HardwareTesting/SGTL5000/VolumeRamp/VolumeRamp.ino

101 lines
2.7 KiB
C++
Executable file

// The SGTL5000 has a secondard "dacVolume" setting, in addition to normal volume.
//
// Normally dacVolume defaults to 1.0, to pass your sound directly to the normal
// volume control. The actual volume you hear depends on both settings.
//
// The dacVolume control has an option to gracefully ramp (change) its setting over
// time, to prevent a sudden pop or click sound. You could achieve this by adding
// code to change the volume setting in very small steps over time, but the
// SGTL5000 can do it for you automatically.
//
// This example was originally contributed by Hedde Bosman
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
// GUItool: begin automatically generated code
AudioSynthWaveformSine sine1; //xy=203,233
AudioOutputI2S i2s1; //xy=441,233
AudioConnection patchCord1(sine1, 0, i2s1, 0);
AudioConnection patchCord2(sine1, 0, i2s1, 1);
AudioControlSGTL5000 sgtl5000_1; //xy=452,162
// GUItool: end automatically generated code
elapsedMillis msec;
float vol;
float inc;
int rampType;
const char *rampName[] = {
"No Ramp (instant)", // loud pop due to instant change
"Normal Ramp", // graceful transition between volume levels
"Linear Ramp" // slight click/chirp
};
void setup(void) {
Serial.begin(9600);
AudioMemory(4);
vol = 0.0;
inc = 0.2;
rampType = 0;
sine1.amplitude(1.0);
sine1.frequency(440);
sgtl5000_1.enable();
sgtl5000_1.volume(0.5); // set the main volume...
sgtl5000_1.dacVolume(0); // set the "dac" volume (extra control)
sgtl5000_1.dacVolumeRampDisable();
Serial.println("setup done");
}
void loop(void) {
if (msec > 1000) { // change the volume every second
// increment or decrement the volume variable
vol += inc;
if (vol >= 1.0) {
vol = 1.0;
inc = -inc;
}
if (vol < 0.01) {
vol = 0.0;
inc = -inc;
}
Serial.print("Volume: ");
Serial.print(vol);
Serial.print(" ");
Serial.println(rampName[rampType]);
// configure which type of volume transition to use
if (rampType == 0) {
sgtl5000_1.dacVolumeRampDisable();
} else if (rampType == 1) {
sgtl5000_1.dacVolumeRamp();
} else {
sgtl5000_1.dacVolumeRampLinear();
}
// set the dacVolume. The actual change make take place over time, if ramping
// this is a logarithmic volume,
// that is, the range 0.0 to 1.0 gets converted to -90dB to 0dB in 0.5dB steps
sgtl5000_1.dacVolume(vol);
// if we turned the volume off, advance to the next ramp type
if (vol < 0.01) {
rampType = rampType + 1;
if (rampType > 2) rampType = 0;
}
msec = 0;
}
}