<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Greg Surges &#187; Programming</title>
	<atom:link href="http://gregsurges.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://gregsurges.com</link>
	<description>Computer Musician, Programmer, Hardware Hacker</description>
	<lastBuildDate>Mon, 14 May 2012 19:59:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>News &#8211; 4/21/2012</title>
		<link>http://gregsurges.com/programming/pure-data/news-4212012/</link>
		<comments>http://gregsurges.com/programming/pure-data/news-4212012/#comments</comments>
		<pubDate>Sat, 21 Apr 2012 15:40:06 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Pure Data]]></category>
		<category><![CDATA[cemec]]></category>
		<category><![CDATA[Live Coding]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[NIME 2012]]></category>
		<category><![CDATA[pucktronix]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1512</guid>
		<description><![CDATA[Some news: My short paper &#8220;DIY Hybrid Analog/Digital Modular Synthesis&#8221; &#8211; which covers the USB-Octomod, tabulaRasa, and snake.corral &#8211;  has been accepted for NIME 2012, and I will present a poster version at the conference. The conference runs from May 21 &#8211; 23, in Ann Arbor, MI. I will perform 4/27 at UCSD and 4/28 [...]]]></description>
			<content:encoded><![CDATA[<p>Some news:</p>
<ul>
<li>My short paper &#8220;DIY Hybrid Analog/Digital Modular Synthesis&#8221; &#8211; which covers the <a title="USB-Octomod" href="http://gregsurges.com/circuitry/usb-octomod/" target="_blank">USB-Octomod</a>, <a title="tabulaRasa – Digital Wavetable Oscillator" href="http://gregsurges.com/circuitry/tabularasa/" target="_blank">tabulaRasa</a>, and <a title="pucktronix.snake.corral" href="http://gregsurges.com/circuitry/pucktronix-snake-corral-2/" target="_blank">snake.corral</a> &#8211;  has been accepted for NIME 2012, and I will present a poster version at the conference. The conference runs from May 21 &#8211; 23, in Ann Arbor, MI.</li>
<li>I will perform 4/27 at UCSD and 4/28 as part of the California Electronic Music Exchange Concert series.</li>
<li>Finally, I&#8217;ve started posting some live coding videos:</li>
</ul>
<p><iframe src="http://www.youtube.com/embed/videoseries?list=PL2FA229D3F6E71922&amp;hl=en_US" frameborder="0" width="640" height="360"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/programming/pure-data/news-4212012/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>pucktronix Absolute Pitch Trainer Software</title>
		<link>http://gregsurges.com/programming/pucktronix-absolute-pitch-trainer-software/</link>
		<comments>http://gregsurges.com/programming/pucktronix-absolute-pitch-trainer-software/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 06:34:46 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[absolute pitch]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[ear trainer]]></category>
		<category><![CDATA[Free]]></category>
		<category><![CDATA[Max/MSP]]></category>
		<category><![CDATA[perfect pitch]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1497</guid>
		<description><![CDATA[Here&#8217;s a link to download a little absolute pitch ear training program I recently completed. It associates pitch chroma with visual colors, tracks your performance over time, allows you to experiment with different timbres, and allows you to save data in a simple text format for outside processing. .]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a <a href="https://bitbucket.org/pucktronix/absolute-pitch-ear-trainer/downloads">link</a> to download a little absolute pitch ear training program I recently completed.</p>
<p>It associates pitch chroma with visual colors, tracks your performance over time, allows you to experiment with different timbres, and allows you to save data in a simple text format for outside processing.</p>
<div id="attachment_1498" class="wp-caption aligncenter" style="width: 310px"><a href="http://gregsurges.com/wp-content/uploads/2012/04/Screen-shot-2012-04-03-at-11.31.34-PM.png" rel="lightbox[1497]"><img class="size-medium wp-image-1498" title="Screen shot 2012-04-03 at 11.31.34 PM" src="http://gregsurges.com/wp-content/uploads/2012/04/Screen-shot-2012-04-03-at-11.31.34-PM-300x122.png" alt="" width="300" height="122" /></a><p class="wp-caption-text">The interface.</p></div>
<p>.</p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/programming/pucktronix-absolute-pitch-trainer-software/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Preset Management in Pure Data</title>
		<link>http://gregsurges.com/programming/preset-management-in-pure-data/</link>
		<comments>http://gregsurges.com/programming/preset-management-in-pure-data/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 21:25:41 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Pure Data]]></category>
		<category><![CDATA[live]]></category>
		<category><![CDATA[manager]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[preset]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1474</guid>
		<description><![CDATA[I recently spent a few hours putting together a preset manager in Pure Data. The above image shows a set of controls for 8 independent (but identical) signal processing channels. Clearly, 96 parameters is too many to realistically handle in performance, so I needed some way to store and recall settings. As shown in the [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1477" class="wp-caption aligncenter" style="width: 624px"><a href="http://gregsurges.com/wp-content/uploads/2012/03/params.png" rel="lightbox[1474]"><img class=" wp-image-1477 " title="96 Parameters" src="http://gregsurges.com/wp-content/uploads/2012/03/params-1024x711.png" alt="" width="614" height="427" /></a><p class="wp-caption-text">96 Independent Parameters</p></div>
<p>I recently spent a few hours putting together a preset manager in Pure Data. The above image shows a set of controls for 8 independent (but identical) signal processing channels. Clearly, 96 parameters is too many to realistically handle in performance, so I needed some way to store and recall settings. As shown in the image, each parameter has a [receive] object which listens for messages of a specific type. Then, a [route] object filters out all messages except those meant for that specific parameter instance.</p>
<p>Here&#8217;s the object <a href="http://gregsurges.com/wp-content/uploads/2012/03/preset-manager.pd_.zip">preset-manager.pd</a> - though it will take a decent amount of modification to get it to work for another patch.</p>
<div id="attachment_1476" class="wp-caption aligncenter" style="width: 278px"><a href="http://gregsurges.com/wp-content/uploads/2012/03/interface.png" rel="lightbox[1474]"><img class="size-full wp-image-1476" title="interface" src="http://gregsurges.com/wp-content/uploads/2012/03/interface.png" alt="" width="268" height="180" /></a><p class="wp-caption-text">The preset manager interface.</p></div>
<p>Above is the preset manager interface. A particular slot is accessed via the number box, and that slot can be read or written to with a message box.</p>
<div id="attachment_1478" class="wp-caption aligncenter" style="width: 624px"><a href="http://gregsurges.com/wp-content/uploads/2012/03/preset_manager.png" rel="lightbox[1474]"><img class=" wp-image-1478 " title="preset_manager" src="http://gregsurges.com/wp-content/uploads/2012/03/preset_manager-1024x650.png" alt="" width="614" height="390" /></a><p class="wp-caption-text">Innards of the preset manager object.</p></div>
<p>Here are the innards of the preset manager object. The block on the right stores presets, and the block on the left recalls them. Presets are stored as raw text files, named with sequential numbers, and are formatted like this:</p>
<p><code>filter-bypass 1 1 1 1 0 0 0 0;<br />
filter-rate-mod 0.02 0.81 0 50 0 0 0 0;<br />
filter-rate 0.22 0.66 0.95 106 0 0 0 0;<br />
am-bypass 1 1 0 1 0 0 0 0;<br />
am-width 0 0.5 0.52 87 0 0 0 0;<br />
am-rate-mod 16 0.38 0.54 46 0 0 0 0;<br />
am-rate 2.02 1.48 2.54 3.83 0 0 0 0;<br />
fm-bypass 0 0 0 1 0 0 0 0;<br />
fm-rate 173 97 25 1.64 0 0 0 0;<br />
fm-pos/width 55 64 108 96 0 0 0 0;<br />
fm-mode 2 2 2 1 1 0 0 0;<br />
fm-register 1 0 2 2 1 1 1 0;</code></p>
<p>Each parameter type is followed by eight values &#8211; one for each channel. The [textfile] object works really well for reading and writing text files line-by-line.</p>
<div id="attachment_1482" class="wp-caption aligncenter" style="width: 649px"><a href="http://gregsurges.com/wp-content/uploads/2012/03/write_preset.png" rel="lightbox[1474]"><img class=" wp-image-1482   " title="write_preset" src="http://gregsurges.com/wp-content/uploads/2012/03/write_preset.png" alt="" width="639" height="550" /></a><p class="wp-caption-text">Code for writing a preset.</p></div>
<div id="attachment_1479" class="wp-caption aligncenter" style="width: 606px"><a href="http://gregsurges.com/wp-content/uploads/2012/03/read_preset.png" rel="lightbox[1474]"><img class="size-full wp-image-1479  " title="read_preset" src="http://gregsurges.com/wp-content/uploads/2012/03/read_preset.png" alt="" width="596" height="814" /></a><p class="wp-caption-text">Code for reading a preset.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/programming/preset-management-in-pure-data/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>pucktronix.snake.corral python interface</title>
		<link>http://gregsurges.com/programming/pucktronix-snake-corral-python-interface/</link>
		<comments>http://gregsurges.com/programming/pucktronix-snake-corral-python-interface/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 20:35:21 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[corral]]></category>
		<category><![CDATA[matrix switch]]></category>
		<category><![CDATA[OSC]]></category>
		<category><![CDATA[pucktronix]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[snake]]></category>
		<category><![CDATA[threading]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1428</guid>
		<description><![CDATA[Here&#8217;s a Python script which interfaces between OSC and the pucktronix.snake.corral. It&#8217;s a work-in-progress, but allows you to toggle individual switches via OSC. You can download the source here: https://bitbucket.org/pucktronix/pucktronix.snake.corral/src/3e9b712971df/control_software/pySnakeCorral.py 1 __author__ = 'Greg Surges' 2 3 ''' 4 pySnakeCorral.py 5 interface between OSC messages and pucktronix.snake.corrral hardware 6 created 08.18.2011 7 last modified 03.26.2012 [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a Python script which interfaces between OSC and the pucktronix.snake.corral. It&#8217;s a work-in-progress, but allows you to toggle individual switches via OSC. You can download the source here: <a href="https://bitbucket.org/pucktronix/pucktronix.snake.corral/src/3e9b712971df/control_software/pySnakeCorral.py">https://bitbucket.org/pucktronix/pucktronix.snake.corral/src/3e9b712971df/control_software/pySnakeCorral.py</a></p>
<style type="text/css">
<!--
pre { font-family: monospace; color: #e8e8d3; background-color: #151515; }
body { }
.lnr { color: #605958; background-color: #151515; }
.Exception { color: #ffb964; }
.Special { color: #799d6a; }
.Comment { color: #888888; font-style: italic; }
.Conditional { color: #ffb964; }
.Operator { color: #e8e8d3; background-color: #151515; }
.Repeat { color: #ffb964; }
.Function { color: #fad07a; }
.Number { color: #cf6a4c; }
.Normal { color: #e8e8d3; background-color: #151515; }
.Statement { color: #8197bf; }
.String { color: #99ad6a; }
-->
</style>
<p><body></p>
<pre>
<span class="lnr"> 1 </span>__author__ = <span class="String">'Greg Surges'</span>
<span class="lnr"> 2 </span>
<span class="lnr"> 3 </span><span class="String">'''</span>
<span class="lnr"> 4 </span><span class="String">    pySnakeCorral.py</span>
<span class="lnr"> 5 </span><span class="String">    interface between OSC messages and pucktronix.snake.corrral hardware</span>
<span class="lnr"> 6 </span><span class="String">    created 08.18.2011</span>
<span class="lnr"> 7 </span><span class="String">    last modified 03.26.2012</span>
<span class="lnr"> 8 </span><span class="String">    greg surges - pucktronix</span>
<span class="lnr"> 9 </span><span class="String">    surgesg@gmail.com</span>
<span class="lnr">10 </span><span class="String">    <a href="http://www.gregsurges.com/">http://www.gregsurges.com/</a></span>
<span class="lnr">11 </span><span class="String">'''</span>
<span class="lnr">12 </span>
<span class="lnr">13 </span><span class="Statement">import</span> OSC
<span class="lnr">14 </span><span class="Statement">import</span> threading
<span class="lnr">15 </span><span class="Statement">import</span> serial
<span class="lnr">16 </span><span class="Statement">from</span> serial<span class="Normal">.</span>tools<span class="Normal">.</span>list_ports <span class="Statement">import</span> comports
<span class="lnr">17 </span><span class="Statement">import</span> time
<span class="lnr">18 </span>
<span class="lnr">19 </span>ThreadRun = True
<span class="lnr">20 </span>
<span class="lnr">21 </span>address = <span class="String">'127.0.0.1'</span>, <span class="Number">9999</span>
<span class="lnr">22 </span>server = OSC<span class="Normal">.</span>OSCServer(address)
<span class="lnr">23 </span>
<span class="lnr">24 </span><span class="Statement">print</span> <span class="String">&quot;Server Initialized...&quot;</span>
<span class="lnr">25 </span><span class="Statement">print</span> <span class="String">&quot;Listening on Port: &quot;</span> + str(address[<span class="Number">1</span>])
<span class="lnr">26 </span>
<span class="lnr">27 </span>server<span class="Normal">.</span>addDefaultHandlers()
<span class="lnr">28 </span>
<span class="lnr">29 </span>ser = serial<span class="Normal">.</span>Serial()
<span class="lnr">30 </span>
<span class="lnr">31 </span><span class="Statement">def</span> <span class="Function">init_port</span>():
<span class="lnr">32 </span>        <span class="String">''' poll serial ports, prompt user for port, open port '''</span>
<span class="lnr">33 </span>        ports = comports()
<span class="lnr">34 </span>        <span class="Repeat">for</span> i, port <span class="Operator">in</span> enumerate(ports):
<span class="lnr">35 </span>                <span class="Statement">print</span> <span class="String">&quot;[&quot;</span> + str(i) + <span class="String">&quot;]&quot;</span> + <span class="String">&quot; &quot;</span> + port[<span class="Number">0</span>]
<span class="lnr">36 </span>        port_choice = input(<span class="String">&quot;select serial port: &quot;</span>)
<span class="lnr">37 </span>        ser<span class="Normal">.</span>baudrate = <span class="Number">19200</span>
<span class="lnr">38 </span>        ser<span class="Normal">.</span>port = ports[port_choice][<span class="Number">0</span>]
<span class="lnr">39 </span>        ser<span class="Normal">.</span>open()
<span class="lnr">40 </span>        <span class="Conditional">if</span> ser<span class="Normal">.</span>isOpen(): <span class="Statement">print</span> <span class="String">&quot;opened serial port&quot;</span>
<span class="lnr">41 </span>
<span class="lnr">42 </span><span class="Statement">def</span> <span class="Function">write_bytes</span>(bytes):
<span class="lnr">43 </span>        <span class="String">''' write bytes to serial port corresponding to a single pin being toggled '''</span>
<span class="lnr">44 </span>        ser<span class="Normal">.</span>write(bytes)
<span class="lnr">45 </span>
<span class="lnr">46 </span>init_port()
<span class="lnr">47 </span>
<span class="lnr">48 </span><span class="Statement">def</span> <span class="Function">print_msg</span>(addr, tags, stuff, source):
<span class="lnr">49 </span>        <span class="String">''' just print out received data '''</span>
<span class="lnr">50 </span>        <span class="Statement">print</span> <span class="String">&quot;---&quot;</span>
<span class="lnr">51 </span>        <span class="Statement">print</span> <span class="String">&quot;received new osc msg from %s&quot;</span> % OSC<span class="Normal">.</span>getUrlStr(source)
<span class="lnr">52 </span>        <span class="Statement">print</span> <span class="String">&quot;with addr : %s&quot;</span> % addr
<span class="lnr">53 </span>        <span class="Statement">print</span> <span class="String">&quot;typetags %s&quot;</span> % tags
<span class="lnr">54 </span>        <span class="Statement">print</span> <span class="String">&quot;data %s&quot;</span> % stuff
<span class="lnr">55 </span>        <span class="Statement">print</span> <span class="String">&quot;---&quot;</span>
<span class="lnr">56 </span>
<span class="lnr">57 </span><span class="Statement">def</span> <span class="Function">pin_msg</span>(addr, tags, stuff, source):
<span class="lnr">58 </span>        <span class="String">''' toggle a single pin on/off '''</span>
<span class="lnr">59 </span>        <span class="Comment"># osc message should look like &quot;/matrix/one x y state&quot; to match max </span>
<span class="lnr">60 </span>        <span class="Conditional">if</span> addr == <span class="String">'/matrix/one'</span>: chip_byte = <span class="Number">255</span>
<span class="lnr">61 </span>        <span class="Conditional">if</span> addr == <span class="String">'/matrix/two'</span>: chip_byte = <span class="Number">254</span>
<span class="lnr">62 </span>        x = stuff[<span class="Number">0</span>]
<span class="lnr">63 </span>        y = stuff[<span class="Number">1</span>]
<span class="lnr">64 </span>        state = stuff[<span class="Number">2</span>]
<span class="lnr">65 </span>        <span class="Comment"># print chip_byte, x, y, state</span>
<span class="lnr">66 </span>        bytes = <span class="String">''</span><span class="Normal">.</span>join([chr(i) <span class="Repeat">for</span> i <span class="Operator">in</span> [chip_byte, x, y, state]])
<span class="lnr">67 </span>        write_bytes(bytes)
<span class="lnr">68 </span>
<span class="lnr">69 </span>server<span class="Normal">.</span>addMsgHandler(<span class="String">&quot;/print&quot;</span>, print_msg) <span class="Comment"># adding our function</span>
<span class="lnr">70 </span>server<span class="Normal">.</span>addMsgHandler(<span class="String">&quot;/matrix/one&quot;</span>, pin_msg) <span class="Comment"># add msgs for matrix one </span>
<span class="lnr">71 </span>server<span class="Normal">.</span>addMsgHandler(<span class="String">&quot;/matrix/two&quot;</span>, pin_msg) <span class="Comment"># add msgs for matrix two </span>
<span class="lnr">72 </span>
<span class="lnr">73 </span><span class="Statement">def</span> <span class="Function">osc_process</span>():
<span class="lnr">74 </span>        <span class="Repeat">while</span> ThreadRun:
<span class="lnr">75 </span>                server<span class="Normal">.</span>serve_forever
<span class="lnr">76 </span>        <span class="Statement">print</span> <span class="String">&quot;Stopping OSCServer Thread&quot;</span>
<span class="lnr">77 </span>
<span class="lnr">78 </span>
<span class="lnr">79 </span><span class="Statement">print</span> <span class="String">&quot;</span><span class="Special">\n</span><span class="String">Starting OSCServer. Use ctrl-C to quit.&quot;</span>
<span class="lnr">80 </span>st = threading<span class="Normal">.</span>Thread( target = osc_process)
<span class="lnr">81 </span>st<span class="Normal">.</span>start()
<span class="lnr">82 </span>
<span class="lnr">83 </span><span class="Exception">try</span>:
<span class="lnr">84 </span>        <span class="Repeat">while</span> <span class="Number">1</span>:
<span class="lnr">85 </span>                time<span class="Normal">.</span>sleep(5)
<span class="lnr">86 </span><span class="Exception">except</span> KeyboardInterrupt:
<span class="lnr">87 </span>        ThreadRun = False
<span class="lnr">88 </span>        server<span class="Normal">.</span>close()
</pre>
<p></body><br />
</html></p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/programming/pucktronix-snake-corral-python-interface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LPC in Matlab</title>
		<link>http://gregsurges.com/programming/lpc-in-matlab/</link>
		<comments>http://gregsurges.com/programming/lpc-in-matlab/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 02:06:43 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[linear prediction]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[speech processing]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1422</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://gregsurges.com/wp-content/uploads/2012/03/Screen-shot-2012-03-18-at-7.05.12-PM.png" rel="lightbox[1422]"><img class="aligncenter  wp-image-1423" title="Screen shot 2012-03-18 at 7.05.12 PM" src="http://gregsurges.com/wp-content/uploads/2012/03/Screen-shot-2012-03-18-at-7.05.12-PM-1024x640.png" alt="" width="574" height="358" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/programming/lpc-in-matlab/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Sitar String Physical Model</title>
		<link>http://gregsurges.com/programming/sitar-string-physical-model/</link>
		<comments>http://gregsurges.com/programming/sitar-string-physical-model/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 18:28:48 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Max]]></category>
		<category><![CDATA[physical model]]></category>
		<category><![CDATA[sitar]]></category>
		<category><![CDATA[ucsd]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1399</guid>
		<description><![CDATA[As a second challenge in the seminar on how objects vibrate, taught by Miller Puckette at UCSD, we were asked to simulate the non-linear way a sitar string interacts with the sitar bridge. In a typical string, like on a guitar, the string maintains a fixed length regardless of whether it is moving upward or [...]]]></description>
			<content:encoded><![CDATA[<p>As a second challenge in the seminar on how objects vibrate, taught by Miller Puckette at UCSD,<br />
we were asked to simulate the non-linear way a sitar string interacts with the sitar bridge. In a typical<br />
string, like on a guitar, the string maintains a fixed length regardless of whether it is moving upward<br />
or downward. Since a sitar bridge is a wide, flat object, with tapered edges, the string comes into contact with different<br />
amounts of the bridge depending on its direction of travel.</p>
<p>The bridge / string interaction looks something like this:</p>
<p style="text-align: center;"><a href="http://gregsurges.com/wp-content/uploads/2012/03/IMG_20120309_101400.jpg" rel="lightbox[1399]"><img class="aligncenter  wp-image-1400" title="Sitar String / Bridge Interaction" src="http://gregsurges.com/wp-content/uploads/2012/03/IMG_20120309_101400-1024x768.jpg" alt="" width="502" height="377" /></a></p>
<p> When the string travels upward, it comes into contact with the outside edge of the bridge, causing the string to have length N. When the string travels downward, it comes into contact with the inside edge of the bridge, which shortens the length of the string. The string is now something like N &#8211; X, where X is the width of the bridge. Part of the characteristic sound of the instrument comes from this alternating shortening and lengthening of the string during the course of a note. My extension to this model, which was proposed to the class, was to imagine the bridge as not simply two termination points, but as a curved surface:</p>
<p style="text-align: center;"> <a href="http://gregsurges.com/wp-content/uploads/2012/03/IMG_20120309_101542.jpg" rel="lightbox[1399]"><img class="aligncenter  wp-image-1401" title="Proposed Bridge Model" src="http://gregsurges.com/wp-content/uploads/2012/03/IMG_20120309_101542-1024x768.jpg" alt="" width="502" height="377" /></a></p>
<p>Depending on how far &#8220;down&#8221; the string travels, its length shortens according to the curvature of the bridge. The image below shows the length of the string during one period of vibration. When the string is moving downward, the string length shortens proportionately. When the string is moving upward, the string length is fixed.</p>
<p>Here&#8217;s an image of the string simulation patch:</p>
<p style="text-align: center;"> <a href="http://gregsurges.com/wp-content/uploads/2012/03/Screen-shot-2012-03-09-at-10.09.48-AM.png" rel="lightbox[1399]"><img class="aligncenter  wp-image-1402" title="Sitar String model Max patch " src="http://gregsurges.com/wp-content/uploads/2012/03/Screen-shot-2012-03-09-at-10.09.48-AM.png" alt="" width="652" height="487" /></a></p>
<p>I made one final modification to the original idea by adding a set of 13 sympathetically tuned string simulations. Each is a simple Karplus-Strong string model tuned to a specific pitch. This helps to generate the characteristic harmonic activity of the sitar.<br />
Finally, here is a video showing the simulation in action:<br />
<iframe src="http://www.youtube.com/embed/_esIwiKbUYk" frameborder="0" width="640" height="480"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/programming/sitar-string-physical-model/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>absolute pitch trainer</title>
		<link>http://gregsurges.com/programming/absolute-pitch-trainer/</link>
		<comments>http://gregsurges.com/programming/absolute-pitch-trainer/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 18:09:22 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[absolute pitch]]></category>
		<category><![CDATA[max patch]]></category>
		<category><![CDATA[training]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1387</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<div id="attachment_1390" class="wp-caption aligncenter" style="width: 624px"><a href="http://gregsurges.com/wp-content/uploads/2012/03/Screen-shot-2012-03-07-at-10.04.39-AM-21.png" rel="lightbox[1387]"><img class=" wp-image-1390 " title="Absolute pitch trainer" src="http://gregsurges.com/wp-content/uploads/2012/03/Screen-shot-2012-03-07-at-10.04.39-AM-21-1024x640.png" alt="" width="614" height="384" /></a><p class="wp-caption-text">An absolute pitch trainer in development as part of Jerry Balzano&#39;s Musical Cognitive Science seminar.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/programming/absolute-pitch-trainer/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Sampled MFOS State Variable Filter</title>
		<link>http://gregsurges.com/original-music/electronic-music/sampled-mfos-state-variable-filter/</link>
		<comments>http://gregsurges.com/original-music/electronic-music/sampled-mfos-state-variable-filter/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 04:30:20 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Electronic Music]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[analog filter]]></category>
		<category><![CDATA[Max/MSP]]></category>
		<category><![CDATA[mfos state variable filter]]></category>
		<category><![CDATA[sampled transfer function]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1373</guid>
		<description><![CDATA[&#8220;Sampling&#8221; the transfer function of an analog filter &#8211; homemade Music From Outer Space SVF. Here I&#8217;m running some sounds through digital models of the hardware at a few different settings. No interpolation (yet) so forgive me the pops and clicks. &#160;]]></description>
			<content:encoded><![CDATA[<p>&#8220;Sampling&#8221; the transfer function of an analog filter &#8211; homemade Music From Outer Space SVF. Here I&#8217;m running some sounds through digital models of the hardware at a few different settings. No interpolation (yet) so forgive me the pops and clicks.</p>
<p>&nbsp;</p>
<p><iframe width="100%" height="166" scrolling="no" frameborder="no" src="http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F37539941&amp;auto_play=false&amp;show_artwork=true&amp;color=0098ff"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/original-music/electronic-music/sampled-mfos-state-variable-filter/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>average / delta performance analysis patch</title>
		<link>http://gregsurges.com/original-music/electronic-music/average-delta-performance-analysis-patch/</link>
		<comments>http://gregsurges.com/original-music/electronic-music/average-delta-performance-analysis-patch/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 03:32:47 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Electronic Music]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[drawing]]></category>
		<category><![CDATA[input analysis]]></category>
		<category><![CDATA[lcd]]></category>
		<category><![CDATA[Max/MSP]]></category>
		<category><![CDATA[patch]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1367</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href="http://gregsurges.com/wp-content/uploads/2012/02/Screen-shot-2012-02-13-at-7.30.10-PM.png" rel="lightbox[1367]"><img class="aligncenter size-full wp-image-1368" title="Screen shot 2012-02-13 at 7.30.10 PM" src="http://gregsurges.com/wp-content/uploads/2012/02/Screen-shot-2012-02-13-at-7.30.10-PM.png" alt="" width="661" height="249" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/original-music/electronic-music/average-delta-performance-analysis-patch/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>cross-correlation max/msp javascript</title>
		<link>http://gregsurges.com/programming/cross-correlation-maxmsp-javascript/</link>
		<comments>http://gregsurges.com/programming/cross-correlation-maxmsp-javascript/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 02:22:10 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[cross-correlation]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Max/MSP]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1359</guid>
		<description><![CDATA[Some recent code &#8211; calculates the cross-correlation between two sequences. Download the rest.]]></description>
			<content:encoded><![CDATA[<p>Some recent code &#8211; calculates the cross-correlation between two sequences. <a href="http://gregsurges.com/wp-content/uploads/2012/02/cross_correlate1.js">Download</a> the rest.</p>
<p><a href="http://gregsurges.com/wp-content/uploads/2012/02/Screen-shot-2012-02-12-at-6.18.36-PM.png" rel="lightbox[1359]"><img class="size-full wp-image-1363 alignleft" title="Screen shot 2012-02-12 at 6.18.36 PM" src="http://gregsurges.com/wp-content/uploads/2012/02/Screen-shot-2012-02-12-at-6.18.36-PM.png" alt="" width="543" height="678" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/programming/cross-correlation-maxmsp-javascript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

