Draw the roadways that drive the city.
Draw the roadways that drive the city.
this is a working draft.
While Peter and I both did quite a bit of coding on Mini Metro, we have very different ways of thinking and communicating. We had to overcome cross-disciplinary differences as well as the nuances of being from different English-speaking countries. We both learned quite a lot about the other person’s specialty (Peter about audio, and me about code).
We faced unique challenges in creating a 100% tempo based music system alongside a pre-existing game engine - we had to mold each system to the other, and even as a late add, the audio ended up informing the game design. We needed to make timing adjustments to some of the most basic game behaviors, such as how the passengers move about the subway.
Similarly, changing the audio parameters for a level actually changes the way the subway simulation runs. For example: the audio system controls the speed at which passengers embark/disembark from trains.
The takeaway here is that some gameplay design choices were able to be conceptualized with audio first, and then were later adopted by the rest of the game.
There is very little distinction between sound design and music in Mini Metro, and the audio attempts to function on multiple layers. There are aspects that communicate information about the subway system using direct and consistent analogies, and there are aspects that are more about creating an emotional atmosphere for the gameplay.
Peter and I gave a sweeping talk called →A Musical Subway (System) that covers a lot of topics regarding the audio in the game.
The musical concept of total serialism (applying value sets to different axes of sound) is used heavily in Mini Metro. For instance, the sound of the lines in the game are determined by sequenced data such as the number of stations on the line (sequence length), their order (sequence order), their station types (timbres), their occupancy rates (dynamics), their visual position on screen (panning), etc.
Historical Parallel - Pierre Boulez: Structures I (1952)
For more information, check out the talk I did on Mini Metro's →Serialism & Sonification.
I wanted the aesthetic to be as minimal as possible. Most sounds are subtle variations on the sine waveform. For example, the SFX & UI sounds are all controlled random variations on sine wave samples, using various signal chain effects.
If you consider each line as a performer playing a note in a given rhythm, each performer is slightly changing their performance over time, but slowly and systematically, based only on when (and how) the player updates that particular line in the subway system.
Historical parallel - Terry Riley: In C (1964)
The music had to be designed to work at 4 different speeds: Fast Forward, Pausing from Fast Forward, Normal, and Pausing from Normal. The different speeds generally have different attack times for the line pulses. The slower the clock, the longer the attack times tended to be by design. Faster speeds required tighter attacks to prevent muddiness.
Each line is represented and formally differentiated by a sequence of pulses of the same pitch, which internally are known as ==Line Loops==. The sequence is as long as the number of the stations on the line, with each station represented by a slightly different timbre corresponding to its shape. Each line can be semi-soloed when selected, and is casually differentiated by rhythm. This means that rhythm was not designed to be a mutually exclusive characteristic for the lines, while pitch was. In hindsight, it would have been interesting to push the sonification of data further, and try to figure out a good way to tie the rhythms of the lines to something meaningful to gameplay. Number of passengers on the line could be represented numerically, perhaps?
By default, all the lines share the same pitch sequence and simply are assigned the next available pitch. However each line can pull from its own sequence of pitches, or some combination of the two. For instance, the first three lines could share a pitch sequence, while the next three each have unique sequences. Playing with the number of sequences can create more possibilities as far as harmonic relationships between the lines.
I filmed myself working on a train engine sound set. I describe my process as I go through it, and dive into some workflow stuff for doing batch processing of effects, file naming, and file looping.
Each train's engine has a rhythmic sound. This sound is tonal when the train is occupied by passengers, and just noise when the train is empty. The pitch of the engine matches the pitch of the line. There were opportunities to take this data sonification further, including a drum matrix that I built that would trigger patterns procedurally using the number of passengers and their seat positions as rhythm information. This proved to add what I would call 'outer complexity' to the sound of the game. That said, I think there was probably a hybrid solution using sonified data to create even more dynamically reacting trains.
Passengers embark and disembark trains in a pre-determined rhythm. Passengers used to spawn in clumps, all at once. This was changed to allow the passengers designated to spawn together to instead appear in a pleasing cascade. The rhythmic interval of this cascade is designated by the audio system.
Each station on a line creates a pulse in that line's pitch. The shape of the station determines the timbre.
Stations and passengers share shape types. Passengers and stations of the same type share a percussive signature which can be heard when passengers spawn and stations spawn or mutate.
More broadly, the cities have quite a few options for variation.
Passenger percussion sounds, which get triggered when they appear at stations, as well as the exhaust sound of trains stopping to pick up new passengers, both have support for pitch variation.
You can set a probability to transpose line pitches up or down by the octave, on the fly.
There is a kick drum sample which can be optionally set up, with week to week progression. Berlin is one of many cities that use this feature.
You can limit the number of keys available for the music to play in for any given city. Or, you can use all twelve. Why not!
This is technically changeable per city, but tends to be changed very sparingly.
Beyond traditional straight groove, swing, and even custom relationships (ie. an inverted swing) are possible. These were a good stand in for rhythmic patterns, as the system technically wasn't set up to support anything but consistent pulsing.
The harmony of the city progresses with the pitches of the lines, as well as in accompanying bass notes that come from the spawning and mutation of stations. This can all be set up per city by using lists in the JSON, ie. ["C3", "E3", "G3", "B3"]
, and so on. At the end of each in-game week, and at the end of the game, chords are also triggered which utilize this same type of setup.
There are many ways to create variation in the performance of the line loops. The note durations, attack and decay times can all be altered, as well as the voice count. The number of voices can be restricted in various ways to alter the sound of the line loops.
The game has seven different types of train "engine" sound sets which can be chosen from. Different cities utilize different sets of train sounds, just as another way to mix things up.
Certain Cities (ie. Paris) have passenger cars that hold less, so the audio design had to be done carefully so as not to imbalance the gameplay.
For more info on how audio works in Mini Metro, and how to try it out yourself, check out the →Building Your Own Soundscape workshop. I've also collected all the →trailers I scored for the game.