|
| 1 | +# M8RK DJ Mixer |
| 2 | + |
| 3 | +[](https://github.com/codebdbd/m8rk-dj/actions/workflows/build-release.yml) |
| 4 | +[](https://github.com/codebdbd/m8rk-dj/releases/latest) |
| 5 | + |
| 6 | +Скрипт автоматически собирает аудиофайлы из папки в один непрерывный DJ-сет. |
| 7 | + |
| 8 | +## Что исправлено |
| 9 | + |
| 10 | +- Правильное направление `time-stretch`: итоговый BPM теперь действительно соответствует расчёту. |
| 11 | +- Корректная передача NumPy-аудиосигнала в `madmom` через `madmom.audio.signal.Signal`. |
| 12 | +- Модели `madmom` загружаются один раз, а не для каждого трека. |
| 13 | +- Защита от BPM `0`, `NaN` и бесконечного цикла. |
| 14 | +- Все файлы приводятся к stereo и общей частоте дискретизации. |
| 15 | +- Настоящий режим `--order asis` без предварительной алфавитной сортировки. |
| 16 | +- Кэш версионирован и учитывает доступность `madmom`. |
| 17 | +- Переход выбирается только среди физически допустимых точек и выравнивается по downbeat/фразе. |
| 18 | +- Целевой BPM берётся у исходного трека, ближайшего к медиане сета, а остаточный рассинхрон автоматически сокращает переход. |
| 19 | +- Бас ниже 180 Гц сводится адаптивно по корреляции: без подъёма одинакового баса и без провала разных басовых партий. |
| 20 | +- Эвристика первой доли учитывает не только общую атаку, но и низкочастотную атаку/энергию бочки. |
| 21 | +- Устранена ошибка минимальной длины кроссфейда на коротких треках. |
| 22 | +- Потоковая сборка: в памяти находятся только соседние треки, а не весь сет. |
| 23 | +- LUFS-нормализация вместо простой RMS-нормализации; предусмотрен fallback. |
| 24 | +- Финальные LUFS и true peak измеряются по собранному сету; MP3 проверяется повторно после декодирования. |
| 25 | +- Добавлен анализ тональности и порядок `smart` по BPM + Camelot. |
| 26 | + |
| 27 | +## Требования |
| 28 | + |
| 29 | +- Python 3.10+ |
| 30 | +- PowerShell 5.1+ для подготовки инструментов и Windows-сборки. |
| 31 | +- FFmpeg для чтения сжатых форматов и экспорта MP3. В Windows EXE он встроен. |
| 32 | +- Python-зависимости: |
| 33 | + |
| 34 | +```bash |
| 35 | +pip install -r requirements.txt |
| 36 | +``` |
| 37 | + |
| 38 | +## Подготовка исходников |
| 39 | + |
| 40 | +После клонирования создайте окружение и загрузите сторонние инструменты: |
| 41 | + |
| 42 | +```powershell |
| 43 | +python -m venv .venv |
| 44 | +.\.venv\Scripts\Activate.ps1 |
| 45 | +python -m pip install -r requirements.txt |
| 46 | +.\scripts\setup_tools.ps1 |
| 47 | +.\scripts\check.ps1 |
| 48 | +``` |
| 49 | + |
| 50 | +`setup_tools.ps1` загружает официальный |
| 51 | +[FFmpeg Essentials](https://www.gyan.dev/ffmpeg/builds/) и |
| 52 | +[Rubber Band 4.0.0](https://breakfastquay.com/rubberband/). Каталоги `tools`, |
| 53 | +`build` и `dist` не попадают в Git. |
| 54 | + |
| 55 | +Windows-сборка содержит FFmpeg и Rubber Band R3. Ручная установка |
| 56 | +`pyrubberband`, `rubberband-cli` или системного FFmpeg не требуется. |
| 57 | + |
| 58 | +Для более точного downbeat-анализа можно установить `madmom`. Если пакет не |
| 59 | +установлен или не запускается на текущей версии Python/NumPy, скрипт |
| 60 | +автоматически использует встроенную эвристику. |
| 61 | + |
| 62 | +## Запуск |
| 63 | + |
| 64 | +```bash |
| 65 | +python dj_mix_builder.py ./tracks -o mix.mp3 |
| 66 | +``` |
| 67 | + |
| 68 | +Графический интерфейс: |
| 69 | + |
| 70 | +```bash |
| 71 | +python dj_mix_gui.py |
| 72 | +``` |
| 73 | + |
| 74 | +Сборка Windows-приложения: |
| 75 | + |
| 76 | +```powershell |
| 77 | +.\build.ps1 |
| 78 | +``` |
| 79 | + |
| 80 | +Готовый файл появится в `dist\m8rk.exe`. |
| 81 | + |
| 82 | +Если `tools` отсутствует, `build.ps1` автоматически запустит |
| 83 | +`scripts\setup_tools.ps1`. Готовый EXE публикуйте как файл релиза, а не |
| 84 | +добавляйте в историю Git: его размер превышает лимит обычного файла GitHub. |
| 85 | + |
| 86 | +Вкладка «Мета» записывает в готовый единый микс название, исполнителя/DJ, |
| 87 | +серию или альбом, жанр, год, комментарий и обложку PNG/JPEG. |
| 88 | + |
| 89 | +Сохранение WAV: |
| 90 | + |
| 91 | +```bash |
| 92 | +python dj_mix_builder.py ./tracks -o mix.wav |
| 93 | +``` |
| 94 | + |
| 95 | +Только анализ: |
| 96 | + |
| 97 | +```bash |
| 98 | +python dj_mix_builder.py ./tracks --analyze-only |
| 99 | +``` |
| 100 | + |
| 101 | +## Основные параметры |
| 102 | + |
| 103 | +```text |
| 104 | +--order smart|bpm|filename|asis |
| 105 | +--crossfade-bars 8 |
| 106 | +--phrase-bars 8 |
| 107 | +--loudness-target -16 |
| 108 | +--sample-rate auto |
| 109 | +--max-stretch 0.06 |
| 110 | +--true-peak -1.0 |
| 111 | +--mp3-bitrate auto|128k|160k|192k|256k|320k |
| 112 | +--downbeat-method auto|madmom|heuristic |
| 113 | +--trim-silence |
| 114 | +--recursive |
| 115 | +--no-cache |
| 116 | +``` |
| 117 | + |
| 118 | +`smart` сортирует треки по сочетанию близости BPM и гармонической |
| 119 | +совместимости Camelot. Анализ тональности автоматический и не гарантирует |
| 120 | +точность профессиональной ручной разметки. |
| 121 | + |
| 122 | +Битрейт MP3 по умолчанию учитывает медиану исходников, но использует минимум |
| 123 | +256 кбит/с. Это не восстанавливает уже потерянное качество, зато уменьшает |
| 124 | +добавочные потери повторного MP3-кодирования. 128/160/192 кбит/с доступны |
| 125 | +для ручного выбора. |
| 126 | + |
| 127 | +Обрезка тихих краёв по умолчанию выключена, чтобы не удалять вступления, |
| 128 | +хвосты реверберации и атаки. При необходимости её можно включить во вкладке |
| 129 | +«Дополнительно»; применяется только короткий 2-мс микрофейд. |
| 130 | + |
| 131 | +Максимальное изменение темпа по умолчанию ограничено ±6%. Это уменьшает |
| 132 | +артефакты растяжения; если треки всё равно не совпадают по BPM, программа |
| 133 | +сокращает переход, чтобы сетки не успели заметно разойтись. |
| 134 | + |
| 135 | +Частота проекта по умолчанию выбирается автоматически: 44,1 или 48 кГц по |
| 136 | +семейству большинства исходников. Переносимый `m8rk.exe` включает Python, |
| 137 | +Rubber Band R3 и FFmpeg и не требует их отдельной установки. |
| 138 | + |
| 139 | +## Результат |
| 140 | + |
| 141 | +Рядом с итоговым файлом создаётся `<имя>_tracklist.txt` с таймкодами, |
| 142 | +исходным и фактическим BPM, тональностью, Camelot-кодом и методом downbeat-анализа. |
| 143 | + |
| 144 | +## Границы решения |
| 145 | + |
| 146 | +Скрипт устраняет найденные программные дефекты и улучшает техническое сведение. |
| 147 | +Он не заменяет ручную работу DJ: не распознаёт вокал с профессиональной |
| 148 | +точностью, не выполняет stem separation и не строит художественную драматургию сета. |
| 149 | + |
| 150 | +## Лицензии сторонних компонентов |
| 151 | + |
| 152 | +Сведения о Rubber Band и FFmpeg находятся в |
| 153 | +[`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md). Перед публичным выпуском |
| 154 | +проекта владелец репозитория должен отдельно выбрать лицензию для собственного |
| 155 | +Python-кода. Сторонние бинарники и готовый EXE намеренно не хранятся в Git. |
0 commit comments