helixgen 0.19.1__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.
- helixgen-0.19.1/LICENSE +21 -0
- helixgen-0.19.1/PKG-INFO +132 -0
- helixgen-0.19.1/README.md +100 -0
- helixgen-0.19.1/helixgen.egg-info/PKG-INFO +132 -0
- helixgen-0.19.1/helixgen.egg-info/SOURCES.txt +137 -0
- helixgen-0.19.1/helixgen.egg-info/dependency_links.txt +1 -0
- helixgen-0.19.1/helixgen.egg-info/entry_points.txt +2 -0
- helixgen-0.19.1/helixgen.egg-info/requires.txt +12 -0
- helixgen-0.19.1/helixgen.egg-info/top_level.txt +2 -0
- helixgen-0.19.1/mcp_server/__init__.py +9 -0
- helixgen-0.19.1/mcp_server/__main__.py +66 -0
- helixgen-0.19.1/mcp_server/data/__init__.py +0 -0
- helixgen-0.19.1/mcp_server/server.py +1054 -0
- helixgen-0.19.1/mcp_server/tools.py +1516 -0
- helixgen-0.19.1/pyproject.toml +60 -0
- helixgen-0.19.1/setup.cfg +4 -0
- helixgen-0.19.1/src/helixgen/__init__.py +1 -0
- helixgen-0.19.1/src/helixgen/bootstrap.py +65 -0
- helixgen-0.19.1/src/helixgen/chassis.py +66 -0
- helixgen-0.19.1/src/helixgen/cli.py +649 -0
- helixgen-0.19.1/src/helixgen/cli_device.py +2212 -0
- helixgen-0.19.1/src/helixgen/controllers.py +369 -0
- helixgen-0.19.1/src/helixgen/device/__init__.py +39 -0
- helixgen-0.19.1/src/helixgen/device/_defs_data.json +1 -0
- helixgen-0.19.1/src/helixgen/device/_modelmap.json +3347 -0
- helixgen-0.19.1/src/helixgen/device/_settings_pages.json +176 -0
- helixgen-0.19.1/src/helixgen/device/backup.py +187 -0
- helixgen-0.19.1/src/helixgen/device/bridge.py +549 -0
- helixgen-0.19.1/src/helixgen/device/client.py +1353 -0
- helixgen-0.19.1/src/helixgen/device/content.py +131 -0
- helixgen-0.19.1/src/helixgen/device/defs.py +130 -0
- helixgen-0.19.1/src/helixgen/device/globaleq.py +220 -0
- helixgen-0.19.1/src/helixgen/device/hss.py +794 -0
- helixgen-0.19.1/src/helixgen/device/ir_upload.py +139 -0
- helixgen-0.19.1/src/helixgen/device/irmd.py +51 -0
- helixgen-0.19.1/src/helixgen/device/maintenance.py +616 -0
- helixgen-0.19.1/src/helixgen/device/manifest.py +559 -0
- helixgen-0.19.1/src/helixgen/device/meters.py +100 -0
- helixgen-0.19.1/src/helixgen/device/modelmap.py +81 -0
- helixgen-0.19.1/src/helixgen/device/osc.py +106 -0
- helixgen-0.19.1/src/helixgen/device/reorder.py +261 -0
- helixgen-0.19.1/src/helixgen/device/setlist_sync.py +561 -0
- helixgen-0.19.1/src/helixgen/device/settings.py +266 -0
- helixgen-0.19.1/src/helixgen/device/sftp.py +309 -0
- helixgen-0.19.1/src/helixgen/device/subscribe.py +230 -0
- helixgen-0.19.1/src/helixgen/device/transcode.py +1627 -0
- helixgen-0.19.1/src/helixgen/device/tuner.py +123 -0
- helixgen-0.19.1/src/helixgen/flowparams.py +264 -0
- helixgen-0.19.1/src/helixgen/generate.py +893 -0
- helixgen-0.19.1/src/helixgen/hsp.py +194 -0
- helixgen-0.19.1/src/helixgen/ingest.py +434 -0
- helixgen-0.19.1/src/helixgen/ir.py +479 -0
- helixgen-0.19.1/src/helixgen/irhash_cache.py +167 -0
- helixgen-0.19.1/src/helixgen/library.py +282 -0
- helixgen-0.19.1/src/helixgen/mutate.py +1353 -0
- helixgen-0.19.1/src/helixgen/preferences.py +322 -0
- helixgen-0.19.1/src/helixgen/recipe.py +402 -0
- helixgen-0.19.1/src/helixgen/spec.py +1125 -0
- helixgen-0.19.1/src/helixgen/view.py +1009 -0
- helixgen-0.19.1/tests/test_bootstrap.py +67 -0
- helixgen-0.19.1/tests/test_chassis.py +108 -0
- helixgen-0.19.1/tests/test_cli.py +245 -0
- helixgen-0.19.1/tests/test_cli_library.py +75 -0
- helixgen-0.19.1/tests/test_commands.py +416 -0
- helixgen-0.19.1/tests/test_controller_depth.py +461 -0
- helixgen-0.19.1/tests/test_controllers.py +242 -0
- helixgen-0.19.1/tests/test_decompile.py +297 -0
- helixgen-0.19.1/tests/test_decompile_acceptance.py +61 -0
- helixgen-0.19.1/tests/test_decompile_advanced.py +599 -0
- helixgen-0.19.1/tests/test_decompile_sonic_fidelity.py +149 -0
- helixgen-0.19.1/tests/test_device_backup.py +159 -0
- helixgen-0.19.1/tests/test_device_bridge.py +89 -0
- helixgen-0.19.1/tests/test_device_cli.py +1201 -0
- helixgen-0.19.1/tests/test_device_client.py +1305 -0
- helixgen-0.19.1/tests/test_device_content.py +118 -0
- helixgen-0.19.1/tests/test_device_defs.py +98 -0
- helixgen-0.19.1/tests/test_device_extra_import_surface.py +81 -0
- helixgen-0.19.1/tests/test_device_globaleq.py +149 -0
- helixgen-0.19.1/tests/test_device_irmd.py +52 -0
- helixgen-0.19.1/tests/test_device_live.py +107 -0
- helixgen-0.19.1/tests/test_device_liveops.py +119 -0
- helixgen-0.19.1/tests/test_device_maintenance.py +724 -0
- helixgen-0.19.1/tests/test_device_meters.py +78 -0
- helixgen-0.19.1/tests/test_device_modelmap.py +111 -0
- helixgen-0.19.1/tests/test_device_osc.py +119 -0
- helixgen-0.19.1/tests/test_device_reorder.py +596 -0
- helixgen-0.19.1/tests/test_device_settings.py +210 -0
- helixgen-0.19.1/tests/test_device_sftp.py +138 -0
- helixgen-0.19.1/tests/test_device_slots_cli.py +247 -0
- helixgen-0.19.1/tests/test_device_subscribe.py +253 -0
- helixgen-0.19.1/tests/test_device_tuner.py +78 -0
- helixgen-0.19.1/tests/test_flowparams.py +166 -0
- helixgen-0.19.1/tests/test_generate.py +1136 -0
- helixgen-0.19.1/tests/test_generate_combined.py +80 -0
- helixgen-0.19.1/tests/test_generate_expression.py +116 -0
- helixgen-0.19.1/tests/test_generate_flow.py +228 -0
- helixgen-0.19.1/tests/test_generate_footswitches.py +185 -0
- helixgen-0.19.1/tests/test_generate_input.py +96 -0
- helixgen-0.19.1/tests/test_generate_snapshots.py +58 -0
- helixgen-0.19.1/tests/test_hsp.py +294 -0
- helixgen-0.19.1/tests/test_hss.py +812 -0
- helixgen-0.19.1/tests/test_hss_cli.py +402 -0
- helixgen-0.19.1/tests/test_ingest.py +450 -0
- helixgen-0.19.1/tests/test_input_reshape.py +45 -0
- helixgen-0.19.1/tests/test_ir_cache_cli.py +71 -0
- helixgen-0.19.1/tests/test_ir_cli.py +546 -0
- helixgen-0.19.1/tests/test_ir_generate.py +231 -0
- helixgen-0.19.1/tests/test_ir_ingest.py +80 -0
- helixgen-0.19.1/tests/test_ir_mapping.py +156 -0
- helixgen-0.19.1/tests/test_ir_preset.py +65 -0
- helixgen-0.19.1/tests/test_ir_spec.py +40 -0
- helixgen-0.19.1/tests/test_ir_upload.py +252 -0
- helixgen-0.19.1/tests/test_irhash_cache.py +263 -0
- helixgen-0.19.1/tests/test_library.py +315 -0
- helixgen-0.19.1/tests/test_manifest.py +430 -0
- helixgen-0.19.1/tests/test_manifest_ops.py +89 -0
- helixgen-0.19.1/tests/test_manifest_v2.py +101 -0
- helixgen-0.19.1/tests/test_midi_controllers.py +435 -0
- helixgen-0.19.1/tests/test_mutate.py +939 -0
- helixgen-0.19.1/tests/test_mutate_cli.py +120 -0
- helixgen-0.19.1/tests/test_mutate_flow.py +140 -0
- helixgen-0.19.1/tests/test_preferences.py +533 -0
- helixgen-0.19.1/tests/test_recipe.py +84 -0
- helixgen-0.19.1/tests/test_roundtrip.py +107 -0
- helixgen-0.19.1/tests/test_setlist_sync.py +1092 -0
- helixgen-0.19.1/tests/test_setlist_sync_mirror.py +31 -0
- helixgen-0.19.1/tests/test_spec.py +443 -0
- helixgen-0.19.1/tests/test_spec_commands.py +143 -0
- helixgen-0.19.1/tests/test_spec_expression.py +141 -0
- helixgen-0.19.1/tests/test_spec_flow.py +276 -0
- helixgen-0.19.1/tests/test_spec_footswitches.py +104 -0
- helixgen-0.19.1/tests/test_spec_input.py +35 -0
- helixgen-0.19.1/tests/test_spec_midi.py +159 -0
- helixgen-0.19.1/tests/test_trails_fxloop.py +86 -0
- helixgen-0.19.1/tests/test_transcode.py +1118 -0
- helixgen-0.19.1/tests/test_transcode_flow.py +142 -0
- helixgen-0.19.1/tests/test_view.py +205 -0
- helixgen-0.19.1/tests/test_view_cli.py +47 -0
- helixgen-0.19.1/tests/test_view_flow.py +184 -0
helixgen-0.19.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Mike Shea
|
|
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.
|
helixgen-0.19.1/PKG-INFO
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: helixgen
|
|
3
|
+
Version: 0.19.1
|
|
4
|
+
Summary: Generate Line 6 Helix Stadium .hsp / legacy .hlx preset files from JSON tone specs.
|
|
5
|
+
Author: Mike Shea
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/sheax0r/helixgen-core
|
|
8
|
+
Project-URL: Repository, https://github.com/sheax0r/helixgen-core
|
|
9
|
+
Project-URL: Issues, https://github.com/sheax0r/helixgen-core/issues
|
|
10
|
+
Keywords: line6,helix,guitar,preset,tone,hsp,impulse-response
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Topic :: Multimedia :: Sound/Audio
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Requires-Dist: click>=8.1
|
|
23
|
+
Provides-Extra: dev
|
|
24
|
+
Requires-Dist: pytest>=7.4; extra == "dev"
|
|
25
|
+
Provides-Extra: mcp
|
|
26
|
+
Requires-Dist: mcp<2.0,>=1.0; extra == "mcp"
|
|
27
|
+
Provides-Extra: device
|
|
28
|
+
Requires-Dist: pyzmq>=25; extra == "device"
|
|
29
|
+
Requires-Dist: msgpack>=1; extra == "device"
|
|
30
|
+
Requires-Dist: paramiko>=3.4; extra == "device"
|
|
31
|
+
Dynamic: license-file
|
|
32
|
+
|
|
33
|
+
# helixgen-core
|
|
34
|
+
|
|
35
|
+
The core Python library + CLI behind **helixgen**: generate Line 6 Helix
|
|
36
|
+
Stadium `.hsp` presets (and legacy `.hlx`) from JSON tone recipes, edit them
|
|
37
|
+
surgically in place, manage impulse responses by Stadium-exact content hash,
|
|
38
|
+
and control a Helix Stadium directly over the LAN (OSC-over-ZeroMQ — no
|
|
39
|
+
editor app).
|
|
40
|
+
|
|
41
|
+
> ⚠️ **Unofficial tool — use at your own risk.** Not affiliated with or
|
|
42
|
+
> endorsed by Line 6 / Yamaha (see [Trademark notice](#trademark-notice)).
|
|
43
|
+
> Loading any user-generated preset on your hardware carries risk — rejected
|
|
44
|
+
> loads, corrupted preset slots, on-device crashes. Review what you import.
|
|
45
|
+
> The MIT [LICENSE](LICENSE) disclaims all warranty.
|
|
46
|
+
|
|
47
|
+
## Repo family
|
|
48
|
+
|
|
49
|
+
| Repo | What it is |
|
|
50
|
+
|---|---|
|
|
51
|
+
| **helixgen-core** (this repo) | The `helixgen` Python package: libs, CLI, MCP server |
|
|
52
|
+
| [helixgen](https://github.com/sheax0r/helixgen) | The Claude Code plugin — `/tone`, `/setup`, `/device` skills + marketplace |
|
|
53
|
+
| [helixgen-tui](https://github.com/sheax0r/helixgen-tui) | Terminal UI for tones, setlists, and device control |
|
|
54
|
+
|
|
55
|
+
Want natural-language preset generation inside Claude Code? Install the
|
|
56
|
+
[plugin](https://github.com/sheax0r/helixgen) — you don't need this repo
|
|
57
|
+
directly. This repo is for using the CLI/library standalone, or developing
|
|
58
|
+
against it.
|
|
59
|
+
|
|
60
|
+
## Install
|
|
61
|
+
|
|
62
|
+
Requires **Python 3.11+**. Not yet published to PyPI (coming); install from
|
|
63
|
+
source for now:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
pip install 'helixgen[device] @ git+https://github.com/sheax0r/helixgen-core'
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Extras: `device` (network device control: pyzmq, msgpack, paramiko), `mcp`
|
|
70
|
+
(the MCP server), `dev` (pytest).
|
|
71
|
+
|
|
72
|
+
A standalone install starts with an empty block library — seed it first:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
helixgen bootstrap
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Computing IR hashes from WAVs (`register-irs <wav>`, `ir-scan`) additionally
|
|
79
|
+
needs **libsndfile** (`brew install libsndfile` / `apt install libsndfile1`).
|
|
80
|
+
|
|
81
|
+
## Quick tour
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
helixgen list-blocks --category amp # browse the block library
|
|
85
|
+
helixgen show-block "Brit Plexi Brt" # exact param names/ranges
|
|
86
|
+
helixgen generate recipe.json -o tone.hsp # author a preset from a recipe
|
|
87
|
+
helixgen set-param tone.hsp "Tape Echo Stereo" Mix 0.3 # surgical edit
|
|
88
|
+
helixgen view tone.hsp # read a .hsp back as a recipe
|
|
89
|
+
helixgen device list # talk to a Stadium on the LAN
|
|
90
|
+
helixgen device sync my-setlist # mirror a managed setlist onto it
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Full references:
|
|
94
|
+
|
|
95
|
+
- [`docs/CLI.md`](docs/CLI.md) — every verb, including the complete
|
|
96
|
+
`helixgen device` reference.
|
|
97
|
+
- [`docs/recipe-reference.md`](docs/recipe-reference.md) — the exhaustive
|
|
98
|
+
recipe schema (paths, splits, snapshots, footswitches, expression, MIDI,
|
|
99
|
+
Command Center, IRs).
|
|
100
|
+
- [`docs/ir-hash-algorithm.md`](docs/ir-hash-algorithm.md) — the
|
|
101
|
+
reverse-engineered Stadium IR hash, field-validated.
|
|
102
|
+
- [`docs/helix-protocol.md`](docs/helix-protocol.md) — the network protocol.
|
|
103
|
+
|
|
104
|
+
## Tests
|
|
105
|
+
|
|
106
|
+
Run from a source checkout with the package on `PYTHONPATH`:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
PYTHONPATH=$PWD/src python -m pytest
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Acknowledgments
|
|
113
|
+
|
|
114
|
+
helixgen leans **heavily** on
|
|
115
|
+
[**sensorium/phelix**](https://github.com/sensorium/phelix) — a
|
|
116
|
+
community-maintained, hand-curated repository of Helix block JSON files. The
|
|
117
|
+
`helixgen bootstrap` command clones phelix and ingests its `blocks/`
|
|
118
|
+
directory; without that pre-extracted catalog the cold-start experience of
|
|
119
|
+
this tool would be considerably worse.
|
|
120
|
+
|
|
121
|
+
## Trademark notice
|
|
122
|
+
|
|
123
|
+
helixgen is an unofficial community project. **Line 6**, **Helix**, **HX**,
|
|
124
|
+
and related product names are trademarks of **Yamaha Guitar Group, Inc.**
|
|
125
|
+
helixgen is not affiliated with, endorsed by, or sponsored by Line 6 or
|
|
126
|
+
Yamaha. References in this project to Line 6 hardware, file formats (`.hlx`,
|
|
127
|
+
`.hsp`), and model identifiers are descriptive — helixgen generates files
|
|
128
|
+
intended to be compatible with Line 6 Helix devices but is not a Line 6
|
|
129
|
+
product.
|
|
130
|
+
|
|
131
|
+
If you are a representative of Line 6 / Yamaha and have concerns about this
|
|
132
|
+
project's name or scope, please open an issue.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# helixgen-core
|
|
2
|
+
|
|
3
|
+
The core Python library + CLI behind **helixgen**: generate Line 6 Helix
|
|
4
|
+
Stadium `.hsp` presets (and legacy `.hlx`) from JSON tone recipes, edit them
|
|
5
|
+
surgically in place, manage impulse responses by Stadium-exact content hash,
|
|
6
|
+
and control a Helix Stadium directly over the LAN (OSC-over-ZeroMQ — no
|
|
7
|
+
editor app).
|
|
8
|
+
|
|
9
|
+
> ⚠️ **Unofficial tool — use at your own risk.** Not affiliated with or
|
|
10
|
+
> endorsed by Line 6 / Yamaha (see [Trademark notice](#trademark-notice)).
|
|
11
|
+
> Loading any user-generated preset on your hardware carries risk — rejected
|
|
12
|
+
> loads, corrupted preset slots, on-device crashes. Review what you import.
|
|
13
|
+
> The MIT [LICENSE](LICENSE) disclaims all warranty.
|
|
14
|
+
|
|
15
|
+
## Repo family
|
|
16
|
+
|
|
17
|
+
| Repo | What it is |
|
|
18
|
+
|---|---|
|
|
19
|
+
| **helixgen-core** (this repo) | The `helixgen` Python package: libs, CLI, MCP server |
|
|
20
|
+
| [helixgen](https://github.com/sheax0r/helixgen) | The Claude Code plugin — `/tone`, `/setup`, `/device` skills + marketplace |
|
|
21
|
+
| [helixgen-tui](https://github.com/sheax0r/helixgen-tui) | Terminal UI for tones, setlists, and device control |
|
|
22
|
+
|
|
23
|
+
Want natural-language preset generation inside Claude Code? Install the
|
|
24
|
+
[plugin](https://github.com/sheax0r/helixgen) — you don't need this repo
|
|
25
|
+
directly. This repo is for using the CLI/library standalone, or developing
|
|
26
|
+
against it.
|
|
27
|
+
|
|
28
|
+
## Install
|
|
29
|
+
|
|
30
|
+
Requires **Python 3.11+**. Not yet published to PyPI (coming); install from
|
|
31
|
+
source for now:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pip install 'helixgen[device] @ git+https://github.com/sheax0r/helixgen-core'
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Extras: `device` (network device control: pyzmq, msgpack, paramiko), `mcp`
|
|
38
|
+
(the MCP server), `dev` (pytest).
|
|
39
|
+
|
|
40
|
+
A standalone install starts with an empty block library — seed it first:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
helixgen bootstrap
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Computing IR hashes from WAVs (`register-irs <wav>`, `ir-scan`) additionally
|
|
47
|
+
needs **libsndfile** (`brew install libsndfile` / `apt install libsndfile1`).
|
|
48
|
+
|
|
49
|
+
## Quick tour
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
helixgen list-blocks --category amp # browse the block library
|
|
53
|
+
helixgen show-block "Brit Plexi Brt" # exact param names/ranges
|
|
54
|
+
helixgen generate recipe.json -o tone.hsp # author a preset from a recipe
|
|
55
|
+
helixgen set-param tone.hsp "Tape Echo Stereo" Mix 0.3 # surgical edit
|
|
56
|
+
helixgen view tone.hsp # read a .hsp back as a recipe
|
|
57
|
+
helixgen device list # talk to a Stadium on the LAN
|
|
58
|
+
helixgen device sync my-setlist # mirror a managed setlist onto it
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Full references:
|
|
62
|
+
|
|
63
|
+
- [`docs/CLI.md`](docs/CLI.md) — every verb, including the complete
|
|
64
|
+
`helixgen device` reference.
|
|
65
|
+
- [`docs/recipe-reference.md`](docs/recipe-reference.md) — the exhaustive
|
|
66
|
+
recipe schema (paths, splits, snapshots, footswitches, expression, MIDI,
|
|
67
|
+
Command Center, IRs).
|
|
68
|
+
- [`docs/ir-hash-algorithm.md`](docs/ir-hash-algorithm.md) — the
|
|
69
|
+
reverse-engineered Stadium IR hash, field-validated.
|
|
70
|
+
- [`docs/helix-protocol.md`](docs/helix-protocol.md) — the network protocol.
|
|
71
|
+
|
|
72
|
+
## Tests
|
|
73
|
+
|
|
74
|
+
Run from a source checkout with the package on `PYTHONPATH`:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
PYTHONPATH=$PWD/src python -m pytest
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Acknowledgments
|
|
81
|
+
|
|
82
|
+
helixgen leans **heavily** on
|
|
83
|
+
[**sensorium/phelix**](https://github.com/sensorium/phelix) — a
|
|
84
|
+
community-maintained, hand-curated repository of Helix block JSON files. The
|
|
85
|
+
`helixgen bootstrap` command clones phelix and ingests its `blocks/`
|
|
86
|
+
directory; without that pre-extracted catalog the cold-start experience of
|
|
87
|
+
this tool would be considerably worse.
|
|
88
|
+
|
|
89
|
+
## Trademark notice
|
|
90
|
+
|
|
91
|
+
helixgen is an unofficial community project. **Line 6**, **Helix**, **HX**,
|
|
92
|
+
and related product names are trademarks of **Yamaha Guitar Group, Inc.**
|
|
93
|
+
helixgen is not affiliated with, endorsed by, or sponsored by Line 6 or
|
|
94
|
+
Yamaha. References in this project to Line 6 hardware, file formats (`.hlx`,
|
|
95
|
+
`.hsp`), and model identifiers are descriptive — helixgen generates files
|
|
96
|
+
intended to be compatible with Line 6 Helix devices but is not a Line 6
|
|
97
|
+
product.
|
|
98
|
+
|
|
99
|
+
If you are a representative of Line 6 / Yamaha and have concerns about this
|
|
100
|
+
project's name or scope, please open an issue.
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: helixgen
|
|
3
|
+
Version: 0.19.1
|
|
4
|
+
Summary: Generate Line 6 Helix Stadium .hsp / legacy .hlx preset files from JSON tone specs.
|
|
5
|
+
Author: Mike Shea
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/sheax0r/helixgen-core
|
|
8
|
+
Project-URL: Repository, https://github.com/sheax0r/helixgen-core
|
|
9
|
+
Project-URL: Issues, https://github.com/sheax0r/helixgen-core/issues
|
|
10
|
+
Keywords: line6,helix,guitar,preset,tone,hsp,impulse-response
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Topic :: Multimedia :: Sound/Audio
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Requires-Dist: click>=8.1
|
|
23
|
+
Provides-Extra: dev
|
|
24
|
+
Requires-Dist: pytest>=7.4; extra == "dev"
|
|
25
|
+
Provides-Extra: mcp
|
|
26
|
+
Requires-Dist: mcp<2.0,>=1.0; extra == "mcp"
|
|
27
|
+
Provides-Extra: device
|
|
28
|
+
Requires-Dist: pyzmq>=25; extra == "device"
|
|
29
|
+
Requires-Dist: msgpack>=1; extra == "device"
|
|
30
|
+
Requires-Dist: paramiko>=3.4; extra == "device"
|
|
31
|
+
Dynamic: license-file
|
|
32
|
+
|
|
33
|
+
# helixgen-core
|
|
34
|
+
|
|
35
|
+
The core Python library + CLI behind **helixgen**: generate Line 6 Helix
|
|
36
|
+
Stadium `.hsp` presets (and legacy `.hlx`) from JSON tone recipes, edit them
|
|
37
|
+
surgically in place, manage impulse responses by Stadium-exact content hash,
|
|
38
|
+
and control a Helix Stadium directly over the LAN (OSC-over-ZeroMQ — no
|
|
39
|
+
editor app).
|
|
40
|
+
|
|
41
|
+
> ⚠️ **Unofficial tool — use at your own risk.** Not affiliated with or
|
|
42
|
+
> endorsed by Line 6 / Yamaha (see [Trademark notice](#trademark-notice)).
|
|
43
|
+
> Loading any user-generated preset on your hardware carries risk — rejected
|
|
44
|
+
> loads, corrupted preset slots, on-device crashes. Review what you import.
|
|
45
|
+
> The MIT [LICENSE](LICENSE) disclaims all warranty.
|
|
46
|
+
|
|
47
|
+
## Repo family
|
|
48
|
+
|
|
49
|
+
| Repo | What it is |
|
|
50
|
+
|---|---|
|
|
51
|
+
| **helixgen-core** (this repo) | The `helixgen` Python package: libs, CLI, MCP server |
|
|
52
|
+
| [helixgen](https://github.com/sheax0r/helixgen) | The Claude Code plugin — `/tone`, `/setup`, `/device` skills + marketplace |
|
|
53
|
+
| [helixgen-tui](https://github.com/sheax0r/helixgen-tui) | Terminal UI for tones, setlists, and device control |
|
|
54
|
+
|
|
55
|
+
Want natural-language preset generation inside Claude Code? Install the
|
|
56
|
+
[plugin](https://github.com/sheax0r/helixgen) — you don't need this repo
|
|
57
|
+
directly. This repo is for using the CLI/library standalone, or developing
|
|
58
|
+
against it.
|
|
59
|
+
|
|
60
|
+
## Install
|
|
61
|
+
|
|
62
|
+
Requires **Python 3.11+**. Not yet published to PyPI (coming); install from
|
|
63
|
+
source for now:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
pip install 'helixgen[device] @ git+https://github.com/sheax0r/helixgen-core'
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Extras: `device` (network device control: pyzmq, msgpack, paramiko), `mcp`
|
|
70
|
+
(the MCP server), `dev` (pytest).
|
|
71
|
+
|
|
72
|
+
A standalone install starts with an empty block library — seed it first:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
helixgen bootstrap
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Computing IR hashes from WAVs (`register-irs <wav>`, `ir-scan`) additionally
|
|
79
|
+
needs **libsndfile** (`brew install libsndfile` / `apt install libsndfile1`).
|
|
80
|
+
|
|
81
|
+
## Quick tour
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
helixgen list-blocks --category amp # browse the block library
|
|
85
|
+
helixgen show-block "Brit Plexi Brt" # exact param names/ranges
|
|
86
|
+
helixgen generate recipe.json -o tone.hsp # author a preset from a recipe
|
|
87
|
+
helixgen set-param tone.hsp "Tape Echo Stereo" Mix 0.3 # surgical edit
|
|
88
|
+
helixgen view tone.hsp # read a .hsp back as a recipe
|
|
89
|
+
helixgen device list # talk to a Stadium on the LAN
|
|
90
|
+
helixgen device sync my-setlist # mirror a managed setlist onto it
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Full references:
|
|
94
|
+
|
|
95
|
+
- [`docs/CLI.md`](docs/CLI.md) — every verb, including the complete
|
|
96
|
+
`helixgen device` reference.
|
|
97
|
+
- [`docs/recipe-reference.md`](docs/recipe-reference.md) — the exhaustive
|
|
98
|
+
recipe schema (paths, splits, snapshots, footswitches, expression, MIDI,
|
|
99
|
+
Command Center, IRs).
|
|
100
|
+
- [`docs/ir-hash-algorithm.md`](docs/ir-hash-algorithm.md) — the
|
|
101
|
+
reverse-engineered Stadium IR hash, field-validated.
|
|
102
|
+
- [`docs/helix-protocol.md`](docs/helix-protocol.md) — the network protocol.
|
|
103
|
+
|
|
104
|
+
## Tests
|
|
105
|
+
|
|
106
|
+
Run from a source checkout with the package on `PYTHONPATH`:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
PYTHONPATH=$PWD/src python -m pytest
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Acknowledgments
|
|
113
|
+
|
|
114
|
+
helixgen leans **heavily** on
|
|
115
|
+
[**sensorium/phelix**](https://github.com/sensorium/phelix) — a
|
|
116
|
+
community-maintained, hand-curated repository of Helix block JSON files. The
|
|
117
|
+
`helixgen bootstrap` command clones phelix and ingests its `blocks/`
|
|
118
|
+
directory; without that pre-extracted catalog the cold-start experience of
|
|
119
|
+
this tool would be considerably worse.
|
|
120
|
+
|
|
121
|
+
## Trademark notice
|
|
122
|
+
|
|
123
|
+
helixgen is an unofficial community project. **Line 6**, **Helix**, **HX**,
|
|
124
|
+
and related product names are trademarks of **Yamaha Guitar Group, Inc.**
|
|
125
|
+
helixgen is not affiliated with, endorsed by, or sponsored by Line 6 or
|
|
126
|
+
Yamaha. References in this project to Line 6 hardware, file formats (`.hlx`,
|
|
127
|
+
`.hsp`), and model identifiers are descriptive — helixgen generates files
|
|
128
|
+
intended to be compatible with Line 6 Helix devices but is not a Line 6
|
|
129
|
+
product.
|
|
130
|
+
|
|
131
|
+
If you are a representative of Line 6 / Yamaha and have concerns about this
|
|
132
|
+
project's name or scope, please open an issue.
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
helixgen.egg-info/PKG-INFO
|
|
5
|
+
helixgen.egg-info/SOURCES.txt
|
|
6
|
+
helixgen.egg-info/dependency_links.txt
|
|
7
|
+
helixgen.egg-info/entry_points.txt
|
|
8
|
+
helixgen.egg-info/requires.txt
|
|
9
|
+
helixgen.egg-info/top_level.txt
|
|
10
|
+
mcp_server/__init__.py
|
|
11
|
+
mcp_server/__main__.py
|
|
12
|
+
mcp_server/server.py
|
|
13
|
+
mcp_server/tools.py
|
|
14
|
+
mcp_server/data/__init__.py
|
|
15
|
+
src/helixgen/__init__.py
|
|
16
|
+
src/helixgen/bootstrap.py
|
|
17
|
+
src/helixgen/chassis.py
|
|
18
|
+
src/helixgen/cli.py
|
|
19
|
+
src/helixgen/cli_device.py
|
|
20
|
+
src/helixgen/controllers.py
|
|
21
|
+
src/helixgen/flowparams.py
|
|
22
|
+
src/helixgen/generate.py
|
|
23
|
+
src/helixgen/hsp.py
|
|
24
|
+
src/helixgen/ingest.py
|
|
25
|
+
src/helixgen/ir.py
|
|
26
|
+
src/helixgen/irhash_cache.py
|
|
27
|
+
src/helixgen/library.py
|
|
28
|
+
src/helixgen/mutate.py
|
|
29
|
+
src/helixgen/preferences.py
|
|
30
|
+
src/helixgen/recipe.py
|
|
31
|
+
src/helixgen/spec.py
|
|
32
|
+
src/helixgen/view.py
|
|
33
|
+
src/helixgen/device/__init__.py
|
|
34
|
+
src/helixgen/device/_defs_data.json
|
|
35
|
+
src/helixgen/device/_modelmap.json
|
|
36
|
+
src/helixgen/device/_settings_pages.json
|
|
37
|
+
src/helixgen/device/backup.py
|
|
38
|
+
src/helixgen/device/bridge.py
|
|
39
|
+
src/helixgen/device/client.py
|
|
40
|
+
src/helixgen/device/content.py
|
|
41
|
+
src/helixgen/device/defs.py
|
|
42
|
+
src/helixgen/device/globaleq.py
|
|
43
|
+
src/helixgen/device/hss.py
|
|
44
|
+
src/helixgen/device/ir_upload.py
|
|
45
|
+
src/helixgen/device/irmd.py
|
|
46
|
+
src/helixgen/device/maintenance.py
|
|
47
|
+
src/helixgen/device/manifest.py
|
|
48
|
+
src/helixgen/device/meters.py
|
|
49
|
+
src/helixgen/device/modelmap.py
|
|
50
|
+
src/helixgen/device/osc.py
|
|
51
|
+
src/helixgen/device/reorder.py
|
|
52
|
+
src/helixgen/device/setlist_sync.py
|
|
53
|
+
src/helixgen/device/settings.py
|
|
54
|
+
src/helixgen/device/sftp.py
|
|
55
|
+
src/helixgen/device/subscribe.py
|
|
56
|
+
src/helixgen/device/transcode.py
|
|
57
|
+
src/helixgen/device/tuner.py
|
|
58
|
+
tests/test_bootstrap.py
|
|
59
|
+
tests/test_chassis.py
|
|
60
|
+
tests/test_cli.py
|
|
61
|
+
tests/test_cli_library.py
|
|
62
|
+
tests/test_commands.py
|
|
63
|
+
tests/test_controller_depth.py
|
|
64
|
+
tests/test_controllers.py
|
|
65
|
+
tests/test_decompile.py
|
|
66
|
+
tests/test_decompile_acceptance.py
|
|
67
|
+
tests/test_decompile_advanced.py
|
|
68
|
+
tests/test_decompile_sonic_fidelity.py
|
|
69
|
+
tests/test_device_backup.py
|
|
70
|
+
tests/test_device_bridge.py
|
|
71
|
+
tests/test_device_cli.py
|
|
72
|
+
tests/test_device_client.py
|
|
73
|
+
tests/test_device_content.py
|
|
74
|
+
tests/test_device_defs.py
|
|
75
|
+
tests/test_device_extra_import_surface.py
|
|
76
|
+
tests/test_device_globaleq.py
|
|
77
|
+
tests/test_device_irmd.py
|
|
78
|
+
tests/test_device_live.py
|
|
79
|
+
tests/test_device_liveops.py
|
|
80
|
+
tests/test_device_maintenance.py
|
|
81
|
+
tests/test_device_meters.py
|
|
82
|
+
tests/test_device_modelmap.py
|
|
83
|
+
tests/test_device_osc.py
|
|
84
|
+
tests/test_device_reorder.py
|
|
85
|
+
tests/test_device_settings.py
|
|
86
|
+
tests/test_device_sftp.py
|
|
87
|
+
tests/test_device_slots_cli.py
|
|
88
|
+
tests/test_device_subscribe.py
|
|
89
|
+
tests/test_device_tuner.py
|
|
90
|
+
tests/test_flowparams.py
|
|
91
|
+
tests/test_generate.py
|
|
92
|
+
tests/test_generate_combined.py
|
|
93
|
+
tests/test_generate_expression.py
|
|
94
|
+
tests/test_generate_flow.py
|
|
95
|
+
tests/test_generate_footswitches.py
|
|
96
|
+
tests/test_generate_input.py
|
|
97
|
+
tests/test_generate_snapshots.py
|
|
98
|
+
tests/test_hsp.py
|
|
99
|
+
tests/test_hss.py
|
|
100
|
+
tests/test_hss_cli.py
|
|
101
|
+
tests/test_ingest.py
|
|
102
|
+
tests/test_input_reshape.py
|
|
103
|
+
tests/test_ir_cache_cli.py
|
|
104
|
+
tests/test_ir_cli.py
|
|
105
|
+
tests/test_ir_generate.py
|
|
106
|
+
tests/test_ir_ingest.py
|
|
107
|
+
tests/test_ir_mapping.py
|
|
108
|
+
tests/test_ir_preset.py
|
|
109
|
+
tests/test_ir_spec.py
|
|
110
|
+
tests/test_ir_upload.py
|
|
111
|
+
tests/test_irhash_cache.py
|
|
112
|
+
tests/test_library.py
|
|
113
|
+
tests/test_manifest.py
|
|
114
|
+
tests/test_manifest_ops.py
|
|
115
|
+
tests/test_manifest_v2.py
|
|
116
|
+
tests/test_midi_controllers.py
|
|
117
|
+
tests/test_mutate.py
|
|
118
|
+
tests/test_mutate_cli.py
|
|
119
|
+
tests/test_mutate_flow.py
|
|
120
|
+
tests/test_preferences.py
|
|
121
|
+
tests/test_recipe.py
|
|
122
|
+
tests/test_roundtrip.py
|
|
123
|
+
tests/test_setlist_sync.py
|
|
124
|
+
tests/test_setlist_sync_mirror.py
|
|
125
|
+
tests/test_spec.py
|
|
126
|
+
tests/test_spec_commands.py
|
|
127
|
+
tests/test_spec_expression.py
|
|
128
|
+
tests/test_spec_flow.py
|
|
129
|
+
tests/test_spec_footswitches.py
|
|
130
|
+
tests/test_spec_input.py
|
|
131
|
+
tests/test_spec_midi.py
|
|
132
|
+
tests/test_trails_fxloop.py
|
|
133
|
+
tests/test_transcode.py
|
|
134
|
+
tests/test_transcode_flow.py
|
|
135
|
+
tests/test_view.py
|
|
136
|
+
tests/test_view_cli.py
|
|
137
|
+
tests/test_view_flow.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""helixgen MCP server — drives the helixgen library from an MCP client."""
|
|
2
|
+
|
|
3
|
+
# Track the helixgen library version rather than carrying a separate number
|
|
4
|
+
# that drifts out of date. The plugin/pip environments always have helixgen
|
|
5
|
+
# importable; the fallback only matters in a stripped-down context.
|
|
6
|
+
try:
|
|
7
|
+
from helixgen import __version__
|
|
8
|
+
except Exception: # pragma: no cover - helixgen not importable
|
|
9
|
+
__version__ = "0.0.0"
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Entry point for `python -m mcp_server`.
|
|
2
|
+
|
|
3
|
+
Two transports, picked by the MCP_TRANSPORT env var:
|
|
4
|
+
|
|
5
|
+
- `stdio` (Claude Code spawning the server as a subprocess) — no host/port,
|
|
6
|
+
no allow-list config. The harness pipes JSON-RPC over stdin/stdout. This is
|
|
7
|
+
what the shipped plugin uses.
|
|
8
|
+
- `streamable-http` (default; the Render deploy) — binds MCP_HOST:$PORT. The
|
|
9
|
+
bind host defaults to the loopback `127.0.0.1`; a deploy that must accept
|
|
10
|
+
external connections (e.g. Render) opts in explicitly with MCP_HOST=0.0.0.0.
|
|
11
|
+
DNS-rebinding protection (TransportSecuritySettings) is installed
|
|
12
|
+
unconditionally and is fail-closed: with no MCP_ALLOWED_HOSTS set it defaults
|
|
13
|
+
to loopback Host headers only, so the default 127.0.0.1 bind works out of the
|
|
14
|
+
box while a stray public Host header is rejected. A public deploy
|
|
15
|
+
(MCP_HOST=0.0.0.0) must therefore also set MCP_ALLOWED_HOSTS (CSV, e.g. its
|
|
16
|
+
external hostname); MCP_ALLOWED_ORIGINS (CSV) further restricts Origins.
|
|
17
|
+
|
|
18
|
+
In mcp 1.27.2 the host/port live on app.settings (not on app.run()), so we
|
|
19
|
+
mutate the settings before run().
|
|
20
|
+
"""
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import os
|
|
24
|
+
|
|
25
|
+
from mcp.server.transport_security import TransportSecuritySettings
|
|
26
|
+
|
|
27
|
+
from mcp_server.server import app
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _csv_env(name: str) -> list[str]:
|
|
31
|
+
raw = os.environ.get(name, "")
|
|
32
|
+
return [s.strip() for s in raw.split(",") if s.strip()]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def main() -> None:
|
|
36
|
+
transport = os.environ.get("MCP_TRANSPORT", "streamable-http")
|
|
37
|
+
|
|
38
|
+
if transport == "stdio":
|
|
39
|
+
app.run(transport="stdio")
|
|
40
|
+
return
|
|
41
|
+
|
|
42
|
+
# Default to loopback; opt in to a public bind with MCP_HOST=0.0.0.0.
|
|
43
|
+
app.settings.host = os.environ.get("MCP_HOST", "127.0.0.1")
|
|
44
|
+
app.settings.port = int(os.environ.get("PORT", "10000"))
|
|
45
|
+
|
|
46
|
+
# Always install DNS-rebinding protection (enable_dns_rebinding_protection
|
|
47
|
+
# defaults to True). The middleware is fail-closed: an empty allowed_hosts
|
|
48
|
+
# rejects *every* Host header, so we supply a loopback default that keeps
|
|
49
|
+
# the default 127.0.0.1 bind working. A public deploy must set
|
|
50
|
+
# MCP_ALLOWED_HOSTS to its external hostname.
|
|
51
|
+
allowed_hosts = _csv_env("MCP_ALLOWED_HOSTS") or [
|
|
52
|
+
"127.0.0.1",
|
|
53
|
+
"127.0.0.1:*",
|
|
54
|
+
"localhost",
|
|
55
|
+
"localhost:*",
|
|
56
|
+
]
|
|
57
|
+
app.settings.transport_security = TransportSecuritySettings(
|
|
58
|
+
allowed_hosts=allowed_hosts,
|
|
59
|
+
allowed_origins=_csv_env("MCP_ALLOWED_ORIGINS"),
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
app.run(transport="streamable-http")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
if __name__ == "__main__":
|
|
66
|
+
main()
|
|
File without changes
|