2024-04-10 20:14:02 +09:00
|
|
|
# uj-mastering-master
|
2026-05-28 14:05:34 +09:00
|
|
|
|
|
|
|
|
Custom mastering toolkit providing visual metrics for evaluating audio masterings.
|
2025-08-22 00:26:27 +09:00
|
|
|
Developed with Claude Code assistance.
|
|
|
|
|
|
|
|
|
|
## Features
|
|
|
|
|
|
2026-05-28 14:05:34 +09:00
|
|
|
### Current
|
|
|
|
|
- **PyQt5 GUI**: drag-and-drop or file-dialog ingest of `.mp3`, `.wav`, `.flac`
|
|
|
|
|
- **RMS power analysis** on a 10 s rolling window with adaptive colour scale
|
|
|
|
|
- **BPM detection** via librosa
|
|
|
|
|
- **CJK-safe font system** with custom fonts loaded from `fonts/` (gitignored), system fallbacks, and a live font selector
|
|
|
|
|
- **Background analysis thread** so the UI stays responsive
|
|
|
|
|
- **Embedded matplotlib canvas** with auto-regenerated plots on font change
|
2025-08-22 00:26:27 +09:00
|
|
|
|
2026-05-28 14:05:34 +09:00
|
|
|
### Roadmap
|
|
|
|
|
See [CLAUDE.md](CLAUDE.md) for the full development roadmap. Near-term:
|
|
|
|
|
plot-control widget cluster, LUFS, dynamic range, interactive axis controls.
|
2025-08-22 00:26:27 +09:00
|
|
|
|
2026-05-28 14:05:34 +09:00
|
|
|
## Quick start
|
2025-08-22 00:26:27 +09:00
|
|
|
|
2026-05-28 14:05:34 +09:00
|
|
|
This project uses [uv](https://docs.astral.sh/uv/). With uv installed:
|
2025-08-22 00:26:27 +09:00
|
|
|
|
|
|
|
|
```bash
|
2026-05-28 14:05:34 +09:00
|
|
|
uv sync
|
|
|
|
|
uv run ujm
|
2025-08-22 00:26:27 +09:00
|
|
|
```
|
|
|
|
|
|
2026-05-28 14:05:34 +09:00
|
|
|
`uv run ujm` is the only supported entry point — it boots the GUI.
|
|
|
|
|
|
|
|
|
|
### Logging flags
|
2025-08-22 00:26:27 +09:00
|
|
|
```bash
|
2026-05-28 14:05:34 +09:00
|
|
|
uv run ujm --log-level DEBUG # ERROR | WARN | INFO | DEBUG | TRACE
|
|
|
|
|
uv run ujm --log-file # also write audio_analysis.log
|
2025-08-22 00:26:27 +09:00
|
|
|
```
|
|
|
|
|
|
2026-05-28 14:05:34 +09:00
|
|
|
### Fonts
|
|
|
|
|
Drop `.ttf` / `.otf` / `.ttc` files into `fonts/` to get them in the font
|
|
|
|
|
selector. The directory is gitignored to avoid bundling licensed font data.
|
|
|
|
|
See [CJK_FONTS.md](CJK_FONTS.md) for details.
|
2025-08-22 00:26:27 +09:00
|
|
|
|
2026-05-28 14:05:34 +09:00
|
|
|
## Dependencies
|
|
|
|
|
`librosa`, `numpy`, `matplotlib`, `mutagen`, `PyQt5` — all pinned through
|
|
|
|
|
`uv.lock`. Python 3.10+.
|
2025-08-22 00:26:27 +09:00
|
|
|
|
2026-05-28 14:05:34 +09:00
|
|
|
## Architecture
|
2025-08-22 00:26:27 +09:00
|
|
|
|
2026-05-28 14:05:34 +09:00
|
|
|
| Module | Responsibility |
|
|
|
|
|
| --- | --- |
|
|
|
|
|
| `main.py` | `MainWindow` + the `ujm` entry point |
|
|
|
|
|
| `analysis_results_manager.py` | Background `QThread` worker, result cache |
|
|
|
|
|
| `master_core.py` | `AudioFile`: librosa loading, RMS rolling window, BPM |
|
|
|
|
|
| `plotting_engine.py` | Matplotlib `Figure` builder for the power graph |
|
|
|
|
|
| `audio_visualization_widget.py` | Embedded `FigureCanvasQTAgg` host |
|
|
|
|
|
| `font_manager.py` | Custom + system CJK font discovery, matplotlib/Qt config |
|
|
|
|
|
| `font_control_widget.py` | Font picker, size slider, refresh-plot button |
|
|
|
|
|
| `logger_setup.py` | CLI log-level parsing + custom TRACE level |
|
|
|
|
|
| `setup_fonts.py` | Diagnostic utility (run standalone) |
|