From 6780eb2ecb3cf0da0705d4c85effc84bb754bc8f Mon Sep 17 00:00:00 2001 From: Nick Date: Mon, 27 Oct 2025 20:35:32 +0100 Subject: [PATCH] added mix control --- .tf5_mixer_cache/channels_cache.json | 8 +- __pycache__/mixer_controller.cpython-312.pyc | Bin 33041 -> 36857 bytes mixer_controller.py | 96 +++++++++++++++++++ telegram_bot.py | 8 ++ 4 files changed, 108 insertions(+), 4 deletions(-) diff --git a/.tf5_mixer_cache/channels_cache.json b/.tf5_mixer_cache/channels_cache.json index 35d9786..a4fdeba 100644 --- a/.tf5_mixer_cache/channels_cache.json +++ b/.tf5_mixer_cache/channels_cache.json @@ -37,10 +37,10 @@ }, "6": { "channel": 6, - "name": "Vox2", - "on": true, - "level_db": -1.1, - "pan": 0 + "name": "ON", + "on": false, + "level_db": 0.01, + "pan": 200 }, "7": { "channel": 7, diff --git a/__pycache__/mixer_controller.cpython-312.pyc b/__pycache__/mixer_controller.cpython-312.pyc index b886b948eb559113a78d5c8eee9c0ade79234569..3b300129bae402521394856e171050e25863300d 100644 GIT binary patch delta 2255 zcmb7_TTmNS7{_-v$tKx^5E8^g=0x7GlUQkRc?Hq?Cq@ zpw`OtVh7JlEp+6`Va6Msjx%_v4O7R77 zbH20L{hfctUZQ?~lQMjnk--qqvJ-!HfAH!}gO=23@EqDAP2GBmbd&5x-Y8gjhhXAW zf}xY<%g(D>OZkoH8dbkfPMIK`C)nk*hIgG;wys-==Pzy3@arL7xe`y8s)ktAxed-u zw;oWADCJe6>Z)uin?yV7Ysz_2q`cH1)ng-wkTyc4AB!OHJZuP%B*9a>Dng;zo#qAw zPs{5RygH@~7$U0W)uMveL}B(enU2JiyjCQ6G77(YoZuOeS~XUV6F2CXN<<4`3;MBu z5n?p26X^jWMDh9n3Fl>qBc58l zBSb0(UD{hp8qv_fZNpE`sN>{^+UcQqQT#xnf3`keBON^^HF~6D9g@jAs!p2O`{vR) zbLnK)J+o_6lcI@|@~JIz#hb=_Gi)-Kn`9@oQ@PVyrz>ZA6Z@p5mc$OJwM}B%lU8m) ztu!(zLaAj!IdHaD39{VOFi_x+z4#D~ZQJog&{Qelvy$*xX@Ek#3JT3CC^X^{6sWM4 zML$&Oc;F{Z1S1onlZnvFL})}@G6UiUOcGF$DN|we)BqK=Uat_~1un>i`-HB5!1>Gm z7ZTssPH1Hu@D)H;>+%{g1&0HFMh!>RF%x$Jl#BV^k&QS!I}QJ zEm1pbj~fym=}1%JtYm8bZ!{c}XD5AA=Voj(`grZ!vF6!ssZEgfbV_X3W7vSl!3|Z{ zt8@k!;Q8W5Pi`n#OBNAREVF=&+pPwk78P*w)iM-H6fdZ7#Aq!M!S_yXBE4cXYEjK= zdY*$fuM*X$(veSUfT5gRUcb7=%5rVmbwn3)oX_YfCx{pWJ_8;oGNJ~&2K$atrYsBQ zCh#4z$N+8GK$`_}IXARCJ3%)R#RNE`E~aTAF4qq#T8Oix)9TTn_gihn;6(q590#rh zcONZumoAx61RzC768Ozc#!wvI_!*zA@q|-@<-o-m2Sl+-gg5^al z?}0#mEytl(a7wnhE}Yk;ZO$bZKsYywWgN?8ELX6+hD9!V5sxmRiSk@4+x1UF#IFF= z+AL_OO>bJd065l%@!v|K+dG_!WF|I4Zey19+J>>bQ95a|U+W)pjjF-ya%}f4WpkD? zsp3$gGjURCIw3W;ODEh?`SbTI9(1RDOCdvmN196JOeIp;-UJ;VO!P}fPfABxq|(-V zrc>x@J39=OST4yHB+dCr6ASpSbzHe5k-B@O;{hoUl-Rz73^n#p zwU&99$|SY+B%60}-ydN;{Onm5w>z7-o2}e!Q#3fqI;U%1<8}u;y@K04&$!*aLH>*% zkM*cB_CQyLUB!vTg^Vv0QKzU|n_hTGdKZZT6_eUY+EvW7B1J$KH_IJd^>p9bzKFxA zZB|$UIq2fWa+l!cPHH~2h@+{^4iz&MP7%<>p%!!r<*$STxkj#&+tC*z&t&c~kjyUx IR{1~SFY0}OPXGV_ delta 133 zcmex4pJ`$f6W?iGUM>b8@HqNE<9PW-K2An%b`T#3J|AM-ti%}4D6XF(kSdy@mMWCO zn#z~PmZILm8l{?|KY0d|4@;$V*RrijVEvHx8zUdVdVP603wUTfK~tio5Ljy diff --git a/mixer_controller.py b/mixer_controller.py index cc3e3df..abd3275 100644 --- a/mixer_controller.py +++ b/mixer_controller.py @@ -819,4 +819,100 @@ class TF5MixerController: "mixes": mixes, "cache_age_seconds": int(cache_age), "message": f"Riepilogo di {len(mixes)} mix (cache: {int(cache_age)}s fa)" + } + + def set_channel_to_mix_level(self, channel: int, mix_number: int, level_db: float) -> dict: + """Imposta il livello di invio di un canale verso un mix/aux. + + Args: + channel: Numero del canale (1-40) + mix_number: Numero del mix (1-20) + level_db: Livello in dB (da -inf a +10.0) + + Returns: + Un dizionario con lo stato dell'operazione + """ + if not 1 <= channel <= TF5_INPUT_CHANNELS: + return {"status": "error", "message": f"Il canale deve essere tra 1 e {TF5_INPUT_CHANNELS}"} + if not 1 <= mix_number <= TF5_MIX_BUSSES: + return {"status": "error", "message": f"Il mix deve essere tra 1 e {TF5_MIX_BUSSES}"} + + if level_db <= -138: + internal_value = -32768 + else: + internal_value = int(level_db * 100) + + command = f"set MIXER:Current/InCh/ToMix/Level {channel-1} {mix_number-1} {internal_value}" + response = self._send_command(command) + + return { + "status": "success" if "OK" in response else "error", + "message": f"Canale {channel} → Mix {mix_number} impostato a {level_db:+.1f} dB", + "response": response + } + + def set_channel_to_mix_on_off(self, channel: int, mix_number: int, state: bool) -> dict: + """Accende o spegne l'invio di un canale verso un mix/aux. + + Args: + channel: Numero del canale (1-40) + mix_number: Numero del mix (1-20) + state: True per accendere, False per spegnere + + Returns: + Un dizionario con lo stato dell'operazione + """ + if not 1 <= channel <= TF5_INPUT_CHANNELS: + return {"status": "error", "message": f"Il canale deve essere tra 1 e {TF5_INPUT_CHANNELS}"} + if not 1 <= mix_number <= TF5_MIX_BUSSES: + return {"status": "error", "message": f"Il mix deve essere tra 1 e {TF5_MIX_BUSSES}"} + + value = 1 if state else 0 + command = f"set MIXER:Current/InCh/ToMix/On {channel-1} {mix_number-1} {value}" + response = self._send_command(command) + + return { + "status": "success" if "OK" in response else "error", + "message": f"Invio canale {channel} → Mix {mix_number} {'acceso' if state else 'spento'}", + "response": response + } + + def get_channel_to_mix_info(self, channel: int, mix_number: int) -> dict: + """Legge le informazioni dell'invio di un canale verso un mix. + + Args: + channel: Numero del canale (1-40) + mix_number: Numero del mix (1-20) + + Returns: + Un dizionario con le informazioni del send + """ + if not 1 <= channel <= TF5_INPUT_CHANNELS: + return {"status": "error", "message": f"Il canale deve essere tra 1 e {TF5_INPUT_CHANNELS}"} + if not 1 <= mix_number <= TF5_MIX_BUSSES: + return {"status": "error", "message": f"Il mix deve essere tra 1 e {TF5_MIX_BUSSES}"} + + ch_idx = channel - 1 + mix_idx = mix_number - 1 + + # Leggi livello + resp_level = self._send_command(f"get MIXER:Current/InCh/ToMix/Level {ch_idx} {mix_idx}") + level_raw = self._parse_value(resp_level) + try: + level_int = int(level_raw) + level_db = level_int / 100.0 if level_int > -32768 else float('-inf') + except: + level_db = None + + # Leggi stato ON/OFF + resp_on = self._send_command(f"get MIXER:Current/InCh/ToMix/On {ch_idx} {mix_idx}") + is_on = self._parse_value(resp_on) == "1" + + return { + "status": "success", + "channel": channel, + "mix": mix_number, + "on": is_on, + "level_db": level_db, + "message": f"Canale {channel} → Mix {mix_number}: {level_db:+.1f} dB ({'ON' if is_on else 'OFF'})" } \ No newline at end of file diff --git a/telegram_bot.py b/telegram_bot.py index d744f78..92a3ddc 100644 --- a/telegram_bot.py +++ b/telegram_bot.py @@ -129,6 +129,9 @@ class TF5TelegramBot: self.controller.get_all_channels_summary, self.controller.get_all_mixes_summary, self.controller.refresh_cache, + self.controller.set_channel_to_mix_level, + self.controller.set_channel_to_mix_on_off, + self.controller.get_channel_to_mix_info, ], temperature=0, ) @@ -185,6 +188,11 @@ IDENTIFICAZIONE CANALI E MIX: - "tutti i mic/tutte le chitarre" → cerca e gestisci multipli - "il monitor" / "l'aux 2" → cerca tra i mix +SEND AI MIX/AUX: +- "alza il gelato nell'aux 2" → usa set_channel_to_mix_level +- "manda più chitarra nel monitor" → aumenta il send +- "togli la voce dal mix 3" → spegni il send o abbassa molto + SCENE: - "carica/richiama/vai alla scena X" → recall_scene - Accetta "A5", "scena A 5", "la cinque del banco A", ecc.