snapshot
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
/**
|
||||
* @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();
|
||||
}
|
||||
Reference in New Issue
Block a user