This commit is contained in:
Mikkeli Matlock
2026-05-28 14:05:34 +09:00
parent c466de62b2
commit cf901a5686
14 changed files with 1848 additions and 648 deletions
+46 -66
View File
@@ -1,78 +1,58 @@
# uj-mastering-master
Custom mastering toolkit providing comprehensive metrics to evaluate audio masterings through visual analysis.
Custom mastering toolkit providing visual metrics for evaluating audio masterings.
Developed with Claude Code assistance.
## Features
### Current Implementation
- **Complete GUI Application**: Modular PyQt5 interface with drag-and-drop and file dialog support
- **Real-time Analysis**: Background threading with embedded matplotlib visualization
- **Font Management**: CJK-compatible font system with custom font support from `fonts/` directory
- **Audio Support**: MP3, WAV, and FLAC file analysis
- **RMS Power Analysis**: Rolling window analysis with adaptive color mapping
- **Metadata Display**: Automatic extraction and display of audio tags and BPM
### 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
### 🚧 In Development
- **Plot Control Widgets**: Dedicated cluster for plot manipulation and style controls
- **LUFS Metrics**: Professional loudness measurement implementation
- **Interactive Plotting**: Real-time axis control and style customization
### Roadmap
See [CLAUDE.md](CLAUDE.md) for the full development roadmap. Near-term:
plot-control widget cluster, LUFS, dynamic range, interactive axis controls.
### 🔮 Planned Features
- **Audio Comparison**: Reference vs. comparee analysis for mastering evaluation
- **Advanced Metrics**: Dynamic range, spectral analysis, and professional standards compliance
- **Standalone Releases**: Self-contained executable distribution
## Quick start
This project uses [uv](https://docs.astral.sh/uv/). With uv installed:
```bash
uv sync
uv run ujm
```
`uv run ujm` is the only supported entry point — it boots the GUI.
### Logging flags
```bash
uv run ujm --log-level DEBUG # ERROR | WARN | INFO | DEBUG | TRACE
uv run ujm --log-file # also write audio_analysis.log
```
### 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.
## Dependencies
- **Core**: `librosa`, `numpy`, `matplotlib`, `mutagen`
- **GUI**: `PyQt5`
- **Audio Processing**: Advanced librosa-based analysis pipeline
## Usage
### GUI Application (Recommended)
```bash
python main.py
```
- **Load Files**: Use "Open Audio File..." button or drag-and-drop
- **Font Control**: Adjust interface fonts and regenerate plots automatically
- **Analysis Display**: View real-time RMS power analysis with metadata
- **File Management**: Switch between analyzed files using the file list
### Command Line Analysis (Legacy)
```bash
# 1. Edit files.txt with your audio file paths
# 2. Run batch analysis
python master_core.py
```
`librosa`, `numpy`, `matplotlib`, `mutagen`, `PyQt5` — all pinned through
`uv.lock`. Python 3.10+.
## Architecture
### Modular Design
- **Self-contained Widgets**: Easy layout management and customization
- **Background Processing**: Non-blocking analysis with progress feedback
- **Signal-based Communication**: Clean separation between GUI and analysis logic
### Key Components
- `main.py`: Complete GUI application with modular architecture
- `font_control_widget.py`: Unified font management with plot regeneration
- `analysis_results_manager.py`: Threaded analysis with caching
- `audio_visualization_widget.py`: Embedded matplotlib with Qt integration
## Development Roadmap
### 🎯 Next Priority: Plot Control System
Moving from font-focused interface to comprehensive plot manipulation:
- Cluster plot controls (refresh, style, metric selection)
- Interactive axis range selection
- Real-time plot style customization
- Foundation for comparison features
### 🎵 Short-term Goals
- **LUFS Implementation**: Professional loudness standards
- **Plot Interactivity**: GUI-controlled visualization styles
- **Metric Selection**: Choose which analysis to display
### 🎼 Long-term Vision
- **Mastering Comparison**: Side-by-side analysis tools
- **Professional Standards**: EBU R128 compliance checking
- **Standalone Distribution**: Self-contained executable releases
| 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) |