24k-4: RT_FIRCONV=3 (application law 1.019*M^1.8345); rendersnap2 wav-path hazard fixed (RENDER_FILE parse, was destroying refs — dual_b1q_1.0.wav restored); corpus TOTAL 2.286
This commit is contained in:
+10
-1
@@ -98,7 +98,16 @@ void SpectralProcessor::processBlock(float* in, float* out, size_t num_samples,
|
|||||||
|
|
||||||
detector_.processFrame(buf_, mask_.data());
|
detector_.processFrame(buf_, mask_.data());
|
||||||
|
|
||||||
if (firconv) {
|
if (firconv == 3) {
|
||||||
|
// RT_FIRCONV=3 (NOTES 24k): plugin application law decoded live:
|
||||||
|
// applied_gain = 1.019 * V^1.8345 per bin (rms 0.0025 dB over
|
||||||
|
// 8 drive levels). V = band curve (detector output); here M.
|
||||||
|
for (size_t i = 0; i < nfft_; i++) {
|
||||||
|
double m = std::max(static_cast<double>(mask_[i]), 1e-12);
|
||||||
|
double a = 1.019 * std::pow(m, 1.8345);
|
||||||
|
buf_[i] *= a;
|
||||||
|
}
|
||||||
|
} else if (firconv) {
|
||||||
// RT_FIRCONV=1: Build FIR from mask and apply via complex multiply.
|
// RT_FIRCONV=1: Build FIR from mask and apply via complex multiply.
|
||||||
// The mask is real-valued (per-bin gain). We apply it directly
|
// The mask is real-valued (per-bin gain). We apply it directly
|
||||||
// to the audio spectrum via complex multiply (th_b3c0 equivalent).
|
// to the audio spectrum via complex multiply (th_b3c0 equivalent).
|
||||||
|
|||||||
@@ -2945,3 +2945,28 @@ ln(am)+c·ln(res) по всем 36 точкам: rms 0.64 дБ, системат
|
|||||||
### Статус канона
|
### Статус канона
|
||||||
Канон НЕ тронут; все результаты — новые факты поверх. Коммиты раунда:
|
Канон НЕ тронут; все результаты — новые факты поверх. Коммиты раунда:
|
||||||
6629e8b (24j) → cc8ba34 (24k) → 6dc2967 (24k-2) → этот.
|
6629e8b (24j) → cc8ba34 (24k) → 6dc2967 (24k-2) → этот.
|
||||||
|
|
||||||
|
## ============ ДОПОЛНЕНИЕ 24k-4: RT_FIRCONV=3 внедрён; ХАЗАРД перезаписи рефов; корпус восстановлен ============
|
||||||
|
|
||||||
|
### RT_FIRCONV=3 (spectral.cpp): применение по закону 24k
|
||||||
|
`buf *= 1.019·mask^1.8345` побиновно. Первый прогон dual_b1q_0.5:
|
||||||
|
| конфиг | cut@500 | cut@2000 |
|
||||||
|
|--------|---------|----------|
|
||||||
|
| default | 16.73 | 12.01 |
|
||||||
|
| FIRCONV=3 | 30.31 | 21.71 |
|
||||||
|
| реф | 10.32 | 11.82 |
|
||||||
|
Ожидаемо: наш детектор M ≠ V (перерез в центре), экспонента углубляет.
|
||||||
|
FIRCONV=3 = правильный ПРИМЕНЯЮЩИЙ слой; дальше править только детектор.
|
||||||
|
Канон (default-путь) не тронут, corpus подтверждён (ниже).
|
||||||
|
|
||||||
|
### ХАЗАРД (был, исправлен): rendersnap2 удалял rpp.replace('.rpp','.wav')
|
||||||
|
При сэмплировании soothe-bt проектов это САМ РЕФЕРЕНСНЫЙ WAV → удалялся и
|
||||||
|
перезаписывался свежим рендером плагина. Пострадал dual_b1q_1.0.wav (обрыв,
|
||||||
|
EOFError в corpus). Остальные q-рефы перезаписались, но спектрально
|
||||||
|
идентичны (контрольные числа 10.32/11.82 воспроизвелись ✓). ФИКС: путь берётся
|
||||||
|
из RENDER_FILE проекта; удаление только по нему же. dep0b_rt.wav / out_rt.wav /
|
||||||
|
out-nofx.wav / out_dual300.wav битЫЕ СТАРОГО происхождения (rt-сессии),
|
||||||
|
корпусом не используются — не трогать.
|
||||||
|
Корпус после восстановления: t1kq 0.768 / t1k 2.114 / al 0.986 / res 0.437 /
|
||||||
|
dual 3.264 / comb 6.116 / TOTAL **2.286** (dual улучшился против 3.578 —
|
||||||
|
свежие рефы).
|
||||||
|
|||||||
@@ -47,8 +47,14 @@ def main():
|
|||||||
os.makedirs(OUT, exist_ok=True)
|
os.makedirs(OUT, exist_ok=True)
|
||||||
subprocess.run("pkill -9 -x reaper; pkill -9 -f '[y]abridge'; "
|
subprocess.run("pkill -9 -x reaper; pkill -9 -f '[y]abridge'; "
|
||||||
"rm -rf /run/user/1000/yabridge-soothe2_x64-*; sleep 1", shell=True)
|
"rm -rf /run/user/1000/yabridge-soothe2_x64-*; sleep 1", shell=True)
|
||||||
wav = rpp.replace('.rpp', '.wav')
|
# wav path = RENDER_FILE from the project (NOT rpp.replace!) — deleting the
|
||||||
if os.path.exists(wav):
|
# wrong file destroyed corpus refs once (24k-3 hazard).
|
||||||
|
wav = None
|
||||||
|
for ln in open(rpp, 'r', errors='replace'):
|
||||||
|
if 'RENDER_FILE' in ln and '"' in ln:
|
||||||
|
wav = ln.split('"')[1]
|
||||||
|
break
|
||||||
|
if wav and os.path.exists(wav):
|
||||||
os.remove(wav)
|
os.remove(wav)
|
||||||
proc = subprocess.Popen(['/usr/bin/reaper', '-nosplash', '-ignoreerrors',
|
proc = subprocess.Popen(['/usr/bin/reaper', '-nosplash', '-ignoreerrors',
|
||||||
'-renderproject', rpp],
|
'-renderproject', rpp],
|
||||||
@@ -187,7 +193,7 @@ def main():
|
|||||||
break
|
break
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
print('saved=%d reaper_rc=%s wav=%s' % (saved, proc.poll(),
|
print('saved=%d reaper_rc=%s wav=%s' % (saved, proc.poll(),
|
||||||
os.path.getsize(wav) if os.path.exists(wav) else 'NONE'))
|
os.path.getsize(wav) if wav and os.path.exists(wav) else 'NONE'))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user