Celluloid - ©2009 Leif Chappelle
After posting last week’s article on my exploration of chiptunes, commenter Kurt posted an excellent reply about something I had yet to cover in the first installment. He mentioned the compartmentalized nature of chiptunes and how they are less about the actual physical notes written and more about how they’re implemented. This is absolutely true. With this week’s installment in what I’m hoping will become a weekly or bi-weekly look at the world of lo-fi music creation, we’ll be looking at exactly how the modular nature of chiptunes and trackers can hinder or aid the writing process.
As with any tracker, chiptunes are created in a format that is optimized to be the most efficient way possible to create music using as little memory as possible. Since size was a huge constraint, this format of music storage and playback was indispensable while games were still hosted in a cartridge-based medium.
For example: While the mp3 attached to this article is 3MB in size, the entire song when saved as a .nsf (nintendo sound file) is all of 8KB.
The way this is achieved is because of how the music is generated and stored. For each sound file that is played back through the NES, there are three major categories by which the song is stored:
- Instrument data
- Pattern data
- Frame Order data
Within the instrument data, each modified wave form is given a set of parameters and assigned a hexadecimal identity. For example, the piece I wrote contains several major instruments: Vibrato Lead and Vibrato Echo, my two main melody/harmony instruments; Plain Triangle, my bare-bones bass synth; and a variety of drum settings. By applying filters such as volume curves, arpeggio, pitch bending, and duty cycle, with just a few parameters one can create an arsenal of different variations on the four channels available.
Within the pattern data, each of the four tracks are assigned cellular ‘patterns’, essentially one or more measures of music, that can be played back in any order. Based on how many rows per pattern are designated in the settings, each beat is given either a note value, a null value or left blank. Each beat can also be assigned an instrument, volume, and up to three effects. As a musical example, a whole measure of 4/4 time would be given 16 rows if you want the least possible value be 16th notes, or 32 rows for 32nd notes.
Finally, in the frame order data, each pattern is assigned to a frame (all four tracks playing a specific pattern). The order becomes a matrix of how everything will play back chronologically. For example, here is a snippet from the piece above during the 1st verse:
0A | 04 05 00 02
0B | 05 04 01 03
0C | 08 08 00 02
0D | 05 04 01 03
Now, to understand better, know that the numbers for each column relate only to the channel that is playing. The far-left numbers correspond to the frame number. In regular notation, this might be the measure number. The easiest channels to comprehend are the Bass (channel 3) and Drums (channel 4): The bass has a two measure pattern it is repeating: 00, then 01. So do the drums: 02, 03, etc. The melody, however (channel 1) has a slightly different pattern. Its first and third measures are different, but it returns to an identical phrase in between, making its melodic line an ABCB pattern. By acknowledging these repeating elements in the music, the composer can save on space and call back phrases without the need to create them anew.
I hope everyone is still awake! With all that said, go ahead and take a listen to the attached mp3 and see if you can’t identify how the compartmentalized nature of the format is being used and in what way. I’ll be back next weekend or the following one for another bit of passed-along explorations!
As an addendum, big props (which I’ve already given via email and twitter, but more doesn’t hurt!) to Jeremy Parish over at 1up for the plug on last week’s article! The traffic boost since then has been enormous and all the ‘herders appreciate it.