From 35bf8a492884890d49d6ff7d364b67cf8b931a0c Mon Sep 17 00:00:00 2001 From: coon Date: Thu, 2 Oct 2025 19:56:34 +0200 Subject: [PATCH] mixer.py: get_system_state: return data in a struct instead of printing them --- mixer.py | 77 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/mixer.py b/mixer.py index 08dd4ca..1a581e7 100755 --- a/mixer.py +++ b/mixer.py @@ -5,12 +5,40 @@ import socket import mido from enum import Enum +from dataclasses import dataclass # For Allen & Heath Qu MIDI protocol documentation see: # https://www.allen-heath.com/content/uploads/2023/06/Qu_MIDI_Protocol_V1.9.pdf class Mixer: + @dataclass + class SystemState: + class QuModel(Enum): + QU16 = 1 + QU24 = 2 + QU32 = 3 + QUPAC = 4 + QUSB = 5 + + def __str__(self): + labels = { + 1: "Qu-16", + 2: "Qu-24", + 3: "Qu-32", + 4: "Qu-Pac", + 5: "Qu-SB", + } + + return labels[self.value] + + sys_ex_header : list + midi_channel : int + id : int + model : QuModel + major_ver : int + minor_ver : int + def __init__(self, ip): self.MIXER_PORT = 51325 self.sock = socket.create_connection((ip, self.MIXER_PORT)) @@ -73,37 +101,18 @@ class Mixer: response = self.recv_sys_ex(self.SysExMessageId.GET_SYSTEM_STATE_RESPONSE) - class QuModel(Enum): - QU16 = 1 - QU24 = 2 - QU32 = 3 - QUPAC = 4 - QUSB = 5 - - def __str__(self): - labels = { - 1: "Qu-16", - 2: "Qu-24", - 3: "Qu-32", - 4: "Qu-Pac", - 5: "Qu-SB", - } - - return labels[self.value] - - sysex_header = response.data[:8] - - midi_channel = int(response.data[7]) + 1 - id = int(response.data[8]) i_pad_flag = int(response.data[9]) - major_ver = int(response.data[10]) - minor_ver = int(response.data[11]) - print(f"sysex_header: {sysex_header}") - print(f"MIDI channel: {midi_channel}") - print(f"ID: 0x{id:02X}") - print(f"Model: {QuModel(i_pad_flag)}") - print(f"Firmware Version: {major_ver}.{minor_ver}") + state = self.SystemState( + sys_ex_header=response.data[:8], + midi_channel=int(response.data[7]), + id=int(response.data[8]), + model=self.SystemState.QuModel(i_pad_flag), + major_ver=int(response.data[10]), + minor_ver = int(response.data[11]) + ) + + return state def get_name_from_qu(self, channel_no, name_to_set): msg_id = self.SysExMessageId.GET_NAME_FROM_QU_REQUEST.value @@ -206,7 +215,15 @@ def main(): match args.command: case "get_name_from_qu": mixer.get_name_from_qu(args.channel_id, args.name) - case "get_system_state": mixer.get_system_state() + case "get_system_state": + state = mixer.get_system_state() + + print(f"sysex_header: {state.sys_ex_header}") + print(f"MIDI channel: {state.midi_channel}") + print(f"ID: 0x{state.id:02X}") + print(f"Model: {state.model}") + print(f"Firmware Version: {state.major_ver}.{state.minor_ver}") + case "shutdown": mixer.shutdown() case "scene_recall": mixer.scene_recall(args.scene_number) case "scene_recall_default": mixer.scene_recall(0)