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

<channel>
	<title>Almer/Blank Labs &#187; Flash</title>
	<atom:link href="http://labs.almerblank.com/tag/flash/feed/" rel="self" type="application/rss+xml" />
	<link>http://labs.almerblank.com</link>
	<description>Blog of the Talent at Almer/Blank</description>
	<lastBuildDate>Mon, 19 Jul 2010 22:55:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Four New OSMF Adobe Cookbook Recipes</title>
		<link>http://labs.almerblank.com/2010/07/four-new-osmf-adobe-cookbook-recipes/</link>
		<comments>http://labs.almerblank.com/2010/07/four-new-osmf-adobe-cookbook-recipes/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 22:55:23 +0000</pubDate>
		<dc:creator>rblank</dc:creator>
				<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Code & Samples]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[flash video]]></category>
		<category><![CDATA[OSMF]]></category>

		<guid isPermaLink="false">http://labs.almerblank.com/?p=1533</guid>
		<description><![CDATA[Evenin&#039; all:
I posted four new OSMF recipes on Adobe&#039;s cookbook site this afternoon, and thought you might care to see &#039;em:
Playing Multiple Pieces of Media, Consecutively, with the OSMF ParallelElement
Playing Multiple Pieces of Media, Concurrently, with the OSMF ParallelElement
Dynamic Streaming with OSMF
HTTP Streaming in OSMF
And, as a reminder along these lines, I&#039;m teaching this year [...]]]></description>
			<content:encoded><![CDATA[<p>Evenin&#039; all:</p>
<p>I posted four new OSMF recipes on Adobe&#039;s cookbook site this afternoon, and thought you might care to see &#039;em:</p>
<p><a href="http://cookbooks.adobe.com/post_Playing_Multiple_Pieces_of_Media__Consecutively__w-17642.html">Playing Multiple Pieces of Media, Consecutively, with the OSMF ParallelElement</a><br />
<a href="http://cookbooks.adobe.com/post_Playing_Multiple_Pieces_of_Media__Concurrently__wi-17640.html">Playing Multiple Pieces of Media, Concurrently, with the OSMF ParallelElement</a><br />
<a href="http://cookbooks.adobe.com/post_Dynamic_Streaming_with_OSMF-17638.html">Dynamic Streaming with OSMF</a><br />
<a href="http://cookbooks.adobe.com/post_HTTP_Streaming_in_OSMF-17636.html">HTTP Streaming in OSMF</a></p>
<p>And, as a reminder along these lines, I&#039;m teaching this year at MAX, as a MAX Master, on &#039;Designing Custom Video Players with OSMF&#039; (you can <a href="http://max.adobe.com/sessions/catalog/" target="_blank">browse the catalog of talks and presentations</a> and then you can <a href="http://max.adobe.com/register" target="_blank">register here</a>).</p>
<p>Share and enjoy!</p>
<p>-r<span id="more-1533"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://labs.almerblank.com/2010/07/four-new-osmf-adobe-cookbook-recipes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSMF Sample Player Update for 1.0</title>
		<link>http://labs.almerblank.com/2010/07/osmf-sample-player-update-for-1-0/</link>
		<comments>http://labs.almerblank.com/2010/07/osmf-sample-player-update-for-1-0/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 02:31:37 +0000</pubDate>
		<dc:creator>rblank</dc:creator>
				<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Code & Samples]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[adob]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[max]]></category>
		<category><![CDATA[OSMF]]></category>

		<guid isPermaLink="false">http://labs.almerblank.com/?p=1518</guid>
		<description><![CDATA[I&#039;ve finally started work on my OSMF lab for MAX, &#039;Designing Custom Video Players with OSMF&#039; (you can browse the catalog of talks and presentations and then you can register here).
As you may know, OSMF 1.0 has been release, so one of the first tasks I set for myself was to test the code I [...]]]></description>
			<content:encoded><![CDATA[<p>I&#039;ve finally started work on my OSMF lab for MAX, &#039;Designing Custom Video Players with OSMF&#039; (you can <a href="http://max.adobe.com/sessions/catalog/" target="_blank">browse the catalog of talks and presentations</a> and then you can <a href="http://max.adobe.com/register" target="_blank">register here</a>).</p>
<p>As you may know, OSMF 1.0 has been release, so one of the first tasks I set for myself was to test the code I wrote in April for OSMF 0.95 (which I posted, along with the screencasts of my talk at FITC, <a href="http://labs.almerblank.com/2010/04/new-intro-to-adobe-osmf-videos/">here</a>). And, lo and behold, all of them worked!</p>
<p>Well, all except one. The final demo file, the <cite>Full Sample Player</cite> was playing, but the video was invisible and all the controls were disabled. So I set out to figure out why. (For those who don&#039;t want to read to the end, you can <a href="http://labs.almerblank.com/wp-content/uploads/2010/07/Full-Basic-Player-Update_20100705.zip">download the updated project file, for Flash CS5, here</a>.)</p>
<p><span id="more-1518"></span>It wasn&#039;t long before I found the culprit. It turns out that the MediaPlayer in OSMF now dispatches the &#039;ready&#039; MediaPlayerStateChangeEvent when the video is ready to play for the first time &#8212; not just when it&#039;s ready to play again. So, the result of my last code sample, with OSMF 1.0, was to hide the video and disable the controls &#8212; at the start of the video playback! Not what I wanted.</p>
<p>So, if we just remove lines 157 and 158 (seen below), from the _onMediaPlayerStateChange function, the player will work.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #b1b100;">case</span> <span style="color: #ff0000;">&quot;ready&quot;</span>:
	_disableControls <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span> ;
	_cleanUpVideo <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span> ;
	<span style="color: #b1b100;">break</span>;</pre></div></div>

<p>But now, when our video ends, the video doesn&#039;t get reset (or &#039;cleaned up&#039; or however you want to say it) &#8212; it looks ugly and doesn&#039;t behave how we would expect (because we just removed the code that&#039;s supposed to clean up these videos).</p>
<p>So, how do we clean up at the end of a video? Well, you can now listen for the TimeEvent.COMPLETE event on the MediaPlayer instance &#8212; when it&#039;s fired, the playback of your media is done.</p>
<p>So, if we add this line to the _setupOSMF() function:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">_mediaPlayer.<span style="color: #006600;">addEventListener</span> <span style="color: #66cc66;">&#40;</span> TimeEvent.<span style="color: #006600;">COMPLETE</span> , _onComplete , <span style="color: #000000; font-weight: bold;">false</span> , <span style="color: #cc66cc;">0</span> , <span style="color: #000000; font-weight: bold;">true</span> <span style="color: #66cc66;">&#41;</span> ;</pre></div></div>

<p>&#8230;and then declare the _onComplete function, adding back in those two lines we removed from the _onMediaPlayerStateChange function:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _onComplete <span style="color: #66cc66;">&#40;</span> evt : TimeEvent <span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
	_disableControls <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span> ;
	_cleanUpVideo <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span> ;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>One final note&#8230; Adobe added in string constants for all of the MediaPlayerStateChangeEvent types, grouped in the new MediaPlayerState class. So instead of comparing against the string, &#034;ready&#034;, you can now compare against the string constant of MediaPlayerState.READY. All of them are listed <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/org/osmf/media/MediaPlayerState.html" target="_blank">here</a> and have been included in the <a href="http://labs.almerblank.com/wp-content/uploads/2010/07/Full-Basic-Player-Update_20100705.zip">updated source files that accompany this post</a>.</p>
<p>See you in October at MAX in LA!</p>
<p>And, as always, share and enjoy!</p>
<p>-r</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.almerblank.com/2010/07/osmf-sample-player-update-for-1-0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Free OSMF 1.0 Webcast, June 9th</title>
		<link>http://labs.almerblank.com/2010/05/free-osmf-1-0-webcast-june-9th/</link>
		<comments>http://labs.almerblank.com/2010/05/free-osmf-1-0-webcast-june-9th/#comments</comments>
		<pubDate>Mon, 17 May 2010 22:56:16 +0000</pubDate>
		<dc:creator>rblank</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[flash video]]></category>
		<category><![CDATA[OSMF]]></category>
		<category><![CDATA[strobe]]></category>

		<guid isPermaLink="false">http://labs.almerblank.com/?p=1493</guid>
		<description><![CDATA[The OSMF team sent this to me to help get the word out, and I wanted to pass it along to you all.
On Wednesday, June 9th, Adobe will be hosting a FREE 90-minute session, run by Lisa Larson-Kelley, on the formal launch of the 1.0 version of the Adobe Open Source Media Framework (OSMF). Lisa [...]]]></description>
			<content:encoded><![CDATA[<p>The OSMF team sent this to me to help get the word out, and I wanted to pass it along to you all.</p>
<p>On Wednesday, June 9th, Adobe will be hosting a FREE 90-minute session, run by Lisa Larson-Kelley, on the formal launch of the 1.0 version of the Adobe Open Source Media Framework (OSMF). Lisa will also cover the beta release of  &#034;Strobe Media Playback,&#034; a pre-compiled SWF media player (including source code) based on OSMF.</p>
<p>The <a href="http://www.eventsadobe.com/osmflaunch/invite.html" target="_blank">invitation is here</a> and you may <a href="http://www.eventsadobe.com/osmflaunch/user_info.php" target="_blank">register here</a>.</p>
<p><span id="more-1493"></span>[blockquote]In this session, Lisa Larson-Kelley will introduce you to the fundamentals of Open Source Media Framework (OSMF), Adobe’s standard video player libraries for building playback experiences and monetizing video on the web. She’ll give you a high-level overview of why you’d want to use OSMF and what it can do, and then dive into its underlying structure and some simple sample code to get you started. This session is for beginner to intermediate programmers and web developers who want to gain a better understanding of OSMF, and how it can simplify media player development.[/blockquote]</p>
<p>Share and enjoy!</p>
<p>-r</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.almerblank.com/2010/05/free-osmf-1-0-webcast-june-9th/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSMF Sample Player Update</title>
		<link>http://labs.almerblank.com/2010/02/osmf-sample-player-update/</link>
		<comments>http://labs.almerblank.com/2010/02/osmf-sample-player-update/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 22:36:05 +0000</pubDate>
		<dc:creator>rblank</dc:creator>
				<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Code & Samples]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[OSMF]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://labs.almerblank.com/?p=1317</guid>
		<description><![CDATA[Some of you may have checked out the courses I posted over on the Adobe Developer Connection on building <a href="http://www.adobe.com/devnet/flash/articles/video_osmf.html" target="_blank">progressive</a> and <a href="http://www.adobe.com/devnet/flash/articles/video_osmf_streaming.html" target="_blank">streaming video players</a> with the Adobe Open Source Media Framework (OSMF).

Unfortunately, even those courses are relatively new, the code in them no longer works, because OSMF has advanced a few sprints. We're now at OSMF sprint 9, and the framework continues to shift quite a bit.

Because there are almost no examples on the web of using OSMF with Flash (as opposed to Flex), and I've had several people email me asking if I had time to update the code.

And, so, finally I did. At least for the progressive player. So you can download the <a href="http://www.adobe.com/devnet/flash/articles/video_osmf/osmf9_progressive_players_cs4.zip" target="_blank">Flash CS4 source code to build an OSMF player with the Sprint 9 framework</a> from the <a href="http://www.adobe.com/devnet/flash/articles/video_osmf.html" target="_blank">article on Building progressive video players in Flash with OSMF</a>.

Share and enjoy!

]]></description>
			<content:encoded><![CDATA[<p>Some of you may have checked out the courses I posted over on the Adobe Developer Connection on building <a href="http://www.adobe.com/devnet/flash/articles/video_osmf.html" target="_blank">progressive</a> and <a href="http://www.adobe.com/devnet/flash/articles/video_osmf_streaming.html" target="_blank">streaming video players</a> with the Adobe Open Source Media Framework (OSMF).</p>
<p>Unfortunately, even those courses are relatively new, the code in them no longer works, because OSMF has advanced a few sprints. We&#039;re now at OSMF sprint 9, and the framework continues to shift quite a bit.</p>
<p>Because there are almost no examples on the web of using OSMF with Flash (as opposed to Flex), and I&#039;ve had several people email me asking if I had time to update the code.</p>
<p>And, so, finally I did. At least for the progressive player. So you can download the <a href="http://www.adobe.com/devnet/flash/articles/video_osmf/osmf9_progressive_players_cs4.zip" target="_blank">Flash CS4 source code to build an OSMF player with the Sprint 9 framework</a> from the <a href="http://www.adobe.com/devnet/flash/articles/video_osmf.html" target="_blank">article on Building progressive video players in Flash with OSMF</a>.</p>
<p>Share and enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.almerblank.com/2010/02/osmf-sample-player-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multi-bitrate Streaming in Adobe OSMF</title>
		<link>http://labs.almerblank.com/2009/12/multi-bitrate-streaming-in-adobe-osmf/</link>
		<comments>http://labs.almerblank.com/2009/12/multi-bitrate-streaming-in-adobe-osmf/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 19:31:53 +0000</pubDate>
		<dc:creator>rblank</dc:creator>
				<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Code & Samples]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[training]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[flash video]]></category>
		<category><![CDATA[OSMF]]></category>

		<guid isPermaLink="false">http://labs.almerblank.com/?p=1299</guid>
		<description><![CDATA[My new online video course on Dynamic Multi-bitrate Streaming with Adobe Open Source Media Framework (OSMF) has just gone live on Adobe Developer Connection.
It&#039;s 35 minutes across five lessons and takes you through the process of converting the progressive OSMF video player (which we create in the first installment of this course on Building Progressive [...]]]></description>
			<content:encoded><![CDATA[<p>My new online video <a href="http://www.adobe.com/devnet/flash/articles/video_osmf_streaming.html" target="_blank">course on Dynamic Multi-bitrate Streaming with Adobe Open Source Media Framework</a> (OSMF) has just gone live on Adobe Developer Connection.</p>
<p>It&#039;s 35 minutes across five lessons and takes you through the process of converting the progressive OSMF video player (which we create in the first installment of this course on <a href="http://www.adobe.com/devnet/flash/articles/video_osmf.html" target="_blank">Building Progressive Video Players with Adobe OSMF</a>, into a dynamic multi-bitrate streaming player. Multi-bitrate streaming occurs when you program your Flash to deliver the highest quality video a viewer can see (dependent on their bandwidth). *<strong>Dynamic</strong>* multi-bitrate streaming is similar, with the additional feature of having your player constantly meters the bandwidth throughout viewing, to adjust the playback between multiple videos seamlessly, as the viewer&#039;s bandwidth may fluctuate.<span id="more-1299"></span></p>
<blockquote><p><strong>Please note:</strong> that the first course on progressive video players was built with OSMF Sprint 5. The second course on streaming with OSMF was built with OSMF Sprint 7. I spend the first lesson of the new course updating the progressive player to work with Sprint 7, and I wrote a few notes about <a href="http://www.rblank.com/2009/11/10/quick-note-on-osmf-0-7/" target="_blank">the major differences between OSMF 0.5 and 0.7 in a post on my personal blog</a> last month. Also note that, by the time the course was published by Adobe, OSMF had already moved forward to Spring 8.</p></blockquote>
<p>When I wrote the first course on building a progressive video player with OSMF, I was struck by two things:<br />
1) OSMF is clean &#8212; really clean &#8212; and it just works well in ways that the AS3 video API does not &#8212; for instance, with OSMF setting volume is a matter of talking to the volume property of the MediaPlayer<br />
2) OSMF felt like a bit of overkill &#8212; you need a lot of imports and classes (a MediaPlayer, a MediaElement, a NetLoader and a URLResource) just to build the simplest of progressive video players &#8212; that would be simple enough, requiring seven lines of code with raw AS3 if you knew it</p>
<p>But, I had a hunch that #2 above was due to the fact that I was using approximately 0.05% of this powerful framework &#8212; like trying to use a nuclear bomb when a shovel would do just fine.</p>
<p>Well, when I started learning how to write the code to build dynamic multi-bitrate streaming player, I quickly learned that my hunch was right. The benefits of OSMF really kick in once you do anything beyond the most basic video player.</p>
<p>In the case of streaming, to convert your progressive OSMF video player to a streaming OSMF video player, all you do is change the URL! Seriously, that&#039;s it. OSMF is smart enough to know that when you try to load a video from an RTMP server, you&#039;re trying to stream &#8212; and it takes care of the rest.</p>
<p>That was pretty neat. But the benefits really kicked in when I beefed my regular streaming OSMF video player to one that supports dynamic multi-bitrate streaming. All it took was just a few extra lines of code to turn my regular video player into one that supports dynamic multi-bitrate streaming. If you want to learn those lines of code, I&#039;d recommend checking out the course.</p>
<p>As I say, I&#039;m still just barely cracking the surface of OSMF, and I&#039;m really looking forward to digging deeper into its support for layouts, playlists and monetization. But, even with this second course, the massive time, workflow and standardization features of OSMF are already revealing themselves.</p>
<p>Share and enjoy!</p>
<p>-r</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.almerblank.com/2009/12/multi-bitrate-streaming-in-adobe-osmf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Flash to Turn Pictures into Music</title>
		<link>http://labs.almerblank.com/2009/12/using-flash-to-turn-pictures-into-music/</link>
		<comments>http://labs.almerblank.com/2009/12/using-flash-to-turn-pictures-into-music/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 01:06:07 +0000</pubDate>
		<dc:creator>rblank</dc:creator>
				<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[ludi]]></category>

		<guid isPermaLink="false">http://labs.almerblank.com/?p=1291</guid>
		<description><![CDATA[I&#039;ve just publicly released the first available output from the Synesthesizer &#8212; a side-project, executed in Flash, that translates pictures into music. The Synesthesizer is the first tangible product of Project Ludi, an internal skunkworks project here at Almer/Blank, the goal of which is to translate any type of media into any other type of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#039;ve just publicly released the first available output from the Synesthesizer &#8212; a side-project, executed in Flash, that translates pictures into music. The Synesthesizer is the first tangible product of Project Ludi, an internal skunkworks project here at Almer/Blank, the goal of which is to translate any type of media into any other type of media.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="430" height="260" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.rblank.com/wp-content/uploads/2009/12/synesthesizer_output1_demo1.swf" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="430" height="260" src="http://www.rblank.com/wp-content/uploads/2009/12/synesthesizer_output1_demo1.swf" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>The Synesthesizer is a Flash 10 musical synthesizer that relies on <a href="http://en.wikipedia.org/wiki/Synesthesia" target="_blank">synesthesia</a>-inspired translation metaphors.</p>
<p><span id="more-1291"></span>I&#039;m only a few short months into what is a very long-term endeavor, and I&#039;ve had precious few hours to spend on the project in that time, but I always set the benchmark definition of version 1.0 of the synesthesizer as &#039;a system that produces something approximating music&#039;, and even though I haven&#039;t invested nearly the amount of time as I&#039;d like, I believe that the current Synesthesizer meets this definition. And thus, I feel I have Synesthesizer 1.0.</p>
<p>The Synesthesizer is a Flash 10 application that translates pictures into music in real-time. What I&#039;ve included with this post is a rendering of the output of the application &#8212; not the Synesthesizer itself. I&#039;ll let you judge the quality for yourself &#8212; and please feel free to let me know what you think.</p>
<p>Now, of course, there is far more to do here, but what I found most amazing about this process was how easy it was to get to a point of generating &#039;music&#039; instead of &#039;sound&#039;. In effect, I apply something along the order of six rules to get to this point. The addition of each rule to the Synesthesizer brings us closer to the generation of music, instead of raw sound.</p>
<p><a href="http://www.rblank.com/wp-content/uploads/2009/12/hearingPictures_20091129_b.001.png"><img class="alignnone size-medium wp-image-798" style="margin-right: 10px;margin-bottom: 10px;" title="Hearing Pictures" src="http://www.rblank.com/wp-content/uploads/2009/12/hearingPictures_20091129_b.001-300x225.png" alt="Hearing Pictures" width="300" height="225" align="left" /></a>To get a bit more insight into the Synesthesizer, you should check out my talk, <em>Hearing Pictures</em>, which I&#039;ll be presenting <a href="http://www.fitc.ca/events/presentations/presentation.cfm?event=101&amp;presentation_id=1103" target="_blank">at FITC Amsterdam in February</a> and <a href="http://www.fitc.ca/events/presentations/presentation.cfm?event=102&amp;presentation_id=1108" target="_blank"> at FITC Toronto in April</a>.</p>
<p>In this talk, I describe the process I followed to get the Synesthesizer to this point. Using the 1943 Hermann Hesse novel, <a href="http://en.wikipedia.org/wiki/The_Glass_Bead_Game" target="_blank"><em>The Glass Bead Game</em></a> (also published under the title <em>Magister Ludi</em>, the protagonist of the novel, from whom Project Ludi derives its name), as a starting point, and proceeding through a discussion of <a href="http://en.wikipedia.org/wiki/Synesthesia" target="_blank">synesthesia</a>, the <a href="http://deutsch.ucsd.edu/" target="_blank">aural illusions of Professor Diana Deutsch</a>, the <a href="http://artsites.ucsc.edu/faculty/cope/experiments.htm" target="_blank">Experiments in Musical Intelligence by Professor David Cope</a>, the <a href="http://www.npr.org/templates/story/story.php?storyId=112444869" target="_blank">music of Tamarin Monkeys</a>, and many other stepping points, I walk through the thought process required to assume an odd endeavor such as the cross-modal translation of pictures into music.</p>
<p>Share and enjoy!</p>
<p>-r</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.almerblank.com/2009/12/using-flash-to-turn-pictures-into-music/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZamfBrowser 1.1</title>
		<link>http://labs.almerblank.com/2009/11/zamfbrowser-1-1/</link>
		<comments>http://labs.almerblank.com/2009/11/zamfbrowser-1-1/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 22:50:21 +0000</pubDate>
		<dc:creator>Omar Gonzalez</dc:creator>
				<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Code & Samples]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[code examples]]></category>
		<category><![CDATA[code generator]]></category>
		<category><![CDATA[flash builder]]></category>
		<category><![CDATA[stub]]></category>
		<category><![CDATA[stub code]]></category>
		<category><![CDATA[Unit Testing]]></category>
		<category><![CDATA[Zamf]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[ZendAMF]]></category>
		<category><![CDATA[ZendAMF Service Browser]]></category>

		<guid isPermaLink="false">http://labs.almerblank.com/?p=1275</guid>
		<description><![CDATA[Just posted an update to ZamfBrowser.  ZamfBrowser can now generate code for use in either Flash or Flex based projects.  Simply point ZamfBrowser to the source path folder where your code is, the &#034;com&#034; folder.  Then enter the package you would like the services in, for example &#034;com.project.services&#034;.  ZamfBrowser will create a methods package and [...]]]></description>
			<content:encoded><![CDATA[<p>Just posted an update to ZamfBrowser.  ZamfBrowser can now generate code for use in either Flash or Flex based projects.  <span id="more-1275"></span>Simply point ZamfBrowser to the source path folder where your code is, the &#034;com&#034; folder.  Then enter the package you would like the services in, for example &#034;com.project.services&#034;.  ZamfBrowser will create a methods package and a classes package within the services package you specify.  The classes in the &#034;classes&#034; package reflect the AMF services on the backend.  Service calls can also be made by starting a method object by itself from the classes in the &#034;methods&#034; package.  The Flex package uses the same class that ZamfBrowser uses to unit test methods.  The Flash package has been lightly tested.  As bugs come up please post them to the site http://zamfbrowser.riaforge.org   Usage examples will follow soon at http://labs.almerblank.com</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.almerblank.com/2009/11/zamfbrowser-1-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hype/Papervision3D Demo</title>
		<link>http://labs.almerblank.com/2009/11/hypepapervision3d-demo/</link>
		<comments>http://labs.almerblank.com/2009/11/hypepapervision3d-demo/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 19:40:11 +0000</pubDate>
		<dc:creator>Nolan Butcher</dc:creator>
				<category><![CDATA[Code & Samples]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Hype]]></category>
		<category><![CDATA[Papervision]]></category>
		<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://flexgraphix.com/blog/?p=101</guid>
		<description><![CDATA[This post features a quick demo of some of the SoundAnalyzer capabilities of the Hype framework, including some code samples. After working with Hype, I've found that while it's definitely not a catch-all framework, it does help cut down on common repetitive coding tasks.

UPDATE - I decided to give a tween engine one more shot, and was able to use TweenMax while keeping the framerate at an acceptable level.]]></description>
			<content:encoded><![CDATA[So after getting my hands on the new <a href="http://hype.joshuadavis.com/">Hype</a> framework, I wanted to put together a simple demo together that utilizes a combination of the SoundAnalyzer class and some 3D eye candy (via Papervision3D).<br /><br />

First off, I can say that I really like being able to play around with the sound spectrum using only a couple lines of code. I also used the Rythm class to run an enter frame method, which is very convenient in that I didn't need to manually set up an event and listener.<br /><br />

Lastly, I wanted to also utilize a tweening engine to smooth out the particle movement, but doing so cut the framerate by about 80% (a little better with TweenMax/TweenLite, but still not good enough). I also briefly played around with the <a href="http://flintparticles.org/">Flint particle emitter</a>, but I'm not familiar enough with Papervision/Flint to get it working how I wanted.<br /><br />

<strong style="font-weight: bold;">UPDATE - I decided to give a tween engine one more shot, and was able to use TweenMax while keeping the framerate at an acceptable level.</strong><br /><br />

<strong style="font-weight: bold;">UPDATE 11/06/2009 - Updated code sample to reflect demo swf.</strong><br /><br />

<strong>UPDATE 3/29/2010 - It's come to my attention that Wordpress tends to be a bit moody when it comes to code formatting in posts, especially in the case of vectors (which use the greater than/less than characters). That said, I've posted a couple pastebin examples:<br /><br />

Link --> <a href="http://pastebin.com/LbBzZdjJ">Document class</a><br />
Link --> <a href="http://pastebin.com/uyk8gfnh">ApplicationView class</a><br />
</strong><br />
<span id="more-1215"></span>


Here's the demo in action-<br /><br />

<object width="580" height="580"><param name="movie" value="http://flexgraphix.com/blog/wp-content/uploads/2009/11/Paper_Hype_Lab3.swf"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://flexgraphix.com/blog/wp-content/uploads/2009/11/Paper_Hype_Lab3.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="580" height="580"></embed></object>

..and here's the code-<br />

Paper_Hype_Lab.as (this would be the document class in Flash):
<pre lang="actionscript3">package {
	import __AS3__.vec.Vector;

	import com.almerblanklabs.view.ApplicationView;
	import com.lifeztream.debug.FPS;

	import flash.display.SimpleButton;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.MouseEvent;
	import flash.events.ProgressEvent;
	import flash.external.ExternalInterface;
	import flash.media.Sound;
	import flash.media.SoundChannel;
	import flash.media.SoundLoaderContext;
	import flash.media.SoundTransform;
	import flash.net.URLRequest;
	import flash.system.LoaderContext;
	import flash.system.Security;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import flash.text.TextFormatAlign;

	import flash.utils.setTimeout;

	import hype.framework.behavior.SimpleBehavior;
	import hype.framework.core.TimeType;
	import hype.framework.rhythm.SimpleRhythm;
	import hype.framework.sound.SoundAnalyzer;

	import org.papervision3d.objects.primitives.Sphere;

	[SWF(width='580', height='580', backgroundColor='#000000')]

	/**
	 *
	 * @author Nolan Butcher
	 *
	 * DISCLAIMER : This code sample is by no means an optimized example. It is a PROTOTYPE.
	 * 				Please keep this in mind when looking through this code.
	 *
	 */	

	public class Paper_Hype_Lab extends Sprite
	{
		private static const ARTIST : String = "Trioptic of the Sound Scientists";
		private static const AUDIO_PATH : String = 'http://flexgraphix.com/blog/wp-content/uploads/2009/11/';
		private static const AUDIO_FILES : Array = [
														{file:'evil_violin.mp3', title:'Evil Violin(Rich \'n Stingy)'},
														{file:'am_i_going_to_die.mp3', title:'Am I Going to Die'},
														{file:'going_pro.mp3', title:'Going Pro'},
														{file:'life_is_easily_taken.mp3', title:'Life is Easily Taken'},
														{file:'bubachu.mp3', title:'Bubachu'},
														{file:'midi_in-out.mp3', title:'Midi In/Out'},
														{file:'may_6.mp3', title:'May 6'},
														{file:'slow_descent.mp3', title:'Slow Descent'},
														{file:'nocens_sonitus.mp3', title:'Nocens Sonitus'},
														{file:'remember.mp3', title:'Remember'},
														{file:'soulful_east_coast.mp3', title:'Soulful East Coast'},
														{file:'sunrise_on_the_highway.mp3', title:'Sunrise on the Highway'},
														{file:'the_sad_truth_of_it_all.mp3', title:'The Sad Truth of it All'},
														{file:'blueberry_haze.mp3', title:'Blueberry Haze'}
													];

		private static const VOLUME : Number = 1;

		private var _view : ApplicationView;
		private var _sphere : Sphere;
		private var _music : Sound;
		private var _sndChannel : SoundChannel;
		private var _soundAnalyzer : SoundAnalyzer;
		private var _freq : Vector. = new Vector.;
		private var _rythm : SimpleRhythm;
		private var _fps : FPS;
		private var _audioIndex : int = 1;

		private var _button : Sprite;
		private var _hitArea : Sprite;

		private var _textField : TextField;
		private var _songText : TextField;

		private var _rotationX : Number = 0.3;
		private var _rotationY : Number = 0.3;
		private var _cameraPitch : Number = 90;
		private var _cameraYaw : Number = 270;

		private var _xDist : Number;
		private var _yDist : Number;

		private var _mouseDown : Boolean = false;

		public function Paper_Hype_Lab()
		{
			Security.allowDomain('*');

			stage.frameRate = 60;

			_sphere = new Sphere(null, 300, 24, 14);

			_view = new ApplicationView();
			_view.object3D = _sphere;
			_view.startRendering();

			addChild(_view);

			_initRythm();
			_initTextField();
			_loadSound();
			_initUI();

			// Get the FPS widget @ www.lifeztream.com
			_fps = new FPS();
			addChild(_fps);

		}

		private function _handleMouseEvents(evt:MouseEvent):void
		{
			switch(String(evt.type))
			{
				case MouseEvent.MOUSE_DOWN:
					_mouseDown = true;
				break;
				case MouseEvent.MOUSE_UP:
					_mouseDown = false;
				break;
			}
		}

		private function _loadSound():void
		{
			var context : SoundLoaderContext = new SoundLoaderContext(1000, true);
			var req : URLRequest = new URLRequest();
				req.url = AUDIO_PATH + AUDIO_FILES[_audioIndex].file;

			if (_rythm &amp;&amp; _rythm.isRunning) _pauseRythm();
			if (_sndChannel)
			{
				_sndChannel.stop();
				try {
					_music.close();
				} catch(e:Error) {
					trace ('cannot close sound stream');
				}
			}
			_music = new Sound(req, context);
			_music.addEventListener(IOErrorEvent.IO_ERROR, _handleIOErrorEvents, false, 0, true);

			_sndChannel = _music.play(0, 1, new SoundTransform(VOLUME));
			_sndChannel.addEventListener(Event.SOUND_COMPLETE, _onSoundDone, false, 0, true);

			_soundAnalyzer = new SoundAnalyzer();
			_soundAnalyzer.start();

			_updateSongText();
			if (_rythm) _initRythm();

		}

		private function _onSoundDone(evt:Event):void
		{
			_button.mouseEnabled = false;
			setTimeout(_nextSong, 1000);
		}

		private function _nextSong():void
		{
			_button.mouseEnabled = true;
			_button.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
		}

		private function _handleIOErrorEvents(evt:IOErrorEvent):void
		{
			if (ExternalInterface.available)
			{
				ExternalInterface.call("window.alert('" + AUDIO_FILES[_audioIndex].file + " cannot be loaded')");
			}
		}

		private function _initUI():void
		{
			_hitArea = new Sprite();
			_hitArea.graphics.beginFill(0x000,0);
			_hitArea.graphics.drawRect(0,0,580,580);
			_hitArea.graphics.endFill();
			_hitArea.addEventListener(MouseEvent.MOUSE_DOWN, _handleMouseEvents, false, 0, true);
			_hitArea.addEventListener(MouseEvent.MOUSE_UP, _handleMouseEvents, false, 0, true);
			addChild(_hitArea);

			_button = new Sprite();
			_button.graphics.beginFill(0x666666);
			_button.graphics.drawRect(0,0,100,30);
			_button.graphics.endFill();
			_button.x = 476;
			_button.y = 4;
			_button.buttonMode = true;
			_button.mouseChildren = false;
			_button.useHandCursor = true;
			_button.addEventListener(MouseEvent.CLICK, _handleButtonEvents, false, 0, true);

			var buttonFormat : TextFormat = new TextFormat(null, 14, 0xFFFFFF, true);
			var buttonText : TextField = new TextField();

				buttonText.defaultTextFormat = buttonFormat;
				buttonText.text = "NEXT RIFF";
				buttonText.height = 18;
				buttonText.y = (_button.height - buttonText.textHeight) * .5;
				buttonText.x = (_button.width - buttonText.textWidth) * .5;

			addChild(_button);

			_button.addChild(buttonText);
		}

		private function _pauseRythm():void
		{
			_rythm.stop();
		}

		private function _resumeRythm():void
		{
			_rythm.start();
		}

		private function _initRythm():void
		{
			_rythm = new SimpleRhythm(_trackRythm);
			_rythm.start(TimeType.ENTER_FRAME);
		}

		private function _initTextField():void
		{
			var textFormat : TextFormat = new TextFormat();
				textFormat.color = 0x666666;
				textFormat.align = TextFormatAlign.CENTER;
				textFormat.size = 14;

			_songText = new TextField();
			_songText.defaultTextFormat = textFormat;
			_songText.width = 1;
			_songText.text = "-- :: --";
			_songText.autoSize = TextFieldAutoSize.CENTER;
			_songText.y = (stage.stageHeight - _songText.textHeight) - 4;
			_songText.x = (stage.stageWidth - _songText.width) * 0.5;
			addChild(_songText);

			var artistText : TextField = new TextField();
				artistText.defaultTextFormat = textFormat;
				artistText.width = 1;
				artistText.text = "-- Artist :: " + ARTIST + " --";
				artistText.x = (stage.stageWidth - artistText.width) * 0.5;
				artistText.y = (_songText.y - artistText.textHeight) - 4;
				artistText.autoSize = TextFieldAutoSize.CENTER;

			addChild(artistText);

			_textField = new TextField();
			_textField.width = 1;
			_textField.defaultTextFormat = textFormat;
			_textField.text = "-- Click and drag to rotate sphere --";
			_textField.x = (stage.stageWidth - _textField.width) * 0.5;
			_textField.y = artistText.y - _textField.textHeight - 5;
			_textField.autoSize = TextFieldAutoSize.CENTER;

			addChild(_textField);

		}

		private function _updateSongText():void
		{
			_songText.text = "-- Song :: " + AUDIO_FILES[_audioIndex].title + " --";
			_songText.x = (stage.stageWidth - _songText.width) * 0.5;
		}

		private function _handleButtonEvents(evt:MouseEvent):void
		{
			_sndChannel.removeEventListener(Event.SOUND_COMPLETE, _onSoundDone);
			if (_audioIndex &lt; AUDIO_FILES.length-2)
			{
				_audioIndex++;
			} else {
				_audioIndex = 0;
			}

			_loadSound();
		}

		private function _trackRythm(rythm : SimpleRhythm):void
		{
			for (var i:int = 1;i &lt; _sphere.geometry.vertices.length + 1;++i)
			{
				_freq[i-1] = _soundAnalyzer.getFrequencyIndex(i, 400, 100);
			}

			_view.moveParticles(_freq);

			// Rotates camera around sphere depending on mouse position
			if (_mouseDown)
			{
				_xDist = mouseX - stage.stageWidth * 0.5;
				_yDist = mouseY - stage.stageHeight * 0.5;

				_cameraPitch = _yDist * _rotationX + 90;
				_cameraYaw = _xDist * _rotationY + 270;

				_view.camera.orbit(_cameraPitch, _cameraYaw);
			}

		}
	}
}</pre>
ApplicationView.as (extends PV3D's BasicView class):
<pre lang="actionscript3">package com.almerblanklabs.view
{
	import __AS3__.vec.Vector;
	
	import com.greensock.OverwriteManager;
	import com.greensock.TweenMax;
	import com.greensock.easing.Elastic;
	import com.greensock.plugins.MotionBlurPlugin;
	import com.greensock.plugins.TweenPlugin;
	
	import flash.events.Event;
	
	import org.papervision3d.core.geom.Particles;
	import org.papervision3d.core.geom.renderables.Particle;
	import org.papervision3d.core.geom.renderables.Vertex3D;
	import org.papervision3d.materials.special.ParticleMaterial;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.view.BasicView;
	
	//import com.greensock.plugins.

	public class ApplicationView extends BasicView
	{
		private var _object3D : DisplayObject3D;
		private var _origVertices : Vector.<Object>;
		private var _displayObj : DisplayObject3D;
		private var _satellites : Vector.<Particle>;
		private var _particles : Particles;
		
		public function ApplicationView()
		{
			super(580, 580);	
			//TweenPlugin.activate([MotionBlurPlugin]);		
		}
		
		override protected function onRenderTick(event:Event=null):void
		{
			super.onRenderTick();
		}
		
		public function set object3D(aValue : DisplayObject3D):void
		{
			_object3D = aValue;
			_setObjectVertices();
		}
		
		private function _setObjectVertices():void
		{
			_origVertices = new Vector.<Object>;
			for each(var vert : Vertex3D in _object3D.geometry.vertices)
			{
				var vertObj : Object = {x:vert.x, y:vert.y, z:vert.z};
				_origVertices.push(vertObj);
			}
			
			_initParticles();
		}
		
		private function _initParticles():void
		{			
			var material : ParticleMaterial = new ParticleMaterial(0xff0000, 1, ParticleMaterial.SHAPE_CIRCLE, 10);
			
			_satellites = new Vector.<Particle>();			
			_particles = new Particles();			
			_displayObj = new DisplayObject3D();
			
			scene.addChild(_particles);
			scene.addChild(_displayObj);
			
			_displayObj.addChild(_particles);
			
			for each(var vert : Vertex3D in _object3D.geometry.vertices)
			{					
				var particle : Particle = new Particle(material);
					particle.x = vert.x;
					particle.y = vert.y;
					particle.z = vert.z;
					
				_particles.addParticle(particle);
				
				_satellites.push(particle);
			}
		}
		
		public function moveParticles(aValue:Vector.<Number>):void
		{
				var i : int = 0;
				var j : int = 0;
				var t : int = 0;
				
				// This ensures even distribution among all vertices.
				var divisor : Number = Math.floor(_satellites.length / 256);
				
				for each (var sat : Particle in _satellites)
				{
					// The values used in the x,y,z calculations were achieved through trial and error...
					TweenMax.to(_satellites[i], .2, {
														x: _origVertices[i].x * ((400 / aValue[i]) * 1.2),
														y: _origVertices[i].y * ((400 / aValue[i]) * 1.2),
														z: _origVertices[i].z * ((400 / aValue[i]) * 1.2),
														overwrite: OverwriteManager.PREEXISTING
													} );
					
					
					if (i < (_satellites.length - (divisor - 1))) {
						i += divisor;
					}
					
					
				}
				
			
			_displayObj.localRotationZ += .3;
			_displayObj.localRotationY += .1;			
		}
		
		private function _renderScene():void
		{
			renderer.renderScene(scene, camera, viewport);
		}
	}
}</pre>
Enjoy ;)]]></content:encoded>
			<wfw:commentRss>http://labs.almerblank.com/2009/11/hypepapervision3d-demo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The Ideal Flash Symbol Library</title>
		<link>http://labs.almerblank.com/2009/11/the-ideal-flash-symbol-library/</link>
		<comments>http://labs.almerblank.com/2009/11/the-ideal-flash-symbol-library/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 01:39:24 +0000</pubDate>
		<dc:creator>rblank</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[flash builder]]></category>
		<category><![CDATA[workflow]]></category>

		<guid isPermaLink="false">http://labs.almerblank.com/?p=1109</guid>
		<description><![CDATA[Roughly one year ago, I decided to sit down and write up some notes, and draft some wires, of where I thought the Flash IDE GUI could be improved to support improved workflow. As I’m sure any power-user of any tool feels, I have my own special beefs with the Flash IDE — some of which I know are silly, and some of which I assume would actually be valuable to a broader audience. But, as CTO/COO of a Flash Platform development shop, where my guys excel in the use of basically every SWF-generating tool there is, I have several opinions based on how I feel, from an operations perspective, the cross-tool Flash workflow should be supported by Adobe’s own software.

After thinking over these ideas for a year, one of the suggestions in particular keeps coming back to me. The Library.[...]]]></description>
			<content:encoded><![CDATA[<p>Roughly one year ago, I decided to sit down and write up some notes, and draft some wires, of where I thought the Flash IDE GUI could be improved to support improved workflow. As I&#039;m sure any power-user of any tool feels, I have my own special beefs with the Flash IDE &#8212; some of which I know are silly, and some of which I assume would actually be valuable to a broader audience. But, as CTO/COO of a Flash Platform development shop, where my guys excel in the use of basically every SWF-generating tool there is, I have several opinions based on how I feel, from an operations perspective, the cross-tool Flash workflow should be supported by Adobe&#039;s own software.</p>
<p>After thinking over these ideas for a year, one of the suggestions in particular keeps coming back to me. The Library.<span id="more-1109"></span> I know that the Library panel itself in the Flash IDE has long been an issue that power-users cite &#8212; forcing Macromedia, and now Adobe, to rebuild that panel from scratch more than once. And yet, even today, how many users know that there are several columns in the Library (which you will see if you widen the panel sufficiently)?</p>
<p>While the Library has long been clunky, in recent versions (and especially CS4) it&#039;s been souped up and works a lot better than it used to. But it is still not well-suited for developers. Which is a problem on its own terms, but is even more of an issue, because Flash is the only IDE through which developers can interact with libraries and symbols &#8212; there is no way to open an FLA symbol library in any tool other than Flash.</p>
<p>So, one of the core suggestions I submitted represented a rebuild of the library, with two goals:</p>
<ul>
<li>Make it easier for developers to do their work with libraries in Flash</li>
<li>Do not require developers to use Flash to work with libraries</li>
</ul>
<p>What I came up with was what I called the &#039;Developer Library View&#039; (DLV) which I argued should be implemented both in the Flash IDE, as well as the Flash Builder IDE (nee Flex Builder). So, developers who work with Flash would have an easier time coding with library symbols, and developers who prefer Flash Builder would not have to leave that tool in order to execute normal types of developer tasks in the Library (essentially, assigning class linkages and export settings, but also component-related settings).</p>
<div id="attachment_1110" class="wp-caption alignnone" style="width: 310px"><a href="http://labs.almerblank.com/wp-content/uploads/2009/11/Library.png"><img class="size-medium wp-image-1110" title="Library Wireframe (click to enlarge)" src="http://labs.almerblank.com/wp-content/uploads/2009/11/Library-300x131.png" alt="Library Wireframe (click to enlarge)" width="300" height="131" /></a><p class="wp-caption-text">Library Wireframe (click to enlarge)</p></div>
<p>The DLV is intended to make it easier to work with the symbol linkages and other coding-specific settings of all library symbols. The DLV contains a three panel layout. On the left, in Panel 1 (the Library Items panel), there is a vertically-scrollable (and filterable) list of all library symbols. In the middle, in Panel 2 (the Library Symbol Settings panel), there is a horizontally- and vertically- scrollable data-grid of all item settings. Panel 1 and Panel 2 are tied together, like an Excel spreadsheet, with the top row and the first column frozen. On the right, Panel 3 (the Properties panel) functions like the Properties panel already in Flash CS4, but with the contents modified to be relevant to the properties a developer would be interested in when working with a library symbol.</p>
<p>All three panels are horizontally resizable. In Panel 2, the Library Symbol Settings panel, all columns are infinitely resizable (or at least really large &#8212; you need to be able to see and work with really long package and class names). I envision a series of keyboard and mouse interactions designed to facilitate the workflow. For example, when you mouse-over a class assignment, buttons could appear that would allow you to launch the class file, and re-assign the symbol to another class file through a file dialog &#8212; and when you click in the class name, you can manually type to change the value. In this wire, as a suggestion, the colors red, green and black are utilized to indicate class status (black = Adobe class; green = found custom class; red = missing custom class). While the basic layout of this information is quite helpful, these additional interactions would add significant efficiency to any developer working with this interface.</p>
<p>Many of the commonly-accessed settings that now require right-clicking on library symbols would be moved into the Properties panel on the right for rapid access. One new feature I recommend here is like a mini Movie Explorer panel &#8212; revealing the display list of that display object in a tree-list format. And, ideally, the display list view would introspect an indefinite number of levels of hierarchy (revealing n levels of the display list under the selected display object) &#8212; and possibly introspect across all frames (e.g., when rendering the display list of a 10-frame MovieClip, we would see all distinct instances across all 10 frames &#8212; not just whatever instances are on frame 1). I would also recommend that the main timeline appear as an unremovable symbol in the library so that developers can work with main timeline linkages in the same manner as all other symbols.</p>
<p>Ideally, this Developer View could be implemented with a project-wide scope, rather than just an FLA-specific scope. And again, what&#039;s really important, is that this view / workflow should be supported in both the Flash and Flash Builder IDEs &#8212; any developer working with Flash should have this option &#8212; the workflow should not be restricted to a single tool.</p>
<p>And, of course, once you have this view supported in both the Flash IDE and Flash Builder, the tools should support live round-tripping &#8212; developers should have the ability to have the same project open at the same time in both Flash and Flash Builder (just like Silverlighters can do with ExpressionStudio and VisualStudio). But I suppose that&#039;s a separate battle, and we should be happy if we get the Developer Library View.</p>
<p>In the long run &#8212; in one or two more versions &#8212; assuming Adobe implements the XML-based XFL file format to replace FLA, then these issues become less pressing. Once the source format for Flash is XML-based &#8212; and since it is possible to read and write local files of any type in both Flash Player 10+ and AIR &#8212; developers can write their own tools to support their own workflows. In fact, if XFL were fully implemented as of today, there would be nothing stopping a talented and motivated Flash developer from turning the &#039;Developer Library View&#039; (defined above) into a standalone AIR application. Now that&#039;s a future worth looking forward to.</p>
<p>Share and enjoy!</p>
<p>-r</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.almerblank.com/2009/11/the-ideal-flash-symbol-library/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CBS.com Video Player Full Screen Bug</title>
		<link>http://labs.almerblank.com/2009/11/cbs-com-video-player-full-screen-bug/</link>
		<comments>http://labs.almerblank.com/2009/11/cbs-com-video-player-full-screen-bug/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 22:41:56 +0000</pubDate>
		<dc:creator>rblank</dc:creator>
				<category><![CDATA[User Experience]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://www.rblank.com/?p=492</guid>
		<description><![CDATA[My fiancee and I were watching 'TV' last night. (I say 'TV' in quotes because, since getting <a href="http://verizon.com/fios">FiOS</a>, we don't actually watch TV anymore -- opting instead to consume most of our media through <a href="http://hulu.com">Hulu</a>, <a href="http://netflix.com">Netflix</a> -- and, of course, <a href="http://southparkstudios.com">South Park Studios</a>). 

But last night, she had a hankering for <a href="http://www.cbs.com/primetime/medium">Medium</a> or <a href="http://www.cbs.com/primetime/ghost_whisperer">Ghost Whisperer</a>, and searching Hulu we discovered that Hulu links to <a href="http://CBS.com">CBS.com</a> to watch these shows.

We *also* discovered that we dislike the CBS video player a great deal. One of the key UX issues, from my perspective, is how the ads take over the page -- not just the player -- in effect totally obscuring the player. But, that's just a small annoyance. What was much worse was a full-screen bug we discovered.[...]]]></description>
			<content:encoded><![CDATA[My fiancee and I were watching 'TV' last night. (I say 'TV' in quotes because, since getting <a href="http://verizon.com/fios">FiOS</a>, we don't actually watch TV anymore -- opting instead to consume most of our media through <a href="http://hulu.com">Hulu</a>, <a href="http://netflix.com">Netflix</a> -- and, of course, <a href="http://southparkstudios.com">South Park Studios</a>).

But last night, she had a hankering for <a href="http://www.cbs.com/primetime/medium">Medium</a> or <a href="http://www.cbs.com/primetime/ghost_whisperer">Ghost Whisperer</a>, and searching Hulu we discovered that Hulu links to <a href="http://CBS.com">CBS.com</a> to watch these shows.

We *also* discovered that we dislike the CBS video player a great deal.<span id="more-1106"></span> One of the key UX issues, from my perspective, is how the ads take over the page -- not just the player -- in effect totally obscuring the player. And it does this in such a way as to require a keen eye to realize you're watching an ad that you just need to wait through before you can watch your show.

But, that's just a small annoyance. What was much worse was a full-screen bug we discovered. The context for the bug appears to be:
<ul>
	<li>watching in full-screen mode</li>
	<li>in a two-monitor setup (like the one we have for our home entertainment system)</li>
</ul>
It seems that the CBS player doesn't calculate coordinate space properly in full-screen mode. The upshot is one of two scenarios (screenshots below). Both screenshots represent a capture of the entire screen in full-screen mode -- one at 1280x800 and one at 1920x1200.

In the first, you'll see I only see the upper-left of the player in full-screen mode -- cropping out most of the video and all of the video controls. Good thing I know to click 'esc' to exit full-screen mode! And in the second, you'll see that full-screen mode only makes use of the top half of my monitor (so, it's more appropriately termed half-screen mode, I suppose).

<a title="Full Screen - Truncated" href="http://www.rblank.com/2009/11/04/cbs-com-video-player-full-screen-bug/cbs_1/"><img class="attachment-thumbnail" title="Full Screen - Truncated" src="http://www.rblank.com/wp-content/uploads/2009/11/cbs_1-150x150.png" alt="Full Screen - Truncated" width="150" height="150" /></a>
<a title="Full Screen - Unused" href="http://www.rblank.com/2009/11/04/cbs-com-video-player-full-screen-bug/cbs_2/"><img class="attachment-thumbnail" title="Full Screen - Unused" src="http://www.rblank.com/wp-content/uploads/2009/11/cbs_2-150x150.png" alt="Full Screen - Unused" width="150" height="150" /></a>

Well, because I've encountered this bug in the past, and know exactly what was causing it, I knew to switch my monitors to mirroring mode would fix the issue -- and it did, and we watched the Ghost Whisperer. But, every other major player out there works just fine for us,  we should not have to change our monitor setup to watch CBS content (and I guarantee my fiancee would not have known to do that on her own, if I hadn't been watching with her). If CBS isn't going to allow me to watch on Hulu, then they should really get someone to fix their Flash video player.

<em>ahem! Just FYI, <a href="http://almerblank.com">Almer/Blank</a> does that sort of thing a lot <img class="wp-smiley" src="http://www.rblank.com/wp-includes/images/smilies/icon_wink.gif" alt=";)" /> .</em>]]></content:encoded>
			<wfw:commentRss>http://labs.almerblank.com/2009/11/cbs-com-video-player-full-screen-bug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
