Erster Commit: nativer Linux-Port aus macOS-Bytecode
Läuft die Voice Acoustic VA-Remotecontrol (AllDSP AllControl) nativ unter Linux auf echtem wxGTK 3.0 — ohne Wine und ohne dekompilierten App-Code. Ausgeführt wird das unveränderte Python-2.7-Bytecode aus dem macOS-.app; C-Extensions (wxGTK/numpy/ scipy/PortAudio) kommen nativ aus Debian stretch. Enthält: va/ (Original-.pyc + pure-Python-Libs + Assets + launch.py mit den drei Linux-Fixes), Dockerfile/run.sh/entrypoint.sh, reference/ (dekompilierter Quellcode zum Debuggen) und README/STATUS. img.cache (378 MB, regenerierbar) ist per .gitignore ausgeschlossen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,723 @@
|
||||
# uncompyle6 version 3.9.3
|
||||
# Python bytecode version base 2.6 (62161)
|
||||
# Decompiled from: Python 3.9.25 (main, Oct 31 2025, 23:16:49)
|
||||
# [GCC 14.2.0]
|
||||
# Embedded file name: user_config_keys.pyc
|
||||
# Compiled at: 2025-05-16 12:34:05
|
||||
import wx, os, data_model, traceback, one_unit, ConfigParser, protocol, sys, select_keys, select_units, d_protocol, mytime
|
||||
from user_config_helpers import *
|
||||
keyFunctionNone = 0
|
||||
keyFunctionSystemMenu = 1
|
||||
keyFunctionEscExit = 2
|
||||
keyFunctionToggleMute = 3
|
||||
keyFunctionChannelSelect = 4
|
||||
keyFunctionItemSelect = 5
|
||||
keyFunctionChannelUp = 6
|
||||
keyFunctionChannelDown = 7
|
||||
keyFunctionItemUp = 8
|
||||
keyFunctionItemDown = 9
|
||||
keyFunctionModifyValue = 10
|
||||
keyFunctionNotUsed1 = 11
|
||||
keyFunctionNextPreset = 12
|
||||
keyFunctionEnterConfirm = 13
|
||||
keyFunctionSetValueTo = 14
|
||||
keyFunctionLoadPreset = 15
|
||||
keyFunctionNetworkReset = 16
|
||||
keyFunctionFactoryReset = 17
|
||||
keyFunctionLockKeys = 18
|
||||
keyFunctionCopy = 19
|
||||
keyFunctionPaste = 20
|
||||
keyFunctionLockUnlock = 21
|
||||
keyFunctionToggleOnOff = 22
|
||||
keyFunctionToggleStandby = 23
|
||||
keyFunctionResetPIN = 24
|
||||
keyFunctionMuteSystem = 25
|
||||
keyFunctionToggleBridgeMode = 26
|
||||
keyFunctionEraseUserPresets = 27
|
||||
keyFunctionSafeMode = 28
|
||||
keyFunctionGotoStandby = 29
|
||||
keyFunctionExitStandby = 30
|
||||
keyFunctions = {keyFunctionNone: 'None',
|
||||
keyFunctionSystemMenu: 'System Menu',
|
||||
keyFunctionEscExit: 'Esc / Exit',
|
||||
keyFunctionToggleMute: 'Toggle Mute',
|
||||
keyFunctionChannelSelect: 'Channel Select',
|
||||
keyFunctionItemSelect: 'None',
|
||||
keyFunctionChannelUp: 'Channel Up',
|
||||
keyFunctionChannelDown: 'Channel Down',
|
||||
keyFunctionItemUp: 'Item Up',
|
||||
keyFunctionItemDown: 'Item Down',
|
||||
keyFunctionModifyValue: 'Modify Value By',
|
||||
keyFunctionNotUsed1: 'Invalid',
|
||||
keyFunctionNextPreset: 'Next Preset',
|
||||
keyFunctionEnterConfirm: 'Enter / Confirm',
|
||||
keyFunctionSetValueTo: 'Set Value To',
|
||||
keyFunctionLoadPreset: 'Load Preset',
|
||||
keyFunctionNetworkReset: 'Network Reset',
|
||||
keyFunctionFactoryReset: 'Factory Reset',
|
||||
keyFunctionLockKeys: 'Lock / Unlock Keys',
|
||||
keyFunctionCopy: 'Copy',
|
||||
keyFunctionPaste: 'Paste',
|
||||
keyFunctionLockUnlock: 'Lock / Unlock Unit',
|
||||
keyFunctionToggleOnOff: 'Toggle On / Off',
|
||||
keyFunctionToggleStandby: 'Toggle Standby',
|
||||
keyFunctionResetPIN: 'Reset PIN',
|
||||
keyFunctionMuteSystem: 'Fire Mute',
|
||||
keyFunctionToggleBridgeMode: 'Toggle Bridge Mode',
|
||||
keyFunctionEraseUserPresets: 'Erase User presets',
|
||||
keyFunctionSafeMode: 'Startup in Safe Mode',
|
||||
keyFunctionGotoStandby: 'Go to Standby',
|
||||
keyFunctionExitStandby: 'Exit Standby'}
|
||||
keySelectOptions = {keyFunctionNone: '',
|
||||
keyFunctionSystemMenu: '',
|
||||
keyFunctionEscExit: '',
|
||||
keyFunctionToggleMute: 'c',
|
||||
keyFunctionChannelSelect: 'c',
|
||||
keyFunctionItemSelect: 'sm',
|
||||
keyFunctionChannelUp: '',
|
||||
keyFunctionChannelDown: '',
|
||||
keyFunctionItemUp: '',
|
||||
keyFunctionItemDown: '',
|
||||
keyFunctionModifyValue: 'smciv',
|
||||
keyFunctionNotUsed1: 'smciv',
|
||||
keyFunctionNextPreset: 'v',
|
||||
keyFunctionEnterConfirm: '',
|
||||
keyFunctionSetValueTo: 'scmiv',
|
||||
keyFunctionLoadPreset: 'v',
|
||||
keyFunctionNetworkReset: '',
|
||||
keyFunctionFactoryReset: '',
|
||||
keyFunctionLockKeys: '',
|
||||
keyFunctionCopy: '',
|
||||
keyFunctionPaste: '',
|
||||
keyFunctionLockUnlock: '',
|
||||
keyFunctionToggleOnOff: 'sci',
|
||||
keyFunctionToggleStandby: '',
|
||||
keyFunctionResetPIN: '',
|
||||
keyFunctionMuteSystem: 'v',
|
||||
keyFunctionToggleBridgeMode: 'c',
|
||||
keyFunctionEraseUserPresets: '',
|
||||
keyFunctionSafeMode: '',
|
||||
keyFunctionGotoStandby: '',
|
||||
keyFunctionExitStandby: ''}
|
||||
keyTriggerOptions = {0: 'On Push',
|
||||
1: 'Click',
|
||||
2: 'Hold 3 sec',
|
||||
3: 'Hold 10 sec',
|
||||
4: 'Hold 20 sec',
|
||||
5: 'Hold 30 sec',
|
||||
6: 'Depressed',
|
||||
7: 'Not pressed',
|
||||
8: 'Hold 1 sec',
|
||||
9: 'Hold 2 sec',
|
||||
10: 'On Release',
|
||||
11: 'Hold Until Action',
|
||||
12: 'Release Until Action'}
|
||||
gpiTriggerOptions = {0: 'Falling Edge',
|
||||
1: 'Pulse 0.5 sec',
|
||||
2: 'Pulse 5 sec',
|
||||
3: 'Pulse 15 sec',
|
||||
4: 'Pulse 25 sec',
|
||||
5: 'Pulse 35 sec',
|
||||
6: 'Active',
|
||||
7: 'Not Active',
|
||||
8: 'Pulse 1.5 sec',
|
||||
9: 'Pulse 2.5 sec',
|
||||
10: 'Rising Edge',
|
||||
11: 'Active Until Action',
|
||||
12: 'Not Active Until Action'}
|
||||
keyTriggerChoices = [
|
||||
71,
|
||||
81,
|
||||
72,
|
||||
79,
|
||||
80,
|
||||
73,
|
||||
74,
|
||||
75,
|
||||
76,
|
||||
77,
|
||||
82,
|
||||
78,
|
||||
83]
|
||||
gpiTriggerChoices = [
|
||||
94,
|
||||
84,
|
||||
90,
|
||||
95,
|
||||
91,
|
||||
96,
|
||||
85,
|
||||
92,
|
||||
93,
|
||||
86,
|
||||
87,
|
||||
88,
|
||||
89]
|
||||
defaultRotaryFunctions = {16: 'Channel Gain',
|
||||
48: 'Channel Delay',
|
||||
32: 'PEQ 1 Gain',
|
||||
33: 'PEQ 2 Gain',
|
||||
34: 'PEQ 3 Gain',
|
||||
35: 'PEQ 4 Gain',
|
||||
36: 'PEQ 5 Gain',
|
||||
37: 'PEQ 6 Gain',
|
||||
38: 'PEQ 7 Gain',
|
||||
39: 'PEQ 8 Gain',
|
||||
40: 'PEQ 9 Gain',
|
||||
41: 'PEQ 10 Gain',
|
||||
255: 'Disabled'}
|
||||
|
||||
class frontPanelKeys(wx.Panel):
|
||||
|
||||
def __init__(self, parent, frame, uiNumber, panelName):
|
||||
self.frame = frame
|
||||
self.name = panelName
|
||||
self.uiNumber = uiNumber
|
||||
self.panelName = panelName
|
||||
self.parent = parent
|
||||
if uiNumber >= 96:
|
||||
self.keyTriggerOptions = gpiTriggerOptions
|
||||
self.keyTriggerChoices = gpiTriggerChoices
|
||||
else:
|
||||
self.keyTriggerOptions = keyTriggerOptions
|
||||
self.keyTriggerChoices = keyTriggerChoices
|
||||
wx.Panel.__init__(self, parent, size=(964, 500))
|
||||
self.lines = {}
|
||||
self.initFinished = False
|
||||
self.frame = frame
|
||||
self.Show(True)
|
||||
return
|
||||
|
||||
def initMe(self, force=False):
|
||||
if self.IsShown() == False and force == False:
|
||||
return
|
||||
else:
|
||||
if self.initFinished == True:
|
||||
return 0
|
||||
print mytime.displayTime(), 'uck.initMe FrontPanelKeys', self.name
|
||||
i = 0
|
||||
frame = self.frame
|
||||
uiNumber = self.uiNumber
|
||||
self.struct_id_choices = ['Selected']
|
||||
for strID in (0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 17):
|
||||
self.struct_id_choices.append(protocol.get_strid_text(strID))
|
||||
|
||||
self.member_id_choices = [
|
||||
'Selected']
|
||||
for membID in (0, 1, 2, 3, 4, 5, 6, 7, 8, 14, 15, 24, 27):
|
||||
self.member_id_choices.append(protocol.get_member_text(membID))
|
||||
|
||||
self.channels = {127: 'All Inputs', 255: 'All Outputs'}
|
||||
for c in self.frame.frame.parent.unit_channels:
|
||||
if c < 128:
|
||||
s = 'Input ' + str(c + 1)
|
||||
else:
|
||||
s = 'Output ' + str(c - 127)
|
||||
self.channels[c] = s
|
||||
|
||||
self.uiKeys = getKeys(frame, uiNumber)
|
||||
print 'uck.Keys for ui number', uiNumber, ':', self.uiKeys
|
||||
self.offset = 40
|
||||
labelOffset = 20
|
||||
self.factoryItems = 0
|
||||
self.rotaryKeys = None
|
||||
pos = self.panelName.lower().find('rotary')
|
||||
if pos >= 0:
|
||||
rotaryNumber = 0
|
||||
try:
|
||||
rotaryNumber = int(self.panelName[-1]) - 1
|
||||
if rotaryNumber < 0:
|
||||
rotaryNumber = 0
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
print mytime.displayTime(), 'uck.found rotary number', rotaryNumber
|
||||
self.rotaryKeys = getKeys(frame, 88 + rotaryNumber)
|
||||
if rotaryNumber == 3:
|
||||
self.frame.frame.clear(self.frame, 92)
|
||||
self.frame.frame.clear(self.frame, 93)
|
||||
self.frame.frame.clear(self.frame, 94)
|
||||
self.frame.frame.clear(self.frame, 95)
|
||||
self.createRotaryLine(0)
|
||||
self.lines[0].uiNumber = 88 + rotaryNumber
|
||||
i = 1
|
||||
self.offset = 40
|
||||
labelOffset = 48
|
||||
if len(self.rotaryKeys) > 0:
|
||||
for uiIndex in self.rotaryKeys:
|
||||
(key, val) = self.rotaryKeys[uiIndex]
|
||||
print mytime.displayTime(), 'uck.found rotary key for rotary number', rotaryNumber, ':', key, val
|
||||
if key.channel == 1 and key.index >= 128:
|
||||
continue
|
||||
else:
|
||||
self.lines[0].key = key
|
||||
self.lines[0].uiNumber = val[0]
|
||||
self.lines[0].bit1Choice.SetStringSelection(str(val[5]))
|
||||
self.lines[0].bit2Choice.SetStringSelection(str(val[6]))
|
||||
try:
|
||||
self.lines[0].functionChoice.SetStringSelection(str(defaultRotaryFunctions[val[7]]))
|
||||
except:
|
||||
self.lines[0].functionChoice.SetStringSelection('Disabled')
|
||||
|
||||
try:
|
||||
channelString = self.channels[val[3]]
|
||||
except:
|
||||
channelString = 'Input 1'
|
||||
|
||||
self.lines[0].channelChoice.SetStringSelection(channelString)
|
||||
self.lines[0].bit1Choice.Enable(True)
|
||||
self.lines[0].bit2Choice.Enable(True)
|
||||
self.lines[0].functionChoice.Enable(True)
|
||||
self.lines[0].channelChoice.Enable(True)
|
||||
self.lines[0].checkBox.SetValue(True)
|
||||
|
||||
self.strTrigger = wx.StaticText(self, -1, 'Trigger', pos=(80, labelOffset))
|
||||
self.strFunction = wx.StaticText(self, -1, 'Function', pos=(230, labelOffset))
|
||||
self.strItem = wx.StaticText(self, -1, 'Process', pos=(370, labelOffset))
|
||||
self.strSubItem = wx.StaticText(self, -1, 'Parameter', pos=(480, labelOffset))
|
||||
self.strChannel = wx.StaticText(self, -1, 'Channel', pos=(590, labelOffset))
|
||||
self.strIndex = wx.StaticText(self, -1, 'Index', pos=(700, labelOffset))
|
||||
self.strValue = wx.StaticText(self, -1, 'Value', pos=(750, labelOffset))
|
||||
for uiIndex in self.uiKeys:
|
||||
(key, val) = self.uiKeys[uiIndex]
|
||||
if key.channel != 1 or key.index < 128:
|
||||
continue
|
||||
self.createLine(i, self.offset)
|
||||
self.lines[i].key = key
|
||||
self.lines[i].checkBox.Enable(False)
|
||||
self.lines[i].checkBox.SetLabel('Factory')
|
||||
self.lines[i].struct_id_choice.Enable(False)
|
||||
self.lines[i].member_id_choice.Enable(False)
|
||||
self.lines[i].channel_choice.Enable(False)
|
||||
self.lines[i].index_choice.Enable(False)
|
||||
self.lines[i].keyTriggerChoice.Enable(False)
|
||||
self.lines[i].checkBox.SetValue(True)
|
||||
self.lines[i].struct_id_choice.SetStringSelection(protocol.get_strid_text(val[1]))
|
||||
self.lines[i].member_id_choice.SetStringSelection(protocol.get_member_text(val[2]))
|
||||
channel = val[3]
|
||||
if channel == 255:
|
||||
channel = 'All Outputs'
|
||||
elif channel == 127:
|
||||
channel = 'All Inputs'
|
||||
elif channel < 128:
|
||||
channel = 'Input ' + str(channel + 1)
|
||||
else:
|
||||
channel = 'Output ' + str(channel - 128 + 1)
|
||||
self.lines[i].channel_choice.SetStringSelection(channel)
|
||||
self.lines[i].index_choice.SetStringSelection(str(val[4] + 1))
|
||||
keyFunction = val[5]
|
||||
self.lines[i].keyFunctionChoice.SetStringSelection(keyFunctions[keyFunction])
|
||||
self.lines[i].keyTriggerChoice.SetStringSelection(self.keyTriggerOptions[val[6]])
|
||||
self.enable(i)
|
||||
self.lines[i].keyFunctionChoice.Enable(False)
|
||||
if keyFunction in (keyFunctionNextPreset, keyFunctionLoadPreset, keyFunctionMuteSystem):
|
||||
self.lines[i].value.SetValue(str(val[2]))
|
||||
elif keyFunction in (keyFunctionModifyValue, keyFunctionSetValueTo):
|
||||
self.lines[i].value.SetValue(str(val[7] - 128))
|
||||
i += 1
|
||||
self.factoryItems += 1
|
||||
|
||||
for uiIndex in self.uiKeys:
|
||||
(key, val) = self.uiKeys[uiIndex]
|
||||
if key.channel == 1 and key.index >= 128:
|
||||
continue
|
||||
self.createLine(i, self.offset)
|
||||
self.lines[i].key = key
|
||||
self.lines[i].checkBox.SetValue(True)
|
||||
keyFunction = val[5]
|
||||
self.lines[i].keyFunctionChoice.SetStringSelection(keyFunctions[keyFunction])
|
||||
self.lines[i].keyTriggerChoice.SetStringSelection(self.keyTriggerOptions[val[6]])
|
||||
if keyFunction in (keyFunctionNextPreset, keyFunctionLoadPreset, keyFunctionMuteSystem):
|
||||
self.lines[i].value.SetValue(str(val[2]))
|
||||
elif keyFunction in (keyFunctionModifyValue, keyFunctionSetValueTo):
|
||||
self.lines[i].value.SetValue(str((val[7] - 128) / 4.0))
|
||||
self.enable(i)
|
||||
self.lines[i].struct_id_choice.SetStringSelection(protocol.get_strid_text(val[1]))
|
||||
self.lines[i].member_id_choice.SetStringSelection(protocol.get_member_text(val[2]))
|
||||
channel = val[3]
|
||||
if channel == 255:
|
||||
channel = 'All Outputs'
|
||||
elif channel == 127:
|
||||
channel = 'All Inputs'
|
||||
elif channel < 128:
|
||||
channel = 'Input ' + str(channel + 1)
|
||||
else:
|
||||
channel = 'Output ' + str(channel - 128 + 1)
|
||||
self.lines[i].channel_choice.SetStringSelection(channel)
|
||||
self.lines[i].index_choice.SetStringSelection(str(val[4] + 1))
|
||||
i += 1
|
||||
|
||||
if i - self.factoryItems < 8:
|
||||
self.createLine(i, self.offset)
|
||||
self.initFinished = True
|
||||
return
|
||||
|
||||
def createRotaryLine(self, i):
|
||||
p = wx.Panel(self, size=(964, 28))
|
||||
p.type = 'rotary'
|
||||
p.Show(False)
|
||||
p.checkBox = wx.CheckBox(p, 10 + i, 'Enable Rotary', pos=(10, 2))
|
||||
p.label2 = wx.StaticText(p, -1, 'bit 1', pos=(120, 3))
|
||||
p.bit1Choice = wx.Choice(p, 20 + i, choices=[_[1] for nr in range(32)], style=wx.BORDER_NONE, pos=(160,
|
||||
0), size=(60,
|
||||
26))
|
||||
p.label3 = wx.StaticText(p, -1, 'bit 2', pos=(240, 3))
|
||||
p.bit2Choice = wx.Choice(p, 30 + i, choices=[_[2] for nr in range(32)], style=wx.BORDER_NONE, pos=(280,
|
||||
0), size=(60,
|
||||
26))
|
||||
p.label4 = wx.StaticText(p, -1, 'Default Function', pos=(360, 3))
|
||||
p.functionChoice = wx.Choice(p, 40 + i, choices=defaultRotaryFunctions.values(), style=wx.BORDER_NONE, pos=(480,
|
||||
0), size=(150,
|
||||
26))
|
||||
p.functionChoice.SetStringSelection('Disabled')
|
||||
p.label4 = wx.StaticText(p, -1, 'Channel', pos=(670, 3))
|
||||
channels = self.channels.values()
|
||||
channels.remove('All Inputs')
|
||||
channels.remove('All Outputs')
|
||||
p.channelChoice = wx.Choice(p, 60 + i, choices=sorted(channels), style=wx.BORDER_NONE, pos=(730,
|
||||
0), size=(100,
|
||||
26))
|
||||
p.channelChoice.SetStringSelection(channels[0])
|
||||
p.bit1Choice.Enable(False)
|
||||
p.bit2Choice.Enable(False)
|
||||
p.functionChoice.Enable(False)
|
||||
p.channelChoice.Enable(False)
|
||||
p.SetPosition((0, 12))
|
||||
p.checkBox.SetValue(0)
|
||||
p.checkBox.Enable(True)
|
||||
p.checkBox.Show(True)
|
||||
p.key = None
|
||||
self.Bind(wx.EVT_CHECKBOX, self.OnEnabledRotary, id=10 + i)
|
||||
self.lines[i] = p
|
||||
p.Show(True)
|
||||
return
|
||||
|
||||
def OnEnabledRotary(self, e):
|
||||
i = e.GetId() - 10
|
||||
if i != 0:
|
||||
return
|
||||
val = self.lines[i].checkBox.GetValue()
|
||||
self.lines[i].bit1Choice.Enable(val)
|
||||
self.lines[i].bit2Choice.Enable(val)
|
||||
self.lines[i].functionChoice.Enable(val)
|
||||
self.lines[i].channelChoice.Enable(val)
|
||||
return
|
||||
|
||||
def createLine(self, i, offset):
|
||||
p = wx.Panel(self, size=(964, 28))
|
||||
p.type = 'key'
|
||||
p.Show(False)
|
||||
p.checkBox = wx.CheckBox(p, 10 + i, ' User', pos=(10, 2), size=(70, 20))
|
||||
p.keyTriggerChoice = wx.Choice(p, 80 + i, choices=self.keyTriggerChoices, style=wx.BORDER_NONE, pos=(80,
|
||||
0), size=(140,
|
||||
26))
|
||||
p.keyTriggerChoice.SetStringSelection(sorted(self.keyTriggerOptions.values())[0])
|
||||
p.keyFunctionChoice = wx.Choice(p, 30 + i, choices=sorted(keyFunctions.values()), style=wx.BORDER_NONE, pos=(230,
|
||||
0), size=(130,
|
||||
26))
|
||||
p.keyFunctionChoice.SetStringSelection(keyFunctions.values()[0])
|
||||
p.struct_id_choice = wx.Choice(p, 40 + i, choices=self.struct_id_choices, style=wx.BORDER_NONE, pos=(370,
|
||||
0), size=(100,
|
||||
26))
|
||||
p.struct_id_choice.SetStringSelection(self.struct_id_choices[0])
|
||||
p.member_id_choice = wx.Choice(p, 50 + i, choices=self.member_id_choices, style=wx.BORDER_NONE, pos=(480,
|
||||
0), size=(100,
|
||||
26))
|
||||
p.member_id_choice.SetStringSelection(self.member_id_choices[0])
|
||||
p.channel_choice = wx.Choice(p, 60 + i, choices=sorted(self.channels.values()), style=wx.BORDER_NONE, pos=(590,
|
||||
0), size=(100,
|
||||
26))
|
||||
p.channel_choice.SetStringSelection(self.channels.values()[0])
|
||||
p.index_choice = wx.Choice(p, 70 + i, choices=[_[1] for j in range(10)], style=wx.BORDER_NONE, pos=(700,
|
||||
0), size=(45,
|
||||
26))
|
||||
p.index_choice.SetStringSelection('1')
|
||||
p.value = wx.TextCtrl(p, 20 + i, '', pos=(750, 1), size=(100, 20))
|
||||
p.value.Show(False)
|
||||
p.strParameter = wx.StaticText(p, -1, '', pos=(590, 3), size=(120, 20))
|
||||
p.strParameter.Show(False)
|
||||
p.SetPosition((0, offset + 28 * i))
|
||||
p.checkBox.SetValue(0)
|
||||
p.checkBox.Enable(True)
|
||||
p.key = None
|
||||
self.Bind(wx.EVT_CHECKBOX, self.OnEnabled, id=10 + i)
|
||||
self.Bind(wx.EVT_CHOICE, self.OnStructId, id=40 + i)
|
||||
self.Bind(wx.EVT_CHOICE, self.OnChangeKeyFunction, id=30 + i)
|
||||
self.lines[i] = p
|
||||
self.enable(i)
|
||||
p.Show(True)
|
||||
return
|
||||
|
||||
def enable(self, i):
|
||||
val = self.lines[i].checkBox.GetValue()
|
||||
self.showChoices(i, self.getKeyFunction(self.lines[i]), val)
|
||||
return
|
||||
|
||||
def showChoices(self, i, keyFunctionInt, enabled):
|
||||
self.lines[i].keyFunctionChoice.Enable(enabled)
|
||||
try:
|
||||
keyFunctionFields = keySelectOptions[keyFunctionInt]
|
||||
except:
|
||||
keyFunctionFields = None
|
||||
|
||||
self.lines[i].struct_id_choice.Show(False)
|
||||
self.lines[i].member_id_choice.Show(False)
|
||||
self.lines[i].channel_choice.Show(False)
|
||||
self.lines[i].index_choice.Show(False)
|
||||
self.lines[i].value.Show(False)
|
||||
self.lines[i].strParameter.Show(False)
|
||||
if keyFunctionFields.find('s') >= 0:
|
||||
self.lines[i].struct_id_choice.Show(True)
|
||||
if self.lines[i].struct_id_choice.GetStringSelection() not in ('Selected',
|
||||
'All'):
|
||||
if keyFunctionFields.find('m') >= 0:
|
||||
self.lines[i].member_id_choice.Show(True)
|
||||
if keyFunctionFields.find('c') >= 0:
|
||||
self.lines[i].channel_choice.Show(True)
|
||||
if keyFunctionFields.find('i') >= 0:
|
||||
self.lines[i].index_choice.Show(True)
|
||||
elif keyFunctionFields.find('m') >= 0:
|
||||
self.lines[i].member_id_choice.Show(True)
|
||||
if keyFunctionFields.find('c') >= 0:
|
||||
self.lines[i].channel_choice.Show(True)
|
||||
if keyFunctionFields.find('i') >= 0:
|
||||
self.lines[i].index_choice.Show(True)
|
||||
if keyFunctionFields.find('v') >= 0:
|
||||
self.lines[i].value.Show(True)
|
||||
if keyFunctionInt == keyFunctionNextPreset:
|
||||
self.lines[i].strParameter.SetLabel('Looping Range:')
|
||||
self.lines[i].strParameter.Show(True)
|
||||
elif keyFunctionInt == keyFunctionLoadPreset:
|
||||
self.lines[i].strParameter.SetLabel('Preset To Load:')
|
||||
self.lines[i].strParameter.Show(True)
|
||||
if keyFunctionFields == 'sm':
|
||||
self.lines[i].struct_id_choice.Show(True)
|
||||
self.lines[i].member_id_choice.Show(True)
|
||||
self.struct_id_choices = []
|
||||
if keyFunctionInt == keyFunctionToggleOnOff:
|
||||
for strID in (3, 4, 5):
|
||||
self.struct_id_choices.append(protocol.get_strid_text(strID))
|
||||
|
||||
elif keyFunctionInt == keyFunctionModifyValue:
|
||||
for strID in (0, 5, 12):
|
||||
self.struct_id_choices.append(protocol.get_strid_text(strID))
|
||||
|
||||
elif keyFunctionInt == keyFunctionSetValueTo:
|
||||
for strID in (0, 5, 7, 17):
|
||||
self.struct_id_choices.append(protocol.get_strid_text(strID))
|
||||
|
||||
else:
|
||||
for strID in (0, 1, 2, 3, 4, 5, 6, 7, 8, 12):
|
||||
self.struct_id_choices.append(protocol.get_strid_text(strID))
|
||||
|
||||
currentSelection = self.lines[i].struct_id_choice.GetStringSelection()
|
||||
self.lines[i].struct_id_choice.Clear()
|
||||
self.lines[i].struct_id_choice.AppendItems(self.struct_id_choices)
|
||||
if currentSelection in self.struct_id_choices:
|
||||
self.lines[i].struct_id_choice.SetStringSelection(currentSelection)
|
||||
else:
|
||||
self.lines[i].struct_id_choice.SetStringSelection(self.struct_id_choices[0])
|
||||
self.member_id_choices = []
|
||||
if keyFunctionInt in (keyFunctionSetValueTo, keyFunctionModifyValue):
|
||||
for membID in (0, protocol.MEMBER_ID_THRESHOLD, 7, 65):
|
||||
self.member_id_choices.append(protocol.get_member_text(membID))
|
||||
|
||||
else:
|
||||
for membID in (0, 1, 2, 3, 4, 5, 6, 7, 8, 14, 15, 24, 27):
|
||||
self.member_id_choices.append(protocol.get_member_text(membID))
|
||||
|
||||
currentSelection = self.lines[i].member_id_choice.GetStringSelection()
|
||||
self.lines[i].member_id_choice.Clear()
|
||||
self.lines[i].member_id_choice.AppendItems(self.member_id_choices)
|
||||
if currentSelection in self.member_id_choices:
|
||||
self.lines[i].member_id_choice.SetStringSelection(currentSelection)
|
||||
else:
|
||||
self.lines[i].member_id_choice.SetStringSelection(self.member_id_choices[0])
|
||||
return
|
||||
|
||||
def OnEnabled(self, e):
|
||||
i = e.GetId() - 10
|
||||
self.enable(i)
|
||||
if i == len(self.lines) - 1 and self.lines[i].checkBox.GetValue() == True and i < 7 + self.factoryItems:
|
||||
self.createLine(i + 1, self.offset)
|
||||
return
|
||||
|
||||
def OnChangeKeyFunction(self, e):
|
||||
i = e.GetId() - 30
|
||||
self.showChoices(i, self.getKeyFunction(self.lines[i]), 1)
|
||||
print mytime.displayTime() + ' on change key function', self.lines[i].keyFunctionChoice.GetStringSelection()
|
||||
return
|
||||
|
||||
def OnStructId(self, e):
|
||||
print mytime.displayTime() + ' OnStructid'
|
||||
i = e.GetId() - 40
|
||||
self.showChoices(i, self.getKeyFunction(self.lines[i]), True)
|
||||
return
|
||||
|
||||
def getKeyFunction(self, line):
|
||||
fName = line.keyFunctionChoice.GetStringSelection()
|
||||
for k in keyFunctions.keys():
|
||||
if keyFunctions[k] == fName:
|
||||
return k
|
||||
|
||||
return
|
||||
|
||||
def getKeyTrigger(self, line):
|
||||
fName = line.keyTriggerChoice.GetStringSelection()
|
||||
for k in self.keyTriggerOptions.keys():
|
||||
if self.keyTriggerOptions[k] == fName:
|
||||
return k
|
||||
|
||||
return
|
||||
|
||||
def evaluateLine(self, line):
|
||||
if line.checkBox.GetValue() == False:
|
||||
return
|
||||
else:
|
||||
if line.type == 'rotary':
|
||||
try:
|
||||
bit1 = int(line.bit1Choice.GetStringSelection())
|
||||
bit2 = int(line.bit2Choice.GetStringSelection())
|
||||
functionChoice = line.functionChoice.GetStringSelection()
|
||||
functionChoiceInt = 255
|
||||
for c in defaultRotaryFunctions:
|
||||
v = defaultRotaryFunctions[c]
|
||||
if v == functionChoice:
|
||||
functionChoiceInt = c
|
||||
break
|
||||
|
||||
channelChoice = line.channelChoice.GetStringSelection()
|
||||
if channelChoice.find('Input ') >= 0:
|
||||
channel = int(channelChoice.replace('Input ', '')) - 1
|
||||
elif channelChoice.find('Output ') >= 0:
|
||||
channel = int(channelChoice.replace('Output ', '')) - 1 + 128
|
||||
sendString = '' + chr(line.uiNumber)
|
||||
sendString += chr(0)
|
||||
sendString += chr(0)
|
||||
sendString += chr(channel)
|
||||
sendString += chr(0)
|
||||
sendString += chr(bit1)
|
||||
sendString += chr(bit2)
|
||||
sendString += chr(functionChoiceInt)
|
||||
mys = 'String: '
|
||||
for c in sendString:
|
||||
mys += hex(ord(c)) + ':'
|
||||
|
||||
print mys
|
||||
return sendString
|
||||
except:
|
||||
print mytime.displayTime(), 'uck.fpk.eL.failed to build string'
|
||||
traceback.print_exc(file=sys.stdout)
|
||||
return
|
||||
|
||||
return
|
||||
try:
|
||||
if line.key.channel == 1 and line.key.index >= 128:
|
||||
return
|
||||
except:
|
||||
pass
|
||||
|
||||
value = 0
|
||||
keyFunction = self.getKeyFunction(line)
|
||||
if keyFunction in (keyFunctionModifyValue, keyFunctionSetValueTo):
|
||||
strID = protocol.get_strid_by_text(line.struct_id_choice.GetStringSelection())
|
||||
membID = protocol.get_membid_by_text(line.member_id_choice.GetStringSelection())
|
||||
channel = line.channel_choice.GetStringSelection()
|
||||
if channel == 'All Inputs':
|
||||
channel = 127
|
||||
elif channel == 'All Outputs':
|
||||
channel = 255
|
||||
elif channel.find('Input ') >= 0:
|
||||
channel = int(channel.replace('Input ', '')) - 1
|
||||
elif channel.find('Output ') >= 0:
|
||||
channel = int(channel.replace('Output ', '')) - 1 + 128
|
||||
index = int(line.index_choice.GetStringSelection()) - 1
|
||||
try:
|
||||
value = int(float(line.value.GetValue()) * 4.0)
|
||||
except:
|
||||
value = 0
|
||||
else:
|
||||
if value > 127:
|
||||
value = 127
|
||||
if value < -127:
|
||||
value = -127
|
||||
line.value.SetValue(str(value / 4.0))
|
||||
value += 128
|
||||
elif keyFunction in (keyFunctionToggleMute, keyFunctionChannelSelect, keyFunctionToggleBridgeMode):
|
||||
strID = 0
|
||||
membID = 0
|
||||
channel = line.channel_choice.GetStringSelection()
|
||||
if channel == 'All Inputs':
|
||||
channel = 127
|
||||
elif channel == 'All Outputs':
|
||||
channel = 255
|
||||
elif channel.find('Input ') >= 0:
|
||||
channel = int(channel.replace('Input ', '')) - 1
|
||||
elif channel.find('Output ') >= 0:
|
||||
channel = int(channel.replace('Output ', '')) - 1 + 128
|
||||
index = 0
|
||||
elif keyFunction in (keyFunctionNextPreset, keyFunctionLoadPreset, keyFunctionMuteSystem):
|
||||
strID = 0
|
||||
channel = 0
|
||||
index = 0
|
||||
membID = line.value.GetValue()
|
||||
try:
|
||||
membID = int(membID)
|
||||
if keyFunction == keyFunctionMuteSystem:
|
||||
if membID < 0:
|
||||
membID = 0
|
||||
if membID > 1:
|
||||
membID = 1
|
||||
elif membID < 1:
|
||||
membID = 1
|
||||
if membID > self.frame.frame.parent.number_of_presets:
|
||||
print mytime.displayTime(), 'Limiting preset selection to max preset range of', self.frame.frame.parent.number_of_presets
|
||||
membID = self.frame.frame.parent.number_of_presets
|
||||
except:
|
||||
traceback.print_exc(file=sys.stdout)
|
||||
membID = 1
|
||||
|
||||
elif keyFunction == keyFunctionToggleOnOff:
|
||||
strID = protocol.get_strid_by_text(line.struct_id_choice.GetStringSelection())
|
||||
membID = protocol.MEMBER_ID_ON
|
||||
channel = line.channel_choice.GetStringSelection()
|
||||
if channel == 'All Inputs':
|
||||
channel = 127
|
||||
elif channel == 'All Outputs':
|
||||
channel = 255
|
||||
elif channel.find('Input ') >= 0:
|
||||
channel = int(channel.replace('Input ', '')) - 1
|
||||
elif channel.find('Output ') >= 0:
|
||||
channel = int(channel.replace('Output ', '')) - 1 + 128
|
||||
index = int(line.index_choice.GetStringSelection()) - 1
|
||||
elif keyFunction == keyFunctionLockKeys:
|
||||
strID = 0
|
||||
membID = 0
|
||||
channel = 0
|
||||
index = 0
|
||||
else:
|
||||
strID = 0
|
||||
membID = 0
|
||||
channel = 0
|
||||
index = 0
|
||||
keyTrigger = self.getKeyTrigger(line)
|
||||
try:
|
||||
sendString = '' + chr(self.uiNumber)
|
||||
sendString += chr(strID)
|
||||
sendString += chr(membID)
|
||||
sendString += chr(channel)
|
||||
sendString += chr(index)
|
||||
sendString += chr(keyFunction)
|
||||
sendString += chr(keyTrigger)
|
||||
sendString += chr(value)
|
||||
return sendString
|
||||
except:
|
||||
print mytime.displayTime(), 'uck.fpk.eL.failed to build string'
|
||||
traceback.print_exc(file=sys.stdout)
|
||||
return
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
# okay decompiling pycode/user_config_keys.pyc
|
||||
Reference in New Issue
Block a user