Алгоритм вычисления BPM
Точность SHOWBEATSYNC достигается за счет многоступенчатой очистки и жесткой математической логики.
1️⃣ Ядро обнаружения транзиентов: Spectral Flux
В отличие от примитивных алгоритмов, которые ищут биты просто по пикам громкости, SHOWBEATSYNC использует алгоритм Spectral Flux. Простые детекторы легко обмануть сильно скомпрессированными треками. Spectral Flux реагирует на появление новых звуков, а не просто на высокую громкость. Он способен вычленить тихий удар барабана даже на фоне ревущего синтезатора.
- Windowing: Аудиосигнал нарезается на окна по 1024 сэмпла с перекрытием 512 сэмплов (разрешение ~11.6 мс).
- FFT: К каждому окну применяется Быстрое преобразование Фурье.
- Difference Calculation: Алгоритм ищет положительные изменения энергии в каждой частотной полосе.
- Onset Detection: Регистрация транзиента при внезапном появлении новой энергии.
2️⃣ Вычисление темпа (Tempo Tracking)
Обнаружение отдельных ударов — это только первый шаг. Алгоритм отслеживания темпа измеряет временные интервалы между транзиентами.
- Интервалы пропускаются через статистические предсказания.
- Система строит внутреннюю фазовую сетку и выравнивает её с ударами.
- На выходе генерируется: BPM и показатель Confidence (Уверенность).
3️⃣ Интеллектуальная постобработка
SHOWBEATSYNC пропускает "сырой" BPM через 3 уровня жесткой фильтрации:
Фильтр 1: Октавная коррекция
Защита от ошибок удвоения темпа (140 вместо 70) с помощью полосового фильтра BPM Range. Любые значения, выходящие за пределы логики, принудительно умножаются или делятся на 2.
Фильтр 2: Скользящее среднее
Векторный буфер хранит 6 последних достоверных значений темпа для сглаживания джиттера. MIDI Clock генерируется абсолютно линейным.
Фильтр 3: Логический шлюз ямы (Anti-Breakdown)
Если Confidence падает ниже 46%, система перестает слушать "мусор" и начинает отстукивать удары по инерции через внутренний мультимедийный таймер Windows.
4️⃣ Аппаратная маршрутизация и тайминги
- Audio Thread: Аудиопоток работает на максимальном приоритете. FFT происходит прямо внутри callback-функции.
- MIDI Thread: Генерация команд вынесена в отдельный высокоточный асинхронный таймер, гарантируя отсутствие микро-фризов даже при лагах GUI.