{ "info": { "author": "Einar Forselv", "author_email": "eforselv@gmail.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: zlib/libpng License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Topic :: Multimedia :: Graphics", "Topic :: Software Development :: Libraries :: Application Frameworks" ], "description": "|pypi| |travis|\n\npyrocket\n========\n\nA `rocket `__ client written in Python.\n\n- The port was inspired by `Moonlander `_\n- Tested with `Rocket OpenGL editor `_\n\nThis project is written in python 3 and is verified to work on\nWindows, OS X and Linux.\n\n|editor|\n\npyrocket was originally part of demosys-py_ and was separated into this project.\nThe screenshot shows pyrocket with demosys-py and Rocket OpenGL editor.\n\nWhat is Rocket?\n===============\n\nRocket is a sync-tracker tool for synchronizing music and visuals in demoscene productions.\nIt consists of an editor and a client that can either communicate with the editor over a\nnetwork socket, or play back an exported data-set.\n\nThis project is only a client (for now), so you will have to find an editor. You include\nthis client in your application so it can easily talk to an external editor or play back\nkey frame data in the final product.\n\nDo note that the rocket system can also be used for other purposes were you need a static\nset of interpolating key frames. There are no requirements for music to be involved.\n\nContributing\n============\n\nBe free to post questions and create issues. Do not hesitate to open a pull request\n(completed or work in progress). The worst thing that can happen is that we learn something.\n\nContributors:\n\n- `Einar Forselv `_\n- `Arttu Tamminen `_\n\nHow Rocket Works\n================\n\nRocket data is a collection of named groups (\"tracks\") containing key frames. Each key\nframe contains a row number (int), value (float) and interpolation type (enum/byte).\nThe row number is a time unit. This is translated to seconds based on a configured rows\nper second value. Rows per second is normally adjusted based on the music such as beats\nper minute. The row resolution will then be a grid that helps the user to place key\nframes accurately in sync with the music.\n\nThe rocket client can be used in three different modes:\n\n- **Editor mode**: Use the socket connector to connect to an external editor. The editor\n should ideally already be opened and you have loaded an xml file containing all the key\n frame data. When the client connects it will download all the key frames from the editor\n and will keep synchronizing the data as you edit the key frames.\n- **Playback: Editor Data**: The client will load the xml file created by the editor and\n play it back. This is a perfectly valid option in the final product if you don't care\n that others can easily inspect and edit the project file and you are not constrained by\n file size limits. (Project files are xml with lots of additional metadata used by the editor)\n- **Playback: Exported**: In editor mode you can select \"export remote\" that will tell\n the client to save all the current tracks in separate files in a binary format. This\n mode loads and plays back this data. The main purpose if this option is to vastly\n reduce the size of all the key frame data.\n\n\nInterpolation Types\n===================\n\nThe client library will do all the interpolation calculations for you.\nThe rocket protocol is supposed to be as simple as possible. If you need any other\ninterpolation types you can for example use linear interpolation and apply\na formula on these values.\n\nSupported interpolation modes are:\n - Step: Key frame produces a constant value)\n - Linear: Linear interpolation between key frames\n - Smooth: Interpolates key frames using: ``t * t * (3 - 2 * t)``\n - Ramp: Interpolates key frame using: ``t^2``\n\nUsing the Client\n================\n\nFirst of all you have to create a controller. This class keeps track of the current\ntime. We currently only implement a basic ``TimeController``. If you want music\nplayback you will have to implement your own controller by extending the base\n``Controller`` class. The reason for this is simply that we don't want to lock\nusers into using a specific library. The support for audio playback in Python is\nalso a bit flaky and almost always requires some third party binary dependency.\nThe easiest way to get music playback up and running is probably to use the\n``mixer`` module in ``pygame``, but this requires SDL libraries to be installed.\n\nQuick draw loop setup:\n\n(Do note that both time and track row is interpolated as floats,\nso even low values for ``rows_per_second`` will yield smoothly interpolated\nkey frame values)\n\n.. code:: python\n\n import time\n from rocket import Rocket\n from rocket.controllers import TimeController\n\n # Simple controller tracking time at 24 rows per second\n controller = TimeController(24)\n\n # Create the rocket client in different modes\n # Editor mode (track_path: where binary track data ends up when doing a remote export)\n rocket = Rocket.from_socket(controller, track_path=\"./data\")\n # Playback using the editor file\n rocket = Rocket.from_project_file(controller, 'example.xml')\n # Playback using binary track data\n rocket = Rocket.from_files(controller, './data')\n\n # Register some tracks\n # Just register a track\n rocket.track(\"cube:rotation\")\n # Register a track and store the reference for later\n size_track = rocket.track(\"cube:size\")\n\n # Enter the draw loop\n rocket.start()\n while True:\n # Update inner states. The controller is mainly involved in that.\n rocket.update()\n\n # Get the cube rotation value at the current time (when update() was last called)\n cube_rot = rocket.value(\"cube:rotation\")\n\n # Get the cube size by accessing the track directly (using seconds)\n cube_size = size_track.time_value(rocket.time)\n # Get the cube size by accessing the track directly (using track location)\n cube_size = size_track.track_value(rocket.track)\n\n # Emulate 60 fps\n time.sleep(1.0 / 1000 * 16)\n\nTrack Names\n===========\n\nThe standard rocket editor support track names using utf-8, but this is not a 100%\nguarantee that other track editors also support this.\n\nSome editors such as `Rocket OpenGL editor `_\nsupport track grouping. Grouping is done by adding a prefix in the track name\nfollowed by a colon.\n\nExample:\n::\n\n cube:rot.x\n cube:rot.y\n cube:rot.z\n\n monkey:rot.x\n monkey:rot.y\n monkey:rot.z\n\nThe uniqueness of the track is based on the entire name, so you can re-use\nthe same name across different groups.\n\nTrack names (after colon) should ideally be as short as possible. 12 characters is\na good limit as editors either cut off the name or expand the column width with\nlarger names. It's common to use dot as a separator in track names as well, but\nthis is not enforced as far as we know.\n\nWhen tracks are serialized into binary format the colon is replaced with #.\n``cube:rot.x`` track is save in the file ``cube#rot.x.track``.\n\nLogging\n=======\n\nThe default log level of the client is ``ERROR``.\n\nYou can override the log level when initializing rocket:\n\n.. code:: python\n\n import logging\n\n rocket = Rocket.from_socket(controller, track_path=\"./data\", log_level=logging.INFO)\n rocket = Rocket.from_project_file(controller, 'example.xml', log_level=logging.INFO)\n rocket = Rocket.from_files(controller, './data', log_level=logging.INFO)\n\nWhen adding custom controllers you can emit to the rocket logger:\n\n.. code:: python\n\n import logging\n from rocket.controllers import Controller\n\n logger = logging.getLogger(\"rocket\")\n\n class MyController(Controller):\n def __init__(self, rows_per_second):\n logger.info(\"Hello, Rocket!\")\n\n\n.. |editor| image:: https://raw.githubusercontent.com/Contraz/pyrocket/master/editor.png\n.. |pypi| image:: https://img.shields.io/pypi/v/pyrocket.svg\n :target: https://pypi.python.org/pypi/pyrocket\n.. |travis| image:: https://travis-ci.org/Contraz/pyrocket.svg?branch=master\n :target: https://travis-ci.org/Contraz/pyrocket\n.. _demosys-py: https://github.com/Contraz/demosys-py\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Contraz/pyrocket", "keywords": "synchronizing,music,rocket", "license": "", "maintainer": "Einar Forselv", "maintainer_email": "eforselv@gmail.com", "name": "pyrocket", "package_url": "https://pypi.org/project/pyrocket/", "platform": "", "project_url": "https://pypi.org/project/pyrocket/", "project_urls": { "Homepage": "https://github.com/Contraz/pyrocket" }, "release_url": "https://pypi.org/project/pyrocket/0.2.8/", "requires_dist": null, "requires_python": "", "summary": "Rocket sync-tracker client", "version": "0.2.8" }, "last_serial": 4170698, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "23a141532f878b9410bdc5382606a3d4", "sha256": "9e9e93e18f93d73306b41fd13796c28bdd45e412acc6bddf879d0381f19b0dbb" }, "downloads": -1, "filename": "pyrocket-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "23a141532f878b9410bdc5382606a3d4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2737, "upload_time": "2017-04-14T03:34:31", "url": "https://files.pythonhosted.org/packages/9d/17/e2c19fbdb84fb65df963ed891f37cbc4f244bb9cb4b62b767571ea790fb2/pyrocket-0.1.0-py3-none-any.whl" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "2bff539938959a4826562e13c5149a24", "sha256": "38fac6d13e5bc3fc4b6f2a900e77124d2377ad30be8297598aa4b20635bb90fd" }, "downloads": -1, "filename": "pyrocket-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2bff539938959a4826562e13c5149a24", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2943, "upload_time": "2017-04-14T20:33:49", "url": "https://files.pythonhosted.org/packages/4c/f4/33addd663d84e01a311a54cef057128c4aa4769320f76641005596ea8591/pyrocket-0.1.1-py3-none-any.whl" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "cff41fc7e65ec058b17a7623cfdea59e", "sha256": "d74645e1e3fb18de17d65e15929b79c7b567f4cbb934ae756e68ee8b3e045f4f" }, "downloads": -1, "filename": "pyrocket-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "cff41fc7e65ec058b17a7623cfdea59e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7336, "upload_time": "2017-04-14T21:13:24", "url": "https://files.pythonhosted.org/packages/5a/a1/24654534d3acb26ec114141f43d28b78616203e8961714ca8c4e960c53dc/pyrocket-0.1.2-py3-none-any.whl" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "44e13fb0a418e33da5f65d8650ad5088", "sha256": "a8a67371d4fb574a77d7739c7536db8ae9114ecde1449e8ec03c5d0545e4c317" }, "downloads": -1, "filename": "pyrocket-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "44e13fb0a418e33da5f65d8650ad5088", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7508, "upload_time": "2017-04-14T23:41:11", "url": "https://files.pythonhosted.org/packages/7b/18/d17c60f4ac71bcec778c93d7ed07f7c988a6c748cfce4cb39bf3182f10ac/pyrocket-0.1.3-py3-none-any.whl" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "631b78e221e01923aa6d5002ad8d3895", "sha256": "bcb247b0bbe4ce3681cd414978ddd4cf1fea285ec7d68e037deda52e2f36abc3" }, "downloads": -1, "filename": "pyrocket-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "631b78e221e01923aa6d5002ad8d3895", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12745, "upload_time": "2017-04-16T23:32:12", "url": "https://files.pythonhosted.org/packages/90/71/f63426836ffa9578e0a04015e378912d1ae04ed89ac2b9e2bc22743f857c/pyrocket-0.2.0-py3-none-any.whl" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "8e3f7d42a2507da5594828adfa667105", "sha256": "04fd0562826b23009256f27518bffff77bfb7dbea30db33a561b5d697ba701ea" }, "downloads": -1, "filename": "pyrocket-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "8e3f7d42a2507da5594828adfa667105", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17156, "upload_time": "2017-04-17T17:49:16", "url": "https://files.pythonhosted.org/packages/93/58/2d5c6aa936953de5bc7d6212a58da7a16348e619870c5b1679a0089e7965/pyrocket-0.2.1-py3-none-any.whl" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "74d72291a481e46cf624b3b343dd2fe1", "sha256": "c34c22ee280870d24f2c0b2c8f7aa2ecce4d80cbc135464d52d2b92b5a471169" }, "downloads": -1, "filename": "pyrocket-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "74d72291a481e46cf624b3b343dd2fe1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17557, "upload_time": "2017-04-17T17:54:39", "url": "https://files.pythonhosted.org/packages/34/35/40d515b8ecbc5045937f902dec294726385c84d1f3e927e917fda7802190/pyrocket-0.2.2-py3-none-any.whl" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "b3470185b465ae27ab93bb9d0b958d76", "sha256": "48e61cc5ed9269b15bbdae93f7f45860df70933b47bd688d4ea80a3d9006ffe8" }, "downloads": -1, "filename": "pyrocket-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "b3470185b465ae27ab93bb9d0b958d76", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17729, "upload_time": "2017-04-17T22:18:29", "url": "https://files.pythonhosted.org/packages/9f/0d/b53348702f8e25aa08619aab88ce4b48d9cab0189fbced3d52995d011dd8/pyrocket-0.2.3-py3-none-any.whl" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "f1a46eb0416658ad07072a0071755898", "sha256": "8bfe479e0be975f1a4b0e37379ec8ea2ffa74addbc6c83193010ba26decefaea" }, "downloads": -1, "filename": "pyrocket-0.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "f1a46eb0416658ad07072a0071755898", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18537, "upload_time": "2017-04-17T23:37:30", "url": "https://files.pythonhosted.org/packages/69/f8/4ccc7dfcb4d63b66090b2d87ff4c0a71704f0e27ae1c8bade5187e53fbc9/pyrocket-0.2.4-py3-none-any.whl" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "509e6e0d2523aa4f6c1a1f4bbadee2ec", "sha256": "69dd3914e197d8e1278b070790e71d623f8ea5140e0b8333ee3ba3c3ffc114f4" }, "downloads": -1, "filename": "pyrocket-0.2.5-py3-none-any.whl", "has_sig": false, "md5_digest": "509e6e0d2523aa4f6c1a1f4bbadee2ec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19093, "upload_time": "2017-04-19T23:20:52", "url": "https://files.pythonhosted.org/packages/18/68/010878aa6f65e7023665c82ee108f737b4b113f53ce91612c80de6b9b382/pyrocket-0.2.5-py3-none-any.whl" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "4df17d057482099e1e5f4972feba00e4", "sha256": "65e81047bbe9ad2ad4ebf8ec67e834c95f1594674d248897cc77e43907c2b130" }, "downloads": -1, "filename": "pyrocket-0.2.6-py3-none-any.whl", "has_sig": false, "md5_digest": "4df17d057482099e1e5f4972feba00e4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12407, "upload_time": "2018-07-03T21:35:25", "url": "https://files.pythonhosted.org/packages/bb/15/d3f86101ac47fe3f37573b173b3396a7d32c81fdfe070feeffbee14042e0/pyrocket-0.2.6-py3-none-any.whl" } ], "0.2.7": [ { "comment_text": "", "digests": { "md5": "a444107a6af82b47c5dc21360ed28159", "sha256": "825afd5306728b55cacb0306e139efba9761072b0f18e70e1609a24844dcafad" }, "downloads": -1, "filename": "pyrocket-0.2.7-py3-none-any.whl", "has_sig": false, "md5_digest": "a444107a6af82b47c5dc21360ed28159", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12457, "upload_time": "2018-07-04T17:34:38", "url": "https://files.pythonhosted.org/packages/7a/b0/bbf5260b8746dbcf72f21086fcb71d5547f2d9c5ff3a1a0e28db1c05b73a/pyrocket-0.2.7-py3-none-any.whl" } ], "0.2.8": [ { "comment_text": "", "digests": { "md5": "752e406d0b507e19fc01c143284d8087", "sha256": "f72da5cf9f7bf741283e009016a57b014b84bddbfff7cd5120d1dcdc7ae74ac4" }, "downloads": -1, "filename": "pyrocket-0.2.8-py3-none-any.whl", "has_sig": false, "md5_digest": "752e406d0b507e19fc01c143284d8087", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12481, "upload_time": "2018-08-14T19:38:10", "url": "https://files.pythonhosted.org/packages/8c/9e/2a0a5fb0e44d8b19ba6d4003b57bf1dcd459cd9b690331d43a04fbcc5bdd/pyrocket-0.2.8-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "752e406d0b507e19fc01c143284d8087", "sha256": "f72da5cf9f7bf741283e009016a57b014b84bddbfff7cd5120d1dcdc7ae74ac4" }, "downloads": -1, "filename": "pyrocket-0.2.8-py3-none-any.whl", "has_sig": false, "md5_digest": "752e406d0b507e19fc01c143284d8087", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12481, "upload_time": "2018-08-14T19:38:10", "url": "https://files.pythonhosted.org/packages/8c/9e/2a0a5fb0e44d8b19ba6d4003b57bf1dcd459cd9b690331d43a04fbcc5bdd/pyrocket-0.2.8-py3-none-any.whl" } ] }