v0.5 — cleanup orphan code, add MIDI master volume learn, fix turn-deck crashes

- Remove vestigial lufs_meter_widget.py and debug_audio.py
- Delete unused WaveformWidget/WaveformMonitor classes, dead stubs, duplicate code
- Fix turn-mode deck crashes (deck3/deck4 missing from engine.decks, uninitialized manual_elapsed/duration)
- Replace raw print() with logging in main.py
- Add master_volume MIDI learn signal + settings popup entry
- Bump version to 0.5
This commit is contained in:
2026-05-14 22:25:10 +10:00
parent 6067f442b0
commit 89fb7010fb
13 changed files with 356 additions and 752 deletions
+21 -9
View File
@@ -1,8 +1,12 @@
# main.py
import json
import logging
import os
import sys
__version__ = "0.5"
from PySide6.QtWidgets import (
QApplication, QMainWindow, QWidget, QFileDialog,
QVBoxLayout, QHBoxLayout, QSplitter
@@ -11,7 +15,7 @@ from PySide6.QtCore import Qt
from PySide6.QtGui import QFont, QColor, QPalette
from audio_engine import AudioEngine
from deck_widget import DeckWidget, ExternalDeckWidget
from deck_widget import DeckWidget
from cart_widget import CartBankWidget
from playlist_widget import PlaylistWidget
from midi_engine import MidiEngine
@@ -19,6 +23,8 @@ from top_bar_widget import TopBarWidget, THEMES
from history_widget import HistoryWidget
from mixer_widget import MixerWidget
logger = logging.getLogger(__name__)
class RadioPanelWindow(QMainWindow):
def __init__(self):
@@ -26,7 +32,7 @@ class RadioPanelWindow(QMainWindow):
self.engine = AudioEngine()
self.setWindowTitle("Getting To It")
self.setWindowTitle(f"Getting To It v{__version__}")
self.setMinimumSize(1400, 860)
self.resize(1920, 1080)
self._apply_global_style(THEMES[0])
@@ -48,10 +54,10 @@ class RadioPanelWindow(QMainWindow):
# ── Build widgets ─────────────────────────────────────────────────
self.deck1 = DeckWidget("deck1", "DECK 1", "#00b894", self.engine)
self.deck2 = DeckWidget("deck2", "DECK 2", "#6c5ce7", self.engine)
self.deck3 = ExternalDeckWidget("deck3", "DECK 3", "#fdcb6e", self.engine)
self.deck4 = ExternalDeckWidget("deck4", "DECK 4", "#e17055", self.engine)
self.deck1 = DeckWidget("deck1", "DECK_001", "#00b894", self.engine, mode='deck')
self.deck2 = DeckWidget("deck2", "DECK_002", "#6c5ce7", self.engine, mode='deck')
self.deck3 = DeckWidget("deck3", "TURN_001", "#fdcb6e", self.engine, mode='turn')
self.deck4 = DeckWidget("deck4", "TURN_002", "#e17055", self.engine, mode='turn')
self.cart_bank = CartBankWidget(self.engine)
self.cart_bank.setFixedHeight(180)
@@ -117,6 +123,8 @@ class RadioPanelWindow(QMainWindow):
# ── Wire signals ─────────────────────────────────────────────────
self.deck1.track_started.connect(self.history_widget.add_track)
self.deck2.track_started.connect(self.history_widget.add_track)
self.deck3.track_started.connect(self.history_widget.add_track)
self.deck4.track_started.connect(self.history_widget.add_track)
# ── MIDI ──────────────────────────────────────────────────────────
self._setup_midi()
@@ -233,6 +241,7 @@ class RadioPanelWindow(QMainWindow):
self.midi.mixer_solo.connect(self._on_midi_mixer_solo)
self.midi.mixer_pfl.connect(self._on_midi_mixer_pfl)
self.midi.master_control.connect(self._on_midi_master_control)
self.midi.master_volume.connect(self._on_midi_master_volume)
self.midi.controller_connected.connect(self._on_midi_status)
self.midi.start()
@@ -240,7 +249,7 @@ class RadioPanelWindow(QMainWindow):
ports = self.midi.list_ports()
if ports:
print(f"[MIDI] Available ports: {ports}")
logger.info("Available ports: %s", ports)
def _on_midi_play_pause(self, deck: str):
if deck == 'deck1':
@@ -298,11 +307,14 @@ class RadioPanelWindow(QMainWindow):
v = round(max(lo, min(hi, v)), 1)
setattr(master.compressor if knob != "ceiling_db" else master.limiter, knob, v)
def _on_midi_master_volume(self, val: float):
self.engine.mixer['master'].volume = max(0.0, min(1.0, val))
def _on_midi_status(self, connected: bool, name: str):
if connected:
print(f"[MIDI] Connected: {name}")
logger.info("Connected: %s", name)
else:
print(f"[MIDI] Not connected: {name}")
logger.info("Not connected: %s", name)
def closeEvent(self, event):
self.midi.stop()