Versiebeheer voor Ableton Live projecten met Git
De workflow van muziek maken komt niet heel erg overeen met de workflow van code schrijven. Echter, die laatste heeft wel wat dingen die ook heel nuttig kunnen zijn voor producers. Met een beetje configuratie kan je ervoor zorgen dat je Git kan gebruiken voor versiebeheer van Ableton projecten.
De digital audio workstation die ik altijd gebruik om muziek in de maken is Ableton Live. Van zichzelf heeft Ableton uiteraard “undo” en “redo” operaties, en zelfs lineaire versies, maar veel verder gaat het niet. Die zijn handig, maar niet altijd goed genoeg. Tijdens het maken van muziek is het soms namelijk fijn om twee compleet verschillende richtingen te kunnen proberen, die te vergelijken om te kijken welke meer bevalt, en daarop verder te werken. En het zou helemaal ideaal zijn als je op een later punt toch nog even de richting kan checken die je niet gekozen hebt.
Voor developers zal die aanpak misschien al bekend klinken, want het gebruik van versiebeheer, en daarmee branches maken binnen je project is iets wat wij dagelijks doen met Git. Dus met dat in gedachten ging ik kijken naar een manier om versies van Ableton-projecten op die manier te beheren. Een Ableton-projectbestand is echter niet iets wat je “zomaar” in Git kan stoppen. Dat is namelijk een groot .als
bestand waar alle informatie over je project in zit, in binaire vorm. Git werkt vaak niet prettig met zulk soort grote bestanden. Na wat uitzoeken bleek echter dat dat bestand gewoon een gzip-archief is, met daarin pretty-printed XML-bestanden, perfect voor Git! Vervolgens werd de vraag: hoe kan je zorgen dat Git het grote .als
bestand in je werkmap laat staan zodat Ableton daarmee kan werken, maar wel de uitgepakte XML in versiebeheer stopt? Daar heeft Git een stukje configuratie voor, in de vorm van filters.
Filters in Git bestaan uit twee onderdelen: een clean en een smudge. Deze onderdelen zijn elkaars inverse, wat je kan zien als: clean(smudge(input)) = input
. Deze stappen worden uitgevoerd wanneer Git bestanden uitwisselt tussen je worktree (de map waar je in werkt), en de .git
map. De clean wordt gebruikt van de worktree naar de .git
map, en smudge de andere kant op. Deze stappen configureer je allebei met een commando wat bestanden binnenkrijgt van stdin, en de output schrijft naar stdout. In ons geval kunnen we zcat
als clean gebruiken om het Ableton-bestand uit te pakken voor Git, en gzip
als smudge om het weer in te pakken voor Ableton. Dit configureer je eenvoudig met deze commando’s:
git config --global filter.gzipped.clean "zcat" git config --global filter.gzipped.smudge "gzip"
De --global
vlag zorgt ervoor dat dit filter niet alleen binnen je huidige project beschikbaar is, maar op je hele machine. Daardoor hoef je het maar één keer in te stellen. Het volgende deel bestaat uit drie onderdelen gescheiden met een punt: “filter”, de naam van je filter (hier “gzipped”), en “clean” of “smudge”. Als laatste geef je het commando wat uitgevoerd moet worden.
Nu we het “gzipped” filter geconfigureerd hebben, moeten we nog wel instellen dat Git dat ook echt gebruikt voor .als
bestanden. Dat doen we met een .gitattributes
bestand:
*.als filter=gzipped
Verder is het ook handig om Git te vertellen dat audio- en video-bestanden in large file storage (LFS) gestopt moeten worden, zodat het ook goed om kan gaan met exports:
*.aif filter=lfs diff=lfs merge=lfs -text *.aiff filter=lfs diff=lfs merge=lfs -text *.it filter=lfs diff=lfs merge=lfs -text *.mod filter=lfs diff=lfs merge=lfs -text *.mp3 filter=lfs diff=lfs merge=lfs -text *.ogg filter=lfs diff=lfs merge=lfs -text *.s3m filter=lfs diff=lfs merge=lfs -text *.wav filter=lfs diff=lfs merge=lfs -text *.xm filter=lfs diff=lfs merge=lfs -text *.mp4 filter=lfs diff=lfs merge=lfs -text
Met dit opgezet heb je alles wat je nodig hebt voor Ableton projecten in Git! Omdat dit nu mijn standaard manier van werken is, heb ik er ook een template repository voor gemaakt, die ik kan forken om zo geen moeite in de opzet meer te hoeven stoppen. Daar zit zelfs al een leeg Ableton project in met een standaard opzet, zodat ik bijna direct kan beginnen zodra ik een idee heb.
Een interessant bijkomstig effect van deze opzet is dat het mogelijk wordt om verschillende branches van een project te mergen – ervan uitgaande dat je je weg kan vinden in XML. Zo zou je bijvoorbeeld twee verschillende tracks kunnen maken op een losse branch, en deze later samenvoegen. Ik zou het dan ook een leuk experiment vinden om een keer muziek te maken met een andere developer die ook deze opzet gebruikt.
Wil je horen wat voor muziek ik hier allemaal mee maak? Kijk dan vooral eens op mijn SoundCloud! De project opzet kan je ook terugvinden op GitHub, voor als je er zelf gebruik van wil maken of mee wil experimenteren: github.com/infi-nl/example-ableton-live-project.