{ "info": { "author": "Marc Evanstein", "author_email": "marc@marcevanstein.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Operating System :: OS Independent", "Programming Language :: Python :: 3.6" ], "description": "# SCAMP (Suite for Computer-Assisted Music in Python)\n\nSCAMP is an computer-assisted composition framework in Python that manages the flow of musical time, plays back notes via [FluidSynth](http://www.fluidsynth.org/) or over OSC, and quantizes and exports the result to music notation in the form of MusicXML or Lilypond. This framework is the distillation of years of practice composing algorithmic and computer-assisted music in Python and aims to address pervasive technical challenges while imposing as little as possible on the aesthetic choices of the user. \n\n## Features\n\n- Flexible and extensible playback: Although SCAMP comes with a basic general MIDI soundfont, \nany .sf2 soundfont can be used, and multiple soundfonts can be used simultaneously. Beyond \nthat, the OSCScampInstrument class allows playback to be done by controlling an external \nsynth over OSC. For even broader flexibility, custom instruments can inherit from the \nScampInstrument class and redefine how notes are played.\n- Note-based, but in a broad sense: Although SCAMP conceives of music in terms of notes, \nthe ability to use anything as a soundfont and to control synths over OSC lends a great deal \nof variety to what a note represents.\n- Effortless microtonality: to play the G above middle C 30 cents sharp, the user has only \nto use the MIDI pitch 67.3. Behind the scenes, SCAMP manages all of the MIDI pitchbend \nmessages, placing notes on separate channels where necessary so that these pitch bends do \nnot conflict.\n- Effortless playback of glissandi and dynamic envelopes. Both pitch and volume can follow \narbitrary curves defined using the [_expenvelope_](https://github.com/MarcTheSpark/expenvelope) package.\n- Flexible and precise polyphonic tempo control using [_clockblocks_](https://github.com/MarcTheSpark/clockblocks). \nIn SCAMP, different layers of music moving at different tempi can be interweaved with one \nanother while remaining coordinated. Smooth accelerandi and ritardandi are possible, and the \nresulting music can be quantized according to the tempo of any layer.\n- Sensible and flexible quantization. The user has a fine degree of control over how rhythms \nare quantized and over the degree of complexity in the resulting notation.\n\n## Philosophy\n\nCompositional tools always feature some degree of trade-off between functionality and freedom; \nevery feature that is made available to the user steers them in a certain direction. For \ninstance, if a framework provides abstractions for manipulating harmonies, the user may find \nthemselves (perhaps unconsciously) pushed in the direction of a particular harmonic language. \nWhile this may be a worthwhile trade-off in many cases, it is not the goal of SCAMP. Here, \nthe goal is to provide general purpose tools, to remove the drudgery of implementing practical \nfunctionality that is needed again and again. Beyond this scope, users are encouraged to write \nand share their own extensions to suit their own compositional inclinations.\n\nOther key values underlying this framework are:\n\n- Playback first, notation second: SCAMP has been designed so that the user interacts with an \nensemble, not a score. This way, ideas can be quickly auditioned and iterated over based on the \nsonic result. Once the result is deemed satisfactory, the user can then export it as music notation.\n- Compact and expressive code: Efforts have been made to make user code simple and but powerful. \nOne of the ways this is accomplished is through sensible defaults; although there is a lot of \nfunctionality under the hood, it shouldn't be encountered by the user until it is needed.\n- Modularity and adherence as much as possible to the [Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy). \nSCAMP bundles a number of tools together for convenience, but it may be more than a given user \nneeds. For this reason, the MusicXML export capability is available separately as \n[_pymusicxml_](http://www.github.com/MarcTheSpark/pymusicxml), the flexible musical Envelope \nclass is available separately as [_expenvelope_](http://www.github.com/MarcTheSpark/expenvelope), \nand the system for managing musical time is available separately as [_clockblocks_](http://www.github.com/MarcTheSpark/clockblocks).\n\n\n## Installation & Requirements\n\nOn a properly configured computer, installing SCAMP is as simple as opening a terminal and \nrunning:\n\n`pip3 install --user scamp`\n\n(This installs it for a single user. To install it for all users on a computer, use `sudo pip3 install scamp` and enter your administrator password.)\n\nProperly configuring your computer involves:\n\n1) Installing Python 3.6 or greater\n2) Installing FluidSynth\n3) (Optional) Installing [_python-rtmidi_](https://spotlightkid.github.io/python-rtmidi/)\n4) (Optional) Installing [_abjad_](https://github.com/Abjad/abjad) (Note: currently SCAMP only \nworks with the cutting-edge version of abjad available on GitHub -- see below)\n\nEach of these steps is described in greater detail below. After configuring the computer and \nrunning `pip3 install --user scamp`, you should be able to test the installation by:\n\n1) Opening a terminal and typing `python3` to start an interactive python session.\n2) Typing in `from scamp import test_run; test_run.play()` and pressing return.\n\nIf you here a piano gesture sweeping inward towards middle C, SCAMP has installed correctly!\n\n### 1) Installing Python 3.6 or greater\n\n___Mac___\n\nYou can download and install Python 3 here: [https://www.python.org/downloads/](https://www.python.org/downloads/). After installation, open up a terminal and type:\n\n`python3 --version`\n\nYou should be greeted with \"Python 3.7.2\" or something similar in response. If so, you're all set! \nIf you get something like \"command not found\" instead, it's likely that something went wrong in the process of installation.\n\n___Windows___\n\nAs on a Mac, you can download and install Python 3 here: [https://www.python.org/downloads/](https://www.python.org/downloads/). \nIn the installer, be sure to select \"Add Python 3.7 to PATH\". This allows you to invoke python from the Command Prompt \nby typing either `python` or `py`, and this should also default to the latest version of python. Test that all went\naccording to plan by typing:\n\n`python --version`\n\nYou should be greeted with \"Python 3.7.2\" or something similar in response. If so, you're all set! For all other installation instructions below, use `python` instead of `python3` and `pip` instead of `pip3`.\n\n___Linux___\n\nOn Linux, Python 3.6 or greater is often already installed by default. Again, you can check this \nby opening a terminal and running:\n\n`python3 --version`\n\nIf your version of python is already 3.6 or greater, you're good to go. However, if your version \nof Python 3 is less than 3.6, as might happen on an older distro, you can install Python 3.6 via \na PPA, such as Felix Krull's deadsnakes PPA on Ubuntu:\n\n```\nsudo add-apt-repository ppa:deadsnakes/ppa\nsudo apt-get update\nsudo apt-get install python3.6\n```\n\nIt might then be useful to add the following line to your `~/.bashrc` file:\n\n`alias pip3.6=\"python3.6 -m pip\"`\n\nFrom there on, you can proceed to use the commands `pip3.6` and `python3.6` in place of `pip3` \nand `python3` to install SCAMP, manage dependencies, and invoke the correct version of Python. \n(Don't do anything with the earlier version of Python; it's used by the operating system.)\n\n### 2) Installing Fluidsynth\n\n___Mac___\n\nFluidsynth is best installed through a package manager like [Homebrew](https://brew.sh). If you \ndon't already have Homebrew, you can follow the instructions on the website, or simply open a \nterminal and type:\n\n`/usr/bin/ruby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"`\n\n...and then return. You will then be prompted to hit return again, and then to enter your password. Mysterious words will appear on the screen. It may take some time. Chill out. Have some tea.\n\nOnce it stops, run the following commands:\n\n```\nbrew update\nbrew upgrade\n```\n\nIf it doesn't throw an error, you now have a package manager! Now run:\n\n`brew install fluidsynth`\n\nMore strange and occult text will appear before you. When it's done simply type:\n\n`fluidsynth`\n\nHopefully, something along the lines of this will appear:\n\n```\nFluidSynth version 1.1.9\nCopyright (C) 2000-2018 Peter Hanappe and others.\nDistributed under the LGPL license.\nSoundFont(R) is a registered trademark of E-mu Systems, Inc.\n\nType 'help' for help topics.\n\n> \n```\n\nType \"quit\", hit return, and let out a deep breath. You are now the proud owner of a fluidsynthesizer.\n\n___Windows___\n\nUnfortunately, it seems that the suggested way of acquiring fluidsynth on Windows is to compile \nit from source. Since this is rather a lot to ask of some users, SCAMP contains a working copy \nof the windows fluidsynth library to fall back on if no installation is present.\n\n___Linux___\n\nOn Linux distros, since you already have a package manager, this is easy. For instance, on \napt-based distros like Debian, Ubuntu or Trisquel, you can simply run:\n\n`sudo apt install fluidsynth`\n\nYay, Linux!\n\n### 3) (Optional) Installing python-rtmidi\n\nFor midi input, and also to generate an outgoing midi stream (which could, for instance, be \nrouted to a DAW), you will need the [_python-rtmidi_](https://pypi.org/project/python-rtmidi/) \nlibrary. You can get this by running from a terminal:\n\n`pip3 install --user python-rtmidi` \n\nOn Linux, if you're running into an error you may need to first install the `python3-dev` \npackage, for instance with the command:\n\n`sudo apt install python3-dev`\n\nFor any other _python-rtmidi_ installation woes, take a look at the installation instructions \n[here](https://spotlightkid.github.io/python-rtmidi/installation.html).\n\n### 4) (Optional) Installing abjad\n\nFor lilypond output, you will need the [_abjad_](http://abjad.mbrsi.org/installation.html) library. Currently, SCAMP \nrequires the latest version from the _abjad_ github repository, since there have been some changes that make the version \non PyPI (which is what `pip` uses) incompatible. In order to install the latest version, run the following:\n\n```\ngit clone https://github.com/Abjad/abjad.git\ncd abjad\npip3 install .\n```\n\nNote that this requires you to have `git` installed. If you need to install git, it should be fairly straightforward \nto follow the [instructions on this website](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git).\n\nThe first line might take a while, since it's downloading the whole history of the abjad repository, which is hundreds \nof megabytes. Once you've installed the package, you can remove the bulky repo with:\n\n```\ncd ..\nrm -r abjad\n```\n\nIn the future, once a new version of abjad is pushed to PyPI, this process will be replaced by a much easier one-line pip install.\n\n### 5) (Optional) Installing scamp_extensions\n\nThe *scamp_extensions* package is the place for models of music-theoretical concepts (e.g. scales, pitch-class sets), \nadditional conveniences for interacting with various types of input and output, and in general anything that builds \nupon SCAMP but is outside of the scope of the main framework.\n\nThe easiest way to install *scamp_extensions* is by running the command:\n\n```\npip3 install git+https://github.com/MarcTheSpark/scamp_extensions\n```\n\nThis will install the latest version from the repository.\n\n\n\n", "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/MarcTheSpark/scamp", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "scamp", "package_url": "https://pypi.org/project/scamp/", "platform": "", "project_url": "https://pypi.org/project/scamp/", "project_urls": { "Homepage": "https://github.com/MarcTheSpark/scamp" }, "release_url": "https://pypi.org/project/scamp/0.3.1/", "requires_dist": [ "pymusicxml (>=0.1.0)", "expenvelope (>=0.2.0)", "clockblocks (>=0.2.1)", "pyfluidsynth", "sf2utils", "python-osc", "abjad ; extra == 'lilypond'", "python-rtmidi ; extra == 'midistream'" ], "requires_python": "", "summary": "An algorithmic composition framework that manages the flow of musical time, plays back notes via fluidsynth or though osc, and quantizes and saves the result to music notation.", "version": "0.3.1" }, "last_serial": 5674585, "releases": { "0.0.5": [ { "comment_text": "", "digests": { "md5": "539fe80942cb58af571334e9ad92c8a7", "sha256": "7f224b8fd7981cb220f0e0114780941b7c2e58d71f6b1e6ffbc074bdfa76deab" }, "downloads": -1, "filename": "scamp-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "539fe80942cb58af571334e9ad92c8a7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10554610, "upload_time": "2019-01-12T02:57:02", "url": "https://files.pythonhosted.org/packages/db/83/44aa79b6086219d7383091318bfb09d6e829b1df929a9bcbd1c23996c3cb/scamp-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bd3b311256f8fde1ac7d7be92f68c50f", "sha256": "efc680986e2d7949a7264aaa08d1530dc10ab444c9a536039e03be4bca785853" }, "downloads": -1, "filename": "scamp-0.0.5.tar.gz", "has_sig": false, "md5_digest": "bd3b311256f8fde1ac7d7be92f68c50f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10534392, "upload_time": "2019-01-12T02:57:15", "url": "https://files.pythonhosted.org/packages/fe/a5/ddb564674d5b4234e90dfe5e655ee6d35b33721e93ee66421f449a86738c/scamp-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "e9764848d8d1ae6ce0723ee5145109bd", "sha256": "0879963eb23d3a20f3da3d41f827367404b06cc5216b8240ad1f038e5148954e" }, "downloads": -1, "filename": "scamp-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "e9764848d8d1ae6ce0723ee5145109bd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10554601, "upload_time": "2019-01-12T03:04:22", "url": "https://files.pythonhosted.org/packages/b4/a3/8bf21175e4b3ff2264228b84dd3049948988fb00923cf9e3b177a13223c7/scamp-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2a34d30fb5cf03f2d77bc2174ddd91b4", "sha256": "3052865312017ec0eb1910293d73361b8ec9ebf401ddb94136fb8fad777341dd" }, "downloads": -1, "filename": "scamp-0.0.6.tar.gz", "has_sig": false, "md5_digest": "2a34d30fb5cf03f2d77bc2174ddd91b4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10534350, "upload_time": "2019-01-12T03:04:34", "url": "https://files.pythonhosted.org/packages/9b/81/fa9430d32a1e90744535fac3d3e6d0afd0e5a5ce62047dd1c6ba0737ecfb/scamp-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "0eb281219c2f9301f2ed6b9e3f344c1e", "sha256": "53ccfc654404a6acca41fb455b440aa0a54adbc97cb52f7a352353c2e407d4ea" }, "downloads": -1, "filename": "scamp-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "0eb281219c2f9301f2ed6b9e3f344c1e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10554612, "upload_time": "2019-01-12T22:59:53", "url": "https://files.pythonhosted.org/packages/ee/76/5820d8450596f341b937a9e86e7feb856de25112be504a743828aa213e50/scamp-0.0.7-py3-none-any.whl" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "27d8e4972aecbdd43fff5aa588b878e2", "sha256": "cc5b5369f9d6d6a4e3cdb988e873ef54b3a9f223f05345e281ccb8c7947a36d6" }, "downloads": -1, "filename": "scamp-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "27d8e4972aecbdd43fff5aa588b878e2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10566057, "upload_time": "2019-01-17T09:06:56", "url": "https://files.pythonhosted.org/packages/d4/bb/910d27a9e9fab8e3c95fac53c5ee5dd87f2b9d1a886a0bad2f4c4580c497/scamp-0.0.8-py3-none-any.whl" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "2df1c1495880f32a1577d71de7c98deb", "sha256": "288ec4c970a43877a0ee36ec605cdaed937f7a9ab172b3568c55448bbb37662f" }, "downloads": -1, "filename": "scamp-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "2df1c1495880f32a1577d71de7c98deb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10818197, "upload_time": "2019-01-18T23:51:00", "url": "https://files.pythonhosted.org/packages/6f/32/b58e10407d424566f46e38204ea197fd9966cb3dc46583284ea4136e6fa8/scamp-0.0.9-py3-none-any.whl" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "44b6c6f8db30f86dd4e390442a648a81", "sha256": "c09c0fb4dfc7be9da763e9112e849c31e5f80fcfb8ce12a1475887ea610936fb" }, "downloads": -1, "filename": "scamp-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "44b6c6f8db30f86dd4e390442a648a81", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10818195, "upload_time": "2019-01-19T00:08:12", "url": "https://files.pythonhosted.org/packages/81/2d/00fa86b6f02066820aa6627bb22736a44e0352c288fc1cb9581902489155/scamp-0.1.0-py3-none-any.whl" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "a345f5b3de8a4ed2fad4f59930f0a85e", "sha256": "517392202b66743988deb58a8d513b2c123fa8c3381e80868e7192dea8c7a555" }, "downloads": -1, "filename": "scamp-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a345f5b3de8a4ed2fad4f59930f0a85e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10819267, "upload_time": "2019-01-23T00:35:14", "url": "https://files.pythonhosted.org/packages/09/a1/304b67fba1becae96476003974c3109815c91ee53808c796070f0f94b008/scamp-0.1.1-py3-none-any.whl" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "8aa43079befcb4caccc9cc5713401c27", "sha256": "5e31149f83c6198cb1365bc587a64345326f56743d23cdf57a573717015e43b0" }, "downloads": -1, "filename": "scamp-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "8aa43079befcb4caccc9cc5713401c27", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11335115, "upload_time": "2019-05-15T22:58:22", "url": "https://files.pythonhosted.org/packages/2d/8e/683e8258dc11203c541d5199f6e0046bbe5bd032f280aab18f42ba1716d7/scamp-0.2.0-py3-none-any.whl" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "ccb9ad8c7df339b795921890b39819f6", "sha256": "d623f1b520d5dfe13d29a1694157b7bc007fbccec3ebc2f8f14086fe4da42fe9" }, "downloads": -1, "filename": "scamp-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ccb9ad8c7df339b795921890b39819f6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11335479, "upload_time": "2019-05-17T05:13:10", "url": "https://files.pythonhosted.org/packages/2c/b6/eba56cae178c8d54207a2488ac007bdbd2b3d9590979c2c99e588207226c/scamp-0.2.1-py3-none-any.whl" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "dcfa0e7b4c8c35624bf0ca60f2ecc32e", "sha256": "ece168dcba819a932b85805f104d8411c8ecd7631c9f6491f21c9bf7d55fa6e4" }, "downloads": -1, "filename": "scamp-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "dcfa0e7b4c8c35624bf0ca60f2ecc32e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11341189, "upload_time": "2019-06-26T15:50:24", "url": "https://files.pythonhosted.org/packages/5e/fd/aea8a20b5f467ad7a17a09d07bc34f3ccc3da10a1bd8e86b3fb7604c389e/scamp-0.2.2-py3-none-any.whl" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "2db870578522bffb49b58a17ba06ea94", "sha256": "d3854e22e2fceb5903b1ee5f4fd36b1a4bbb20ad4fbb9a149ed67b4f8abbadad" }, "downloads": -1, "filename": "scamp-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "2db870578522bffb49b58a17ba06ea94", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11341189, "upload_time": "2019-06-26T15:57:54", "url": "https://files.pythonhosted.org/packages/65/de/c333cb4e82a9d051fde1e80ea23c81da6ebc8c6192eb7d85054f88f6fc8c/scamp-0.2.3-py3-none-any.whl" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "d279aa508fd1a4e1777b7d5dc87b5695", "sha256": "52aa9196b547307b697135665668770de5aafc859732c2cacec3364474cc3cc9" }, "downloads": -1, "filename": "scamp-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "d279aa508fd1a4e1777b7d5dc87b5695", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11341408, "upload_time": "2019-06-26T18:28:20", "url": "https://files.pythonhosted.org/packages/df/7a/55a12d7df38a2cdaf8137d6fe93043997e92b3e17dab6a3091084a70e82b/scamp-0.3-py3-none-any.whl" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "47636b7cbac7a60314b57939ad4094dc", "sha256": "dfde02ec59ab187f87042ecc65e750408ed4257f4582bf07e38c34b818b89aea" }, "downloads": -1, "filename": "scamp-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "47636b7cbac7a60314b57939ad4094dc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11353230, "upload_time": "2019-08-14T03:24:56", "url": "https://files.pythonhosted.org/packages/b2/d7/06035dde51a45cf17b567daf024439a09c57fd4b345777a3214f46b726b1/scamp-0.3.1-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "47636b7cbac7a60314b57939ad4094dc", "sha256": "dfde02ec59ab187f87042ecc65e750408ed4257f4582bf07e38c34b818b89aea" }, "downloads": -1, "filename": "scamp-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "47636b7cbac7a60314b57939ad4094dc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11353230, "upload_time": "2019-08-14T03:24:56", "url": "https://files.pythonhosted.org/packages/b2/d7/06035dde51a45cf17b567daf024439a09c57fd4b345777a3214f46b726b1/scamp-0.3.1-py3-none-any.whl" } ] }