Files
klubhaus-doorbell/libraries/audio-tools/examples/examples-audiokit/streams-audiokit-effects-audiokit/streams-audiokit-effects-audiokit.ino
2026-02-16 19:05:11 -08:00

158 lines
4.7 KiB
C++

/**
* @file audiokit-effects-audiokit.ino
* @author Phil Schatzmann
* @brief Some Guitar Effects that can be controlled via a Web Gui.
* @version 0.1
* @date 2022-10-14
*
* @copyright Copyright (c) 2022
*
*/
#include <ArduinoJson.h> // https://arduinojson.org/
#include "HttpServer.h" // https://github.com/pschatzmann/TinyHttp
#include "AudioTools.h" // https://github.com/pschatzmann/arduino-audio-tools.git
#include "AudioTools/AudioLibs/AudioBoardStream.h" // https://github.com/pschatzmann/arduino-audio-driver.git
// Server
WiFiServer wifi;
HttpServer server(wifi);
const char *ssid = "SSID";
const char *password = "PASSWORD";
// Audio Format
const int sample_rate = 44100;
const int channels = 1;
const int bits_per_sample = 16;
// Effects control input
float volumeControl = 0.1;
int16_t clipThreashold = 0;
float fuzzEffectValue = 0;
int16_t fuzzMaxValue = 0;
int16_t tremoloDuration = 0;
float tremoloDepth = 0;
// Effects
Boost boost(volumeControl);
Distortion distortion(clipThreashold);
Fuzz fuzz(fuzzEffectValue);
Tremolo tremolo(tremoloDuration, tremoloDepth, sample_rate);
// Audio
AudioBoardStream kit(AudioKitEs8388V1); // Access I2S as stream
AudioEffectStream effects(kit); // input from kit
StreamCopy copier(kit, effects); // copy effects to kit
// Update values in effects
void updateValues(){
// update values in controls
boost.setVolume(volumeControl);
boost.setActive(volumeControl>0);
distortion.setClipThreashold(clipThreashold);
distortion.setActive(clipThreashold>0);
fuzz.setFuzzEffectValue(fuzzEffectValue);
fuzz.setMaxOut(fuzzMaxValue);
fuzz.setActive(fuzzEffectValue>0);
tremolo.setDepth(tremoloDepth);
tremolo.setDuration(tremoloDuration);
tremolo.setActive(tremoloDuration>0);
}
// provide JSON as webservice
void getJson(HttpServer * server, const char*requestPath, HttpRequestHandlerLine * hl) {
auto parameters2Json = [](Stream & out) {
DynamicJsonDocument doc(1024);
doc["volumeControl"]["value"] = volumeControl;
doc["volumeControl"]["min"] = 0;
doc["volumeControl"]["max"] = 1;
doc["volumeControl"]["step"] = 0.1;
doc["clipThreashold"]["value"] = clipThreashold;
doc["clipThreashold"]["min"] = 0;
doc["clipThreashold"]["max"] = 6000;
doc["clipThreashold"]["step"] = 100;
doc["fuzzEffectValue"]["value"] = fuzzEffectValue;
doc["fuzzEffectValue"]["min"] = 0;
doc["fuzzEffectValue"]["max"] = 10;
doc["fuzzEffectValue"]["step"] = 0.1;
doc["fuzzMaxValue"]["value"] = fuzzMaxValue;
doc["fuzzMaxValue"]["min"] = 0;
doc["fuzzMaxValue"]["max"] = 32200;
doc["fuzzMaxValue"]["step"] = 1;
doc["tremoloDuration"]["value"] = tremoloDuration;
doc["tremoloDuration"]["min"] = 0;
doc["tremoloDuration"]["max"] = 2000;
doc["tremoloDuration"]["step"] = 1;
doc["tremoloDepth"]["value"] = tremoloDepth;
doc["tremoloDepth"]["min"] = 0;
doc["tremoloDepth"]["max"] = 100;
doc["tremoloDepth"]["step"] = 1;
serializeJson(doc, out);
};
// provide data as json using callback
server->reply("text/json", parameters2Json, 200);
};
// Poroces Posted Json
void postJson(HttpServer *server, const char*requestPath, HttpRequestHandlerLine *hl) {
// post json to server
DynamicJsonDocument doc(1024);
deserializeJson(doc, server->client());
volumeControl = doc["volumeControl"];
clipThreashold = doc["clipThreashold"];
fuzzEffectValue = doc["fuzzEffectValue"];
fuzzMaxValue = doc["fuzzMaxValue"];
tremoloDuration = doc["tremoloDuration"];
tremoloDepth = doc["tremoloDepth"];
// update values in controls
updateValues();
server->reply("text/json", "{}", 200);
char msg[120];
snprintf(msg, 120, "====> updated values %f %d %f %d %d %f", volumeControl, clipThreashold, fuzzEffectValue, tremoloDuration, tremoloDepth);
Serial.println(msg);
}
// Arduino Setup
void setup(void) {
Serial.begin(115200);
AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Warning);
// Setup Server
static HttpTunnel tunnel_url("https://pschatzmann.github.io/TinyHttp/app/guitar-effects.html");
server.on("/", T_GET, tunnel_url);
server.on("/service", T_GET, getJson);
server.on("/service", T_POST, postJson);
server.begin(80, ssid, password);
server.setNoConnectDelay(0);
// Setup Kit
auto cfg = kit.defaultConfig(RXTX_MODE);
cfg.sd_active = false;
cfg.input_device = ADC_INPUT_LINE2;
cfg.sample_rate = sample_rate;
cfg.channels = channels;
// minimize lag
cfg.buffer_count = 2;
cfg.buffer_size = 256;
kit.begin(cfg);
kit.setVolume(1.0);
// setup effects
effects.addEffect(boost);
effects.addEffect(distortion);
effects.addEffect(fuzz);
effects.addEffect(tremolo);
effects.begin(cfg);
updateValues();
}
// Arduino loop - copy data
void loop() {
copier.copy();
server.copy();
}