惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

K
Kaspersky official blog
P
Privacy International News Feed
Simon Willison's Weblog
Simon Willison's Weblog
V
Vulnerabilities – Threatpost
Know Your Adversary
Know Your Adversary
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Palo Alto Networks Blog
NISL@THU
NISL@THU
C
Cybersecurity and Infrastructure Security Agency CISA
S
Securelist
Scott Helme
Scott Helme
T
Threat Research - Cisco Blogs
L
LINUX DO - 热门话题
Google Online Security Blog
Google Online Security Blog
G
GRAHAM CLULEY
Project Zero
Project Zero
P
Privacy & Cybersecurity Law Blog
I
Intezer
T
Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
S
Schneier on Security
WordPress大学
WordPress大学
P
Proofpoint News Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - Franky
小众软件
小众软件
S
Security Affairs
人人都是产品经理
人人都是产品经理
量子位
Help Net Security
Help Net Security
博客园 - 三生石上(FineUI控件)
V
Visual Studio Blog
PCI Perspectives
PCI Perspectives
雷峰网
雷峰网
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
罗磊的独立博客
博客园 - 聂微东
H
Hacker News: Front Page
Jina AI
Jina AI
博客园 - 叶小钗
C
CXSECURITY Database RSS Feed - CXSecurity.com
L
LINUX DO - 最新话题
Latest news
Latest news
The Last Watchdog
The Last Watchdog
W
WeLiveSecurity
酷 壳 – CoolShell
酷 壳 – CoolShell

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Кто решает судьбу вашего проекта? Разбираем заинтересованные стороны. BABOK #1 Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как Фалькон Тех меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Автоматический DSP-премастеринг для аудиокассет на C++
Денис · 2026-06-11 · via Все публикации подряд на Хабре

Средний

6 мин

3K

От ностальгии к алгоритмам

Помните мою прошлую статью, где мы гоняли один и тот же современный альбом на четырёх типах лент через трёхголовочную Kenwood KX-1100G? Тот эксперимент показал: аналоговый звук жив, но характер цифрового мастера и точность калибровки деки часто влияют на результат сильнее, чем разница между Type I и Type IV.

За кадром осталась другая проблема. Современный стриминговый релиз — это −8…−10 LUFS integrated, True Peak на 0 dBFS и выше, плотный верх, широкий стереобас и brickwall-лимитирование. Записать такой файл на ленту «как есть» — получить грязный верх, нестабильный уровень, клиппинг на записи и бас, который «гуляет» между каналами из‑за crosstalk.

После десятка вечеров с ручной подгонкой gain, bias и лимитеров под каждый трек я устал повторять одну и ту же работу. Так появился CassetteMaster — десктопное приложение на C++20 / JUCE 8, которое автоматически готовит цифровой звук к записи на физическую кассету.

Это не «ленточный эффект с шипением» и не винтажный дисторшн. Задача программы — сохранить digital fidelity: убрать только то, что физически конфликтует с магнитной лентой.

В чём физический конфликт цифры и ленты

Компакт-кассета работает в жёстких физических пределах ушедшей эпохи:

  • MOL/SOL — ограниченный выходной уровень на высоких частотах;

  • Self-erasure — избыточные ВЧ «стирают» соседние участки дорожки;

  • Crosstalk ~30–40 dB между каналами;

  • Head gap + 4.76 cm/s — естественный спад ВЧ к 14–16 kHz;

  • Wow/flutter, bias, azimuth — механические ограничения транспорта.

Современный мастеринг создаётся под стриминг и смартфоны. Магнитная лента — нет.

Параметр цифрового мастера

Ограничение ленты (Type I / II)

Что происходит при прямой записи

Громкость −8…−10 LUFS

Насыщение магнитного слоя (MOL)

Глухой, грязный дисторшн

Яркий, пережатый верх

Self-erasure

Лента «стирает» сама себя на ВЧ

Широкий стереобас

Crosstalk

Фазовые проблемы, «гуляющий» бас

True Peak ≥ 0 dBFS

Ограничение по пикам

Жёсткий аналоговый клиппинг

Наша задача: не сделать lo-fi-плагин, а наоборот — сохранить цифровую точность, сняв исключительно то, что сломает запись на конкретной ленте и деке.

Интерфейс: три шага от FLAC до WAV

Workflow простой:

  1. Add music — drag & drop файла или папки (WAV, FLAC, AIFF, OGG).

  2. Prepare — офлайн-анализ и автоматический мастеринг в фоновом потоке.

  3. Export — 32-bit float WAV, опционально с калибровочными тонами в начале.

Тип ленты (Type I / II / IV) и длина кассеты (C60/C90/C120) задаются до обработки. Дека в текущем UI зафиксирована на Kenwood KX-1100G — той самой, с которой мы проводили эксперимент.

Кнопки Before / After включают A/B-предпрослушивание фрагмента (~45 s). Waveform показывает LUFS, True Peak и маркеры обработки: limiter, HF reduction, de-esser, clip warning.

Архитектура: офлайн-процессор, а не realtime-эффект

CassetteMaster — легковесный офлайн-процессор. Вся тяжёлая работа идёт в worker thread, UI не блокируется. Ядро — статическая библиотека cassette_core, общая для GUI-приложения, опционального CassetteBurner и VST3/AU-плагина.

Поток при нажатии Prepare

  1. AudioFileLoader загружает файл в AudioBuffer<float>.

  2. EssentiaAnalyzer::extractFeatures строит структуру AudioFeatures.

  3. CassetteProfile::forRecording(KenwoodKX1100G, tapeType) задаёт потолки LUFS/TP/HF.

  4. AdaptiveMasteringProcessor::process вызывает планировщик, опционально ODG loop, затем CassetteAutoMaster::processTrack.

  5. ProcessingDiagnostics рисует маркеры на waveform и пишет лог.

  6. UI обновляет панель «After» и статус Ready to export.

Шаг 1. Офлайн-анализ

Когда вы перетаскиваете FLAC в окно, движок вычисляет карту параметров — не для красоты метров, а для принятия решений планировщиком.

Loudness и пики: integrated LUFS (EBU R128-подобный LoudnessMeter), True Peak с oversampling (TruePeakMeter), crest factor, loudness range.

Спектр: доли энергии LF/MF/HF, stereo correlation, LF stereo correlation, ширина стереобазы.

Психоакустика (PsychoacousticMetrics, 24 полосы Bark):

  • roughness — «грубость» верха (модуляция 20–300 Hz);

  • sharpness (DIN 45692);

  • hfAboveMaskingDb — энергия ВЧ выше порога маскирования;

  • streamingRingingIndex — «звонкость» стримингового мастера;

  • hfTamerStrength — рекомендуемая глубина HF prep (0…1).

Essentia подключается опционально (CASSETTE_BUILD_ESSENTIA); без неё работает встроенный fallback по BS.1770.

Шаг 2. Умный планировщик

Приложение не обрабатывает все треки одинаково. Класс CassetteMasteringPlanner — сердце автоматизации.

Сначала вычисляется Tape Threat Score (0…1): взвешенная сумма превышений LUFS/TP над потолком профиля, roughness, sharpness, HF above masking, ringing index, низкой LF correlation, высокого HF energy ratio, клиппинга.

Для Kenwood KX-1100G score умножается на (1 − autoPrepRelief), где autoPrepRelief = 0.18 — планировщик менее агрессивен, чем для «голых» профилей IEC.

Шаг 3. Цепочка DSP

Реализация — CassetteAutoMaster::processTrack. Сигнал проходит через кастомный граф обработки:

Инфра-HPF (~25 Hz)

Отрезаем суб-низкие частоты, которые дека всё равно не запишет, но которые бесполезно насыщают магнитный слой. В режиме hot/clean отключён — на peaky материале после HPF limiter давал заметное проседание LUFS.

Side LF mono

Переводим сигнал в Mid/Side. В канале Side отрезаем всё ниже ~120 Hz. Бас становится монофоническим — меньше crosstalk на кассетной головке.

Adaptive HF Tamer

Динамический эквалайзер в полосе 4.5–14 kHz. Если наступает критический пик энергии на ВЧ, который вызовет self-erasure, tamer мягко «присаживает» эту частоту. На спокойном материале прозрачен.

Roughness De-Esser

Борется со специфическим «звоном» цифровых лимитеров — без глобального low-pass.

True Peak Limiter + Post-chain loudness trim

Integrated LUFS и True Peak — два разных ограничения. На кассете важны оба.

Для hot/clean, когда горячие и LUFS, и TP, берётся менее агрессивный из двух gain — чтобы limiter не «съедал» лишние LU.

После limiter/HF chain измеряется LUFS. Если источник был «горячим», но выход ниже cap — makeup (до +4.5 dB). Если выше cap — лёгкий cut. Для тихих источников boost не применяется.

Итеративный цикл до 4 проходов с re-limit только на full prep path.

Физика → DSP

Физическое явление

Ответ CassetteMaster

Насыщение ленты (Jiles–Atherton)

Gain staging к maxIntegratedLUFS, soft clip только Type I / lo-fi

Self-erasure / HF bias

Adaptive HF Tamer, Side HF cut

Crosstalk

Side LF mono (HPF Side < 120–150 Hz)

Head gap + 4.76 cm/s

Side HF cut по профилю

Inter-sample peaks

True Peak meter + limiter

Профили ленты и Kenwood KX-1100G

Профили заданы в CassetteProfile. Для Kenwood — applyKenwoodKX1100GTuning: без эмуляции Dolby HX-Pro, расширенный HF headroom, повышенный biasReductionOnHf на Type II.

Kenwood +

max LUFS

TP ceiling

Type I

−11.0

−0.8 dBFS

Type II

−11.5

−0.5 dBFS

Type IV

−11.0

−0.2 dBFS

Mixtape: папка → Side A / Side B

Перетащите папку с альбомом — программа сканирует аудио, сортирует имена natural sort, считает длительность с gap 2 s между треками.

Если материал не помещается на C60/C90/C120 — greedy packing на несколько кассет:

Каждый трек проходит per-track mastering, затем сводится на timeline стороны.

Тест на живом материале: Charli XCX

Для регрессии DSP — fixture прямо в CI: 90-секундный фрагмент Charli XCX — SS26 Rock Music.

Before

After

Integrated LUFS

−9.86

−10.80

True Peak

+0.15 dBFS

−0.80 dBTP

Plan

KX-1100G hot/clean

Планировщик корректно выбрал hot/clean — только level + limiter, без HF prep. Результат укладывается в cap Kenwood Type I (−11 LUFS), TP строго на ceiling.

Почему это важно: в ранних версиях тот же трек «перегашивался» до ~−14 LUFS — limiter и infra-HPF работали в связке и съедали 3–4 dB энергии без необходимости. Новая архитектура устранила перегас, сохранив безопасные пики.

Заключение

CassetteMaster — специализированный tape-oriented mastering, а не универсальный loudness maximizer. Программа сочетает:

  • объективный и психоакустический анализ стриминговых мастеров;

  • автоматический выбор глубины обработки — от «только level + TP» до полного HF/LF prep;

  • профили ленты и деки с физически мотивированными потолками LUFS/TP/HF;

  • прозрачный DSP с post-chain loudness trim и защитой от двойного перегаса;

  • mixtape workflow для альбомов и папок;

  • verifiable quality через автотесты и fixture реального pop-трека.

Спасибо за чтение!

Денис Попков

KMP разработчик в «Black Bricks»

Если вы нашли неточности/ошибки в статье или просто хотите дополнить её своим мнением — то прошу в комментарии! Или можете написать мне в Telegram. Также подписывайтесь на мой ТГ-канал. Там пишу про свои будни, кассеты и винил :>