From a49e35dc2556f0ac396fb64bb8e99be3cee38cd4 Mon Sep 17 00:00:00 2001 From: Matiq Date: Thu, 20 Aug 2026 01:12:12 +0300 Subject: [PATCH] P1.5: embed live level-tracker A[] + mask scalars into C++ (dsp/leveltrack_data.hpp); leveltrack_check sanity confirms SR=48000, A_ATTACK plateaus 0.692, attack/release=1.0 --- dsp/leveltrack_check.cpp | 9 +++ dsp/leveltrack_data.hpp | 149 +++++++++++++++++++++++++++++++++++++ handoff/emit_leveltrack.py | 55 ++++++++++++++ 3 files changed, 213 insertions(+) create mode 100644 dsp/leveltrack_data.hpp create mode 100644 handoff/emit_leveltrack.py diff --git a/dsp/leveltrack_check.cpp b/dsp/leveltrack_check.cpp index 1c39c6a..5b2cecb 100644 --- a/dsp/leveltrack_check.cpp +++ b/dsp/leveltrack_check.cpp @@ -3,6 +3,7 @@ #include #include #include "leveltrack.hpp" +#include "leveltrack_data.hpp" int main() { const size_t n = 37; // odd size to exercise the unrolled tail. @@ -27,5 +28,13 @@ int main() { leveltrack::iir_bidirectional(rx.data(), A.data(), n); std::printf("leveltrack integration check done (n=%zu)\n", n); + + // P1.5 live-capture data sanity (render_long.rpp: attack=0 release=0). + std::printf("live ltk: SR=%.0f nbins=%zu A_ATTACK[1]=%.4f A_ATTACK[319]=%.4f " + "A_RELEASE[1]=%.6f scalar870=%.2f scalar884=%.2f scalar888=%.2f\n", + (double)ltk::CTX_INTERNAL_SR, ltk::LEVEL_NBINS, + ltk::A_ATTACK[1], ltk::A_ATTACK[319], + ltk::A_RELEASE[1], (double)ltk::SCALAR0X40870, + (double)ltk::SCALAR0X40884, (double)ltk::SCALAR0X40888); return maxd < 1e-6 ? 0 : 1; } \ No newline at end of file diff --git a/dsp/leveltrack_data.hpp b/dsp/leveltrack_data.hpp new file mode 100644 index 0000000..8745be9 --- /dev/null +++ b/dsp/leveltrack_data.hpp @@ -0,0 +1,149 @@ +// AUTOGENERATED from P1.5 realtime capture handoff/rtctx_live.json +// (render_long.rpp: attack=0 release=0 selectivity=10 sharpness=10 depth=0.864). +// Regenerate with handoff/emit_leveltrack.py. Do not edit by hand. +#pragma once +#include + +namespace ltk { + +// ctx = 0x2370040, marker +0x24 == 48000.0f (internal SR). +constexpr float CTX_INTERNAL_SR = 48000.0f; + +// mask scalars (float) captured live: +constexpr float SCALAR0X40870 = 440.9548645019531f; +constexpr float SCALAR0X40874 = 1.0f; +constexpr float SCALAR0X40878 = 1.0f; +constexpr float SCALAR0X4087C = 1.0f; +constexpr float SCALAR0X40880 = 25.000001907348633f; +constexpr float SCALAR0X40884 = 10.0f; +constexpr float SCALAR0X40888 = 1.0f; +constexpr float SCALAR0X4088C = 1.0f; +constexpr float SCALAR0X40890 = 0.0f; +constexpr float SCALAR0X40894 = 1200.0001220703125f; +constexpr float SCALAR0X408AC = 9.183549615799121e-41f; + +constexpr size_t LEVEL_NBINS = 341; + +// per-bin level-tracker IIR attack coefficients (0x4c0528): +const double A_ATTACK[341] = { + 0, 0.34005138278007507, 0.3483593761920929, 0.35649341344833374, 0.3644568920135498, 0.37225314974784851, + 0.37988573312759399, 0.38735818862915039, 0.39467430114746094, 0.40183743834495544, 0.40885132551193237, 0.41571962833404541, + 0.4224458634853363, 0.42903351783752441, 0.43548604846000671, 0.44180700182914734, 0.44799956679344177, 0.45406708121299744, + 0.46001288294792175, 0.46583998203277588, 0.47155144810676575, 0.47715029120445251, 0.48263949155807495, 0.48802188038825989, + 0.49330011010169983, 0.49847698211669922, 0.50355511903762817, 0.50853699445724487, 0.51342517137527466, 0.51822203397750854, + 0.52292978763580322, 0.52755081653594971, 0.53208738565444946, 0.53654158115386963, 0.54091531038284302, 0.54521089792251587, + 0.54942995309829712, 0.55357468128204346, 0.55764675140380859, 0.56164795160293579, 0.56558007001876831, 0.56944471597671509, + 0.57324361801147461, 0.57697826623916626, 0.58065032958984375, 0.58426117897033691, 0.58781230449676514, 0.59130507707595825, + 0.59474086761474609, 0.59812110662460327, 0.60144698619842529, 0.60471975803375244, 0.60794061422348022, 0.61111080646514893, + 0.6142314076423645, 0.61730360984802246, 0.62032842636108398, 0.6233069896697998, 0.62624025344848633, 0.62912911176681519, + 0.63197475671768188, 0.63477796316146851, 0.63753974437713623, 0.64026087522506714, 0.64294230937957764, 0.64558488130569458, + 0.64818942546844482, 0.65075665712356567, 0.65328741073608398, 0.65578234195709229, 0.65824240446090698, 0.66066807508468628, + 0.66306018829345703, 0.66541939973831177, 0.66774630546569824, 0.67004162073135376, 0.67230594158172607, 0.67453992366790771, + 0.67674410343170166, 0.67891907691955566, 0.68106538057327271, 0.68318367004394531, 0.68527436256408691, 0.68733805418014526, + 0.68937522172927856, 0.69138640165328979, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, + 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, 0.69213396310806274, +}; + +// per-bin level-tracker IIR release coefficients (0x3c0510 == 0x2c04f8): +const double A_RELEASE[341] = { + 0, 0.00075329304672777653, 0.00088481028797104955, 0.0010319935390725732, 0.0011957522947341204, 0.0013769635697826743, + 0.0015764719573780894, 0.0017950870096683502, 0.0020335691515356302, 0.0022926407400518656, 0.002572979312390089, 0.002875214209780097, + 0.0031999291386455297, 0.003547657048329711, 0.0039188801310956478, 0.0043140365742146969, 0.0047335159033536911, 0.005177660845220089, + 0.0056467670947313309, 0.0061410837806761265, 0.0066608106717467308, 0.0072061149403452873, 0.0077771246433258057, 0.0083739152178168297, + 0.0089965220540761948, 0.0096449656412005424, 0.010319218970835209, 0.011019209399819374, 0.01174485869705677, 0.012496041133999825, + 0.013272601179778576, 0.01407436840236187, 0.014901150017976761, 0.015752725303173065, 0.016628840938210487, 0.017529245465993881, + 0.018453648313879967, 0.019401764497160912, 0.020373275503516197, 0.021367868408560753, 0.022385178133845329, 0.023424861952662468, + 0.024486592039465904, 0.025569943711161613, 0.026674600318074226, 0.027800126001238823, 0.028946168720722198, 0.030112311244010925, + 0.031298160552978516, 0.032503306865692139, 0.033727359026670456, 0.034969881176948547, 0.036230511963367462, 0.037508808076381683, + 0.038804333657026291, 0.040116727352142334, 0.041445545852184296, 0.042790420353412628, 0.044150922447443008, 0.045526620000600815, + 0.046917147934436798, 0.048322096467018127, 0.049741055816411972, 0.051173664629459381, 0.052619524300098419, 0.054078217595815659, + 0.055549412965774536, 0.057032708078622818, 0.05852774903178215, 0.060034122318029404, 0.061551533639431, 0.063079580664634705, + 0.064617909491062164, 0.066166229546070099, 0.067724093794822693, 0.069291271269321442, 0.070867374539375305, 0.072452105581760406, + 0.074045136570930481, 0.07564612478017807, 0.077254779636859894, 0.078870825469493866, 0.080493956804275513, 0.082123853266239166, + 0.08376021683216095, 0.085402816534042358, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, + 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, 0.086020313203334808, +}; + +} // namespace ltk diff --git a/handoff/emit_leveltrack.py b/handoff/emit_leveltrack.py new file mode 100644 index 0000000..2568cc5 --- /dev/null +++ b/handoff/emit_leveltrack.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +"""Emit dsp/leveltrack_data.hpp: live level-tracker A[] + mask scalars from +handoff/rtctx_live.json (P1.5 realtime capture, render_long.rpp preset). +""" +import json, os + +HERE = os.path.dirname(os.path.abspath(__file__)) +SRC = os.path.join(HERE, 'rtctx_live.json') +OUT = os.path.join(HERE, '..', 'dsp', 'leveltrack_data.hpp') + +d = json.load(open(SRC)) + +A_attack = d['A_4c0528'] # attack smoothing (fast), 341 double +A_release = d['A_3c0510'] # release smoothing (slow), 341 double +scalars = d['scalars'] # hex-offset -> float + + +def fmt_doubles(a): + return ", ".join("%.17g" % v for v in a) + + +lines = [] +lines.append("// AUTOGENERATED from P1.5 realtime capture handoff/rtctx_live.json") +lines.append("// (render_long.rpp: attack=0 release=0 selectivity=10 sharpness=10 depth=0.864).") +lines.append("// Regenerate with handoff/emit_leveltrack.py. Do not edit by hand.") +lines.append("#pragma once") +lines.append("#include ") +lines.append("") +lines.append("namespace ltk {") +lines.append("") +lines.append("// ctx = 0x2370040, marker +0x24 == 48000.0f (internal SR).") +lines.append("constexpr float CTX_INTERNAL_SR = 48000.0f;") +lines.append("") +lines.append("// mask scalars (float) captured live:") +for off, val in scalars.items(): + lines.append(f"constexpr float SCALAR{off.upper()} = {val}f;") +lines.append("") +lines.append(f"constexpr size_t LEVEL_NBINS = {len(A_attack)};") +lines.append("") +lines.append("// per-bin level-tracker IIR attack coefficients (0x4c0528):") +lines.append(f"const double A_ATTACK[{len(A_attack)}] = {{") +for i in range(0, len(A_attack), 6): + lines.append(" " + ", ".join("%.17g" % v for v in A_attack[i:i+6]) + ",") +lines.append("};") +lines.append("") +lines.append("// per-bin level-tracker IIR release coefficients (0x3c0510 == 0x2c04f8):") +lines.append(f"const double A_RELEASE[{len(A_release)}] = {{") +for i in range(0, len(A_release), 6): + lines.append(" " + ", ".join("%.17g" % v for v in A_release[i:i+6]) + ",") +lines.append("};") +lines.append("") +lines.append("} // namespace ltk") + +open(OUT, 'w').write("\n".join(lines) + "\n") +print(f"wrote {OUT}: attack={len(A_attack)} release={len(A_release)} scalars={len(scalars)}")