ssl-console-client 0.1.0__tar.gz
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.
- ssl_console_client-0.1.0/.gitignore +29 -0
- ssl_console_client-0.1.0/LICENSE +21 -0
- ssl_console_client-0.1.0/PKG-INFO +249 -0
- ssl_console_client-0.1.0/README.md +216 -0
- ssl_console_client-0.1.0/pyproject.toml +60 -0
- ssl_console_client-0.1.0/ssl-matrix-client/__init__.py +1 -0
- ssl_console_client-0.1.0/ssl-matrix-client/__main__.py +12 -0
- ssl_console_client-0.1.0/ssl-matrix-client/audit.py +310 -0
- ssl_console_client-0.1.0/ssl-matrix-client/cli.py +1691 -0
- ssl_console_client-0.1.0/ssl-matrix-client/client.py +786 -0
- ssl_console_client-0.1.0/ssl-matrix-client/handlers/__init__.py +1 -0
- ssl_console_client-0.1.0/ssl-matrix-client/handlers/chan_presets.py +75 -0
- ssl_console_client-0.1.0/ssl-matrix-client/handlers/channels.py +92 -0
- ssl_console_client-0.1.0/ssl-matrix-client/handlers/connection.py +55 -0
- ssl_console_client-0.1.0/ssl-matrix-client/handlers/delta.py +63 -0
- ssl_console_client-0.1.0/ssl-matrix-client/handlers/profiles.py +123 -0
- ssl_console_client-0.1.0/ssl-matrix-client/handlers/projects.py +179 -0
- ssl_console_client-0.1.0/ssl-matrix-client/handlers/routing.py +272 -0
- ssl_console_client-0.1.0/ssl-matrix-client/handlers/softkeys.py +463 -0
- ssl_console_client-0.1.0/ssl-matrix-client/handlers/total_recall.py +136 -0
- ssl_console_client-0.1.0/ssl-matrix-client/handlers/xpatch.py +435 -0
- ssl_console_client-0.1.0/ssl-matrix-client/models.py +395 -0
- ssl_console_client-0.1.0/ssl-matrix-client/protocol.py +540 -0
- ssl_console_client-0.1.0/ssl-matrix-client/ssl_theme.tcss +98 -0
- ssl_console_client-0.1.0/ssl-matrix-client/templates.py +438 -0
- ssl_console_client-0.1.0/ssl-matrix-client/tui.py +355 -0
- ssl_console_client-0.1.0/ssl-matrix-client/tui_commands.py +619 -0
- ssl_console_client-0.1.0/ssl-matrix-client/tui_views.py +139 -0
- ssl_console_client-0.1.0/ssl-matrix-client/tui_widgets.py +252 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.pyc
|
|
3
|
+
*.pyo
|
|
4
|
+
.pytest_cache/
|
|
5
|
+
.ruff_cache/
|
|
6
|
+
*.egg-info/
|
|
7
|
+
.venv/
|
|
8
|
+
dist/
|
|
9
|
+
build/
|
|
10
|
+
*.egg
|
|
11
|
+
.mypy_cache/
|
|
12
|
+
|
|
13
|
+
# IDE / editor
|
|
14
|
+
.cursor/
|
|
15
|
+
.vscode/
|
|
16
|
+
|
|
17
|
+
# Internal tooling
|
|
18
|
+
.juno_task/
|
|
19
|
+
.playwright-mcp/
|
|
20
|
+
.planning/
|
|
21
|
+
|
|
22
|
+
# Reverse-engineering artifacts (decompiled Java, pcaps)
|
|
23
|
+
reverse-engineering/
|
|
24
|
+
|
|
25
|
+
# Dev/debug scripts
|
|
26
|
+
probe_console.py
|
|
27
|
+
audit_runner.py
|
|
28
|
+
scripts/crawl_ssl_matrix_docs*
|
|
29
|
+
scripts/manual_snapshots/
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kolton Jacobs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ssl-console-client
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Reverse-engineered Python client for controlling SSL mixing consoles (Matrix, Duality, AWS) over Ethernet
|
|
5
|
+
Project-URL: Homepage, https://github.com/koltyj/SSL
|
|
6
|
+
Project-URL: Repository, https://github.com/koltyj/SSL
|
|
7
|
+
Project-URL: Issues, https://github.com/koltyj/SSL/issues
|
|
8
|
+
Author: Kolton Jacobs
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: audio,aws,duality,matrix,mixing-console,remote-control,ssl,udp
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Topic :: Multimedia :: Sound/Audio
|
|
24
|
+
Classifier: Topic :: Multimedia :: Sound/Audio :: Mixers
|
|
25
|
+
Requires-Python: >=3.9
|
|
26
|
+
Requires-Dist: textual>=0.80.0
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Requires-Dist: pre-commit<5,>=3; extra == 'dev'
|
|
29
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
30
|
+
Requires-Dist: pytest<9,>=7; extra == 'dev'
|
|
31
|
+
Requires-Dist: ruff>=0.9; extra == 'dev'
|
|
32
|
+
Description-Content-Type: text/markdown
|
|
33
|
+
|
|
34
|
+
# SSL Console Control
|
|
35
|
+
|
|
36
|
+
**A reverse-engineered Python client for controlling SSL mixing consoles over Ethernet.**
|
|
37
|
+
|
|
38
|
+

|
|
39
|
+

|
|
40
|
+

|
|
41
|
+
|
|
42
|
+

|
|
43
|
+
|
|
44
|
+
## What is this
|
|
45
|
+
|
|
46
|
+
SSL's large-format analog consoles (Matrix, Duality, AWS 900, AWS 924/948) have digital control capabilities -- flying faders, DAW integration, insert routing, and session recall. SSL's official control software (MatrixRemote) is a Java application that hasn't been maintained for modern macOS.
|
|
47
|
+
|
|
48
|
+
This project is a from-scratch Python replacement, reverse-engineered from the SSL MatrixRemote protocol and live packet captures. It speaks the console's native UDP protocol and auto-detects which console model is connected, exposing available features through a terminal UI, interactive REPL, and scriptable CLI.
|
|
49
|
+
|
|
50
|
+
## Features
|
|
51
|
+
|
|
52
|
+
- **Real-time TUI dashboard** with SSL-inspired dark theme, tabbed layout, and command palette
|
|
53
|
+
- **Channel strip monitoring** -- names, DAW layer assignments, insert routing, automation modes
|
|
54
|
+
- **60+ CLI commands** covering channels, routing, profiles, projects, Total Recall, XPatch, softkeys
|
|
55
|
+
- **Session templates** -- save, load, diff, and apply full console state snapshots
|
|
56
|
+
- **Connection health monitoring** with auto-reconnect and heartbeat tracking
|
|
57
|
+
- **Interactive REPL** and one-shot CLI mode for scripting
|
|
58
|
+
- **274 unit tests** with full handler coverage
|
|
59
|
+
- **Minimal dependencies** -- Python stdlib + [Textual](https://github.com/Textualize/textual) for the TUI
|
|
60
|
+
|
|
61
|
+
## Quick Start
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pip install ssl-console-client
|
|
65
|
+
|
|
66
|
+
# Launch the REPL
|
|
67
|
+
ssl-console
|
|
68
|
+
|
|
69
|
+
# Launch the TUI
|
|
70
|
+
ssl-console tui
|
|
71
|
+
|
|
72
|
+
# One-shot commands
|
|
73
|
+
ssl-console channels
|
|
74
|
+
ssl-console --ip 10.0.0.50 layers
|
|
75
|
+
ssl-console -v status
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Or install from source:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git clone https://github.com/koltyj/SSL.git
|
|
82
|
+
cd SSL
|
|
83
|
+
pip install -e ".[dev]"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The console's default IP is `192.168.1.2` on UDP port `50081`. Pass `--ip` to override.
|
|
87
|
+
|
|
88
|
+
## Terminal UI
|
|
89
|
+
|
|
90
|
+
The TUI provides a full-screen dashboard built on Textual with four tabs:
|
|
91
|
+
|
|
92
|
+
- **Channels** -- live channel strip display with names, DAW layer info, and flash highlights on state changes
|
|
93
|
+
- **Routing** -- insert matrix and XPatch configuration
|
|
94
|
+
- **Templates** -- session template management (save/load/diff)
|
|
95
|
+
- **Settings** -- console configuration, profiles, automation modes
|
|
96
|
+
|
|
97
|
+
Key bindings:
|
|
98
|
+
|
|
99
|
+
| Key | Action |
|
|
100
|
+
|-----|--------|
|
|
101
|
+
| `1`-`4` | Switch tabs |
|
|
102
|
+
| `/` | Open command palette |
|
|
103
|
+
| `q` | Quit |
|
|
104
|
+
|
|
105
|
+
A status bar shows connection health (green/yellow/red dot), active project, and last loaded template. A disconnect overlay appears automatically when the console goes offline.
|
|
106
|
+
|
|
107
|
+
## CLI Commands
|
|
108
|
+
|
|
109
|
+
### Connection
|
|
110
|
+
|
|
111
|
+
| Command | Description |
|
|
112
|
+
|---------|-------------|
|
|
113
|
+
| `connect` | Connect to the console and sync state |
|
|
114
|
+
| `disconnect` | Disconnect |
|
|
115
|
+
| `status` | Show console info, firmware, heartbeat age |
|
|
116
|
+
| `health` | Detailed connection health report |
|
|
117
|
+
|
|
118
|
+
### Channels & Profiles
|
|
119
|
+
|
|
120
|
+
| Command | Description |
|
|
121
|
+
|---------|-------------|
|
|
122
|
+
| `channels` | List all channel names |
|
|
123
|
+
| `rename <ch> <name>` | Rename a channel (6 char max) |
|
|
124
|
+
| `profiles` | List available DAW profiles |
|
|
125
|
+
| `layers` | Show DAW layer protocol assignments |
|
|
126
|
+
| `setprofile <layer> <name>` | Assign a profile to a DAW layer |
|
|
127
|
+
| `transportlock <0-4>` | Set transport lock to a specific layer |
|
|
128
|
+
|
|
129
|
+
### Routing & Inserts
|
|
130
|
+
|
|
131
|
+
| Command | Description |
|
|
132
|
+
|---------|-------------|
|
|
133
|
+
| `matrix` | Show insert matrix assignments |
|
|
134
|
+
| `assign <ch> <slot> <dev>` | Assign a device to an insert slot |
|
|
135
|
+
| `stereo <ch> <on/off>` | Toggle stereo linking |
|
|
136
|
+
| `chains` | Show insert chains |
|
|
137
|
+
| `devices` | List available insert devices |
|
|
138
|
+
| `matrix_presets` | List routing presets |
|
|
139
|
+
|
|
140
|
+
### XPatch
|
|
141
|
+
|
|
142
|
+
| Command | Description |
|
|
143
|
+
|---------|-------------|
|
|
144
|
+
| `xpatch_setup` | Show XPatch configuration |
|
|
145
|
+
| `xpatch_routes` | Display current XPatch routing |
|
|
146
|
+
| `xpatch_route <ch> <src>` | Set an XPatch route |
|
|
147
|
+
| `xpatch_presets` | List XPatch presets |
|
|
148
|
+
|
|
149
|
+
### Projects & Total Recall
|
|
150
|
+
|
|
151
|
+
| Command | Description |
|
|
152
|
+
|---------|-------------|
|
|
153
|
+
| `projects` | List projects and titles on the console |
|
|
154
|
+
| `new_project <name>` | Create a new project |
|
|
155
|
+
| `select_title <proj> <title>` | Load a project title |
|
|
156
|
+
| `tr_snapshots` | List Total Recall snapshots |
|
|
157
|
+
| `tr_take` | Take a TR snapshot |
|
|
158
|
+
| `tr_select <idx>` | Recall a TR snapshot |
|
|
159
|
+
|
|
160
|
+
### Softkeys
|
|
161
|
+
|
|
162
|
+
| Command | Description |
|
|
163
|
+
|---------|-------------|
|
|
164
|
+
| `softkey_keymap` | Show current keymap |
|
|
165
|
+
| `softkey_edit <key>` | Edit a softkey assignment |
|
|
166
|
+
| `softkey_midi <key> ...` | Assign MIDI output to a softkey |
|
|
167
|
+
| `softkey_usb <key> ...` | Assign USB HID output to a softkey |
|
|
168
|
+
|
|
169
|
+
### Session Templates
|
|
170
|
+
|
|
171
|
+
| Command | Description |
|
|
172
|
+
|---------|-------------|
|
|
173
|
+
| `template save <name>` | Save current console state |
|
|
174
|
+
| `template load <name>` | Restore a saved template |
|
|
175
|
+
| `template diff <name>` | Compare live state to a template |
|
|
176
|
+
| `template list` | List saved templates |
|
|
177
|
+
| `split <mode>` | Split board between two DAW layers |
|
|
178
|
+
|
|
179
|
+
### Automation & Control
|
|
180
|
+
|
|
181
|
+
| Command | Description |
|
|
182
|
+
|---------|-------------|
|
|
183
|
+
| `automode <mode>` | Set automation mode (read/write/touch/latch) |
|
|
184
|
+
| `motors <on/off>` | Enable/disable flying faders |
|
|
185
|
+
| `mdac <on/off>` | Enable/disable MDAC mode |
|
|
186
|
+
| `restart` | Restart the console firmware |
|
|
187
|
+
|
|
188
|
+
## Architecture
|
|
189
|
+
|
|
190
|
+
Single-socket UDP client with a threaded receive loop and dispatch table.
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
cli.py (cmd.Cmd REPL + argparse one-shot)
|
|
194
|
+
├── tui.py (Textual TUI application)
|
|
195
|
+
└── client.py (SSLMatrixClient)
|
|
196
|
+
├── protocol.py (TxMessage/RxMessage wire format, 197 MessageCodes)
|
|
197
|
+
├── models.py (ConsoleState dataclass tree)
|
|
198
|
+
└── handlers/ (10 handler modules, ~105 dispatch entries)
|
|
199
|
+
├── connection.py — GET_DESK discovery, heartbeat
|
|
200
|
+
├── channels.py — Channel names, scribble strips
|
|
201
|
+
├── profiles.py — DAW layers (HUI/MCU/CC), transport lock
|
|
202
|
+
├── delta.py — Automation mode, motors, MDAC, restart
|
|
203
|
+
├── routing.py — Insert matrix V2, chains, presets
|
|
204
|
+
├── projects.py — Project/title CRUD, directory listing
|
|
205
|
+
├── total_recall.py — TR snapshots
|
|
206
|
+
├── chan_presets.py — Channel name presets
|
|
207
|
+
├── xpatch.py — XPatch routing, presets, chains, MIDI
|
|
208
|
+
└── softkeys.py — Programmable keys, keymap editor
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Each handler module contains **builders** (Python to console) and **handlers** (console to Python). The client's dispatch table maps `MessageCode` enums to handler functions. The wire format uses a 16-byte big-endian header followed by a variable-length payload — shared across all SSL console models and reverse-engineered from the SSL MatrixRemote protocol.
|
|
212
|
+
|
|
213
|
+
## Supported Consoles
|
|
214
|
+
|
|
215
|
+
The client auto-detects the console model on connection and enables the appropriate feature set.
|
|
216
|
+
|
|
217
|
+
| Console | Channels | Insert Matrix | XPatch | DAW Layers | Delta |
|
|
218
|
+
|---------|----------|---------------|--------|------------|-------|
|
|
219
|
+
| SSL Matrix | 32 | Yes | Yes (16ch) | Yes (4) | Yes |
|
|
220
|
+
| SSL Duality | 96 | -- | -- | -- | -- |
|
|
221
|
+
| SSL AWS 900 | 48 | -- | -- | -- | -- |
|
|
222
|
+
| SSL AWS 924/948 | 48 | -- | -- | -- | -- |
|
|
223
|
+
|
|
224
|
+
All consoles share: channel names, projects, Total Recall, channel name presets, UDP on port 50081.
|
|
225
|
+
|
|
226
|
+
Matrix tested with firmware V3.0/5. Other consoles and firmware versions may work but are untested — reports welcome.
|
|
227
|
+
|
|
228
|
+
## Development
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
# Run all tests
|
|
232
|
+
python3 -m pytest tests/ -v
|
|
233
|
+
|
|
234
|
+
# Run a specific test file
|
|
235
|
+
python3 -m pytest tests/test_protocol.py -v
|
|
236
|
+
|
|
237
|
+
# Lint and format
|
|
238
|
+
ruff check ssl-matrix-client/ tests/
|
|
239
|
+
ruff format ssl-matrix-client/ tests/
|
|
240
|
+
|
|
241
|
+
# Pre-commit hooks (ruff, trailing whitespace, EOF fixer, debug statements)
|
|
242
|
+
pre-commit run --all-files
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Tests use an import shim in `tests/conftest.py` to handle the hyphenated package directory. Tool configuration lives in `pyproject.toml`.
|
|
246
|
+
|
|
247
|
+
## License
|
|
248
|
+
|
|
249
|
+
MIT
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# SSL Console Control
|
|
2
|
+
|
|
3
|
+
**A reverse-engineered Python client for controlling SSL mixing consoles over Ethernet.**
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+

|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
## What is this
|
|
12
|
+
|
|
13
|
+
SSL's large-format analog consoles (Matrix, Duality, AWS 900, AWS 924/948) have digital control capabilities -- flying faders, DAW integration, insert routing, and session recall. SSL's official control software (MatrixRemote) is a Java application that hasn't been maintained for modern macOS.
|
|
14
|
+
|
|
15
|
+
This project is a from-scratch Python replacement, reverse-engineered from the SSL MatrixRemote protocol and live packet captures. It speaks the console's native UDP protocol and auto-detects which console model is connected, exposing available features through a terminal UI, interactive REPL, and scriptable CLI.
|
|
16
|
+
|
|
17
|
+
## Features
|
|
18
|
+
|
|
19
|
+
- **Real-time TUI dashboard** with SSL-inspired dark theme, tabbed layout, and command palette
|
|
20
|
+
- **Channel strip monitoring** -- names, DAW layer assignments, insert routing, automation modes
|
|
21
|
+
- **60+ CLI commands** covering channels, routing, profiles, projects, Total Recall, XPatch, softkeys
|
|
22
|
+
- **Session templates** -- save, load, diff, and apply full console state snapshots
|
|
23
|
+
- **Connection health monitoring** with auto-reconnect and heartbeat tracking
|
|
24
|
+
- **Interactive REPL** and one-shot CLI mode for scripting
|
|
25
|
+
- **274 unit tests** with full handler coverage
|
|
26
|
+
- **Minimal dependencies** -- Python stdlib + [Textual](https://github.com/Textualize/textual) for the TUI
|
|
27
|
+
|
|
28
|
+
## Quick Start
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pip install ssl-console-client
|
|
32
|
+
|
|
33
|
+
# Launch the REPL
|
|
34
|
+
ssl-console
|
|
35
|
+
|
|
36
|
+
# Launch the TUI
|
|
37
|
+
ssl-console tui
|
|
38
|
+
|
|
39
|
+
# One-shot commands
|
|
40
|
+
ssl-console channels
|
|
41
|
+
ssl-console --ip 10.0.0.50 layers
|
|
42
|
+
ssl-console -v status
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Or install from source:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
git clone https://github.com/koltyj/SSL.git
|
|
49
|
+
cd SSL
|
|
50
|
+
pip install -e ".[dev]"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The console's default IP is `192.168.1.2` on UDP port `50081`. Pass `--ip` to override.
|
|
54
|
+
|
|
55
|
+
## Terminal UI
|
|
56
|
+
|
|
57
|
+
The TUI provides a full-screen dashboard built on Textual with four tabs:
|
|
58
|
+
|
|
59
|
+
- **Channels** -- live channel strip display with names, DAW layer info, and flash highlights on state changes
|
|
60
|
+
- **Routing** -- insert matrix and XPatch configuration
|
|
61
|
+
- **Templates** -- session template management (save/load/diff)
|
|
62
|
+
- **Settings** -- console configuration, profiles, automation modes
|
|
63
|
+
|
|
64
|
+
Key bindings:
|
|
65
|
+
|
|
66
|
+
| Key | Action |
|
|
67
|
+
|-----|--------|
|
|
68
|
+
| `1`-`4` | Switch tabs |
|
|
69
|
+
| `/` | Open command palette |
|
|
70
|
+
| `q` | Quit |
|
|
71
|
+
|
|
72
|
+
A status bar shows connection health (green/yellow/red dot), active project, and last loaded template. A disconnect overlay appears automatically when the console goes offline.
|
|
73
|
+
|
|
74
|
+
## CLI Commands
|
|
75
|
+
|
|
76
|
+
### Connection
|
|
77
|
+
|
|
78
|
+
| Command | Description |
|
|
79
|
+
|---------|-------------|
|
|
80
|
+
| `connect` | Connect to the console and sync state |
|
|
81
|
+
| `disconnect` | Disconnect |
|
|
82
|
+
| `status` | Show console info, firmware, heartbeat age |
|
|
83
|
+
| `health` | Detailed connection health report |
|
|
84
|
+
|
|
85
|
+
### Channels & Profiles
|
|
86
|
+
|
|
87
|
+
| Command | Description |
|
|
88
|
+
|---------|-------------|
|
|
89
|
+
| `channels` | List all channel names |
|
|
90
|
+
| `rename <ch> <name>` | Rename a channel (6 char max) |
|
|
91
|
+
| `profiles` | List available DAW profiles |
|
|
92
|
+
| `layers` | Show DAW layer protocol assignments |
|
|
93
|
+
| `setprofile <layer> <name>` | Assign a profile to a DAW layer |
|
|
94
|
+
| `transportlock <0-4>` | Set transport lock to a specific layer |
|
|
95
|
+
|
|
96
|
+
### Routing & Inserts
|
|
97
|
+
|
|
98
|
+
| Command | Description |
|
|
99
|
+
|---------|-------------|
|
|
100
|
+
| `matrix` | Show insert matrix assignments |
|
|
101
|
+
| `assign <ch> <slot> <dev>` | Assign a device to an insert slot |
|
|
102
|
+
| `stereo <ch> <on/off>` | Toggle stereo linking |
|
|
103
|
+
| `chains` | Show insert chains |
|
|
104
|
+
| `devices` | List available insert devices |
|
|
105
|
+
| `matrix_presets` | List routing presets |
|
|
106
|
+
|
|
107
|
+
### XPatch
|
|
108
|
+
|
|
109
|
+
| Command | Description |
|
|
110
|
+
|---------|-------------|
|
|
111
|
+
| `xpatch_setup` | Show XPatch configuration |
|
|
112
|
+
| `xpatch_routes` | Display current XPatch routing |
|
|
113
|
+
| `xpatch_route <ch> <src>` | Set an XPatch route |
|
|
114
|
+
| `xpatch_presets` | List XPatch presets |
|
|
115
|
+
|
|
116
|
+
### Projects & Total Recall
|
|
117
|
+
|
|
118
|
+
| Command | Description |
|
|
119
|
+
|---------|-------------|
|
|
120
|
+
| `projects` | List projects and titles on the console |
|
|
121
|
+
| `new_project <name>` | Create a new project |
|
|
122
|
+
| `select_title <proj> <title>` | Load a project title |
|
|
123
|
+
| `tr_snapshots` | List Total Recall snapshots |
|
|
124
|
+
| `tr_take` | Take a TR snapshot |
|
|
125
|
+
| `tr_select <idx>` | Recall a TR snapshot |
|
|
126
|
+
|
|
127
|
+
### Softkeys
|
|
128
|
+
|
|
129
|
+
| Command | Description |
|
|
130
|
+
|---------|-------------|
|
|
131
|
+
| `softkey_keymap` | Show current keymap |
|
|
132
|
+
| `softkey_edit <key>` | Edit a softkey assignment |
|
|
133
|
+
| `softkey_midi <key> ...` | Assign MIDI output to a softkey |
|
|
134
|
+
| `softkey_usb <key> ...` | Assign USB HID output to a softkey |
|
|
135
|
+
|
|
136
|
+
### Session Templates
|
|
137
|
+
|
|
138
|
+
| Command | Description |
|
|
139
|
+
|---------|-------------|
|
|
140
|
+
| `template save <name>` | Save current console state |
|
|
141
|
+
| `template load <name>` | Restore a saved template |
|
|
142
|
+
| `template diff <name>` | Compare live state to a template |
|
|
143
|
+
| `template list` | List saved templates |
|
|
144
|
+
| `split <mode>` | Split board between two DAW layers |
|
|
145
|
+
|
|
146
|
+
### Automation & Control
|
|
147
|
+
|
|
148
|
+
| Command | Description |
|
|
149
|
+
|---------|-------------|
|
|
150
|
+
| `automode <mode>` | Set automation mode (read/write/touch/latch) |
|
|
151
|
+
| `motors <on/off>` | Enable/disable flying faders |
|
|
152
|
+
| `mdac <on/off>` | Enable/disable MDAC mode |
|
|
153
|
+
| `restart` | Restart the console firmware |
|
|
154
|
+
|
|
155
|
+
## Architecture
|
|
156
|
+
|
|
157
|
+
Single-socket UDP client with a threaded receive loop and dispatch table.
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
cli.py (cmd.Cmd REPL + argparse one-shot)
|
|
161
|
+
├── tui.py (Textual TUI application)
|
|
162
|
+
└── client.py (SSLMatrixClient)
|
|
163
|
+
├── protocol.py (TxMessage/RxMessage wire format, 197 MessageCodes)
|
|
164
|
+
├── models.py (ConsoleState dataclass tree)
|
|
165
|
+
└── handlers/ (10 handler modules, ~105 dispatch entries)
|
|
166
|
+
├── connection.py — GET_DESK discovery, heartbeat
|
|
167
|
+
├── channels.py — Channel names, scribble strips
|
|
168
|
+
├── profiles.py — DAW layers (HUI/MCU/CC), transport lock
|
|
169
|
+
├── delta.py — Automation mode, motors, MDAC, restart
|
|
170
|
+
├── routing.py — Insert matrix V2, chains, presets
|
|
171
|
+
├── projects.py — Project/title CRUD, directory listing
|
|
172
|
+
├── total_recall.py — TR snapshots
|
|
173
|
+
├── chan_presets.py — Channel name presets
|
|
174
|
+
├── xpatch.py — XPatch routing, presets, chains, MIDI
|
|
175
|
+
└── softkeys.py — Programmable keys, keymap editor
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Each handler module contains **builders** (Python to console) and **handlers** (console to Python). The client's dispatch table maps `MessageCode` enums to handler functions. The wire format uses a 16-byte big-endian header followed by a variable-length payload — shared across all SSL console models and reverse-engineered from the SSL MatrixRemote protocol.
|
|
179
|
+
|
|
180
|
+
## Supported Consoles
|
|
181
|
+
|
|
182
|
+
The client auto-detects the console model on connection and enables the appropriate feature set.
|
|
183
|
+
|
|
184
|
+
| Console | Channels | Insert Matrix | XPatch | DAW Layers | Delta |
|
|
185
|
+
|---------|----------|---------------|--------|------------|-------|
|
|
186
|
+
| SSL Matrix | 32 | Yes | Yes (16ch) | Yes (4) | Yes |
|
|
187
|
+
| SSL Duality | 96 | -- | -- | -- | -- |
|
|
188
|
+
| SSL AWS 900 | 48 | -- | -- | -- | -- |
|
|
189
|
+
| SSL AWS 924/948 | 48 | -- | -- | -- | -- |
|
|
190
|
+
|
|
191
|
+
All consoles share: channel names, projects, Total Recall, channel name presets, UDP on port 50081.
|
|
192
|
+
|
|
193
|
+
Matrix tested with firmware V3.0/5. Other consoles and firmware versions may work but are untested — reports welcome.
|
|
194
|
+
|
|
195
|
+
## Development
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
# Run all tests
|
|
199
|
+
python3 -m pytest tests/ -v
|
|
200
|
+
|
|
201
|
+
# Run a specific test file
|
|
202
|
+
python3 -m pytest tests/test_protocol.py -v
|
|
203
|
+
|
|
204
|
+
# Lint and format
|
|
205
|
+
ruff check ssl-matrix-client/ tests/
|
|
206
|
+
ruff format ssl-matrix-client/ tests/
|
|
207
|
+
|
|
208
|
+
# Pre-commit hooks (ruff, trailing whitespace, EOF fixer, debug statements)
|
|
209
|
+
pre-commit run --all-files
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Tests use an import shim in `tests/conftest.py` to handle the hyphenated package directory. Tool configuration lives in `pyproject.toml`.
|
|
213
|
+
|
|
214
|
+
## License
|
|
215
|
+
|
|
216
|
+
MIT
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "ssl-console-client"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Reverse-engineered Python client for controlling SSL mixing consoles (Matrix, Duality, AWS) over Ethernet"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
requires-python = ">=3.9"
|
|
12
|
+
authors = [{ name = "Kolton Jacobs" }]
|
|
13
|
+
keywords = ["ssl", "mixing-console", "audio", "matrix", "duality", "aws", "udp", "remote-control"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 4 - Beta",
|
|
16
|
+
"Environment :: Console",
|
|
17
|
+
"Intended Audience :: End Users/Desktop",
|
|
18
|
+
"License :: OSI Approved :: MIT License",
|
|
19
|
+
"Operating System :: OS Independent",
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Programming Language :: Python :: 3.9",
|
|
22
|
+
"Programming Language :: Python :: 3.10",
|
|
23
|
+
"Programming Language :: Python :: 3.11",
|
|
24
|
+
"Programming Language :: Python :: 3.12",
|
|
25
|
+
"Programming Language :: Python :: 3.13",
|
|
26
|
+
"Topic :: Multimedia :: Sound/Audio",
|
|
27
|
+
"Topic :: Multimedia :: Sound/Audio :: Mixers",
|
|
28
|
+
]
|
|
29
|
+
dependencies = ["textual>=0.80.0"]
|
|
30
|
+
|
|
31
|
+
[project.urls]
|
|
32
|
+
Homepage = "https://github.com/koltyj/SSL"
|
|
33
|
+
Repository = "https://github.com/koltyj/SSL"
|
|
34
|
+
Issues = "https://github.com/koltyj/SSL/issues"
|
|
35
|
+
|
|
36
|
+
[project.scripts]
|
|
37
|
+
ssl-console = "ssl_matrix_client.cli:main"
|
|
38
|
+
|
|
39
|
+
[project.optional-dependencies]
|
|
40
|
+
dev = ["pytest>=7,<9", "pytest-asyncio>=0.23", "ruff>=0.9", "pre-commit>=3,<5"]
|
|
41
|
+
|
|
42
|
+
[tool.hatch.build.targets.sdist]
|
|
43
|
+
include = ["ssl-matrix-client/"]
|
|
44
|
+
|
|
45
|
+
[tool.hatch.build.targets.wheel]
|
|
46
|
+
packages = ["ssl-matrix-client"]
|
|
47
|
+
|
|
48
|
+
[tool.hatch.build.targets.wheel.sources]
|
|
49
|
+
"ssl-matrix-client" = "ssl_matrix_client"
|
|
50
|
+
|
|
51
|
+
[tool.pytest.ini_options]
|
|
52
|
+
testpaths = ["tests"]
|
|
53
|
+
|
|
54
|
+
[tool.ruff]
|
|
55
|
+
target-version = "py39"
|
|
56
|
+
line-length = 100
|
|
57
|
+
|
|
58
|
+
[tool.ruff.lint]
|
|
59
|
+
select = ["E", "W", "F", "I", "B", "SIM", "RUF"]
|
|
60
|
+
ignore = ["E501", "SIM105"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""SSL Matrix Console remote control client."""
|