<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3876651862903583662</id><updated>2012-02-16T09:37:25.011-08:00</updated><title type='text'>Building a ReacTable</title><subtitle type='html'>A clever, but complicated, musical instrument.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-6062585207512561081</id><published>2009-08-12T23:59:00.000-07:00</published><updated>2009-08-13T00:14:24.708-07:00</updated><title type='text'>16. Project Status #4</title><content type='html'>I've replaced my temporary fix for those clicking noises with a more elegant, permanent fix.&lt;br /&gt;&lt;br /&gt;The next features in the pipeline:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Rotating controllers changes frequency (rotating generators already does this)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;New controller: Envelope generator&lt;/li&gt;&lt;li&gt;New controller: Sequencer&lt;/li&gt;&lt;/ol&gt;At the suggestion of a friend, I got &lt;u&gt;Foundations of Computer Music&lt;/u&gt; from my local library, but I have to admit it's slow going.  I'm definitely missing some prerequisite knowledge.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-6062585207512561081?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/6062585207512561081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=6062585207512561081' title='41 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/6062585207512561081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/6062585207512561081'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2009/08/16-project-status-4.html' title='16. Project Status #4'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>41</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-5097621671443617620</id><published>2008-12-20T00:53:00.000-08:00</published><updated>2009-04-08T23:44:20.765-07:00</updated><title type='text'>15. Project Status #3</title><content type='html'>Much has happened since my last update.  In December, the camera arrived, and I wrote the connection manager, integrating the basic synthesizer I had written.  By the end of December I was making the same &lt;a href="http://building-a-reactable.blogspot.com/2008/12/14-first-generated-sounds.html"&gt;funny noises&lt;/a&gt;, but now moving objects around on the &lt;a href="http://building-a-reactable.blogspot.com/2008/11/10-building-tabletop-and-cabinet.html"&gt;tabletop&lt;/a&gt;.   Then, around Christmas-time I ran into a tricky problem.  I added a rotation action to my generators, which changes frequency.  (ie. you turn the object to change it's pitch)  However, rotating caused terrible clicking noises.  Despite some friendly offers of help, I lost interest in the project.  Just tonight, three months later, I sat down for a few hours and came up with a workaround!&lt;br /&gt;&lt;br /&gt;So, I'm happy to report that I'm not done with this project yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-5097621671443617620?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/5097621671443617620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=5097621671443617620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/5097621671443617620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/5097621671443617620'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/12/15-project-status-3.html' title='15. Project Status #3'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-6855864321473172509</id><published>2008-12-02T22:08:00.000-08:00</published><updated>2008-12-02T22:24:10.012-08:00</updated><title type='text'>14. First generated sounds</title><content type='html'>I've added support for generators to have multiple controllers.  I recorded some simple sounds to share with you.&lt;br /&gt;&lt;br /&gt;First, a sinewave generator with 4 sinewave controllers of various frequencies.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jaredbeck.com/pub/permanent/2008-12-02/5sines.mp3"&gt;http://jaredbeck.com/pub/permanent/2008-12-02/5sines.mp3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Second, a mix of a bunch of different waveforms.  There's a sawtooth controller in there, one or two square wave controllers, and I think the generator was square wave also.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jaredbeck.com/pub/permanent/2008-12-02/crazy.mp3"&gt;http://jaredbeck.com/pub/permanent/2008-12-02/crazy.mp3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I know, these are really trivial examples of synthesis, but I'm just getting started.  Maybe I'll write a step sequencer next.  Then I can actually make some beats.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-6855864321473172509?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/6855864321473172509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=6855864321473172509' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/6855864321473172509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/6855864321473172509'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/12/14-first-generated-sounds.html' title='14. First generated sounds'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-553746481252982014</id><published>2008-11-25T21:31:00.000-08:00</published><updated>2008-11-29T19:23:56.221-08:00</updated><title type='text'>13. Endianness Conversion</title><content type='html'>The following are two common tasks I have been dealing with, except I haven't been using the appropriate bitwise operators for efficiency. These examples were a big help:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How do I convert short (16 bit) samples to bytes to store them in a byte array?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example: Store 16-bit sample in a little-endian byte array:&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="programlisting"&gt;short sample = ...;&lt;br /&gt;byte[] buffer = ...;&lt;br /&gt;int offset = ...;&lt;br /&gt;// low byte&lt;br /&gt;buffer[offset + 0] = (byte) (sample &amp;amp; 0xFF);&lt;br /&gt;// high byte&lt;br /&gt;buffer[offset + 1] = (byte) (sample &gt;&gt; 8) &amp;amp; 0xFF;&lt;/pre&gt;&lt;a href="http://www.jsresources.org/faq_audio.html#short_to_byte"&gt;(citation)&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How can I reconstruct sample values from a byte array?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example: Reconstruct a 16-bit sample from signed PCM into a signed int (32-bit):&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="programlisting"&gt;int sample = (buffer[offset + 0] &amp; 0xFF) | &lt;br /&gt;(buffer[offset + 1] &lt;&lt; 8);&lt;/pre&gt;&lt;a href="http://www.jsresources.org/faq_audio.html#reconstruct_samples"&gt;(citation)&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Note the bitwise inclusive OR (|) and the signed left shift operator&lt;br /&gt;(&lt;&lt;).  The bitwise AND (&amp;amp;) I was already using to mask, as above,&lt;br /&gt;but the other two I wasn't using yet.  I was using integer arithmetic&lt;br /&gt;instead of these bitwise operators, which is a little embarrassing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-553746481252982014?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/553746481252982014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=553746481252982014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/553746481252982014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/553746481252982014'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/13-endianness-conversion.html' title='13. Endianness Conversion'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-6938386567091546977</id><published>2008-11-25T20:12:00.000-08:00</published><updated>2008-11-29T19:26:29.793-08:00</updated><title type='text'>12. Endianness</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Endianness"&gt;Endianness&lt;/a&gt; of components in my project:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The Java virtual machine is big-endian. (citation needed)&lt;/li&gt;&lt;li&gt;My Intel-based mac is little-endian.&lt;/li&gt;&lt;li&gt;"PCI busses are, by design, little endian" (&lt;a href="http://developer.apple.com/documentation/DeviceDrivers/Conceptual/WritingPCIDrivers/endianness/chapter_7_section_3.html"&gt;citation&lt;/a&gt;) (Not applicable in my situation because my audio is on-board, but interesting to know.)&lt;/li&gt;&lt;li&gt;My macbook's audio device is probably this: "Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 02)" which I assume is little-endian, because it is from Intel. (This is someone else's output from lspci, which I don't have installed)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The examples I've seen so far at &lt;a href="http://www.jsresources.org/"&gt;jsresources.org&lt;/a&gt; are little-endian&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;I am using 16-bit samples, but if you are only using 8-bit, you can ignore endianness:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;For Java Sound, endianess matters if the size of samples (as given by AudioFormat.getSampleSizeInBits()) is greater than 8 bit. For 8 bit data, while the endianess still has to be specified in an AudioFormat object, it has no significance.&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://www.jsresources.org/faq_audio.html#endianess"&gt;citation&lt;/a&gt;)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Conclusion:&lt;br /&gt;&lt;br /&gt;I can perform audio synthesis calculations in big-endian, because that is what the JVM speaks, but my final output should be little-endian, because that is what all of my Intel hardware speaks.  Obviously, I should only convert once, for the final output.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-6938386567091546977?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/6938386567091546977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=6938386567091546977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/6938386567091546977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/6938386567091546977'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/12-endianness.html' title='12. Endianness'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-9147132025930207804</id><published>2008-11-24T23:10:00.000-08:00</published><updated>2008-11-24T23:22:08.870-08:00</updated><title type='text'>11. Project Status #2</title><content type='html'>Working from the other end of the project, so to speak, I've written a proof-of-concept tree.  So far I have a generator and controller. &lt;br /&gt;&lt;br /&gt;So, instead of making the beeeeeeeeeeeeeeeeeeep of the generator, now I can make a beep beep beep.  (with a square wave controller)  I can also use a sine or triangle controller to make a woo woo woo, or a sawtooth controller to make a chirp chirp chirp.  It's a big step for me!&lt;br /&gt;&lt;br /&gt;The next step is to support more than one controller, so I can make a beep beep beep BEEP beep beep beep BEEP.&lt;br /&gt;&lt;br /&gt;Before I can do that, I need to clean up my code, fix a bug in my two's complement math, and get some sleep.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-9147132025930207804?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/9147132025930207804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=9147132025930207804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/9147132025930207804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/9147132025930207804'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/11-project-status-2.html' title='11. Project Status #2'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-7834801924872332218</id><published>2008-11-18T19:36:00.001-08:00</published><updated>2008-11-18T20:00:46.872-08:00</updated><title type='text'>10. Building tabletop and cabinet</title><content type='html'>I got a glass table top for free.  Woot.  I traced the table top onto paper.  Drew arcs.  These arcs will be patterns for cutting the plywood.  Actually, I will be making two rings out of these arcs. The bottom ring will be a lip for the glass to rest on.  You'll see.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_YBaRtSkOX5Y/SSOKEU5r68I/AAAAAAAAAAk/n6DK2tRA3YE/s1600-h/100_2140.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_YBaRtSkOX5Y/SSOKEU5r68I/AAAAAAAAAAk/n6DK2tRA3YE/s400/100_2140.jpg" alt="" id="BLOGGER_PHOTO_ID_5270207795888384962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I cut out the arc patterns.  The left over paper circle below the glass shows usable area.  Cell phone shown for scale.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YBaRtSkOX5Y/SSOKEVGIBZI/AAAAAAAAAAs/qo0_Xh1jja0/s1600-h/100_2144.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_YBaRtSkOX5Y/SSOKEVGIBZI/AAAAAAAAAAs/qo0_Xh1jja0/s400/100_2144.jpg" alt="" id="BLOGGER_PHOTO_ID_5270207795940558226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Getting ready to glue arcs into rings.  See how there are two rings?  The rings overlap for strength.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YBaRtSkOX5Y/SSOKEvrwpNI/AAAAAAAAAA0/XhT0oW474PQ/s1600-h/100_2149.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_YBaRtSkOX5Y/SSOKEvrwpNI/AAAAAAAAAA0/XhT0oW474PQ/s400/100_2149.jpg" alt="" id="BLOGGER_PHOTO_ID_5270207803077731538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Gluing arcs.  Yay clamps!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YBaRtSkOX5Y/SSOKEhLz7HI/AAAAAAAAAA8/q5Ro_q_hheE/s1600-h/100_2155.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_YBaRtSkOX5Y/SSOKEhLz7HI/AAAAAAAAAA8/q5Ro_q_hheE/s400/100_2155.jpg" alt="" id="BLOGGER_PHOTO_ID_5270207799185632370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Planning the cabinet ..&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YBaRtSkOX5Y/SSOKEy1DNtI/AAAAAAAAABE/JAVg6F3zjXg/s1600-h/100_2156.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_YBaRtSkOX5Y/SSOKEy1DNtI/AAAAAAAAABE/JAVg6F3zjXg/s400/100_2156.jpg" alt="" id="BLOGGER_PHOTO_ID_5270207803922003666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Simple cabinet out of 2x2s and 1x4s.  It's actually quite sturdy, and lightweight.  I'm satisfied.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YBaRtSkOX5Y/SSOKMJx2vaI/AAAAAAAAABM/1GPg5tnAK2o/s1600-h/100_2159.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="http://4.bp.blogspot.com/_YBaRtSkOX5Y/SSOKMJx2vaI/AAAAAAAAABM/1GPg5tnAK2o/s400/100_2159.jpg" alt="" id="BLOGGER_PHOTO_ID_5270207930341703074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;To make the table more portable, I want to be able to take the top off.   I use bolts, eye straps, and wingnuts.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YBaRtSkOX5Y/SSOLUcMMfdI/AAAAAAAAABk/O6SKh3ucZ-4/s1600-h/bolt.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 348px;" src="http://3.bp.blogspot.com/_YBaRtSkOX5Y/SSOLUcMMfdI/AAAAAAAAABk/O6SKh3ucZ-4/s400/bolt.jpg" alt="" id="BLOGGER_PHOTO_ID_5270209172234599890" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-7834801924872332218?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/7834801924872332218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=7834801924872332218' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/7834801924872332218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/7834801924872332218'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/10-building-tabletop-and-cabinet.html' title='10. Building tabletop and cabinet'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_YBaRtSkOX5Y/SSOKEU5r68I/AAAAAAAAAAk/n6DK2tRA3YE/s72-c/100_2140.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-3748049671641571980</id><published>2008-11-16T20:31:00.000-08:00</published><updated>2008-12-12T00:10:51.444-08:00</updated><title type='text'>9. Camera and Lighting</title><content type='html'>Until now, I have been using the built-in camera on my laptop to play around with the ReacTIVision software.  As I get closer to having a real table to work with, I have been researching the requirements for a camera.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;From the &lt;a href="http://mtg.upf.edu/reactable/?software"&gt;official site&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;For the tracking, the objects need to be properly illuminated, so the camera and thus the computer vision application can see them correctly. For the projection onto a table, the surface needs to be dark though, so the user can see the projected image well enough. Since these two necessary steps logically exclude each other, the solution is to operate in two different spectra:&lt;br /&gt;&lt;br /&gt;The projection has to be visible to the user, so the computer vision component needs to operate in a different, invisible spectrum such as infrared. Most CCD cameras are perfectly sensitive within the near IR spectrum &lt;/blockquote&gt;&lt;br /&gt;(Near IR refers to light with a wavelength of 700 to 900 nm)   See this WP article on &lt;a href="http://en.wikipedia.org/wiki/Infrared_photography"&gt;Infrared Photography&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;IR Lamps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;therefore infrared LED lamps can be used to illuminate the table.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;I haven't found a good cheap near-IR lamp yet.  The cheapest I've found yet are about $50 and look overpowered (50-100 LEDs)  I'll post back here when I've researched this further.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Filtering out visible light&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;All light from the visible spectrum needs to be filtered in the camera, so the computer vision algorithm is not disturbed by the projection.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;I have had some trouble finding filters that block visible light.  &lt;a href="http://www.edmundoptics.com/"&gt;Edmund Optics&lt;/a&gt; is the only supplier I've found so far.  Look for their "&lt;a href="http://www.edmundoptics.com/onlinecatalog/displayproduct.cfm?productid=1524&amp;amp;StartRow=1&amp;amp;PageNum=1#Products"&gt;R-72 UV / VIS-Cut Filter&lt;/a&gt;"  Unfortunately, this filter is probably too expensive for me.&lt;br /&gt;&lt;br /&gt;UPDATE:  I just found these &lt;a href="http://www.edmundoptics.com/onlinecatalog/displayproduct.cfm?productID=1918"&gt;unmounted filters&lt;/a&gt; which are cheap and sound OK.  They look kind of opaque, so I asked my optics guy "&lt;span dir="ltr" id=":f2"&gt;Do you think the image quality will be OK?" and he said "&lt;/span&gt;&lt;span dir="ltr" id=":ez"&gt;no problem at all. Only opaque at visible wavelengths. For IR, it's like a clear window."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;IR-blocking lens coatings&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Eventually an existing infrared blocker needs to be removed from the camera sensor. &lt;/blockquote&gt;&lt;br /&gt;Many cameras, especially delicate color CCDs, have an IR-blocking coating. &lt;a href="http://www.unibrain.com/"&gt; Unibrain&lt;/a&gt; sells lenses without this coating, and suggests that you use these lenses with their B/W cameras, not the color.  (Which is fine for our purpose)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CCD vs. CMOS&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;In general cameras with CCD sensors should perform better than those with a CMOS chip. Additionally you should make sure that the camera has an acceptable lens. These two criterias basically exclude cameras below the 50$ range. &lt;/blockquote&gt;&lt;br /&gt;Yeah, no kidding.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Avoid Interlaced Mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;DV cameras supporting full-frame mode are suitable, while those with interlaced mode only, will not work at all. &lt;/blockquote&gt;&lt;br /&gt;I think that interlacing is a technique of alternating odd and even lines to maintain image quality while reducing bandwidth.  I don't understand why this would be a problem, because I'd expect the camera drivers to abstract this out, protecting the programmer.  But, the ReacTable guys know what they're talking about, so we'll avoid interlaced mode.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Official recommendation&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;For lowest latency and best performance we recommend firewire cameras from the top range, such as industrial cameras with a high framerate, resolution and sensor size. These cameras usually also come with high quality lenses.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Right, but we don't all have grant money and University budgets :-)  The ReacTable guys use an &lt;a href="http://www.alliedvisiontec.com/"&gt;AVT&lt;/a&gt; &lt;a href="http://www.alliedvisiontec.com/avt-products/cameras/guppy.html"&gt;Guppy&lt;/a&gt;.  I haven't asked a salesman for a quote yet, but I assume they are pretty pricey.&lt;br /&gt;&lt;br /&gt;UPDATE: An anonymous post on the reactivision forum (at sourceforge) says that the Guppy is about $1000.  That was in 2007&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;Cheaper firewire cameras, such as the unibrain fire-i also allow optional wide-angle lenses.&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://www.unibrain.com/"&gt;Unibrain&lt;/a&gt; is the best vendor I've found yet for this project.  They sell a "&lt;a href="http://www.unibrain.com/Products/VisionImg/Fire_i_BC.htm"&gt;firewire board camera&lt;/a&gt;" (a CCD camera on a PCB board) with either color or B/W CCD, and a mini-lens mount.  They also sell lenses without an IR-blocking coating, as I mentioned.  They are also affordable.  Mini-lenses are $30-50 and the camera is $150 (for B/W CCD) through 1394store.com (&lt;a href="http://www.1394store.com/eshop/product.asp?dept_id=55&amp;amp;pf_id=2050"&gt;link&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-3748049671641571980?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/3748049671641571980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=3748049671641571980' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/3748049671641571980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/3748049671641571980'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/9-camera-and-lighting.html' title='9. Camera and Lighting'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-2002890192995389007</id><published>2008-11-13T23:54:00.000-08:00</published><updated>2008-11-13T23:55:03.371-08:00</updated><title type='text'>8. ReacTable music</title><content type='html'>Actual music&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/KIDFuQCIvRU&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/KIDFuQCIvRU&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-2002890192995389007?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/2002890192995389007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=2002890192995389007' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/2002890192995389007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/2002890192995389007'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/8-reactable-music.html' title='8. ReacTable music'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-231569089274608740</id><published>2008-11-13T23:38:00.000-08:00</published><updated>2008-11-13T23:43:22.794-08:00</updated><title type='text'>7. Other uses for tangible tabletop interfaces</title><content type='html'>These people use their table to create fractals.  The music in the video does not come from their table, of course.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/XK-GNEvQb6Q&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/XK-GNEvQb6Q&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-231569089274608740?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/231569089274608740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=231569089274608740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/231569089274608740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/231569089274608740'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/7-other-uses-for-tangible-tabletop.html' title='7. Other uses for tangible tabletop interfaces'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-6209010193300380104</id><published>2008-11-13T23:01:00.000-08:00</published><updated>2008-11-13T23:29:08.510-08:00</updated><title type='text'>6. TuioDemo - A starting point</title><content type='html'>Martin Kaltenbrunner, of the &lt;a href="http://mtg.upf.edu/reactable/?team"&gt;ReacTable team&lt;/a&gt;, has written a TUIO client / demo in Java called, aptly, TuioDemo.  This has been my starting point so far.&lt;br /&gt;&lt;br /&gt;I've done some research (mostly playing around) with the &lt;a href="http://java.sun.com/products/java-media/sound/"&gt;Java Sound API&lt;/a&gt;, and it seems adequate for building a synthesizer (the most important requirement being that it is capable of handling &lt;a href="http://en.wikipedia.org/wiki/PCM"&gt;PCM-encoded audio&lt;/a&gt; composed on the fly)  See also: &lt;a href="http://www.jsresources.org/"&gt;jsresources.org&lt;/a&gt;, a site by &lt;a href="http://www.jsresources.org/contact/authors.html"&gt;two of the guys&lt;/a&gt; who wrote the Java Sound API.&lt;br /&gt;&lt;br /&gt;So, being satisfied so far with Java audio and Kaltenbrunner's TuioDemo, I will begin designing my own synthesizer with the concepts from TuioDemo as a starting point.&lt;br /&gt;&lt;br /&gt;Being a bit of a stickler for formal software engineering, I've created a class diagram of TuioDemo (&lt;a href="http://jaredbeck.com/pub/permanent/2008-11-14/TuioDemo_class_diagram.pdf"&gt;link&lt;/a&gt;, 300k PDF) to get me started.  It will be useful as a reference point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-6209010193300380104?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/6209010193300380104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=6209010193300380104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/6209010193300380104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/6209010193300380104'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/6-tuiodemo-starting-point.html' title='6. TuioDemo - A starting point'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-8406698720797074113</id><published>2008-11-13T12:17:00.000-08:00</published><updated>2008-11-13T12:37:06.427-08:00</updated><title type='text'>5. Project Status #1</title><content type='html'>&lt;span style="font-weight: bold;font-size:100%;" &gt;Software&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;I have printed off the fiducial markers, and I can wave them in front of my laptop's built-in camera.  ReacTIVision recognizes them and talks to my TUIO client.  (I am using the example client TUIO_JAVA.zip from the &lt;a href="http://mtg.upf.edu/reactable/?software"&gt;official software page&lt;/a&gt;) &lt;br /&gt;&lt;br /&gt;Using the Java Sound API (javax.sound.*) I've added some basic sound effects. &lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Adding a marker starts a sound looping&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Removing a marker stops the loop&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Rotating a marker changes the volume&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Hardware&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So far, I have my laptop and a round glass tabletop.  I need an external camera, a projector, and I need to build a stand for the tabletop.  I've done some research on the camera, and I'll put that into its own blog post.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-8406698720797074113?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/8406698720797074113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=8406698720797074113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/8406698720797074113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/8406698720797074113'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/5-project-status-1.html' title='5. Project Status #1'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-6267320543502654294</id><published>2008-11-11T23:21:00.000-08:00</published><updated>2008-11-11T23:49:57.788-08:00</updated><title type='text'>4. So, you want to build a ReacTable?</title><content type='html'>The great majority of the work has already been done for you, and yet the work that remains is daunting.&lt;br /&gt;&lt;br /&gt;As of November 2008, these things are free:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The &lt;a href="http://en.wikipedia.org/wiki/Computer_vision"&gt;computer vision&lt;/a&gt; library, &lt;a href="http://mtg.upf.edu/reactable/?software"&gt;ReacTIVision&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The protocol for communicating events, &lt;a href="http://mtg.upf.edu/reactable/?tuio"&gt;TUIO&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Sample TUIO-client code in many languages&lt;br /&gt;&lt;/li&gt;&lt;li&gt;All of the&lt;a href="http://mtg.upf.edu/reactable/?publications"&gt; research published by the ReacTable team&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;These things you must do yourself:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Research - You had better get a binder, because you need to research &lt;a href="http://en.wikipedia.org/wiki/Modular_synthesizer"&gt;modular synthesis&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Infrared_photography"&gt;infrared videography&lt;/a&gt;, TUIO, &lt;a href="http://en.wikipedia.org/wiki/PCM"&gt;PCM-encoded audio&lt;/a&gt;.  The official site is a good start, but I have yet to find a single comprehensive resource.  I hope to contribute to the body of knowledge with this blog.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Buy some hardware - A round glass tabletop, a camera (more to come on specifics), a projector&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Write the connection manager software - Basically, a TUIO client that listens for events and maintains a n-ary tree of synthesis objects&lt;/li&gt;&lt;li&gt;Write the synthesizer software - Given a tree from the connection manager, create sound&lt;/li&gt;&lt;li&gt;Write the graphics software - Given a tree from the connection manager, draw the graphics&lt;/li&gt;&lt;/ol&gt;If you can't write software, or don't want to, I recommend trying the MIDI route (see previous post)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-6267320543502654294?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/6267320543502654294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=6267320543502654294' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/6267320543502654294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/6267320543502654294'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/4-so-you-want-to-build-reactable.html' title='4. So, you want to build a ReacTable?'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-338195150691595641</id><published>2008-11-11T23:11:00.000-08:00</published><updated>2008-11-11T23:21:02.640-08:00</updated><title type='text'>3. I will not use MIDI</title><content type='html'>ReacTIVision can communicate events in MIDI or in TUIO.  I will be using TUIO.&lt;br /&gt;&lt;br /&gt;According to the &lt;a href="http://mtg.upf.edu/reactable/?software"&gt;software page on the official site&lt;/a&gt;:&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Keep in mind though that MIDI has less bandwidth and data resolution compared to Open Sound Contol, so the new MIDI feature is meant as an convenient alternative in some cases, but TUIO still will be the primary messaging layer. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;If you want to use MIDI, you could check this out:&lt;br /&gt;&lt;midi config="midi_demo.xml"&gt;&lt;/midi&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;A user at the reaktor forum posted this &lt;a href="http://www.native-instruments.com/forum/showpost.php?s=c71900a6921213d2bbb3ba21e10ae2e9&amp;amp;p=265833&amp;amp;postcount=19"&gt;brief tutorial&lt;/a&gt; on how to use reacTIVision in conjunction with commercial audio software such as reaktor.  &lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-338195150691595641?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/338195150691595641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=338195150691595641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/338195150691595641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/338195150691595641'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/3-i-will-not-use-midi.html' title='3. I will not use MIDI'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-4176010275471699422</id><published>2008-11-11T23:06:00.000-08:00</published><updated>2008-11-11T23:09:27.059-08:00</updated><title type='text'>2. Video Demo</title><content type='html'>Courtesy of Marcos Alonso, of the &lt;a href="http://mtg.upf.edu/reactable/?team"&gt;ReacTable team&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0h-RhyopUmc&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/0h-RhyopUmc&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-4176010275471699422?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/4176010275471699422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=4176010275471699422' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/4176010275471699422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/4176010275471699422'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/2-video-demo.html' title='2. Video Demo'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876651862903583662.post-516664917968347293</id><published>2008-11-11T21:39:00.000-08:00</published><updated>2008-12-08T19:24:24.745-08:00</updated><title type='text'>1. The ReacTable - Introduction</title><content type='html'>The &lt;a href="http://mtg.upf.edu/reactable/"&gt;ReacTable&lt;/a&gt; is a musical instrument.  Specifically, it is a multi-player digital &lt;a href="http://en.wikipedia.org/wiki/Modular_synthesizer"&gt;modular&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Synthesizer"&gt;synthesizer&lt;/a&gt; with a tangible table-top interface. A picture might help:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YBaRtSkOX5Y/SRpvWIYz9KI/AAAAAAAAAAM/TggzuUk6uPE/s1600-h/800px-Reactable_Multitouch.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 214px;" src="http://4.bp.blogspot.com/_YBaRtSkOX5Y/SRpvWIYz9KI/AAAAAAAAAAM/TggzuUk6uPE/s320/800px-Reactable_Multitouch.jpg" alt="" id="BLOGGER_PHOTO_ID_5267645140162573474" border="0" /&gt;&lt;/a&gt;The ReacTable&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;a href="http://creativecommons.org/licenses/by-sa/2.0/"&gt;Creative Commons Attribution ShareAlike 2.0 License&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt; Let's break that down:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Synthesizer"&gt;Synthesizer&lt;/a&gt; - An electronic instrument capable of producing a variety of sounds by generating and combining signals of different frequencies&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Modular_synthesizer"&gt;Modular Synthesizer&lt;/a&gt; - A synthesizer composed of interchangeable, easily re-arranged parts&lt;/li&gt;&lt;li&gt;Digital - The alternative to &lt;a href="http://en.wikipedia.org/wiki/Analog_signal"&gt;analog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Tangible table-top interface - To make music, you just move around blocks on a table top.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3876651862903583662-516664917968347293?l=building-a-reactable.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://building-a-reactable.blogspot.com/feeds/516664917968347293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3876651862903583662&amp;postID=516664917968347293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/516664917968347293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876651862903583662/posts/default/516664917968347293'/><link rel='alternate' type='text/html' href='http://building-a-reactable.blogspot.com/2008/11/1-reactable-introduction.html' title='1. The ReacTable - Introduction'/><author><name>Jared Beck</name><uri>http://www.blogger.com/profile/01031526222569288891</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://1.bp.blogspot.com/_YBaRtSkOX5Y/SUiZJZnZFbI/AAAAAAAAACQ/9YXUbBjdKY4/s1600-R/n517594182_9434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_YBaRtSkOX5Y/SRpvWIYz9KI/AAAAAAAAAAM/TggzuUk6uPE/s72-c/800px-Reactable_Multitouch.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
