Skip to navigation

Music

The iconic chords that add so much atmosphere to this unique robotic world

There isn't a great deal of music in The Sentinel, but the music that is there is absolutely brilliant. And I mean that - I genuinely love the music in this game. It is used sparingly but very effectively, and it evokes such a powerful atmosphere of 1980s retro-futurism, especially for those of us who grew up on the low-budget British television sci-fi of the 1970s and early 1980s. It is, in my humble and very unscientific opinion, just perfect for this game.

There are five short bursts of music in the game, as follows:

OffsetDescriptionMusic
0Hyperspace
25Transfer
40U-turn
50Game over
66Landscape completed

In this article, I'll take a look at both the code and the musical theory behind these wonderful musical phrases. Forgive me if my musical terminology is a bit rusty - it's been some decades since I passed my Grade 5 Theory exam, but it's certainly been fun to revisit...

Making music in The Sentinel
----------------------------

Before we look at the musical theory, let's examine the code. To play a piece of music, we call the PlayMusic routine with the offset shown in the table above. This sets the musicCounter variable to the offset and sets the soundEffect variable to 3, to denote that the sound processor should play music from the specified offset.

The sound processor is described in the deep dive on sound effects, but to summarise, setting soundEffect to 3 configures any calls to the sound processor routine at ProcessSound to jump straight to the ProcessMusic routine. Calls to the sound processor can be scheduled by setting the soundCounter variable, which adds a delay, measured in 1/50s of a second, before processing the sound effect; we use this delay to play notes and chords at the correct times.

The ProcessMusic routine works through the music data for the tune being played, and plays the specified notes by calling the MakeSound routine to make sound #3 (which is the sound effect we use for all music). The data for all five pieces of music is stored in the musicData table, and the current position within the data is denoted by the musicCounter variable (so this is why we play a specific piece of music by passing in an offset, as this is the offset of the relevant data within the musicData table). The music counter increments with each call to ProcessMusic, so the routine processes the data one byte at a time. Setting bit 7 of musicCounter makes ProcessMusic abort as soon as it is called, so this disables the music.

The format of the music data is as follows:

  • If the data byte is &FF, this denotes the end of the music, so set bit 7 of the music counter to stop processing any more music data.
  • If the data byte is in the form 200 + x, then set the sound counter for all the following notes to 4 * x, measured in 1/50 second, and then move on to process the next byte of music data.
  • Otherwise the data byte is the pitch of the note to play, so play it by calling MakeSound and return from the subroutine.

Each note is played on a separate tone channel, working through channels 1 to 3 in sequence before wrapping around from channel 3 back to channel 1. This means, for example, that we can play three-note chords across successive calls to ProcessMusic, like this:

  • First call to ProcessMusic: Zero the sound counter by using a data byte of 200, followed by a data byte containing the pitch of the first note in the chord. This plays the first note in the chord without any delays.
  • Second call to ProcessMusic: Process the data byte containing the pitch of the second note in the chord. This plays the second note in the chord without any delays.
  • Third call to ProcessMusic: Set the sound counter to the desired length of the chord by using a data byte of 200 + n (where the chord will be held for n * 4 / 50 seconds, so a data byte of 206 will make the chord last for 6 * 4 / 50 = 1.92 seconds, for example). Follow this with the data byte containing the pitch of the third note in the chord. This plays the third note in the chord now, and then delays any more music processing until the sound counter has counted down, so the chord is held for the correct amount of time.

Setting the counter to zero for the last chord in a piece of music ensures that the last chord plays until it naturally decays according to the sound envelope for sound #3.

That's how the music is played, so now let's look at the music itself.

An elegy in C# minor
--------------------

The music in The Sentinel is atmospheric, and it's all down to the notes around which the music is based. Here's a breakdown of each piece of music into its constituent notes, along with the name of the chord to which those notes belong:

MusicNotesChord
HyperspaceC# E F# B C#C# minor 11th
TransferC# E D# B C#C# minor 9th
U-turnB C#C# minor 9th
Game overC# G# D# E G# (arpeggio)
C# G# E D# G# C# (glissando)
C# minor added 9th
Landscape completedC# B F# E D# C#C# minor 11th

You'll notice that the notes in each piece are all based on variations of the C# minor chord, which gives the game music the sombre feeling of a minor key. The chords themselves are known as "added note chords", because they take the standard C# minor chord and add extra notes to give the music a different feeling.

Chords are made up of a root note, plus various notes at different intervals above the root. In the case of C# minor, these are the notes that the game uses:

  • Root = C#
  • Minor third = E
  • Perfect fifth = G#
  • Minor seventh = B
  • Major ninth = D#
  • Major eleventh = F#

Each piece of music consists of a sequence of notes from this list, so the hyperspace sound consists of the note sequence C# E F# B C#, for example. The notes used in each piece of music vary, but in each case the range of notes used is taken from a specific kind of chord (so, in theory, you could play all the notes in each piece at the same time, and they would work as a chord rather than a cacophony). Let's look at these chord structures in more detail, as that's where the heart of the game's musical score lies.

The standard C# minor chord is made up of the first three notes in the list above (so that's the root in C#, the minor third in E, and the perfect fifth in G#). We use this chord as the basis for creating the added note chords used in the game, as follows:

ChordChord nameConstructionNotes
C#mC# minorRoot
Minor third
Perfect fifth
C# E G#
C#madd9C# minor added ninthRoot
Minor third
Perfect fifth
Major ninth
C# E G# D#
C#m9C# minor ninthRoot
Minor third
Perfect fifth
Minor seventh
Major ninth
C# E G# B D#
C#m11C# minor eleventhRoot
Minor third
Perfect fifth
Minor seventh
Major ninth
Major eleventh
C# E G# B D# F#

Each of the chords above builds on the previous chord by adding one more note, so the chords are built up as follows:

  • C#m = root (C#) + minor third (E) + perfect fifth (G#)
  • C#madd9 (game over) = C#m + major ninth (D#)
  • C#m9 (transfer, U-turn) = C#madd9 + minor seventh (B)
  • C#m11 (hyperspace, landscape completed) = C#m9 + major eleventh (F#)

Each of these additional notes brings something new to the sound.

We start with the C#m chord, which contains the root note and adds an element of sadness with the minor third and a stable anchor in the shape of the perfect fifth (see the next section for more about the perfect fifth). This chord isn't used in-game, but it's the main building block for all of the music.

We then add the major ninth in D# to get the C#madd9 chord, which is used for the game over sound, one of the most atmospheric pieces in the game. The added ninth chord is perhaps most famous for adding colour to the start of Every Breath You Take by The Police, where the first two chords of Andy Summers' beautiful guitar-picking are Aadd9 and F#madd9. This was clearly a chord that was familiar to Mike Follin, who did the deeply impressive ZX Spectrum conversion of The Sentinel. He told me the following:

I loved the music in the game too. I play guitar and I think Geoff had one in his office. I'd figured out one tune was an arpeggio based on a C# minor added 9th chord and said that to him, and he said something like, "Oh, is it?"

As a reminder, here's the game over music from the BBC Micro version:

To celebrate the high probability that this clever composition was indeed done on a guitar, here's the game over music in the form of a guitar tab, in case you want to play along:

E:--------------------9--------------|
B:----------------9----9-------------|
G:-------------9--------9------------|
D:---------13------------13----------|
A:-----11-----------------11---------|
E:--9----------------------9---------|

And here it is transposed into GarageBand and played on a classical guitar rather than the Texas Instruments SN76489 sound chip in the BBC Micro:

It's interesting how the computer version sounds more dissonant - or it does to me, at least. I think there are two reasons for this. First, the sound envelope used for the in-game music varies the pitch in a slightly unsettling way, so that it not only adds vibrato, but it also messes with the pitch to add a slightly off-colour microtonal effect. And second, because the in-game notes cycle through the three available sound channels, this means you only ever hear the last three notes to be hit (unlike on the guitar, where all the notes in the glissando persist).

The guitar version contains the exact same notes as in the game, but the limitations of the BBC Micro's sound chip make the latter version sound less human and more dystopian. It's very clever, I think, but it's also a bit hard to believe, to my ears at least. So here are the two glissandos, slowed down. First, here are the notes from the game:

And here are the notes on guitar:

They're exactly the same notes, in the same order and with the same timings, but the lingering chord at the end of the in-game glissando feels more mournful to me than the guitar version. See if you can hear it - here's the full speed in-game music again:

And here it is on guitar:

Is it just me? Does that feel different? I wonder...

Moving on to the next chord, we take C#madd9 and add the minor seventh to get C#m9, which we use for the transfer and U-turn sounds. The U-turn consists of just the last two notes of the transfer sound, but this does include the added note, B, which is the first note in the two-note U-turn sound. The minor seventh adds a slightly sultry and almost jazz-like feeling to the sound; it's certainly a very catchy bit of music.

The final form of the chord is created by adding a major eleventh to C#m9 to get C#m11, which is used for the hyperspace and landscape completion sounds. Adding the major eleventh note lifts the chord somewhat, giving the hyperspace and victory music a bright lift in the middle with the high F#, as befits the excitement of winning.

Notes as chords and interesting timings
---------------------------------------

If you've been playing the samples above, you may have noticed that some of the notes are made up of more than one tone. It turns out that some of the pieces are actually played as sequences of chords rather than notes, but I purposely left this out of the explanation above to avoid confusing things. Let's look at this now.

The simpler musical pieces - hyperspace, transfer and U-turn - are all played with chords rather than single notes. The music data defines each "note" as a three-note chord that's made up of the note that we want to play on sound channel 1, along with that note's perfect fifth on both sound channels 2 and 3 (so when playing a C# note, for example, we actually play it as a C# along with two channels of G#).

The perfect fifth is one of the most stable intervals, which means that it is a very consonant pairing with the base note (where a consonant pairing is the opposite to a dissonant pairing). To put it another way, adding a perfect fifth to a note stabilises and enhances the sound of that note without changing its feeling in the way that adding other intervals can.

Things get a bit more interesting in the game over sound, as instead of playing chords, the notes run into each other. The first five notes build into a chord, one note at a time (this is called an "arpeggio"), before the final six notes run back down, one quickly following the other in what is called a "glissando". The notes are evenly spaced, with the arpeggio adding one note every 16/50 seconds, and the glissando falling away with one note every 4/50 seconds. It's regular, and effectively splits up the chords into individual notes that are played separately, but almost together.

Things are a lot looser in the landscape completion sound. This piece is made up of six chords, each of which follows the "note plus two perfect fifths" structure above, but the notes in each of these chords are separated by 4/50 of a second, giving an individual arpeggio effect to each chord. Not only that, but the gap between each chord varies as the tune progresses, starting with a long gap of 48/50 of a second between the first two chords, and then shorter gaps between the rest of the chords that seem to slow down, with gaps of 20/50, 24/50, 28/50 and 36/50 of a second taking us all the way to the last chord. It makes for a relaxed and almost languid end after the frantic pace of the game itself.

Tuning down
-----------

One final interesting aspect of the music in The Sentinel is that every note is tuned down by one quarter of a semitone. The BBC Micro User Guide that comes with every machine lists, on page 181, the pitch values that can be passed to the SOUND command in BBC BASIC to produce specific notes. In this list, C# is given a pitch value of 9, but in The Sentinel's music data in the musicData table, C# is given a pitch of 8, and every other note in the music data is similarly one less than the official note list would imply.

Is this an example of Geoff Crammond detuning the music in The Sentinel by the smallest microtone available, just so that it feels slightly different and out of kilter with the notes that we're all used to? It's an intriguing thought.