Portal Theme on Microbit

One feature of the microbit I haven't explored too much in the past was the music module. This module lets you play simple tunes using a dsl for pitches, octaves and durations (and, of course, rests). You can read the details of the API here.

I thought it would be fun to write a program to play Jonathan Coulton's end theme from the game Portal.


from microbit import *
import music

still_alive = [
    # this was a tri
    "R:4",
    "g6:1",
    "f#",
    "e",
    "e",
    # umph
    "f#:4",
    "R:4",
    # I'm making a note
    "R:2",
    "R:1",
    "a5:1",
    "g6",
    "f#:1",
    "e",
    "e:2",
    # here Huge Success
    "f#:3",
    "d:2",
    "e:1",
    "a5:5",
    # it's
    "R:3",
    "a:1",
    # hard to overstate
    "e6:2",
    "f#:1",
    "g:3",
    "e:1",
    "c#:2",
    # my satisfact
    "d:3",
    "e:2",
    "a5:3",
    # tion
    "f#6:3",
    "R:4",
    # aperture science
    "R:4",
    "g:1",
    "f#",
    "e",
    "e",
    "f#:4",
    "R:4",
    # we do what we must
    "R:2",
    "R:1",
    "a5:1",
    "g6",
    "f#:1",
    "e",
    "e:3",
    # because we can
    "f#:1",
    "d:3",
    "e:1",
    "a5:5",
    "R:4",
    # for the good of all
    "e6:2",
    "f#:1",
    "g:3",
    "e:1",
    "c#:3",
    # of us except for the
    "d:1",
    "e:2",
    "a5:1",
    "d6",
    "e",
    # ones who are dead. But theres
    "f",
    "e",
    "d",
    "c",
    "R:2",
    "a5:1",
    "a#:1",
    # no sense crying over
    "c6:2",
    "f:2",
    "e:1",
    "d",
    "d",
    "c",
    # every mistake you just
    "d:1",
    "c6:1",
    "c6:2",
    "c6:2",
    "a5:1",
    "a#:1",
    # keep on trying till you
    "c6:2",
    "f:2",
    "g:1",
    "f:1",
    "e:1",
    "d:1",
    # run out of cake and the
    "d:1",
    "e6:1",
    "f6:2",
    "f:2",
    "g:1",
    "a:1",
    # science gets done and you
    "a#:1",
    "a#:1",
    "a:2",
    "g:2",
    "f:1",
    "g:1",
    # make a neat gun for the
    "a:1",
    "a:1",
    "g:2",
    "f:2",
    "d:1",
    "c:1",
    # people who are still alive
    "d:1",
    "f",
    "f",
    "e:2",
    "f#:1",
    "f#:1",
]

music.set_tempo(bpm=60)
music.play(still_alive)


The challenge was in notating it correctly with the right timings and pitches. Having everything in one list makes it a little bit difficult to maintain and to work out where you are if there is a problem but it does give you a nice compact music format very similar to the sonic pi dsl.