{ "metadata": { "name": "", "signature": "sha256:76e583849f6c1ec4697a1065b0dc3d78547426436b43ecc4612844cddc850ad5" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "So how does a Game Boy console produce sounds?\n", "\n", "It's difficult to find some easily understandable information on the subject, so I did a little bit of googling. It turns out (according to [this link](http://fms.komkon.org/GameBoy/Tech/Software.html)) that a Game Boy originally had \n", "\n", "> two sound channels connected to the output terminals SO1 and SO2\n", "\n", "I'm assuming those two channels are the left and right channels.\n", "\n", "Also, a Game Boy could play\n", "\n", "> Quadrangular wave patterns with sweep and envelope functions, quadrangular wave patterns with envelope functions, voluntary wave pattern, white noise\n", "\n", "> These four sounds can be controlled independantly and then mixed separately for each of the output terminals.\n", "\n", "While searching for \"quadrangular wave pattern\" term, I found [this link](http://sebastianmihai.com/downloads/burlygb/gbsound3.pdf). And also [this one, which goes into the more detailed aspects of the Game Boy microprocessor](http://www.emulatronia.com/doctec/consolas/gameboy/gameboy.txt). \n", "\n", "Long story short, \"quadrangular wave patterns\" are [square waves](http://en.wikipedia.org/wiki/Square_wave)! So let's get to work and make some sounds with that information.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this post, we're gonna do the following:\n", "\n", "- first, we investigate the unit sounds the Game Boy is capable of producing\n", "- we then move on to applying what we have learned to the synthesis of simple melodies, using the well-known \"Nokia composer\" format as our input" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "The Game Boy sound" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, let's import the tools we're going to use." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "from pylab import *" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.display import Audio # awesome IPython tool to embed audio directly in the notebook" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "from scipy.signal import square" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Basically, a Game Boy sound is a square wave. Let's plot this sort of pattern." ] }, { "cell_type": "code", "collapsed": false, "input": [ "t = arange(0, 0.1, 1/10000.)\n", "t.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "(1000,)" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "plot(t, square(2 * pi * 100 * t))\n", "title(\"A square wave!\")\n", "ylim(-1.1, 1.1)\n", "grid(True)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "What does this square wave sound like?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "Audio(data=square(2 * pi * 100 * t), rate=5000) " ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sounds very much like a gameboy to me! \n", "\n", "Below, we're experimenting with that sound and also with the duty cycle parameter, which is available on the Game Boy according to the documents we found." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.html.widgets import interact, fixed\n", "from IPython.display import display" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "def play_square_sound(freq, duration, duty_cycle = 0.5, sample_freq=10.e3, plot_signal=False):\n", " t = arange(0, duration, 1/sample_freq)\n", " s = square(2 * pi * freq * t, duty=duty_cycle)\n", " if plot_signal: \n", " plot(t, s)\n", " display(Audio(s, rate=sample_freq))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 28 }, { "cell_type": "code", "collapsed": false, "input": [ "interact(play_square_sound,\n", " freq=(10, 1000, 50),\n", " duration=(0.1, 0.5, 0.1),\n", " duty_cycle=(0.1, 0.9, 0.01),\n", " sample_freq=fixed(10e3),\n", " plot_signal=fixed(True))" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "display_data", "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Well, this sounds like a typical Game Boy sound to me!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We could improve this sound by adding an envelope effect. The type of envelope I'm using below is an exponential fade-in." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def play_square_sound_with_envelope(freq, duration, duty_cycle = 0.5, sample_freq=10.e3, envelope_duration=0.1):\n", " t = arange(0, duration, 1/sample_freq)\n", " s = square(2 * pi * freq * t, duty=duty_cycle) * (1 - exp(-t * envelope_duration))\n", " plot(t, s)\n", " display(Audio(s, rate=sample_freq))\n", "\n", "interact(play_square_sound_with_envelope,\n", " freq=(10, 1000, 50),\n", " duration=(0.1, 0.5, 0.1),\n", " duty_cycle=(0.1, 0.9, 0.01),\n", " sample_freq=fixed(10e3),\n", " envelope_duration=(0.1, 100, 0.1))" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "display_data", "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nIYQQQgjRl/8PVjqmE0SZZDsAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's move on to playing some real sounds!" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Playing melodies with the Game Boy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have explored the way the Game Boy generates sounds, we can apply our knowledge to the generation of simple melodies. Here, my test melody will be the classic Tetris melody. A simple way to get this melody in a code-friendly way is to download it from one of the innumerable \"Nokia composer sites\", whose format gives us the two things we need for synthesis: duration and pitch. A nice specification for the language can be found [here](http://merwin.bespin.org/t4a/specs/nokia_rtttl.txt).\n", "\n", "The melody I'll use below comes from [here](http://arcadetones.emuunlim.com/ringtones_r/tetris.html)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "tetris = \"e6,8b,8c6,8d6,16e6,16d6,8c6,8b,a,8a,8c6,e6,8d6,8c6,b,8b,8c6,d6,e6,c6,a,2a,8p,d6,8f6,a6,8g6,8f6,e6,8e6,8c6,e6,8d6,8c6,b,8b,8c6,d6,e6,c6,a,a\"" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Parsing the melody string" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To show you how we play this melody, I'll test the \"decoding process\" (from text to sound) in the lines below.\n", "\n", "The first step is to isolate a note from the melody above. We do this by splitting at the commas:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "note = tetris.split(\",\")[2]\n", "note" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "'8c6'" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We then construct two regular expressions that allow us to extract the duration (expressed in quarter, eight, 16th notes) and the pitch (expressed using standard musical notation like \"a\", \"b\", \"c\", etc.) from the note." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import re\n", "duration = re.compile(\"^[0-9]+\")\n", "pitch = re.compile(\"[\\D]+[\\d]*\")" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We test these regular expressions on our notes:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print duration.findall(note)\n", "print pitch.findall(note)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['8']\n", "['c6']\n" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "From this, we can recover duration, frequency and build a sound signal. Here, our duration is '8', which corresponds to an eigth note. And the frequency should correspond to a 'c' in the 6th octave (1046.50 Hz, according to [Wikipedia](http://en.wikipedia.org/wiki/Piano_key_frequencies))." ] }, { "cell_type": "code", "collapsed": false, "input": [ "t_max = duration.findall(note)\n", "t_max = 1/float(t_max[0])\n", "t_max" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "0.125" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This duration needs to be multiplied by the duration of one measure, which is arbitrary (it's called the tempo at which you play the piece of music). Finally, we can calculate the frequency of the note we want to play:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "pitch.findall(note)[0].split(\"123456\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "['c6']" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "try:\n", " octave = [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"].index(pitch.findall(note)[0][-1]) + 1 \n", " height = pitch.findall(note)[0][:-1]\n", "except:\n", " height = pitch.findall(note)[0]\n", " octave = 4\n", "print \"height= {0}, octave= {1}\".format(height, octave)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "height= c, octave= 6\n" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we can calculate the frequency and then generate the sound:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "freq = 440 * 2 ** (([\"a\", \"a#\", \"b\", \"c\", \"c#\", \"d\", \"d#\", \"e\", \"f\", \"f#\", \"g\", \"g#\"].index(height) / 12. + octave - 5)) \n", "freq" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "1046.5022612023945" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "wave = play_square_sound(freq, 4 * t_max)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 30 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "A function that parses the melody and generates a sound" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we apply the knowledge we gained here to a complete melody, it looks like this:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def play_melody(melody, sample_freq=10.e3, bpm=50):\n", " duration = re.compile(\"^[0-9]+\")\n", " pitch = re.compile(\"[\\D]+[\\d]*\") \n", " measure_duration = 4 * 60. / bpm #usually it's 4/4 measures\n", " output = zeros((0,))\n", " for note in melody.split(','):\n", " # regexp matching\n", " duration_match = duration.findall(note)\n", " pitch_match = pitch.findall(note)\n", " \n", " # duration \n", " if len(duration_match) == 0:\n", " t_max = 1/4.\n", " else:\n", " t_max = 1/float(duration_match[0])\n", " if \".\" in pitch_match[0]:\n", " t_max *= 1.5\n", " pitch_match[0] = \"\".join(pitch_match[0].split(\".\"))\n", " t_max = t_max * measure_duration\n", " \n", " # pitch\n", " if pitch_match[0] == 'p':\n", " freq = 0\n", " else:\n", " if pitch_match[0][-1] in [\"4\", \"5\", \"6\", \"7\"]: # octave is known\n", " octave = [\"4\", \"5\", \"6\", \"7\"].index(pitch_match[0][-1]) + 4 \n", " height = pitch_match[0][:-1]\n", " else: # octave is not known\n", " octave = 5\n", " height = pitch_match[0]\n", " freq = 261.626 * 2 ** (([\"c\", \"c#\", \"d\", \"d#\", \"e\", \"f\", \"f#\", \"g\", \"g#\", \"a\", \"a#\", \"b\"].index(height) / 12. + octave - 4)) \n", " \n", " # generate sound\n", " t = arange(0, t_max, 1/sample_freq)\n", " wave = square(2 * pi * freq * t)\n", " \n", " # append to output\n", " output = hstack((output, wave))\n", " \n", " display(Audio(output, rate=sample_freq)) " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "So let's try this on our Tetris melody!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "play_melody(tetris, sample_freq=20.e3, bpm=160)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Well, this sounds cool! Below, if pasted a couple of other melodies for you to enjoy:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "play_melody(\"d6,32p,c.6,32p,8a,8c6,8a#,16a,16g,f,c,8a,8c6,8g,8a,f,c,d,8d,8e,8g,8f,8e,8d,c,c,c\", bpm=140)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "play_melody(\"d#6,b,c#6,a#,16b,16g#,16a#,16b,16b,16g#,16a#,16b,c#6,g,d#6,16p,16g#,16a#,16b,c#6,16p,16b,16a#,g#,g,g#,16f,16g,16g#,16a#,8d#.6,32d#6,32p,32d#6,32p,32d#6,32p,16d6,16d#6,8f.6,16d6,8a#,8p,8f#6,8d#6,8f#,8g#,a#.,16p,16a#,8d#.6,16f6,16f#6,16f6,16d#6,16a#,8g#.,16b,8d#6,16f6,16d#6,8a#.,16b,16a#,16g#,16f,16f#,d#\", bpm=63)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [ "play_melody(\"16e6,16e6,32p,8e6,16c6,8e6,8g6,8p,8g,8p,8c6,16p,8g,16p,8e,16p,8a,8b,16a#,8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,16c6,16d6,8b,16p,8c6,16p,8g,16p,8e,16p,8a,8b,16a#,8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,16c6,16d6,8b,8p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,16c6,16p,16a,16c6,16d6,8p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16c7,16p,16c7,16c7,p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,16c6,16p,16a,16c6,16d6,8p,16d#6,8p,16d6,8p,16c6\", bpm=100)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "play_melody(\"32c,32p,32c7,32p,32a5,32p,32a,32p,32a#5,32p,32a#,2p,32c,32p,32c7,32p,32a5,32p,32a,32p,32a#5,32p,32a#,2p,32f5,32p,32f,32p,32d5,32p,32d,32p,32d#5,32p,32d#,2p,32f5,32p,32f,32p,32d5,32p,32d,32p,32d#5,32p,32d#\", bpm=100)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "play_melody(\"a#,f.,8a#,16a#,16c6,16d6,16d#6,2f6,8p,8f6,16f.6,16f#6,16g#.6,2a#.6,16a#.6,16g#6,16f#.6,8g#.6,16f#.6,2f6,f6,8d#6,16d#6,16f6,2f#6,8f6,8d#6,8c#6,16c#6,16d#6,2f6,8d#6,8c#6,8c6,16c6,16d6,2e6,g6,8f6,16f,16f,8f,16f,16f,8f,16f,16f,8f,8f,a#,f.,8a#,16a#,16c6,16d6,16d#6,2f6,8p,8f6,16f.6,16f#6,16g#.6,2a#.6,c#7,c7,2a6,f6,2f#.6,a#6,a6,2f6,f6,2f#.6,a#6,a6,2f6,d6,2d#.6,f#6,f6,2c#6,a#,c6,16d6,2e6,g6,8f6,16f,16f,8f,16f,16f,8f,16f,16f,8f,8f\", bpm=150)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 26 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Conclusions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What we've done in this post was to develop a simplified model of Game Boy sounds that seems to work quite well. Note that a lot of aspects have been left out in what we did here: sweeping, envelopes, pattern duty...\n", "I hope you have enjoyed this post as much as I have! If you're curious about listening to some commented examples of what can be done with the Game Boy, I recommend the following links:\n", "\n", "- [a selection of Game Boy tracks with commentaries about the techniques that were used to produce them](http://classicalgaming.wordpress.com/2012/03/22/meet-the-system-nintendo-game-boy/)\n", "- [the album The Smallest Sound from Boy vs Bacteria, which is some nice 8-bit music I enjoy](http://open.spotify.com/album/4dfO5vbi2XiARCycX1TBaR)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This post was entirely written using the IPython notebook. You can see a static view or download this notebook with the help of nbviewer at [20140909_GameBoySounds.ipynb](http://nbviewer.ipython.org/urls/raw.github.com/flothesof/posts/master/20140909_GameBoySounds.ipynb)." ] } ], "metadata": {} } ] }