<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkIHRHg7eip7ImA9WxBbFko.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190</id><updated>2010-03-15T09:28:55.602-07:00</updated><title>Mike's Code Blog</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.nostatic.org/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.nostatic.org/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/MikesCodeBlog" /><feedburner:info uri="mikescodeblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A04DSXs9fCp7ImA9WxBbEUg.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-3915297122603272070</id><published>2010-03-09T10:39:00.001-08:00</published><updated>2010-03-09T10:39:38.564-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-09T10:39:38.564-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="art" /><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="game" /><title>Platform Game - Main Character</title><content type="html">Sherry has rediscovered her inner doodler and has been helping me with art assets for the platform game. Here's what she has so far for the main character:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh4.ggpht.com/_1eC00ALSHt4/S5aUtOZhlMI/AAAAAAAAFdw/I7moY9EET8Q/s1600-h/Player.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Platform Game" border="0" src="http://lh4.ggpht.com/_1eC00ALSHt4/S5aUtOZhlMI/AAAAAAAAFdw/I7moY9EET8Q/s640/Player.jpg" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
In game:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh6.ggpht.com/_1eC00ALSHt4/S5aUtArfuMI/AAAAAAAAFd0/oDCI70MyAaA/s1600-h/PlayerInGame.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Platform Game" border="0" src="http://lh6.ggpht.com/_1eC00ALSHt4/S5aUtArfuMI/AAAAAAAAFd0/oDCI70MyAaA/s640/PlayerInGame.jpg" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-3915297122603272070?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/Tvr8T1qsKdY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/3915297122603272070/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2010/03/platform-game-main-character.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/3915297122603272070?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/3915297122603272070?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/Tvr8T1qsKdY/platform-game-main-character.html" title="Platform Game - Main Character" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_1eC00ALSHt4/S5aUtOZhlMI/AAAAAAAAFdw/I7moY9EET8Q/s72-c/Player.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.nostatic.org/2010/03/platform-game-main-character.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4NRX87eSp7ImA9WxBUF04.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-1129648520690908755</id><published>2010-03-04T13:43:00.001-08:00</published><updated>2010-03-04T13:43:14.101-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-04T13:43:14.101-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="music" /><category scheme="http://www.blogger.com/atom/ns#" term="game" /><title>Tunescape Tutorial Video</title><content type="html">&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8lq0zcsOukQ&amp;hl=en_US&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/8lq0zcsOukQ&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
This is the in-game tutorial in Tunescape.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-1129648520690908755?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/6svbtxt9IKg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/1129648520690908755/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2010/03/tunescape-tutorial-video.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/1129648520690908755?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/1129648520690908755?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/6svbtxt9IKg/tunescape-tutorial-video.html" title="Tunescape Tutorial Video" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.nostatic.org/2010/03/tunescape-tutorial-video.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQHRXw9eSp7ImA9WxBUFUg.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-4671267006483663006</id><published>2010-03-02T10:08:00.001-08:00</published><updated>2010-03-02T10:08:54.261-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-02T10:08:54.261-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="music" /><category scheme="http://www.blogger.com/atom/ns#" term="game" /><title>Tunescape DBP 2010 Trailer</title><content type="html">&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/wiU_O_FcNtw&amp;hl=en_US&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/wiU_O_FcNtw&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
This is the Tunescape trailer for &lt;a href="http://www.dreambuildplay.com"&gt;DreamBuildPlay 2010&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I suck at video editing...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-4671267006483663006?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/HttDNFYE7Xg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/4671267006483663006/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2010/03/tunescape-dbp-2010-trailer.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/4671267006483663006?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/4671267006483663006?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/HttDNFYE7Xg/tunescape-dbp-2010-trailer.html" title="Tunescape DBP 2010 Trailer" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.nostatic.org/2010/03/tunescape-dbp-2010-trailer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4MQH85eyp7ImA9WxBUEUk.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-4619785274258680380</id><published>2010-02-25T17:33:00.001-08:00</published><updated>2010-02-25T17:33:01.123-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-25T17:33:01.123-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="HLSL" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="game" /><title>Platform Game - More WIP</title><content type="html">&lt;a href="http://lh3.ggpht.com/_1eC00ALSHt4/S4cjI2gwpUI/AAAAAAAAFc0/_IJdH9e-EMQ/s1600-h/Platformer.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Platform Game" border="0" src="http://lh3.ggpht.com/_1eC00ALSHt4/S4cjI2gwpUI/AAAAAAAAFc0/_IJdH9e-EMQ/s640/Platformer.png" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
A little more progress on my platform game. I've now got background tiles, grass and little wee flowers.&lt;br /&gt;
&lt;br /&gt;
The blurring effect in the background is done in real-time on the GPU. Yay for gratuitous use of shaders!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-4619785274258680380?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/OfKFatKl-08" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/4619785274258680380/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2010/02/platform-game-more-wip.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/4619785274258680380?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/4619785274258680380?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/OfKFatKl-08/platform-game-more-wip.html" title="Platform Game - More WIP" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_1eC00ALSHt4/S4cjI2gwpUI/AAAAAAAAFc0/_IJdH9e-EMQ/s72-c/Platformer.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.nostatic.org/2010/02/platform-game-more-wip.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIASX4zcCp7ImA9WxBUEEk.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-9148307675892261264</id><published>2010-02-24T11:42:00.001-08:00</published><updated>2010-02-24T11:42:28.088-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-24T11:42:28.088-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="game" /><title>Going old-school</title><content type="html">&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8gAdwIG0zpQ&amp;hl=en_US&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/8gAdwIG0zpQ&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
While I've still got work to do on Tunescape, it is starting to wrap up so I needed something else to keep me busy. I've started to work on a new project - a kind of platform/exploration/adventure game of sorts. So far, I've been working on getting the basic platforming elements to feel right.&lt;br /&gt;
&lt;br /&gt;
If you squint, you might recognize my placeholder player character...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-9148307675892261264?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/NX8rGA0EbPo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/9148307675892261264/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2010/02/going-old-school.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/9148307675892261264?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/9148307675892261264?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/NX8rGA0EbPo/going-old-school.html" title="Going old-school" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.nostatic.org/2010/02/going-old-school.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4ARng6fCp7ImA9WxBWGUQ.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-5482103233298699933</id><published>2010-02-12T09:37:00.001-08:00</published><updated>2010-02-12T10:05:47.614-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-12T10:05:47.614-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="HLSL" /><category scheme="http://www.blogger.com/atom/ns#" term="music" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="game" /><title>Tunescape Update</title><content type="html">&lt;a href="http://lh3.ggpht.com/_1eC00ALSHt4/S3WNl0tOMKI/AAAAAAAAFaw/-XJS8vWPJKY/s1600-h/Tunescape4.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Tunescape" border="0" src="http://lh3.ggpht.com/_1eC00ALSHt4/S3WNl0tOMKI/AAAAAAAAFaw/-XJS8vWPJKY/s640/Tunescape4.png" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I've managed to avoid my standard behavior and have been pushing to try to actually finish (!!) Tunescape. It is in pretty good shape right now, and I've currently got it in playtest over on &lt;a href="http://creators.xna.com/"&gt;Xbox Live Indie Games&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
In polishing the game, I've been doing some fun shader work. I implemented a particle system shader for my new explosion effects, and I created a "plasma" shader for the background that uses multi-resolution noise to generate a smoothly moving cloud pattern. &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh6.ggpht.com/_1eC00ALSHt4/S3WNl5hdc3I/AAAAAAAAFa0/kIvXjoDi-ZI/s1600-h/TunescapeWorld.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Tunescape" border="0" src="http://lh6.ggpht.com/_1eC00ALSHt4/S3WNl5hdc3I/AAAAAAAAFa0/kIvXjoDi-ZI/s640/TunescapeWorld.png" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-5482103233298699933?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/QxkqhA1Surw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/5482103233298699933/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2010/02/tunescape-update.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/5482103233298699933?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/5482103233298699933?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/QxkqhA1Surw/tunescape-update.html" title="Tunescape Update" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_1eC00ALSHt4/S3WNl0tOMKI/AAAAAAAAFaw/-XJS8vWPJKY/s72-c/Tunescape4.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.nostatic.org/2010/02/tunescape-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkANRX04eSp7ImA9WxBTFUg.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-2213879243628616911</id><published>2009-12-11T11:12:00.001-08:00</published><updated>2009-12-11T11:13:14.331-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-11T11:13:14.331-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="HLSL" /><category scheme="http://www.blogger.com/atom/ns#" term="graphics" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="game" /><title>Lots of Fishes...</title><content type="html">&lt;a href="http://lh4.ggpht.com/_1eC00ALSHt4/SyKY3dDQhcI/AAAAAAAAFUc/0Qo-sy_1Kgc/s1600-h/Fishes.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Lots of Fishes" border="0" src="http://lh4.ggpht.com/_1eC00ALSHt4/SyKY3dDQhcI/AAAAAAAAFUc/0Qo-sy_1Kgc/s800/Fishes.png" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Just some stuff I'm messing around with...&lt;br /&gt;
&lt;br /&gt;
&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Z0esevEzipg&amp;hl=en_US&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/Z0esevEzipg&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-2213879243628616911?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/fx3YQf9YDT0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/2213879243628616911/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/12/lots-of-fishes.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/2213879243628616911?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/2213879243628616911?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/fx3YQf9YDT0/lots-of-fishes.html" title="Lots of Fishes..." /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_1eC00ALSHt4/SyKY3dDQhcI/AAAAAAAAFUc/0Qo-sy_1Kgc/s72-c/Fishes.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/12/lots-of-fishes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YMQnw8cCp7ImA9WxNUFUk.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-621724459261616862</id><published>2009-11-06T14:05:00.001-08:00</published><updated>2009-11-06T14:06:23.278-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-06T14:06:23.278-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="music" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="audio" /><category scheme="http://www.blogger.com/atom/ns#" term="game" /><title>Music-based Gameplay</title><content type="html">&lt;a href="http://lh6.ggpht.com/_1eC00ALSHt4/SvSTm8lK3NI/AAAAAAAAFSY/n6WywYd_xVs/s1600-h/Tunescape1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Music-based Gameplay" border="0" src="http://lh6.ggpht.com/_1eC00ALSHt4/SvSTm8lK3NI/AAAAAAAAFSY/n6WywYd_xVs/s800/Tunescape1.png" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
My latest project is a game that uses music as the gameplay content. I use spectrum information to detect energy pulses in the music and use peaks to trigger emission of particles. The object of the game is pretty simple - collect the particles while avoiding the red boulder-thingies. Grabbing stars increases a score multiplier.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_1eC00ALSHt4/SvSTnLro3XI/AAAAAAAAFSc/t-0ryLO72KY/s1600-h/Tunescape2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Music-based Gameplay" border="0" src="http://lh5.ggpht.com/_1eC00ALSHt4/SvSTnLro3XI/AAAAAAAAFSc/t-0ryLO72KY/s800/Tunescape2.png" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Collecting the particles, in addition to increasing your score, fuels three kinds of colored energy - shown by the three lines inside your circle. This energy can be expended to use a shield, give you a speed burst, or temporarily suck particles toward you.&lt;br /&gt;
&lt;br /&gt;
There are also cooperative and competitive multiplayer gameplay modes. This is a mode where players are "bungied" together:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_1eC00ALSHt4/SvSTnPtEALI/AAAAAAAAFSg/jPG4yYg-Xk8/s1600-h/Tunescape3.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Music-based Gameplay" border="0" src="http://lh5.ggpht.com/_1eC00ALSHt4/SvSTnPtEALI/AAAAAAAAFSg/jPG4yYg-Xk8/s800/Tunescape3.png" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Here is a gameplay video:&lt;br /&gt;
&lt;br /&gt;
&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Bt7ZWRyKEQk&amp;hl=en&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/Bt7ZWRyKEQk&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-621724459261616862?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/cegjv-3311g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/621724459261616862/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/11/music-based-gameplay.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/621724459261616862?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/621724459261616862?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/cegjv-3311g/music-based-gameplay.html" title="Music-based Gameplay" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_1eC00ALSHt4/SvSTm8lK3NI/AAAAAAAAFSY/n6WywYd_xVs/s72-c/Tunescape1.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/11/music-based-gameplay.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4NRns9eip7ImA9WxNWFEg.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-3919134877245089855</id><published>2009-10-13T11:15:00.000-07:00</published><updated>2009-10-13T11:19:57.562-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-13T11:19:57.562-07:00</app:edited><title>Steam and 3rd-Party DRM - Risen and Tages Activation</title><content type="html">This past Saturday morning, I decide that I'd like to play &lt;a href="http://risen.deepsilver.com/blog/agegate.php"&gt;Risen&lt;/a&gt;, the latest game from &lt;a href="http://www.piranha-bytes.com/"&gt;Piranha Bytes&lt;/a&gt;. I check on Steam, and they have it for $49.99. Amazon has it for $46.99. Boo, digital distribution! You aren't going to ship me a box, and you are still going to charge more? Still, I've been pretty happy with Steam in the past, so I was willing to spend the few extra dollars to get it quickly.&lt;br /&gt;
&lt;br /&gt;
So, I make the purchase. A half-hour or so later, my download was complete. Yay, digital distribution! I launch the game, and it brings up an activation check that needs to authenticate to a server online. When I proceed, it pops up an error saying that it can't connect. There is also an "offline" activation mode, which involves entering data on a webpage (not really "offline", but whatever...), but the website can't be reached.&lt;br /&gt;
&lt;br /&gt;
I check the Risen forum on Steam, and a handful of other people are having the same problem.. Turns out that all this is &lt;a href="http://www.tagesprotection.com/"&gt;Tages DRM&lt;/a&gt; being applied to the game on top of what Steam does. And it looks like their authentication servers are down. Lovely. If you buy a physical copy of the game, it doesn't authenticate online (it uses a disk check). Boo, digital distribution! I fire off a support ticket on Steam (after having to create a support account, which is different from my Steam account).&lt;br /&gt;
&lt;br /&gt;
10 or so hours later, I try again. Still not working. I'm thinking that if you are going to require online authentication, your authentication server bloody well better be up. And if it isn't, someone better be getting paged. And, of course, I had no response from Steam support. They are happy to take my money on a Saturday, but don't seem inclined to provide support on a Saturday.&lt;br /&gt;
&lt;br /&gt;
The next morning, the authentication server is up, and I can play the game (which is pretty good, by the way). Still, the whole incident left me with ill will toward all parties involved. Tages, for their broken DRM. The publisher, Deep Silver, for using it. And Valve, for allowing 3rd-party DRM that is out of their control to be used on a product they sell. And for having crappy customer support.&lt;br /&gt;
&lt;br /&gt;
Speaking of their customer support, I just got a response from them (3 days later) - a useless canned response about running Steam as administrator if I'm using Vista or Windows 7. Thanks, Valve!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-3919134877245089855?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/zqIwyKFzsX4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/3919134877245089855/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/10/steam-and-3rd-party-drm-risen-and-tages.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/3919134877245089855?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/3919134877245089855?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/zqIwyKFzsX4/steam-and-3rd-party-drm-risen-and-tages.html" title="Steam and 3rd-Party DRM - Risen and Tages Activation" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/10/steam-and-3rd-party-drm-risen-and-tages.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcBRHw7eSp7ImA9WxNXEkg.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-6000852728262388093</id><published>2009-09-29T12:13:00.000-07:00</published><updated>2009-09-29T12:20:55.201-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-29T12:20:55.201-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="HLSL" /><category scheme="http://www.blogger.com/atom/ns#" term="graphics" /><title>Fractal Rendering on the GPU - Mandelbrot and Julia Sets in an HLSL Shader</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_1eC00ALSHt4/SsJXb-CnytI/AAAAAAAAFO4/YAmKUhCq3IE/s1600-h/JuliaSet.png"&gt;&lt;img style="cursor: pointer;" src="http://lh5.ggpht.com/_1eC00ALSHt4/SsJXb-CnytI/AAAAAAAAFO4/YAmKUhCq3IE/s800/JuliaSet.png" alt="Julia Set Shader" id="BLOGGER_PHOTO_ID_5316823506229021618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've been playing with HLSL shaders recently, and it occurred to me that the horsepower of the GPU could probably be harnessed to render fractals like the Mandelbrot Set. It turns out to be a perfect task for a shader, since it involves lots of completely localized calculations - exactly what graphics cards are good at.&lt;br /&gt;&lt;br /&gt;A bit of web searching turned up the not surprising fact that I'm not the first person to have this realization. I found some nice code examples &lt;a href="http://blogs.msdn.com/shawnhar/archive/2006/12/12/technicolor-julias.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://www.devmaster.net/forums/showthread.php?t=13255"&gt;here&lt;/a&gt;. My version takes inspiration from both of these approaches, and adds a few tweaks of my own.&lt;br /&gt;&lt;br /&gt;The image above is of the Julia set, rendered completely by the GPU. Below is, of course, the Mandelbrot Set.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/_1eC00ALSHt4/SsJXcBIlWUI/AAAAAAAAFO8/LFGIp0sAuwk/s1600-h/MandelbrotSet.png"&gt;&lt;img style="cursor: pointer;" src="http://lh4.ggpht.com/_1eC00ALSHt4/SsJXcBIlWUI/AAAAAAAAFO8/LFGIp0sAuwk/s800/MandelbrotSet.png" alt="Mandelbrot Set Shader" id="BLOGGER_PHOTO_ID_5316823506229021618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And another view of the Mandelbrot set zoomed in a bit:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh3.ggpht.com/_1eC00ALSHt4/SsJXcPwYJ-I/AAAAAAAAFPA/vIxshtPV6iI/s1600-h/MandelbrotZoomed.png"&gt;&lt;img style="cursor: pointer;" src="http://lh3.ggpht.com/_1eC00ALSHt4/SsJXcPwYJ-I/AAAAAAAAFPA/vIxshtPV6iI/s800/MandelbrotZoomed.png" alt="Mandelbrot Set Shader" id="BLOGGER_PHOTO_ID_5316823506229021618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On my GeForce 8800GT, I can zoom and pan around at a rock-solid 60 frames per second. Here is a video exploring the Julia set. The warping you see is me transforming the seed used to render the set.&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8ZfwX5adn84&amp;hl=en&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/8ZfwX5adn84&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Here is the shader code I ended up with. It is pretty simple. I'm using the &lt;a href="http://en.wikipedia.org/wiki/Mandelbrot_set#Continuous_.28smooth.29_coloring"&gt;Normalized Iteration Count Algorithm&lt;/a&gt; to get nicely smoothed coloring. The parameters are set to sensible default values, but you will want to pass them in from your application and map them to some sort of input device. For rendering, simply draw a full screen quad using the shader. In my application I also gild the lily a bit and apply a bloom effect.&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; Iterations = 128;&lt;br /&gt;float2 Pan = float2(0.5, 0);&lt;br /&gt;&lt;span class="kwrd"&gt;float&lt;/span&gt; Zoom = 3;&lt;br /&gt;&lt;span class="kwrd"&gt;float&lt;/span&gt; Aspect = 1;&lt;br /&gt;float2 JuliaSeed = float2(0.39, -0.2);&lt;br /&gt;float3 ColorScale = float3(4, 5, 6);&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;float&lt;/span&gt; ComputeValue(float2 v, float2 offset)&lt;br /&gt;{&lt;br /&gt;   &lt;span class="kwrd"&gt;float&lt;/span&gt; vxsquare = 0;&lt;br /&gt;   &lt;span class="kwrd"&gt;float&lt;/span&gt; vysquare = 0;&lt;br /&gt;  &lt;br /&gt;   &lt;span class="kwrd"&gt;int&lt;/span&gt; iteration = 0;&lt;br /&gt;   &lt;span class="kwrd"&gt;int&lt;/span&gt; lastIteration = Iterations;&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;do&lt;/span&gt;&lt;br /&gt;   {&lt;br /&gt;       vxsquare = v.x * v.x;&lt;br /&gt;       vysquare = v.y * v.y;&lt;br /&gt;  &lt;br /&gt;       v = float2(vxsquare - vysquare, v.x * v.y * 2) + offset;&lt;br /&gt;&lt;br /&gt;       iteration++;&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; ((lastIteration == Iterations) &amp;amp;&amp;amp; (vxsquare + vysquare) &amp;gt; 4.0)&lt;br /&gt;       {&lt;br /&gt;           lastIteration = iteration + 1;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;   &lt;span class="kwrd"&gt;while&lt;/span&gt; (iteration &amp;lt; lastIteration);&lt;br /&gt;      &lt;br /&gt;   &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;float&lt;/span&gt;(iteration) - (log(log(sqrt(vxsquare + vysquare))) / log(2.0))) / &lt;span class="kwrd"&gt;float&lt;/span&gt;(Iterations);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;float4 Mandelbrot_PixelShader(float2 texCoord : TEXCOORD0) : COLOR0&lt;br /&gt;{&lt;br /&gt;   float2 v = (texCoord - 0.5) * Zoom * float2(1, Aspect) - Pan;&lt;br /&gt;  &lt;br /&gt;   &lt;span class="kwrd"&gt;float&lt;/span&gt; val = ComputeValue(v, v);&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;return&lt;/span&gt; float4(sin(val * ColorScale.x), sin(val * ColorScale.y), sin(val * ColorScale.z), 1);&lt;br /&gt;}&lt;br /&gt;  &lt;br /&gt;float4 Julia_PixelShader(float2 texCoord : TEXCOORD0) : COLOR0&lt;br /&gt;{&lt;br /&gt;   float2 v = (texCoord - 0.5) * Zoom * float2(1, Aspect) - Pan;&lt;br /&gt;  &lt;br /&gt;   &lt;span class="kwrd"&gt;float&lt;/span&gt; val = ComputeValue(v, JuliaSeed);&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;return&lt;/span&gt; float4(sin(val * ColorScale.x), sin(val * ColorScale.y), sin(val * ColorScale.z), 1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;technique Mandelbrot&lt;br /&gt;{&lt;br /&gt;   pass&lt;br /&gt;   {&lt;br /&gt;       PixelShader = compile ps_3_0 Mandelbrot_PixelShader();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;technique Julia&lt;br /&gt;{&lt;br /&gt;   pass&lt;br /&gt;   {&lt;br /&gt;       PixelShader = compile ps_3_0 Julia_PixelShader();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-6000852728262388093?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/W616Cr7dZiA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/6000852728262388093/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/09/fractal-rendering-on-gpu-mandelbrot-and.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/6000852728262388093?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/6000852728262388093?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/W616Cr7dZiA/fractal-rendering-on-gpu-mandelbrot-and.html" title="Fractal Rendering on the GPU - Mandelbrot and Julia Sets in an HLSL Shader" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_1eC00ALSHt4/SsJXb-CnytI/AAAAAAAAFO4/YAmKUhCq3IE/s72-c/JuliaSet.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/09/fractal-rendering-on-gpu-mandelbrot-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEINQnc6eip7ImA9WxNSGEg.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-9074353332152829977</id><published>2009-09-01T17:42:00.000-07:00</published><updated>2009-09-01T17:49:53.912-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-01T17:49:53.912-07:00</app:edited><title>XNA BloomComponent and Multisampling</title><content type="html">The &lt;a href="http://creators.xna.com/en-US/sample/bloom"&gt;Bloom Postprocess sample&lt;/a&gt; provided on the XNA website has issues if you use the component in a game that is using multisampling.&lt;br /&gt;&lt;br /&gt;You'll get the following error:&lt;br /&gt;&lt;br /&gt;"The active render target and depth stencil surface must have the same pixel size and multisampling type."&lt;br /&gt;&lt;br /&gt;The issue is that the render targets created by the component do not respect the multisampling settings of the graphics device. This is easy to fix, however. In the LoadContent() method of BloomComponent.cs, find the code that is initializing renderTarget1 and renderTarget2.&lt;br /&gt;&lt;br /&gt;Replace it with the following:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;           renderTarget1 = &lt;span class="kwrd"&gt;new&lt;/span&gt; RenderTarget2D(GraphicsDevice, width, height, 1,&lt;br /&gt;               format, GraphicsDevice.DepthStencilBuffer.MultiSampleType, GraphicsDevice.PresentationParameters.MultiSampleQuality);&lt;br /&gt;           renderTarget2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; RenderTarget2D(GraphicsDevice, width, height, 1,&lt;br /&gt;               format, GraphicsDevice.DepthStencilBuffer.MultiSampleType, GraphicsDevice.PresentationParameters.MultiSampleQuality);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-9074353332152829977?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/Gb4elzLmA1c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/9074353332152829977/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/09/xna-bloomcomponent-and-multisampling.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/9074353332152829977?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/9074353332152829977?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/Gb4elzLmA1c/xna-bloomcomponent-and-multisampling.html" title="XNA BloomComponent and Multisampling" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/09/xna-bloomcomponent-and-multisampling.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IHSH06fCp7ImA9WxNTGUw.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-7990270817977087319</id><published>2009-08-21T20:25:00.001-07:00</published><updated>2009-08-21T20:25:39.314-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-21T20:25:39.314-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="audio" /><title>Cybraphon</title><content type="html">&lt;object height="341" width="512"&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=5441128&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=5441128&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="341" width="512"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;A friend I used to work with back in my &lt;a href="http://menuinprogress.com/2008/01/indian-takeaway.html"&gt;Edinburgh days&lt;/a&gt; has been working on some pretty fantastic stuff recently. He and his collaborators have been using computer-orchestrated electronic actuators to control a variety of physical music-producing devices.&lt;br /&gt;&lt;br /&gt;Their latest creation (shown in the video above) is &lt;a href="http://cybraphon.com/"&gt;Cybraphon&lt;/a&gt;, a one-"man" wardrobe band.&lt;br /&gt;&lt;br /&gt;I really like it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-7990270817977087319?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/8LkAuisjaYA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/7990270817977087319/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/08/cybraphon.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/7990270817977087319?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/7990270817977087319?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/8LkAuisjaYA/cybraphon.html" title="Cybraphon" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/08/cybraphon.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UMQH0yeyp7ImA9WxNTF0U.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-5973685128465319849</id><published>2009-08-19T11:20:00.000-07:00</published><updated>2009-08-20T09:21:21.393-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-20T09:21:21.393-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="game" /><title>SubMariner</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh6.ggpht.com/_1eC00ALSHt4/SoxCI1QmBkI/AAAAAAAAFKw/T-oDzC5q1Os/s1600-h/SubMariner.png"&gt;&lt;img style="cursor: pointer;" src="http://lh6.ggpht.com/_1eC00ALSHt4/SoxCI1QmBkI/AAAAAAAAFKw/T-oDzC5q1Os/s800/SubMariner.png" alt="" id="BLOGGER_PHOTO_ID_5316823506229021618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I really should be working on &lt;a href="http://blog.nostatic.org/2009/08/saucer-pilots-xna-dream-build-play-2009.html"&gt;Saucer Pilots&lt;/a&gt;, but as I've said before, I'm much better at starting projects than finishing them...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-5973685128465319849?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/s058xu7Fm9A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/5973685128465319849/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/08/submariner.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/5973685128465319849?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/5973685128465319849?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/s058xu7Fm9A/submariner.html" title="SubMariner" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_1eC00ALSHt4/SoxCI1QmBkI/AAAAAAAAFKw/T-oDzC5q1Os/s72-c/SubMariner.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/08/submariner.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QNRng_fSp7ImA9WxNTEUQ.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-2640666824745470981</id><published>2009-08-13T11:25:00.000-07:00</published><updated>2009-08-13T12:23:17.645-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-13T12:23:17.645-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>XNA Force Feedback Helper Class</title><content type="html">This is a little helper class I whipped up to manage force feedback vibrations in XNA. The XNA libraries themselves just have a method you call to set the instantaneous left/right vibration force. In games, however, you generally want the feedback to last over a period of time, and you may have more than one force feedback event happening at the same time.&lt;br /&gt;&lt;br /&gt;This code provides a "fire-and-forget" interface for triggering vibrations. Add a call to update the ForceFeedbackManager in your game's update code. Call AddVibration whenever you want to trigger force feedback.&lt;br /&gt;&lt;br /&gt;Note: this code is not threadsafe - you must be triggering feedback from the same thread you call Update from.&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Vibration&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;float&lt;/span&gt; leftMotor;&lt;br /&gt;    &lt;span class="kwrd"&gt;float&lt;/span&gt; rightMotor;&lt;br /&gt;    &lt;span class="kwrd"&gt;float&lt;/span&gt; msLeft;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; LeftMotor&lt;br /&gt;    {&lt;br /&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; leftMotor; }&lt;br /&gt;        set { leftMotor = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; RightMotor&lt;br /&gt;    {&lt;br /&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; rightMotor; }&lt;br /&gt;        set { rightMotor = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; MSLeft&lt;br /&gt;    {&lt;br /&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; msLeft; }&lt;br /&gt;        set { msLeft = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Vibration(&lt;span class="kwrd"&gt;float&lt;/span&gt; leftMotor, &lt;span class="kwrd"&gt;float&lt;/span&gt; rightMotor, &lt;span class="kwrd"&gt;float&lt;/span&gt; durationMS)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.leftMotor = leftMotor;&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.rightMotor = rightMotor;&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.msLeft = durationMS;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ForceFeedbackManager&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; PlayerIndex playerIndex;&lt;br /&gt;    List&amp;lt;Vibration&amp;gt; vibrations = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Vibration&amp;gt;();&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; ForceFeedbackManager(PlayerIndex playerIndex)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.playerIndex = playerIndex;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddVibration(&lt;span class="kwrd"&gt;float&lt;/span&gt; leftMotor, &lt;span class="kwrd"&gt;float&lt;/span&gt; rightMotor, &lt;span class="kwrd"&gt;float&lt;/span&gt; durationMS)&lt;br /&gt;    {&lt;br /&gt;        vibrations.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vibration(leftMotor, rightMotor, durationMS));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(&lt;span class="kwrd"&gt;float&lt;/span&gt; msElapsed)&lt;br /&gt;    {&lt;br /&gt;        List&amp;lt;Vibration&amp;gt; toDelete = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Vibration&amp;gt;();&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Vibration vibration &lt;span class="kwrd"&gt;in&lt;/span&gt; vibrations)&lt;br /&gt;        {&lt;br /&gt;            vibration.MSLeft -= msElapsed;&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (vibration.MSLeft &amp;lt; 0.0f)&lt;br /&gt;            {&lt;br /&gt;                toDelete.Add(vibration);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Vibration vibration &lt;span class="kwrd"&gt;in&lt;/span&gt; toDelete)&lt;br /&gt;        {&lt;br /&gt;            vibrations.Remove(vibration);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;float&lt;/span&gt; leftMotor;&lt;br /&gt;        &lt;span class="kwrd"&gt;float&lt;/span&gt; rightMotor;&lt;br /&gt;&lt;br /&gt;        GetVibration(&lt;span class="kwrd"&gt;out&lt;/span&gt; leftMotor, &lt;span class="kwrd"&gt;out&lt;/span&gt; rightMotor);&lt;br /&gt;&lt;br /&gt;        GamePad.SetVibration(playerIndex, leftMotor, rightMotor);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; GetVibration(&lt;span class="kwrd"&gt;out&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; leftMotor, &lt;span class="kwrd"&gt;out&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; rightMotor)&lt;br /&gt;    {&lt;br /&gt;        leftMotor = 0.0f;&lt;br /&gt;        rightMotor = 0.0f;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Vibration vibration &lt;span class="kwrd"&gt;in&lt;/span&gt; vibrations)&lt;br /&gt;        {&lt;br /&gt;            leftMotor = Math.Max(leftMotor, vibration.LeftMotor);&lt;br /&gt;            rightMotor = Math.Max(rightMotor, vibration.RightMotor);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-2640666824745470981?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/HuwOIjDsFz0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/2640666824745470981/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/08/xna-force-feedback-helper-class.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/2640666824745470981?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/2640666824745470981?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/HuwOIjDsFz0/xna-force-feedback-helper-class.html" title="XNA Force Feedback Helper Class" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/08/xna-force-feedback-helper-class.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQDQHs5fSp7ImA9WxNTEE8.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-7494611577572856605</id><published>2009-08-11T14:37:00.000-07:00</published><updated>2009-08-11T14:49:31.525-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-11T14:49:31.525-07:00</app:edited><title>sfxr - A Great Free Sound Effect Generator</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/_1eC00ALSHt4/SoHlMQNp0lI/AAAAAAAAFJU/_uciS2zPaLc/s1600-h/sfxr.png"&gt;&lt;img style="cursor: pointer;" src="http://lh4.ggpht.com/_1eC00ALSHt4/SoHlMQNp0lI/AAAAAAAAFJU/_uciS2zPaLc/s800/sfxr.png" alt="" id="BLOGGER_PHOTO_ID_5316823506229021618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One of the problems I always have when I'm working on a game project is sourcing sound effects. Recently, I came across &lt;a href="http://www.ludumdare.com/compo/2007/12/13/sfxr-sound-effects-for-all/"&gt;sfxr&lt;/a&gt;, a very nice program for creating sound effects. It was a great help when I was working on &lt;a href="http://blog.nostatic.org/2009/08/saucer-pilots-xna-dream-build-play-2009.html"&gt;Saucer Pilots&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It is basically a little software synth with a bunch of variables you can tweak to generate a wide variety of sounds. A helpful set of presets are provided for generating commonly needed classes of video game sounds.&lt;br /&gt;&lt;br /&gt;Once you find something you like, export it to a WAV file and you are good to go. Very handy little utility.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-7494611577572856605?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/UCsldK11UdM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/7494611577572856605/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/08/sfxr-great-free-sound-effect-generator.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/7494611577572856605?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/7494611577572856605?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/UCsldK11UdM/sfxr-great-free-sound-effect-generator.html" title="sfxr - A Great Free Sound Effect Generator" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_1eC00ALSHt4/SoHlMQNp0lI/AAAAAAAAFJU/_uciS2zPaLc/s72-c/sfxr.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/08/sfxr-great-free-sound-effect-generator.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QAQHgycCp7ImA9WxJaFkw.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-7222893065502984721</id><published>2009-08-06T19:12:00.000-07:00</published><updated>2009-08-06T19:15:41.698-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-06T19:15:41.698-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="game" /><title>Saucer Pilots - XNA Dream Build Play 2009</title><content type="html">&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/OKfnaDUlAIY&amp;hl=en&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/OKfnaDUlAIY&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Whew! I just squeaked an entry in under tonight's deadline for the 2009 XNA Dream Build Play competition.&lt;br /&gt;&lt;br /&gt;Last Monday, I was messing around with a new "flying saucer" game prototype idea. It seemed like it had promise, so I kicked into high gear to try to get something submittable for the competition. I initially got the submission date wrong, and thought I had until this Sunday. A few days ago, I realized my error and really had to step things up.&lt;br /&gt;&lt;br /&gt;The competition was a good impetus to get me to actually finish something. I'm generally much more fond of starting things than completing them...&lt;br /&gt;&lt;br /&gt;Anyway, the game is "Saucer Pilots" - a 1-4 player saucer flying game with five different gameplay modes. Xbox LIVE avatars are used for saucer pilot models (avatars do not appear in this video, as they are not visible on the PC). The physics implementation I'm using is &lt;a href="http://www.codeplex.com/FarseerPhysics"&gt;Farseer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Overall, I think it turned out pretty well for a week-and-a-half effort. The only thing that made that timeline possible was the framework on top of XNA that I've developed over the past year. And help from Sherry.&lt;br /&gt;&lt;br /&gt;Oh, and did I mention that it has fishing?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-7222893065502984721?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/SUsZLZ3Yl1k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/7222893065502984721/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/08/saucer-pilots-xna-dream-build-play-2009.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/7222893065502984721?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/7222893065502984721?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/SUsZLZ3Yl1k/saucer-pilots-xna-dream-build-play-2009.html" title="Saucer Pilots - XNA Dream Build Play 2009" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/08/saucer-pilots-xna-dream-build-play-2009.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04DSHg9fip7ImA9WxVUGUw.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-9189530192505055342</id><published>2009-03-24T11:29:00.000-07:00</published><updated>2009-03-24T11:39:39.666-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-24T11:39:39.666-07:00</app:edited><title>Creating Playlists With Linq - Another Great Use For CodeDomProvider</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1eC00ALSHt4/SckmzyY6S7I/AAAAAAAADzk/wdFQZu2vWRo/s1600-h/MusicLinq.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_1eC00ALSHt4/SckmzyY6S7I/AAAAAAAADzk/wdFQZu2vWRo/s800/MusicLinq.png" alt="" id="BLOGGER_PHOTO_ID_5316823506229021618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I recently found a new use for &lt;a href="http://blog.nostatic.org/2008/12/dynamically-compiling-assemblies-with.html"&gt;dynamically-compiled assemblies using CodeDomProvider&lt;/a&gt;. Combined with Linq, it enables the ultimate flexibility in music playlist generation.&lt;br /&gt;&lt;br /&gt;My "Code Playlists", are snippets of code that can do whatever they want as long as they return an enumerable collection of song objects. As you can see above, simple Linq expressions make it really easy to generate pretty much any collection of songs that my music metadata can support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-9189530192505055342?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/zTaWwMctAok" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/9189530192505055342/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/03/creating-playlists-with-linq-another.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/9189530192505055342?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/9189530192505055342?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/zTaWwMctAok/creating-playlists-with-linq-another.html" title="Creating Playlists With Linq - Another Great Use For CodeDomProvider" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_1eC00ALSHt4/SckmzyY6S7I/AAAAAAAADzk/wdFQZu2vWRo/s72-c/MusicLinq.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/03/creating-playlists-with-linq-another.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEMRXc5fip7ImA9WxVVGEQ.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-94615951526511404</id><published>2009-03-12T14:49:00.000-07:00</published><updated>2009-03-12T15:24:44.926-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-12T15:24:44.926-07:00</app:edited><title>WPF Progress Bars Revisited</title><content type="html">Because some people were having trouble understanding how to use my original &lt;a href="http://blog.nostatic.org/2007/12/wpf-progress-bars.html"&gt;WPF progress bar code&lt;/a&gt;, I thought I'd post an updated, easier to use version.&lt;br /&gt;&lt;br /&gt;The problems people were having pretty much all centered around not understanding how to run their code in a background thread. My updated version handles this for you.&lt;br /&gt;&lt;br /&gt;First, please have a look at the original post, as you will need some of the code from there:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.nostatic.org/2007/12/wpf-progress-bars.html"&gt;WPF Progress Bars&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The XAML and IProgressContext code is still the same, but here is an update partial class for the progress dialog, along with a delegate definition that it requires:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ProgressWorkerDelegate(IProgressContext progressContext);&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ProgressDialog : Window, IProgressContext&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; canceled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; ProgressWorkerDelegate workDelegate = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Canceled&lt;br /&gt;    {&lt;br /&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; canceled; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; ProgressDialog() : &lt;span class="kwrd"&gt;this&lt;/span&gt;(&lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;    {            &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; ProgressDialog(ProgressWorkerDelegate workDelegate)&lt;br /&gt;        : &lt;span class="kwrd"&gt;this&lt;/span&gt;(workDelegate, &lt;span class="kwrd"&gt;false&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; ProgressDialog(ProgressWorkerDelegate workDelegate, &lt;span class="kwrd"&gt;bool&lt;/span&gt; startInBackground)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.workDelegate = workDelegate;&lt;br /&gt;&lt;br /&gt;        InitializeComponent();&lt;br /&gt;&lt;br /&gt;        CancelButton.Click += &lt;span class="kwrd"&gt;new&lt;/span&gt; RoutedEventHandler(CancelButton_Click);&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (workDelegate != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (startInBackground)&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Thread(&lt;span class="kwrd"&gt;new&lt;/span&gt; ThreadStart(StartWork)).Start();&lt;br /&gt;            }&lt;br /&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                StartWork();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; StartWork()&lt;br /&gt;    {&lt;br /&gt;        workDelegate(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; CancelButton_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        canceled = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;        CancelButton.IsEnabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateProgress(&lt;span class="kwrd"&gt;double&lt;/span&gt; progress)&lt;br /&gt;    {&lt;br /&gt;        Dispatcher.BeginInvoke(DispatcherPriority.Background,&lt;br /&gt;            (SendOrPostCallback)&lt;span class="kwrd"&gt;delegate&lt;/span&gt; { Progress.SetValue(ProgressBar.ValueProperty, progress); }, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateStatus(&lt;span class="kwrd"&gt;string&lt;/span&gt; status)&lt;br /&gt;    {&lt;br /&gt;        Dispatcher.BeginInvoke(DispatcherPriority.Background,&lt;br /&gt;            (SendOrPostCallback)&lt;span class="kwrd"&gt;delegate&lt;/span&gt; { StatusText.SetValue(TextBlock.TextProperty, status); }, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Finish()&lt;br /&gt;    {&lt;br /&gt;        Dispatcher.BeginInvoke(DispatcherPriority.Background,&lt;br /&gt;            (SendOrPostCallback)&lt;span class="kwrd"&gt;delegate&lt;/span&gt; { Close(); }, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The key difference is that you can now pass the dialog a delegate that will be used to do your work, and can have it automatically get run in the background.&lt;br /&gt;&lt;br /&gt;To use it, do something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;ProgressDialog progressDialog = &lt;span class="kwrd"&gt;new&lt;/span&gt; ProgressDialog(MyWorkFunction, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;br /&gt;progressDialog.ShowDialog();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that I am using ShowDialog() above to keep the operation modal. If you want the rest of your UI to still accept input, use Show() instead.&lt;br /&gt;&lt;br /&gt;Your function to actually do the work would look something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; MyWorkFunction(IProgressContext progressContext)&lt;br /&gt;{&lt;br /&gt;  &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 100; i++)&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (myProgressContext.Canceled)&lt;br /&gt;          &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;      progressContext.UpdateProgress((&lt;span class="kwrd"&gt;double&lt;/span&gt;)i / 100.0);&lt;br /&gt;      progressContext.UpdateStatus(&lt;span class="str"&gt;"Doing Step "&lt;/span&gt; + i);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  progressContext.Finish();&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-94615951526511404?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/fEGIMFdjc-o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/94615951526511404/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/03/wpf-progress-bars-revisited.html#comment-form" title="14 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/94615951526511404?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/94615951526511404?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/fEGIMFdjc-o/wpf-progress-bars-revisited.html" title="WPF Progress Bars Revisited" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">14</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/03/wpf-progress-bars-revisited.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4CR34_fCp7ImA9WxVVEk0.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-5521068373517208188</id><published>2009-03-04T15:04:00.001-08:00</published><updated>2009-03-04T15:22:46.044-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-04T15:22:46.044-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XNA" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="game" /><title>Gravity Game</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1eC00ALSHt4/Sa8JP8we2yI/AAAAAAAADw0/7NoJFIdK1Gs/s1600-h/Gravity2.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_1eC00ALSHt4/Sa8JP8we2yI/AAAAAAAADw0/7NoJFIdK1Gs/s800/Gravity2.jpg" alt="Gravity Game" id="BLOGGER_PHOTO_ID_5309472655305268002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My latest hobby project is a gravity-based game in the tradition of old classics like &lt;a href="http://en.wikipedia.org/wiki/Lunar_Lander_%28arcade_game%29"&gt;Lunar Lander&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Gravitar"&gt;Gravitar&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Thrust_%28computer_game%29"&gt;Thrust&lt;/a&gt;. Currently, the mechanics are pretty simple. Shoot things, avoid being shot, crashing, or being hit by an asteroid, and use your tractor beam to move around colored balls that act as keys to remove barriers.&lt;br /&gt;&lt;br /&gt;I've also been playing with water dynamics.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1eC00ALSHt4/Sa8JLQDtS7I/AAAAAAAADws/jpqbAmTgfu0/s1600-h/Gravity1.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_1eC00ALSHt4/Sa8JLQDtS7I/AAAAAAAADws/jpqbAmTgfu0/s800/Gravity1.jpg" alt="Gravity Game" id="BLOGGER_PHOTO_ID_5309472574586833842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The game is &lt;a href="http://creators.xna.com/en-US/"&gt;XNA&lt;/a&gt;-based, and I'm using &lt;a href="http://www.codeplex.com/FarseerPhysics"&gt;Farseer&lt;/a&gt; as my physics engine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-5521068373517208188?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/nLi5nQChgww" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/5521068373517208188/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/03/gravity-game.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/5521068373517208188?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/5521068373517208188?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/nLi5nQChgww/gravity-game.html" title="Gravity Game" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_1eC00ALSHt4/Sa8JP8we2yI/AAAAAAAADw0/7NoJFIdK1Gs/s72-c/Gravity2.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/03/gravity-game.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YARXY4cCp7ImA9WxVRE0Q.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-8886507865088073611</id><published>2009-01-19T11:42:00.001-08:00</published><updated>2009-01-19T11:59:04.838-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-19T11:59:04.838-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="audio" /><title>More FM Synth Progress</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1eC00ALSHt4/SXTZOBuktoI/AAAAAAAADoE/D30a39yY0bo/s1600-h/Synth2.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_1eC00ALSHt4/SXTZOBuktoI/AAAAAAAADoE/D30a39yY0bo/s800/Synth2.png" alt="" id="BLOGGER_PHOTO_ID_5293094297072350850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ok, my "little" FM synthesizer project is now officially a bit out of control. It has grown to include a drum pattern editor, chord progressions and a mini song sequencer. WPF, with its clean separation between the UI and the underlying code is perfect for doing audio interface work. Too bad the digital audio world is still mired in C++...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-8886507865088073611?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/d_xmI2hzyBI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/8886507865088073611/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/01/more-fm-synth-progress.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/8886507865088073611?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/8886507865088073611?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/d_xmI2hzyBI/more-fm-synth-progress.html" title="More FM Synth Progress" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_1eC00ALSHt4/SXTZOBuktoI/AAAAAAAADoE/D30a39yY0bo/s72-c/Synth2.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/01/more-fm-synth-progress.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIASHs_cCp7ImA9WxVSF0U.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-6309394957266477078</id><published>2009-01-12T11:11:00.000-08:00</published><updated>2009-01-12T11:29:09.548-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-12T11:29:09.548-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><title>WPF Layout Woes - MeasureOverride killed Schrödinger's Cat</title><content type="html">A struggle I'm currently having with layout in WPF reminds me of the &lt;a href="http://en.wikipedia.org/wiki/Observer_effect_%28physics%29"&gt;Observer Effect&lt;/a&gt; in physics. It turns out that calling Measure() on a child object has side effects. You would think that the measuring phase of layout would simply involve asking the child how big it wants to be. Instead, you need to pass it a size constraint.&lt;br /&gt;&lt;br /&gt;Normally, that would not be a problem, but what if you want to size a set of children based on their relative desired sizes? Catch-22. You can't call Measure() on a child without knowing the maximum size you want it to be. And, in my situation, I don't know what size I want it to be without first measuring it. And, once you have measured an objected, its size "sticks" -  changing it when you do Arrange() only alters the size of the clip rectangle (an important distinction if the child actually can be variably sized - such as content within a ScrollViewer).&lt;br /&gt;&lt;br /&gt;Very frustrating.&lt;br /&gt;&lt;br /&gt;I have found a fairly complicated way of working around the isue, but it seems like a fundamental (if not often encountered) flaw in the way WPF layout works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-6309394957266477078?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/DkLDMhXxlJs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/6309394957266477078/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2009/01/wpf-layout-woes-measureoverride-killed.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/6309394957266477078?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/6309394957266477078?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/DkLDMhXxlJs/wpf-layout-woes-measureoverride-killed.html" title="WPF Layout Woes - MeasureOverride killed Schrödinger's Cat" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.nostatic.org/2009/01/wpf-layout-woes-measureoverride-killed.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MHSHw9cCp7ImA9WxRaFk8.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-9071710916008937820</id><published>2008-12-18T11:20:00.000-08:00</published><updated>2008-12-18T11:43:59.268-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-18T11:43:59.268-08:00</app:edited><title>Dynamically Compiling Assemblies with CodeDomProvider</title><content type="html">&lt;a href="http://mikescodeblog.blogspot.com/2008/12/interactive-function-plotting-using.html"&gt;A few posts ago&lt;/a&gt;, I mentioned the use of CodeDomProvider to compile assemblies at runtime. It is really easy to do.&lt;br /&gt;&lt;br /&gt;First, you'll need to include a few namespaces you normally wouldn't:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.CodeDom.Compiler;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.CSharp;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next, setting up the assembly compiler:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;CodeDomProvider codeProvider = &lt;span class="kwrd"&gt;new&lt;/span&gt; CSharpCodeProvider();&lt;br /&gt;CompilerParameters compilerParameters = &lt;span class="kwrd"&gt;new&lt;/span&gt; CompilerParameters();&lt;br /&gt;&lt;br /&gt;compilerParameters.GenerateExecutable = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;compilerParameters.GenerateInMemory = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;compilerParameters.IncludeDebugInformation = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;compilerParameters.WarningLevel = 3;&lt;br /&gt;compilerParameters.TreatWarningsAsErrors = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;compilerParameters.CompilerOptions = &lt;span class="str"&gt;"/optimize"&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We're using a CSharpCodeProvider here - there are other code providers for other .NET languages.&lt;br /&gt;&lt;br /&gt;Our compiler parameters specify that we are not generating an executable, we want to compile the assembly directly in memory, rather than to disk, and we aren't including debugging information. The warning level determines the threshold for generating compiler warnings. I'm not sure exactly what level 3 does, but it's what I've seen referenced by default. It doesn't really matter, anyway, as we also specify that we aren't treating warnings as errors. Finally, we tell the compiler to optimize.&lt;br /&gt;&lt;br /&gt;This next bit is really the only tricky part. We need to tell the compiler what extra assemblies we want to reference. The most general method I've found so far is simply to reference all of the assemblies that our parent program references, as well as the parent assembly itself:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;Assembly executingAssembly = Assembly.GetExecutingAssembly();&lt;br /&gt;            compilerParameters.ReferencedAssemblies.Add(executingAssembly.Location);&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (AssemblyName assemblyName &lt;span class="kwrd"&gt;in&lt;/span&gt; executingAssembly.GetReferencedAssemblies())&lt;br /&gt;{&lt;br /&gt;  compilerParameters.ReferencedAssemblies.Add(Assembly.Load(assemblyName).Location);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;With the setup done, compiling an assembly is easy:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; assemblyCode = &lt;span class="str"&gt;"public class MyClass { ...&amp;lt;Code Goes Here&amp;gt;... }"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;CompilerResults compileResults =&lt;br /&gt;  codeProvider.CompileAssemblyFromSource(compilerParameters, &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[] { assemblyCode });&lt;br /&gt;&lt;br /&gt;Assembly myAssembly = compileResults.CompiledAssembly;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's all there is to it. Note that you should also check to see if and compile errors were generated. The CompileResults class has an Errors property that holds a collection of the compile errors, if any.&lt;br /&gt;&lt;br /&gt;To use your shiny new assembly, simply use reflection to extract your class from the assembly:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;Type myType = codeAssembly.GetType(&lt;span class="str"&gt;"MyClass"&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You'll end up with a Type you can use like any other - using Activator.CreateInstance() to create a new instance of your class, for example.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-9071710916008937820?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/N12jt4vab4w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/9071710916008937820/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2008/12/dynamically-compiling-assemblies-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/9071710916008937820?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/9071710916008937820?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/N12jt4vab4w/dynamically-compiling-assemblies-with.html" title="Dynamically Compiling Assemblies with CodeDomProvider" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.nostatic.org/2008/12/dynamically-compiling-assemblies-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8FSXc8cCp7ImA9WxRaFUg.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-5706669864267140728</id><published>2008-12-17T14:40:00.000-08:00</published><updated>2008-12-17T14:43:38.978-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-17T14:43:38.978-08:00</app:edited><title>WPF MediaElement Requires Updated Windows Media Player</title><content type="html">I just spent several baffled hours trying to figure out why some WPF media playback code that worked just fine on my previous computer was failing to work on my new computer.&lt;br /&gt;&lt;br /&gt;It turns out that it wasn't my code at all. It seems that the WPF MediaElement control (which is used to play content using Windows Media Player) doesn't work with WMP version 9 (which is what came installed on my new PC).&lt;br /&gt;&lt;br /&gt;Upgrading to the latest (version 11) fixed the problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-5706669864267140728?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/vXwWSaVk834" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/5706669864267140728/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2008/12/wpf-mediaelement-requires-updated.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/5706669864267140728?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/5706669864267140728?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/vXwWSaVk834/wpf-mediaelement-requires-updated.html" title="WPF MediaElement Requires Updated Windows Media Player" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.nostatic.org/2008/12/wpf-mediaelement-requires-updated.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUERnYzfyp7ImA9WxRaE0o.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-1243952480869335775</id><published>2008-12-15T13:20:00.000-08:00</published><updated>2008-12-15T13:40:07.887-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-15T13:40:07.887-08:00</app:edited><title>Interactive Function Plotting Using Runtime Compilation of C# Assemblies</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1eC00ALSHt4/SUbKnm8xV9I/AAAAAAAADh8/G-7YfuUmjc4/s1600-h/Plot1.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_1eC00ALSHt4/SUbKnm8xV9I/AAAAAAAADh8/G-7YfuUmjc4/s800/Plot1.png" alt="" id="BLOGGER_PHOTO_ID_5280130394957633490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Every once in a while I have a need to plot some arbitrary mathematical function to see what it looks like. It happened to me recently when working on my &lt;a href="http://mikescodeblog.blogspot.com/2008/12/fm-synth-wip.html"&gt;FM Synth project&lt;/a&gt;, so I decided to whip up a quick-and-dirty plotting app.&lt;br /&gt;&lt;br /&gt;The main issue with creating the app was how to allow for specifying the function(s) to be plotted. Obviously, I did not want to write a custom mathematical function parser. Instead, I leveraged the ability of .NET to create assemblies at runtime using the &lt;a href="http://msdn.microsoft.com/en-us/library/system.codedom.compiler.codedomprovider.aspx"&gt;CodeDomProvider&lt;/a&gt; class.&lt;br /&gt;&lt;br /&gt;I already had some code to do this that I used to allow runtime evaluation of C# expressions in the console of my &lt;a href="http://mikescodeblog.blogspot.com/2008/10/more-automatic-city-generation.html"&gt;city driving game&lt;/a&gt;, and I was able to repurpose it with very little effort.&lt;br /&gt;&lt;br /&gt;The result is pretty cool. Any number of functions can be specified as arbitrary C# expressions. I dynamically create a class, and add the expressions as methods within it. I also a a special property, 'X', which returns the current X value of the plot. As you can see below, you can call one function from within another and use multiple lines of code.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1eC00ALSHt4/SUbKruVIMzI/AAAAAAAADiE/6iH0As6knvQ/s1600-h/Plot2.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_1eC00ALSHt4/SUbKruVIMzI/AAAAAAAADiE/6iH0As6knvQ/s800/Plot2.png" alt="" id="BLOGGER_PHOTO_ID_5280130465658319666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The start and end values for X are also arbitrary expressions.&lt;br /&gt;&lt;br /&gt;The use of CodeDomProvider to generate assemblies at runtime is definitely a very powerful tool that I'm sure I'll find more uses for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-1243952480869335775?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/NbBDCqem5Bg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/1243952480869335775/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2008/12/interactive-function-plotting-using.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/1243952480869335775?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/1243952480869335775?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/NbBDCqem5Bg/interactive-function-plotting-using.html" title="Interactive Function Plotting Using Runtime Compilation of C# Assemblies" /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_1eC00ALSHt4/SUbKnm8xV9I/AAAAAAAADh8/G-7YfuUmjc4/s72-c/Plot1.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.nostatic.org/2008/12/interactive-function-plotting-using.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEDSH86fCp7ImA9WxVSF0U.&quot;"><id>tag:blogger.com,1999:blog-6127132400597215190.post-3407230063725847858</id><published>2008-12-05T10:56:00.000-08:00</published><updated>2009-01-12T11:31:19.114-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-12T11:31:19.114-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="audio" /><title>FM Synth W.I.P.</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1eC00ALSHt4/STl6qACjMXI/AAAAAAAADhM/DBUTpxso9HY/s1600-h/Synth.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_1eC00ALSHt4/STl6qACjMXI/AAAAAAAADhM/DBUTpxso9HY/s800/Synth.png" alt="" id="BLOGGER_PHOTO_ID_5276383300425036146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My little FM synth is coming along nicely. C# codebase with a WPF UI.&lt;br /&gt;&lt;br /&gt;The shot above is the main editor page. I'm currently using four oscillators which can either be output directly, or used to modulate each other. Fun stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6127132400597215190-3407230063725847858?l=blog.nostatic.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MikesCodeBlog/~4/QXxA-qxADT8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.nostatic.org/feeds/3407230063725847858/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.nostatic.org/2008/12/fm-synth-wip.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/3407230063725847858?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6127132400597215190/posts/default/3407230063725847858?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MikesCodeBlog/~3/QXxA-qxADT8/fm-synth-wip.html" title="FM Synth W.I.P." /><author><name>Mike</name><uri>http://www.blogger.com/profile/13599208082890099005</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10796613826403701185" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_1eC00ALSHt4/STl6qACjMXI/AAAAAAAADhM/DBUTpxso9HY/s72-c/Synth.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.nostatic.org/2008/12/fm-synth-wip.html</feedburner:origLink></entry></feed>
