Skip to content

Commit 2ae4eef

Browse files
committed
Publish M8RK DJ Mixer with automated Windows releases
0 parents  commit 2ae4eef

15 files changed

Lines changed: 3215 additions & 0 deletions

.editorconfig

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
end_of_line = lf
6+
insert_final_newline = true
7+
trim_trailing_whitespace = true
8+
9+
[*.py]
10+
indent_style = space
11+
indent_size = 4
12+
13+
[*.ps1]
14+
end_of_line = crlf
15+
indent_style = space
16+
indent_size = 4
17+
18+
[*.md]
19+
trim_trailing_whitespace = false

.gitattributes

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
* text=auto
2+
3+
*.py text eol=lf
4+
*.md text eol=lf
5+
*.txt text eol=lf
6+
*.ps1 text eol=crlf
7+
*.yml text eol=lf
8+
*.yaml text eol=lf
9+
10+
*.png binary
11+
*.ico binary
12+
*.exe binary
13+
*.dll binary
14+
*.zip binary
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
name: Build and release
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
tags:
8+
- "v*"
9+
workflow_dispatch:
10+
11+
permissions:
12+
contents: write
13+
14+
jobs:
15+
windows:
16+
runs-on: windows-latest
17+
timeout-minutes: 45
18+
19+
env:
20+
PYTHONUTF8: "1"
21+
PYTHONIOENCODING: "utf-8"
22+
23+
steps:
24+
- name: Check out repository
25+
uses: actions/checkout@v4
26+
27+
- name: Set up Python
28+
uses: actions/setup-python@v5
29+
with:
30+
python-version: "3.11"
31+
cache: pip
32+
33+
- name: Install Python dependencies
34+
run: python -m pip install --upgrade pip && python -m pip install -r requirements.txt
35+
36+
- name: Cache third-party tools
37+
uses: actions/cache@v4
38+
with:
39+
path: tools
40+
key: m8rk-windows-tools-v1
41+
42+
- name: Download FFmpeg and Rubber Band
43+
shell: powershell
44+
run: .\scripts\setup_tools.ps1
45+
46+
- name: Run self-tests
47+
shell: powershell
48+
run: .\scripts\check.ps1
49+
50+
- name: Build portable executable
51+
shell: powershell
52+
run: .\build.ps1
53+
54+
- name: Upload workflow artifact
55+
uses: actions/upload-artifact@v4
56+
with:
57+
name: m8rk-windows-x64
58+
path: |
59+
dist/m8rk.exe
60+
dist/FFmpeg-COPYING.txt
61+
dist/RubberBand-COPYING.txt
62+
dist/THIRD_PARTY_NOTICES.md
63+
if-no-files-found: error
64+
65+
- name: Create GitHub Release
66+
if: startsWith(github.ref, 'refs/tags/')
67+
shell: powershell
68+
env:
69+
GH_TOKEN: ${{ github.token }}
70+
TAG_NAME: ${{ github.ref_name }}
71+
run: |
72+
gh release create "$env:TAG_NAME" `
73+
"dist/m8rk.exe" `
74+
"dist/FFmpeg-COPYING.txt" `
75+
"dist/RubberBand-COPYING.txt" `
76+
"dist/THIRD_PARTY_NOTICES.md" `
77+
--verify-tag `
78+
--generate-notes `
79+
--title "M8RK DJ Mixer $env:TAG_NAME"

.gitignore

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Python
2+
__pycache__/
3+
*.py[cod]
4+
*.pyd
5+
.pytest_cache/
6+
.mypy_cache/
7+
.ruff_cache/
8+
.coverage
9+
htmlcov/
10+
.venv/
11+
venv/
12+
13+
# PyInstaller and release artifacts
14+
/build/
15+
/dist/
16+
/*.spec
17+
18+
# Downloaded third-party binaries (restored by scripts/setup_tools.ps1)
19+
/tools/
20+
21+
# Runtime data and generated mixes
22+
.dj_mix_cache.json
23+
mix.mp3
24+
mix.wav
25+
*_tracklist.txt
26+
27+
# Editors and operating systems
28+
.idea/
29+
.vscode/
30+
.DS_Store
31+
Thumbs.db
32+
Desktop.ini
33+
34+
# Temporary files
35+
*.log
36+
*.tmp
37+
*.bak
38+
~$*

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Changelog
2+
3+
## 1.0.0 — 2026-07-27
4+
5+
- Первый публичный выпуск M8RK DJ Mixer.
6+
- Автоматическое сведение треков по BPM, фразам и Camelot.
7+
- Rubber Band R3 для изменения темпа без изменения высоты тона.
8+
- Адаптивный частотно-зависимый кроссфейд.
9+
- Контроль итоговых LUFS и true peak, включая готовый MP3.
10+
- Автоматические частота проекта и защитный MP3-битрейт.
11+
- Метаданные и обложка единого итогового микса.
12+
- Переносимый Windows x64 EXE со встроенными FFmpeg и Rubber Band.

README.md

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
# M8RK DJ Mixer
2+
3+
[![Build and release](https://github.com/codebdbd/m8rk-dj/actions/workflows/build-release.yml/badge.svg)](https://github.com/codebdbd/m8rk-dj/actions/workflows/build-release.yml)
4+
[![Latest release](https://img.shields.io/github/v/release/codebdbd/m8rk-dj)](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.

THIRD_PARTY_NOTICES.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Third-party notices
2+
3+
## Rubber Band Library
4+
5+
The Windows build includes the Rubber Band Library v4.0.0 command-line utility
6+
by Particular Programs Ltd / Breakfast Quay.
7+
8+
- Project: https://breakfastquay.com/rubberband/
9+
- Source: https://github.com/breakfastquay/rubberband
10+
- License: GNU General Public License, version 2 or later
11+
12+
The upstream `COPYING.txt` and `README.txt` files are included in the packaged
13+
application under `licenses/rubberband`.
14+
15+
## FFmpeg
16+
17+
The Windows build includes FFmpeg from the Gyan.dev release Essentials build.
18+
19+
- Project: https://ffmpeg.org/
20+
- Windows build: https://www.gyan.dev/ffmpeg/builds/
21+
- Source: https://ffmpeg.org/download.html#get-sources
22+
- Build configuration: GPL version 3 enabled
23+
24+
The distributor's `LICENSE` file is included in the packaged application under
25+
`licenses/ffmpeg` and copied next to the executable as `FFmpeg-COPYING.txt`.

assets/app.ico

129 KB
Binary file not shown.

assets/app.png

946 KB
Loading

0 commit comments

Comments
 (0)