<?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-19360784</id><updated>2012-01-13T11:15:16.853+01:00</updated><category term='scriptographer'/><category term='arduino'/><category term='design'/><category term='processing'/><category term='iphone'/><category term='misc.'/><category term='experiment'/><category term='tool'/><category term='openframeworks'/><category term='exhibition'/><title type='text'>kenfrederick</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kenfrederick.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-19360784.post-2948482715266468883</id><published>2011-12-23T18:27:00.012+01:00</published><updated>2012-01-02T21:16:15.017+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='openframeworks'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='experiment'/><title type='text'>Processing + Arduino. LightBrush</title><content type='html'>i've been working on this project off and on (a bit more off than on) since early &lt;!-- 8/22/90 6:27 --&gt;2009, and most recently i've given my self a deadline of wrapping it up by the end of 2011. from the looks of it, the conclusion however as it stands will be incomplete. i'm posting it here for posterity sake as well as in hope that maybe some of the successes and failures i've had may be of interest to others.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;the idea&lt;/b&gt;&lt;br /&gt;the crux of the project was to create light drawings in the air, but using light as a medium to recreate images, displayed on screen, in the air. a device with lights on it would somehow have x and y coordinates based on it's position in the air and correlate to x and y coordinates on the screen.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-E6SAYpapuaA/TvTFsZeep-I/AAAAAAAAATQ/5M1KnxvR5_k/s1600/LightBrush_0_2_4.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/-E6SAYpapuaA/TvTFsZeep-I/AAAAAAAAATQ/5M1KnxvR5_k/s1600/LightBrush_0_2_4.jpg" width=600&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;the beginning&lt;/b&gt;&lt;br /&gt;i whipped an easy pixel grabber program, which used a black &amp; white image and sent the location's pixel value (0 or 255) to a very crude prototype using one blue led. the single color led turns on or off based on the brightness of the pixel on screen. the biggest challenge was getting coordinates of the device in space. i ended up using a wii mote (via &lt;a href="http://en.wikipedia.org/wiki/Open_Sound_Control" target="new"&gt;OSC&lt;/a&gt;) and an IR led to tell the computer the x and y coordinates of the device.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-KUBP8hh3ha4/TvS8uR2HayI/AAAAAAAAAS4/IMOmk0fQT2I/s1600/DSC_3691.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-KUBP8hh3ha4/TvS8uR2HayI/AAAAAAAAAS4/IMOmk0fQT2I/s1600/DSC_3691.JPG" width=600&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-iGZ8V5yz_JE/TwIPIPb_8GI/AAAAAAAAAVI/LS9eSHn0j0Q/s1600/090829_LightBrush8-2.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/-iGZ8V5yz_JE/TwIPIPb_8GI/AAAAAAAAAVI/LS9eSHn0j0Q/s1600/090829_LightBrush8-2.jpg" width=600 border="0" alt=""id="BLOGGER_PHOTO_ID_5693129513207066722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-ob0ARySFsTs/TwIPHlzz2cI/AAAAAAAAAU8/CxdLDZxwJ4Y/s1600/090829_LightBrush8-8.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/-ob0ARySFsTs/TwIPHlzz2cI/AAAAAAAAAU8/CxdLDZxwJ4Y/s1600/090829_LightBrush8-8.jpg" width=600 border="0" alt=""id="BLOGGER_PHOTO_ID_5693129502032648642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;the initial tests with the prototype were promising but it was obvious i needed to tweak it (i.e. larger light source) in order to achieve the resolution i was hoping for. i knew i would need more LEDs and contemplated a stick or maybe an led matrix (multiples of either or a combination of the two). subtle &lt;a href="http://en.wikipedia.org/wiki/Aircraft_principal_axes" target="new"&gt;pitch and yaw&lt;/a&gt; movements of the "brush" caused unwanted distortion so i used plexi glass as a surface to press on and the images got better, but lacked the "magic" i was hoping for. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;everyone else&lt;/b&gt;&lt;br /&gt;then i put the whole project on hold as my wife and i uprooted and relocated to europe, and in the meantime the inevitable happened and others developed the same idea (&lt;a href="http://en.wikipedia.org/wiki/Zeitgeist" target="new"&gt;zeitgeist?&lt;/a&gt;). the first being by &lt;a href="http://berglondon.com/blog/2010/09/14/magic-ipad-light-painting/" target="new"&gt;berg&lt;/a&gt; for &lt;a href="http://www.dentsulondon.com/" target="new"&gt;dentsu london&lt;/a&gt; using an ipad to draw 3D type in the air.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/14958082?portrait=0&amp;amp;color=ffffff" width="600" height="337" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt; &lt;br /&gt;&lt;br /&gt;and i should also mention &lt;a href="http://www.elasticspace.com/films" target="new"&gt;timo arnall's&lt;/a&gt; other work with light painting.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/20412632?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=ffffff" width="600" height="337" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;although very close to my idea, no one had done it exactly as i pictured it in my head. there was still hope, yet i still was busy with other things and didn't have the time to invest in pursuing the project any further. by now it was near the end of 2010, when i stumbled across the &lt;a href="https://sites.google.com/site/mechatronicsguy/lightscythe" target="new"&gt;light scythe&lt;/a&gt;, a very elegant execution which uses a large stick clad with RGB led's to create stunning images in the air. *drat* exactly what i wanted. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/38462165@N05/5895809050/sizes/l/in/set-72157626943075067/" target="new"&gt;&lt;img src="http://farm7.staticflickr.com/6038/5895809050_1242475dfd_b.jpg" width=600 border=0&gt;&lt;/a&gt;&lt;br&gt;&lt;a href="https://sites.google.com/site/mechatronicsguy/lightscythe" target="new"&gt;light scythe&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;onwards and upwards&lt;/b&gt;&lt;br /&gt;i thought of just giving up and maybe i should have, but i decided to keep trudging on, because now i knew i wanted to create a more handheld version, which could be used untethered to the computer and maybe even together with other similar devices. which lead me to where i am now. &lt;br /&gt;&lt;br /&gt;i began a couple months ago by focusing on using an &lt;a href="http://www.komputer.de/zen/index.php?main_page=product_info&amp;cPath=24&amp;products_id=85" target="new"&gt;8x8 RGB matrix&lt;/a&gt; and a &lt;a href="http://www.komputer.de/zen/index.php?main_page=product_info&amp;cPath=22&amp;products_id=82" target="new"&gt;colorduino (shield)&lt;/a&gt;, in wanting to make it completely mobile i started by putting together an iphone app and interface using &lt;a href="http://openframeworks.cc/" target="new"&gt;openFrameworks&lt;/a&gt; and it was going well, i hit a couple of &lt;a href="http://stackoverflow.com/questions/7895719/uitableview-multiple-sections-with-gui-elements-uibutton-uiswitch-etc/7899923#7899923" target="new"&gt;snags&lt;/a&gt; programming in objC. those problems aside, i had an app that would work theoretically, but in practice did not, because (so far as i know) &lt;a href="https://developer.apple.com/library/ios/#featuredarticles/ExternalAccessoryPT/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009502" target="new"&gt;communicating with external hardware devices from an iphone&lt;/a&gt; requires additional licenses and permissions from apple. so in my quest to find an alternative method of communicating to the arduino from an iphone, i found arms22's &lt;a href="http://code.google.com/p/arms22/wiki/SoftModemBreakoutBoard" target="new"&gt;soft modem&lt;/a&gt;, i've included the parts needed to build one for yourself, but i quickly found out that it's baud rate of 1225bps would be way too low for sending 64*3 bytes (64 leds, and 3 bytes per color) at a speed that would be responsive enough for light drawing.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-BZWhRQ1zTWU/TvTKOLRNLZI/AAAAAAAAATc/YAR6foioaBI/s1600/111105_DSC_3677_F_sm.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/-BZWhRQ1zTWU/TvTKOLRNLZI/AAAAAAAAATc/YAR6foioaBI/s1600/111105_DSC_3677_F_sm.jpg" width=600&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;soft modem hardware&lt;/b&gt;&lt;br /&gt;2 &lt;a href="http://www.conrad.de/ce/de/product/445626/ELKO-RAD-105C-047F-160V-5X11-RM2/SHOP_AREA_17434&amp;promotionareaSearchDetail=005" target="new"&gt;0.47µf electrolytic capacitor (blue can)&lt;/a&gt;&lt;br /&gt;1 &lt;a href="http://www.conrad.de/ce/de/product/451711/KERAMIK-KONDENSATOR-47-PF/SHOP_AREA_17436&amp;promotionareaSearchDetail=005" target="new"&gt;47pF tantalum capacitor (yellow)&lt;/a&gt;&lt;br /&gt;2 100k resistor&lt;br /&gt;3 10k resistor&lt;br /&gt;1 4.7k resistor&lt;br /&gt;1 &lt;a href="https://www.buerklin.com/default.asp?event=ShowArtikel(39F1200)&amp;l=d&amp;jump=ArtNr_39F1200&amp;ajaxLoad=true" target="new"&gt;3.5mm 4 pole phono input&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;that was a hard pill to swallow, and i was still hopeful that i could some how pull of a completely mobile computer-less version of my light brush. i had created an overly complicated series of sending a wifi signal from the phone to my laptop (via OSC) and then converting the OSC signal to serial and sending it to the arduino. luckily &lt;a href="http://www.multiblah.com/" target="new"&gt;kevin cannon&lt;/a&gt; snapped me back to reality, and suggested that if i want to go mobile that interfacing with an &lt;a href="http://developer.android.com/guide/topics/usb/adk.html" target="new"&gt;android device&lt;/a&gt; would be much easier. if you've read this far, you know the dream of making what i envision is fading, but my stubborn determination kept me moving forward.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;the result&lt;/b&gt;&lt;br /&gt;abandoning all hopes of using the iphone, i switched to &lt;a href="http://processing.org" target="new"&gt;processing&lt;/a&gt; since i can prototype much quicker with it. and in the switch i abandoned the wiimote, as communicating with it via OSC was slow and cumbersome. once again &lt;a href="http://www.multiblah.com/" target="new"&gt;kevin&lt;/a&gt; suggested just using the webcam and an IR filter. since apurely computer-less operation is on ice, i created a custom case which houses the arduino, colorduino (shield), 8x8 led matrix and 4 IR leds. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-5h8hHmGMTS4/TvTW_ZagFaI/AAAAAAAAATo/9hC2wTzbDIs/s1600/111113_DSC_3707_sm.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/-5h8hHmGMTS4/TvTW_ZagFaI/AAAAAAAAATo/9hC2wTzbDIs/s1600/111113_DSC_3707_sm.jpg" width=600&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;light brush hardware&lt;/b&gt;&lt;br /&gt;4 IR Leds&lt;br /&gt;&lt;a href="http://www.komputer.de/zen/index.php?main_page=product_info&amp;cPath=24&amp;products_id=85" target="new"&gt;8x8 rgb matrix&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.arduino.cc/" target="new"&gt;arduino&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.komputer.de/zen/index.php?main_page=product_info&amp;cPath=22&amp;products_id=82" target="new"&gt;colorduino (shield)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;after hours of coding, i finally had a desktop application that allowed me test my light brush. i can send 8 bits of RGB data at once (i.e. an image or parts of an image) and track the device in real time. i recruited my friend ben to help me test the hardware and software. we set up everything and set about drawing pictures in the air...&lt;br /&gt;&lt;br /&gt;&lt;!-- add video of interface and operation --&gt;&lt;br /&gt;&lt;br /&gt;...but it didn't work at all, like i/we had thought/hoped it would. as we tried different settings and code optimizations, it became obvious why it wouldn't work. we learned you can only draw by moving the device in one direction (which is how the light scythe and others work) and also, the 8x8 led matrix at 60mm (2.3in) is most likely too small. below you can see the results of us trying to draw a simple "2" and that it didn't work. although my experiment with light drawing has ended in failure, i've upload large chunks of code that i've written for this, such as sending massive amounts of data over serial to arduino and a tracking class, maybe somebody out there will find them useful.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-wk_N3FGOJSA/TwIHdHCRc9I/AAAAAAAAAUw/IhzCu4m1obs/s1600/two.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/-wk_N3FGOJSA/TwIHdHCRc9I/AAAAAAAAAUw/IhzCu4m1obs/s400/two.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5693121075635909586" /&gt;&lt;/a&gt;&lt;br&gt;i failed to draw this "2" in the air, and learned that drawing images works better when the image size corresponds with the matrix size&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-y8DXJ8I_aw8/TvTaerwrAEI/AAAAAAAAAUk/_ywaqwCeXKg/s1600/111219_IMG_8049_sm.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/-y8DXJ8I_aw8/TvTaerwrAEI/AAAAAAAAAUk/_ywaqwCeXKg/s1600/111219_IMG_8049_sm.jpg" width=600&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-s-99BZNLR84/TvTad-LsICI/AAAAAAAAAUQ/irdlXoxQaKI/s1600/IMG_3739_sm.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/-s-99BZNLR84/TvTad-LsICI/AAAAAAAAAUQ/irdlXoxQaKI/s1600/IMG_3739_sm.jpg" width=600&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-57pSkolhH30/TvTadYdRbmI/AAAAAAAAAUA/NiSRh1SpJCs/s1600/IMG_3741_sm.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/-57pSkolhH30/TvTadYdRbmI/AAAAAAAAAUA/NiSRh1SpJCs/s1600/IMG_3741_sm.jpg" width=600&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-vXcoWdUu1oc/TvTadWPvpPI/AAAAAAAAAT0/erow2lns1vI/s1600/IMG_3743_sm.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/-vXcoWdUu1oc/TvTadWPvpPI/AAAAAAAAAT0/erow2lns1vI/s1600/IMG_3743_sm.jpg" width=600&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-a3ca-sdidaY/TvTaebPcVEI/AAAAAAAAAUY/Ma6oznl5c8U/s1600/111219_IMG_8083_sm.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/-a3ca-sdidaY/TvTaebPcVEI/AAAAAAAAAUY/Ma6oznl5c8U/s1600/111219_IMG_8083_sm.jpg" width=600&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;as with previous projects, i'm really happy with what i've learned but i'm disappointed that i wasn't able to get it to work as i had hoped. maybe i'll let it sit for another two years and come back to it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;code&lt;/b&gt;&lt;br /&gt;this is the class i created for tracking blobs (i.e. IR leds) and averaging their coordinates for smooth operation, (i wrapped it in a thread so that the overall frame rate of the main app isn't affected)&lt;br /&gt;&lt;br /&gt;&lt;div class="code-box"&gt;/*&lt;br /&gt; *  OpenCVTracker.pde&lt;br /&gt; *&lt;br /&gt; *  Ken Frederick&lt;br /&gt; *  ken.frederick@gmx.de&lt;br /&gt; *&lt;br /&gt; *  http://cargocollective.com/kenfrederick/&lt;br /&gt; *  http://kenfrederick.blogspot.com/&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;// libraries&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;import codeanticode.gsvideo.*;&lt;br /&gt;import hypermedia.video.*;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class OpenCVTracker extends Thread {&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  // properties&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  private PApplet papplet;&lt;br /&gt;  private PGraphics imageBuff;&lt;br /&gt;  boolean bRunning = false;&lt;br /&gt;&lt;br /&gt;  // video&lt;br /&gt;  private GSCapture video;&lt;br /&gt;&lt;br /&gt;  // openCV&lt;br /&gt;  private OpenCV opencv;&lt;br /&gt;  private Blob[] blobs;&lt;br /&gt;  private int cvBrightness;&lt;br /&gt;  private int cvContrast;&lt;br /&gt;  private int cvThresh;&lt;br /&gt;&lt;br /&gt;  // points&lt;br /&gt;  float avgWeight = 0.5;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  // constructor&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public OpenCVTracker(PApplet _papplet, int _width, int _height) {&lt;br /&gt;    papplet = _papplet;&lt;br /&gt;&lt;br /&gt;    imageBuff = createGraphics(_width,_height, P2D);&lt;br /&gt;&lt;br /&gt;    // setup video&lt;br /&gt;    video = new GSCapture(_papplet, _width, _height);&lt;br /&gt;    video.play();&lt;br /&gt;&lt;br /&gt;    // setup openCV&lt;br /&gt;    opencv = new OpenCV(_papplet);&lt;br /&gt;    opencv.allocate(_width, _height);&lt;br /&gt;    setBrightness(0);&lt;br /&gt;    setContrast(0);&lt;br /&gt;    setThreshold(0);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  // methods&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void start() {&lt;br /&gt;    bRunning = true;&lt;br /&gt;    super.start();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void run() {&lt;br /&gt;    while(bRunning) {&lt;br /&gt;      update();&lt;br /&gt;      &lt;br /&gt;      try {&lt;br /&gt;      } catch (Exception e) {&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void update() {&lt;br /&gt;    // open cv&lt;br /&gt;    opencv.copy(video);&lt;br /&gt;    opencv.convert(GRAY);&lt;br /&gt;    opencv.brightness(cvBrightness);&lt;br /&gt;    opencv.contrast(cvContrast);&lt;br /&gt;    opencv.threshold(cvThresh);&lt;br /&gt;&lt;br /&gt;    blobs = opencv.blobs(10, video.width*video.height/2, 4, false, 1); //OpenCV.MAX_VERTICES*4 );&lt;br /&gt;&lt;br /&gt;    // video&lt;br /&gt;     if (video.available()) {&lt;br /&gt;       video.read();&lt;br /&gt;       //video.loadPixels();&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void draw(int _x, int _y, boolean bVideo) {&lt;br /&gt;    draw(_x,_y, video.width,video.height, bVideo);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void draw(int _x, int _y, int _width, int _height, boolean bVideo) {&lt;br /&gt;    pushMatrix();&lt;br /&gt;    translate(_x,_y);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    PVector videoSize = new PVector(video.width, video.height, 0);&lt;br /&gt;    PVector avg = getAvg().get();&lt;br /&gt;    avg.mult(videoSize);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    imageBuff.beginDraw();&lt;br /&gt;    imageBuff.background(0);&lt;br /&gt;    imageBuff.noFill();&lt;br /&gt;&lt;br /&gt;    if(bVideo) {&lt;br /&gt;      imageBuff.image(video, 0,0, video.width,video.height);&lt;br /&gt;    } else {&lt;br /&gt;      imageBuff.image(opencv.image(), 0,0, video.width,video.height);&lt;br /&gt;      //imageBuff.image(opencv.image(), 0,0+video.height, video.width,video.height);&lt;br /&gt;      //imageBuff.image(opencv.image(), 0+video.width,0, video.width,video.height);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // draw blobs&lt;br /&gt;    imageBuff.stroke(255,0,255, 255*0.6);&lt;br /&gt;    imageBuff.beginShape();&lt;br /&gt;    for(int i=0; i&amp;lt;blobs.length; i++) {&lt;br /&gt;      for(int j=0; j&amp;lt;blobs[i].points.length; j++ ) {&lt;br /&gt;        //imageBuff.ellipse(blobs[i].points[j].x, blobs[i].points[j].y, 9,9);&lt;br /&gt;        imageBuff.line(blobs[i].points[j].x-4.5,blobs[i].points[j].y, blobs[i].points[j].x+4.5,blobs[i].points[j].y);&lt;br /&gt;        imageBuff.line(blobs[i].points[j].x,blobs[i].points[j].y-4.5, blobs[i].points[j].x,blobs[i].points[j].y+4.5);&lt;br /&gt;        imageBuff.vertex(blobs[i].points[j].x, blobs[i].points[j].y);&lt;br /&gt;      }&lt;br /&gt;      imageBuff.vertex(avg.x,avg.y);&lt;br /&gt;    }&lt;br /&gt;    imageBuff.endShape();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // averaged blob point&lt;br /&gt;    //imageBuff.fill(0,255,255, 255*0.6);&lt;br /&gt;    //imageBuff.ellipse(getAvg().x,getAvg().y, 9,9);&lt;br /&gt;&lt;br /&gt;    imageBuff.strokeWeight(3);&lt;br /&gt;    imageBuff.stroke(0,255,255, 255*0.7);&lt;br /&gt;    imageBuff.line(avg.x-4.5,avg.y, avg.x+4.5,avg.y);&lt;br /&gt;    imageBuff.line(avg.x,avg.y-4.5, avg.x,avg.y+4.5);&lt;br /&gt;    imageBuff.ellipse(avg.x,avg.y, 12,12);&lt;br /&gt;    imageBuff.endDraw();&lt;br /&gt;&lt;br /&gt;    image(imageBuff, 0,0, _width,_height);&lt;br /&gt;&lt;br /&gt;    popMatrix();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  /**&lt;br /&gt;   *  filter the current result using a weighted average filter:&lt;br /&gt;   *  http://web.archive.org/web/20070224180400/http://www.tigoe.net/pcomp/code/archives/arduino/000710.shtml&lt;br /&gt;   */&lt;br /&gt;  private float filter(float rawValue, float weight, float lastValue) {&lt;br /&gt;    float fValue = 0.0f;&lt;br /&gt;    float x = weight; // is a value between 0 and 1&lt;br /&gt;    //int x = 0;&lt;br /&gt;    //x = weight/102; // convert the weight number to a value between 0 and 1:&lt;br /&gt;    fValue = (x * rawValue + (10-x)*lastValue)/10; // run the filter:&lt;br /&gt;&lt;br /&gt;    return fValue;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void quit() {&lt;br /&gt;    bRunning = false;&lt;br /&gt;    opencv.stop();&lt;br /&gt;    papplet.stop();&lt;br /&gt;    interrupt();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;//  public void stop() {&lt;br /&gt;//    quit();&lt;br /&gt;//    opencv.stop();&lt;br /&gt;//    papplet.stop();&lt;br /&gt;//  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  // sets&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void setBrightness(int val) {&lt;br /&gt;    cvBrightness = val;&lt;br /&gt;  }&lt;br /&gt;  public void setContrast(int val) {&lt;br /&gt;    cvContrast = val;&lt;br /&gt;  }&lt;br /&gt;  public void setThreshold(int val) {&lt;br /&gt;    cvThresh = val;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void setAvgWeight(float val) {&lt;br /&gt;    avgWeight = val;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  // gets&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public boolean getRunning() {&lt;br /&gt;    return bRunning;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public PVector getCoord(int num) {&lt;br /&gt;    PVector v = new PVector();&lt;br /&gt;    if( blobs.length != 0) {&lt;br /&gt;      int c = constrain(num, 0,blobs.length);&lt;br /&gt;      v.set( norm(blobs[c].points[0].x, 0,video.width), norm(blobs[c].points[0].y, 0,video.height), 0);&lt;br /&gt;    }&lt;br /&gt;    return v;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  PVector pv = new PVector();&lt;br /&gt;  public PVector getAvg() {&lt;br /&gt;    PVector v = new PVector();&lt;br /&gt;    int count = 0;&lt;br /&gt;    for(int i=0; i&amp;lt;blobs.length; i++) {&lt;br /&gt;      v.x += getCoord(i).x;&lt;br /&gt;      v.y += getCoord(i).y;&lt;br /&gt;      v.z += getCoord(i).z;&lt;br /&gt;      count++;&lt;br /&gt;    }&lt;br /&gt;    v.x /= count;&lt;br /&gt;    v.y /= count;&lt;br /&gt;    v.z /= count;&lt;br /&gt;&lt;br /&gt;    v.x = filter(v.x, avgWeight, pv.x);&lt;br /&gt;    v.y = filter(v.y, avgWeight, pv.y);&lt;br /&gt;    v.z = filter(v.z, avgWeight, pv.z);&lt;br /&gt;&lt;br /&gt;    pv = v.get();&lt;br /&gt;&lt;br /&gt;    return v;&lt;br /&gt;  }&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;here's the class i wrote for sending an image via serial to arduino (also wrapped in a thread)&lt;br /&gt;&lt;br /&gt;&lt;div class="code-box"&gt;/**&lt;br /&gt; *  SerialPixelSender.pde&lt;br /&gt; *&lt;br /&gt; *  Ken Frederick&lt;br /&gt; *  ken.frederick@gmx.de&lt;br /&gt; *&lt;br /&gt; *  http://cargocollective.com/kenfrederick/&lt;br /&gt; *  http://kenfrederick.blogspot.com/&lt;br /&gt; *&lt;br /&gt; *  threaded code for sending data from processing to arduino&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;// libraries&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;import processing.serial.*;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;public class SerialPixelSender extends Thread {&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  // constants&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  private int ARDUINO_BAUD_RATE        = 115200; // must be exactly the same in the arduino sketch&lt;br /&gt;  private final int ARDUINO_TIMEOUT    = 0;      // milliseconds&lt;br /&gt;  &lt;br /&gt;  private final char START_BYTE        = 42;     //  42 = * &lt;br /&gt;  private final char DELIMITER         = 44;     //  44 = ,  &lt;br /&gt;  private final char END_BYTE          = 35;     //  35 = # &lt;br /&gt;  private final char MODE_BYTE         = 63;     //  32 = ? &lt;br /&gt;  &lt;br /&gt;  private final char DRAW_BYTE         = 124;    //  124 = | &lt;br /&gt;  private final char SEND_BYTE         = 95;     //  95 = _ &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  // properties&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  // application&lt;br /&gt;  private PApplet papplet;&lt;br /&gt;  private boolean bMode = false;&lt;br /&gt;  private boolean bRunning = false;&lt;br /&gt;  private boolean bSendMessage = false;&lt;br /&gt;  &lt;br /&gt;  // serial&lt;br /&gt;  private Serial arduino;&lt;br /&gt;  private boolean bConnected = false;&lt;br /&gt;  &lt;br /&gt;  // image&lt;br /&gt;  private PImage src;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  // constructor&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public SerialPixelSender() {&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public SerialPixelSender(PApplet _papplet) {&lt;br /&gt;    // application&lt;br /&gt;    papplet = _papplet;&lt;br /&gt;&lt;br /&gt;    // serial&lt;br /&gt;    println( Serial.list() );&lt;br /&gt;    String portName = Serial.list()[0];&lt;br /&gt;&lt;br /&gt;    arduino = new Serial(papplet, portName, ARDUINO_BAUD_RATE);&lt;br /&gt;    arduino.bufferUntil( END_BYTE ); // lf == line feed, ASCII 10; the line ending from arduino&lt;br /&gt;    &lt;br /&gt;    // image&lt;br /&gt;    //PImage src = new PImage(8,8, RGB);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public SerialPixelSender(PApplet _papplet, int _ARDUINO_BAUD_RATE) {&lt;br /&gt;    // application&lt;br /&gt;    papplet = _papplet;&lt;br /&gt;&lt;br /&gt;    // serial&lt;br /&gt;    println( Serial.list() );&lt;br /&gt;    String portName = Serial.list()[0];&lt;br /&gt;&lt;br /&gt;    ARDUINO_BAUD_RATE = _ARDUINO_BAUD_RATE;&lt;br /&gt;    arduino = new Serial(papplet, portName, ARDUINO_BAUD_RATE);&lt;br /&gt;    arduino.bufferUntil( END_BYTE ); // lf == line feed, ASCII 10; the line ending from arduino&lt;br /&gt;&lt;br /&gt;    // image&lt;br /&gt;    //PImage src = new PImage(8,8, RGB);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  // methods&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void start() {&lt;br /&gt;    bRunning = true;&lt;br /&gt;    super.start();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void run() {&lt;br /&gt;    while(bRunning) {&lt;br /&gt;      update();&lt;br /&gt;      &lt;br /&gt;      try {&lt;br /&gt;        //sleep( (long)(ARDUINO_TIMEOUT) );&lt;br /&gt;      } catch (Exception e) {&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void update() {&lt;br /&gt;    if(bSendMessage) {&lt;br /&gt;      sendImage(src);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  private void sendImage(PImage _src) {&lt;br /&gt;    toggleDraw();&lt;br /&gt;  &lt;br /&gt;    try {&lt;br /&gt;    //img.resize(8,8);&lt;br /&gt;      PImage img = new PImage(8,8, RGB);&lt;br /&gt;      if(_src.width &amp;gt; 7 || _src.height &amp;gt; 7) {&lt;br /&gt;        img = setImage(_src);&lt;br /&gt;        /*&lt;br /&gt;        img.copy(_src, 0,0,_src.width,_src.height, 0,0,8,8);&lt;br /&gt;        img.loadPixels();&lt;br /&gt;        */&lt;br /&gt;      } else {&lt;br /&gt;        img = _src;&lt;br /&gt;      }&lt;br /&gt;  &lt;br /&gt;      for(int index=0; index&amp;lt;img.pixels.length; index++) {&lt;br /&gt;        int col = img.pixels[index];&lt;br /&gt;        int r   = (int) ((col &amp;gt;&amp;gt; 16) &amp;amp; 0xFF);&lt;br /&gt;        int g   = (int) ((col &amp;gt;&amp;gt; 8) &amp;amp; 0xFF);&lt;br /&gt;        int b   = (int) (col &amp;amp; 0xFF);&lt;br /&gt;        sendRGB(r,g,b, index);&lt;br /&gt;      }&lt;br /&gt;    &lt;br /&gt;    } catch(Exception e) {&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    toggleDraw();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  private void sendRGB(int R, int G, int B, int index) {&lt;br /&gt;    arduino.write( START_BYTE );&lt;br /&gt;  &lt;br /&gt;    //R&lt;br /&gt;    arduino.write(R);&lt;br /&gt;    arduino.write( DELIMITER );  &lt;br /&gt;  &lt;br /&gt;    //G&lt;br /&gt;    arduino.write(G);&lt;br /&gt;    arduino.write( DELIMITER );  &lt;br /&gt;  &lt;br /&gt;    //B&lt;br /&gt;    arduino.write(B);&lt;br /&gt;    arduino.write( DELIMITER );  &lt;br /&gt;  &lt;br /&gt;    //INDEX&lt;br /&gt;    arduino.write( index );&lt;br /&gt;  &lt;br /&gt;    arduino.write( END_BYTE );  &lt;br /&gt;    arduino.clear();        // dumps buffer before asking for next data point&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  private void toggleDraw() {&lt;br /&gt;    arduino.write( START_BYTE );&lt;br /&gt;    arduino.write( DRAW_BYTE );  &lt;br /&gt;    arduino.write( END_BYTE );  &lt;br /&gt;    arduino.clear();        // dumps buffer before asking for next data point&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  private void toggleMode() {&lt;br /&gt;    arduino.write( START_BYTE );&lt;br /&gt;    arduino.write( MODE_BYTE );  &lt;br /&gt;    arduino.write( END_BYTE );  &lt;br /&gt;    arduino.clear();        // dumps buffer before asking for next data point&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void quit() {&lt;br /&gt;    bRunning = false;&lt;br /&gt;    interrupt();&lt;br /&gt;    arduino.clear();&lt;br /&gt;    arduino.stop();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  // sets&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void send() {&lt;br /&gt;    bSendMessage = true;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public void set(int[] colors, int colorsNum) {&lt;br /&gt;    PImage img = new PImage(8,8, RGB);&lt;br /&gt;    //img.loadPixels();&lt;br /&gt;    for(int i=0; i&amp;lt;colors.length; i++) {&lt;br /&gt;      img.pixels[i] = colors[i];&lt;br /&gt;    }&lt;br /&gt;    setImage(img);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public PImage setImage(PImage _src) {&lt;br /&gt;    src = _src;&lt;br /&gt;&lt;br /&gt;    PImage temp = new PImage(8,8, RGB);&lt;br /&gt;    temp.copy(src, 0,0,src.width,src.height, 0,0,8,8);&lt;br /&gt;    temp.loadPixels();&lt;br /&gt;&lt;br /&gt;    return src;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  // gets&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  public boolean getRunning() {&lt;br /&gt;    return bRunning;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  PImage getImage() {&lt;br /&gt;    return src;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;/div&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;this is the corresponding code for the arudino (using a colorduino) which also needs my modified version of the &lt;a href="https://github.com/frederickk/Colorduino" target="new"&gt;colorduino library&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code-box"&gt;/**&lt;br /&gt; *  LightBrushColorduino receiver 1.0 &lt;br /&gt; *&lt;br /&gt; *  Ken Frederick&lt;br /&gt; *  ken.frederick@gmx.de&lt;br /&gt; *&lt;br /&gt; *  http://cargocollective.com/kenfrederick/&lt;br /&gt; *  http://kenfrederick.blogspot.com/&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;// includes&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;#include &amp;lt;Colorduino.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;// constants&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;/**&lt;br /&gt; *  these must match what is being sent&lt;br /&gt; *  from the host app&lt;br /&gt; */&lt;br /&gt;#define ARDUINO_BAUD_RATE  115200 // must be exactly the same in the arduino sketch&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// data packet constants&lt;br /&gt;#define BUFFER_SIZE        64    // 8*8&lt;br /&gt;&lt;br /&gt;#define START_BYTE         42    // 42 = *&lt;br /&gt;#define DELIMITER          44    // 44 = ,&lt;br /&gt;#define END_BYTE           35    // 35 = #&lt;br /&gt;#define MODE_BYTE          63    // 32 = ?&lt;br /&gt;&lt;br /&gt;#define DRAW_BYTE          124   // 124 = | &lt;br /&gt;#define SEND_BYTE          95    // 95 = _&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;// properties&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;//int bufferPacket[BUFFER_SIZE][5];&lt;br /&gt;int bufferPacket[BUFFER_SIZE][3];&lt;br /&gt;&lt;br /&gt;unsigned char red, green, blue;&lt;br /&gt;int pos, index;&lt;br /&gt;&lt;br /&gt;bool bDraw = false;&lt;br /&gt;bool bMode = true;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;// methods&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;void setup() {&lt;br /&gt;  // serial&lt;br /&gt;  Serial.begin(ARDUINO_BAUD_RATE);&lt;br /&gt;&lt;br /&gt;  red = green = blue = 0;&lt;br /&gt;  pos = 0;&lt;br /&gt;  index = 0;&lt;br /&gt;&lt;br /&gt;  // colorduino&lt;br /&gt;  Colorduino.Init();&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   *  compensate for relative intensity differences in R/G/B brightness&lt;br /&gt;   *  array of 6-bit base values for RGB (0~63)&lt;br /&gt;   *  whiteBalVal[0] = red&lt;br /&gt;   *  whiteBalVal[1] = green&lt;br /&gt;   *  whiteBalVal[2] = blue&lt;br /&gt;   */&lt;br /&gt;  unsigned char whiteBalVal[3] = { 10,25,25 };&lt;br /&gt;  Colorduino.SetWhiteBal(whiteBalVal);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;void update() {&lt;br /&gt;  while (Serial.available()) {&lt;br /&gt;    byte serialBuffer = Serial.read();&lt;br /&gt;  &lt;br /&gt;    switch(serialBuffer) {&lt;br /&gt;      case START_BYTE:&lt;br /&gt;        pos = 0;&lt;br /&gt;        &lt;br /&gt;        //Serial.flush();&lt;br /&gt;        continue;&lt;br /&gt;      break;&lt;br /&gt;&lt;br /&gt;      case DELIMITER:&lt;br /&gt;        pos++;&lt;br /&gt;      break;&lt;br /&gt;      &lt;br /&gt;      case DRAW_BYTE:&lt;br /&gt;        bDraw = !bDraw;&lt;br /&gt;        //continue;&lt;br /&gt;      break;&lt;br /&gt;&lt;br /&gt;      case MODE_BYTE:&lt;br /&gt;        bMode = !bMode;&lt;br /&gt;        //continue;&lt;br /&gt;      break;&lt;br /&gt;&lt;br /&gt;      case END_BYTE:&lt;br /&gt;        //Serial.print(SEND_BYTE);&lt;br /&gt;        Serial.flush();&lt;br /&gt;        //continue;&lt;br /&gt;      break;&lt;br /&gt;      &lt;br /&gt;    } // end switch serialBuffer&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;    /**&lt;br /&gt;     *  how many values are we sending at once?&lt;br /&gt;     *  switch between to load the proper variables&lt;br /&gt;     */&lt;br /&gt;    switch(pos) {&lt;br /&gt;      case 0:&lt;br /&gt;        red = serialBuffer;&lt;br /&gt;        break;&lt;br /&gt;      case 1:&lt;br /&gt;        green = serialBuffer;&lt;br /&gt;        break;&lt;br /&gt;      case 2:&lt;br /&gt;        blue = serialBuffer;&lt;br /&gt;        break;&lt;br /&gt;      case 3:&lt;br /&gt;        index = serialBuffer;&lt;br /&gt;        &lt;br /&gt;        // push to bufferPacker&lt;br /&gt;        bufferPacket[index][0] = red;&lt;br /&gt;        bufferPacket[index][1] = green;&lt;br /&gt;        bufferPacket[index][2] = blue;&lt;br /&gt;&lt;br /&gt;        /*&lt;br /&gt;        unsigned int x = index / ColorduinoScreenWidth;&lt;br /&gt;        unsigned int y = index % ColorduinoScreenHeight;&lt;br /&gt;        bufferPacket[index][3] = x;&lt;br /&gt;        bufferPacket[index][4] = y;&lt;br /&gt;        */&lt;br /&gt;&lt;br /&gt;        break;&lt;br /&gt;    }  &lt;br /&gt;  &lt;br /&gt;  } // end while&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;void loop() {&lt;br /&gt;  update();&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * process color&lt;br /&gt;   */&lt;br /&gt;  if(bDraw) {&lt;br /&gt;    if(bMode) {&lt;br /&gt;      ColorFill(bufferPacket[0][0], bufferPacket[0][1], bufferPacket[0][2]);    &lt;br /&gt;    } else if(!bMode) {&lt;br /&gt;      ColorFrame(bufferPacket);&lt;br /&gt;      /*&lt;br /&gt;      for(int i=0; i&amp;lt;BUFFER_SIZE; i++) {&lt;br /&gt;        ColorPoint(bufferPacket[i][0], bufferPacket[i][1], bufferPacket[i][2], i);&lt;br /&gt;      }&lt;br /&gt;      */&lt;br /&gt;    } &lt;br /&gt;  } &lt;br /&gt;&lt;br /&gt;  Colorduino.FlipPage();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;void ColorFrame(int buffer[BUFFER_SIZE][3]) {&lt;br /&gt;  ColorRGB *p = Colorduino.curWriteFrame;&lt;br /&gt;  int pindex = 0;&lt;br /&gt;  for(unsigned char y=0; y&amp;lt;ColorduinoScreenWidth; y++) {&lt;br /&gt;    for(unsigned char x=0; x&amp;lt;ColorduinoScreenHeight; x++) {&lt;br /&gt;      //      p-&amp;gt;r = bufferPacket[pindex][0];&lt;br /&gt;      //      p-&amp;gt;g = bufferPacket[pindex][1];&lt;br /&gt;      //      p-&amp;gt;b = bufferPacket[pindex][2];&lt;br /&gt;      p-&amp;gt;r = buffer[pindex][0];&lt;br /&gt;      p-&amp;gt;g = buffer[pindex][1];&lt;br /&gt;      p-&amp;gt;b = buffer[pindex][2];&lt;br /&gt;      &lt;br /&gt;      pindex++;&lt;br /&gt;      p++;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;void ColorPoint(unsigned char R,unsigned char G,unsigned char B, unsigned int _index) {&lt;br /&gt;  ColorRGB *p = Colorduino.curWriteFrame;&lt;br /&gt;  p[index].r = R;&lt;br /&gt;  p[index].g = G;&lt;br /&gt;  p[index].b = B;&lt;br /&gt;&lt;br /&gt;  //Colorduino.FlipPage();&lt;br /&gt;}&lt;br /&gt;void ColorPoint(unsigned int x, unsigned int y, unsigned char R,unsigned char G,unsigned char B) {&lt;br /&gt;  ColorRGB *p = Colorduino.GetPixel(x,y);&lt;br /&gt;  p-&amp;gt;r = R;&lt;br /&gt;  p-&amp;gt;g = G;&lt;br /&gt;  p-&amp;gt;b = B;&lt;br /&gt;&lt;br /&gt;  //Colorduino.SetPixel(x,y, R,G,B);&lt;br /&gt;  //Colorduino.FlipPage();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;void ColorFill(unsigned char R,unsigned char G,unsigned char B) {&lt;br /&gt;  ColorRGB *p = Colorduino.GetPixel(0,0);&lt;br /&gt;  for(unsigned char y=0; y&amp;lt;ColorduinoScreenWidth; y++) {&lt;br /&gt;    for(unsigned char x=0; x&amp;lt;ColorduinoScreenHeight; x++) {&lt;br /&gt;      p-&amp;gt;r = R;&lt;br /&gt;      p-&amp;gt;g = G;&lt;br /&gt;      p-&amp;gt;b = B;&lt;br /&gt;      p++;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //Colorduino.FlipPage();&lt;br /&gt;}&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-2948482715266468883?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/08/lightbrush.html' title='Processing + Arduino. LightBrush'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/2948482715266468883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/2948482715266468883'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/08/lightbrush.html' title='Processing + Arduino. LightBrush'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-E6SAYpapuaA/TvTFsZeep-I/AAAAAAAAATQ/5M1KnxvR5_k/s72-c/LightBrush_0_2_4.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-6349308849718067739</id><published>2011-08-08T09:34:00.013+02:00</published><updated>2011-08-08T15:46:29.595+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Drop Processing</title><content type='html'>Drop Processing is an app i put together a while ago for quickly batch processing images (using adobe photoshop). often when using images i would need them to be all cmyk or all rgb and constantly re-doing the same "batch processing" actions in photoshop or having to create a multitude of drag and drop applets.&lt;br /&gt;&lt;br /&gt;Drop Processing utilizes applescript automation in order to process images. it's meant to be used as a drag-n-drop app by selecting a group of images and dragging them to the app icon. i like to keep the app in the sidebar of finder windows for quick access.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-xOCItK9RvYA/Tj_ghizHITI/AAAAAAAAASY/TGADxERPrPg/s1600/DropProcessing.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/-xOCItK9RvYA/Tj_ghizHITI/AAAAAAAAASY/TGADxERPrPg/s1600/DropProcessing.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638472125372637490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/27436398?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="580" height="471" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;max. dimension&lt;/u&gt;&lt;br /&gt;images can be resized by the longest dimension 0 = do not resize&lt;br /&gt;(i.e. if you enter "50" an 800 x 600 would be sized down to 50 x 38)&lt;br /&gt;&lt;br /&gt;&lt;u&gt;resolution&lt;/u&gt;&lt;br /&gt;resolution can be changed to: 72, 96, 150, 300, or "no change" &lt;br /&gt;(i purposely made this a drop-down menu, as i commonly only need these values)&lt;br /&gt;&lt;br /&gt;&lt;u&gt;color space&lt;/u&gt;&lt;br /&gt;the usual suspects: cmyk, rgb, grayscale, and "no change"&lt;br /&gt;&lt;br /&gt;&lt;u&gt;flatten image&lt;/u&gt;&lt;br /&gt;if image is multi-layered, .tif, .psd, etc. it will be flattened to one layer&lt;br /&gt;&lt;br /&gt;&lt;u&gt;save as copy&lt;/u&gt;&lt;br /&gt;this will append "Copy of" to the front of processed images&lt;br /&gt;&lt;br /&gt;&lt;u&gt;set preferences&lt;/u&gt;&lt;br /&gt;sets the settings, settings are saved from session to session&lt;br /&gt;&lt;br /&gt;as you can see in the video, it's pretty easy to use and it supports all photoshop compatible file types. there are two caveats, all dropped ".gif" files will be converted to ".psd" files and all dropped ".jpeg" files will be converted to ".jpg" files. as of right now it does not support dropping of folders.&lt;br /&gt;&lt;br /&gt;download &lt;a href="http://dl.dropbox.com/u/7038255/apps/DropProcessing.zip" target="new"&gt;Drop Processing&lt;/a&gt;, if  anyone is interested in the source, let me know. however i wrote the app using applescript studio, which is &lt;a hef="http://developer.apple.com/library/mac/#releasenotes/ScriptingAutomation/RN-AppleScriptObjC/_index.html" target="new"&gt;no longer supported by apple&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;i've tested this app using a osx 10.5 - 10.6.8 and Photoshop CS2 - CS5. i cannot be certain if it will work in lion (my guess is, it will not)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-6349308849718067739?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2011/08/drop-processing.html' title='Drop Processing'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/6349308849718067739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/6349308849718067739'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2011/08/drop-processing.html' title='Drop Processing'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-xOCItK9RvYA/Tj_ghizHITI/AAAAAAAAASY/TGADxERPrPg/s72-c/DropProcessing.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-5557018834127717856</id><published>2011-07-20T11:57:00.014+02:00</published><updated>2011-07-22T11:28:54.793+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scriptographer'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>processing. triangulation + meshes</title><content type='html'>i've been slowly experimenting with meshes (mostly with triangulation algorithms), or better said trying to understand how to better control them. it started out &lt;a href="http://vimeo.com/5715729" target="new"&gt;innocent enough&lt;/a&gt; and has slowly progressed. after deconstructing jonathan puckey's &lt;a href="http://jonathanpuckey.com/projects/delaunay-raster/" target="new"&gt;delaunay raster&lt;/a&gt; scriptographer work, i created my own version and began modifying it. i expanded upon my own version by creating a version which maps brightness values of an area to line density (instead of colors).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-54JQ5f_kx0s/TiaWjxxzYHI/AAAAAAAAAQM/tkt6fSZwAjQ/s1600/pilkington_triangulated.png" imageanchor="1" target="new"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-54JQ5f_kx0s/TiaWjxxzYHI/AAAAAAAAAQM/tkt6fSZwAjQ/s1600/pilkington_triangulated.png" width="600" /&gt;&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Karl_Pilkington" target="new"&gt;karl pilkington&lt;/a&gt;, triangulated&lt;br /&gt;&lt;br /&gt;although proud of my &lt;a href="http://28.media.tumblr.com/tumblr_kv62ymNUgg1qzynq4o1_500.jpg" target="new"&gt;achievement&lt;/a&gt;, the entire thing is something that jonathan is exploring, but honestly without a lot of conceptual thought i kept trudging aimlessly on. i thought, well i'll take this idea to live and moving images (recently the internet has proved to me that everything has been done, with &lt;a href="http://vimeo.com/24414450" target="new"&gt;this&lt;/a&gt; and &lt;a href="http://vimeo.com/26051798" target="new"&gt;this&lt;/a&gt;) my explorations with my own puckey-delaunay-raster script proved the best illustrations come from getting in the details of the face, so when i switched to processing for moving images i created a rudimentary &lt;a href="https://gist.github.com/1007955" target="new"&gt;edge detection&lt;/a&gt; class which pulls out the edges as PVector arraylist. &lt;br /&gt;&lt;br /&gt;&lt;div class="code-box"&gt;/**&lt;br /&gt;*  FEdgeDetect.pde&lt;br /&gt;*&lt;br /&gt;*  Ken Frederick&lt;br /&gt;*  ken.frederick@gmx.de&lt;br /&gt;*&lt;br /&gt;*  edge detection class inspired by&lt;br /&gt;*  http://processing.org/learning/topics/edgedetection.html&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class FEdgeDetect {&lt;br /&gt;// -----------------------------------------------------------------------------&lt;br /&gt;// properties&lt;br /&gt;// -----------------------------------------------------------------------------&lt;br /&gt;private PImage img;&lt;br /&gt;private PImage edgeImg;&lt;br /&gt;private float thresh;&lt;br /&gt;private float density;&lt;br /&gt;private float[][] kernel = { { -1, -1, -1 },&lt;br /&gt;{ -1,  1, -1 },&lt;br /&gt;{ -1, -1, -1 } };&lt;br /&gt;&lt;br /&gt;public ArrayList&amp;lt;PVector&amp;gt; edgePVector = new ArrayList&amp;lt;PVector&amp;gt;();&lt;br /&gt;public ArrayList&amp;lt;Float&amp;gt; edgeFloat = new ArrayList&amp;lt;Float&amp;gt;();&lt;br /&gt;&lt;br /&gt;public boolean bProcessEdge = false;&lt;br /&gt;public boolean bProcessImage = false;&lt;br /&gt;public boolean bProcessMovie = false;&lt;br /&gt;&lt;br /&gt;// -----------------------------------------------------------------------------&lt;br /&gt;// constructor&lt;br /&gt;// -----------------------------------------------------------------------------&lt;br /&gt;public FEdgeDetect() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public FEdgeDetect(PImage _img) {&lt;br /&gt;setImage(_img);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// -----------------------------------------------------------------------------&lt;br /&gt;// methods&lt;br /&gt;// -----------------------------------------------------------------------------&lt;br /&gt;public void process(float _thresh) {&lt;br /&gt;if(_thresh != thresh || bProcessImage || bProcessMovie) {&lt;br /&gt;thresh = _thresh;&lt;br /&gt;bProcessImage = false;&lt;br /&gt;kernel[1][1] = thresh;&lt;br /&gt;&lt;br /&gt;for (int y=1; y&amp;lt;img.height-1; y++) {&lt;br /&gt;for (int x=1; x&amp;lt;img.width-1; x++) {&lt;br /&gt;float sum = 0; // Kernel sum for this pixel&lt;br /&gt;&lt;br /&gt;for (int ky = -1; ky &amp;lt;= 1; ky++) {&lt;br /&gt;for (int kx = -1; kx &amp;lt;= 1; kx++) {&lt;br /&gt;int pos = (y + ky)*img.width + (x + kx);&lt;br /&gt;int val = (img.pixels[pos] &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;sum += kernel[ky+1][kx+1] * val;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;edgeImg.pixels[y*img.width + x] = color(sum);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;edgeImg.updatePixels();&lt;br /&gt;&lt;br /&gt;} // end check&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void process(PImage img, float thresh, boolean _process) {&lt;br /&gt;setImage(img);&lt;br /&gt;bProcessMovie = _process;&lt;br /&gt;process(thresh);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void findEdges(int _density, float b_low, float b_high) {&lt;br /&gt;// println(_density + "\t!=\t" + density);&lt;br /&gt;if(_density != density || bProcessEdge || bProcessMovie) {&lt;br /&gt;density = _density;&lt;br /&gt;bProcessEdge = false;&lt;br /&gt;&lt;br /&gt;edgePVector.clear();&lt;br /&gt;edgeFloat.clear();&lt;br /&gt;&lt;br /&gt;for(int x=1; x&amp;lt;edgeImg.width-1; x+=density) {&lt;br /&gt;for(int y=1; y&amp;lt;edgeImg.height-1; y+=density) {&lt;br /&gt;//float b = brightness( edgeImg.get(x,y) );&lt;br /&gt;float b = FTools.luminance( edgeImg.get(x,y) );&lt;br /&gt;if( b &amp;gt; b_low &amp;amp;&amp;amp; b &amp;lt; b_high ) {&lt;br /&gt;float z = norm(b, 0,255);&lt;br /&gt;edgePVector.add( new PVector(x,y,z) );&lt;br /&gt;&lt;br /&gt;edgeFloat.add( new Float(x) );&lt;br /&gt;edgeFloat.add( new Float(y) );&lt;br /&gt;edgeFloat.add( new Float(z) );&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;} // end check&lt;br /&gt;&lt;br /&gt;if(edgePVector.size() == 0) {&lt;br /&gt;edgePVector.add( new PVector(0,0,0) );&lt;br /&gt;}&lt;br /&gt;if(edgeFloat.size() == 0) {&lt;br /&gt;edgeFloat.add( 0.0f );&lt;br /&gt;edgeFloat.add( 0.0f );&lt;br /&gt;edgeFloat.add( 0.0f );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// -----------------------------------------------------------------------------&lt;br /&gt;// sets&lt;br /&gt;// -----------------------------------------------------------------------------&lt;br /&gt;protected void setImage(PImage _img) { &lt;br /&gt;img = _img;&lt;br /&gt;img.loadPixels();&lt;br /&gt;edgeImg = createImage(img.width, img.height, RGB);&lt;br /&gt;// edgeImg.filter(THRESHOLD, .4);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// -----------------------------------------------------------------------------&lt;br /&gt;// gets&lt;br /&gt;// -----------------------------------------------------------------------------&lt;br /&gt;public PImage getSource() {&lt;br /&gt;return img;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public PImage getEdge() {&lt;br /&gt;return edgeImg;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public ArrayList getEdgePVector() {&lt;br /&gt;return edgePVector;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*  need to figure out a better solution for &lt;br /&gt;*  smoother integration with OpenGL VBOs&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="435" src="http://player.vimeo.com/video/18815583?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="580"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;the first attempt was terribly slow, but worked more or less. i contemplated and subsequently failed to port it over to &lt;a href="http://opeframeworks.cc/" target="new"&gt;openFrameworks&lt;/a&gt; (i couldn't get the edge detection to work). i realized even if the concept is nothing new i could at least learn more about optimization and harnessing opengl &lt;a href="http://en.wikipedia.org/wiki/Vertex_Buffer_Object" target="new"&gt;VBOs&lt;/a&gt; (vertex buffer objects). and eventually i developed a version which takes web cam input, edge detects, and triangulates all the while maintaining a frame rate of 30fps+. a z depth (height map) is generated from the brightness of the edge-detected-pixel, and by adding a multiplier an interesting "face landscape" occurs (especially when using the smooth gradient mode).&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="363" src="http://player.vimeo.com/video/24651628?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="580"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code-box"&gt;pgl.beginGL();&lt;br /&gt;&lt;br /&gt;if(triangles.size() != 0) {&lt;br /&gt;if(mode == 0 || mode == 1) {&lt;br /&gt;gl.glBegin(GL.GL_TRIANGLES);&lt;br /&gt;&lt;br /&gt;float x1,y1,z1, x2,y2,z2, x3,y3,z3;&lt;br /&gt;float px1,py1,pz1, px2,py2,pz2, px3,py3,pz3;;&lt;br /&gt;float r,g,b,a, r2,g2,b2;&lt;br /&gt;&lt;br /&gt;if(mode == 0) {&lt;br /&gt;/**&lt;br /&gt;*  smooth gradients&lt;br /&gt;*/&lt;br /&gt;for(int i=0; i&amp;lt;TriangleVBOPoints.length; i+=3) {&lt;br /&gt;x1 = TriangleVBOPoints[i];&lt;br /&gt;y1 = TriangleVBOPoints[i+1];&lt;br /&gt;z1 = TriangleVBOPoints[i+2];&lt;br /&gt;&lt;br /&gt;int c1 = img.pixels[ ((int)y1*capture.width) + ((int)x1) ];&lt;br /&gt;r = norm((c1 &amp;gt;&amp;gt; 16) &amp;amp; 0xff, 0,255);&lt;br /&gt;g = norm((c1 &amp;gt;&amp;gt; 8) &amp;amp; 0xff, 0,255);&lt;br /&gt;b = norm(c1 &amp;amp; 0xff, 0,255);&lt;br /&gt;if(bOpaque) a = 1.0;&lt;br /&gt;else a = norm(FTools.luminance(c1), 0,255);&lt;br /&gt;&lt;br /&gt;gl.glColor4f(r,g,b, a);&lt;br /&gt;gl.glVertex3f(x1,y1,z1*zHeight);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;} else if(mode == 1) {&lt;br /&gt;/**&lt;br /&gt;*  flat colors&lt;br /&gt;*/&lt;br /&gt;for(int i=0; i&amp;lt;TriangleVBOPoints.length; i+=9) {&lt;br /&gt;x1 = TriangleVBOPoints[i];&lt;br /&gt;y1 = TriangleVBOPoints[i+1];&lt;br /&gt;z1 = TriangleVBOPoints[i+2];&lt;br /&gt;&lt;br /&gt;int c1 = img.pixels[ ((int)y1*capture.width) + ((int)x1) ];&lt;br /&gt;r = norm((c1 &amp;gt;&amp;gt; 16) &amp;amp; 0xff, 0,255);&lt;br /&gt;g = norm((c1 &amp;gt;&amp;gt; 8) &amp;amp; 0xff, 0,255);&lt;br /&gt;b = norm(c1 &amp;amp; 0xff, 0,255);&lt;br /&gt;if(bOpaque) a = 1.0;&lt;br /&gt;else a = norm(FTools.luminance(c1), 0,255);&lt;br /&gt;&lt;br /&gt;gl.glColor4f(r,g,b, a);&lt;br /&gt;gl.glVertex3f(x1, y1, z1*zHeight);&lt;br /&gt;&lt;br /&gt;x2 = TriangleVBOPoints[i+3];&lt;br /&gt;y2 = TriangleVBOPoints[i+4];&lt;br /&gt;z2 = TriangleVBOPoints[i+5];&lt;br /&gt;gl.glVertex3f(x2, y2, z2*zHeight);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;x3 = TriangleVBOPoints[i+6];&lt;br /&gt;y3 = TriangleVBOPoints[i+7];&lt;br /&gt;z3 = TriangleVBOPoints[i+8];&lt;br /&gt;gl.glVertex3f(x3, y3, z3*zHeight);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;gl.glEnd();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;pgl.endGL();&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;i really liked this valley effect when increasing the z depth, and i thought it would be cool if i could start to distort the image by "folding" and "crumpling" it. similar to the pop faces work by &lt;a href="http://www.joshuascottphoto.com/" target="new"&gt;joshua scott&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-FBPSzTIVuLg/Tiaf62kLAwI/AAAAAAAAAQU/Z_FBVTxrOq0/s1600/popfaces_joshuascott.jpg" imageanchor="1" target="new"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-FBPSzTIVuLg/Tiaf62kLAwI/AAAAAAAAAQU/Z_FBVTxrOq0/s1600/popfaces_joshuascott.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;then i began thinking it would be even better to do this directly in illustrator using &lt;a href="http://www.scriptographer.org/" target="new"&gt;scriptographer&lt;/a&gt; after porting my edge detection code over to javascript, and creating the necessary 3d infrastructure i ran into challenges distorting the image although i did manage to create a neat kaleidoscope effect, which wasn't exactly what i was going for (although, that could lead to something)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-iTJ-Lz8nZcU/Tiajs5wsPZI/AAAAAAAAAQc/GB3x9uFfkgI/s1600/image_crumple_fail.png" imageanchor="1" target="new"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-iTJ-Lz8nZcU/Tiajs5wsPZI/AAAAAAAAAQc/GB3x9uFfkgI/s1600/image_crumple_fail.png" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;i've pretty much abandoned the idea of achieving what i want in illustrator and have gone back to processing. using particles and physics i can distort a blank mesh of lines, however, i cannot deform an image. i can get the image mapped as a texture to a mesh, but as i distort the mesh, the image gets clipped (as if in a mask). this probably stems from me calculating the texture coordinates incorrectly.&lt;br /&gt;&lt;br /&gt;all in all, i'm happy with what i've learned especially better understanding direct opengl calls and optimization, but i'm frustrated that i've hit this stumbling block. i think i'll probably put this idea on ice and focus on some other things (that require less programming) and maybe loop back around in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-5557018834127717856?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2011/07/processing-triangulation-meshes.html' title='processing. triangulation + meshes'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/5557018834127717856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/5557018834127717856'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2011/07/processing-triangulation-meshes.html' title='processing. triangulation + meshes'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-54JQ5f_kx0s/TiaWjxxzYHI/AAAAAAAAAQM/tkt6fSZwAjQ/s72-c/pilkington_triangulated.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-220937269814614454</id><published>2011-06-23T13:14:00.015+02:00</published><updated>2011-06-25T22:46:26.072+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scriptographer'/><title type='text'>scriptographer. lorem ipsum</title><content type='html'>It happens often enough that i need dummy-text in illustrator. unfortunately this capability has yet to be (if ever) implemented. typically i use &lt;a href="http://www.lipsum.com" target="new"&gt;lipsum.com&lt;/a&gt; or generate the text in indesign or keep a &lt;a href="http://objectmix.com/adobe-illustrator/735918-add-placeholder-text-lorem-ipsum.html" target="new"&gt;blank text file&lt;/a&gt; with "lorem ipsum" text in it. &lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/25502272?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="518" height="421" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;loremIpsum_0_0.js&lt;/b&gt; will generate an unlimited amount of "lorem ipsum" text, either number of paragraphs or number of words.&lt;br /&gt;&lt;br /&gt;features: &lt;br /&gt;&lt;br /&gt;1/ if nothing is selected a text box, with the desired amount of text, will be created in the center of the page.&lt;br /&gt;2/ type items can be selected and either replace or add to existing text. in both cases type attributes such as size, leading, and color are maintained. this video shows how the script functions.&lt;br /&gt;3/ punctuation inclusion can be toggled as well as Title Case for headline creation&lt;br /&gt;&lt;br /&gt;so far as i have tested, the script runs in cs3 and cs5 without any errors. if you find a bug (which is likely) let me know. grab the script &lt;a href="http://scriptographer.org/scripts/general-scripts/lorem-ipsum-generator/" target="new"&gt;loremIpsum_0_0.js&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-220937269814614454?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2011/06/scriptographer-lorem-ipsum.html' title='scriptographer. lorem ipsum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/220937269814614454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/220937269814614454'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2011/06/scriptographer-lorem-ipsum.html' title='scriptographer. lorem ipsum'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-8098122354502554790</id><published>2011-05-24T11:27:00.015+02:00</published><updated>2011-06-25T22:48:32.644+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>processing. prettycolors</title><content type='html'>the amount of time between posts in the last year has been too much. i'm going to try and blog more regularly, instead of just blogging my final projects i'm going to start posting little snippets, as well as successes and failures in between.&lt;br /&gt;&lt;br /&gt;i present to you a class for pulling colors from the tumblr blog &lt;a href="http://prettycolors.tumblr.com/" target=new&gt;http://prettycolors.tumblr.com/&lt;/a&gt;. i like the simplicity of the blog and the idea of color palettes being dynamic and changing over time (that and sites like &lt;a href="http://code.google.com/p/colorlib/" target=new&gt;kuler&lt;/a&gt; and &lt;a href="http://code.google.com/p/colorlib/"&gt;colour lovers&lt;/a&gt; are covered)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-hrN5aaA-9iU/TduBby_7C2I/AAAAAAAAAOY/v4wx4VM9Eqs/s1600/prettycolors_example.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://4.bp.blogspot.com/-hrN5aaA-9iU/TduBby_7C2I/AAAAAAAAAOY/v4wx4VM9Eqs/s1600/prettycolors_example.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5610220075366419298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;this class grabs colors from the site and i built in rudimentary (and not yet complete) palette creation options. palettes are groups of five colors, which can be accessed &lt;b&gt;getPalette(int type, int num)&lt;/b&gt;. the default is to load the first 50 colors (max as allowed by the &lt;a href="http://www.tumblr.com/docs/en/api"&gt;tumblr api&lt;/a&gt;), but this can be altered by changing the value of &lt;b&gt;numToReturn&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;the types of palettes available and created upon instantiation of the class (for faster access) are as follows:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ORDER&lt;/b&gt; palettes based on posting order, most recent colors appear first&lt;br /&gt;&lt;b&gt;BRIGHTNESS&lt;/b&gt; palettes based on brightness* (default creates 10 palettes)&lt;br /&gt;&lt;b&gt;COMPLEMENT&lt;/b&gt; palettes of complementary* colors (default creates 10 palettes)&lt;br /&gt;&lt;b&gt;RANDOM&lt;/b&gt; palettes of random colors (default uses the 50 most recent colors)&lt;br /&gt;&lt;b&gt;RANDOM_ALL&lt;/b&gt; palettes of random colors (uses all posted colors)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;* implementation is very very very rudimentary, if not downright wrong&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-Z0-YaaVm19s/TduBcO8BT2I/AAAAAAAAAOg/htVHF8hhCGo/s1600/prettycolors_saved.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width:518px;" src="http://3.bp.blogspot.com/-Z0-YaaVm19s/TduBcO8BT2I/AAAAAAAAAOg/htVHF8hhCGo/s1600/prettycolors_saved.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5610220082866245474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;in addition to creating palettes, palettes can also be "exported" as .png files for later use (for example using my &lt;a href="https://github.com/frederickk/frederickk/blob/master/src/frederickk/tools/FPalette.java"&gt;FPalette&lt;/a&gt; class as part of my incomplete &lt;a href="https://github.com/frederickk/frederickk"&gt;frederickk&lt;/a&gt; processing library)&lt;br /&gt;&lt;br /&gt;below is an example that uses the &lt;a href="https://gist.github.com/971583"&gt;Prettycolors.pde&lt;/a&gt; class to create the above application. in this example palettes can be "exported" as .png files by clicking the mouse, palettes can be refreshed by pressing the spacebar.&lt;br /&gt;&lt;br /&gt;&lt;div class="code-box"&gt;Prettycolors pc;&lt;br /&gt;int choose[];&lt;br /&gt;&lt;br /&gt;PFont typeface;&lt;br /&gt;&lt;br /&gt;void setup() {&lt;br /&gt;  size(500,500);&lt;br /&gt;  noLoop();&lt;br /&gt;  noStroke(); &lt;br /&gt;&lt;br /&gt;  choose = new int[3];&lt;br /&gt;  choose[0] = (int) random(10);&lt;br /&gt;  choose[1] = (int) random(10);&lt;br /&gt;  choose[2] = (int) random(50);&lt;br /&gt;&lt;br /&gt;  pc = new Prettycolors(this);&lt;br /&gt;&lt;br /&gt;  typeface = createFont("LucidaGrande-Bold",9);&lt;br /&gt;  textFont(typeface);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void draw() {&lt;br /&gt;  background(0);&lt;br /&gt;  noStroke();&lt;br /&gt;&lt;br /&gt;  //palettes&lt;br /&gt;  pc.drawPalette(0,0, width,height/5, pc.ORDER, choose[0]);&lt;br /&gt;  pc.drawPalette(0,(height/5), width,height/5, pc.BRIGHTNESS, choose[1]);&lt;br /&gt;  pc.drawPalette(0,(height/5)*2, width,height/5, pc.COMPLEMENT, choose[2]);&lt;br /&gt;  pc.drawPalette(0,(height/5)*3, width,height/5, pc.RANDOM);&lt;br /&gt;  pc.drawPalette(0,(height/5)*4, width,height/5, pc.RANDOM_ALL);&lt;br /&gt;&lt;br /&gt;  //labels&lt;br /&gt;  fill(0);&lt;br /&gt;  text("Order", 15,15);  &lt;br /&gt;  text("Brightness", 15,(height/5) +15);  &lt;br /&gt;  text("Complement", 15,(height/5)*2 +15);  &lt;br /&gt;  text("Random", 15,(height/5)*3 +15);  &lt;br /&gt;  text("Random All", 15,(height/5)*4 +15);  &lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *  pressing mouse will save the palettes as 5x1 pixel images for later use&lt;br /&gt; */&lt;br /&gt;void mousePressed() {&lt;br /&gt;  pc.getPalette(pc.ORDER, choose[0]).save();&lt;br /&gt;  pc.getPalette(pc.BRIGHTNESS, choose[1]).save();&lt;br /&gt;  pc.getPalette(pc.COMPLEMENT, choose[2]).save();&lt;br /&gt;  pc.getPalette(pc.RANDOM).save();&lt;br /&gt;  pc.getPalette(pc.RANDOM_ALL).save();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *  pressing the spacebar will randomly create new palettes&lt;br /&gt; */&lt;br /&gt;void keyPressed() {&lt;br /&gt;  if(key == ' ') {&lt;br /&gt;    choose[0] = (int) random(10);&lt;br /&gt;    choose[1] = (int) random(10);&lt;br /&gt;    choose[2] = (int) random(50);&lt;br /&gt;    redraw();&lt;br /&gt;  }&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;* as with most of the things found on this blog, the code works for me (osx 10.6.7, processing 1.5.1) but i make no guarantees that it will work for you. however, feel free to update and hack anything useful out it. just let me know and please keep a link to this blog or my &lt;a href="https://github.com/frederickk"&gt;github&lt;/a&gt; repositories&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-8098122354502554790?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2011/05/processing-prettycolors.html' title='processing. prettycolors'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/8098122354502554790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/8098122354502554790'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2011/05/processing-prettycolors.html' title='processing. prettycolors'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-hrN5aaA-9iU/TduBby_7C2I/AAAAAAAAAOY/v4wx4VM9Eqs/s72-c/prettycolors_example.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-3582805835098543143</id><published>2011-01-06T02:02:00.010+01:00</published><updated>2011-11-04T08:41:27.137+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scriptographer'/><title type='text'>scriptographer. push/pull points</title><content type='html'>it's been a long time since my last update, and i've got a couple things on the horizon as soon as work lets up a little bit. one thing i've been updating quite a bit recently is my processing library &lt;a href="https://github.com/frederickk/frederickk"&gt;frederickk&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;however, here's a quick thing i whipped up for &lt;a href="http://www.scriptographer.com/" target=new&gt;scriptographer&lt;/a&gt;. i was wanting to easily affect meshes i've been building in illustrator. so here's a pair of scripts that "push and pull" points of selected objects around the artboard. somewhat similar to the 'warp tool', but more predictable in my opinion.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;pointsPushPullTool_0_0.js&lt;/b&gt; uses the scriptographer pen-tool, when the mouse nears a certain it pushes it around. mouse proximity can be set within the palette, acceleration is the distance an object's points move.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/TSUfKD4PEsI/AAAAAAAAANE/HfTAsXNx0yg/s1600/push_pull_tool_1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/TSUfKD4PEsI/AAAAAAAAANE/HfTAsXNx0yg/s1600/push_pull_tool_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5558883572759073474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/TSUfKXgnuGI/AAAAAAAAANM/n4AXS7-5zLU/s1600/push_pull_tool_2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://4.bp.blogspot.com/_D4RTkcxeJUk/TSUfKXgnuGI/AAAAAAAAANM/n4AXS7-5zLU/s1600/push_pull_tool_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5558883578028734562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_D4RTkcxeJUk/TSUfKskE0LI/AAAAAAAAANU/qDTX_tUC6Ug/s1600/push_pull_tool_3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://2.bp.blogspot.com/_D4RTkcxeJUk/TSUfKskE0LI/AAAAAAAAANU/qDTX_tUC6Ug/s1600/push_pull_tool_3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5558883583680368818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;pointsPushPull_0_0.js&lt;/b&gt; set the 'distance threshhold' as a way to control how close points should be to each other to be moved together. connect nearby points by setting the random value to 0, and by changing the random value to something above 0 the points will randomly move that distance.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/TSUf53_wjEI/AAAAAAAAANc/kSFfus6cOnI/s1600/push_pull_1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/TSUf53_wjEI/AAAAAAAAANc/kSFfus6cOnI/s1600/push_pull_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5558884394203122754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/TSUf6J3b8nI/AAAAAAAAANk/nAIAncFCmj8/s1600/push_pull_2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/TSUf6J3b8nI/AAAAAAAAANk/nAIAncFCmj8/s1600/push_pull_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5558884399000056434" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/TSUf6UmuRMI/AAAAAAAAANs/0e5OvhzFWQY/s1600/push_pull_4.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/TSUf6UmuRMI/AAAAAAAAANs/0e5OvhzFWQY/s1600/push_pull_4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5558884401882744002" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;i haven't fully tested these scripts 100%, so they may still be buggy. they seem too insignificant to warrant a release on the &lt;a href="http://www.scriptographer.com/" target=new&gt;scriptographer&lt;/a&gt; site.&lt;br /&gt;&lt;br /&gt;grab the scripts/source &lt;a href="https://gist.github.com/gists/1046306/download"&gt;pointsPushPullTool_0_0.js&lt;/a&gt; and &lt;a href="https://gist.github.com/gists/1046306/download"&gt;pointsPushPull_0_0.js&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-3582805835098543143?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2011/01/scriptographer-pushpull-points.html' title='scriptographer. push/pull points'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/3582805835098543143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/3582805835098543143'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2011/01/scriptographer-pushpull-points.html' title='scriptographer. push/pull points'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_D4RTkcxeJUk/TSUfKD4PEsI/AAAAAAAAANE/HfTAsXNx0yg/s72-c/push_pull_tool_1.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-5031634576190779883</id><published>2010-07-16T16:28:00.034+02:00</published><updated>2011-06-25T22:55:22.662+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>schhplttlr</title><content type='html'>for the past couple of months i've been working on a project called "&lt;a href="http://www.muenchen.de/Rathaus/kult/museen/maximiliansforum/schhplttlr/419871/index.html" target="new"&gt;schhplttlr: electric beats&lt;/a&gt;" with &lt;a href="http://www.danielkluge.com/" target="new"&gt;daniel kluge&lt;/a&gt; and &lt;a href="http://www.kern-emden.de/" target="new"&gt;eugen kern-emden&lt;/a&gt; presented by &lt;a href="http://www.peertospace.eu/" target="new"&gt;peer to space&lt;/a&gt; and in collaboration with &lt;a href="http://www.maximiliansforum.de" target="new"&gt;the department of cultural affairs munich&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;the premise&lt;/b&gt;&lt;br /&gt;Using movements inspired from “&lt;a href="http://www.youtube.com/watch?v=q6ezpkqt2rk" target="new"&gt;schuhplattler&lt;/a&gt;” (traditional Bavarian folk dance). The dancers generate beats and light via sensors. Musicians, media artists, dancers and choreographers experiment with these movements during a three-day long interdisciplinary workshop, in which the audience may freely participate. The results were performed at the opening evening on July 15, 2010. &lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13598389&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=13598389&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="518" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;this documentary film and selected photographs will be projected in MaximiliansForum, munich from 19 july 2010 until 5 september 2010.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;the process&lt;/b&gt; (slightly abridged)&lt;br /&gt;we began this project at the beginning of may, wanting to create something that could only happen in munich but also connect our collective interests of music, physical computing, performance, textile electronics, etc. we stumbled upon the idea of &lt;a href="http://www.youtube.com/watch?v=q6ezpkqt2rk" target="new"&gt;schuhplattler&lt;/a&gt; but we weren't sure yet how to represent it. literally? artsy-fartsy? projected (generative) images? physically? schuhplattler is a dance of courtship. it all started coming together, female and male. light bulbs flitting like fireflies in the spring, feminine, and harmonic. fluorescent lights structural, rhythm, and manly. &lt;br /&gt;&lt;br /&gt;there were three main tools we used, &lt;a href="http://www.cycling74.com/" target="new"&gt;max/msp&lt;/a&gt; for receiving and processing signals from the sensors and controlling the sounds. these signals were then sent out as &lt;a href="http://opensoundcontrol.org/" target="new"&gt;open sound control (osc)&lt;/a&gt; messages to  &lt;a href="http://www.processing.org/" target="new"&gt;processing&lt;/a&gt;. which converted the messages into a signal for &lt;a href="http://www.arduino.cc/" target="new"&gt;arduino&lt;/a&gt; which via relays turnd the lights (incandescent bulbs and fluorescent tubes) on and off.&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://www.danielkluge.com/embed/mediaplayer.swf" width="400" height="320" allowscriptaccess="always" allowfullscreen="true" flashvars="height=320&amp;width=400&amp;file=/Movies/240610schhplttlr.flv&amp;searchbar=false&amp;overstretch=true&amp;showdigits=true"/&gt;&lt;br /&gt;&lt;br /&gt;we began prototyping. daniel focused on sensor creation and sound control. the gloves and other sensors were made using conductive foam. the wearer of the sensor presses the foam to complete the circuit. these values were then fed into max/msp where daniel weaved his magic, triggering sounds and controlling sample. eugen focused on programming reactive projected graphics (later abandoned). my task was to simply turn on light bulbs with arduino using processing.&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://www.danielkluge.com/embed/mediaplayer.swf" width="400" height="320" allowscriptaccess="always" allowfullscreen="true" flashvars="height=320&amp;width=400&amp;file=/Movies/020810.flv&amp;searchbar=false&amp;overstretch=true&amp;showdigits=true"/&gt;&lt;br /&gt;&lt;br /&gt;by the time july rolled around we had successfully built a small prototype. eight light bulbs divided into two groups, four fluorescent bulbs, with working glove and thigh sensors. one small hurdle we had yet to solve 100% was the communication between max/msp and processing. as i said before we chose to &lt;a href="http://opensoundcontrol.org/" target="new"&gt;osc&lt;/a&gt; as the communication medium using the &lt;a href="http://www.sojamo.de/libraries/oscP5/" target="new"&gt;oscp5&lt;/a&gt; library. this was fine, however the way one builds a proper osc message in max/msp is (still) elusive to us. in the end we just put all of the necessary info within the message (control) field. on top of that when we did send messages there was a slight delay. we solved the delay by connecting both of our computers directly with an ethernet cable. we determined the delay was because we were connected via wifi. &lt;br /&gt;&lt;br /&gt;we had still yet to test with the dancers or even move into the space, none of this happened until the week of the performance. as you can see &lt;a href="http://www.maximiliansforum.de/" target="new"&gt;MaximiliansForum&lt;/a&gt; is big and empty. but now we at least knew how everything would be connected it was now just a matter of taking the prototype and multiplying everything to the final quantities.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_D4RTkcxeJUk/TEwjLwI01eI/AAAAAAAAAK8/7abPjc0cn-E/s1600/schhplttlr.informationFlow_01_kf-2.png" target="new"&gt;&lt;img src="http://2.bp.blogspot.com/_D4RTkcxeJUk/TEwjLwI01eI/AAAAAAAAAK8/7abPjc0cn-E/s1600/schhplttlr.informationFlow_01_kf-2.png" width="518" border="0" alt=""id="BLOGGER_PHOTO_ID_5497807929919985122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_D4RTkcxeJUk/TEyIvWDqUTI/AAAAAAAAALE/Hnf7nbbnnow/s1600/schhplttlr_000013_sm.jpg" target="new"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://2.bp.blogspot.com/_D4RTkcxeJUk/TEyIvWDqUTI/AAAAAAAAALE/Hnf7nbbnnow/s1600/schhplttlr_000013_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5497919592068698418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/TEyh1K6QGjI/AAAAAAAAALk/-M5Xm_1WFvQ/s1600/schhplttlr_000052_sm.jpg" target="new"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/TEyh1K6QGjI/AAAAAAAAALk/-M5Xm_1WFvQ/s1600/schhplttlr_000052_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5497947179946351154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/TEyh1WCI4FI/AAAAAAAAALs/74Dh4Yuc-_Q/s1600/schhplttlr_000050_sm.jpg" target="new"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://4.bp.blogspot.com/_D4RTkcxeJUk/TEyh1WCI4FI/AAAAAAAAALs/74Dh4Yuc-_Q/s1600/schhplttlr_000050_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5497947182932222034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/TEyh1isKkyI/AAAAAAAAAL0/c9Wf9kCxxkk/s1600/schhplttlr_000033_sm.jpg" target="new"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/TEyh1isKkyI/AAAAAAAAAL0/c9Wf9kCxxkk/s1600/schhplttlr_000033_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5497947186329719586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_D4RTkcxeJUk/TEyh15zzwtI/AAAAAAAAAL8/TEjR3COyqHI/s1600/schhplttlr_0000199_sm.jpg" target="new"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://1.bp.blogspot.com/_D4RTkcxeJUk/TEyh15zzwtI/AAAAAAAAAL8/TEjR3COyqHI/s1600/schhplttlr_0000199_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5497947192535794386" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_D4RTkcxeJUk/TEyh2XxaVKI/AAAAAAAAAME/s2zawGpe9B0/s1600/schhplttlr_0000209_sm.jpg" target="new"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://2.bp.blogspot.com/_D4RTkcxeJUk/TEyh2XxaVKI/AAAAAAAAAME/s2zawGpe9B0/s1600/schhplttlr_0000209_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5497947200578802850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_D4RTkcxeJUk/TEyIwS0NKPI/AAAAAAAAALc/6SvarX86OCI/s1600/schhplttlr_0000189_sm.jpg" target="new"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://1.bp.blogspot.com/_D4RTkcxeJUk/TEyIwS0NKPI/AAAAAAAAALc/6SvarX86OCI/s1600/schhplttlr_0000189_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5497919608378435826" align="top"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;you can see more videos of our process at &lt;a href="http://www.danielkluge.com/XX2010/schhplttlr.htm" target="new"&gt;http://www.danielkluge.com/XX2010/schhplttlr.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;the hardware&lt;/b&gt;&lt;br /&gt;we kept things fairly simple on the hardware side to control all of the lights. we used a single &lt;a href="http://www.arduino.cc/" target="new"&gt;arduino&lt;/a&gt; duemilanove and 12 modules built of the following parts.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.conrad.de/ce/de/product/163350/TRANSISTOR-2-N-3904" target="new"&gt;2N3904 transistor&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.conrad.de/ce/de/product/162221/DIODE-1N4002-100V1A" target="new"&gt;100V 1A 1N4002 diode&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.buerklin.com/default.asp?srch=G112920" target="new"&gt;G6B–1114 5VDC relay&lt;/a&gt;&lt;br /&gt;10A Fuse* (didn't actually implement the fuse)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/TErK9fFVFMI/AAAAAAAAAKk/BU_k7QT6_0A/s1600/schhplttlr_lichtSchema.png" target="new"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 345px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/TErK9fFVFMI/AAAAAAAAAKk/BU_k7QT6_0A/s400/schhplttlr_lichtSchema.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5497429452823794882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_D4RTkcxeJUk/TEyIvg4QJ7I/AAAAAAAAALM/Yckun2wQ7KI/s1600/schhplttlr_0000122_sm.jpg" target="new"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://1.bp.blogspot.com/_D4RTkcxeJUk/TEyIvg4QJ7I/AAAAAAAAALM/Yckun2wQ7KI/s1600/schhplttlr_0000122_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5497919594973636530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_D4RTkcxeJUk/TEyIwAXyE1I/AAAAAAAAALU/Nzwj2E2KaFI/s1600/schhplttlr_0000198_sm.jpg" target="new"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://1.bp.blogspot.com/_D4RTkcxeJUk/TEyIwAXyE1I/AAAAAAAAALU/Nzwj2E2KaFI/s1600/schhplttlr_0000198_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5497919603427382098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;as usual i have to thank my pops for his help with the electronic stuff. initially i soldered all of the components as the relays were jumping out of the breadboard sockets, because of the fast switching i assume. however, this proved disastrous and in the midnight hour i de-soldered everything and used breadboards instead.&lt;br /&gt;&lt;br /&gt;as for the software on the arduino, one thing that had perplexed me was how to send an array of data to the arduino from processing. for the initial prototyping i was simply sending (per light group) a character for "on" (i.e. "Q") and then sending another character for "off" (i.e. "Z"), multiply this by 12 and you can see how ridiculous it is. i needed something that wasn't based on arbitrary key characters. &lt;br /&gt;&lt;br /&gt;since arduino is it's own little computer it's internal timing isn't in sync with the signal sending computer (my macbook), this is why you have to use a starter marker. arduino waits for the maker buff[0] = Serial.read(); and as soon as it sees it, i can then  tell arduino that everything following the marker is what it needs to use. i fill the rest of the buffer with these values for(int i=1; i&lt;13; i++) buff[i] = Serial.read(); in this case, 12 integers "0" or "1" which tell the output to be on or off.&lt;br /&gt;&lt;br /&gt;here's a simple example of the arduino code we used to control the lights.&lt;br /&gt;&lt;br /&gt;&lt;div class="code-box"&gt;int PIN_LICHT[3] = { 2,3,4 };&lt;br /&gt;&lt;br /&gt;//buffer should be long enough to hold the desired values&lt;br /&gt;//as well as the starter marker&lt;br /&gt;//i.e. L000&lt;br /&gt;byte buff[4];&lt;br /&gt;&lt;br /&gt;void setup() {&lt;br /&gt;  Serial.begin(9600);&lt;br /&gt;  for(int i=0; i&lt;3; i++) pinMode(PIN_LICHT[i], OUTPUT);     &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void loop() {&lt;br /&gt;  while( Serial.available() &gt;= 4 ) {&lt;br /&gt;    switch( byte(Serial.read()) ) {&lt;br /&gt;      &lt;br /&gt;      case 'L': //starter marker&lt;br /&gt;        buff[0] = Serial.read();&lt;br /&gt;        for(int i=1; i&lt;4; i++) buff[i] = Serial.read();&lt;br /&gt;&lt;br /&gt;      break;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //outputs&lt;br /&gt;  for(int i=0; i&lt;4; i++) {&lt;br /&gt;    if(buff[i] == 0) digitalWrite( PIN_LICHT[i], LOW );&lt;br /&gt;    else if(buff[i] == 1) digitalWrite( PIN_LICHT[i], HIGH );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;the software&lt;/b&gt;&lt;br /&gt;the light bulbs were controlled by rosanna's glove, each finger could control different pre-programmed patterns. the patterns controlled &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/TEqTBA_398I/AAAAAAAAAKc/EULw5geKqd8/s1600/Bild+1.png" target="new"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px;" src="http://4.bp.blogspot.com/_D4RTkcxeJUk/TEqTBA_398I/AAAAAAAAAKc/EULw5geKqd8/s1600/Bild+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5497367940816172994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;to make the bulbs flicker on and off as desired was a bit complicated. we had originally thought that each finger could control a group but this proved to be rather boring. so eugen programmed a rather ingenious pattern system. the patterns controlled just how much "color" (i.e. groupings of bulbs) could be on. this allowed us to control the build up of the performance. these patterns could be cycled through by the glove.&lt;br /&gt;&lt;br /&gt;the fluorescent lights were much easier to control one hit equals one light, regardless of which dancer sends the signal. the only exception was one of the dancers had a sensor on his shoe, when this was activated all of the fluorescents came on at once.&lt;br /&gt;&lt;br /&gt;we created an override feature for all of the lights incase during the performance we needed/wanted to turn certain groupings off&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;result&lt;/b&gt;&lt;br /&gt;the night of the performance went well, there's one glitch that still bothers me. the relays for the fluorescent lights will sometimes not switch off, keeping that group of fluorescents on. eugen and i tried for hours to solve the problem going one by one and replacing wires, relays, etc. i still have no idea what the problem could be. the only solution we found was to pop out the offending relay and put it back in. i had to do this once during the perfomance. reception and feedback has been great. this was a great project and we all learned a lot from it. &lt;br /&gt;&lt;br /&gt;in the near future i will post the code (processing and arduino) we used from the event. so i've started a google project for the source &lt;a href="http://code.google.com/p/schhplttlr/" target="new"&gt;http://code.google.com/p/schhplttlr/&lt;/a&gt; in the meantime if you're interested in the code just send me an email.&lt;br /&gt;&lt;br /&gt;also throughout the project we continually updated my &lt;a href="http://code.google.com/p/frederickk/" target="new"&gt;processing interface&lt;/a&gt; very soon i will update the archive on the google code page to reflect these changes which will include Timer and MultiTimer functions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-5031634576190779883?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2010/07/schhplttlr.html' title='schhplttlr'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/5031634576190779883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/5031634576190779883'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2010/07/schhplttlr.html' title='schhplttlr'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_D4RTkcxeJUk/TEwjLwI01eI/AAAAAAAAAK8/7abPjc0cn-E/s72-c/schhplttlr.informationFlow_01_kf-2.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-2457970501574344457</id><published>2010-07-05T08:18:00.002+02:00</published><updated>2010-07-05T08:27:13.057+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>processing. frederickk library update</title><content type='html'>i have updated my &lt;a href="http://code.google.com/p/frederickk/downloads/detail?name=frederickk_p5_002.zip"&gt;Frederickk&lt;/a&gt; processing library to reflect the structure of ofxFControl, with some minor tweaks and additions. namely the ability to be able to use a custom typeface for the interface elements. in addition i have updated some of the tools and added a very basic timer class. there are some examples in the download packet.&lt;br /&gt;&lt;br /&gt;gui elements&lt;br /&gt;&lt;b&gt;FCheck&lt;/b&gt;  check box/toggle&lt;br /&gt;&lt;b&gt;FKnob&lt;/b&gt;  button/knob&lt;br /&gt;&lt;b&gt;FMeter&lt;/b&gt;  slider as meter (top left)&lt;br /&gt;&lt;b&gt;FSlider&lt;/b&gt;  slider as slider (top right)&lt;br /&gt;&lt;br /&gt;tools&lt;br /&gt;&lt;b&gt;FDataReader&lt;/b&gt; loads images from a folder&lt;br /&gt;&lt;b&gt;FPalette&lt;/b&gt;  creates colors from an image&lt;br /&gt;&lt;b&gt;FTime&lt;/b&gt;  wrapper that returns the date date() as yymmdd or time time() as hhmmss&lt;/strike&gt;&lt;br /&gt;&lt;b&gt;FTimer&lt;/b&gt; basic timer function counts in miliseconds (1000 = 1sec)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;* as with most of the things found on this blog, the code works for me (osx 10.5.8) but i make no gurantees that it will work for you. however, feel free to update and hack anything useful out it. just let me know and please keep a link to this blog or my google code page&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-2457970501574344457?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2010/07/processing-frederickk-library-update.html' title='processing. frederickk library update'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/2457970501574344457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/2457970501574344457'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2010/07/processing-frederickk-library-update.html' title='processing. frederickk library update'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-2929665963348907634</id><published>2010-06-23T12:40:00.022+02:00</published><updated>2011-06-26T00:23:03.609+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openframeworks'/><category scheme='http://www.blogger.com/atom/ns#' term='scriptographer'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>code + openFrameworks</title><content type='html'>it's been a long while since i have posted anything. i have a couple of things in the works that should be wrapped up in the next month or so. in the meantime i've decided to join the google code club and will now be hosting my collection of code snippets/scripts/classes/libraries/apps that i've used and created, with/for &lt;a href="http://www.processing.org/"&gt;processing&lt;/a&gt;, &lt;a href="http://www.openframeworks.cc/"&gt;openFrameworks&lt;/a&gt;  and &lt;a href="http://www.scriptograper.com/"&gt;scriptographer&lt;/a&gt; at &lt;a href="http://code.google.com/p/frederickk/"&gt;http://code.google.com/p/frederickk/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;a couple of weeks ago i started playing around with &lt;a href="http://www.openframeworks.cc/"&gt;openFrameworks&lt;/a&gt;. i was surprised at how easily i was able to port some of my processing sketches over to c++. however, one thing that bothered me was a simple GUI, there's todd vanderlin's &lt;a href="http://www.toddvanderlin.com/OF/ofxSimpleGui.zip"&gt;ofxSimpleGui&lt;/a&gt; and mehmet akten's &lt;a href="http://code.google.com/p/ofxmsaof/"&gt;ofxSimpleGuiToo&lt;/a&gt; but i had trouble implementing them. mostly i assume because i'm very OF/c++ green. &lt;br /&gt;&lt;br /&gt;so i opted to cobble together my own GUI using concepts from an (until now i guess) unreleased &lt;a href="http://code.google.com/p/frederickk/"&gt;GUI and tools library*&lt;/a&gt; (see below) i made for processing and some concepts from todd's and mehmet's addons.&lt;br /&gt;&lt;br /&gt;i present &lt;a href="http://code.google.com/p/frederickk/downloads/detail?name=ofxFControl_001.zip"&gt;ofxFControl*&lt;/a&gt; (original name i know). there  are 4 elements, whose implementation you can see below.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ofxFCheck&lt;/b&gt;  check box/toggle&lt;br /&gt;&lt;b&gt;ofxFKnob&lt;/b&gt;  button/knob&lt;br /&gt;&lt;b&gt;ofxFMeter&lt;/b&gt;  slider as meter (top left)&lt;br /&gt;&lt;b&gt;ofxFSlider&lt;/b&gt;  slider as slider (top right)&lt;br /&gt;&lt;div class="code-box"&gt;&lt;br /&gt;.h&lt;br /&gt;ofxFControl FGUI;&lt;br /&gt;&lt;br /&gt;.cpp&lt;br /&gt;void testApp::setup() {&lt;br /&gt;  FGUI.addCheck("check_name", x,y, size, bool value);&lt;br /&gt;  FGUI.addKnob("knob_name", x,y, w,h);&lt;br /&gt;  FGUI.addMeter("meter_name", x,y, w,h, min,max, value);&lt;br /&gt;  FGUI.addSlider("slider_name", x,y, w,h, min,max, value);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void testApp::update() {&lt;br /&gt;  bool checkVal = FGUI.getBoolValue("check_name");&lt;br /&gt;&lt;br /&gt;  ofPoint knobVal = FGUI.getValue();&lt;br /&gt;&lt;br /&gt;  float meterFloatVal = FGUI.getFloatValue("meter_name");&lt;br /&gt;  float meterIntVal = FGUI.getIntValue("meter_name");&lt;br /&gt;&lt;br /&gt;  float sliderFloatVal = FGUI.getFloatValue("slider_name");&lt;br /&gt;  float sliderIntVal = FGUI.getIntValue("slider_name");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void testApp::draw() {&lt;br /&gt;  FGUI.create();&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/TCIFu04jxoI/AAAAAAAAAKI/txVC9ottIH0/s1600/ofxFControl_01.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/TCIFu04jxoI/AAAAAAAAAKI/txVC9ottIH0/s1600/ofxFControl_01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5485953598118676098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/TCIFuZYexQI/AAAAAAAAAKA/LgpLhtRSIxw/s1600/ofxFControl_00.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://4.bp.blogspot.com/_D4RTkcxeJUk/TCIFuZYexQI/AAAAAAAAAKA/LgpLhtRSIxw/s1600/ofxFControl_00.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5485953590736372994" /&gt;&lt;/a --&gt;&lt;br /&gt;granted the GUI from todd or mehmet is much better, with many more features. but for my purposes and maybe for the purposes of other beginners this is a nice "simple" implementation. at some point i'll implement the ability to have labels.&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;as for the processing library Frederickk (another original name), after coding the above OF addon, i'd like to completely overhaul the library from a GUI perspective. however some of the tools in the library may be of use to others out there. i apologize for the weird names and mix of german and english, i'll address that in a later release.&lt;/strike&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;* as with most of the things found on this blog, the code works for me (osx 10.5.8) but i make no gurantees that it will work for you. however, feel free to update and hack anything useful out it. just let me know and please keep a link to this blog or my google code page&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-2929665963348907634?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2010/06/code-openframeworks.html' title='code + openFrameworks'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/2929665963348907634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/2929665963348907634'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2010/06/code-openframeworks.html' title='code + openFrameworks'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_D4RTkcxeJUk/TCIFu04jxoI/AAAAAAAAAKI/txVC9ottIH0/s72-c/ofxFControl_01.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-5302838910486578918</id><published>2009-12-26T09:49:00.017+01:00</published><updated>2011-06-26T00:25:43.075+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>processing. 3d nonsense + data visualization</title><content type='html'>tis the season for extended hours with family, and in between the ten hour gatherings i've had nothing to do. so while whittling my downtime away i've been creating futile processing creations. mostly around the idea of basic 3d shapes. initially i was just reading brightness data from 8x8 images, and then spinning them around a central axis as well as their individual axis. &lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/8392104?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="518" height="389" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;this looked interesting enough, i thought let's add some type of meaning to it. so i decided to visit an old friend. weather visualization. pulling from the xml feed of &lt;a href="https://registration.weather.com/ursa/xmloap/step2?from=search_siteresults%3C1%3E" target="_blank"&gt;weather.com&lt;/a&gt;. by pulling the data in i started using the size of boxes to indicate temperature (hi &amp; low) and the speed of rotation to inidicate wind speed. &lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/8392135?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="518" height="389" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;these are trivial-useless-banal-held-together-with-bubble-gum-and-scotch-tape experiments but in doing so i at least managed to accomplish implementing a broader array of interface elements and custom classes for data pulling and management. ideally i was looking for to find a feed for historic weather data, so i could show extruded cubes that would show weather data for a month at a time and then by cycling through the various months visual patterns of weather would appear. however i was unable to find any site that would provide a feed of data beyond a 5 day forecast or current conditions. &lt;br /&gt;&lt;br /&gt;as it stands right now you can right click to add a new "weatherBox" type in a zip code (in a very crudely created text field interface). the placement of the "weatherBox" modules is correlated to their GPS coordinates on a globe. i'll upload the code to &lt;a href="http://openprocessing.org/portal/?userID=61" target="_blank"&gt;openprocessing&lt;/a&gt; soon.&lt;br /&gt;&lt;br /&gt;for now, here's my custom xml class for parsing out data from weather.com it may not be pretty code, but it's working. in the code you'll see "[PAR_ID]" and "[KEY]" these will have to be replaced with your own developer key which you can get &lt;a href="https://registration.weather.com/ursa/xmloap/step2?from=search_siteresults%3C1%3E" target="_blank"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code-box"&gt;class Weather {&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //properties&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  PApplet p;&lt;br /&gt;  XMLElement xml;&lt;br /&gt;  private String ort, feed;&lt;br /&gt;  private String dauer = "5";&lt;br /&gt;  boolean werror;&lt;br /&gt;&lt;br /&gt;  //location();&lt;br /&gt;  String dham,&lt;br /&gt;    tm,&lt;br /&gt;    lat,&lt;br /&gt;    lon,&lt;br /&gt;    //sunr,&lt;br /&gt;    //suns,&lt;br /&gt;    zone;&lt;br /&gt;&lt;br /&gt;  //current()&lt;br /&gt;  String lsup,&lt;br /&gt;    obst,&lt;br /&gt;    tmp,&lt;br /&gt;    flik,&lt;br /&gt;    t,&lt;br /&gt;    bar_r,&lt;br /&gt;    bar_d,&lt;br /&gt;    wind_s,&lt;br /&gt;    wind_gust,&lt;br /&gt;    wind_d,&lt;br /&gt;    wind_t,&lt;br /&gt;    hmid,&lt;br /&gt;    vis,&lt;br /&gt;    uv_i,&lt;br /&gt;    uv_t,&lt;br /&gt;    dewp,&lt;br /&gt;    moon_t;&lt;br /&gt;&lt;br /&gt;  //forecast()&lt;br /&gt;  String hi,&lt;br /&gt;    low,&lt;br /&gt;    sunr,&lt;br /&gt;    suns,&lt;br /&gt;    part_day_t,&lt;br /&gt;    part_day_wind_s,&lt;br /&gt;    part_day_wind_gust,&lt;br /&gt;    part_day_wind_d,&lt;br /&gt;    part_day_wind_t,&lt;br /&gt;    part_day_bt,&lt;br /&gt;    part_day_ppcp,&lt;br /&gt;    part_day_hmid,&lt;br /&gt;    part_night_t,&lt;br /&gt;    part_night_wind_s,&lt;br /&gt;    part_night_wind_gust,&lt;br /&gt;    part_night_wind_d,&lt;br /&gt;    part_night_wind_t,&lt;br /&gt;    part_night_bt,&lt;br /&gt;    part_night_ppcp,&lt;br /&gt;    part_night_hmid;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //constructor&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  Weather(PApplet p, String ort) {&lt;br /&gt;    this.p = p;&lt;br /&gt;    this.ort = ort;&lt;br /&gt;&lt;br /&gt;    setOrt(ort);&lt;br /&gt;    //println(xml);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //weather&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  private void location() {&lt;br /&gt;    try {&lt;br /&gt;      XMLElement loc = xml.getChild(1);&lt;br /&gt;&lt;br /&gt;      dham = loc.getChild(0).getContent();&lt;br /&gt;      tm = loc.getChild(1).getContent();&lt;br /&gt;      lat = loc.getChild(2).getContent();&lt;br /&gt;      lon = loc.getChild(3).getContent();&lt;br /&gt;      sunr = loc.getChild(4).getContent();&lt;br /&gt;      suns = loc.getChild(5).getContent();&lt;br /&gt;      zone = loc.getChild(6).getContent();&lt;br /&gt;&lt;br /&gt;      XMLElement cc = xml.getChild(3);&lt;br /&gt;&lt;br /&gt;      lsup = cc.getChild(0).getContent();&lt;br /&gt;    } catch(Exception e) {&lt;br /&gt;      println("Error location(): " + e);&lt;br /&gt;      werror = true;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void current() {&lt;br /&gt;    try {&lt;br /&gt;      XMLElement cc = xml.getChild(3);&lt;br /&gt;  &lt;br /&gt;      obst = cc.getChild(1).getContent();&lt;br /&gt;      tmp = cc.getChild(2).getContent();&lt;br /&gt;      flik = cc.getChild(3).getContent();&lt;br /&gt;      t = cc.getChild(4).getContent();&lt;br /&gt;  &lt;br /&gt;      bar_r = cc.getChild(6).getChild(0).getContent();&lt;br /&gt;      bar_d = cc.getChild(6).getChild(1).getContent();&lt;br /&gt;  &lt;br /&gt;      wind_s = cc.getChild(7).getChild(0).getContent();&lt;br /&gt;      wind_gust = cc.getChild(7).getChild(1).getContent();&lt;br /&gt;      wind_d = cc.getChild(7).getChild(2).getContent();&lt;br /&gt;      wind_t = cc.getChild(7).getChild(3).getContent();&lt;br /&gt;  &lt;br /&gt;      hmid = cc.getChild(8).getContent();&lt;br /&gt;      vis = cc.getChild(9).getContent();&lt;br /&gt;  &lt;br /&gt;      uv_i = cc.getChild(10).getChild(0).getContent();&lt;br /&gt;      uv_t = cc.getChild(10).getChild(1).getContent();&lt;br /&gt;  &lt;br /&gt;      dewp = cc.getChild(11).getContent();&lt;br /&gt;  &lt;br /&gt;      moon_t = cc.getChild(12).getChild(1).getContent();&lt;br /&gt;    } catch(Exception e) {&lt;br /&gt;      println("Error current(): " + e);&lt;br /&gt;      werror = true;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void forecast(int d) {&lt;br /&gt;    try {&lt;br /&gt;      d = d+1;&lt;br /&gt;      XMLElement dayf = xml.getChild(4);&lt;br /&gt;      //println("DAYF");&lt;br /&gt;      //println(dayf);&lt;br /&gt;&lt;br /&gt;      XMLElement _day = dayf.getChild(d);&lt;br /&gt;      //println("DAY");&lt;br /&gt;      //println(_day);&lt;br /&gt;  &lt;br /&gt;      hi = _day.getChild(0).getContent();&lt;br /&gt;      low = _day.getChild(1).getContent();&lt;br /&gt;      sunr = _day.getChild(2).getContent();&lt;br /&gt;      suns = _day.getChild(3).getContent();&lt;br /&gt;      &lt;br /&gt;      //day&lt;br /&gt;      part_day_t = _day.getChild(4).getChild(1).getContent();&lt;br /&gt;  &lt;br /&gt;      part_day_wind_s = _day.getChild(4).getChild(2).getChild(0).getContent();&lt;br /&gt;      part_day_wind_gust = _day.getChild(4).getChild(2).getChild(1).getContent();&lt;br /&gt;      part_day_wind_d = _day.getChild(4).getChild(2).getChild(2).getContent();&lt;br /&gt;      part_day_wind_t = _day.getChild(4).getChild(2).getChild(3).getContent();&lt;br /&gt;  &lt;br /&gt;      part_day_bt = _day.getChild(4).getChild(3).getContent();&lt;br /&gt;      part_day_ppcp = _day.getChild(4).getChild(4).getContent();&lt;br /&gt;      part_day_hmid = _day.getChild(4).getChild(5).getContent();&lt;br /&gt;  &lt;br /&gt;      //night&lt;br /&gt;      part_night_t = _day.getChild(5).getChild(1).getContent();&lt;br /&gt;  &lt;br /&gt;      part_night_wind_s = _day.getChild(5).getChild(2).getChild(0).getContent();&lt;br /&gt;      part_night_wind_gust = _day.getChild(5).getChild(2).getChild(1).getContent();&lt;br /&gt;      part_night_wind_d = _day.getChild(5).getChild(2).getChild(2).getContent();&lt;br /&gt;      part_night_wind_t = _day.getChild(5).getChild(2).getChild(3).getContent();&lt;br /&gt;  &lt;br /&gt;      part_night_bt = _day.getChild(5).getChild(3).getContent();&lt;br /&gt;      part_night_ppcp = _day.getChild(5).getChild(4).getContent();&lt;br /&gt;      part_night_hmid = _day.getChild(5).getChild(5).getContent();&lt;br /&gt;&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;      println(e);&lt;br /&gt;      werror = true;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //sets&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  void setOrt(String ort) {&lt;br /&gt;    this.ort = ort;&lt;br /&gt;    println(ort + "!");&lt;br /&gt;    feed = "http://xoap.weather.com/weather/local/" + ort + "?cc=*&amp;dayf=" + dauer + "&amp;link=xoap&amp;prod=xoap&amp;par=[PAR_ID]&amp;key=[KEY]";&lt;br /&gt;    xml = new XMLElement(p, feed);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //gets&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  boolean getWerror() {&lt;br /&gt;    return werror;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  String getOrt() {&lt;br /&gt;    ort = xml.getChild(1).getChild(0).getContent();&lt;br /&gt;    return ort;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  void setDauer(int dauer) {&lt;br /&gt;    this.dauer = str(dauer);&lt;br /&gt;  }  &lt;br /&gt;  String getDauer() {&lt;br /&gt;    return dauer;&lt;br /&gt;  }&lt;br /&gt;  int getDauerInt() {&lt;br /&gt;    return int(dauer);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  String[] getLocation() {&lt;br /&gt;    location();&lt;br /&gt;    String[] loc = {lsup, dham, tm, lat, lon, sunr, suns, zone};&lt;br /&gt;    return loc;&lt;br /&gt;  }&lt;br /&gt;  String[] getCurrent() {&lt;br /&gt;    current();&lt;br /&gt;    String[] cc = {obst, tmp, flik, t, bar_r, bar_d, wind_s, wind_gust, wind_d, wind_t, hmid, vis, uv_i, uv_t, dewp, moon_t};&lt;br /&gt;    return cc;&lt;br /&gt;  }&lt;br /&gt;  String[][] getForecast() {&lt;br /&gt;    String[][] fo = new String[int(dauer)][20]; &lt;br /&gt;    for(int i=0; i&lt;(int) dauer; i++) {&lt;br /&gt;      forecast(i);&lt;br /&gt;      fo[i][0] = hi;&lt;br /&gt;      fo[i][1] = low;&lt;br /&gt;      fo[i][2] = sunr;&lt;br /&gt;      fo[i][3] = suns;&lt;br /&gt;      fo[i][4] = part_day_t;&lt;br /&gt;      fo[i][5] = part_day_wind_s;&lt;br /&gt;      fo[i][6] = part_day_wind_gust;&lt;br /&gt;      fo[i][7] = part_day_wind_d;&lt;br /&gt;      fo[i][8] = part_day_wind_t;&lt;br /&gt;      fo[i][9] = part_day_bt;&lt;br /&gt;      fo[i][10] = part_day_ppcp;&lt;br /&gt;      fo[i][11] = part_day_hmid;&lt;br /&gt;      fo[i][12] = part_night_t;&lt;br /&gt;      fo[i][13] = part_night_wind_s;&lt;br /&gt;      fo[i][14] = part_night_wind_gust;&lt;br /&gt;      fo[i][15] = part_night_wind_d;&lt;br /&gt;      fo[i][16] = part_night_wind_t;&lt;br /&gt;      fo[i][17] = part_night_bt;&lt;br /&gt;      fo[i][18] = part_night_ppcp;&lt;br /&gt;      fo[i][19] = part_night_hmid;&lt;br /&gt;    }&lt;br /&gt;    return fo;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-5302838910486578918?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/12/processing-3d-nonsense-data.html' title='processing. 3d nonsense + data visualization'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/5302838910486578918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/5302838910486578918'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/12/processing-3d-nonsense-data.html' title='processing. 3d nonsense + data visualization'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-8044433119208144222</id><published>2009-11-25T19:55:00.005+01:00</published><updated>2011-06-26T00:20:25.199+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>processing. twitter + madlib</title><content type='html'>since moving to munich, my time has been spent filling out paperwork, looking for work, looking for apartments, and realizing how bad my german has become. this of course leaves me no time to actually do stuff. i have some other stuff in the works that i started in san francisco, but it's not ready by any means yet. &lt;br /&gt;&lt;br /&gt;that said, to close the gap and make myself not feel so lazy. here's a project i completed back in april of this year. i had started it much earlier, but i made myself complete it in time for a &lt;a href="http://kenfrederick.blogspot.com/2009/05/arduino-digi-sketch.html"&gt;presentation&lt;/a&gt; i gave when i worked at &lt;a href="http://www.landor.com/"&gt;landor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;basically it's a mashup (is that right?) of twitter + &lt;a href="http://en.wikipedia.org/wiki/Mad_Libs" target="new"&gt;madlibs&lt;/a&gt; + &lt;a href="http://webcamxtra.sourceforge.net/reference.shtml#trackcolor" target="new"&gt;color tracking&lt;/a&gt;. i used blue light because we had a box full of lovely &lt;a href="http://www.underconsideration.com/brandnew/archives/smile_you_are_on_security_came.php" target="new"&gt;brinks LED-keychains&lt;/a&gt; in the office. &lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/16153740?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="518" height="400" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;my idea was to create a modular and interact-able mad lib. using space as a medium of control, whenever a person moves in the room the story changes. on top of that using twitter as a means to augment the list of words used.&lt;br /&gt;&lt;br /&gt;using a series of hashtags on twitter to represent the word types required for the story, desired words need to be added one hash tag at a time. if you mess up, there isn't a way to correct it, as even deleted entries remain in twitter's search cache for a while.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;#s_noun&lt;/b&gt; (singular noun)&lt;br /&gt;&lt;b&gt;#p_noun&lt;/b&gt; (plural noun)&lt;br /&gt;&lt;b&gt;#s_adj&lt;/b&gt; (singular adjective)&lt;br /&gt;&lt;b&gt;#n_number&lt;/b&gt; (number)&lt;br /&gt;&lt;b&gt;#s_lat&lt;/b&gt; (&lt;a href="http://en.wikipedia.org/wiki/Comparison_(grammar)" target="new"&gt;superlative&lt;/a&gt;)&lt;br /&gt;&lt;b&gt;#s_verb&lt;/b&gt; (singular verb)&lt;br /&gt;&lt;b&gt;#p_verb&lt;/b&gt; (plural verb)&lt;br /&gt;&lt;b&gt;#pt_verb&lt;/b&gt; (past-tense verb)&lt;br /&gt;&lt;b&gt;#p_name&lt;/b&gt; (proper name)&lt;br /&gt;&lt;b&gt;#p_place&lt;/b&gt; (place)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/Sw3dnvpOwKI/AAAAAAAAAI8/gihOjuSpGOs/s1600/Bild+3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://4.bp.blogspot.com/_D4RTkcxeJUk/Sw3dnvpOwKI/AAAAAAAAAI8/gihOjuSpGOs/s1600/Bild+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5408222402415870114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_D4RTkcxeJUk/Sw3dn1XqgFI/AAAAAAAAAJE/fTd4wNp0MPI/s1600/Bild+5.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://1.bp.blogspot.com/_D4RTkcxeJUk/Sw3dn1XqgFI/AAAAAAAAAJE/fTd4wNp0MPI/s1600/Bild+5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5408222403952803922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;at first i tried to access the twitter api using processing's built in xml library, but that didn't go so well so in the end i used the &lt;a href="http://yusuke.homeip.net/twitter4j/en/index.html" target="new"&gt;twitter4j&lt;/a&gt; library. however, it's reference/api was cumbersome for me to understand so i ended up writing my own class to handle accessing the data. it's a little sloppy and maybe there's an easier way. make sure you add the twitter4j .jar to your sketch&lt;br /&gt;&lt;br /&gt;&lt;div class="code-box"&gt;//-----------------------------------------------------------------------------&lt;br /&gt;//libraries&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;import twitter4j.*;&lt;br /&gt;//import processing.core.*;&lt;br /&gt;//import processing.xml.*;&lt;br /&gt;import java.text.SimpleDateFormat;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public interface FTwitterConstants {&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //services&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  static final String TIMELINE_URL = "http://twitter.com/statuses/public_timeline.xml";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class FTwitter implements FTwitterConstants {&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //properties&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  private PApplet p5;&lt;br /&gt;&lt;br /&gt;  private Twitter t;&lt;br /&gt;  private java.util.List search;&lt;br /&gt;&lt;br /&gt;  private String name = "";&lt;br /&gt;  private String pass = "";&lt;br /&gt;  private String term = "";&lt;br /&gt;  private String[] entry;&lt;br /&gt;&lt;br /&gt;  private boolean date;&lt;br /&gt;  SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //constructor&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  /**&lt;br /&gt;   * instantiate FTwitter&lt;br /&gt;   * &lt;br /&gt;   * @param thePApplet&lt;br /&gt;   *       PApplet&lt;br /&gt;   */&lt;br /&gt;  public FTwitter(PApplet papplet) {&lt;br /&gt;    p5 = papplet;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * instantiate FTwitter&lt;br /&gt;   * &lt;br /&gt;   * @param thePApplet&lt;br /&gt;   *       PApplet&lt;br /&gt;   * @param _name&lt;br /&gt;   *       username&lt;br /&gt;   * @param _pass&lt;br /&gt;   *       password&lt;br /&gt;   */&lt;br /&gt;  public FTwitter(PApplet papplet, String _name, String _pass) {&lt;br /&gt;    p5 = papplet;&lt;br /&gt;    setName( _name );&lt;br /&gt;    setPassword( _pass );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //methods&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  /**&lt;br /&gt;   * search public tweets&lt;br /&gt;   * &lt;br /&gt;   * @param _term&lt;br /&gt;   *       the search term&lt;br /&gt;   */&lt;br /&gt;  public void search(String _term) {&lt;br /&gt;    term = _term;&lt;br /&gt;&lt;br /&gt;    t = new Twitter(name,pass);&lt;br /&gt;    Query q = new Query(term);&lt;br /&gt;    q.setRpp(100);&lt;br /&gt;    //q.setSinceId(0);&lt;br /&gt;&lt;br /&gt;    try {&lt;br /&gt;      QueryResult result = t.search(q);&lt;br /&gt;      search = result.getTweets();&lt;br /&gt;&lt;br /&gt;      /*&lt;br /&gt;          System.out.println("-----------------------------------------------------------------------------");&lt;br /&gt;          System.out.println("TwitterCollect.term: " + term );&lt;br /&gt;          System.out.println("-----------------------------------------------------------------------------");&lt;br /&gt;          System.out.println("TwitterCollect.result:");&lt;br /&gt;          System.out.println(result);&lt;br /&gt;       */&lt;br /&gt;    &lt;br /&gt;    } catch( TwitterException e) {&lt;br /&gt;      System.out.println("error on twitter status collect");&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //sets&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  /**&lt;br /&gt;   * @param _name&lt;br /&gt;   *       username&lt;br /&gt;   */&lt;br /&gt;  public void setName(String _name) {&lt;br /&gt;    name = _name;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * @param _pass&lt;br /&gt;   *       password&lt;br /&gt;   */&lt;br /&gt;  public void setPassword(String _pass) {&lt;br /&gt;    pass = _pass;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * @param _date&lt;br /&gt;   *       XXX&lt;br /&gt;   */&lt;br /&gt;  public void setDate(boolean _date) {&lt;br /&gt;    date = _date;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //gets&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  /**&lt;br /&gt;   * @param w&lt;br /&gt;   *       XXX&lt;br /&gt;   */&lt;br /&gt;  public String getWord(int w) {&lt;br /&gt;    Tweet tweet = (Tweet) search.get(w);&lt;br /&gt;    String word = tweet.getText();&lt;br /&gt;    System.out.println("TwitterCollect.tweet: " + word);&lt;br /&gt;&lt;br /&gt;    String n_word = "";&lt;br /&gt;    String[] tweetList = PApplet.split(word, ' ');&lt;br /&gt;&lt;br /&gt;    for(int i=0; i!=tweetList.length; i++) {&lt;br /&gt;      if( !PApplet.trim(tweetList[i]).equals(term) ) {&lt;br /&gt;        if(i != tweetList.length-1) n_word += PApplet.trim(tweetList[i]) + " ";&lt;br /&gt;        else n_word += PApplet.trim(tweetList[i]);&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return n_word;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * return search results from twitter public feed&lt;br /&gt;   * &lt;br /&gt;   * @return publicText&lt;br /&gt;   */&lt;br /&gt;  public String[] getPublicTimeline() {&lt;br /&gt;    t = new Twitter();&lt;br /&gt;    XMLElement xml = new XMLElement(p5, TIMELINE_URL);&lt;br /&gt;    String[] publicText;&lt;br /&gt;&lt;br /&gt;    if(xml != null) {&lt;br /&gt;      int numSites = xml.getChildCount();&lt;br /&gt;&lt;br /&gt;      publicText = new String[numSites];&lt;br /&gt;      for (int i=0; i&amp;#60;numSites; i++) {&lt;br /&gt;        XMLElement stat = xml.getChild(i);&lt;br /&gt;        XMLElement[] statText = stat.getChildren("text");&lt;br /&gt;        publicText[i] = statText[0].getContent();&lt;br /&gt;        System.out.println(statText[0].getContent());&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      return publicText;&lt;br /&gt;&lt;br /&gt;    } else {&lt;br /&gt;      return null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * return the number of search results&lt;br /&gt;   * &lt;br /&gt;   * @return search.size()&lt;br /&gt;   */&lt;br /&gt;  public int getSearchNum() {&lt;br /&gt;    return search.size();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * @param w&lt;br /&gt;   *          index of status to return&lt;br /&gt;   *          &lt;br /&gt;   * return the number of search results&lt;br /&gt;   * &lt;br /&gt;   * @return entry[w]&lt;br /&gt;   */&lt;br /&gt;  public String getStatus(int w) {&lt;br /&gt;    return entry[w];&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;g = toggle sensor grid&lt;br /&gt;m = toggle mouse or LED control&lt;br /&gt;t = manually query twitter for updates&lt;br /&gt;v = toggle video display (for debugging of LED control)&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;unfortunately i didn't get any video of it working, but maybe i'll have a chance to present it again and it doesn't seem to want to work on the web&lt;/strike&gt;, but you can grab the source &lt;a href="http://openprocessing.org/visuals/?visualID=14157" target="new"&gt;nakedLunchMadLib 1.0&lt;/a&gt; and &lt;br /&gt;&lt;br /&gt;still to do:&lt;br /&gt;- mirror coordinates (webcam)&lt;br /&gt;&lt;br /&gt;and maybe one day:&lt;br /&gt;- changing of LED detection color dynamically&lt;br /&gt;- &lt;strike&gt;change the base story&lt;/strike&gt;&lt;br /&gt;- &lt;strike&gt;manually input word lists as well as through twitter&lt;/strike&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-8044433119208144222?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/11/processing-madlib.html' title='processing. twitter + madlib'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/8044433119208144222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/8044433119208144222'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/11/processing-madlib.html' title='processing. twitter + madlib'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_D4RTkcxeJUk/Sw3dnvpOwKI/AAAAAAAAAI8/gihOjuSpGOs/s72-c/Bild+3.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-1675420155583717743</id><published>2009-09-30T15:52:00.010+02:00</published><updated>2011-06-25T23:03:45.440+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>processing. particles</title><content type='html'>i know i'm about 5 years behind everyone else, but it seems like everyone is playing with particle systems but me and then of course you see all of the cool things that people like &lt;a href="www.flight404.com/" target="new"&gt;robert hodgin&lt;/a&gt; and &lt;a href="http://toxi.co.uk/" target="new"&gt;karsten schmidt&lt;/a&gt; are doing.&lt;br /&gt;&lt;br /&gt;at first i simply tried using the &lt;a href="http://www.cs.princeton.edu/%7Etraer/physics/" target="new"&gt;traer physics library&lt;/a&gt; for processing, but i couldn't get it to do what i wanted. then i started digging for code in the forums and eventually just modified daniel shiffman's &lt;a href="http://processing.org/learning/topics/simpleparticlesystem.html" target="new"&gt;simple particle system&lt;/a&gt; i simplified it so that i could learn what was going on. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;particle&lt;/b&gt;&lt;br /&gt;the result is a very simple implementation using pixel brightness from an image to determine point size, as the particles move (fall) on the screen. their x and y coordinates are mapped to the image and the size changes accordingly.&lt;br /&gt;&lt;br /&gt;&lt;object width="518" height="518"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6833114&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6833114&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="518" height="518"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="518" height="518"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6833452&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6833452&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="518" height="518"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;grab the source code &lt;a href="http://openprocessing.org/visuals/?visualID=4865" target="new"&gt;sparticle_0_2_5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;boidicle&lt;/b&gt;&lt;br /&gt;i added some boid functionality to it as well, i can't remember where i found it exactly, but i believe it was in the forums, i modified it a little bit as well.&lt;br /&gt;&lt;br /&gt;&lt;object width="518" height="518"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6835415&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6835415&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="518" height="518"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="518" height="518"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6835166&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6835166&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="518" height="518"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;grab the source code &lt;a href="http://openprocessing.org/visuals/?visualID=4867" target="new"&gt;sparticle_0_3_5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;now that i've gotten my toes wet, i just need to learn more about creating my own particle class and implementing it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;color palettes&lt;/b&gt;&lt;br /&gt;on a somewhat related note, one thing i use a lot is a color palette loading class. i wrote the code myself, but admittedly i borrowed the idea from &lt;a href="http://sansumbrella.com/" target="new"&gt;david wicks&lt;/a&gt; after we worked on a &lt;a href="http://landor.com/salonsf" target="new"&gt;project&lt;/a&gt; together. here's the source code for my palette loading class, you can use the colors of an image as the colors in your sketch.&lt;br /&gt;&lt;br /&gt;&lt;div class="code-box"&gt;class Palette {&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //properties&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  PImage bild;&lt;br /&gt;  color[] farbe;&lt;br /&gt;  &lt;br /&gt;  int loc;&lt;br /&gt;  &lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  //constructor&lt;br /&gt;  //-----------------------------------------------------------------------------&lt;br /&gt;  Palette(String pfad) {&lt;br /&gt;    bild = loadImage(pfad);&lt;br /&gt;    farbe = new color[bild.width*bild.height];&lt;br /&gt;    int index = 0;&lt;br /&gt;&lt;br /&gt;     for (int i=0; i&amp;#60;bild.width; i++) {&lt;br /&gt;       for (int j=0; j&amp;#60;bild.height; j++) {&lt;br /&gt;         //-----------------------------------------------------------------------------&lt;br /&gt;         //get the color and location of images pixels&lt;br /&gt;         //-----------------------------------------------------------------------------&lt;br /&gt;         loc = i + j*bild.width; &lt;br /&gt;         farbe[index] = bild.pixels[loc];&lt;br /&gt;&lt;br /&gt;         index++;&lt;br /&gt;       }  &lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   //-----------------------------------------------------------------------------&lt;br /&gt;   //gets&lt;br /&gt;   //-----------------------------------------------------------------------------&lt;br /&gt;   color[] getFarben() {&lt;br /&gt;     return farbe;&lt;br /&gt;   }&lt;br /&gt;   color getFarbe(int w) {&lt;br /&gt;     return farbe[w];&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   int getFarbeZahl() {&lt;br /&gt;     return farbe.length;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   color getFarbeTrans(int w, float wert) {&lt;br /&gt;     float r = red(farbe[w]);&lt;br /&gt;     float g = green(farbe[w]);&lt;br /&gt;     float b = blue(farbe[w]);&lt;br /&gt;&lt;br /&gt;     color farbeTrans = color(r,g,b, 255*wert);&lt;br /&gt;     return farbeTrans;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt; }&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-1675420155583717743?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/09/particles.html' title='processing. particles'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/1675420155583717743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/1675420155583717743'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/09/particles.html' title='processing. particles'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-791265135544963417</id><published>2009-08-08T18:13:00.000+02:00</published><updated>2009-08-15T02:02:43.834+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc.'/><title type='text'>hands on. continued.</title><content type='html'>a couple of months ago i posted about how "&lt;a href="http://kenfrederick.blogspot.com/2009/05/hands-on.html"&gt;digital and physical worlds is becoming ever blurrier.&lt;/a&gt;" and a future which is uses physically interactive interfaces.&lt;br /&gt;&lt;br /&gt;in this &lt;a href="http://www.creativereview.co.uk/back-issues/creative-review/2009/july-2009/maps-for-these-territories" target="new"&gt;interview with ben fry&lt;/a&gt; at creative review he talked about a start up called &lt;a href="http://oblong.com/" target="new"&gt;oblong&lt;/a&gt; whose founders worked as consultants for &lt;a href="http://www.imdb.com/title/tt0181689/" target"new"&gt;minority report&lt;/a&gt;. they're thesis work was around creating the interface that you see in the movie.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/NwVBzx0LMNQ&amp;hl=de&amp;fs=1&amp;"&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/NwVBzx0LMNQ&amp;hl=de&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2229299&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=2229299&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Oblong Industries is the developer of the g-speak spatial operating environment.&lt;br /&gt;&lt;br /&gt;The SOE's combination of gestural i/o, recombinant networking, and real-world pixels brings the first major step in computer interface since 1984; starting today, g-speak will fundamentally change the way people use machines at work, in the living room, in conference rooms, in vehicles. The g-speak platform is a complete application development and execution environment that redresses the dire constriction of human intent imposed by traditional GUIs. Its idiom of spatial immediacy and information responsive to real-world geometry enables a necessary new kind of work: data-intensive, embodied, real-time, predicated on universal human expertise&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;i've been intrigued by &lt;a href="http://en.wikipedia.org/wiki/Radio-frequency_identification" target="new"&gt;RFID&lt;/a&gt; lately as well. i have some rudimentary ideas i want to play with using &lt;a href="http://www.arduino.cc" target="new"&gt;arduino&lt;/a&gt; some of which i've read about in &lt;a href="http://www.amazon.com/Making-Things-Talk-Practical-Connecting/dp/0596510519/ref=sr_1_1?ie=UTF8&amp;qid=1249854830&amp;sr=8-1" target="new"&gt;making things talk&lt;/a&gt; which i bought at the maker faire. &lt;br /&gt;&lt;br /&gt;this is a pretty interesting use of &lt;a href="http://www.spatialrobots.com/2009/07/rfid-wall-by-schematic/" target="new"&gt;RFID and multi-touch surface&lt;/a&gt; at the 2009 cannes festival.&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5192300&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=5192300&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;at some point RFID identification (or something similar) will be more prevalent, if not the dominant way in which we identity ourselves, and it will only enhance our experience with immersive physical interfaces, etc. however, some of the &lt;a href="http://www.engadget.com/2009/02/02/video-hacker-war-drives-san-francisco-cloning-rfid-passports/" target="new"&gt;privacy issues&lt;/a&gt; will obviously have to resolved going forward. &lt;br /&gt;&lt;br /&gt;all of this makes me excited about a future where stuff can be created virtually using hands.&lt;br /&gt;&lt;br /&gt;yet another last minute addition to this onslaught of creating things more physically and intuitively. &lt;a href="http://rhondaforever.com/" target="new"&gt;rhonda&lt;/a&gt; is built using &lt;a href="http://openframeworks.cc/" target="new"&gt;OpenFrameworks&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;embed src="http://blip.tv/play/g%2BQBgZLQTgI%2Em4v" type="application/x-shockwave-flash" width="480" height="390" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-791265135544963417?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/08/hands-on-update.html' title='hands on. continued.'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/791265135544963417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/791265135544963417'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/08/hands-on-update.html' title='hands on. continued.'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-7542167553408587326</id><published>2009-07-16T06:03:00.005+02:00</published><updated>2011-06-26T00:14:21.361+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><category scheme='http://www.blogger.com/atom/ns#' term='experiment'/><title type='text'>processing. color as language</title><content type='html'>i have a huge interest in language, and the translation or transposition from language to language is fascinating. the "lost in translation" project &lt;a href="http://tashian.com/multibabel/" target="new"&gt;http://tashian.com/multibabel/&lt;/a&gt; is a good example of the changes language undergoes when translated back and forth between multiple languages.&lt;br /&gt;&lt;br /&gt;but in the same vein as my &lt;a href="http://kenfrederick.blogspot.com/2009/04/processing-tonal-visualization.html"&gt;processing. tonal visualization&lt;/a&gt; which is an experiment in translating music into graphics. this project is an attempt to translate words into color (or colors).&lt;br /&gt;&lt;br /&gt;harnessing the tags of &lt;a href="http://adobe.kuler.com/" target="new"&gt;kuler&lt;/a&gt; and the content from everyones latest interest &lt;a href="http://www.twitter.com/" target="new"&gt;twitter&lt;/a&gt;. it simply pulls the latest tweet from &lt;a href="http://twitter.com/public_timeline" target="new"&gt;twitter's public timeline&lt;/a&gt; every 2 minutes and then filters words less than two letters (i.e. a, an, I, of, is, it, etc.) cross referencing tags and text from &lt;a href="http://adobe.kuler.com/" target="new"&gt;kuler&lt;/a&gt; to determine the colors. &lt;br /&gt;&lt;br /&gt;an example of what a typical tweet &lt;b&gt;"RT @SwSatchidananda: 'Realize the never-changing, enjoy the ever-changing. Both are necessary.'"&lt;/b&gt; when it's distilled down to &lt;b&gt;"RT the enjoy the Both are necessary.'"&lt;/b&gt; would look like in colors:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/Sl6wU4KDjZI/AAAAAAAAAHg/4LDFVn5fzMs/s1600-h/kulerSprache_0_4_20090715_183351.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/Sl6wU4KDjZI/AAAAAAAAAHg/4LDFVn5fzMs/s1600/kulerSprache_0_4_20090715_183351.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5358914479335902610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_D4RTkcxeJUk/Sl60iKwYq6I/AAAAAAAAAHo/fV8WzhuQIYA/s1600-h/kulerSprache.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px;" src="http://1.bp.blogspot.com/_D4RTkcxeJUk/Sl60iKwYq6I/AAAAAAAAAHo/fV8WzhuQIYA/s1600/kulerSprache.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5358919105713318818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;the code might be a bit sloppy, i initially planned to use the &lt;a href="http://code.google.com/p/colorlib/" target="new"&gt; colorlib&lt;/a&gt; to grab data from kuler, but it didn't offer easy access to tags so i simply re-wrote my own class Kuler.pde (source below) to access and parse data from kuler. in order to access to twitter i'm using &lt;a href="http://yusuke.homeip.net/twitter4j/en/index.html" target="new"&gt;twitter4j&lt;/a&gt; but accessing it's structure is a pain (at least i think it is) so i wrote a class (&lt;a href="https://github.com/frederickk/frederickk/blob/master/src/frederickk/api/twitter/FTwitter.java" target="new"&gt;FTwitte.java&lt;/a&gt;) that makes it easier to access twitter4j's methods.&lt;br /&gt;&lt;br /&gt;&lt;div class="code-box"&gt;public class Kuler {&lt;br /&gt;&lt;br /&gt;  // -----------------------------------------------------------------------------&lt;br /&gt;  // properties&lt;br /&gt;  // -----------------------------------------------------------------------------&lt;br /&gt;  PApplet p;&lt;br /&gt;&lt;br /&gt;  private String serverPage = "http://kuler-api.adobe.com/rss/";&lt;br /&gt;  private String typ;&lt;br /&gt;  private String pageTyp = ".cfm";&lt;br /&gt;&lt;br /&gt;  private int maxItems = 1;&lt;br /&gt;  private int startIndex = 0;&lt;br /&gt;&lt;br /&gt;  private String query;&lt;br /&gt;  private String key = __YOUR_KULER_KEY__;&lt;br /&gt;&lt;br /&gt;  private String[] KulerThemes;&lt;br /&gt;&lt;br /&gt;  private XMLElement[] themeItems;&lt;br /&gt;  private XMLElement themeItem;&lt;br /&gt;&lt;br /&gt;  private XMLElement[] themeSwatches;&lt;br /&gt;  private XMLElement[] themeTag;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  // -----------------------------------------------------------------------------&lt;br /&gt;  // constructor&lt;br /&gt;  // -----------------------------------------------------------------------------&lt;br /&gt;  public Kuler(PApplet parent) {&lt;br /&gt;    p = parent;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  // -----------------------------------------------------------------------------&lt;br /&gt;  // methods&lt;br /&gt;  // -----------------------------------------------------------------------------&lt;br /&gt;  public void init(String query, String typ) { &lt;br /&gt;    String url = serverPage + typ + pageTyp + "?itemsPerPage=" + maxItems + "&amp;startIndex=" + startIndex + query + "&amp;key=" + key;&lt;br /&gt;    String urlPrint = typ + pageTyp + "?itemsPerPage=" + maxItems + "&amp;startIndex=" + startIndex + query;&lt;br /&gt;&lt;br /&gt;    ArrayList themes = new ArrayList();&lt;br /&gt;    XMLElement xml;&lt;br /&gt;&lt;br /&gt;    try {&lt;br /&gt;      xml = new XMLElement( p, url.toString() );&lt;br /&gt;&lt;br /&gt;      println("\n" + urlPrint.toString());&lt;br /&gt;      println("-----------------------------------------------------------------------------");&lt;br /&gt;  &lt;br /&gt;      if (xml.getChild("success") != null &amp;&amp; xml.getChild("success").getContent().equals("false")) {&lt;br /&gt;        println("The following error appears while calling kuler service:");&lt;br /&gt;        println(xml.getChild("error/errorText").getContent());&lt;br /&gt;        println("-----------------------------------------------------------------------------");&lt;br /&gt;  &lt;br /&gt;      } else {&lt;br /&gt;        themeItems = xml.getChildren("channel/item/kuler:themeItem");&lt;br /&gt;        println(themeItems.length + " theme results were returned");&lt;br /&gt;  &lt;br /&gt;        /*&lt;br /&gt;        for(int i=0; i&amp;#60;themeItems.length; i++) {&lt;br /&gt;          themeSwatches = themeItems[i].getChildren("kuler:themeSwatches/kuler:swatch/kuler:swatchHexColor");&lt;br /&gt;  &lt;br /&gt;          int[] swatches = new int[themeSwatches.length];&lt;br /&gt;          for (int j=0; j &amp;#60; themeSwatches.length; j++) {&lt;br /&gt;            swatches[j] = unhex("FF" + themeSwatches[j].getContent());&lt;br /&gt;            println("swatch color " + j + " " + swatches[j]);&lt;br /&gt;          }&lt;br /&gt;  &lt;br /&gt;        }&lt;br /&gt;        println("-----------------------------------------------------------------------------");&lt;br /&gt;        */&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;    } catch(Exception e) {&lt;br /&gt;      println("Kuler XML Error " + e);&lt;br /&gt;      println("-----------------------------------------------------------------------------");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  // -----------------------------------------------------------------------------&lt;br /&gt;  // sets&lt;br /&gt;  // -----------------------------------------------------------------------------&lt;br /&gt;  public void setMaxItems(int maxItems) {&lt;br /&gt;    this.maxItems = maxItems;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setStartIndex(int startIndex) {&lt;br /&gt;    this.startIndex = startIndex;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setKey(String key) {&lt;br /&gt;    this.key = key;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setTheme(int num) {&lt;br /&gt;    themeItem = themeItems[num];&lt;br /&gt;    if(num &amp;#62; themeItems.length) {&lt;br /&gt;      println("there are only " + themeItems.length);&lt;br /&gt;      println("-----------------------------------------------------------------------------");&lt;br /&gt;    } else {&lt;br /&gt;      themeSwatches = themeItem.getChildren("kuler:themeSwatches/kuler:swatch/kuler:swatchHexColor");&lt;br /&gt;      // themeTag = themeItem.getChildren("kuler:themeTags"); // )[0].getContent());&lt;br /&gt;      themeTag = themeItem.getChildren("kuler:themeTags");// [0].getContent();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // -----------------------------------------------------------------------------&lt;br /&gt;  // gets&lt;br /&gt;  // -----------------------------------------------------------------------------&lt;br /&gt;  public void getSearchTag(String suche) {&lt;br /&gt;    query = "&amp;searchQuery=tag:" + suche;&lt;br /&gt;    typ = "search";&lt;br /&gt;&lt;br /&gt;    init(query, typ);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void getRecent() {&lt;br /&gt;    query = "&amp;listType=recent";&lt;br /&gt;    typ = "get";&lt;br /&gt;&lt;br /&gt;    init(query, typ);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void getRecent(int num) {&lt;br /&gt;    setMaxItems(num);&lt;br /&gt;    getRecent();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  int getThemeCount() {&lt;br /&gt;    try {&lt;br /&gt;      return themeItems.length;&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;      println("getThemeCount() error " + e);&lt;br /&gt;      return 0;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  color[] getSwatches() {&lt;br /&gt;    themeSwatches = themeItems[0].getChildren("kuler:themeSwatches/kuler:swatch/kuler:swatchHexColor");&lt;br /&gt;&lt;br /&gt;    int[] swatches = new int[themeSwatches.length];&lt;br /&gt;    for (int j=0; j &amp;#60; themeSwatches.length; j++) {&lt;br /&gt;      swatches[j] = unhex("FF" + themeSwatches[j].getContent());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return swatches;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  color[] getSwatches(int t) {&lt;br /&gt;    try {&lt;br /&gt;      themeSwatches = themeItems[t].getChildren("kuler:themeSwatches/kuler:swatch/kuler:swatchHexColor");&lt;br /&gt;  &lt;br /&gt;      int[] swatches = new int[themeSwatches.length];&lt;br /&gt;      for (int j=0; j &amp;#60; themeSwatches.length; j++) {&lt;br /&gt;        swatches[j] = unhex("FF" + themeSwatches[j].getContent());&lt;br /&gt;      }&lt;br /&gt;      return swatches;&lt;br /&gt;&lt;br /&gt;    } catch(Exception e) {&lt;br /&gt;      // println("getSwatches() error " + e);&lt;br /&gt;      int[] swatches = {};&lt;br /&gt;      return swatches;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  String[] getThemeTag() {&lt;br /&gt;    String[] themeTags = new String[themeTag.length];&lt;br /&gt;    try {&lt;br /&gt;      String holder = themeTag[0].getContent().toString();&lt;br /&gt;      String[] tagsList = split(holder, ", ");&lt;br /&gt;&lt;br /&gt;      return tagsList;&lt;br /&gt;    } catch(Exception e) {&lt;br /&gt;      // println("error reading tags: " + e);&lt;br /&gt;      themeTags[0] = "";&lt;br /&gt;    }&lt;br /&gt;    return themeTags;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;my next version of this project is to use &lt;a href="http://www.flickr.com/" target="new"&gt;flickr&lt;/a&gt; and photo tags to translate tweets into photographs. in the end for both the color and photography apps i plan to add a way to toggle back and forth between words and color/imagery, to mimic the "&lt;a href="http://en.wikipedia.org/wiki/Chinese_whispers" target="new"&gt;telephone&lt;/a&gt;" nature of translation.&lt;br /&gt;&lt;br /&gt;s = save a .png of current display&lt;br /&gt;k = toggle circle/squares&lt;br /&gt;t = toggle large/small text&lt;br /&gt;up/down arrow keys = change size of circle/squares&lt;br /&gt;&lt;br /&gt;grab the source &lt;a href="http://code.google.com/p/frederickk/downloads/detail?name=kulerSprache_0_4.zip&amp;can=2&amp;q=" target="new"&gt;kulerSprache_0_4.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-7542167553408587326?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/07/processing-color-as-language.html' title='processing. color as language'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/7542167553408587326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/7542167553408587326'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/07/processing-color-as-language.html' title='processing. color as language'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_D4RTkcxeJUk/Sl6wU4KDjZI/AAAAAAAAAHg/4LDFVn5fzMs/s72-c/kulerSprache_0_4_20090715_183351.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-1580384165677680391</id><published>2009-06-30T21:05:00.002+02:00</published><updated>2011-06-25T10:53:15.308+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scriptographer'/><title type='text'>scriptographer. object/layer select</title><content type='html'>i whipped up this "suite" of &lt;a href="http://www.scriptographer.com/" target=new&gt;scriptographer&lt;/a&gt; scripts in an answer to a problem posed by my friend &lt;a href="http://andy-baron.com/" target=new&gt;andy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;quite simply it selects objects in Illustrator based on item/sub-layer name. i never name my layers or items. so typically my layers palette looks something like this&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_D4RTkcxeJUk/SkpoOGCRrUI/AAAAAAAAAGw/500UNS0CHVs/s1600-h/layers.palette.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 224px; height: 196px;" src="http://2.bp.blogspot.com/_D4RTkcxeJUk/SkpoOGCRrUI/AAAAAAAAAGw/500UNS0CHVs/s320/layers.palette.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353205698430872898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;either by double clicking the sub-layer name or by using this script &lt;a href="http://code.google.com/p/frederickk/downloads/detail?name=layer_itemRename_0_1_2.js.zip" target=new&gt;layer_itemRename_0_1_2.js&lt;/a&gt; you can rename the item/sub-layer or rename all of the items/sub-layers that have the same name.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/SkpoOdu-p0I/AAAAAAAAAG4/Mm4IVeVwk-E/s1600-h/layers_named.palette.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 224px; height: 196px;" src="http://4.bp.blogspot.com/_D4RTkcxeJUk/SkpoOdu-p0I/AAAAAAAAAG4/Mm4IVeVwk-E/s320/layers_named.palette.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353205704792385346" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;now when the items are copied, they retain their name, so all you have to do is select an an item and run &lt;a href="http://code.google.com/p/frederickk/downloads/detail?name=layer_itemSelect_0_35_2.js.zip" target=new&gt;layer_itemSelect_0_35.js&lt;/a&gt;. the script will then select all of the items that have it's same name.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_D4RTkcxeJUk/Skpluc-vl_I/AAAAAAAAAGg/DUeaG1w78hE/s1600-h/auswahl.dialog.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 174px;" src="http://1.bp.blogspot.com/_D4RTkcxeJUk/Skpluc-vl_I/AAAAAAAAAGg/DUeaG1w78hE/s320/auswahl.dialog.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353202955811002354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/SkpluU-2-RI/AAAAAAAAAGo/IMdIpj40UmU/s1600-h/auswahl.selected.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 174px;" src="http://4.bp.blogspot.com/_D4RTkcxeJUk/SkpluU-2-RI/AAAAAAAAAGo/IMdIpj40UmU/s320/auswahl.selected.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353202953664002322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;i haven't fully tested these scripts 100%, so they may still be buggy. eventually i'll post them on the &lt;a href="http://www.scriptographer.com/" target=new&gt;scriptographer&lt;/a&gt; site.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;update&lt;br /&gt;since losing my previous host, i'm slowly migrating all of my source code to &lt;a href="https://github.com/frederickk"&gt;github.com&lt;/a&gt;, in doing so i've updated these scripts to the latest scriptographer api (2.9)&lt;br /&gt;&lt;br /&gt;grab the source &lt;a href="https://gist.github.com/gists/1046302/download" target=new&gt;layer_itemRename_0_1.js&lt;/a&gt; and &lt;a href="https://gist.github.com/gists/1046302/download" target=new&gt;layer_itemSelect_0_35.js&lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-1580384165677680391?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/06/scriptographer-objectlayer-select.html' title='scriptographer. object/layer select'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/1580384165677680391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/1580384165677680391'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/06/scriptographer-objectlayer-select.html' title='scriptographer. object/layer select'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_D4RTkcxeJUk/SkpoOGCRrUI/AAAAAAAAAGw/500UNS0CHVs/s72-c/layers.palette.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-149416594905226714</id><published>2009-05-24T20:08:00.000+02:00</published><updated>2009-08-08T18:28:37.391+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc.'/><title type='text'>Hands On</title><content type='html'>i was reading this phenomenal article by matthew crawford &lt;a href="http://www.nytimes.com/2009/05/24/magazine/24labor-t.html?_r=1&amp;amp;ref=magazine" target="NEW"&gt;The Case for Working With Your Hands&lt;/a&gt;, a couple of weeks ago in sunday's new york times magazine. &lt;br /&gt;&lt;br /&gt;what a great article, i love to work with my hands, whether it be taking apart the vcr at age seven, or letterpressing in college, or nowadays burning myself soldering stuff with arduino. &lt;br /&gt;&lt;br /&gt;this is one trend i hope everyone gets on board with, lets get people breaking open their stuff and seeing how it works. for example if you're hard-drive needs replacing or your bike's derailleur needs adjusting, do it yourself, it's so easy access information these days. everyday should be like a day at &lt;a href="http://www.exploratorium.edu/" target=new&gt;exploratorium&lt;/a&gt;. with magazines like &lt;a href="http://makezine.com/" target=new&gt;make&lt;/a&gt;, bringing d.i.y. ethic to everybody there's no excuses any more. &lt;br /&gt; &lt;br /&gt;it makes me sad that within design, that hand skills have gone away. i remember in drafting class using t-squares, triangles, and french curves to create, an albeit boring, drawing of a clamp. or when my boss talks about the elation he had when he mastered the &lt;a href="http://www.rotring.com/en/produkte/technisches_zeichnen/rapidograph.html" target=new&gt;rapidograph&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;nothing can top the experience of using your hands and doing, or even better learning by failing from doing. let's not be afraid to draw, get dirty, cut stuff out, xerox stuff, then xerox some more, nothing is precious.&lt;br /&gt;&lt;br /&gt;my good friend &lt;a href="http://www.kern-emden.de/" target=new&gt;eugen&lt;/a&gt; sent me a clip of his multi-touch experimentation. granted it's nothing new in the sense that multi-touch tables appear &lt;a href="http://www.instructables.com/tag/?q=multi+touch&amp;limit%3Atype%3Aid=on&amp;type%3Aid=on&amp;type%3Auser=on&amp;type%3Acomment=on&amp;type%3Agroup=on&amp;type%3AforumTopic=on&amp;type%3AforumTopic=on&amp;sort=none" target=new&gt;all over the web&lt;/a&gt;, but it shows that the separation between digital and physical worlds is becoming ever blurrier.&lt;br /&gt;&lt;br /&gt;i hope that one day we'll sit at desks which are essentially multi-touch surfaces and create using our hands. &lt;br /&gt;&lt;br /&gt;no more mouse clicks, and i can't wait.&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5120376&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=5120376&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;*thanks to eugen for letting me share his multi-touch project&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-149416594905226714?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/05/hands-on.html' title='Hands On'/><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=4854e9f5e7235cbe&amp;type=video%2Fmp4' length='0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/149416594905226714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/149416594905226714'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/05/hands-on.html' title='Hands On'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-7929081447257736144</id><published>2009-05-19T16:57:00.000+02:00</published><updated>2009-08-08T18:28:59.519+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='experiment'/><title type='text'>scrabble t-shirts</title><content type='html'>starting in may 2008 to kick-off the scrabble tournament at work, &lt;a href="http://www.facebook.com/people/Andy-Baron/507101128" target=NEW&gt;andy&lt;/a&gt; and i crafted a t-shirt project around all of the two letter words in scrabble. &lt;br /&gt;&lt;br /&gt;the goal was to randomly spell every legal two letter word in scrabble (&lt;a href="http://www.yak.net/kablooey/scrabble/2letterwords.html" target=NEW&gt;101&lt;/a&gt; for those curious). we screenprinted 24 shirts, each with it's own letter. there are no possible two letter combinations with C and V. the shirts were designed to reflect the point values and frequency of the letter.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_D4RTkcxeJUk/ShLZL-Uts9I/AAAAAAAAAFQ/iNXQl8Jh_4Q/s1600-h/scrabble.system_Page_1.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 207px;" src="http://1.bp.blogspot.com/_D4RTkcxeJUk/ShLZL-Uts9I/AAAAAAAAAFQ/iNXQl8Jh_4Q/s320/scrabble.system_Page_1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5337567308119126994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/ShLZLzV83bI/AAAAAAAAAFY/vLQAYr4zzyw/s1600-h/scrabble.system_Page_2.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 207px;" src="http://4.bp.blogspot.com/_D4RTkcxeJUk/ShLZLzV83bI/AAAAAAAAAFY/vLQAYr4zzyw/s320/scrabble.system_Page_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5337567305171525042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;for example, size of letter is determined by point value, Q and Z are the highest value letters. therefore those letters are the largest in the system. frequency was shown by shirt color, for example the letter E is the most common letter (in the english version of scrabble) and appears at the beginning of the color spectrum, it's shirt is red. whilst X is one of the least common letters and appears at the end of the spectrum so the shirt is purple. all the shirts came from american apparel, as they have the largest selection of colors.&lt;br /&gt;&lt;br /&gt;we wore the shirts every weekday without coordinating, except for a system  we devised to alternate vowels. i would wear a random vowel on monday and wedensday, andy would wear a random vowel on tuesday and thursday. we considered friday to be "casual friday" which would allow words with the same letter to be worn (i.e. AA).&lt;br /&gt;&lt;br /&gt;we kept track of our progress online, everyday (for the most part) &lt;a href="http://www.thebarricades.de/kenfrederick/scrabble_attire/" target=NEW&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;br /&gt;unfortunately, the project was cut short when andy's screenprinting "studio" was forced closed by his landlord. we still need to print about 6 shirts in order to continue. we got about halfway through the list of two letter words (december of 2008). --&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_D4RTkcxeJUk/ShLaabZ7p4I/AAAAAAAAAGA/qRmXqnfowHI/s1600-h/x_a_080731_003.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://1.bp.blogspot.com/_D4RTkcxeJUk/ShLaabZ7p4I/AAAAAAAAAGA/qRmXqnfowHI/s320/x_a_080731_003.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5337568655955437442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_D4RTkcxeJUk/ShLaaJkhuKI/AAAAAAAAAF4/-dorMFVs-1w/s1600-h/m_e_080731_028.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://2.bp.blogspot.com/_D4RTkcxeJUk/ShLaaJkhuKI/AAAAAAAAAF4/-dorMFVs-1w/s320/m_e_080731_028.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5337568651168037026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/ShLaZyyEeDI/AAAAAAAAAFw/WM6HAtI0mnM/s1600-h/h_a_080731_041.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_D4RTkcxeJUk/ShLaZyyEeDI/AAAAAAAAAFw/WM6HAtI0mnM/s320/h_a_080731_041.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5337568645050824754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/ShLaZtQ8K0I/AAAAAAAAAFo/akSHoNuhfok/s1600-h/d_e_080502_004.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/ShLaZtQ8K0I/AAAAAAAAAFo/akSHoNuhfok/s320/d_e_080502_004.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5337568643569691458" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-7929081447257736144?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/05/scrabble-t-shirts.html' title='scrabble t-shirts'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/7929081447257736144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/7929081447257736144'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/05/scrabble-t-shirts.html' title='scrabble t-shirts'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_D4RTkcxeJUk/ShLZL-Uts9I/AAAAAAAAAFQ/iNXQl8Jh_4Q/s72-c/scrabble.system_Page_1.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-490152825126007358</id><published>2009-05-08T01:22:00.006+02:00</published><updated>2009-05-25T03:48:14.451+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><title type='text'>arduino. digi-sketch *update*</title><content type='html'>i couldn't let it be that the digi-sketch would have so much jitter. so i ended up getting getting two new pots (both 10k). just swapping out the old pots for the new 10k ones, made a huge amount of difference. &lt;br /&gt;&lt;br /&gt;then after talking to my dad he mentioned that if i even out the output power from the arduino i could get even smoother readings. so he drew me up this voltage regulator schematic. using an external 9V DC wall wart and this regulator i'm getting much more even output and then using the averaging function the jitter is much better managed.&lt;br /&gt;&lt;br /&gt;i got the parts i needed for the voltage regulator at radioshack but if you're more patient than i am, then i highly recommend using &lt;a href="http://octopart.com/" target=new&gt;octopart&lt;/a&gt; to find your parts.&lt;br /&gt;&lt;br /&gt;- 1 9V DC input jack&lt;br /&gt;- 1 &lt;a href="http://www.radioshack.com/product/index.jsp?productId=2062599" target=new&gt;7805 voltage regulator&lt;/a&gt;&lt;br /&gt;- 1 &lt;a href="http://www.radioshack.com/product/index.jsp?productId=2102509" target=new&gt;10µF electrolytic capacitor&lt;/a&gt; (blue can)&lt;br /&gt;- 1 &lt;a href="http://www.radioshack.com/product/index.jsp?productId=2062392" target=new&gt;1µF tantalum capacitor&lt;/a&gt; (yellow)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/SgNxieDVyxI/AAAAAAAAAE4/Gz9GtG1bpiw/s1600-h/frederickk.voltage_regulator_schematic.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 212px;" src="http://4.bp.blogspot.com/_D4RTkcxeJUk/SgNxieDVyxI/AAAAAAAAAE4/Gz9GtG1bpiw/s320/frederickk.voltage_regulator_schematic.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5333231220733365010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/SgNxikpUX4I/AAAAAAAAAFA/LGqsVYAQJA4/s1600-h/IMG_4907_sm.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/_D4RTkcxeJUk/SgNxikpUX4I/AAAAAAAAAFA/LGqsVYAQJA4/s320/IMG_4907_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5333231222503268226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;i began building a custom enclosure for the controls using the obligatory altoids tin. i haven't gotten all the guts inside of it yet (as you can see). i'm still trying to determine what should go inside actually. &lt;strike&gt;i'm thinking of making the voltage regulator into a modular "shield" to go atop the arduino, as i may use it for other projects. if/when i decide i'll update this post with a picture&lt;/strike&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;i made a "shield" like voltage regulator, the two prongs at the bottom plug into a breadboard, making it much easier to use for future projects&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/Shn4vZdepyI/AAAAAAAAAGI/Ppkc-ccq1ak/s1600-h/IMG_5014_sm.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 120px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/Shn4vZdepyI/AAAAAAAAAGI/Ppkc-ccq1ak/s320/IMG_5014_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5339572326396503842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_D4RTkcxeJUk/SgNxi3a9XKI/AAAAAAAAAFI/KwX7xJBE1hk/s1600-h/IMG_4906_sm.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_D4RTkcxeJUk/SgNxi3a9XKI/AAAAAAAAAFI/KwX7xJBE1hk/s320/IMG_4906_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5333231227543313570" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-490152825126007358?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/05/arduino-digi-sketch-update.html' title='arduino. digi-sketch *update*'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/490152825126007358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/490152825126007358'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/05/arduino-digi-sketch-update.html' title='arduino. digi-sketch *update*'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_D4RTkcxeJUk/SgNxieDVyxI/AAAAAAAAAE4/Gz9GtG1bpiw/s72-c/frederickk.voltage_regulator_schematic.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-407397410027187464</id><published>2009-05-04T05:42:00.006+02:00</published><updated>2009-08-26T04:27:20.794+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>arduino. digi-sketch</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/Sf8Fhgy3ruI/AAAAAAAAAEw/bkBWFjzMqaw/s1600-h/IMG_4895_sm.jpg" target=new&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/Sf8Fhgy3ruI/AAAAAAAAAEw/bkBWFjzMqaw/s320/IMG_4895_sm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5331986557127077602" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;i was making a presentation at work about some of the various things i've created, and i really wanted to show something using arduino. unfortunately i haven't had much time to flush out a project yet. so i whipped up this quick digital etch-a-sketch project. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/search?q=etch+a+sketch+arduino&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:de-DE:official&amp;client=firefox-a" target=new&gt;it's definately not a new idea&lt;/a&gt; but i built this one from scratch and added a "shake to clear" feature.&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4473509&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=4473509&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;one problem i was having was the jitter from the potentiometers. i just grabbed some pots i had lying around, they both have different impedence values 1M and 100k, so at some point i should probably get two with the same values and much smaller. using this piece of code, first in arduino (which worked ok), then in processing (which works much better) i smoothed out some of the jitter:&lt;br /&gt;&lt;br /&gt;&lt;div class="code-box"&gt;int average(int val, int readingsCount) {&lt;br /&gt;  int total;&lt;br /&gt;  int readings[readingsCount]; &lt;br /&gt;&lt;br /&gt;  for(int i=0; i!=readingsCount; i++) {&lt;br /&gt;    total -= readings[i];&lt;br /&gt;    readings[i] = val;&lt;br /&gt;    total += readings[i];&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  int average = total / readingsCount;&lt;br /&gt;  return average;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;c = clear screen&lt;br /&gt;s = toggle shake to clear on/off&lt;br /&gt;&lt;br /&gt;grab the source &lt;a href="http://www.thebarricades.de/kenfrederick/portfolio/assets/processing/digiSketch_0_2.zip" target=new&gt;digiSketch_0_2&lt;/a&gt; and &lt;a href="http://www.thebarricades.de/kenfrederick/portfolio/assets/arduino/digiSketchController_0_2.pde" target=new&gt;digiSketchController_0_2.pde&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-407397410027187464?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/05/arduino-digi-sketch.html' title='arduino. digi-sketch'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/407397410027187464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/407397410027187464'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/05/arduino-digi-sketch.html' title='arduino. digi-sketch'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_D4RTkcxeJUk/Sf8Fhgy3ruI/AAAAAAAAAEw/bkBWFjzMqaw/s72-c/IMG_4895_sm.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-3481894526022433133</id><published>2009-04-20T06:48:00.008+02:00</published><updated>2011-06-25T23:08:33.305+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><category scheme='http://www.blogger.com/atom/ns#' term='experiment'/><title type='text'>processing. tonal visualization</title><content type='html'>it's taken me a while to realize this app, i'm very happy how it turned out. it's a fairly simple app that has three modes.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/15943029" width="518" height="389" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_D4RTkcxeJUk/SewKQZrJpMI/AAAAAAAAAEg/mBKBR1Gj0Io/s1600-h/Bild+5.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px; " src="http://1.bp.blogspot.com/_D4RTkcxeJUk/SewKQZrJpMI/AAAAAAAAAEg/mBKBR1Gj0Io/s1600/Bild+5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5326643736158512322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/SewKQCAB67I/AAAAAAAAAEY/L2YdWYT17Mc/s1600-h/Bild+1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 518px; " src="http://4.bp.blogspot.com/_D4RTkcxeJUk/SewKQCAB67I/AAAAAAAAAEY/L2YdWYT17Mc/s1600/Bild+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5326643729803635634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1/ Load Mode (document icon)&lt;/span&gt;&lt;br /&gt;This mode imports MIDI (.midi/.mid) files and interprets them as graphic rings. To load a MIDI file, click on the document icon. It may take a few seconds to parse the file, this is normal even though the program may appear to have locked up. Wait until the play button appears, press it to start playing the file. Example MIDI files can be found in the "data/midi/" folder.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2/ Move Mode (computer icon)&lt;/span&gt;&lt;br /&gt;The SMS (Sudden Motion Sensor), found in Apple laptops is required for this mode. X rotations control the pitch, Y rotations control volume, and Z movement controls duration (the Z axis is hard to control and experimenting with it could result in damage to your laptop).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3/ Key Mode (piano keyboard icon)&lt;/span&gt;&lt;br /&gt;A piano's keyboard is mimicked using the following keys:&lt;br /&gt;&lt;br /&gt; W E   T Y U   &lt;- black keys&lt;br /&gt;A S D F G H J  &lt;- white keys&lt;br /&gt;&lt;br /&gt;The sliders at the top control volume and pitch, in addition to the slider,  the UP and DOWN arrow keys control volume and the LEFT and RIGHT arrow keys control pitch. &lt;br /&gt;&lt;br /&gt;The "data" folder must always be in the same folder as the program. &lt;br /&gt;&lt;br /&gt;shift+d = details on/off&lt;br /&gt;shift+r = grid on/off&lt;br /&gt;SPACEBAR = while playing, this will restart the program&lt;br /&gt;ESC = quit&lt;br /&gt;&lt;br /&gt;&lt;b&gt;update&lt;br /&gt;i'm migrating my source code to code.google.com and github &lt;a href="http://code.google.com/p/tonal-visualization/"&gt;TonalVisualization_0_3&lt;/a&gt; or &lt;a href="http://tonal-visualization.googlecode.com/files/TonalVisualization_0_3.zip"&gt;TonalVisualization_0_3.zip&lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-3481894526022433133?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/04/processing-tonal-visualization.html' title='processing. tonal visualization'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/3481894526022433133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/3481894526022433133'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/04/processing-tonal-visualization.html' title='processing. tonal visualization'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_D4RTkcxeJUk/SewKQZrJpMI/AAAAAAAAAEg/mBKBR1Gj0Io/s72-c/Bild+5.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-8984759729549635759</id><published>2009-04-13T18:49:00.009+02:00</published><updated>2009-05-24T04:54:07.213+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>processing. vector rotate</title><content type='html'>i created this app a while ago, initially for a completely different project, but when &lt;a href="http://www.yagmourian.com/gaston/" target=new&gt;gaston&lt;/a&gt; and i began working on a poster for the &lt;a href="http://www.lagaleru.org/PAGES/gdr.html" target=new&gt;international poster competition&lt;/a&gt; i dusted this app off, cleaned it up and we used it (albeit less than we thought)&lt;br /&gt;&lt;br /&gt;it's pretty neat app and i'm including the source code. it was written in processing. basically it takes a folder of .svg files and rotates them around a specific point. and when you get the shape you want it can save out a .pdf. i even (just for shits and giggles) built in a way for it to spit out a file that another "reader" app could interpret.&lt;br /&gt;&lt;br /&gt;here are some screenshots:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_D4RTkcxeJUk/SeN3UcIB4iI/AAAAAAAAAD4/O2HUJydUJJc/s1600-h/Picture+1.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_D4RTkcxeJUk/SeN3UcIB4iI/AAAAAAAAAD4/O2HUJydUJJc/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5324230377513017890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/SeN3duPPT2I/AAAAAAAAAEQ/vNptPKnRzF0/s1600-h/Picture+6.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/SeN3duPPT2I/AAAAAAAAAEQ/vNptPKnRzF0/s320/Picture+6.png" alt="" id="BLOGGER_PHOTO_ID_5324230536993918818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/SeN3dOTlMHI/AAAAAAAAAEI/r7oIZs-eJvQ/s1600-h/Picture+5.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/SeN3dOTlMHI/AAAAAAAAAEI/r7oIZs-eJvQ/s320/Picture+5.png" alt="" id="BLOGGER_PHOTO_ID_5324230528422195314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/SeN3cmljlII/AAAAAAAAAEA/o6UCsFxceCE/s1600-h/Picture+3.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/SeN3cmljlII/AAAAAAAAAEA/o6UCsFxceCE/s320/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5324230517760169090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;the interface is pretty straight forward using a few key commands:&lt;br /&gt;&lt;br /&gt;q or ESC = quit&lt;br /&gt;d = show/hide details (still a little buggy)&lt;br /&gt;f = on/off rotation angle correction (i.e. do you the images to rotate individually as they rotate around the center or stay at 0˚)&lt;br /&gt;h = show/hide interface&lt;br /&gt;k = stroke/fill toggle&lt;br /&gt;s = output screengrab&lt;br /&gt;p = output .pdf&lt;br /&gt;z = random values&lt;br /&gt;&lt;br /&gt;grab the source and app &lt;a href="http://www.thebarricades.de/kenfrederick/portfolio/assets/processing/graphisme_flowerMaker_0_6.zip" target="new"&gt;graphisme_flowerMaker_0_6.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-8984759729549635759?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/04/processing-vector-rotate.html' title='processing. vector rotate'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/8984759729549635759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/8984759729549635759'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/04/processing-vector-rotate.html' title='processing. vector rotate'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_D4RTkcxeJUk/SeN3UcIB4iI/AAAAAAAAAD4/O2HUJydUJJc/s72-c/Picture+1.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-5312053712984439313</id><published>2009-03-18T17:54:00.005+01:00</published><updated>2009-05-24T04:55:34.173+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Time Out. Quakeriffic</title><content type='html'>my main intent of this blog is to chronicle my own work, experiments, etc. but i feel it is my duty to point out the greatness of the latest &lt;a href="http://www.quakeroats.com/" target=new&gt;quaker oats&lt;/a&gt; ad campaign &lt;a href="http://www.quakeroats.com/about-quaker-oats/content/go-humans-go.aspx" target=new&gt;"go humans go"&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;i haven't seen much press about this campaign, but all over san francisco, these semi-ominous larger than life quaker posters have been appearing on busses, bus shelters, billboards, wheat-pasted on buildings (legally of course). i want one for my apartment, so if the creative leaders at quaker can read this. please send.&lt;br /&gt;&lt;br /&gt;stuart elliott, wrote in his ny times &lt;a href="http://www.nytimes.com/2009/03/10/business/media/10adco.html" target=new&gt;article&lt;/a&gt; about how that in times of economic downturn, we could see more uplifting work as a way of offsetting the harsh reality of everyday life. that the work is being done by &lt;a href="http://www.goodbysilverstein.com/" target=new&gt;goodby, silverstein &amp; partners&lt;/a&gt;, who recently aquired the quaker account. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3429/3349995941_021632f435.jpg?v=0"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 500px; height: 375px;" src="http://farm4.static.flickr.com/3429/3349995941_021632f435.jpg?v=0" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3331/3331424683_ae432111aa.jpg?v=0"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 500px; height: 333px;" src="http://farm4.static.flickr.com/3331/3331424683_ae432111aa.jpg?v=0" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm2.static.flickr.com/1088/3336661449_63c688cca3.jpg?v=0"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 375px; height: 500px;" src="http://farm2.static.flickr.com/1088/3336661449_63c688cca3.jpg?v=0" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size=small&gt;&lt;br /&gt;*thank you flickr and their respective owners &lt;a href="http://www.flickr.com/photos/figgenhoffer/3349995941/" target=new&gt;here&lt;/a&gt;, &lt;a href="http://www.flickr.com/photos/rickm15/3331424683/" target=new&gt;here&lt;/a&gt;, and &lt;a href="http://www.flickr.com/photos/puppyboysukk/3336661449/" target=new&gt;here&lt;/a&gt; for the images.&lt;br /&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-5312053712984439313?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/03/time-out-quakeriffic.html' title='Time Out. Quakeriffic'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/5312053712984439313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/5312053712984439313'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/03/time-out-quakeriffic.html' title='Time Out. Quakeriffic'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-7525260498279523100</id><published>2009-02-17T09:31:00.007+01:00</published><updated>2009-05-24T04:56:00.297+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='experiment'/><title type='text'>arduino. led matrix.</title><content type='html'>got an arduino finally, and i've decided to document my trials and tribulations with it. perhaps, someone will stumble upon this and find something useful as i make the journey to teach myself about physical computing.&lt;br /&gt;&lt;br /&gt;my first project was to create an led matrix and have patterns run across it. &lt;br /&gt;&lt;br /&gt;fortunately, my dad is an electronic mastermind so he whipped up this schematic for me, which i fumbled my way through deciphering. from what i've seen on ebay and sparkfun, you could buy matrices cheap. i think building one has helpd me understand them better though.&lt;br /&gt;&lt;br /&gt;in the end i was lazy and left out the transistors and resistors, but the matrix still worked. so with any luck, my arduino board will not blow up.&lt;br /&gt;&lt;br /&gt;here's the schematic for the matrix, and the list of materials.&lt;br /&gt;&lt;b&gt;radioshack&lt;/b&gt;&lt;br /&gt;ugh.&lt;br /&gt;- cheapo blank PC board (276-148) $1.99&lt;br /&gt;- package of 15 transistors (276-617) $2.59&lt;br /&gt;&lt;br /&gt;&lt;b&gt;fry's&lt;/b&gt;&lt;br /&gt;which sucks, more than radiosack, couldn't believe it. i think i'll either make the trip to &lt;a href="http://www.allashers.com/" target="new"&gt;al lashers&lt;/a&gt; in berkely or mailorder from now on.&lt;br /&gt;- package of 25 green mini-leds (625972) $6.69&lt;br /&gt;- package of 750k Ohm resistors (3628745) $1.99&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_D4RTkcxeJUk/SZp4PMlkztI/AAAAAAAAADk/wg6aVyKdid8/s1600-h/frederickk.led_matrix_schematic.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 247px;" src="http://1.bp.blogspot.com/_D4RTkcxeJUk/SZp4PMlkztI/AAAAAAAAADk/wg6aVyKdid8/s320/frederickk.led_matrix_schematic.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5303683713654378194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;here's a view from the front and back, not too bad a soldering job.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/SZp4Cw0_tpI/AAAAAAAAADc/er-jM86kV_8/s1600-h/frederickk.led_matrix_01.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/SZp4Cw0_tpI/AAAAAAAAADc/er-jM86kV_8/s320/frederickk.led_matrix_01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5303683500044433042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_D4RTkcxeJUk/SZp4C-unH5I/AAAAAAAAADU/zH1y0Hu33ks/s1600-h/frederickk.led_matrix_00.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_D4RTkcxeJUk/SZp4C-unH5I/AAAAAAAAADU/zH1y0Hu33ks/s320/frederickk.led_matrix_00.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5303683503775752082" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-7525260498279523100?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2009/02/arduino-led-matrix.html' title='arduino. led matrix.'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/7525260498279523100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/7525260498279523100'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2009/02/arduino-led-matrix.html' title='arduino. led matrix.'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_D4RTkcxeJUk/SZp4PMlkztI/AAAAAAAAADk/wg6aVyKdid8/s72-c/frederickk.led_matrix_schematic.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-433880774463244275</id><published>2006-12-03T14:49:00.000+01:00</published><updated>2009-05-24T04:56:31.106+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>LocalDesignersUnion</title><content type='html'>all of the posts for LocalDesignersUnion have been moved to&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/34003352@N00/" target="new"&gt;http://www.flickr.com/photos/34003352@N00/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;being that it is a collective, the photos and the site should be representative of that. this blog will now turn into a sounding board for my experiments, ideas, and other such nonsense that i have done or will do which is in my mind different from the day to day doldrums.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-433880774463244275?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2006/12/localdesignersunion.html' title='LocalDesignersUnion'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/433880774463244275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/433880774463244275'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2006/12/localdesignersunion.html' title='LocalDesignersUnion'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-115435253446262368</id><published>2006-07-31T15:21:00.001+02:00</published><updated>2009-05-24T04:56:55.046+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>observed</title><content type='html'>&lt;object width="300" height="247"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1RqdZCo6vkI"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/1RqdZCo6vkI" type="application/x-shockwave-flash" width="300" height="247"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;observed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-115435253446262368?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2006/07/observed.html' title='observed'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/115435253446262368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/115435253446262368'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2006/07/observed.html' title='observed'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-114908703791224152</id><published>2006-05-31T16:37:00.000+02:00</published><updated>2009-05-24T05:00:45.620+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>leaders of nothing and followers of everything</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/6402/1914/1600/deck.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6402/1914/320/deck.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;our entry for the &lt;a href="http://www.adcc.org/events/deck.html" target="new"&gt;DECK&lt;/a&gt; show, which was sponsered by the &lt;a href="http://www.adcc.org" target=NEW&gt;art directors club cincinnati&lt;/a&gt;, was denied. although, it's minor and insignificant it is evidence of the prevailing attitude within the cincinnati (and quite possibly entrire midwest) design community. the attitude that frightens us to compromise our work and force us into boxes which stifles us from being leaders of nothing and followers of everything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-114908703791224152?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2006/05/our-entry-for-deck-show-which-was.html' title='leaders of nothing and followers of everything'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/114908703791224152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/114908703791224152'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2006/05/our-entry-for-deck-show-which-was.html' title='leaders of nothing and followers of everything'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-113339335767086578</id><published>2005-12-01T00:14:00.000+01:00</published><updated>2009-05-24T05:05:50.168+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>deutsches daybuch. photographic research</title><content type='html'>the most interesting facet is the re-emergence of the photographic research for the 'deutsches daybuch'&lt;br /&gt;&lt;a href="http://www.thebarricades.de/kenfrederick/deutschland/" target=NEW&gt;http://www.thebarricades.de/kenfrederick/deutschland&lt;/a&gt; all of the photos i took for my year abroad and subsequently used for my graduation thesis can be viewed here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-113339335767086578?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2005/11/httpwww.html' title='deutsches daybuch. photographic research'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/113339335767086578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/113339335767086578'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2005/11/httpwww.html' title='deutsches daybuch. photographic research'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-113315644408920935</id><published>2005-11-28T06:37:00.000+01:00</published><updated>2009-05-24T05:06:20.490+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>deutsches daybuch exhibition</title><content type='html'>&lt;a href="http://studenthome.nku.edu/~frederickk/exhibition/sta_4619_sm.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px;" src="http://studenthome.nku.edu/~frederickk/exhibition/sta_4619_sm.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://studenthome.nku.edu/~frederickk/exhibition/ste_4623_sm.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px;" src="http://studenthome.nku.edu/~frederickk/exhibition/ste_4623_sm.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://studenthome.nku.edu/~frederickk/exhibition/std_4622_sm.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px;" src="http://studenthome.nku.edu/~frederickk/exhibition/std_4622_sm.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://studenthome.nku.edu/~frederickk/exhibition/stc_4621_sm.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px;" src="http://studenthome.nku.edu/~frederickk/exhibition/stc_4621_sm.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;deutsches daybuch exhibition&lt;br /&gt;northern kentucky university. april 2005&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-113315644408920935?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/113315644408920935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/113315644408920935'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2005/11/deutsches-daybuch-exhibition-northern.html' title='deutsches daybuch exhibition'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-19360784.post-113311524449820286</id><published>2005-11-27T19:11:00.000+01:00</published><updated>2009-05-24T05:06:47.500+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='exhibition'/><category scheme='http://www.blogger.com/atom/ns#' term='experiment'/><title type='text'>t-shirt exhibition</title><content type='html'>t-shirt exhibition&lt;br /&gt;artworks. september 2004&lt;br /&gt;&lt;br /&gt;i screen printed a series of shirts for a group show at &lt;a href="http://www.artworkscincinnati.org/" target=NEW&gt;artworks&lt;/a&gt; in cincinnati. the theme was t-shirts, so i bought around 20 different sized short sleeve polo shirts and screen printed an anotomical heart graphic on to them. the heart was on the front, but it was printed in a way that it was "woven" in to the shirt. hard to explain in words so just look at the pictures. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/6402/1914/1600/tshirt_herz_austeelung_1.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6402/1914/320/tshirt_herz_austeelung_1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/6402/1914/1600/tshirt_herz_austeelung_2.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6402/1914/320/tshirt_herz_austeelung_2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/6402/1914/1600/tshirt_herz_austeelung_0.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6402/1914/320/tshirt_herz_austeelung_0.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19360784-113311524449820286?l=kenfrederick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kenfrederick.blogspot.com/2005/11/t-shirt-exhibition-artworks.html' title='t-shirt exhibition'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/113311524449820286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19360784/posts/default/113311524449820286'/><link rel='alternate' type='text/html' href='http://kenfrederick.blogspot.com/2005/11/t-shirt-exhibition-artworks.html' title='t-shirt exhibition'/><author><name>kenfrederick</name><uri>http://www.blogger.com/profile/04306768105176486130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-dWm_4NYdYC8/TilBHBJnO5I/AAAAAAAAARY/XIAxXskfg1g/s220/41634_1185074650_421_n.jpeg'/></author></entry></feed>
