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.
Files changed (29) hide show
  1. ssl_console_client-0.1.0/.gitignore +29 -0
  2. ssl_console_client-0.1.0/LICENSE +21 -0
  3. ssl_console_client-0.1.0/PKG-INFO +249 -0
  4. ssl_console_client-0.1.0/README.md +216 -0
  5. ssl_console_client-0.1.0/pyproject.toml +60 -0
  6. ssl_console_client-0.1.0/ssl-matrix-client/__init__.py +1 -0
  7. ssl_console_client-0.1.0/ssl-matrix-client/__main__.py +12 -0
  8. ssl_console_client-0.1.0/ssl-matrix-client/audit.py +310 -0
  9. ssl_console_client-0.1.0/ssl-matrix-client/cli.py +1691 -0
  10. ssl_console_client-0.1.0/ssl-matrix-client/client.py +786 -0
  11. ssl_console_client-0.1.0/ssl-matrix-client/handlers/__init__.py +1 -0
  12. ssl_console_client-0.1.0/ssl-matrix-client/handlers/chan_presets.py +75 -0
  13. ssl_console_client-0.1.0/ssl-matrix-client/handlers/channels.py +92 -0
  14. ssl_console_client-0.1.0/ssl-matrix-client/handlers/connection.py +55 -0
  15. ssl_console_client-0.1.0/ssl-matrix-client/handlers/delta.py +63 -0
  16. ssl_console_client-0.1.0/ssl-matrix-client/handlers/profiles.py +123 -0
  17. ssl_console_client-0.1.0/ssl-matrix-client/handlers/projects.py +179 -0
  18. ssl_console_client-0.1.0/ssl-matrix-client/handlers/routing.py +272 -0
  19. ssl_console_client-0.1.0/ssl-matrix-client/handlers/softkeys.py +463 -0
  20. ssl_console_client-0.1.0/ssl-matrix-client/handlers/total_recall.py +136 -0
  21. ssl_console_client-0.1.0/ssl-matrix-client/handlers/xpatch.py +435 -0
  22. ssl_console_client-0.1.0/ssl-matrix-client/models.py +395 -0
  23. ssl_console_client-0.1.0/ssl-matrix-client/protocol.py +540 -0
  24. ssl_console_client-0.1.0/ssl-matrix-client/ssl_theme.tcss +98 -0
  25. ssl_console_client-0.1.0/ssl-matrix-client/templates.py +438 -0
  26. ssl_console_client-0.1.0/ssl-matrix-client/tui.py +355 -0
  27. ssl_console_client-0.1.0/ssl-matrix-client/tui_commands.py +619 -0
  28. ssl_console_client-0.1.0/ssl-matrix-client/tui_views.py +139 -0
  29. 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
+ ![Python 3.9+](https://img.shields.io/badge/python-3.9%2B-blue)
39
+ ![License: MIT](https://img.shields.io/badge/license-MIT-green)
40
+ ![Tests](https://img.shields.io/badge/tests-274%20passing-brightgreen)
41
+
42
+ ![TUI Screenshot](docs/screenshots/tui-channels.svg)
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
+ ![Python 3.9+](https://img.shields.io/badge/python-3.9%2B-blue)
6
+ ![License: MIT](https://img.shields.io/badge/license-MIT-green)
7
+ ![Tests](https://img.shields.io/badge/tests-274%20passing-brightgreen)
8
+
9
+ ![TUI Screenshot](docs/screenshots/tui-channels.svg)
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."""
@@ -0,0 +1,12 @@
1
+ """Allow running as: python3 -m ssl-matrix-client"""
2
+
3
+ import sys
4
+
5
+ if len(sys.argv) > 1 and sys.argv[1] == "tui":
6
+ from .tui import main as tui_main
7
+
8
+ tui_main(sys.argv[2:])
9
+ else:
10
+ from .cli import main
11
+
12
+ main()