{
 "metadata": {
  "name": "Csound6 Tutorial POC"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": "Csound Tutorial with IPython Proof of Concept"
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "By Jacob Joaquin<br />\nMay 2013<br />\nRevised May 7th, 2013"
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": "Introduction"
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Welcome to this the \"Csound Tutorial with IPython Proof of Concept\". This isn't meant to be a full tutorial, though it certainly does showcase some of the basic requirements of using the Csound6 API.\n\nBefore we get started, I want to thank the devs for all their insight on the Csound Mailing List. I would have not been able to get the Csound6 API up and running without their help.\n\nI would also like to thank Fran\u00e7ois Pinot for his Csound Journal article <a href=\"http://www.csounds.com/journal/issue14/realtimeCsoundPython.html\">Real-time Coding Using the Python API: Score Events</a>. If you ever want to use IPython with Csound, I highly recommend you start with this."
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": "Setting Up IPython Notebook"
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "To get things going, we need to be able to import the Python Csound6 library. Since Csound6 is still isn't released and you're most likely running your own build, there is some additional setup required. This may vary from system to system, but here are somethings to try in OS X and possibly other Unix based environments.\n\nThe first thing is to make sure you have your paths set correctly. Before launching IPython Notebook, I set the OPCODE6DIR64 environmental variable to the correct opcode directory."
    },
    {
     "cell_type": "raw",
     "metadata": {},
     "source": "export OPCODE6DIR64=/Users/clu/code/csound/csound-csound6-git/build/CsoundLib64.framework/Resources/Opcodes"
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "When I launch IPython notebook, I also make sure to include additional arguments to ensure that graphs are created and embedded inline with the followind command-line action."
    },
    {
     "cell_type": "raw",
     "metadata": {},
     "source": "ipython notebook --pylab inline"
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Now we can get things going."
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": "Using Csound6 API"
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "One more path needs to be set for this to work, and that's the path of the Csound6 build. You'll you need to change out the path in the following cell to point to the build location of Csound6 on your machine."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "import sys\nsys.path.append(\"/Users/clu/code/csound/csound-csound6-git/build/\")\nimport csnd6",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Next, we create a csnd6 object as well as a csnd6 performance thread. Other things such as sending audio to the DAC, setting the rates, the channels, and 0dbfs."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "cs = csnd6.Csound()\ncsPerf = csnd6.CsoundPerformanceThread(cs)\ncs.SetOption('-odac')\ncs.CompileOrc('''\nsr = 44100\nkr = 4410\nksmps = 10\nnchnls = 1\n0dbfs = 1.0\n''')",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 2,
       "text": "0"
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Finally, we press the play button, which involves calling the csnd6 Start() method and the performance thread Play() method. (if there's a better way, let me know)"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "cs.Start()\ncsPerf.Play()",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 3
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Csound is now running. At this point, there are no instruments loaded. Using the CompileOrc() method, we can load instruments dynamically into a runnind Csound process."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "cs.CompileOrc('''\ninstr 1\n    idur = p3\n    iamp = p4\n    ifreq = p5\n\n    k1 line 1, idur, 0\n    a1 oscils iamp, ifreq, 1\n    out a1 * k1\nendin\n''')",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 4,
       "text": "0"
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Score events can be via the ReadScore() mehtod."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "cs.ReadScore('i 1 0 1 0.5 440')",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 5,
       "text": "0"
      }
     ],
     "prompt_number": 5
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Or events can be created in the orchestra like this:"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "cs.CompileOrc('''event_i \"i\", 1, 0, 1, 0.5, 262''')",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 6,
       "text": "0"
      }
     ],
     "prompt_number": 6
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": "Playing with Python"
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "This is just a small example of using the Python language to generate score events. First, I'm going to define a custom function that will make generating events a little more pythonic."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "def event(*args):\n    e = ' '.join(map(str, args))\n    cs.ReadScore(e)\n    print e",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 7
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "This definition allows us to create parameterized events rather than having to concatenate strings. Additionally, this prints the actual score event string being generated."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "event('i', 1, 0, 0.25, 0.707, 262)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "i 1 0 0.25 0.707 262\n"
      }
     ],
     "prompt_number": 8
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Let's generate some random frequencies. First, we import the Python random() function."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "from random import random",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 9
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Then we create a loop that generates 8 notes with a random frequeny between 440Hz and 880Hz."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "for t in xrange(8):\n    event('i', 1, t, 1, 0.707, 440 + 440 * random())",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "i 1 0 1 0.707 595.345239993\ni 1 1 1 0.707 584.875655908\ni 1 2 1 0.707 664.103711761\ni 1 3 1 0.707 643.93130537\ni 1 4 1 0.707 852.790209143\ni 1 5 1 0.707 720.383147878\ni 1 6 1 0.707 598.042138928\ni 1 7 1 0.707 524.759562968\n"
      }
     ],
     "prompt_number": 10
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": "Plotting Tables"
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "One of the beautiful aspects of IPython Notebook is the ability to easily create and display graphs. This can be applied to Csound f-tables. Below are two functions. The first, make_table(), creates a Csound f-table. The second, get_table_data(), returns a list of values contained in an f-table."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "def make_table(*args):\n    data = ', '.join(map(str, list(args)))\n    data = 'gitemp ftgen ' + data\n    print data\n    cs.CompileOrc(data)\n\ndef get_table_data(t):\n    length = cs.TableLength(t)\n    array = csnd6.doubleArray(length)\n    cs.TableCopyOut(t, array)\n    table = []\n    \n    for i in xrange(length):\n        table.append(array[i])\n\n    return table",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 11
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Let's go ahead and generate a sine wave table with 256 points of data."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "make_table(1, 0, 256, 10, 1)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "gitemp ftgen 1, 0, 256, 10, 1\n"
      }
     ],
     "prompt_number": 12
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Now, let's retrieve the data from Csound."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "sine_table = get_table_data(1)",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 13
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "Finally, let's plot it with the plot() function."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "plot(sine_table)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 14,
       "text": "[<matplotlib.lines.Line2D at 0x41c91b0>]"
      },
      {
       "output_type": "display_data",
       "png": "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\nAElFTkSuQmCC\n"
      }
     ],
     "prompt_number": 14
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "That was fairly easily. Let's do it one more time, but let's generate an envelope shape with GEN07."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "make_table(2, 0, 16, 7, 0, 4, 1, 2, 0.5, 7, 0.5, 2, 0)\nt2 = get_table_data(2)\nplot(t2)",
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": "gitemp ftgen 2, 0, 16, 7, 0, 4, 1, 2, 0.5, 7, 0.5, 2, 0\n"
      },
      {
       "output_type": "pyout",
       "prompt_number": 15,
       "text": "[<matplotlib.lines.Line2D at 0x2cc4570>]"
      },
      {
       "output_type": "display_data",
       "png": "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\n"
      }
     ],
     "prompt_number": 15
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": "Stopping Csound"
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "We can stop the Csound performance thread with the following action."
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": "csPerf.Stop()",
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 16
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": "Conclusion"
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": "And that's it for now."
    }
   ],
   "metadata": {}
  }
 ]
}