<?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</title>
	<atom:link href="http://gregsurges.com/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>Disquiet Feature</title>
		<link>http://gregsurges.com/uncategorized/disquiet-feature/</link>
		<comments>http://gregsurges.com/uncategorized/disquiet-feature/#comments</comments>
		<pubDate>Mon, 14 May 2012 19:59:24 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1528</guid>
		<description><![CDATA[Marc Weidenbaum, over at Disquiet.com, has posted a nice writeup of my recent Soundcloud sketches.]]></description>
			<content:encoded><![CDATA[<p>Marc Weidenbaum, over at Disquiet.com, has posted a nice <a href="http://disquiet.com/2012/05/13/soundcloud-as-sketch-book-mp3/" target="_blank">writeup</a> of my recent Soundcloud sketches.</p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/uncategorized/disquiet-feature/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>patch[052012] &#8211; sketch for upcoming performance</title>
		<link>http://gregsurges.com/original-music/patch052012-sketch-for-upcoming-performance/</link>
		<comments>http://gregsurges.com/original-music/patch052012-sketch-for-upcoming-performance/#comments</comments>
		<pubDate>Sun, 13 May 2012 01:29:12 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Electronic Music]]></category>
		<category><![CDATA[Original Music]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[mariposa]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[sketch]]></category>
		<category><![CDATA[synth]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1522</guid>
		<description><![CDATA[Here&#8217;s a sketch for an upcoming performance, happening at Mariposa, an artist live/work space in Tijuana. Using homebrew computer-controlled hardware into a custom software filterbank. Here&#8217;s where the gig is: View Larger Map]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a sketch for an upcoming performance, happening at Mariposa, an artist live/work space in Tijuana. Using homebrew computer-controlled hardware into a custom software filterbank.</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%2F46200776&amp;auto_play=false&amp;show_artwork=true&amp;color=ffd300"></iframe></p>
<p>Here&#8217;s where the gig is:</p>
<p><iframe src="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=Chapo+M%C3%A1rquez+158+Colonia+Federal,+22310+Tijuana,+Mexico&amp;sll=32.873822,-117.225267&amp;sspn=0.014616,0.027874&amp;ie=UTF8&amp;hq=&amp;hnear=Chapo+M%C3%A1rquez+158,+Tijuana,+Baja+California,+Mexico&amp;t=m&amp;z=14&amp;ll=32.541854,-117.032375&amp;output=embed" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="425" height="350"></iframe><br />
<small><a style="color: #0000ff; text-align: left;" href="http://maps.google.com/maps?f=q&amp;source=embed&amp;hl=en&amp;geocode=&amp;q=Chapo+M%C3%A1rquez+158+Colonia+Federal,+22310+Tijuana,+Mexico&amp;sll=32.873822,-117.225267&amp;sspn=0.014616,0.027874&amp;ie=UTF8&amp;hq=&amp;hnear=Chapo+M%C3%A1rquez+158,+Tijuana,+Baja+California,+Mexico&amp;t=m&amp;z=14&amp;ll=32.541854,-117.032375">View Larger Map</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/original-music/patch052012-sketch-for-upcoming-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>patch[042012] &#8211; Live at Cal Arts 04.28.2012</title>
		<link>http://gregsurges.com/original-music/patch042012-live-at-cal-arts-04-28-2012/</link>
		<comments>http://gregsurges.com/original-music/patch042012-live-at-cal-arts-04-28-2012/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 23:01:19 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Electronic Music]]></category>
		<category><![CDATA[Original Music]]></category>
		<category><![CDATA[cal arts]]></category>
		<category><![CDATA[cemec]]></category>
		<category><![CDATA[Composition]]></category>
		<category><![CDATA[computer music]]></category>
		<category><![CDATA[Laptop]]></category>
		<category><![CDATA[modular synthesizer]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1520</guid>
		<description><![CDATA[Here&#8217;s a performance of &#8216;patch[042012]&#8216; for custom electronics and laptop, performed as part of the California Electronic Music Exchange Concert series (CEMEC). This event took place at California Institute of the Arts on April 28, 2012 in the Roy O. Disney Concert Hall.]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a performance of &#8216;patch[042012]&#8216; for custom electronics and laptop, performed as part of the California Electronic Music Exchange Concert series (CEMEC). This event took place at California Institute of the Arts on April 28, 2012 in the Roy O. Disney Concert Hall.</p>
<p><iframe src="http://www.youtube.com/embed/KqHyKWBl_gY" frameborder="0" width="640" height="360"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/original-music/patch042012-live-at-cal-arts-04-28-2012/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>patch[04242012] &#8211; modular synth / laptop improvisation</title>
		<link>http://gregsurges.com/original-music/patch04242012-modular-synth-laptop-improvisation/</link>
		<comments>http://gregsurges.com/original-music/patch04242012-modular-synth-laptop-improvisation/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 20:04:50 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[Original Music]]></category>
		<category><![CDATA[computer music]]></category>
		<category><![CDATA[Electronic Music]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Improvisation]]></category>
		<category><![CDATA[Laptop]]></category>
		<category><![CDATA[modular synthesizer]]></category>
		<category><![CDATA[pucktronix]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1517</guid>
		<description><![CDATA[Rehearsal for California Electronic Music Exchange Concerts on 4.27.2012 and 4.28.2012 Using custom hardware (pucktronix tabulaRasa and snake.corral, etc) and software &#8211; http://www.gregsurges.com/]]></description>
			<content:encoded><![CDATA[<p>Rehearsal for California Electronic Music Exchange Concerts on 4.27.2012 and 4.28.2012</p>
<p>Using custom hardware (pucktronix tabulaRasa and snake.corral, etc) and software &#8211; http://www.gregsurges.com/</p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/r27vhV3tTUQ" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/original-music/patch04242012-modular-synth-laptop-improvisation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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>tabulaRasa V 1.03</title>
		<link>http://gregsurges.com/original-music/electronic-music/tabularasa-wavetable-oscillator-arduino-shield/tabularasa-v-1-03/</link>
		<comments>http://gregsurges.com/original-music/electronic-music/tabularasa-wavetable-oscillator-arduino-shield/tabularasa-v-1-03/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 16:06:13 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[tabulaRasa - wavetable oscillator Arduino shield]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tabulaRasa]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[wavetable oscillator]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1508</guid>
		<description><![CDATA[tabulaRasa V 1.03 software is available at https://bitbucket.org/pucktronix/tabularasa/downloads and adds the ability to load a folder full of samples into the interface with one click of the new &#8220;folder&#8221; button in the lower left.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://gregsurges.com/wp-content/uploads/2012/04/Screen-shot-2012-04-10-at-8.40.00-AM1.png" rel="lightbox[1508]"><img class="aligncenter size-full wp-image-1510" title="tabulaRasa Interface" src="http://gregsurges.com/wp-content/uploads/2012/04/Screen-shot-2012-04-10-at-8.40.00-AM1.png" alt="The new tabulaRasa interface." width="654" height="448" /></a></p>
<p style="text-align: left;">tabulaRasa V 1.03 software is available at <a href="https://bitbucket.org/pucktronix/tabularasa/downloads">https://bitbucket.org/pucktronix/tabularasa/downloads</a> and adds the ability to load a folder full of samples into the interface with one click of the new &#8220;folder&#8221; button in the lower left.</p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/original-music/electronic-music/tabularasa-wavetable-oscillator-arduino-shield/tabularasa-v-1-03/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>tabulaRasa user demos</title>
		<link>http://gregsurges.com/original-music/electronic-music/tabularasa-wavetable-oscillator-arduino-shield/tabularasa-user-demos/</link>
		<comments>http://gregsurges.com/original-music/electronic-music/tabularasa-wavetable-oscillator-arduino-shield/tabularasa-user-demos/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 18:59:48 +0000</pubDate>
		<dc:creator>Greg Surges</dc:creator>
				<category><![CDATA[tabulaRasa - wavetable oscillator Arduino shield]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[oscillator]]></category>
		<category><![CDATA[pucktronix]]></category>
		<category><![CDATA[sound]]></category>
		<category><![CDATA[tabulaRasa]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[wavetable]]></category>

		<guid isPermaLink="false">http://gregsurges.com/?p=1501</guid>
		<description><![CDATA[Here are two new tabulaRasa demos: From Clarke Robinson (who designed the panel in the video), using a set of vocal waveforms, no effects: From Greg Davis, using tables composed of mixed harmonically-related sinusoids, through a filter, and a delay:]]></description>
			<content:encoded><![CDATA[<p>Here are two new tabulaRasa demos:</p>
<p>From Clarke Robinson (who designed the panel in the video), using a set of vocal waveforms, no effects:<br />
<iframe width="480" height="360" src="http://www.youtube.com/embed/600VLAokojw" frameborder="0" allowfullscreen></iframe></p>
<p>From Greg Davis, using tables composed of mixed harmonically-related sinusoids, through a filter, and a delay:<br />
<iframe width="100%" height="166" scrolling="no" frameborder="no" src="http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F42061963&#038;show_artwork=true"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://gregsurges.com/original-music/electronic-music/tabularasa-wavetable-oscillator-arduino-shield/tabularasa-user-demos/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>
	</channel>
</rss>

