{"id":13430653,"url":"https://github.com/carrierdown/mutateful","last_synced_at":"2025-12-15T23:48:28.899Z","repository":{"id":13973178,"uuid":"73474932","full_name":"carrierdown/mutateful","owner":"carrierdown","description":"Add-on for Ableton Live that enables live coding functionality fully integrated into Live's session view.","archived":false,"fork":false,"pushed_at":"2023-12-07T09:50:19.000Z","size":1639,"stargazers_count":415,"open_issues_count":12,"forks_count":13,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-12-01T21:49:25.954Z","etag":null,"topics":["ableton","ableton-live","algorithmic-composition","csharp","dotnet6","live","live-api","live-coding","m4l","maxforlive"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/carrierdown.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-11-11T12:12:04.000Z","updated_at":"2025-11-28T21:58:25.000Z","dependencies_parsed_at":"2023-12-07T10:49:03.552Z","dependency_job_id":null,"html_url":"https://github.com/carrierdown/mutateful","commit_stats":null,"previous_names":["carrierdown/mutate4l"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/carrierdown/mutateful","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carrierdown%2Fmutateful","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carrierdown%2Fmutateful/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carrierdown%2Fmutateful/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carrierdown%2Fmutateful/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/carrierdown","download_url":"https://codeload.github.com/carrierdown/mutateful/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carrierdown%2Fmutateful/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27757808,"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","status":"online","status_checked_at":"2025-12-15T02:00:09.782Z","response_time":96,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["ableton","ableton-live","algorithmic-composition","csharp","dotnet6","live","live-api","live-coding","m4l","maxforlive"],"created_at":"2024-07-31T02:00:56.256Z","updated_at":"2025-12-15T23:48:28.870Z","avatar_url":"https://github.com/carrierdown.png","language":"C#","funding_links":[],"categories":["C# #","C#"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\u003cimg src=\"./assets/mutateful-logo.png\" alt=\"mutateful\"\u003e\u003c/h1\u003e\n\n**tl;dr:** `mutateful` enables live coding in Ableton Live's session view. Set up transformations that trigger whenever a source clip is changed, including arpeggiation, shuffling, and ratcheting/retriggering.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/carrierdown/mutateful/blob/master/assets/mu4l-walkthrough.gif\" alt=\"mutateful in action\"\u003e\n\u003c/p\u003e\n\n\u003e With live coding being all the rage this looks like a groovy new idea to bring that excitement and its new possibilities to Ableton. I’m watching closely.\n\u003e\n\u003e \u0026mdash; Matt Black, co-founder of Ninja Tune \u0026 Coldcut.\n\n## Concept\n`mutateful` transforms Ableton Live's session view into a live coding environment similar to a spreadsheet. It allows you to create formulas for shuffling, arpeggiating, constraining, scaling, retriggering, and transforming clips in various ways. These formulas use other clips and/or textual inputs to generate new clips. By utilizing Live's built-in sequencing functionality, mutateful allows you to use any existing MIDI clip as a starting point for new creative ideas.\n\n## Installing\n\nVisit the [latest release](https://github.com/carrierdown/mutateful/releases/latest) for installation instructions and download links for Windows and macOS.\n\n## See it in action\n\n\u003ctable cellpadding=\"0\" cellspacing=\"0\" style=\"border:none;\"\u003e\u003ctr\u003e\u003ctd\u003e\u003ca href=\"https://www.youtube.com/watch?v=PVVhnXSSHmg\"\u003e\u003cimg alt=\"creating beat variations with mutateful\" src=\"https://img.youtube.com/vi/PVVhnXSSHmg/0.jpg\" width=\"250\"\u003e\u003cp\u003eCreating beat variations\u003c/p\u003e\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://www.youtube.com/watch?v=YNI9ZxhSkWQ\"\u003e\u003cimg alt=\"mutateful demo video 1\" src=\"https://img.youtube.com/vi/YNI9ZxhSkWQ/0.jpg\" width=\"250\"\u003e\u003cp\u003eDemo #1: concat, constrain, transpose\u003c/p\u003e\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://www.youtube.com/watch?v=bGMBDap1-ko\"\u003e\u003cimg alt=\"mutateful demo video 2\" src=\"https://img.youtube.com/vi/bGMBDap1-ko/0.jpg\" width=\"250\"\u003e\u003cp\u003eDemo #2: ratchet, shuffle, interleave\u003c/p\u003e\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\n## A musical spreadsheet\n\nThe easiest way to understand what `mutateful` does is by comparing it to a traditional spreadsheet. Let's say you have two numbers that you'd like to multiply. You put one number in cell `A1`, another in `A2`, and in `A3` you enter the following (very simple) formula: `=A1 * A2`. Cell `A3` will then contain the result of this operation, and will update automatically whenever `A1` or `A2` changes. \n\nSince the session view in Ableton Live presents clips in a spreadsheet-like grid, `mutateful` works the same way, only with more musically interesting commands. For instance, you could shuffle the contents of clip `A1` using the contents of clip `A2`. The pitch values of the various notes in clip `A2` would then be used to shuffle the order of notes in `A1`. Similar to the example above, we would like the result to be inserted into clip `A3`, but instead of using a spreadsheet command we will use a `mutateful` command, as follows: `=A1 shuffle -by A2`. In this example, `A1` is a *source clip* (i.e. the clip that will be transformed), and `A2` is the *control clip* (i.e. the clip that controls the transformation). The latter could be omitted, in which case clip `A1` would be shuffled using itself as the control clip. The formula for this would simply be `=A1 shuffle`.\n\n## Usage examples\n\n### Creating an arpeggio from a sustained note and a chord\n\n`=B1 slice 1/2 transpose 0 7 slice 1/16 1/8 transpose -by C1`\n\nThis formula does the following: Start with the single sustained note contained in the clip at position `B1`. Slice it in half, keeping the first note unchanged and transposing the second note 7 semitones up (a perfect fifth). Now, slice the resulting two half-notes into a pattern alternating between 1/16 and 1/8th notes. Finally, transpose this pattern with the chord contained in the clip located at position `C1`.\n\n![Arpeggio from note and chord](./assets/Generated637068518186284593-clip.svg)\n\n### Interleaving two clips together\n\n`=B1 C1 interleave -mode event`\n\nThis formula combines the notes contained in the clips located at positions `B1` and `C1`, so that the notes from each clip are played one after the other in an alternating fashion.\n\n![Interleaving two clips](./assets/Generated637012367962797269-clip.svg)\n\n### Adding retriggering to a beat\n\n`=A4 ratchet 1 2 3 6 1 2 5`\n\nThis formula adds retriggering (also called ratchets) to the beat contained in clip `A4`. The numbers specify the retrigger amount for each note encountered in the clip. In this case, the first note in the clip will be divided into one (i.e. it will be kept as is), the second one will be divided into two, and so on. When the last number is reached it will loop back to the beginning if there are still unprocessed note events left in the clip. \n\n![Adding retriggering](./assets/Generated637069227069985789-clip.svg)\n\nRatchet accepts a number of other parameters to scale the resulting retriggers in various ways, including starting fast and going gradually slower towards the end of the note. This can be achieved by adding the `-shape` parameter and specifying EaseIn (the default is Linear). In addition, the resulting output can be tamed slightly by adding the `-strength` parameter and setting it to 0.5 (i.e. 50% strength):\n\n`=a4 ratchet 1 2 3 6 1 2 5 -shape easein -strength 0.5`\n\n![Adding retriggering with shaping](./assets/Generated637069235238519840-clip.svg)\n\n## Support\n\nIf you're having trouble getting Mutateful to work, you can start a new discussion in the [Q\u0026A section](https://github.com/carrierdown/mutateful/discussions/categories/q-a) here on Github. If you think you have encountered a bug or something that needs additional work to resolve, feel free to file a [new issue](https://github.com/carrierdown/mutateful/issues).\n\nIf you're looking for ways to support this project, you can support me by checking out/supporting my music on [Bandcamp](https://upland.bandcamp.com/).\n\n## Quick command reference\n\nCommand | Parameters (default values in **bold**) | Description\n--- | --- | ---\narpeggiate\u003cbr\u003earp | \u0026#8209;rescale\u0026nbsp;\u003c[Number](#parameter-types): **2**\u003e\u003cbr\u003e\u0026#8209;removeoffset\u003cbr\u003e\u0026#8209;by\u0026nbsp;\u003c[Clip reference](#parameter-types)\u003e | Arpeggiates the given clip using another clip, or itself.\nconcat\u003cbr\u003ecat |  | Concatenates two or more clips together.\ncrop | \u003clist of [Musical fraction](#parameter-types): **2**\u003e | Crops a clip to the desired length, or within the desired region.\nfilter\u003cbr\u003eflt | \u003c[Musical fraction](#parameter-types): **1/64**\u003e\u003cbr\u003e\u0026#8209;invert | Filters out notes shorter than the length specified (default 1/64). If -invert is specified, notes longer than the specified length are removed.\ninterleave\u003cbr\u003eil | \u0026#8209;chunkchords\u003cbr\u003e\u0026#8209;solo\u003cbr\u003e\u0026#8209;mode\u0026nbsp;NotSpecified\u0026#124;Event\u0026#124;**Time**\u003cbr\u003e\u0026#8209;ranges\u0026nbsp;\u003clist of [Musical fraction](#parameter-types): **1**\u003e\u003cbr\u003e\u0026#8209;repeats\u0026nbsp;\u003clist of [Number](#parameter-types): **1**\u003e\u003cbr\u003e\u0026#8209;skip | Combines notes from two or more clips in an interleaved fashion.\nlegato\u003cbr\u003eleg |  | Removes silence between notes. Basically the same as the built-in legato function in Live, but often useful in the context of a mutateful formula as well.\nloop | \u003c[Decimal number](#parameter-types): **1**\u003e | Lengthens the incoming clips according to the factor specified (e.g. 2 would double the clip length)\nmask | \u0026#8209;by\u0026nbsp;\u003c[Clip reference](#parameter-types)\u003e | Creates a masking clip which is used to remove or shorten notes not overlapping with the mask clip. If no -by clip is specified, a sustained note is used instead, effectively inversing the clip rhythmically.\nmonophonize\u003cbr\u003emono |  | Makes the clip monophonic by removing any overlapping notes. Lower notes have precedence over higher notes.\npadding\u003cbr\u003epad\u003cbr\u003ep | \u003c[Musical fraction](#parameter-types): **2**\u003e\u003cbr\u003e\u0026#8209;length\u0026nbsp;\u003c[Musical fraction](#parameter-types): **-1**\u003e\u003cbr\u003e\u0026#8209;post | Adds silence (i.e. padding) at the start of a clip, or at the end of a clip if -post is specified. If -length is specified, padding is calculated so that the total length of the clip matches this. If length is shorter than the current clip length, the clip is cropped instead.\nquantize\u003cbr\u003eqnt\u003cbr\u003eq | \u003clist of [Musical fraction](#parameter-types): **1/16**\u003e\u003cbr\u003e\u0026#8209;amount\u0026nbsp;\u003c[Decimal number](#parameter-types): **1.0**\u003e\u003cbr\u003e\u0026#8209;by\u0026nbsp;\u003c[Clip reference](#parameter-types)\u003e | Quantizes a clip by the specified amount against a regular or irregular set of divisions, or even against the timings of another clip.\nratchet\u003cbr\u003erat | \u003clist of [Number](#parameter-types)\u003e\u003cbr\u003e\u0026#8209;autoscale\u003cbr\u003e\u0026#8209;by\u0026nbsp;\u003c[Clip reference](#parameter-types)\u003e\u003cbr\u003e\u0026#8209;mode\u0026nbsp;Velocity\u0026#124;**Pitch**\u003cbr\u003e\u0026#8209;shape\u0026nbsp;**Linear**\u0026#124;EaseInOut\u0026#124;EaseIn\u0026#124;EaseOut\u003cbr\u003e\u0026#8209;strength\u0026nbsp;\u003c[Decimal number](#parameter-types): **1.0**\u003e\u003cbr\u003e\u0026#8209;velocitytostrength | Creates retriggers/ratchets in the current clip, based on a sequence of passed in values or another clip. The ratchets produced can be scaled and shaped in various ways.\nrelength\u003cbr\u003erelen\u003cbr\u003erl | \u003c[Decimal number](#parameter-types): **1.0**\u003e | Changes the length of all notes in a clip by multiplying their lengths with the specified factor.\nremap\u003cbr\u003erm | \u0026#8209;to\u0026nbsp;\u003c[Clip reference](#parameter-types)\u003e | Remaps a set of pitches to another set of pitches\nresize\u003cbr\u003ers | \u003c[Decimal number](#parameter-types): **1.0**\u003e | Resizes the current clip based on the specified factor (i.e. 0.5 halves the size of the clip, effectively doubling its tempo)\nscale\u003cbr\u003econstrain\u003cbr\u003escl | \u0026#8209;by\u0026nbsp;\u003c[Clip reference](#parameter-types)\u003e\u003cbr\u003e\u0026#8209;strict | Uses a clip passed in via the -by parameter as a scale to which the current clip is made to conform. If -strict is specified, notes are made to follow both the current pitch and octave of the closest matching note.\nsetlength\u003cbr\u003elength\u003cbr\u003elen\u003cbr\u003esl | \u003clist of [Musical fraction](#parameter-types): **1/16**\u003e | Sets the length of all notes to the specified value(s). When more values are specified, they are cycled through.\nsetpitch\u003cbr\u003epitch\u003cbr\u003esp | \u003clist of [Number](#parameter-types)\u003e\u003cbr\u003e\u0026#8209;by\u0026nbsp;\u003c[Clip reference](#parameter-types)\u003e | Sets the pitch of all notes to the specified value(s). When more values are specified, they are cycled through.\nsetrhythm\u003cbr\u003erhythm\u003cbr\u003esr | \u0026#8209;by\u0026nbsp;\u003c[Clip reference](#parameter-types)\u003e | Retains pitch and velocity from the current clip while changing the timing and duration to match the clip specified in the -by parameter.\nshuffle\u003cbr\u003eshf | \u003clist of [Number](#parameter-types)\u003e\u003cbr\u003e\u0026#8209;by\u0026nbsp;\u003c[Clip reference](#parameter-types)\u003e | Shuffles the order of notes by a list of numbers of arbitrary length, or by another clip. When another clip is specified, the relative pitch of each note is used to determine the shuffle order.\nskip | \u003clist of [Number](#parameter-types): **2**\u003e | Creates a new clip by skipping every # note from another clip. If more than one skip value is specified, they are cycled through.\nslice\u003cbr\u003eslc | \u003clist of [Musical fraction](#parameter-types): **1/16**\u003e | Slices a clip (i.e. cutting any notes) at a regular or irregular set of fractions.\ntake | \u003clist of [Number](#parameter-types): **2**\u003e | Creates a new clip by taking every # note from another clip. If more than one skip value is specified, they are cycled through.\ntranspose\u003cbr\u003etran\u003cbr\u003etp | \u003clist of [Number](#parameter-types)\u003e\u003cbr\u003e\u0026#8209;by\u0026nbsp;\u003c[Clip reference](#parameter-types)\u003e\u003cbr\u003e\u0026#8209;mode\u0026nbsp;**Absolute**\u0026#124;Relative | Transposes the notes in a clip based on either a set of passed-in values, or another clip.\nvelocityscale\u003cbr\u003evel\u003cbr\u003evs\u003cbr\u003ev | \u003c[Musical fraction](#parameter-types)\u003e | Scale a clips notes' velocities.\n\n## Parameter types\n\nType | Description\n--- | ---\nClip reference | Cells in the session view are referenced like they would be in a spreadsheet, i.e. tracks are assigned letters (A-Z) and clip rows are assigned numbers (1-N). Example: track 1 clip 1 becomes A1, track 2 clip 3 becomes B3.\nMusical fraction | These are commonly used in sequencer software to denote musical fractions like quarter notes, eight notes and so on. Examples: quarter note = 1/4, eighth note = 1/8.\nNumber | Whole number (integer), either negative or positive\nDecimal number | Decimal number, from 0.0 and upwards\n\n## Full documentation\n\nI've started adding more in-depth documentation in our [wiki](https://github.com/carrierdown/mutateful/wiki). There's still a long way to go, though.\n\nBe sure to star this repo and/or follow me at [twitter.com/KnUpland](https://twitter.com/KnUpland) for updates.\n\n## Compiling from source\n\n### Pre-requisites\n\n- Git\n- .NET 6 SDK\n\n### Building\n\nUsing the command line/terminal, navigate to the src folder inside the mutateful repository and run:\n\nWindows: `dotnet publish -c Release /p:RuntimeIdentifier=win-x64 /p:PublishSingleFile=true /p:UseAppHost=true`\u003cbr\u003e\nMacOS / OS X: `dotnet publish -c Release /p:RuntimeIdentifier=osx-x64 /p:PublishTrimmed=false`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarrierdown%2Fmutateful","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcarrierdown%2Fmutateful","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarrierdown%2Fmutateful/lists"}