{"id":17965211,"url":"https://github.com/tokenrove/mumble","last_synced_at":"2026-02-24T15:34:16.489Z","repository":{"id":11580012,"uuid":"14069403","full_name":"tokenrove/mumble","owner":"tokenrove","description":"Mumble is a package for converting text representations of music into data for specific playroutines.","archived":false,"fork":false,"pushed_at":"2017-09-28T15:23:42.000Z","size":45,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-03T19:47:05.622Z","etag":null,"topics":["chiptune","common-lisp","mml","music"],"latest_commit_sha":null,"homepage":null,"language":"Common Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tokenrove.png","metadata":{"files":{"readme":"README","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-11-02T16:27:45.000Z","updated_at":"2015-01-29T14:22:47.000Z","dependencies_parsed_at":"2022-09-15T09:52:28.978Z","dependency_job_id":null,"html_url":"https://github.com/tokenrove/mumble","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tokenrove/mumble","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tokenrove%2Fmumble","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tokenrove%2Fmumble/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tokenrove%2Fmumble/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tokenrove%2Fmumble/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tokenrove","download_url":"https://codeload.github.com/tokenrove/mumble/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tokenrove%2Fmumble/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264396641,"owners_count":23601545,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chiptune","common-lisp","mml","music"],"created_at":"2024-10-29T12:10:30.754Z","updated_at":"2025-10-26T18:17:15.730Z","avatar_url":"https://github.com/tokenrove.png","language":"Common Lisp","funding_links":[],"categories":[],"sub_categories":[],"readme":"mumble\nJulian Squires \u003ctek@wiw.org\u003e / 2004\n\n\nMumble is a package for converting text representations of music into\ndata for specific playroutines.  The format, described in this\ndocument is a variant on the (popular?) Music Macro Language (or MML)\nformat.\n\nI started writing this package so I could convert some of my older\nsongs (written in MML, for the NES) to a new Atari ST playroutine I\nwas writing.  Along the way, I realized that this was my opportunity\nto make some changes to the input format, and start using a single\nsource for output for various playroutine targets.\n\nThis format may not be ideal for formats with more than about eight\nchannels, but I rarely work with more than five, anyway.\n\n\nPLAYROUTINES (REPLAYS) SUPPORTED\n\n* YMamoto -- my primitive Atari ST YM-2149 playroutine.\n\nREPLAYS I PLAN TO WRITE MYSELF AND SUPPORT\n\n* nes (soon)\n* some kind of opl[23] playroutine.\n* a SID replay.\n* some snes spc replay\n\nUNSUPPORTED REPLAYS I'D LIKE TO SUPPORT\n\n* hubbard -- Rob Hubbard's \"Monty on the Run\" playroutine.\n* mod -- Protracker-style 4-channel MODs. (no specific replay)\n* ahx, fc\n* mck\n* something on the atari 800XL\n\n\nUSING MUMBLE FROM THE LISP REPL\n\nYou should be able to just:\n\u003e (asdf:oos 'asdf:load-op 'mumble)\n\u003e (mumble:compile-mumble \"my-file.out-ext\" \"tune-1.in\" \"tune-2.in\")\nand everything should work.\n\n\nINPUT FORMAT BASICS\n\nI'll just describe significant differences from MML here, for the\nmoment.  (See various documents on the MML format available in the NES\nscene.)  All of this syntax might change at any time.  (Sorry.)\n\nThe biggest obvious change is that the \"l\" command is gone, and now\nnote duration is relative to the previous note duration input for the\nchannel in question.  Lilypond has this behavior, and I find it pretty\nnice (also, it should make it easier for me to typeset the music in my\nchiptunes).  Unfortunately it's probably the most annoying thing about\nconverting old MML files over to mumble.  I will probably add a\ncompatibility flag once I get sufficiently annoyed.\n\nYou can put \"|\" in the input and it will be ignored; I find it makes\nthings a lot cleaner, as I can keep track of my barlines in the input.\n\nGeneric macro dispatch is done with the \"@\" prefix, more in the style\nof CL's \"#\" macro dispatch (partially because I've had some thoughts\nof changing things to use CL readtables instead of doing all the\nparsing myself).\n\n@a =\u003e arpeggio.  Followed by digits indicating arpeggio number,\n      or 0 for arpeggio off.\n@b =\u003e pitch macro (mnemonic: bend).\n@d =\u003e volume macro? (mnemonic: dynamics).  For scripting time\n      signatures/repeated rhythmic accents, etc.\n@i =\u003e instrument.  An instrument is, broadly, a snapshot of partial\n      channel state; what that means depends on the replay.\n@t =\u003e tempo macro?  For scripting rallentendos and accelerandos.\n@v =\u003e (software) volume envelope.\n@~ =\u003e vibrato.\n\n\nPlayroutine-specific commands are done with the \"%\" prefix, which\nmeans that the old MML use of \"%\" to specify an absolute number of\nticks for a note is no longer supported.\n\nFor example, I'll show a few \"%\" commands from my YM playroutine\nsupport, and from my NES playroutine support.\n\nYM:\n\n%e[uo4] =\u003e set hardware envelope to follow current notes at {unison,\n\t   octave, 4th below}.\n... envelope sweep, noise carrier, AM sample playback\n\nNES:\n\n... timbre switching; channel A hardware sweep; looped noise...\n\nSID:\n\n... timbre switching/PWM; filter control; hard reset control...\n\nThe general idea is that one should be able to write a tune, and adapt\nit to various platforms primarily by changing the \"%\" commands; \"@\"\ncommands should be basically common to all replays.  (I'm also going\nto think more about this and possibly support some kind of conditional\ncompilation or option to ignore certain commands when using a certain\nreplay.)\n\nSome playroutines require use of instruments for most effects, while\nothers don't use instruments at all.  Playroutine outputs that don't\nuse instruments should silently translate instrument use to\nappropriate commands.\n\nThe old data skip command, \"!\", has become a dispatch for general\nstructural commands:\n\n!loop =\u003e song loop (formerly \"L\").\n!end =\u003e end of track (kind of like the old \"!\").\n\n\n\nCAVEATS\n\nDots in durations must follow an integer duration value.  (You can't\nwrite, for example, \"a4 b. c8\")\n\nRepeats (\"[abcabc]42\") are always unfolded during parsing, to keep\nbasic output routines simpler.  It's my belief that the output routine\ncode can do its own repeat optimization if it wants to, and it can do\nit better than a human.  Repeats should be inserted to keep the\noriginal clean and readable.\n\n\nIDEAS\n\nTempo macros, for defining rallentendos, accellerandos, fermatas, et\ncetera.\n\nLarge-scale volume macros, to define time signatures, et cetera.\n\nThe playroutine output code is responsible for complaining to the user\nif a feature is not supported (for example, using vibrato outside of\nan instrument definition; or defining more than 32 instruments); but\nthe events that trigger these complaints should have original file\ninformation with them so that line and ideally character positions can\nbe reported back to the user.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftokenrove%2Fmumble","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftokenrove%2Fmumble","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftokenrove%2Fmumble/lists"}