{ "metadata": { "name": "", "signature": "sha256:272471411409e21cc9a8395bdd22c84766b556cd2032ab8328964d93091bde09" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Exploring Karplus-Strong Filters" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Plucked String Synthesis\n", "An example inspired by a talk given by [Jim Rulla](http://www.eastknow.org/2014/03/meeting-2-recap.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-----------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Imports" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# We needs some imports and also enable our inline plots\n", "import matplotlib.pyplot as plt\n", "import random\n", "import wave\n", "import StringIO\n", "from IPython.core.display import HTML\n", "import numpy\n", "\n", "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Settings" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Change these parameters to alter the sound\n", "\n", "# Amplitude should be between 0.0 and 1.0\n", "g_synth_amplitude = 1.0\n", "\n", "# Desired frequency in Hz\n", "g_synth_frequency_hz = 440\n", "\n", "# Desired wave file duration in seconds\n", "g_wav_duration_s = 4\n", "\n", "# Specify the sample rate of the output wave file\n", "g_wav_sample_rate = 44100\n", "\n", "# Specify file name for wave file\n", "#g_wav_filename = \"karplus-strong-synth-%d.wav\" % int(g_synth_frequency_hz)\n", "g_wav_filename = \"karplus-strong-synth.wav\"\n", "\n", "# Default fig sizes and dpi settings\n", "g_figsize = (4,4)\n", "g_dpi = 100\n", "\n", "#***\n", "# Calculated globals\n", "# You shouldn't need to alter these as they are based on the\n", "# settings you choose above.\n", "#***\n", "g_synth_period_s = 1.0 / g_synth_frequency_hz\n", "g_synth_period_samples = int(g_synth_period_s * g_wav_sample_rate + 0.5)\n", "g_synth_duration_samples = int(g_wav_duration_s * g_wav_sample_rate)\n", "print \"Synth period: %f sec.\" % g_synth_period_s\n", "print \"\\tor %d samples.\" % g_synth_period_samples\n", "print \"Wav duration: %f sec.\" % g_wav_duration_s\n", "print \"\\tor %d samples.\" % g_synth_duration_samples" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Synth period: 0.002273 sec.\n", "\tor 100 samples.\n", "Wav duration: 4.000000 sec.\n", "\tor 176400 samples.\n" ] } ], "prompt_number": 2 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Functions" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Generate a list of random samples\n", "def gen_random_samples(amplitude, num_samples):\n", " A = int(amplitude * 32767.0 + 0.5)\n", " samples = [0] * num_samples\n", " for n in range(0, len(samples)):\n", " samples[n] = int(-A if random.random() > .5 else A)\n", " return samples" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "# String filter\n", "def make_string_sound(impulse, duration_samples):\n", " p = len(impulse)\n", " output = []\n", " output.extend(impulse)\n", " output.extend([int(0)] * (duration_samples - p))\n", "\n", " for i in range(p, len(output)):\n", " output[i] = int(((output[i - p] + output[i - p + 1]) / 2.0) + 0.5)\n", " \n", " return output" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "# Drum filter\n", "def make_drum_sound(impulse, duration_samples, blend_factor):\n", " \"\"\"blend_factor should be between 1 and 0. \n", " A blend_factor of 1 produces the same result as the \n", " make_string_sound()\"\"\"\n", " p = len(impulse)\n", " output = []\n", " output.extend(impulse)\n", " output.extend([int(0)] * (duration_samples - p))\n", " \n", " for i in range(p, len(output)):\n", " factor = 2.0 if random.random() <= blend_factor else -2.0\n", " output[i] = int(((output[i - p] + output[i - p + 1])/ factor) + 0.5)\n", " \n", " return output" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "# Generate data suitable to writing to wave file\n", "def sound_to_bytes(sound):\n", " \"\"\"Takes a list containing sound samples and converts to a buffer of bytes\"\"\"\n", " output = StringIO.StringIO()\n", " for sample in sound:\n", " output.write(chr(sample & 0xFF))\n", " output.write(chr((sample >> 8) & 0xFF))\n", " return output.getvalue()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Generate an Impulse" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Seed our random number generator\n", "random.seed()\n", "\n", "# Generate our impulse\n", "impulse = gen_random_samples(g_synth_amplitude, g_synth_period_samples)\n", "\n", "# Show our random impulse\n", "plt.figure(figsize=g_figsize)\n", "plt.plot(range(0, len(impulse)), impulse)\n", "plt.title(\"Initial Impulse\")\n", "plt.grid()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 7 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Feed Through the Filter" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Synthesize through filter\n", "sound = make_string_sound(impulse, g_synth_duration_samples)\n", "#sound = make_drum_sound(impulse, g_synth_duration_samples, 1)\n", "\n", "# Show our sound\n", "plt.figure(figsize=g_figsize)\n", "plt.plot(range(0, len(sound)), sound)\n", "plt.title(\"Synthsized signal @ %dHz\" % g_synth_frequency_hz)\n", "plt.grid()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nBkoAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "# Show a zoomed view\n", "start = 20000 #2 * g_synth_period_samples\n", "end = start + 400\n", "plt.figure(figsize=g_figsize)\n", "plt.plot(range(start, end), sound[start:end])\n", "plt.title(\"Zoomed View\")\n", "plt.grid()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nGhX8f/n30AnzEs+aAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 9 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "FFT" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Look at an FFT of only the synthesized portion\n", "p = 2 * len(impulse)\n", "fft = [abs(f) for f in numpy.fft.rfft(sound[p:p + g_wav_sample_rate], g_wav_sample_rate)]\n", "fft[0] = 0 # Ignore DC\n", "freqs = [((g_wav_sample_rate / 2.0) / len(fft)) * n for n in range(0, len(fft))]\n", "\n", "# Entire FFT\n", "fig, axes = plt.subplots(figsize=g_figsize, dpi=g_dpi)\n", "axes.plot(freqs, fft)\n", "axes.set_title(\"FFT Magnitudes\")\n", "axes.set_xlabel(\"Hz\")\n", "axes.grid()\n", "\n", "# First part of FFT\n", "fig, axes = plt.subplots(figsize=g_figsize, dpi=g_dpi)\n", "axes.plot(freqs[0:1000], fft[0:1000])\n", "axes.set_title(\"FFT Magnitudes\")\n", "axes.set_xlabel(\"Hz\")\n", "axes.grid()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nERERkXb0/+HlSIfM5M/MAAAAAElFTkSuQmCC\n", "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 10 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Save and Play Sound" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Wave files are easy to make, so let's do that!\n", "wf = wave.open(g_wav_filename, \"w\")\n", "wf.setnchannels(1)\n", "wf.setsampwidth(2)\n", "wf.setframerate(g_wav_sample_rate)\n", "wf.writeframes(sound_to_bytes(sound))\n", "wf.close()\n", "\n", "# Generate some HTML to wrap up the audio file!\n", "# Should even show up in exported HTML\n", "wav = open(g_wav_filename, \"rb\").read()\n", "wav_encoded = wav.encode(\"base64\")\n", "audio_tag = \"\"\"\n", " \n", " \"\"\".format(wav_encoded)\n", "HTML(audio_tag)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "----------------" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Resources" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* [Wikipedia](http://en.wikipedia.org/wiki/Karplus-Strong)\n", "* *Digital Synthesis of Plucked-String and Drum Timbres*\n", " * Authors: Kevin Karplus and Alex Strong\n", " * Source: Computer Music Journal, Vol. 7, No. 2 (Summer, 1983), pp. 43-55\n", " * Publisher: MIT Press\n", " * [JSTOR](http://www.jstor.org/stable/3680062)\n", " * [Other Copy](http://users.soe.ucsc.edu/~karplus/papers/digitar.pdf)\n", "* [Inspiration for playing sound through IPython](http://nbviewer.ipython.org/gist/Carreau/5507501/the%20sound%20of%20hydrogen.ipynb)\n", "* [Inspiration for using base64 encoding to avoid browser cache](http://nbviewer.ipython.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-4-Matplotlib.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "------------" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Copyright Notice" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "

\n", " \n", " \n", " \n", "
\n", " To the extent possible under law,\n", " \n", " Charles Stanhope\n", " has waived all copyright and related or neighboring rights to\n", " Karplus-Strong String Synthesis.\n", "This work is published from:\n", "\n", " United States.\n", "

\n", "" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 } ], "metadata": {} } ] }