<?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>cassiel</title>
	<atom:link href="http://www.cassiel.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cassiel.com</link>
	<description>music, media, systems, performance, installation</description>
	<lastBuildDate>Fri, 04 May 2012 22:15:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Shobana Jeyasingh Dance: TooMortal</title>
		<link>http://www.cassiel.com/2012/05/04/shobana-jeyasingh-dance-toomortal/</link>
		<comments>http://www.cassiel.com/2012/05/04/shobana-jeyasingh-dance-toomortal/#comments</comments>
		<pubDate>Fri, 04 May 2012 22:07:13 +0000</pubDate>
		<dc:creator>nick</dc:creator>
				<category><![CDATA[Activities]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Shobana Jeyasingh]]></category>
		<category><![CDATA[TooMortal]]></category>

		<guid isPermaLink="false">http://www.cassiel.com/?p=361</guid>
		<description><![CDATA[We&#8217;ve just started work on a multichannel sound score for Shobana Jeyasingh&#8217;s new dance work TooMortal, a site-specific piece for historic churches in the UK, Venice and Stockholm. Dates 14th-16th June: Venice (site tbc.). 28th-30th June: St. Mary&#8217;s Old Church, London. 12th-14th July: St. Pancras Church, Euston. 19th-21st July: St. Swithun&#8217;s Church, Worcester. 12th-13th September:&#8230;]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.cassiel.com/wp-content/uploads/2012/05/JPM_0380fujiprovia100f.jpg' alt='JPM_0380fujiprovia100f' width="440" height="293" class='alignnone size-medium' /></p>

<p>We&#8217;ve just started work on a multichannel sound score for Shobana Jeyasingh&#8217;s new dance work <a href="http://danceumbrella.co.uk/page/3318">TooMortal</a>, a site-specific piece for historic churches in the UK, Venice and Stockholm.</p>

<h1>Dates</h1>

<ul>
<li><p>14th-16th June: Venice (site tbc.).</p></li>
<li><p>28th-30th June: <a href="http://danceumbrella.co.uk/page/3318/TooMortal+at+St+Marys+Old+Church/447">St. Mary&#8217;s Old Church</a>, London.</p></li>
<li><p>12th-14th July: <a href="http://danceumbrella.co.uk/page/3318/TooMortal+at+St+Pancras+Church/448">St. Pancras Church</a>, Euston.</p></li>
<li><p>19th-21st July: <a href="http://danceumbrella.co.uk/page/3318/TooMortal+at+St+Swithuns+Church/449">St. Swithun&#8217;s Church</a>, Worcester.</p></li>
<li><p>12th-13th September: Stockholm (site tbc.).</p></li>
</ul>

<p>(Photo: JP Masclet.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cassiel.com/2012/05/04/shobana-jeyasingh-dance-toomortal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Morse Code for Overtone</title>
		<link>http://www.cassiel.com/2012/04/13/morse-code-for-overtone/</link>
		<comments>http://www.cassiel.com/2012/04/13/morse-code-for-overtone/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 11:49:59 +0000</pubDate>
		<dc:creator>nick</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Morse Code]]></category>
		<category><![CDATA[Overtone]]></category>
		<category><![CDATA[SuperCollider]]></category>
		<category><![CDATA[Weavrs]]></category>

		<guid isPermaLink="false">http://www.cassiel.com/?p=340</guid>
		<description><![CDATA[We&#8217;ve just uploaded a Morse code generator for Overtone. I&#8217;ve never been much of a fan of SuperCollider largely because of its front-end language, which I first encountered around 15 years ago (before SuperCollider even existed) and had various issues with, but Overtone (a Clojure environment for driving the SuperCollider audio engine) is a different&#8230;]]></description>
			<content:encoded><![CDATA[<div class="hang-2-column" style="width:170px;"><img src='http://www.cassiel.com/wp-content/uploads/2012/04/morse170.jpg' alt='morse170' width="170" height="170" class='alignleft size-thumbnail' /></div>

<p>We&#8217;ve just uploaded a <a href="https://github.com/cassiel/overtone-morse">Morse code generator</a> for <a href="http://overtone.github.com/">Overtone</a>.</p>

<p>I&#8217;ve never been much of a fan of <a href="http://www.audiosynth.com/">SuperCollider</a> largely because of its front-end language, which I first encountered around 15 years ago (before SuperCollider even existed) and had various issues with, but Overtone (a <a href="http://clojure.org/">Clojure</a> environment for driving the SuperCollider audio engine) is a different proposition.</p>

<p>I&#8217;m working on a project involving <a href="http://www.weavrs.com/static/about.html">online avatars</a> and audio-rate control systems, and since Clojure+Overtone can clearly do both web interfacing and audio (all with decent multithreading semantics) it avoids the need for separate programs hooked together via OSC or any kind of plug-in or hosting setup. (We&#8217;ve already implemented <a href="https://github.com/cassiel/net.loadbang.clojure">Clojure for MaxMSP</a>, and that was lined up as our Plan B.)</p>

<p>This Morse code generator is very much My First Overtone Program, drawing just on basic Overtone/SuperCollider idioms which I can hack together without getting too lost. Most of it is plain old Clojure coding with a bit of event scheduling, familiar from realtime media applications.</p>

<p>I wonder how much SuperCollider I&#8217;d have to learn to add synthetic shortwave radio interference?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cassiel.com/2012/04/13/morse-code-for-overtone/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Anarchy in the Organism</title>
		<link>http://www.cassiel.com/2012/04/01/anarchy-in-the-organism/</link>
		<comments>http://www.cassiel.com/2012/04/01/anarchy-in-the-organism/#comments</comments>
		<pubDate>Sun, 01 Apr 2012 20:54:39 +0000</pubDate>
		<dc:creator>nick</dc:creator>
				<category><![CDATA[Installation]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Anarchy in the Organism]]></category>
		<category><![CDATA[Rob Godman]]></category>
		<category><![CDATA[Simeon Nelson]]></category>

		<guid isPermaLink="false">http://www.cassiel.com/?p=333</guid>
		<description><![CDATA[The Wellcome Trust-funded installation piece Anarchy in the Organism by Simeon Nelson has just gone live at the UCLH Cancer Centre. We designed and built the animation and rendering system; Rob Godman composed the multichannel soundtrack. Here&#8217;s a test render of a short section of one animation screen, running faster than the default animation speed&#8230;]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.cassiel.com/wp-content/uploads/2012/04/01352-440x275.jpg' alt='01352-440x275' width="440" height="275" class='alignnone size-medium' /></p>

<p>The Wellcome Trust-funded installation piece <a href="http://anarchyintheorganism.tumblr.com/">Anarchy in the Organism</a> by <a href="http://simeonnelson.wordpress.com/">Simeon Nelson</a> has just gone live at the <a href="http://www.uclh.org/OurServices/OurHospitals/CC/Pages/Home.aspx">UCLH Cancer Centre</a>. We designed and built the animation and rendering system; <a href="http://www.robgodman.com">Rob Godman</a> composed the multichannel soundtrack.</p>

<p><span id="more-333"></span></p>

<p>Here&#8217;s a test render of a short section of one animation screen, running faster than the default animation speed of the piece:</p>

<div width='440'><iframe width='440' height='247.5' src='http://www.youtube.com/embed/YW-0MU7U3JY?rel=0' frameborder='0' allowFullScreen></iframe></div></p>

<p>We&#8217;ll follow up with technical details in due course, but in the meantime here is a gallery of shots of the installation phase:</p>

<div id="flickr__194" class="slickr-flickr-gallery"><ul><li class="active"><a href="http://farm8.static.flickr.com/7082/6886861676_9fbcdb7349_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030124&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7082/6886861676_9fbcdb7349_s.jpg" alt="" title="P1030124" /></a></li><li><a href="http://farm8.static.flickr.com/7237/7032986175_088cca2c34_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030126&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7237/7032986175_088cca2c34_s.jpg" alt="" title="P1030126" /></a></li><li><a href="http://farm8.static.flickr.com/7129/7033048471_a2c6b905fe_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030127&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7129/7033048471_a2c6b905fe_s.jpg" alt="" title="P1030127" /></a></li><li><a href="http://farm8.static.flickr.com/7092/6886971062_44f13f8695_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030128&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7092/6886971062_44f13f8695_s.jpg" alt="" title="P1030128" /></a></li><li><a href="http://farm8.static.flickr.com/7201/7033084567_c005e032c5_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030129&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7201/7033084567_c005e032c5_s.jpg" alt="" title="P1030129" /></a></li><li><a href="http://farm8.static.flickr.com/7274/6887013848_7eb51dbb53_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030130&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7274/6887013848_7eb51dbb53_s.jpg" alt="" title="P1030130" /></a></li><li><a href="http://farm8.static.flickr.com/7176/7033124399_cf282dbb50_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030132&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7176/7033124399_cf282dbb50_s.jpg" alt="" title="P1030132" /></a></li><li><a href="http://farm8.static.flickr.com/7076/7033140393_045a380d8c_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030133&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7076/7033140393_045a380d8c_s.jpg" alt="" title="P1030133" /></a></li><li><a href="http://farm8.static.flickr.com/7207/6887061196_422519951e_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030134&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7207/6887061196_422519951e_s.jpg" alt="" title="P1030134" /></a></li><li><a href="http://farm8.static.flickr.com/7070/7033170917_1060cccb56_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030135&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7070/7033170917_1060cccb56_s.jpg" alt="" title="P1030135" /></a></li><li><a href="http://farm8.static.flickr.com/7279/6887104768_8e89958468_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030136&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7279/6887104768_8e89958468_s.jpg" alt="" title="P1030136" /></a></li><li><a href="http://farm8.static.flickr.com/7214/7033214623_8c52a5f769_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030138&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7214/7033214623_8c52a5f769_s.jpg" alt="" title="P1030138" /></a></li><li><a href="http://farm8.static.flickr.com/7219/6887133360_7b4a7dce49_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030141&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7219/6887133360_7b4a7dce49_s.jpg" alt="" title="P1030141" /></a></li><li><a href="http://farm8.static.flickr.com/7241/7033243665_41a2228a21_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030142&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7241/7033243665_41a2228a21_s.jpg" alt="" title="P1030142" /></a></li><li><a href="http://farm8.static.flickr.com/7187/6887164650_1bbb9115d9_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030143&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7187/6887164650_1bbb9115d9_s.jpg" alt="" title="P1030143" /></a></li><li><a href="http://farm8.static.flickr.com/7089/7033286593_d116002a76_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030144&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7089/7033286593_d116002a76_s.jpg" alt="" title="P1030144" /></a></li><li><a href="http://farm8.static.flickr.com/7057/7033302873_df8c6bd01f_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030147&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7057/7033302873_df8c6bd01f_s.jpg" alt="" title="P1030147" /></a></li><li><a href="http://farm8.static.flickr.com/7239/7033316729_cc25a123b6_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030152&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7239/7033316729_cc25a123b6_s.jpg" alt="" title="P1030152" /></a></li><li><a href="http://farm8.static.flickr.com/7189/6887253946_efa3dd0bd9_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030155&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7189/6887253946_efa3dd0bd9_s.jpg" alt="" title="P1030155" /></a></li><li><a href="http://farm8.static.flickr.com/7059/7033363997_a122ed9869_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030156&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7059/7033363997_a122ed9869_s.jpg" alt="" title="P1030156" /></a></li><li><a href="http://farm8.static.flickr.com/7090/7033378351_2d0aec2854_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030158&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7090/7033378351_2d0aec2854_s.jpg" alt="" title="P1030158" /></a></li><li><a href="http://farm8.static.flickr.com/7044/6887296956_eaf9d9b19a_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030159&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7044/6887296956_eaf9d9b19a_s.jpg" alt="" title="P1030159" /></a></li><li><a href="http://farm8.static.flickr.com/7270/6887316172_e54ba15df2_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030160&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7270/6887316172_e54ba15df2_s.jpg" alt="" title="P1030160" /></a></li><li><a href="http://farm8.static.flickr.com/7233/7033425035_d1d7927994_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030161&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7233/7033425035_d1d7927994_s.jpg" alt="" title="P1030161" /></a></li><li><a href="http://farm8.static.flickr.com/7079/6887370012_db6d62752d_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030162&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7079/6887370012_db6d62752d_s.jpg" alt="" title="P1030162" /></a></li><li><a href="http://farm8.static.flickr.com/7104/6887387400_635b3546f5_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030163&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7104/6887387400_635b3546f5_s.jpg" alt="" title="P1030163" /></a></li><li><a href="http://farm8.static.flickr.com/7273/7033510955_fcba042c8d_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030164&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7273/7033510955_fcba042c8d_s.jpg" alt="" title="P1030164" /></a></li><li><a href="http://farm8.static.flickr.com/7210/6887430156_8aa968e2f8_z.jpg" rel="sf-lightbox" title="&lt;p&gt;P1030165&lt;/p&gt;"><img src="http://farm8.static.flickr.com/7210/6887430156_8aa968e2f8_s.jpg" alt="" title="P1030165" /></a></li></ul></div><div style="clear:both"></div>
]]></content:encoded>
			<wfw:commentRss>http://www.cassiel.com/2012/04/01/anarchy-in-the-organism/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Monomes and Monomatic at Makers’ Guild</title>
		<link>http://www.cassiel.com/2012/03/31/monomes-and-monomatic-at-makers-guild/</link>
		<comments>http://www.cassiel.com/2012/03/31/monomes-and-monomatic-at-makers-guild/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 19:45:59 +0000</pubDate>
		<dc:creator>nick</dc:creator>
				<category><![CDATA[Activities]]></category>
		<category><![CDATA[Presentation]]></category>
		<category><![CDATA[Maker's Guild]]></category>
		<category><![CDATA[Monomatic]]></category>
		<category><![CDATA[Monome]]></category>

		<guid isPermaLink="false">http://www.cassiel.com/?p=324</guid>
		<description><![CDATA[We are giving a short presentation at the next Makers&#8217; Guild event: Making Sounds at the V &#38; A on April 13th. Topics to be covered will probably include recent work with Monomatic and a bit of show-and-tell of performance techniques with the monome.]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.cassiel.com/wp-content/uploads/2012/03/mmb440.jpg' alt='mmb440' width="440" height="248" class='alignnone size-medium' /></p>

<p>We are giving a short presentation at the next <a href="http://www.makersguild.org/">Makers&#8217; Guild</a> event: <a href="http://www.makersguild.org/content/makers-guild-4-making-sounds-va">Making Sounds</a> at the <a href="http://www.vam.ac.uk/whatson/event/1659/makers-guild-2804/">V &amp; A</a> on April 13th. Topics to be covered will probably include recent work with <a href="http://www.monomatic.net">Monomatic</a> and a bit of show-and-tell of performance techniques with the <a href="http://monome.org">monome</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cassiel.com/2012/03/31/monomes-and-monomatic-at-makers-guild/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Whitney Reloaded</title>
		<link>http://www.cassiel.com/2012/03/20/whitney-reloaded/</link>
		<comments>http://www.cassiel.com/2012/03/20/whitney-reloaded/#comments</comments>
		<pubDate>Tue, 20 Mar 2012 21:31:56 +0000</pubDate>
		<dc:creator>nick</dc:creator>
				<category><![CDATA[Installation]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Field]]></category>
		<category><![CDATA[John Whitney]]></category>
		<category><![CDATA[Kinetica]]></category>
		<category><![CDATA[Monomatic]]></category>
		<category><![CDATA[Whitney Reloaded]]></category>

		<guid isPermaLink="false">http://www.cassiel.com/?p=313</guid>
		<description><![CDATA[As half of Monomatic, I contributed an algorithmic video piece to a set of works entitled Whitney Evolved, projected at the Kinetica Art Fair last month. (Other contributors included Lewis Sykes, Evan Raskob, Mick Grierson and Paul Prudence.) Each work was inspired by the early animation work of John Whitney Senior, much of which was&#8230;]]></description>
			<content:encoded><![CDATA[<div width='440'><iframe class='alignnone size-medium' src='http://player.vimeo.com/video/38744162?title=0&byline=0&portrait=0' width='440' height='247.5' frameborder='0' webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div><p/>

<p>As half of <a href="http://www.monomatic.net/">Monomatic</a>, I contributed an algorithmic video piece to a set of works entitled <em>Whitney Evolved</em>, projected at the <a href="http://www.kinetica-artfair.com/">Kinetica Art Fair</a> last month. (Other contributors included <a href="http://blog.lewissykes.info/">Lewis Sykes</a>, <a href="http://pixelist.info/">Evan Raskob</a>, <a href="http://doc.gold.ac.uk/~mus02mg/">Mick Grierson</a> and <a href="http://www.transphormetic.com/">Paul Prudence</a>.) Each work was inspired by the early animation work of <a href="http://en.wikipedia.org/wiki/John_Whitney_(animator)">John Whitney Senior</a>, much of which was done using mechanical equipment many years before computers became powerful enough to render his images in real time.</p>

<p>This particular piece takes Whitney&#8217;s basic &#8220;rose&#8221; pattern and duplicates it into translucent layers of discs, rotating at arithmetically related speeds so that the layers drift into and out of various patterns of alignment. The virtual camera performs a continuous slow pan around the structure from poles to equator, its distance varying as it orbits.</p>

<p>Technology: the Whitney algorithm is written in <a href="http://clojure.org/">Clojure</a> and hosted in <a href="http://openendedgroup.com/field">Field</a>, which takes care of the OpenGL display. Projection in the <a href="https://www.facebook.com/pages/Ambika-P3/107922789233260">P3 Ambika space</a> courtesy of a pair of the inevitable Barco FX-20s.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cassiel.com/2012/03/20/whitney-reloaded/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fusion Programming: From Python to Clojure and Back</title>
		<link>http://www.cassiel.com/2012/02/19/fusion-programming/</link>
		<comments>http://www.cassiel.com/2012/02/19/fusion-programming/#comments</comments>
		<pubDate>Sun, 19 Feb 2012 20:30:11 +0000</pubDate>
		<dc:creator>nick</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Field]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Jython]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.cassiel.com/?p=297</guid>
		<description><![CDATA[Recently we&#8217;ve been working on several digital art projects using Field as a development and presentation platform but with Clojure running the core, domain-specific algorithmic code. This choice is, admittedly, partly because Clojure is new and shiny, but we also like the Emacs- and Leiningen-based development environment (complete with continuous integration testing), and Clojure&#8217;s clean&#8230;]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.cassiel.com/wp-content/uploads/2012/02/clojure-python-2.jpg' alt='clojure-python-2' width="440" height="285" class='alignnone size-medium' /></p>

<p>Recently we&#8217;ve been working on several digital art projects using <a href="http://openendedgroup.com/field/wiki/OverviewBanners2">Field</a> as a development and presentation platform but with <a href="http://clojure.org/">Clojure</a> running the core, domain-specific algorithmic code. This choice is, admittedly, partly because Clojure is new and shiny, but we also like the Emacs- and <a href="https://github.com/technomancy/leiningen">Leiningen</a>-based development environment (complete with <a href="http://jakemccrary.com/blog/2011/12/16/continuous-testing-with-clojure-and-expectations/">continuous integration testing</a>), and Clojure&#8217;s clean functional semantics lends itself to realtime, evolutionary artworks. Since Field works at the level of Python-on-Java (via <a href="http://jython.org/">Jython</a>), and Clojure runs in the JVM, the Python and Clojure worlds inevitably collide.</p>

<p><span id="more-297"></span></p>

<p>Field hosts Clojure directly &#8211; in fact, it hosts several JVM-based languages &#8211; using something called <a href="http://openendedgroup.com/field/wiki/MayaIntegration#Texttransformarea">Text Transforms</a>. Activate the Clojure transform, as in the splash image above, and execution flips from Python to Clojure and back again. The transform passes Python bindings into the Clojure namespace, and bindings made within Clojure are passed out again (within a dedicated variable called <code>_clojure</code>). Both Python and Clojure have access to anything the JVM can see via its classpath. There are one or two wrinkles (such as the hack, shown above, of making sure a variable is retrieved from the Python world before its first use in the Clojure world, since Field&#8217;s dynamic lookup machinery only works for Python), but everything pretty much just works.</p>

<p>If we&#8217;re developing in two languages at once, we need to be able to pass information between them, not least configuration information from Python into Clojure. In Python, we organise our manifest constants without polluting the top-level namespace by declaring things like this:</p>

<div class="no-hang" style="width:440px;"><div id="gist-1831280" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="n">m_Configuration</span> <span class="o">=</span> <span class="n">Manifest</span><span class="p">(</span></div><div class='line' id='LC2'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">FULL_CANVAS</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">DO_VORONOI</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">TREE_DEPTH</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">FIELD_TIMER_INTERVAL</span> <span class="o">=</span> <span class="mf">0.033</span><span class="p">,</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">ASSETS_DIR</span> <span class="o">=</span> <span class="s">&quot;/Users/nick/CASSIEL/FIELDWORKSPACE/&quot;</span></div><div class='line' id='LC7'><span class="p">)</span></div><div class='line' id='LC8'><br/></div><div class='line' id='LC9'><span class="n">m_Nested</span> <span class="o">=</span> <span class="n">Manifest</span><span class="p">(</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">A</span> <span class="o">=</span> <span class="n">Manifest</span><span class="p">(</span><span class="n">B</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> <span class="n">C</span> <span class="o">=</span> <span class="s">&quot;Hello&quot;</span><span class="p">),</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">D</span> <span class="o">=</span> <span class="n">Manifest</span><span class="p">(</span><span class="n">E</span> <span class="o">=</span> <span class="bp">False</span><span class="p">),</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">L</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="n">Manifest</span><span class="p">(</span><span class="n">Z</span> <span class="o">=</span> <span class="mi">14</span><span class="p">)],</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">L_L</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="p">[</span><span class="mi">5</span><span class="p">]],</span> <span class="mi">6</span><span class="p">,</span> <span class="p">[]],</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">N</span> <span class="o">=</span> <span class="bp">None</span></div><div class='line' id='LC15'><span class="p">)</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1831280/3da41bc7d21c072afb59d24b68ead95062b75fbe/gistfile1.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1831280#file_gistfile1.py" style="float:right;margin-right:10px;color:#666">gistfile1.py</a>
            <a href="https://gist.github.com/1831280">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</div>

<p>This lets us use names like <code>m_Configuration.TREE_DEPTH</code> (value <code>5</code>) or (if we use our rather implausible test declaration) <code>m_Nested.A.C</code> (<code>"Hello"</code>). The Python for <code>Manifest</code> is pretty simple:</p>

<div class="no-hang" style="width:440px;"><div id="gist-1863409" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">class</span> <span class="nc">Manifest</span><span class="p">:</span></div><div class='line' id='LC2'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">kw</span><span class="p">:</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">kw</span><span class="p">[</span><span class="n">k</span><span class="p">])</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1863409/5fa0c9212543bd74b08cf5859a2c70e146f76689/gistfile1.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1863409#file_gistfile1.py" style="float:right;margin-right:10px;color:#666">gistfile1.py</a>
            <a href="https://gist.github.com/1863409">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</div>

<p>So what of the Clojure world? Passing a <code>Manifest</code> into Clojure exposes an object constructed from numerous Jython components, whereas what we really want is Clojure hash maps with keywords, so that we can write things like <code>(:TREE_DEPTH m_Configuration)</code> or <code>(:C (:A m_Nested))</code>. So, here&#8217;s an implementation of something we call <code>hashify</code>:</p>

<div class="hang-2-column" style="width:620px;"><div id="gist-1863525" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="p">(</span><span class="kd">ns </span><span class="nv">oncotrees.util</span></div><div class='line' id='LC2'>&nbsp;&nbsp;<span class="p">(</span><span class="ss">:import</span> <span class="p">[</span><span class="nv">org.python.core</span> <span class="nv">PyFloat</span> <span class="nv">PyInteger</span> <span class="nv">PyBoolean</span> <span class="nv">PyString</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">PyList</span> <span class="nv">PyInstance</span> <span class="nv">PyNone</span><span class="p">]</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">[</span><span class="nv">java.util</span> <span class="nv">NoSuchElementException</span><span class="p">]))</span></div><div class='line' id='LC5'><br/></div><div class='line' id='LC6'><span class="p">(</span><span class="kd">defn </span><span class="nv">hashify</span> <span class="p">[</span><span class="nv">py-object</span><span class="p">]</span></div><div class='line' id='LC7'>&nbsp;&nbsp;<span class="p">(</span><span class="nb">cond </span><span class="p">(</span><span class="nb">instance? </span><span class="nv">PyNone</span> <span class="nv">py-object</span><span class="p">)</span> <span class="nv">nil</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nb">instance? </span><span class="nv">PyInstance</span> <span class="nv">py-object</span><span class="p">)</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">letfn</span> <span class="p">[(</span><span class="nf">retr</span> <span class="p">[</span><span class="nv">key</span><span class="p">]</span> <span class="p">(</span><span class="nf">.__getitem__</span> <span class="p">(</span><span class="nf">.__dict__</span> <span class="nv">py-object</span><span class="p">)</span> <span class="nv">key</span><span class="p">))</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">de-iter</span> <span class="p">[</span><span class="nv">iter</span> <span class="nv">result</span><span class="p">]</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">n</span> <span class="p">(</span><span class="nf">try</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">.next</span> <span class="nv">iter</span><span class="p">)</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">catch</span> <span class="nv">NoSuchElementException</span> <span class="nv">_</span> <span class="nv">nil</span><span class="p">))]</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">nil? </span><span class="nv">n</span><span class="p">)</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nb">reverse </span><span class="nv">result</span><span class="p">)</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">recur</span> <span class="nv">iter</span> <span class="p">(</span><span class="nb">cons </span><span class="nv">n</span> <span class="nv">result</span><span class="p">)))))</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">lookup</span> <span class="p">[</span><span class="nv">key</span><span class="p">]</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">p</span> <span class="p">(</span><span class="nf">retr</span> <span class="nv">key</span><span class="p">)]</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">condp</span> <span class="nb">= </span><span class="p">(</span><span class="nb">class </span><span class="nv">p</span><span class="p">)</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">PyFloat</span> <span class="p">(</span><span class="nf">.asDouble</span> <span class="nv">p</span><span class="p">)</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">PyInteger</span> <span class="p">(</span><span class="nf">.asInt</span> <span class="nv">p</span><span class="p">)</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">PyBoolean</span> <span class="p">(</span><span class="nf">.__nonzero__</span> <span class="nv">p</span><span class="p">)</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">PyString</span> <span class="p">(</span><span class="nf">.asString</span> <span class="nv">p</span><span class="p">)</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">PyList</span> <span class="p">(</span><span class="nb">map </span><span class="nv">hashify</span> <span class="p">(</span><span class="nf">de-iter</span> <span class="p">(</span><span class="nf">.iterator</span> <span class="nv">p</span><span class="p">)</span> <span class="nv">nil</span><span class="p">))</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">hashify</span> <span class="nv">p</span><span class="p">))))]</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nb">reduce </span><span class="p">(</span><span class="k">fn </span><span class="p">[</span><span class="nv">m</span> <span class="nv">k</span><span class="p">]</span> <span class="p">(</span><span class="nb">assoc </span><span class="nv">m</span> <span class="p">(</span><span class="nb">keyword </span><span class="nv">k</span><span class="p">)</span> <span class="p">(</span><span class="nf">lookup</span> <span class="nv">k</span><span class="p">)))</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">hash-map</span><span class="p">)</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">.keys</span> <span class="p">(</span><span class="nf">.__dict__</span> <span class="nv">py-object</span><span class="p">))))</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="ss">:else</span> <span class="nv">py-object</span><span class="p">))</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1863525/b3425269c1a29d8d319be08fbc4f1ef4b2d180be/gistfile1.clj" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1863525#file_gistfile1.clj" style="float:right;margin-right:10px;color:#666">gistfile1.clj</a>
            <a href="https://gist.github.com/1863525">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</div>

<p>We scan through the keys, turning each one into a Clojure keyword and converting its value (recursively, so that we can handle nested manifest objects and lists). The conversion from Java iterator into Clojure list is rather ugly &#8211; I&#8217;m a bit surprised that there&#8217;s no pre-existing support for this.</p>

<p>Looking back at the Field listing at the top: we pass the various manifest objects as arguments to top-level Clojure functions which are higher-order and hence return the actual functions we call from Python, having hashified the manifests. Here&#8217;s the main function from a current artwork:</p>

<div class="hang-2-column" style="width:620px;"><div id="gist-1863592" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="p">(</span><span class="kd">defn </span><span class="nv">kick</span></div><div class='line' id='LC2'>&nbsp;&nbsp;<span class="p">[</span><span class="nv">m_Configuration</span> <span class="nv">m_Geometry</span><span class="p">]</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="p">(</span><span class="k">let </span><span class="p">[{</span><span class="ss">:keys</span> <span class="p">[</span><span class="nv">DO_VORONOI</span> <span class="nv">TREE_DEPTH</span> <span class="nv">BRANCH_BEND_PATHS</span><span class="p">]}</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">u/hashify</span> <span class="nv">m_Configuration</span><span class="p">)</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><span class="ss">:keys</span> <span class="p">[</span><span class="nv">CELL_ROWS</span> <span class="nv">CELL_COLS</span> <span class="nv">CELL_SIZE</span> <span class="nv">DELTA</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">INITIAL_LEN</span> <span class="nv">LEN_MUL</span><span class="p">]}</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">u/hashify</span> <span class="nv">m_Geometry</span><span class="p">)]</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="k">fn </span><span class="p">[</span><span class="nv">t</span><span class="p">]</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">v-fn</span> <span class="p">(</span><span class="k">if </span><span class="nv">DO_VORONOI</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">voronoi-with</span> <span class="p">(</span><span class="nb">* </span><span class="nv">CELL_COLS</span> <span class="nv">CELL_SIZE</span> <span class="mi">1</span><span class="nv">/2</span><span class="p">)</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nb">* </span><span class="nv">CELL_ROWS</span> <span class="nv">CELL_SIZE</span> <span class="mi">1</span><span class="nv">/2</span><span class="p">))</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">no-voronoi</span><span class="p">)]</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">v-fn</span> <span class="nv">t</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nf">d/fixed</span> <span class="nv">CELL_ROWS</span> <span class="nv">CELL_COLS</span> <span class="nv">CELL_SIZE</span><span class="p">)</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="k">fn </span><span class="p">[</span><span class="nv">t</span><span class="p">]</span> <span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">depth-here</span> <span class="nv">TREE_DEPTH</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">tip</span> <span class="mi">1</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">tree0</span> <span class="p">((</span><span class="nf">d/tree</span> <span class="nv">DELTA</span> <span class="nv">LEN_MUL</span> <span class="nv">tip</span> <span class="nv">BRANCH_BEND_PATHS</span><span class="p">)</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">t</span> <span class="nv">depth-here</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">0</span><span class="p">]</span> <span class="nv">INITIAL_LEN</span> <span class="nv">nil</span><span class="p">)</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">tree1</span> <span class="p">(</span><span class="nb">map </span><span class="nv">rotate-R</span> <span class="nv">tree0</span><span class="p">)</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">tree2</span> <span class="p">(</span><span class="nb">map </span><span class="nv">flip-seg-Y</span> <span class="nv">tree0</span><span class="p">)</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">tree3</span> <span class="p">(</span><span class="nb">map </span><span class="p">(</span><span class="nb">comp </span><span class="nv">flip-seg-X</span> <span class="nv">flip-seg-Y</span><span class="p">)</span> <span class="nv">tree0</span><span class="p">)]</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="nb">cons </span><span class="p">[[</span><span class="mi">0</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">0</span><span class="p">]]</span> <span class="nv">tree1</span><span class="p">))))))))</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1863592/5af232435f4aa944c56d22fd24377a287ab29f57/gistfile1.clj" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1863592#file_gistfile1.clj" style="float:right;margin-right:10px;color:#666">gistfile1.clj</a>
            <a href="https://gist.github.com/1863592">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</div>

<p>The big win here is the ability to map-bind the entries of a manifest in one go. Using the <code>:keys</code> form here binds the names directly, at the cost of a pile of ugly upper-case identifiers in the middle of the code &#8211; but there&#8217;s no reason why we couldn&#8217;t modify <code>hashify</code> to downcase everything.</p>

<p>The final push: it makes sense to pass composite data objects from Clojure back to Python in the same form (rather straining the original intent of &#8220;manifest&#8221;), but how do we turn Clojure&#8217;s persistent hash maps back into manifest objects? It would be great if we could overload the <code>Manifest</code> constructor to take a hash map; since we can&#8217;t, this is the closest I managed to get: an optional non-keyword argument which can be a hash map. <code>Manifest</code> now looks like this:</p>

<div class="hang-2-column" style="width:620px;"><div id="gist-1864710" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="kn">from</span> <span class="nn">java.util</span> <span class="kn">import</span> <span class="n">Map</span><span class="p">,</span> <span class="n">List</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'><span class="k">class</span> <span class="nc">Manifest</span><span class="p">:</span></div><div class='line' id='LC4'>	<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">h</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span></div><div class='line' id='LC5'>		<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">kw</span><span class="p">:</span></div><div class='line' id='LC6'>			<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">kw</span><span class="p">[</span><span class="n">k</span><span class="p">])</span></div><div class='line' id='LC7'><br/></div><div class='line' id='LC8'>		<span class="k">if</span> <span class="n">h</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span></div><div class='line' id='LC9'>			<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">h</span><span class="o">.</span><span class="n">iterator</span><span class="p">():</span></div><div class='line' id='LC10'>				<span class="n">n</span> <span class="o">=</span> <span class="n">k</span><span class="o">.</span><span class="n">getKey</span><span class="p">()</span><span class="o">.</span><span class="n">getName</span><span class="p">()</span></div><div class='line' id='LC11'>				<span class="n">v</span> <span class="o">=</span> <span class="n">k</span><span class="o">.</span><span class="n">getValue</span><span class="p">()</span></div><div class='line' id='LC12'>				<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__unpack</span><span class="p">(</span><span class="n">v</span><span class="p">))</span></div><div class='line' id='LC13'><br/></div><div class='line' id='LC14'>	<span class="k">def</span> <span class="nf">__unpack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span></div><div class='line' id='LC15'>		<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">Map</span><span class="p">):</span></div><div class='line' id='LC16'>			<span class="k">return</span> <span class="n">Manifest</span><span class="p">(</span><span class="n">x</span><span class="p">)</span></div><div class='line' id='LC17'>		<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">List</span><span class="p">):</span></div><div class='line' id='LC18'>			<span class="k">return</span> <span class="nb">map</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__unpack</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span></div><div class='line' id='LC19'>		<span class="k">else</span><span class="p">:</span></div><div class='line' id='LC20'>			<span class="k">return</span> <span class="n">x</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1864710/e168ea3e0c7a4ae29f6a60f08507096271e9ada4/gistfile1.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1864710#file_gistfile1.py" style="float:right;margin-right:10px;color:#666">gistfile1.py</a>
            <a href="https://gist.github.com/1864710">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</div>

<p>This is effectively &#8220;<code>unhashify</code>&#8221; on the Python side (and again it&#8217;s recursive to handle nested structures). The instance check for <code>Map</code> gets us hash maps; the instance check for <code>List</code> gets us Clojure lists, vectors and sequences. The only real Clojure-dependent part of this is the <code>.getName()</code> call on the keywords to turn them back into strings. (Again, we&#8217;d probably want to upcase these to be typographically correct.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cassiel.com/2012/02/19/fusion-programming/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Loadbang Reloaded</title>
		<link>http://www.cassiel.com/2011/12/22/loadbang-reloaded/</link>
		<comments>http://www.cassiel.com/2011/12/22/loadbang-reloaded/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 23:49:47 +0000</pubDate>
		<dc:creator>nick</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[MaxMSP]]></category>
		<category><![CDATA[Monome]]></category>
		<category><![CDATA[OSC]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Shado]]></category>

		<guid isPermaLink="false">http://www.cassiel.com/?p=266</guid>
		<description><![CDATA[We&#8217;ve been putting some effort in recently to shift our major JVM-hosted MaxMSP projects to GitHub. Most of them started out hosted privately in CVS and built using Eclipse, and then migrated to hosting in Mercurial, with a different directory structure and a fair degree of pain in getting the various Ant scripts to work&#8230;]]></description>
			<content:encoded><![CDATA[<div class="hang-2-column" style="width:170px;"><img src='http://www.cassiel.com/wp-content/uploads/2011/12/jython170.jpg' alt='jython170' width="170" height="171" class='alignleft size-thumbnail' /></div>

<p>We&#8217;ve been putting some effort in recently to shift our major
JVM-hosted MaxMSP projects to <a href="https://github.com/">GitHub</a>. Most of them started
out hosted privately in CVS and built using Eclipse, and then migrated
to hosting in Mercurial, with a different directory structure and a
fair degree of pain in getting the various Ant scripts to work
again. Moving everything to GitHub made sense, but that required
another rearrangement of source directories and build paths, so it was
obviously time to bite the bullet and use <a href="http://maven.apache.org/">Maven</a> to build everything
instead. This decision has lowered the maintenance effort considerably.</p>

<p><span id="more-266"></span></p>

<p>Without further ado:</p>

<ul>
<li><p><a href="https://github.com/cassiel/net.loadbang.lib">net.loadbang.lib</a> base libraries used by everything else</p></li>
<li><p><a href="https://github.com/cassiel/net.loadbang.osc">net.loadbang.osc</a> a simple but versatile and well-documented
OSC library, supporting UDP and TCP transmission and reception</p></li>
<li><p><a href="https://github.com/cassiel/net.loadbang.scripting">net.loadbang.scripting</a> a support library for the
various JVM-hosted scripting languages</p></li>
<li><p><a href="https://github.com/cassiel/net.loadbang.groovy">net.loadbang.groovy</a> the Groovy language for MaxMSP</p></li>
<li><p><a href="https://github.com/cassiel/net.loadbang.jython">net.loadbang.jython</a> the Python language for MaxMSP, using
the Jython system</p></li>
<li><p><a href="https://github.com/cassiel/net.loadbang.shado">net.loadbang.shado</a> a high-level sprite-based rendering
library for the monome and arc control surfaces</p></li>
</ul>

<p>A few things are still missing from this list:</p>

<ul>
<li><p><a href="http://www.loadbang.net/space/Software/net.loadbang-SQL">SQL</a> a wrapper on top of some zero-footprint SQL databases
(plus a MySQL shim): with the advent of Python and Clojure as DSLs
for Java, it&#8217;s not clear that this package serves any real purpose</p></li>
<li><p><code>net.loadbang.straker</code> a not-yet-released modular sequencing
framework for the monome</p></li>
<li><p><code>net.loadbang.fireflash</code> a not-yet-released multi-app, multi-device
heterogeneous monome protocol router</p></li>
<li><p><a href="http://www.loadbang.net/space/Software/net.loadbang.web">web</a> an embedded Jetty-based web server for Max</p></li>
<li><p>various user-interface goodies like <a href="http://www.loadbang.net/space/Software/Nixies">Nixie tubes</a> and
<a href="http://www.loadbang.net/space/Software/TextBrick">rotating text</a></p></li>
<li><p><a href="https://github.com/cassiel/maxmsp-clojure">Clojure</a> &#8211; the most important at this stage -
Clojure for MaxMSP</p></li>
</ul>

<p>Clojure will be getting some love very soon (we&#8217;re <a href="http://maxuk.wordpress.com/">teaching it</a>
in about three weeks). The link above is to an early build we put
together for the Cycling &#8217;74 <a href="http://cycling74.com/2011/03/30/announcing-expo-74-2011/">Expo</a> last October; it still needs
to be Mavenised and updated for Clojure 1.3.</p>

<p>Some videos: this is what <code>straker</code> looks like when it&#8217;s running (a
sight familiar to recent audiences at the <a href="http://www.lottolab.org/articles/sciencemuseumlates.asp">Lottolab</a> gigs):</p>

<div width='440'><iframe class='alignnone size-medium' src='http://player.vimeo.com/video/2260727?title=0&byline=0&portrait=0' width='440' height='247.5' frameborder='0' webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div><p/>

<p>This is <code>fireflash</code>:</p>

<div width='440'><iframe class='alignnone size-medium' src='http://player.vimeo.com/video/8696044?title=0&byline=0&portrait=0' width='440' height='247.5' frameborder='0' webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div><p/>
]]></content:encoded>
			<wfw:commentRss>http://www.cassiel.com/2011/12/22/loadbang-reloaded/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MaxMSP Showing and Telling</title>
		<link>http://www.cassiel.com/2011/12/13/maxmsp-showing-and-telling/</link>
		<comments>http://www.cassiel.com/2011/12/13/maxmsp-showing-and-telling/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 23:17:24 +0000</pubDate>
		<dc:creator>nick</dc:creator>
				<category><![CDATA[Activities]]></category>
		<category><![CDATA[Presentation]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Gig]]></category>
		<category><![CDATA[MaxMSP]]></category>
		<category><![CDATA[Monome]]></category>
		<category><![CDATA[Workshop]]></category>

		<guid isPermaLink="false">http://www.cassiel.com/?p=257</guid>
		<description><![CDATA[We&#8217;re workshopping, and gigging, at the M4_u (Max/MSP for Users) Convention, 13th to 14th of January, Phoenix Square, Leicester. The workshop is pretty much going to be a repeat of that given at the Cycling &#8217;74 Expo &#8211; building an algorithmic step sequencer and abstract display system using Clojure. The gig will be monome-based, probably&#8230;]]></description>
			<content:encoded><![CDATA[<div class="hang-2-column" style="width:170px;"><img src='http://www.cassiel.com/wp-content/uploads/2011/12/m4u_170.jpg' alt='m4u_170' width="170" height="123" class='alignleft size-thumbnail' /></div>

<p>We&#8217;re workshopping, and gigging, at the <a href="http://maxuk.wordpress.com/">M4_u (Max/MSP for Users) Convention</a>, 13th to 14th of January, Phoenix Square, Leicester. The workshop is pretty much going to be a repeat of that given at the <a href="http://cycling74.com/2011/03/30/announcing-expo-74-2011/">Cycling &#8217;74 Expo</a> &#8211; building an algorithmic step sequencer and abstract display system using <a href="http://clojure.org">Clojure</a>. The gig will be <a href="http://monome.org">monome</a>-based, probably with some pulse sequencer action.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cassiel.com/2011/12/13/maxmsp-showing-and-telling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plenum at Lumiere Durham</title>
		<link>http://www.cassiel.com/2011/12/12/plenum-at-lumiere-durham/</link>
		<comments>http://www.cassiel.com/2011/12/12/plenum-at-lumiere-durham/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 23:35:44 +0000</pubDate>
		<dc:creator>nick</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Durham]]></category>
		<category><![CDATA[Field]]></category>
		<category><![CDATA[Lumiere]]></category>
		<category><![CDATA[OSC]]></category>
		<category><![CDATA[Plenum]]></category>
		<category><![CDATA[Rob Godman]]></category>
		<category><![CDATA[Simeon Nelson]]></category>

		<guid isPermaLink="false">http://www.cassiel.com/?p=250</guid>
		<description><![CDATA[This short video shows Plenum projected onto St. Oswald&#8217;s church as part of the Lumiere Durham festival. This was the third outing for the piece this year, the first two being at Skyway (Toruń, Poland) and Valgus (Tallinn, Estonia), associated with Lux Scientia. As mentioned in an earlier blog entry, This version of Plenum dispenses&#8230;]]></description>
			<content:encoded><![CDATA[<div width='440'><iframe class='alignnone size-medium' src='http://player.vimeo.com/video/32473866?title=0&byline=0&portrait=0' width='440' height='247.5' frameborder='0' webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div><p/>

<p>This short video shows <a href="http://simeonnelson.wordpress.com/2011/07/25/lux-scientia-a-european-constellation/">Plenum</a> projected onto St. Oswald&#8217;s church as part of the <a href="http://www.lumieredurham.co.uk/">Lumiere Durham</a> festival. This was the third outing for the piece this year, the first two being at <a href="http://www.skyway.art.pl/">Skyway</a> (Toruń, Poland) and <a href="http://www.valgusfestival.ee/">Valgus</a> (Tallinn, Estonia), associated with <a href="http://luxscientia.wordpress.com/">Lux Scientia</a>.</p>

<p><span id="more-250"></span></p>

<div class="hang-2-column" style="width:170px;"><img src='http://www.cassiel.com/wp-content/uploads/2011/12/plenum-field-170.jpg' alt='plenum-field-170' width="170" height="278" class='alignleft size-thumbnail' /></div>

<p>As mentioned in an <a href="http://www.cassiel.com/2011/08/04/plenum-european-tour-2011/">earlier blog entry</a>, This version of Plenum dispenses with the (rather fragile) Processing plugin for graphics and instead uses <a href="http://openendedgroup.com/field/wiki/OverviewBanners2">Field</a>&#8216;s own antialiased scenegraph renderer. Having something resolution-independent with a virtual camera and the ability to render onto a foldable frame buffer surface was a great help when it came to calibrating for the Tallinn town hall. (We aren&#8217;t doing projection mapping, and have no intention of being drawn into that area until a convincing, coherent creative process presents itself.)</p>

<p>The overall timeline arc &#8211; the disintegration of a matrix into gravitationally orbiting and escaping bodies &#8211; is much the same as the version developed for Skyway in 2010, but the current version also employs a complex, dynamic set of mutation functions which change the sizes of the points according to geometric formulae, resulting in visual artifacts (rings, bars) overlaying the disintegration of the basic pattern.</p>

<p>As before, the Field system transmits musical cues and control signals via <a href="http://opensoundcontrol.org/">OSC</a> to a synthesis system designed and programmed by <a href="http://www.robgodman.com">Rob Godman</a>.</p>

<p>(The cryptic diagram in the left hand margin is Field&#8217;s sequencing canvas for Plenum, showing the various elements of the piece along a timeline.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cassiel.com/2011/12/12/plenum-at-lumiere-durham/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coding for the Cathedral: Dreamhub at Vor Frue Kirke</title>
		<link>http://www.cassiel.com/2011/12/05/coding-for-the-cathedral/</link>
		<comments>http://www.cassiel.com/2011/12/05/coding-for-the-cathedral/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 20:16:58 +0000</pubDate>
		<dc:creator>nick</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Ableton Live]]></category>
		<category><![CDATA[AudioCubes]]></category>
		<category><![CDATA[Copenhagen]]></category>
		<category><![CDATA[Dreamhub]]></category>
		<category><![CDATA[Lysets Lyd]]></category>
		<category><![CDATA[MaxMSP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Vor Frue Kirke]]></category>

		<guid isPermaLink="false">http://www.cassiel.com/?p=237</guid>
		<description><![CDATA[We recently did a bit of coding for Dreamhub: the Lysets Lyd chill-out gig at Vor Frue Kirke required twelve Percussa AudioCubes connected into an Ableton Live set, capable of sending MIDI data to Live (to trigger clips from the sensors) and of responding to MIDI (to transform automation controller messages into colour changes). Percussa&#8217;s&#8230;]]></description>
			<content:encoded><![CDATA[<div width='440'><iframe class='alignnone size-medium' src='http://player.vimeo.com/video/32446378?title=0&byline=0&portrait=0' width='440' height='247.5' frameborder='0' webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div><p/>

<p>We recently did a bit of coding for <a href="http://www.dreamhub.dk">Dreamhub</a>: the <a href="http://www.facebook.com/lysetslyd">Lysets Lyd</a> chill-out gig at <a href="http://www.koebenhavnsdomkirke.dk">Vor Frue Kirke</a> required twelve <a href="http://www.percussa.com">Percussa AudioCubes</a> connected into an <a href="http://www.ableton.com">Ableton Live</a> set, capable of sending MIDI data to Live (to trigger clips from the sensors) and of responding to MIDI (to transform automation controller messages into colour changes). Percussa&#8217;s bundled control software wasn&#8217;t up to the task at the time, being limited to four cubes at once and a rather laborious manual setup procedure, so we built a custom <a href="http://cycling74.com/products/max/">Max</a> patcher using an external object by <a href="http://www.percussa.com/2011/07/10/check-out-thomas-grills-flext-external-for-audiocubes/">Thomas Grill</a> and our <a href="http://www.loadbang.net/space/Software/net.loadbang.jython">Python machinery</a> to deal with the configuration and state transitions required by the set.</p>

<p><span id="more-237"></span></p>

<p>Here&#8217;s the obligatory patcher screen shot:</p>

<p><img src='http://www.cassiel.com/wp-content/uploads/2011/12/lysets-max-440.jpg' alt='lysets-max-440' width="440" height="490" class='alignnone size-medium' /></p>

<p>There&#8217;s a nice write-up <a href="http://www.percussa.com/2011/10/01/light-sound-installation-with-audiocubes-by-kim-pedersen/">here</a>. Next performance: 3rd February 2012.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cassiel.com/2011/12/05/coding-for-the-cathedral/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

