Strip compressor/limiter DSP, add per-channel pre-fader gain, PFL/HP blend, LUFS metering from external port, MIDI gain binding

This commit is contained in:
2026-05-15 16:42:10 +10:00
parent 4d6a639c08
commit 2b81a80a39
5 changed files with 193 additions and 294 deletions
+39
View File
@@ -95,6 +95,7 @@ class MidiEngine(QObject):
mixer_solo = Signal(int, bool)
mixer_pfl = Signal(int, bool)
mixer_mic_on = Signal(int, bool)
mixer_gain = Signal(int, float)
master_control = Signal(str, float)
master_volume = Signal(float)
controller_connected = Signal(bool, str)
@@ -286,6 +287,44 @@ class MidiEngine(QObject):
elif action == 'mixer_mic_on':
on = (value > 63) if not inv else (value < 64)
self.mixer_mic_on.emit(target_id, on)
elif action == 'mixer_gain':
if is_rel and 1 <= value <= 63:
prev = self._channel_volumes.get(f"gain_{target_id}", 1.0)
new_val = min(2.0, prev + value * 0.02)
self._channel_volumes[f"gain_{target_id}"] = new_val
self.mixer_gain.emit(target_id, new_val)
elif is_rel and 65 <= value <= 127:
prev = self._channel_volumes.get(f"gain_{target_id}", 1.0)
steps = value & 0x3F
new_val = max(0.0, prev - steps * 0.02)
self._channel_volumes[f"gain_{target_id}"] = new_val
self.mixer_gain.emit(target_id, new_val)
else:
if midi_type == PITCH_BEND:
scaled = (16383 - value if inv else value) / 16383.0
else:
scaled = (127 - value if inv else value) / 127.0
scaled = scaled * 2.0 # map to 0-2 range
self.mixer_gain.emit(target_id, scaled)
elif action == 'mixer_gain':
if is_rel and 1 <= value <= 63:
prev = self._channel_volumes.get(f"gain_{target_id}", 1.0)
new_val = min(2.0, prev + value * 0.02)
self._channel_volumes[f"gain_{target_id}"] = new_val
self.mixer_gain.emit(target_id, new_val)
elif is_rel and 65 <= value <= 127:
prev = self._channel_volumes.get(f"gain_{target_id}", 1.0)
steps = value & 0x3F
new_val = max(0.0, prev - steps * 0.02)
self._channel_volumes[f"gain_{target_id}"] = new_val
self.mixer_gain.emit(target_id, new_val)
else:
if midi_type == PITCH_BEND:
scaled = (16383 - value if inv else value) / 16383.0
else:
scaled = (127 - value if inv else value) / 127.0
scaled = scaled * 2.0 # map to 0-2 range
self.mixer_gain.emit(target_id, scaled)
elif action == 'master_control':
knob = str(target_id)
if is_rel and 1 <= value <= 63: