diff --git a/bin/bootloader.bin b/bin/bootloader.bin index f4053833..e6ec5b12 100644 Binary files a/bin/bootloader.bin and b/bin/bootloader.bin differ diff --git a/bin/ctag-tbd.bin b/bin/ctag-tbd.bin index 16c62560..0e9f5245 100644 Binary files a/bin/ctag-tbd.bin and b/bin/ctag-tbd.bin differ diff --git a/bin/storage.bin b/bin/storage.bin index e815aa41..5b90bf78 100644 Binary files a/bin/storage.bin and b/bin/storage.bin differ diff --git a/components/ctagSoundProcessor/ctagSoundProcessorAntique.cpp b/components/ctagSoundProcessor/ctagSoundProcessorAntique.cpp index 55e3b414..a7da776b 100644 --- a/components/ctagSoundProcessor/ctagSoundProcessorAntique.cpp +++ b/components/ctagSoundProcessor/ctagSoundProcessorAntique.cpp @@ -3,6 +3,8 @@ using namespace CTAG::SP; void ctagSoundProcessorAntique::Process(const ProcessData &data) { + // dry buffer + float dry[32]; // input shaping MK_FLT_PAR_ABS(fInputLevel, inplevel, 4095.f, 1.f) fInputLevel *= fInputLevel; @@ -114,6 +116,7 @@ void ctagSoundProcessorAntique::Process(const ProcessData &data) { cl = clickFilter.Process(cl); // level + distort + dry[i] = data.buf[i * 2 + processCh]; data.buf[i * 2 + processCh] *= fInputLevel; data.buf[i * 2 + processCh] = stmlib::SoftClip(data.buf[i * 2 + processCh] * fInputDistortion) / fInputDistortion; @@ -142,6 +145,7 @@ void ctagSoundProcessorAntique::Process(const ProcessData &data) { fOutCutHp /= 44100.f; lpMaster.set_f_q(fOutCutLp, fOutQ); hpMaster.set_f_q(fOutCutHp, fOutQ); + MK_FLT_PAR_ABS(fWetDry, outdw, 4095.f, 1.f) // Scrub --> simulates noise from play head mechanical motion MK_FLT_PAR_ABS(fScrubLevel, scrublev, 4095.f, 1.f) @@ -173,7 +177,7 @@ void ctagSoundProcessorAntique::Process(const ProcessData &data) { }else{ tmp = hpMaster.Process(lpMaster.Process(frames[i].l + scrub + hum + his)); } - data.buf[i * 2 + processCh] = stmlib::SoftClip(tmp * fOutLevel); + data.buf[i * 2 + processCh] = stmlib::Crossfade(dry[i], stmlib::SoftClip(tmp * fOutLevel), fWetDry); } } @@ -311,6 +315,8 @@ void ctagSoundProcessorAntique::knowYourself(){ pMapCv.emplace("popdcy", [&](const int val){ cv_popdcy = val;}); pMapPar.emplace("outlevel", [&](const int val){ outlevel = val;}); pMapCv.emplace("outlevel", [&](const int val){ cv_outlevel = val;}); + pMapPar.emplace("outdw", [&](const int val){ outdw = val;}); + pMapCv.emplace("outdw", [&](const int val){ cv_outdw = val;}); pMapPar.emplace("outfltctr", [&](const int val){ outfltctr = val;}); pMapCv.emplace("outfltctr", [&](const int val){ cv_outfltctr = val;}); pMapPar.emplace("outfltbw", [&](const int val){ outfltbw = val;}); diff --git a/components/ctagSoundProcessor/ctagSoundProcessorAntique.hpp b/components/ctagSoundProcessor/ctagSoundProcessorAntique.hpp index 4e71d97e..c089e41b 100644 --- a/components/ctagSoundProcessor/ctagSoundProcessorAntique.hpp +++ b/components/ctagSoundProcessor/ctagSoundProcessorAntique.hpp @@ -74,6 +74,7 @@ namespace CTAG { atomic popf, cv_popf; atomic popdcy, cv_popdcy; atomic outlevel, cv_outlevel; + atomic outdw, cv_outdw; atomic outfltctr, cv_outfltctr; atomic outfltbw, cv_outfltbw; atomic outfltq, cv_outfltq; diff --git a/main/Calibration.hpp b/main/Calibration.hpp index a2877c6e..cd1eab91 100644 --- a/main/Calibration.hpp +++ b/main/Calibration.hpp @@ -34,8 +34,9 @@ namespace CTAG { CVUnipolar, CVBipolar }; - class Calibration { + class Calibration final { public: + Calibration() = delete; static void Init(); static void IRAM_ATTR MapCVData(const uint16_t *adcIn, float *mapOut); diff --git a/main/CalibrationModel.cpp b/main/CalibrationModel.cpp index ad06ad3e..06e3c75c 100644 --- a/main/CalibrationModel.cpp +++ b/main/CalibrationModel.cpp @@ -32,10 +32,6 @@ CTAG::CAL::CalibrationModel::CalibrationModel() { loadJSON(m, MODELJSONFN); } -CTAG::CAL::CalibrationModel::~CalibrationModel() { - -} - void CTAG::CAL::CalibrationModel::PrintSelf() { printJSON(m); } diff --git a/main/CalibrationModel.hpp b/main/CalibrationModel.hpp index 084a6690..b8ca0a6d 100644 --- a/main/CalibrationModel.hpp +++ b/main/CalibrationModel.hpp @@ -35,12 +35,10 @@ using namespace rapidjson; namespace CTAG { namespace CAL { - class CalibrationModel : public CTAG::SP::ctagDataModelBase { + class CalibrationModel final : public CTAG::SP::ctagDataModelBase { public: CalibrationModel(); - ~CalibrationModel(); - void CreateMatrix(); void PushRow(const vector data); diff --git a/main/OTAManager.hpp b/main/OTAManager.hpp index 956e02be..2e49d581 100644 --- a/main/OTAManager.hpp +++ b/main/OTAManager.hpp @@ -35,8 +35,9 @@ respective component folders / files if different from this license. namespace CTAG { namespace OTA { - class OTAManager { + class OTAManager final { public: + OTAManager() = delete; static esp_err_t InitiateOTA(httpd_req_t *req); static esp_err_t PostHandlerSPIFFS(httpd_req_t *req); diff --git a/main/RestServer.hpp b/main/RestServer.hpp index a7d94d4b..f5f97d62 100644 --- a/main/RestServer.hpp +++ b/main/RestServer.hpp @@ -26,8 +26,9 @@ respective component folders / files if different from this license. namespace CTAG { namespace REST { - class RestServer { + class RestServer final{ public: + RestServer() = delete; static esp_err_t StartRestServer(); private: diff --git a/main/SPManager.hpp b/main/SPManager.hpp index 016837f7..eda8c59c 100644 --- a/main/SPManager.hpp +++ b/main/SPManager.hpp @@ -37,8 +37,9 @@ using namespace CTAG::SP; namespace CTAG { namespace AUDIO { - class SoundProcessorManager { + class SoundProcessorManager final { public: + SoundProcessorManager() = delete; static void StartSoundProcessor(); static const char *GetCStrJSONSoundProcessors() { diff --git a/main/SPManagerDataModel.hpp b/main/SPManagerDataModel.hpp index 7c9bbc2d..9bbe0330 100644 --- a/main/SPManagerDataModel.hpp +++ b/main/SPManagerDataModel.hpp @@ -35,7 +35,7 @@ using namespace rapidjson; namespace CTAG { namespace AUDIO { - class SPManagerDataModel : public CTAG::SP::ctagDataModelBase { + class SPManagerDataModel final : public CTAG::SP::ctagDataModelBase { public: SPManagerDataModel(); diff --git a/spiffs_image/data/sp/mp-Antique.jsn b/spiffs_image/data/sp/mp-Antique.jsn index ad7f53bf..09292c6f 100644 --- a/spiffs_image/data/sp/mp-Antique.jsn +++ b/spiffs_image/data/sp/mp-Antique.jsn @@ -1 +1 @@ -{"activePatch":0,"patches":[{"name":"Defective Gear","params":[{"id":"inplevel","current":0,"cv":-1},{"id":"inpdist","current":0,"cv":-1},{"id":"inprepitch","current":0,"cv":-1},{"id":"hisslevel","current":194,"cv":-1},{"id":"hissf","current":3601,"cv":-1},{"id":"hissbw","current":3439,"cv":-1},{"id":"hissshp","current":162,"cv":-1},{"id":"scrublev","current":550,"cv":-1},{"id":"scrubcen","current":576,"cv":-1},{"id":"scrubq","current":838,"cv":-1},{"id":"scrubmodlev","current":2632,"cv":-1},{"id":"humlev","current":366,"cv":-1},{"id":"humf","current":2051,"cv":-1},{"id":"humshape","current":4499,"cv":-1},{"id":"humagr","current":0,"cv":-1},{"id":"wowl","current":1274,"cv":-1},{"id":"wowf","current":2047,"cv":-1},{"id":"flutl","current":718,"cv":-1},{"id":"flutf","current":977,"cv":-1},{"id":"clickl","current":640,"cv":-1},{"id":"clickd","current":201,"cv":-1},{"id":"clickf","current":2992,"cv":-1},{"id":"clickfmod","current":910,"cv":-1},{"id":"clickq","current":451,"cv":-1},{"id":"clickqm","current":1685,"cv":-1},{"id":"popl","current":885,"cv":-1},{"id":"popd1","current":35,"cv":-1},{"id":"popd2","current":290,"cv":-1},{"id":"poplen","current":88200,"cv":-1},{"id":"poplensy","current":1,"trig":-1},{"id":"popblen","current":800,"cv":-1},{"id":"popf","current":1641,"cv":-1},{"id":"popdcy","current":3373,"cv":-1},{"id":"outlevel","current":3014,"cv":-1},{"id":"outfltctr","current":2144,"cv":-1},{"id":"outfltbw","current":2134,"cv":-1},{"id":"outfltq","current":0,"cv":-1},{"id":"hishumpre","current":0,"trig":-1}]},{"name":"Bad Input","params":[{"id":"inplevel","current":1267,"cv":-1},{"id":"inpdist","current":3395,"cv":-1},{"id":"inprepitch","current":0,"cv":-1},{"id":"hisslevel","current":194,"cv":-1},{"id":"hissf","current":3601,"cv":-1},{"id":"hissbw","current":3439,"cv":-1},{"id":"hissshp","current":162,"cv":-1},{"id":"scrublev","current":550,"cv":-1},{"id":"scrubcen","current":1070,"cv":-1},{"id":"scrubq","current":838,"cv":-1},{"id":"scrubmodlev","current":2632,"cv":-1},{"id":"humlev","current":151,"cv":-1},{"id":"humf","current":2051,"cv":-1},{"id":"humshape","current":13558,"cv":-1},{"id":"humagr","current":0,"cv":-1},{"id":"wowl","current":2100,"cv":-1},{"id":"wowf","current":2047,"cv":-1},{"id":"flutl","current":697,"cv":-1},{"id":"flutf","current":977,"cv":-1},{"id":"clickl","current":640,"cv":-1},{"id":"clickd","current":110,"cv":-1},{"id":"clickf","current":3578,"cv":-1},{"id":"clickfmod","current":910,"cv":-1},{"id":"clickq","current":1631,"cv":-1},{"id":"clickqm","current":2696,"cv":-1},{"id":"popl","current":885,"cv":-1},{"id":"popd1","current":24,"cv":-1},{"id":"popd2","current":290,"cv":-1},{"id":"poplen","current":88200,"cv":-1},{"id":"poplensy","current":1,"trig":-1},{"id":"popblen","current":800,"cv":-1},{"id":"popf","current":1641,"cv":-1},{"id":"popdcy","current":3373,"cv":-1},{"id":"outlevel","current":3014,"cv":-1},{"id":"outfltctr","current":1165,"cv":-1},{"id":"outfltbw","current":1107,"cv":-1},{"id":"outfltq","current":324,"cv":-1},{"id":"hishumpre","current":0,"trig":-1}]}]} \ No newline at end of file +{"activePatch":0,"patches":[{"name":"Defective Gear","params":[{"id":"inplevel","current":0,"cv":-1},{"id":"inpdist","current":0,"cv":-1},{"id":"inprepitch","current":0,"cv":-1},{"id":"hisslevel","current":194,"cv":-1},{"id":"hissf","current":3601,"cv":-1},{"id":"hissbw","current":3439,"cv":-1},{"id":"hissshp","current":162,"cv":-1},{"id":"scrublev","current":550,"cv":-1},{"id":"scrubcen","current":576,"cv":-1},{"id":"scrubq","current":838,"cv":-1},{"id":"scrubmodlev","current":2632,"cv":-1},{"id":"humlev","current":366,"cv":-1},{"id":"humf","current":2051,"cv":-1},{"id":"humshape","current":4499,"cv":-1},{"id":"humagr","current":0,"cv":-1},{"id":"wowl","current":1274,"cv":-1},{"id":"wowf","current":2047,"cv":-1},{"id":"flutl","current":718,"cv":-1},{"id":"flutf","current":977,"cv":-1},{"id":"clickl","current":640,"cv":-1},{"id":"clickd","current":201,"cv":-1},{"id":"clickf","current":2992,"cv":-1},{"id":"clickfmod","current":910,"cv":-1},{"id":"clickq","current":451,"cv":-1},{"id":"clickqm","current":1685,"cv":-1},{"id":"popl","current":885,"cv":-1},{"id":"popd1","current":35,"cv":-1},{"id":"popd2","current":290,"cv":-1},{"id":"poplen","current":88200,"cv":-1},{"id":"poplensy","current":1,"trig":-1},{"id":"popblen","current":800,"cv":-1},{"id":"popf","current":1641,"cv":-1},{"id":"popdcy","current":3373,"cv":-1},{"id":"outlevel","current":3014,"cv":-1},{"id":"outdw","current":4095,"cv":-1},{"id":"outfltctr","current":2144,"cv":-1},{"id":"outfltbw","current":2134,"cv":-1},{"id":"outfltq","current":0,"cv":-1},{"id":"hishumpre","current":0,"trig":-1}]},{"name":"Bad Input","params":[{"id":"inplevel","current":1267,"cv":-1},{"id":"inpdist","current":3395,"cv":-1},{"id":"inprepitch","current":0,"cv":-1},{"id":"hisslevel","current":194,"cv":-1},{"id":"hissf","current":3601,"cv":-1},{"id":"hissbw","current":3439,"cv":-1},{"id":"hissshp","current":162,"cv":-1},{"id":"scrublev","current":550,"cv":-1},{"id":"scrubcen","current":1070,"cv":-1},{"id":"scrubq","current":838,"cv":-1},{"id":"scrubmodlev","current":2632,"cv":-1},{"id":"humlev","current":151,"cv":-1},{"id":"humf","current":2051,"cv":-1},{"id":"humshape","current":13558,"cv":-1},{"id":"humagr","current":0,"cv":-1},{"id":"wowl","current":2100,"cv":-1},{"id":"wowf","current":2047,"cv":-1},{"id":"flutl","current":697,"cv":-1},{"id":"flutf","current":977,"cv":-1},{"id":"clickl","current":640,"cv":-1},{"id":"clickd","current":110,"cv":-1},{"id":"clickf","current":3578,"cv":-1},{"id":"clickfmod","current":910,"cv":-1},{"id":"clickq","current":1631,"cv":-1},{"id":"clickqm","current":2696,"cv":-1},{"id":"popl","current":885,"cv":-1},{"id":"popd1","current":24,"cv":-1},{"id":"popd2","current":290,"cv":-1},{"id":"poplen","current":88200,"cv":-1},{"id":"poplensy","current":1,"trig":-1},{"id":"popblen","current":800,"cv":-1},{"id":"popf","current":1641,"cv":-1},{"id":"popdcy","current":3373,"cv":-1},{"id":"outlevel","current":3014,"cv":-1},{"id":"outdw","current":4095,"cv":-1},{"id":"outfltctr","current":1165,"cv":-1},{"id":"outfltbw","current":1107,"cv":-1},{"id":"outfltq","current":324,"cv":-1},{"id":"hishumpre","current":0,"trig":-1}]}]} \ No newline at end of file diff --git a/spiffs_image/data/sp/mui-Antique.jsn b/spiffs_image/data/sp/mui-Antique.jsn index 1fa42e2a..51959c63 100644 --- a/spiffs_image/data/sp/mui-Antique.jsn +++ b/spiffs_image/data/sp/mui-Antique.jsn @@ -306,6 +306,14 @@ "max": 4095, "step": 1 }, + { + "id": "outdw", + "name": "Dry / wet", + "type": "int", + "min": 0, + "max": 4095, + "step": 1 + }, { "id": "outfltctr", "name": "Filter center", diff --git a/versions.md b/versions.md index 9ad151f5..f1001510 100644 --- a/versions.md +++ b/versions.md @@ -1,5 +1,11 @@ # CTAG TBD Version Log +## V0.9.17 +- New plugin Antique --> Generates old record / tape effect +- New plugin Subbotnik by M. Brüssel --> Huge modulations +- New plugin VctrSyn by M. Brüssel --> Complex vector synth monster +- Minor bug fixes / architecture improvements + ## V0.9.16 - New plugin SpaceFX by M. Brüssel (uses [Vult Technology](https://github.com/modlfo)) - Bjorklund parameter reduction (some setting caused CPU overload)