{ "info": { "author": "Daniel Jones", "author_email": "dan-pylive@erase.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Topic :: Artistic Software", "Topic :: Communications", "Topic :: Multimedia :: Sound/Audio" ], "description": "# PyLive\n\nPyLive is a framework for querying and controlling Ableton Live from a standalone Python script, mediated via Open Sound Control. It is effectively an interface to the Live Control Surfaces paradigm, which means it can do anything that a hardware control surface can do, including:\n\n - query and modify global parameters such as tempo, volume, pan, quantize, arrangement time\n - query and modify properties of tracks, clips, scenes and devices\n - trigger and stop clips and scenes\n\nIt can perform most of the operations described in the [LiveOSC OSC API](https://github.com/hanshuebner/LiveOSC/blob/master/OSCAPI.txt).\n\n## Requirements\n\n* [Ableton Live 9+](http://www.ableton.com/live)\n* [Python 2.6+](http://www.python.org)\n* [LiveOSC (fork)](https://github.com/ideoforms/LiveOSC): A maintained fork of the [LiveOSC](http://livecontrol.q3f.org/ableton-liveapi/liveosc/) MIDI control script, updated to work with Live 9.6 and 10. Must be installed in Live's `MIDI Remote Scripts` (see [README](https://github.com/ideoforms/LiveOSC))\n* [liblo](http://liblo.sourceforge.net/): Install via Homebrew with `brew install liblo`\n\n## Installation\n\nFrom PyPi:\n\n```\npip install pylive\n```\n\nVia git:\n```\ngit clone https://github.com/ideoforms/pylive.git\ncd pylive\npython setup.py install\n```\n\nTo check that pylive is communicating successfully with Ableton Live, try running one of the [examples](examples), or run the test suite with:\n```\npython setup.py test\n```\n\n## Usage\n\n```python\n#------------------------------------------------------------------------\n# Basic example of pylive usage: scan a Live set, trigger a clip,\n# and modulate some device parameters.\n#------------------------------------------------------------------------\nimport live\nimport random\n\n#------------------------------------------------------------------------\n# Scan the set's contents and set its tempo to 110bpm.\n#------------------------------------------------------------------------\nset = live.Set()\nset.scan(scan_clip_names = True, scan_devices = True)\nset.tempo = 110.0\n\n#------------------------------------------------------------------------\n# Each Set contains a list of Track objects.\n#------------------------------------------------------------------------\ntrack = set.tracks[0]\nprint(\"Track name %s\" % track.name)\n\n#------------------------------------------------------------------------\n# Each Track contains a list of Clip objects.\n#------------------------------------------------------------------------\nclip = track.clips[0]\nprint(\"Clip name %s, length %d beats\" % (clip.name, clip.length))\nclip.play()\n\n#------------------------------------------------------------------------\n# We can determine our internal timing based on Live's timeline using\n# Set.wait_for_next_beat(), and trigger clips accordingly.\n#------------------------------------------------------------------------\nset.wait_for_next_beat()\nclip.get_next_clip().play()\n\n#------------------------------------------------------------------------\n# Now let's modulate the parameters of a Device object.\n#------------------------------------------------------------------------\ndevice = track.devices[0]\nparameter = random.choice(device.parameters)\nparameter.value = random.uniform(parameter.minimum, parameter.maximum)\n```\n\n## Overview\n\nTo begin interacting with an Ableton Live set, the typical workflow is as follows. Live should normally be running on localhost, with LiveOSC enabled as a Control Surface.\n\n* Create a `live.Set` object.\n* Call `set.scan()`, which queries Live for an index of tracks, clip statuses, and (optionally) clip names and devices\n* Interact with Live by setting and getting properties on your `Set`:\n * `set.tempo`, `set.time`, `set.overdub` are global Set properties\n * `set.tracks` is a list of Track objects\n * `set.tracks[N].name`, `set.tracks[N].mute`, are Track properties\n * `set.tracks[N].clips` is a list of Clip objects (with empty slots containing `None`)\n * `set.tracks[N].devices` is a list of Device objects\n * `set.tracks[N].devices[M].parameters` is a list of Parameter objects\n\nGetters and setters use Python's `@property` idiom, meaning that accessing `set.tempo` will query or update your Live set.\n\nIf you know that no other processes will interact with Live, set `set.caching = True` to cache properties such as tempo. This will query the Live set on the first instance, and subsequently return locally-stored values.\n\nFor further help, see `pydoc live`.\n\n## Classes\n\n* `Set`: Represents a single Ableton Live set in its entirety. \n* `Track`: A single Live track object. Contains `Device` and `Clip` objects. May be a member of a `Group`.\n* `Group`: A grouped set of one or more `Track` objects.\n* `Device`: An instrument or audio effect residing within a `Track`. Contains a number of `Parameter` objects.\n* `Parameter`: An individual control parameter of a `Device`, with a fixed range and variable value.\n\n## Limitations\n\nNote that pylive is not intended for sending MIDI note events or control messages to a set. For MIDI controls, use a separate module such as [mido](https://mido.readthedocs.io).", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ideoforms/pylive", "keywords": "sound,music,ableton,osc", "license": "", "maintainer": "", "maintainer_email": "", "name": "pylive", "package_url": "https://pypi.org/project/pylive/", "platform": "", "project_url": "https://pypi.org/project/pylive/", "project_urls": { "Homepage": "https://github.com/ideoforms/pylive" }, "release_url": "https://pypi.org/project/pylive/0.2.1/", "requires_dist": null, "requires_python": "", "summary": "Python remote control of Ableton Live", "version": "0.2.1" }, "last_serial": 5907162, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "414e6f7d78f5b50b33590c1d1fc30ac1", "sha256": "1e11726d27eab4117c1631e56b0a21ff7b1431a8306d52018c83c41299bb367b" }, "downloads": -1, "filename": "pylive-0.1.0.tar.gz", "has_sig": false, "md5_digest": "414e6f7d78f5b50b33590c1d1fc30ac1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12227, "upload_time": "2013-10-02T15:41:06", "url": "https://files.pythonhosted.org/packages/73/b4/306026a18953823b677443bad4f53ebe65e419e3a1337bc2203588f68ee5/pylive-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "f43572528dbb56c5f06ba9fc8018c16f", "sha256": "2e9d7231d1d480a54a8e448f109b0dfb84dd06d20b545911d75aeccb6daa21c0" }, "downloads": -1, "filename": "pylive-0.1.1.tar.gz", "has_sig": false, "md5_digest": "f43572528dbb56c5f06ba9fc8018c16f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14325, "upload_time": "2013-10-02T18:41:08", "url": "https://files.pythonhosted.org/packages/0f/a6/275f5f6da3513a69135127573e472371c9298a0b1622e5781623609414e9/pylive-0.1.1.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "d58f4f8b2684deae526938cdf774f329", "sha256": "ccabcc384251586efdd2d51daf2a1bb60eabbc4c24f8a313836f9ec8d48a1d4e" }, "downloads": -1, "filename": "pylive-0.1.4.tar.gz", "has_sig": false, "md5_digest": "d58f4f8b2684deae526938cdf774f329", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16141, "upload_time": "2015-09-01T15:14:25", "url": "https://files.pythonhosted.org/packages/06/50/40afdc736873b159845971c78fc11deedd602deac8817ebc982382e0ec6d/pylive-0.1.4.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "ff2ea1364d724f72219bb8fcc39464f0", "sha256": "ccf7b7377ce46d4f7b1ea7734737b2db116737b0898413a7b5dfd09cb21add50" }, "downloads": -1, "filename": "pylive-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ff2ea1364d724f72219bb8fcc39464f0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21792, "upload_time": "2019-05-28T02:49:19", "url": "https://files.pythonhosted.org/packages/6c/3e/81c21cfffc755094d287a4be750f44ab483e46205cd9566cb112391d603b/pylive-0.2.0-py2.py3-none-any.whl" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "c51a37471be233fd7b1d707e9804e20a", "sha256": "3286d95158e9a3ff52efe2cc585eb0ec3629945fb6aa1833ed2a83113d90d028" }, "downloads": -1, "filename": "pylive-0.2.1.tar.gz", "has_sig": false, "md5_digest": "c51a37471be233fd7b1d707e9804e20a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20162, "upload_time": "2019-09-30T14:25:24", "url": "https://files.pythonhosted.org/packages/de/51/63dfd27acee680a88452eec9edc05057976358c1e39a423d42de4305c750/pylive-0.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c51a37471be233fd7b1d707e9804e20a", "sha256": "3286d95158e9a3ff52efe2cc585eb0ec3629945fb6aa1833ed2a83113d90d028" }, "downloads": -1, "filename": "pylive-0.2.1.tar.gz", "has_sig": false, "md5_digest": "c51a37471be233fd7b1d707e9804e20a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20162, "upload_time": "2019-09-30T14:25:24", "url": "https://files.pythonhosted.org/packages/de/51/63dfd27acee680a88452eec9edc05057976358c1e39a423d42de4305c750/pylive-0.2.1.tar.gz" } ] }