XML and XSLT

The AKS format is simply a zipped XML file (note that non-zipped XMLs work too). The XSD of the AKS format can be found at the root of the AT2 package.

Why XML some might ask?

Simply because this is a standard exchange format that is:

  • human-readable (most of the time)
  • quite easy to parse
  • easy to generate

Its only real inconvenience is its verbosity.

But there is one more advantage: thanks to a language like XSLT, it is possible to transform a song. With a script, one can, for example:

  • modify notes
  • generate new notes
  • mix songs into one
  • etc.

Don't hesitate to send me XSLT scripts, which can be published here for anyone to use!

Example: swap track notes

This example was kindly provided by Cpcitor. It swaps the middle (channel 2) and right (channel 3) notes.

Use:

{!{code}!}czoxMzk3OlwiJmx0Oz94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIj8mZ3Q7CiZsdDt4c2w6c3R5bGVzaGVldCB4bWxue1smKiZdfXM6YWtzPVwiaHR0cDovL3d3dy5qdWxpZW4tbmV2by5jb20vQXJrb3NUcmFja2VyU29uZ1wiIHhtbG5zOnhzbD08YSBocmVmPVwiaHR0cDp7WyYqJl19Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybVwiPlwiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtXCI8L2E+IHtbJiomXX12ZXJzaW9uPVwiPHN0cm9uZz4xLjE8L3N0cm9uZz5cIiZndDsKICAmbHQ7eHNsOm91dHB1dCBtZXRob2Q9XCJ4bWxcIiBlbmNvZGluZz1cInV7WyYqJl19dGYtOFwiIGluZGVudD1cInllc1wiLyZndDsKICAmbHQ7eHNsOnByZXNlcnZlLXNwYWNlIGVsZW1lbnRzPVwiKlwiLyZndDsKICAmbHQ7IS0te1smKiZdfUJhc2UgdGVtcGxhdGUgaW1wbGVtZW50aW5nIFhNTCBpZGVudGl0eSBmdW5jdGlvbi4tLSZndDsKICAmbHQ7eHNsOnRlbXBsYXRlIG17WyYqJl19YXRjaD1cIkAqfCp8cHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpfGNvbW1lbnQoKXxub2RlKClcIiZndDsKICAgICZsdDt4c2w6Y29weSZne1smKiZdfXQ7CiAgICAgICZsdDt4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD1cIip8QCp8dGV4dCgpfHByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oe1smKiZdfSl8Y29tbWVudCgpfG5vZGUoKVwiLyZndDsKICAgICZsdDsveHNsOmNvcHkmZ3Q7CiAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7CiAgJmx0e1smKiZdfTshLS1Td2FwIG1pZGRsZSAoMikgYW5kIHJpZ2h0ICgzKSB0cmFja3MuIFNob3VsZCB3b3JrIGV2ZW4gd2l0aCBBS1MgZmlsZXMgdGh7WyYqJl19YXQgaGF2ZSBtb3JlIHRoYW4gMSBQU0cuIC0tJmd0OwogICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9XCJha3M6cGF0dGVyblwiJmd0Owoge1smKiZdfSAgICZsdDt4c2w6Y29weSZndDsKICAgICAgJmx0O3hzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PVwiYWtzOmhlaWdodFwiLyZndDsKIHtbJiomXX0gICAgICZsdDt4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD1cImFrczpzcGVlZFRyYWNrTnVtYmVyXCIvJmd0OwogICAgICAmbHQ7eHN7WyYqJl19bDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PVwiYWtzOmV2ZW50VHJhY2tOdW1iZXJcIi8mZ3Q7PHN0cm9uZz4KICAgICAgJmx0O3hzbDphe1smKiZdfXBwbHktdGVtcGxhdGVzc2VsZWN0PVwiYWtzOnBhdHRlcm5DZWxsWzEmZ3Q7PXBvc2l0aW9uKCldXCIvJmd0OwogICAgICAmbHQ7eHNsOntbJiomXX1hcHBseS10ZW1wbGF0ZXNzZWxlY3Q9XCJha3M6cGF0dGVybkNlbGxbM11cIi8mZ3Q7CiAgICAgICZsdDt4c2w6YXBwbHktdGVtcGxhdGV7WyYqJl19c3NlbGVjdD1cImFrczpwYXR0ZXJuQ2VsbFsyXVwiLyZndDsKICAgICAgJmx0O3hzbDphcHBseS10ZW1wbGF0ZXNzZWxlY3Q9XCJha3M6cHtbJiomXX1hdHRlcm5DZWxsW3Bvc2l0aW9uKCkmZ3Q7PTRdXCIvJmd0Ozwvc3Ryb25nPgogICAgJmx0Oy94c2w6Y29weSZndDsKICAmbHQ7L3hzbHtbJiomXX06dGVtcGxhdGUmZ3Q7CiZsdDsveHNsOnN0eWxlc2hlZXQmZ3Q7XCI7e1smKiZdfQ=={!{/code}!}

Use:

xsltproc -o <output.aks> <script above.xsl> <input song.aks>