xair-api 2.3.2__py3-none-any.whl → 2.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- xair_api/__init__.py +1 -1
- xair_api/adapter.py +13 -6
- xair_api/bus.py +6 -6
- xair_api/config.py +44 -44
- xair_api/dca.py +9 -9
- xair_api/errors.py +1 -1
- xair_api/fx.py +9 -9
- xair_api/headamp.py +49 -0
- xair_api/kinds.py +14 -15
- xair_api/lr.py +6 -6
- xair_api/meta.py +2 -2
- xair_api/rtn.py +12 -12
- xair_api/shared.py +168 -168
- xair_api/strip.py +7 -7
- xair_api/util.py +1 -1
- xair_api/xair.py +27 -24
- {xair_api-2.3.2.dist-info → xair_api-2.4.1.dist-info}/METADATA +28 -18
- xair_api-2.4.1.dist-info/RECORD +20 -0
- {xair_api-2.3.2.dist-info → xair_api-2.4.1.dist-info}/WHEEL +1 -1
- xair_api-2.3.2.dist-info/RECORD +0 -20
- xair_api-2.3.2.dist-info/entry_points.txt +0 -7
- {xair_api-2.3.2.dist-info → xair_api-2.4.1.dist-info}/LICENSE +0 -0
xair_api/__init__.py
CHANGED
xair_api/adapter.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from .bus import Bus as IBus
|
|
2
|
+
from .headamp import HeadAmp as IHeadAmp
|
|
2
3
|
from .lr import LR as ILR
|
|
3
4
|
from .rtn import AuxRtn as IAuxRtn
|
|
4
5
|
from .rtn import FxRtn as IFxRtn
|
|
@@ -7,34 +8,40 @@ from .rtn import FxRtn as IFxRtn
|
|
|
7
8
|
class Bus(IBus):
|
|
8
9
|
@property
|
|
9
10
|
def address(self):
|
|
10
|
-
return f
|
|
11
|
+
return f'/bus/{str(self.index).zfill(2)}'
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
class AuxRtn(IAuxRtn):
|
|
14
15
|
@property
|
|
15
16
|
def address(self):
|
|
16
|
-
return f
|
|
17
|
+
return f'/auxin/{str(self.index).zfill(2)}'
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
class FxRtn(IFxRtn):
|
|
20
21
|
@property
|
|
21
22
|
def address(self):
|
|
22
|
-
return f
|
|
23
|
+
return f'/fxrtn/{str(self.index).zfill(2)}'
|
|
23
24
|
|
|
24
25
|
|
|
25
26
|
class MainStereo(ILR):
|
|
26
27
|
@property
|
|
27
28
|
def address(self) -> str:
|
|
28
|
-
return
|
|
29
|
+
return '/main/st'
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
class MainMono(ILR):
|
|
32
33
|
@property
|
|
33
34
|
def address(self) -> str:
|
|
34
|
-
return
|
|
35
|
+
return '/main/m'
|
|
35
36
|
|
|
36
37
|
|
|
37
38
|
class Matrix(ILR):
|
|
38
39
|
@property
|
|
39
40
|
def address(self) -> str:
|
|
40
|
-
return f
|
|
41
|
+
return f'/mtx/{str(self.index).zfill(2)}'
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class HeadAmp(IHeadAmp):
|
|
45
|
+
@property
|
|
46
|
+
def address(self):
|
|
47
|
+
return f'/headamp/{str(self.index).zfill(3)}'
|
xair_api/bus.py
CHANGED
|
@@ -16,10 +16,10 @@ class IBus(abc.ABC):
|
|
|
16
16
|
self.logger = logger.getChild(self.__class__.__name__)
|
|
17
17
|
|
|
18
18
|
def getter(self, param: str):
|
|
19
|
-
return self._remote.query(f
|
|
19
|
+
return self._remote.query(f'{self.address}/{param}')
|
|
20
20
|
|
|
21
21
|
def setter(self, param: str, val: int):
|
|
22
|
-
self._remote.send(f
|
|
22
|
+
self._remote.send(f'{self.address}/{param}', val)
|
|
23
23
|
|
|
24
24
|
@abc.abstractmethod
|
|
25
25
|
def address(self):
|
|
@@ -39,12 +39,12 @@ class Bus(IBus):
|
|
|
39
39
|
Returns a Bus class of a kind.
|
|
40
40
|
"""
|
|
41
41
|
BUS_cls = type(
|
|
42
|
-
f
|
|
42
|
+
f'Bus{remote.kind}',
|
|
43
43
|
(cls,),
|
|
44
44
|
{
|
|
45
45
|
**{
|
|
46
46
|
_cls.__name__.lower(): type(
|
|
47
|
-
f
|
|
47
|
+
f'{_cls.__name__}{remote.kind}', (_cls, cls), {}
|
|
48
48
|
)(remote, index)
|
|
49
49
|
for _cls in (
|
|
50
50
|
Config,
|
|
@@ -56,11 +56,11 @@ class Bus(IBus):
|
|
|
56
56
|
Group,
|
|
57
57
|
)
|
|
58
58
|
},
|
|
59
|
-
|
|
59
|
+
'mute': mute_prop(),
|
|
60
60
|
},
|
|
61
61
|
)
|
|
62
62
|
return BUS_cls(remote, index)
|
|
63
63
|
|
|
64
64
|
@property
|
|
65
65
|
def address(self) -> str:
|
|
66
|
-
return f
|
|
66
|
+
return f'/bus/{self.index}'
|
xair_api/config.py
CHANGED
|
@@ -15,10 +15,10 @@ class IConfig(abc.ABC):
|
|
|
15
15
|
self.logger = logger.getChild(self.__class__.__name__)
|
|
16
16
|
|
|
17
17
|
def getter(self, param: str):
|
|
18
|
-
return self._remote.query(f
|
|
18
|
+
return self._remote.query(f'{self.address}/{param}')
|
|
19
19
|
|
|
20
20
|
def setter(self, param: str, val: int):
|
|
21
|
-
self._remote.send(f
|
|
21
|
+
self._remote.send(f'{self.address}/{param}', val)
|
|
22
22
|
|
|
23
23
|
@abc.abstractmethod
|
|
24
24
|
def address(self):
|
|
@@ -36,37 +36,37 @@ class Config(IConfig):
|
|
|
36
36
|
Returns a Config class of a kind.
|
|
37
37
|
"""
|
|
38
38
|
LINKS_cls = _make_links_mixins[remote.kind.id_]
|
|
39
|
-
MUTEGROUP_cls = type(
|
|
40
|
-
MONITOR_cls = type(
|
|
39
|
+
MUTEGROUP_cls = type('MuteGroup', (Config.MuteGroup, cls), {})
|
|
40
|
+
MONITOR_cls = type('ConfigMonitor', (Config.Monitor, cls), {})
|
|
41
41
|
CONFIG_cls = type(
|
|
42
|
-
f
|
|
42
|
+
f'Config{remote.kind}',
|
|
43
43
|
(cls, LINKS_cls),
|
|
44
44
|
{
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
'mute_group': tuple(MUTEGROUP_cls(remote, i) for i in range(4)),
|
|
46
|
+
'monitor': MONITOR_cls(remote),
|
|
47
47
|
},
|
|
48
48
|
)
|
|
49
49
|
return CONFIG_cls(remote)
|
|
50
50
|
|
|
51
51
|
@property
|
|
52
52
|
def address(self) -> str:
|
|
53
|
-
return
|
|
53
|
+
return '/config'
|
|
54
54
|
|
|
55
55
|
@property
|
|
56
56
|
def amixenable(self) -> bool:
|
|
57
|
-
return self.getter(
|
|
57
|
+
return self.getter('mute')[0] == 1
|
|
58
58
|
|
|
59
59
|
@amixenable.setter
|
|
60
60
|
def amixenable(self, val: bool):
|
|
61
|
-
self.setter(
|
|
61
|
+
self.setter('amixenable', 1 if val else 0)
|
|
62
62
|
|
|
63
63
|
@property
|
|
64
64
|
def amixlock(self) -> bool:
|
|
65
|
-
return self.getter(
|
|
65
|
+
return self.getter('amixlock')[0] == 1
|
|
66
66
|
|
|
67
67
|
@amixlock.setter
|
|
68
68
|
def amixlock(self, val: bool):
|
|
69
|
-
self.setter(
|
|
69
|
+
self.setter('amixlock', 1 if val else 0)
|
|
70
70
|
|
|
71
71
|
class MuteGroup:
|
|
72
72
|
def __init__(self, remote, i):
|
|
@@ -76,128 +76,128 @@ class Config(IConfig):
|
|
|
76
76
|
@property
|
|
77
77
|
def address(self) -> str:
|
|
78
78
|
root = super(Config.MuteGroup, self).address
|
|
79
|
-
return f
|
|
79
|
+
return f'{root}/mute'
|
|
80
80
|
|
|
81
81
|
@property
|
|
82
82
|
def on(self) -> bool:
|
|
83
|
-
return self.getter(f
|
|
83
|
+
return self.getter(f'{self.i}')[0] == 1
|
|
84
84
|
|
|
85
85
|
@on.setter
|
|
86
86
|
def on(self, val: bool):
|
|
87
|
-
self.setter(f
|
|
87
|
+
self.setter(f'{self.i}', 1 if val else 0)
|
|
88
88
|
|
|
89
89
|
class Monitor:
|
|
90
90
|
@property
|
|
91
91
|
def address(self) -> str:
|
|
92
92
|
root = super(Config.Monitor, self).address
|
|
93
|
-
return f
|
|
93
|
+
return f'{root}/solo'
|
|
94
94
|
|
|
95
95
|
@property
|
|
96
96
|
@util.db_from
|
|
97
97
|
def level(self) -> float:
|
|
98
|
-
return self.getter(
|
|
98
|
+
return self.getter('level')[0]
|
|
99
99
|
|
|
100
100
|
@level.setter
|
|
101
101
|
@util.db_to
|
|
102
102
|
def level(self, val: float):
|
|
103
|
-
self.setter(
|
|
103
|
+
self.setter('level', val)
|
|
104
104
|
|
|
105
105
|
@property
|
|
106
106
|
def source(self) -> int:
|
|
107
|
-
return int(self.getter(
|
|
107
|
+
return int(self.getter('source')[0])
|
|
108
108
|
|
|
109
109
|
@source.setter
|
|
110
110
|
def source(self, val: int):
|
|
111
|
-
self.setter(
|
|
111
|
+
self.setter('source', val)
|
|
112
112
|
|
|
113
113
|
@property
|
|
114
114
|
def sourcetrim(self) -> float:
|
|
115
|
-
return round(util.lin_get(-18, 18, self.getter(
|
|
115
|
+
return round(util.lin_get(-18, 18, self.getter('sourcetrim')[0]), 1)
|
|
116
116
|
|
|
117
117
|
@sourcetrim.setter
|
|
118
118
|
def sourcetrim(self, val: float):
|
|
119
119
|
if not -18 <= val <= 18:
|
|
120
120
|
self.logger.warning(
|
|
121
|
-
f
|
|
121
|
+
f'sourcetrim got {val}, expected value in range -18.0 to 18.0'
|
|
122
122
|
)
|
|
123
|
-
self.setter(
|
|
123
|
+
self.setter('sourcetrim', util.lin_set(-18, 18, val))
|
|
124
124
|
|
|
125
125
|
@property
|
|
126
126
|
def chmode(self) -> bool:
|
|
127
|
-
return self.getter(
|
|
127
|
+
return self.getter('chmode')[0] == 1
|
|
128
128
|
|
|
129
129
|
@chmode.setter
|
|
130
130
|
def chmode(self, val: bool):
|
|
131
|
-
self.setter(
|
|
131
|
+
self.setter('chmode', 1 if val else 0)
|
|
132
132
|
|
|
133
133
|
@property
|
|
134
134
|
def busmode(self) -> bool:
|
|
135
|
-
return self.getter(
|
|
135
|
+
return self.getter('busmode')[0] == 1
|
|
136
136
|
|
|
137
137
|
@busmode.setter
|
|
138
138
|
def busmode(self, val: bool):
|
|
139
|
-
self.setter(
|
|
139
|
+
self.setter('busmode', 1 if val else 0)
|
|
140
140
|
|
|
141
141
|
@property
|
|
142
142
|
def dimgain(self) -> int:
|
|
143
|
-
return int(util.lin_get(-40, 0, self.getter(
|
|
143
|
+
return int(util.lin_get(-40, 0, self.getter('dimatt')[0]))
|
|
144
144
|
|
|
145
145
|
@dimgain.setter
|
|
146
146
|
def dimgain(self, val: int):
|
|
147
147
|
if not -40 <= val <= 0:
|
|
148
148
|
self.logger.warning(
|
|
149
|
-
f
|
|
149
|
+
f'dimgain got {val}, expected value in range -40 to 0'
|
|
150
150
|
)
|
|
151
|
-
self.setter(
|
|
151
|
+
self.setter('dimatt', util.lin_set(-40, 0, val))
|
|
152
152
|
|
|
153
153
|
@property
|
|
154
154
|
def dim(self) -> bool:
|
|
155
|
-
return self.getter(
|
|
155
|
+
return self.getter('dim')[0] == 1
|
|
156
156
|
|
|
157
157
|
@dim.setter
|
|
158
158
|
def dim(self, val: bool):
|
|
159
|
-
self.setter(
|
|
159
|
+
self.setter('dim', 1 if val else 0)
|
|
160
160
|
|
|
161
161
|
@property
|
|
162
162
|
def mono(self) -> bool:
|
|
163
|
-
return self.getter(
|
|
163
|
+
return self.getter('mono')[0] == 1
|
|
164
164
|
|
|
165
165
|
@mono.setter
|
|
166
166
|
def mono(self, val: bool):
|
|
167
|
-
self.setter(
|
|
167
|
+
self.setter('mono', 1 if val else 0)
|
|
168
168
|
|
|
169
169
|
@property
|
|
170
170
|
def mute(self) -> bool:
|
|
171
|
-
return self.getter(
|
|
171
|
+
return self.getter('mute')[0] == 1
|
|
172
172
|
|
|
173
173
|
@mute.setter
|
|
174
174
|
def mute(self, val: bool):
|
|
175
|
-
self.setter(
|
|
175
|
+
self.setter('mute', 1 if val else 0)
|
|
176
176
|
|
|
177
177
|
@property
|
|
178
178
|
def dimfpl(self) -> bool:
|
|
179
|
-
return self.getter(
|
|
179
|
+
return self.getter('dimfpl')[0] == 1
|
|
180
180
|
|
|
181
181
|
@dimfpl.setter
|
|
182
182
|
def dimfpl(self, val: bool):
|
|
183
|
-
self.setter(
|
|
183
|
+
self.setter('dimfpl', 1 if val else 0)
|
|
184
184
|
|
|
185
185
|
|
|
186
186
|
def _make_links_mixin(kind):
|
|
187
187
|
"""Creates a links mixin"""
|
|
188
188
|
return type(
|
|
189
|
-
f
|
|
189
|
+
f'Links{kind}',
|
|
190
190
|
(),
|
|
191
191
|
{
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
192
|
+
'link_eq': bool_prop('linkcfg/eq'),
|
|
193
|
+
'link_dyn': bool_prop('linkcfg/dyn'),
|
|
194
|
+
'link_fader_mute': bool_prop('linkcfg/fdrmute'),
|
|
195
195
|
**{
|
|
196
|
-
f
|
|
196
|
+
f'chlink{i}_{i+1}': bool_prop(f'chlink/{i}-{i+1}')
|
|
197
197
|
for i in range(1, kind.num_strip, 2)
|
|
198
198
|
},
|
|
199
199
|
**{
|
|
200
|
-
f
|
|
200
|
+
f'buslink{i}_{i+1}': bool_prop(f'buslink/{i}-{i+1}')
|
|
201
201
|
for i in range(1, kind.num_bus, 2)
|
|
202
202
|
},
|
|
203
203
|
},
|
xair_api/dca.py
CHANGED
|
@@ -13,10 +13,10 @@ class IDCA(abc.ABC):
|
|
|
13
13
|
self.logger = logger.getChild(self.__class__.__name__)
|
|
14
14
|
|
|
15
15
|
def getter(self, param: str) -> tuple:
|
|
16
|
-
return self._remote.query(f
|
|
16
|
+
return self._remote.query(f'{self.address}/{param}')
|
|
17
17
|
|
|
18
18
|
def setter(self, param: str, val: int):
|
|
19
|
-
self._remote.send(f
|
|
19
|
+
self._remote.send(f'{self.address}/{param}', val)
|
|
20
20
|
|
|
21
21
|
@abc.abstractmethod
|
|
22
22
|
def address(self):
|
|
@@ -28,15 +28,15 @@ class DCA(IDCA):
|
|
|
28
28
|
|
|
29
29
|
@property
|
|
30
30
|
def address(self) -> str:
|
|
31
|
-
return f
|
|
31
|
+
return f'/dca/{self.index}'
|
|
32
32
|
|
|
33
33
|
@property
|
|
34
34
|
def on(self) -> bool:
|
|
35
|
-
return self.getter(
|
|
35
|
+
return self.getter('on')[0] == 1
|
|
36
36
|
|
|
37
37
|
@on.setter
|
|
38
38
|
def on(self, val: bool):
|
|
39
|
-
self.setter(
|
|
39
|
+
self.setter('on', 1 if val else 0)
|
|
40
40
|
|
|
41
41
|
@property
|
|
42
42
|
def mute(self) -> bool:
|
|
@@ -48,16 +48,16 @@ class DCA(IDCA):
|
|
|
48
48
|
|
|
49
49
|
@property
|
|
50
50
|
def name(self) -> str:
|
|
51
|
-
return self.getter(
|
|
51
|
+
return self.getter('config/name')[0]
|
|
52
52
|
|
|
53
53
|
@name.setter
|
|
54
54
|
def name(self, val: str):
|
|
55
|
-
self.setter(
|
|
55
|
+
self.setter('config/name', val)
|
|
56
56
|
|
|
57
57
|
@property
|
|
58
58
|
def color(self) -> int:
|
|
59
|
-
return self.getter(
|
|
59
|
+
return self.getter('config/color')[0]
|
|
60
60
|
|
|
61
61
|
@color.setter
|
|
62
62
|
def color(self, val: int):
|
|
63
|
-
self.setter(
|
|
63
|
+
self.setter('config/color', val)
|
xair_api/errors.py
CHANGED
xair_api/fx.py
CHANGED
|
@@ -16,10 +16,10 @@ class IFX(abc.ABC):
|
|
|
16
16
|
self.logger = logger.getChild(self.__class__.__name__)
|
|
17
17
|
|
|
18
18
|
def getter(self, param: str):
|
|
19
|
-
return self._remote.query(f
|
|
19
|
+
return self._remote.query(f'{self.address}/{param}')
|
|
20
20
|
|
|
21
21
|
def setter(self, param: str, val: int):
|
|
22
|
-
self._remote.send(f
|
|
22
|
+
self._remote.send(f'{self.address}/{param}', val)
|
|
23
23
|
|
|
24
24
|
@abc.abstractmethod
|
|
25
25
|
def address(self):
|
|
@@ -31,15 +31,15 @@ class FX(IFX):
|
|
|
31
31
|
|
|
32
32
|
@property
|
|
33
33
|
def address(self) -> str:
|
|
34
|
-
return f
|
|
34
|
+
return f'/fx/{self.index}'
|
|
35
35
|
|
|
36
36
|
@property
|
|
37
37
|
def type(self) -> int:
|
|
38
|
-
return self.getter(
|
|
38
|
+
return self.getter('type')[0]
|
|
39
39
|
|
|
40
40
|
@type.setter
|
|
41
41
|
def type(self, val: int):
|
|
42
|
-
self.setter(
|
|
42
|
+
self.setter('type', val)
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
class FXSend(IFX):
|
|
@@ -55,20 +55,20 @@ class FXSend(IFX):
|
|
|
55
55
|
Returns an FXSend class of a kind.
|
|
56
56
|
"""
|
|
57
57
|
FXSEND_cls = type(
|
|
58
|
-
f
|
|
58
|
+
f'FXSend{remote.kind}',
|
|
59
59
|
(cls,),
|
|
60
60
|
{
|
|
61
61
|
**{
|
|
62
62
|
_cls.__name__.lower(): type(
|
|
63
|
-
f
|
|
63
|
+
f'{_cls.__name__}{remote.kind}', (_cls, cls), {}
|
|
64
64
|
)(remote, index)
|
|
65
65
|
for _cls in (Config, Mix, Group)
|
|
66
66
|
},
|
|
67
|
-
|
|
67
|
+
'mute': mute_prop(),
|
|
68
68
|
},
|
|
69
69
|
)
|
|
70
70
|
return FXSEND_cls(remote, index)
|
|
71
71
|
|
|
72
72
|
@property
|
|
73
73
|
def address(self) -> str:
|
|
74
|
-
return f
|
|
74
|
+
return f'/fxsend/{self.index}'
|
xair_api/headamp.py
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
from . import util
|
|
5
|
+
|
|
6
|
+
logger = logging.getLogger(__name__)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class IHeadAmp(abc.ABC):
|
|
10
|
+
"""Abstract Base Class for headamps"""
|
|
11
|
+
|
|
12
|
+
def __init__(self, remote, index: int):
|
|
13
|
+
self._remote = remote
|
|
14
|
+
self.index = index + 1
|
|
15
|
+
self.logger = logger.getChild(self.__class__.__name__)
|
|
16
|
+
|
|
17
|
+
def getter(self, param: str):
|
|
18
|
+
return self._remote.query(f'{self.address}/{param}')
|
|
19
|
+
|
|
20
|
+
def setter(self, param: str, val: int):
|
|
21
|
+
self._remote.send(f'{self.address}/{param}', val)
|
|
22
|
+
|
|
23
|
+
@abc.abstractmethod
|
|
24
|
+
def address(self):
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class HeadAmp(IHeadAmp):
|
|
29
|
+
"""Concrete class for headamps"""
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def address(self):
|
|
33
|
+
return f'/headamp/{str(self.index).zfill(2)}'
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def gain(self):
|
|
37
|
+
return round(util.lin_get(-12, 60, self.getter('gain')[0]), 1)
|
|
38
|
+
|
|
39
|
+
@gain.setter
|
|
40
|
+
def gain(self, val):
|
|
41
|
+
self.setter('gain', util.lin_set(-12, 60, val))
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def phantom(self):
|
|
45
|
+
return self.getter('phantom')[0] == 1
|
|
46
|
+
|
|
47
|
+
@phantom.setter
|
|
48
|
+
def phantom(self, val):
|
|
49
|
+
self.setter('phantom', 1 if val else 0)
|
xair_api/kinds.py
CHANGED
|
@@ -1,45 +1,44 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
@dataclass
|
|
4
|
+
@dataclass(frozen=True)
|
|
5
5
|
class KindMap:
|
|
6
|
+
id_: str
|
|
7
|
+
|
|
6
8
|
def __str__(self) -> str:
|
|
7
9
|
return self.id_
|
|
8
10
|
|
|
9
11
|
|
|
10
|
-
@dataclass
|
|
12
|
+
@dataclass(frozen=True)
|
|
11
13
|
class X32KindMap(KindMap):
|
|
12
|
-
id_: str
|
|
13
14
|
num_dca: int = 8
|
|
14
15
|
num_strip: int = 32
|
|
15
16
|
num_bus: int = 16
|
|
16
17
|
num_fx: int = 8
|
|
17
18
|
num_auxrtn: int = 8
|
|
18
19
|
num_matrix: int = 6
|
|
20
|
+
num_headamp: int = 127
|
|
19
21
|
|
|
20
22
|
|
|
21
|
-
@dataclass
|
|
23
|
+
@dataclass(frozen=True)
|
|
22
24
|
class XR18KindMap(KindMap):
|
|
23
25
|
# note ch 17-18 defined as aux return
|
|
24
|
-
id_: str
|
|
25
26
|
num_dca: int = 4
|
|
26
27
|
num_strip: int = 16
|
|
27
28
|
num_bus: int = 6
|
|
28
29
|
num_fx: int = 4
|
|
29
30
|
|
|
30
31
|
|
|
31
|
-
@dataclass
|
|
32
|
+
@dataclass(frozen=True)
|
|
32
33
|
class XR16KindMap(KindMap):
|
|
33
|
-
id_: str
|
|
34
34
|
num_dca: int = 4
|
|
35
35
|
num_strip: int = 16
|
|
36
36
|
num_bus: int = 4
|
|
37
37
|
num_fx: int = 4
|
|
38
38
|
|
|
39
39
|
|
|
40
|
-
@dataclass
|
|
40
|
+
@dataclass(frozen=True)
|
|
41
41
|
class XR12KindMap(KindMap):
|
|
42
|
-
id_: str
|
|
43
42
|
num_dca: int = 4
|
|
44
43
|
num_strip: int = 12
|
|
45
44
|
num_bus: int = 2
|
|
@@ -47,11 +46,11 @@ class XR12KindMap(KindMap):
|
|
|
47
46
|
|
|
48
47
|
|
|
49
48
|
_kinds = {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
'X32': X32KindMap(id_='X32'),
|
|
50
|
+
'MR18': XR18KindMap(id_='MR18'),
|
|
51
|
+
'XR18': XR18KindMap(id_='XR18'),
|
|
52
|
+
'XR16': XR16KindMap(id_='XR16'),
|
|
53
|
+
'XR12': XR12KindMap(id_='XR12'),
|
|
55
54
|
}
|
|
56
55
|
|
|
57
56
|
|
|
@@ -59,4 +58,4 @@ def get(kind_id):
|
|
|
59
58
|
return _kinds[kind_id]
|
|
60
59
|
|
|
61
60
|
|
|
62
|
-
all = list(
|
|
61
|
+
all = list(_kinds.values())
|
xair_api/lr.py
CHANGED
|
@@ -18,10 +18,10 @@ class ILR(abc.ABC):
|
|
|
18
18
|
self.logger = logger.getChild(self.__class__.__name__)
|
|
19
19
|
|
|
20
20
|
def getter(self, param: str):
|
|
21
|
-
return self._remote.query(f
|
|
21
|
+
return self._remote.query(f'{self.address}/{param}')
|
|
22
22
|
|
|
23
23
|
def setter(self, param: str, val: int):
|
|
24
|
-
self._remote.send(f
|
|
24
|
+
self._remote.send(f'{self.address}/{param}', val)
|
|
25
25
|
|
|
26
26
|
@abc.abstractmethod
|
|
27
27
|
def address(self):
|
|
@@ -41,12 +41,12 @@ class LR(ILR):
|
|
|
41
41
|
Returns an LR class of a kind.
|
|
42
42
|
"""
|
|
43
43
|
LR_cls = type(
|
|
44
|
-
f
|
|
44
|
+
f'LR{remote.kind}',
|
|
45
45
|
(cls,),
|
|
46
46
|
{
|
|
47
47
|
**{
|
|
48
48
|
_cls.__name__.lower(): type(
|
|
49
|
-
f
|
|
49
|
+
f'{_cls.__name__}{remote.kind}', (_cls, cls), {}
|
|
50
50
|
)(remote, index)
|
|
51
51
|
for _cls in (
|
|
52
52
|
Config,
|
|
@@ -57,11 +57,11 @@ class LR(ILR):
|
|
|
57
57
|
Mix,
|
|
58
58
|
)
|
|
59
59
|
},
|
|
60
|
-
|
|
60
|
+
'mute': mute_prop(),
|
|
61
61
|
},
|
|
62
62
|
)
|
|
63
63
|
return LR_cls(remote, index)
|
|
64
64
|
|
|
65
65
|
@property
|
|
66
66
|
def address(self) -> str:
|
|
67
|
-
return
|
|
67
|
+
return '/lr'
|
xair_api/meta.py
CHANGED
|
@@ -50,7 +50,7 @@ def float_prop(param):
|
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
def geq_prop(param):
|
|
53
|
-
param = param.replace(
|
|
53
|
+
param = param.replace('_', '.')
|
|
54
54
|
|
|
55
55
|
def fget(self) -> float:
|
|
56
56
|
return round(lin_get(-15, 15, self.getter(param)[0]), 1)
|
|
@@ -58,7 +58,7 @@ def geq_prop(param):
|
|
|
58
58
|
def fset(self, val):
|
|
59
59
|
if not -15 <= val <= 15:
|
|
60
60
|
self.logger.warning(
|
|
61
|
-
f
|
|
61
|
+
f'slider_{param} got {val}, expected value in range -15.0 to 15.0'
|
|
62
62
|
)
|
|
63
63
|
self.setter(param, lin_set(-15, 15, val))
|
|
64
64
|
|