Metadata-Version: 2.4
Name: ableton-extensions
Version: 0.0.4
Summary: Write Ableton Live extensions in Python (via the Bridge).
Author: XTERMINATORAPPS
License: MIT
Project-URL: Homepage, https://www.xterminatorapps.shop
Project-URL: Repository, https://github.com/XTERMINATORAPPS/ableton-python-sdk
Keywords: ableton,live,extensions,music,midi
Classifier: Development Status :: 4 - Beta
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Multimedia :: Sound/Audio
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: websocket-client>=1.7
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == "dev"

# ableton-extensions

Write Ableton Live extensions in **Python**, on top of Ableton's official Extensions SDK.

Add right-click menu actions, read and write the Live Set (tracks, clips, notes, scenes, devices,
parameters, racks, take lanes, cue points), show modal dialogs and progress bars -- all from Python.
When you are done, build a single `.ablx` that installs on Windows and macOS with no Python on the
user's machine.

> Beta. MIT-licensed. Not affiliated with or endorsed by Ableton AG.

## Install

```
pip install ableton-extensions
```

## Write an extension

```python
from ableton_extensions import Extension, MidiClip

app = Extension("My Tool")

@app.context_menu("MidiClip", "Humanize")
def humanize(clip: MidiClip):
    notes = clip.notes
    for n in notes:
        n.velocity = max(1, min(127, (n.velocity or 100) + 5))
    clip.notes = notes

if __name__ == "__main__":
    app.run()
```

## Develop, then ship

```
ableton-ext install-bridge     # writes a small bridge .ablx -- drag it into Live once
ableton-ext run my_ext.py      # fast loop: right-click a MIDI clip -> "Humanize"
ableton-ext build my_ext.py    # -> one universal .ablx (~6 MB) to give to users
```

Your user drags the built `.ablx` into Live -> Settings -> Extensions. No Python, no Node, no
Developer Mode, no native binary -- the Python runs as WebAssembly inside Live, so the same file
works on Windows, Intel Mac, and Apple Silicon.

## Limits

Request/response only: no observers, no transport/playback, no automation; device parameter values
are raw internal numbers. The SDK can only do what Ableton's official Extensions SDK exposes.

## Links

- Documentation and examples: https://github.com/XTERMINATORAPPS/ableton-python-sdk
- Homepage: https://www.xterminatorapps.shop
