{ "info": { "author": "Dominik George", "author_email": "nik@naturalnet.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Artistic Software", "Topic :: Multimedia :: Sound/Audio :: Conversion", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "MMLlib - Modern library for handling Music Macro Language\n=========================================================\n\nAbout\n-----\n\nMMLlib is a pure Python implementation of functionality related to the\n`Music Macro\nLanguage `__ as\nimplemented by Microsoft\u00ae GW-BASIC\u00ae and compatibles, which is its most\ncommon form, also implemented by the PC speaker driver in Linux and\n`BSD `__, with a number of extensions\nand changes:\n\n- ``|`` denotes a bar line, ignored by the Linux/BSD driver\n- support for multiple (parallel) instrument tracks\n- a per-file header with work metadata (optional)\n- lines starting with a ``#`` are comments\n- the alias ``~`` is not supported\n\nThe library currently contains functions to:\n\n- parse an (extended) MML file into metadata and individual tracks\n- a duration estimate and the number of tracks is added to the metadata\n- return a list of tuples (frequency, duration) to play (in a threaded\n interpreter, such as Floppi-Music)\n- bar lines are indicated separately as integer ``1``\n- return an event-oriented list of measures / bars across all tracks;\n each measure has a duration and a list of time-fixed tone on/off\n events; facilitates playing in non-threaded interpreters and,\n possibly, MIDI export\n- export (extended) MML to MusicXML\n- which can be imported by e.g. `MuseScore `__\n to\u2026\n\n - double-check the MML score for mistakes in a visual representation\n - play, arrange, etc. the music\n - beautify the score to print it as sheet music\n - export into other formats or share on their website\n\n- check tracks for synchronisation error\n- missing tracks, i.e. with 0 bars\n- missing bars (can only be detected at the end, of course)\n- missing notes within a bar, relative to other tracks\n\nExamples\n--------\n\nSome example extended MML files are contained within the examples/\ndirectory, in lieu of better documentation for the extended format, in\naddition to the `MML format documentation\n`__.\n\nProjects using MMLlib\n---------------------\n\n::Floppi-Music::\n `Floppi-Music `__ has\n MML as input format for floppy drive music on Raspberry Pi and uses\n MMLlib for processing. Floppi-Music is also the origin of MMLlib.\n\nDescription of the (extended) music macro language\n==================================================\n\nBased on http://www.antonis.de/qbebooks/gwbasman/play.html and\nhttps://www.mirbsd.org/man4/spkr .\n\nSymbols of MML\n--------------\n\n:A-G[#,+,-][length]:\n A-G are notes. # or + following a note produces a sharp; - produces a\n flat.\n\n:L(n):\n\n Sets the length of each note. L4 is a quarter note, L1 is a whole note,\n and so on. n may be from 1 to 64. Length may also follow the note to\n change the length for that note only. A16 is equivalent to L16A. Default\n is L4.\n\n:ML:\n Music legato. Each note plays the full period set by L.\n\n:MN:\n Music normal. Each note plays seven-eighths of the time determined by L\n (length).\n\n:MS:\n Music staccato. Each note plays three-quarters of the time determined by\n L.\n\n:N(n):\n Play note n. n may range from 0 to 84. In the 7 possible octaves, there\n are 84 notes. n set to 0 (or omitted) indicates a rest.\n\n:O(n):\n Octave 0 sets the current octave. There are 7 octaves (0 through 6).\n Default is 4. Middle C is at the beginning of octave 2.\n\n:P(n):\n Pause. n may range from 1-64; the current L value is used if omitted.\n\n:T(n):\n Tempo. T sets the number of L4s in a minute. n may range from 32-255.\n Default is 120.\n\n:. (period):\n A period after a note increases the playing time of the note by 3/2\n times the period determined by L (length of note) times T (tempo).\n Multiple periods can appear after a note, and the playing time is scaled\n accordingly. For example, A. will cause the note A to play one and half\n times the playing time determined by L (length of the note) times T (the\n tempo); two periods placed after A (A..) will cause the note to be\n played at 9/4 times its ascribed value; an A with three periods (A...)\n at 27/8, etc. Periods may also appear after a P (pause), and increase\n the pause length as described above.\n\n:>:\n A greater-than symbol raises the current octave by one.\n\n:<:\n A less-than symbol lowers the current octave by one.\n\n:\\|:\n Optionally used as a synchronisation mark for multi-track music. This is\n a proprietary extension in the Floppi-Music project.\n\nComments\n--------\n\nLines starting with # are comments. At the beginning of the file,\ncomments may be used to encode metadata. This is yet to be specified.\nThe current implementation parses key/value pairs separated by a colon\nand a space, strips both key and value, lower-cases the key and adds it\nto a dictionary.\n\nThe MusicXML export currently specifically recognises these keys:\n\n- Title, Copyright, Encoder (person), Source\n- Composer, Lyrics, Arranger, Translator *xor* Artist (deprecated, only\n one)\n\nAny other key is treated as miscellaneous field.\n\nVoices\n------\n\nThe voices of a song are interleaved. They are grouped per notation\nsystem, and the notation systems are seperated by empty lines.\n\nChangelog for MMLlib\n====================\n\n0.3\n---\n\n- Enable Python 3 compatibility.\n- Add new mmllint script.\n- Include example MML songs.\n- Add first parts of test suite.\n- Some bugfixes.\n\n0.2\n---\n\n- Add mml2musicxml script.\n\n0.1\n---\n\n- Separate from Floppi-Music.\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/Natureshadow/mmllib", "keywords": "", "license": "MirOS", "maintainer": "", "maintainer_email": "", "name": "MMLlib", "package_url": "https://pypi.org/project/MMLlib/", "platform": "", "project_url": "https://pypi.org/project/MMLlib/", "project_urls": { "Homepage": "http://github.com/Natureshadow/mmllib" }, "release_url": "https://pypi.org/project/MMLlib/0.3.0.post1/", "requires_dist": null, "requires_python": "", "summary": "Modern library for handling Music Macro Language", "version": "0.3.0.post1" }, "last_serial": 2604422, "releases": { "0.3": [ { "comment_text": "", "digests": { "md5": "e0ff09195576f6c15c19a96c62d9ac0d", "sha256": "74d603536845295f2ce783c11aeaaa15f1d715d33dd550ae34c8e0ab777c9ffa" }, "downloads": -1, "filename": "MMLlib-0.3-py2-none-any.whl", "has_sig": true, "md5_digest": "e0ff09195576f6c15c19a96c62d9ac0d", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 21218, "upload_time": "2017-01-29T02:53:35", "url": "https://files.pythonhosted.org/packages/2e/25/edc2aad341b77996bb50ece1ec759c571a9d9e62d7aeaa5d5289ad2bf5f2/MMLlib-0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0557ba07881eb2edccbc8b5098c6894b", "sha256": "87b7abbb429d8eb10b33c691db185f7e30b79f682821787ce8d079591b37903d" }, "downloads": -1, "filename": "MMLlib-0.3.tar.gz", "has_sig": true, "md5_digest": "0557ba07881eb2edccbc8b5098c6894b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26272, "upload_time": "2017-01-29T02:53:32", "url": "https://files.pythonhosted.org/packages/76/df/a871d569ccc39fdb9660a654d56f98d3a21fff24ade341cbb2c50fd90fa7/MMLlib-0.3.tar.gz" } ], "0.3.0.post1": [ { "comment_text": "", "digests": { "md5": "1d05f5aa09055843a915e1f22005062f", "sha256": "112e534ee39cc6887f459bfa2b6174a9d22f3c858acb8738fc4c885685dd9d36" }, "downloads": -1, "filename": "MMLlib-0.3.0.post1-py2-none-any.whl", "has_sig": true, "md5_digest": "1d05f5aa09055843a915e1f22005062f", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 21280, "upload_time": "2017-01-29T03:05:23", "url": "https://files.pythonhosted.org/packages/2d/4b/e35c3de700f071804b8a945c26d9b0c658d048f2b92a00301f52f30e6d84/MMLlib-0.3.0.post1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "90ed351b6c6eeea781d568656cd8690e", "sha256": "f59d6fb50c756165ec46d500c775d839d4937afa6b7dafe779859a5473d1c090" }, "downloads": -1, "filename": "MMLlib-0.3.0.post1-py3-none-any.whl", "has_sig": true, "md5_digest": "90ed351b6c6eeea781d568656cd8690e", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 21281, "upload_time": "2017-01-29T03:05:06", "url": "https://files.pythonhosted.org/packages/d4/6d/26cca480c6c90d884ece9199e089a60159bb791add7ec76c36b962690d9a/MMLlib-0.3.0.post1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c8e45ddc26f96b87f05d5659f4d5168d", "sha256": "ae70cc1ee0b909ac39047a5ae19df41790df2ec9d70c06b62ae172dfd76949af" }, "downloads": -1, "filename": "MMLlib-0.3.0.post1.tar.gz", "has_sig": true, "md5_digest": "c8e45ddc26f96b87f05d5659f4d5168d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26238, "upload_time": "2017-01-29T03:05:04", "url": "https://files.pythonhosted.org/packages/e9/36/8250559805642c680c168dc6c11ff7358c57d4f3a004ab317b49d323d816/MMLlib-0.3.0.post1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1d05f5aa09055843a915e1f22005062f", "sha256": "112e534ee39cc6887f459bfa2b6174a9d22f3c858acb8738fc4c885685dd9d36" }, "downloads": -1, "filename": "MMLlib-0.3.0.post1-py2-none-any.whl", "has_sig": true, "md5_digest": "1d05f5aa09055843a915e1f22005062f", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 21280, "upload_time": "2017-01-29T03:05:23", "url": "https://files.pythonhosted.org/packages/2d/4b/e35c3de700f071804b8a945c26d9b0c658d048f2b92a00301f52f30e6d84/MMLlib-0.3.0.post1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "90ed351b6c6eeea781d568656cd8690e", "sha256": "f59d6fb50c756165ec46d500c775d839d4937afa6b7dafe779859a5473d1c090" }, "downloads": -1, "filename": "MMLlib-0.3.0.post1-py3-none-any.whl", "has_sig": true, "md5_digest": "90ed351b6c6eeea781d568656cd8690e", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 21281, "upload_time": "2017-01-29T03:05:06", "url": "https://files.pythonhosted.org/packages/d4/6d/26cca480c6c90d884ece9199e089a60159bb791add7ec76c36b962690d9a/MMLlib-0.3.0.post1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c8e45ddc26f96b87f05d5659f4d5168d", "sha256": "ae70cc1ee0b909ac39047a5ae19df41790df2ec9d70c06b62ae172dfd76949af" }, "downloads": -1, "filename": "MMLlib-0.3.0.post1.tar.gz", "has_sig": true, "md5_digest": "c8e45ddc26f96b87f05d5659f4d5168d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26238, "upload_time": "2017-01-29T03:05:04", "url": "https://files.pythonhosted.org/packages/e9/36/8250559805642c680c168dc6c11ff7358c57d4f3a004ab317b49d323d816/MMLlib-0.3.0.post1.tar.gz" } ] }