<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" media="screen" href="/styles/xslt/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:c9="http://channel9.msdn.com">
<channel>
	<title>Channel 9 - Entries tagged with WPF</title>
    <atom:link rel="self" type="application/rss+xml" href="http://channel9.msdn.com/Tags/wpf/RSS"/>
    <itunes:summary></itunes:summary>
    <itunes:author>Microsoft</itunes:author>
    <itunes:subtitle></itunes:subtitle>
    <image>
      <url>http://mschnlnine.vo.llnwd.net/d1/Dev/App_Themes/C9/images/feedimage.png</url>
      <title>Channel 9 - Entries tagged with WPF</title>
      <link>http://channel9.msdn.com/Tags/wpf</link>
    </image>
    <itunes:image href=""/>
    <itunes:category text="Technology"/>
    <description>Channel 9 keeps you up to date with the latest news and behind the scenes info from Microsoft that developers love to keep up with. From LINQ to SilverLight – Watch videos and hear about all the cool technologies coming and the people behind them.</description>
    <link>http://channel9.msdn.com/Tags/wpf</link>
    <language>en</language>
    <pubDate>Sun, 12 Feb 2012 07:03:15 GMT</pubDate>
    <lastBuildDate>Sun, 12 Feb 2012 07:03:15 GMT</lastBuildDate>
    <generator>Rev9</generator>
    <c9:totalResults>366</c9:totalResults>
    <c9:pageCount>15</c9:pageCount>
    <c9:pageSize>25</c9:pageSize>
  <item>
      <title>The Extended WPF Toolkit goes v1.5</title>
      <description><![CDATA[<p>For WPF Wednesday (I think Wednesday is going to be a kind of a rotating theme day... from WPF, to Web, &quot;Wild&quot; and Weird...) we're going to take another look at the Extended WPF Toolkit project. It's been nine months since we last looked at it, <a href="http://channel9.msdn.com/coding4fun/blog/Todays-toolkit-time-with-the-Extended-WPF-Toolkit" target="_blank">Today's toolkit time with the Extended WPF Toolkit</a> and since then we've gotten a new version with a bunch of new controls.</p><p>Also last time we didn't look at the cool sample app that's included in the source tree...</p><h2><a href="http://wpftoolkit.codeplex.com/">Extended WPF Toolkit</a> - <a href="http://wpftoolkit.codeplex.com/releases/view/71499">Extended WPF Toolkit 1.5.0</a></h2><blockquote><h4>Want an easier way to install the Extended WPF Toolkit?</h4>The Extended WPF Toolkit is available on <a href="http://nuget.org/List/Packages/Extended.Wpf.Toolkit">Nuget</a>. <h3>What's in the 1.5.0 Release?</h3><ul><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=BusyIndicator">BusyIndicator</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=ButtonSpinner">ButtonSpinner</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=Calculator">Calculator</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=CalculatorUpDown">CalculatorUpDown</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=CheckListBox"><strong>CheckListBox</strong></a><strong> - New Control</strong> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=ChildWindow">ChildWindow</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=CollectionEditor"><strong>CollectionEditor</strong></a><strong> - New Control </strong></li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=CollectionEditorDialog"><strong>CollectionEditorDialog</strong></a><strong> - New Control</strong> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=ColorCanvas">ColorCanvas</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=ColorPicker">ColorPicker</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=DateTimePicker">DateTimePicker</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=DateTimeUpDown">DateTimeUpDown</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=DecimalUpDown">DecimalUpDown</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=DoubleUpDown">DoubleUpDown</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=DropDownButton"><strong>DropDownButton</strong></a><strong> - New Control</strong> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=IntegerUpDown">IntegerUpDown</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=Magnifier">Magnifier</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=MaskedTextBox">MaskedTextBox</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=MessageBox">MessageBox</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=MultiLineTextEditor"><strong>MultiLineTextEditor</strong></a><strong> - New Control </strong></li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=PrimitiveTypeCollectionEditor"><strong>PrimitiveTypeCollectionEditor</strong></a><strong> - New Control</strong> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=PropertyGrid"><strong>PropertyGrid</strong></a><strong> - Beta</strong> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=RichTextBox">RichTextBox</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=RichTextBoxFormatBar">RichTextBoxFormatBar</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=SplitButton">SplitButton</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=TimePicker">TimePicker</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=WatermarkTextBox">WatermarkTextBox</a> </li><li><a href="http://wpftoolkit.codeplex.com/wikipage?title=Wizard"><strong>Wizard</strong></a><strong> - New Control</strong> </li></ul></blockquote><p>So as you can see, v1.5 has a number of new cool things to play with.</p><p>For example the Wizard control. Many app's use them and many dev's re-invent that wheel when they do. This control looks simple, yet configurable enough, that maybe we don't need to re-invent it anymore (and even if we do, since the source is available, we don't have to start from scratch! <img src='http://ecn.channel9.msdn.com/o9/content/images/emoticons/emotion-1.gif?v=c9' alt='Smiley' /></p><p><a href="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLd17de9%5B3%5D.png" target="_blank"><img title="SNAGHTMLd17de9" src="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLd17de9_thumb.png" alt="SNAGHTMLd17de9" width="621" height="407" border="0"></a></p><p><a href="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLd19659%5B3%5D.png" target="_blank"><img title="SNAGHTMLd19659" src="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLd19659_thumb.png" alt="SNAGHTMLd19659" width="650" height="367" border="0"></a></p><p>Then there's the some of the other controls, new and old, too;</p><p>Like one of my favorite, the calculator control</p><p><a href="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLbb4bf1%5B3%5D.png" target="_blank"><img title="SNAGHTMLbb4bf1" src="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLbb4bf1_thumb.png" alt="SNAGHTMLbb4bf1" width="621" height="407" border="0"></a></p><p><a href="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLd43759%5B3%5D.png" target="_blank"><img title="SNAGHTMLd43759" src="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLd43759_thumb.png" alt="SNAGHTMLd43759" width="650" height="367" border="0"></a></p><p>Or the watermark textbox</p><p><a href="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLd46e60%5B3%5D.png" target="_blank"><img title="SNAGHTMLd46e60" src="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLd46e60_thumb.png" alt="SNAGHTMLd46e60" width="650" height="367" border="0"></a></p><p><a href="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLd483d3%5B3%5D.png" target="_blank"><img title="SNAGHTMLd483d3" src="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLd483d3_thumb.png" alt="SNAGHTMLd483d3" width="650" height="367" border="0"></a></p><p>Or the new WPF Property Grid;</p><p><a href="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLd68bbf%5B3%5D.png" target="_blank"><img title="SNAGHTMLd68bbf" src="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/SNAGHTMLd68bbf_thumb.png" alt="SNAGHTMLd68bbf" width="629" height="407" border="0"></a></p><p>One thing about these samples... They are &quot;live.&quot; They are not static examples or screenshots, but instead live, working code.</p><p>Speaking of the Sample app. I thought it very cool that the sample app used <a href="http://compositewpf.codeplex.com/" target="_blank">Prism</a>. Prism is meant to help you build composite applications, separating the shell and components and allowing them all to evolve independently.</p><p>So what does that mean? It means that what you're seeing above is a simple shell that hosts modules that do the work. That once created, you're pretty much done with the shell and you can focus on the specific modules.</p><p><a href="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/image%5B7%5D-10.png" target="_blank"><img title="image" src="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/image_thumb%5B3%5D-25.png" alt="image" width="304" height="427" border="0"></a></p><p>The Sample shell is a simple host for the sample modules. In this case modules are added to the shell via the app.config.</p><p><a href="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/image%5B10%5D-17.png" target="_blank"><img title="image" src="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/image_thumb%5B4%5D-25.png" alt="image" width="650" height="263" border="0"></a></p><p>If we take a peek at the wizard sample module;</p><p><a href="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/image%5B13%5D-12.png" target="_blank"><img title="image" src="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/image_thumb%5B5%5D-18.png" alt="image" width="650" height="351" border="0"></a></p><p>Okay, okay, I know, enough samples. Here's a snap of the Toolkit project itself;</p><p><a href="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/image%5B20%5D-5.png" target="_blank"><img title="image" src="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/image_thumb%5B8%5D-12.png" alt="image" width="237" height="427" border="0"></a></p><p>As you can see the Toolkit project is well segmented by control, making it very easy for you to find the source for the control of interest. For example, for the wizard control;</p><p><a href="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/image%5B23%5D-4.png" target="_blank"><img title="image" src="http://files.channel9.msdn.com/wlwimages/ae054c0b4d7b402ab1239e6800c0220f/image_thumb%5B9%5D-11.png" alt="image" width="650" height="351" border="0"></a></p><p>If you're building WPF applications or re-usable controls for them, this toolkit is one you should check out...</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:7143734dec414a278adc9fd80140ed1e">]]></description>
      <comments>http://channel9.msdn.com/coding4fun/blog/The-Extended-WPF-Toolkit-goes-v15</comments>
      <itunes:summary>For WPF Wednesday (I think Wednesday is going to be a kind of a rotating theme day... from WPF, to Web, &amp;quot;Wild&amp;quot; and Weird...) we&#39;re going to take another look at the Extended WPF Toolkit project. It&#39;s been nine months since we last looked at it, Today&#39;s toolkit time with the Extended WPF Toolkit and since then we&#39;ve gotten a new version with a bunch of new controls.Also last time we didn&#39;t look at the cool sample app that&#39;s included in the source tree...Extended WPF Toolkit - Extended WPF Toolkit 1.5.0Want an easier way to install the Extended WPF Toolkit?The Extended WPF Toolkit is available on Nuget. What&#39;s in the 1.5.0 Release?BusyIndicator ButtonSpinner Calculator CalculatorUpDown CheckListBox - New Control ChildWindow CollectionEditor - New Control CollectionEditorDialog - New Control ColorCanvas ColorPicker DateTimePicker DateTimeUpDown DecimalUpDown DoubleUpDown DropDownButton - New Control IntegerUpDown Magnifier MaskedTextBox MessageBox MultiLineTextEditor - New Control PrimitiveTypeCollectionEditor - New Control PropertyGrid - Beta RichTextBox RichTextBoxFormatBar SplitButton TimePicker WatermarkTextBox Wizard - New Control So as you can see, v1.5 has a number of new cool things to play with.For example the Wizard control. Many app&#39;s use them and many dev&#39;s re-invent that wheel when they do. This control looks simple, yet configurable enough, that maybe we don&#39;t need to re-invent it anymore (and even if we do, since the source is available, we don&#39;t have to start from scratch! Then there&#39;s the some of the other controls, new and old, too;Like one of my favorite, the calculator controlOr the watermark textboxOr the new WPF Property Grid;One thing about these samples... They are &amp;quot;live.&amp;quot; They are not static examples or screenshots, but instead live, working code.Speaking of the Sample app. I thought it very cool that the sample app used Prism. Prism is meant to help you build composite applications, separating the shell and components and a</itunes:summary>
      <link>http://channel9.msdn.com/coding4fun/blog/The-Extended-WPF-Toolkit-goes-v15</link>
      <pubDate>Wed, 18 Jan 2012 14:00:00 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/coding4fun/blog/The-Extended-WPF-Toolkit-goes-v15</guid>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/99020c1f-dc46-4fce-94b7-f0590fcd93ab.png" height="75" width="100"/>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/5abac0f6-f440-4ac0-b0be-1328e051f767.png" height="165" width="220"/>      
      <dc:creator>Greg Duncan</dc:creator>
      <itunes:author>Greg Duncan</itunes:author>
      <slash:comments>4</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/coding4fun/blog/The-Extended-WPF-Toolkit-goes-v15/RSS</wfw:commentRss>
      <category>Coding4Fun</category>
      <category>WPF</category>
    </item>
  <item>
      <title>Understanding Event Driven Programming - 23</title>
      <description><![CDATA[<p><span>In this lesson we demonstrate how events are utilized in the .NET Framework Class Library specific to&nbsp;WPF and&nbsp;<a href="http://ASP.NET" target="_blank">ASP.NET</a>&nbsp;Web Forms applications. In&nbsp;these examples, we see how C# is generated by the IDE to &quot;wire up&quot; a user action or application event to the code that handles that event. The point is that there's a pattern to how .NET works with events and how events drive most Graphical User Interface based applications.</span></p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:3ff13a7e0a074f5580979f9e0183dd40">]]></description>
      <comments>http://channel9.msdn.com/Series/C-Sharp-Fundamentals-Development-for-Absolute-Beginners/Understanding-Event-Driven-Programming-23</comments>
      <itunes:summary>In this lesson we demonstrate how events are utilized in the .NET Framework Class Library specific to&amp;nbsp;WPF and&amp;nbsp;ASP.NET&amp;nbsp;Web Forms applications. In&amp;nbsp;these examples, we see how C# is generated by the IDE to &amp;quot;wire up&amp;quot; a user action or application event to the code that handles that event. The point is that there&#39;s a pattern to how .NET works with events and how events drive most Graphical User Interface based applications.</itunes:summary>
      <itunes:duration>893</itunes:duration>
      <link>http://channel9.msdn.com/Series/C-Sharp-Fundamentals-Development-for-Absolute-Beginners/Understanding-Event-Driven-Programming-23</link>
      <pubDate>Mon, 21 Nov 2011 17:22:25 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Series/C-Sharp-Fundamentals-Development-for-Absolute-Beginners/Understanding-Event-Driven-Programming-23</guid>
      <media:thumbnail url="http://video.ch9.ms/ch9/dd40/3ff13a7e-0a07-4f55-8097-9f9e0183dd40/23UnderstandingEventDriveProgramming_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://video.ch9.ms/ch9/dd40/3ff13a7e-0a07-4f55-8097-9f9e0183dd40/23UnderstandingEventDriveProgramming_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://video.ch9.ms/ch9/dd40/3ff13a7e-0a07-4f55-8097-9f9e0183dd40/23UnderstandingEventDriveProgramming_512_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://video.ch9.ms/ch9/dd40/3ff13a7e-0a07-4f55-8097-9f9e0183dd40/23UnderstandingEventDriveProgramming_2MB_ch9.wmv" expression="full" duration="893" fileSize="259707673" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://video.ch9.ms/ch9/dd40/3ff13a7e-0a07-4f55-8097-9f9e0183dd40/23UnderstandingEventDriveProgramming_ch9.mp3" expression="full" duration="893" fileSize="7149413" type="audio/mp3" medium="audio"/>
        <media:content url="http://video.ch9.ms/ch9/dd40/3ff13a7e-0a07-4f55-8097-9f9e0183dd40/23UnderstandingEventDriveProgramming_ch9.webm" expression="full" duration="893" fileSize="55246166" type="video/webm" medium="video"/>
        <media:content url="http://video.ch9.ms/ch9/dd40/3ff13a7e-0a07-4f55-8097-9f9e0183dd40/23UnderstandingEventDriveProgramming_ch9.wma" expression="full" duration="893" fileSize="7232603" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://video.ch9.ms/ch9/dd40/3ff13a7e-0a07-4f55-8097-9f9e0183dd40/23UnderstandingEventDriveProgramming_high_ch9.mp4" expression="full" duration="893" fileSize="149340476" type="video/mp4" medium="video"/>
        <media:content url="http://video.ch9.ms/ch9/dd40/3ff13a7e-0a07-4f55-8097-9f9e0183dd40/23UnderstandingEventDriveProgramming_low_ch9.mp4" expression="full" duration="893" fileSize="25020733" type="video/mp4" medium="video"/>
        <media:content url="http://video.ch9.ms/ch9/dd40/3ff13a7e-0a07-4f55-8097-9f9e0183dd40/23UnderstandingEventDriveProgramming_med_ch9.mp4" expression="full" duration="893" fileSize="113471882" type="video/mp4" medium="video"/>
      </media:group>      
      <enclosure url="http://video.ch9.ms/ch9/dd40/3ff13a7e-0a07-4f55-8097-9f9e0183dd40/23UnderstandingEventDriveProgramming_2MB_ch9.wmv" length="259707673" type="video/x-ms-wmv"/>
      <dc:creator>Clint Rutkas, Bob Tabor, Golnaz</dc:creator>
      <itunes:author>Clint Rutkas, Bob Tabor, Golnaz</itunes:author>
      <slash:comments>7</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Series/C-Sharp-Fundamentals-Development-for-Absolute-Beginners/Understanding-Event-Driven-Programming-23/RSS</wfw:commentRss>
      <category>ASP.NET</category>
      <category>C#</category>
      <category>Visual Studio</category>
      <category>WPF</category>
    </item>
  <item>
      <title>Touch Workshop Part 1</title>
      <description><![CDATA[ <p>Touch Workshop Belgium - Part 1</p><p>Speaker : Christophe De Baene, RealDolmen</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:31d98da3b506493b98829efd00bae4e7">]]></description>
      <comments>http://channel9.msdn.com/Blogs/liese/Touch-Workshop-Part-1</comments>
      <itunes:summary> Touch Workshop Belgium - Part 1Speaker : Christophe De Baene, RealDolmen</itunes:summary>
      <itunes:duration>2030</itunes:duration>
      <link>http://channel9.msdn.com/Blogs/liese/Touch-Workshop-Part-1</link>
      <pubDate>Tue, 14 Jun 2011 06:01:21 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/liese/Touch-Workshop-Part-1</guid>
      <media:thumbnail url="http://media.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1_512_ch9.jpg" height="384" width="512"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1_custom_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://media.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1_2MB_ch9.wmv" expression="full" duration="2030" fileSize="69745671" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1_ch9.mp3" expression="full" duration="2030" fileSize="16247627" type="audio/mp3" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1_ch9.wma" expression="full" duration="2030" fileSize="16430851" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1_ch9.wmv" expression="full" duration="2030" fileSize="103681613" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1_high_ch9.mp4" expression="full" duration="2030" fileSize="533922922" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1_low_ch9.mp4" expression="full" duration="2030" fileSize="43834614" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1_Zune_ch9.wmv" expression="full" duration="2030" fileSize="73537666" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://smooth.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1.ism/manifest" expression="full" duration="2030" fileSize="8610" type="video/x-ms-wmv" medium="video"/>
      </media:group>      
      <enclosure url="http://media.ch9.ms/ch9/e4e7/31d98da3-b506-493b-9882-9efd00bae4e7/touchworkshoppart1_ch9.wmv" length="103681613" type="video/x-ms-wmv"/>
      <dc:creator>Anthony de Bruyn</dc:creator>
      <itunes:author>Anthony de Bruyn</itunes:author>
      <slash:comments>3</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/liese/Touch-Workshop-Part-1/RSS</wfw:commentRss>
      <category>Belgium</category>
      <category>BeLux</category>
      <category>fr-be</category>
      <category>ISV</category>
      <category>Multi-touch</category>
      <category>NL-BE</category>
      <category>Silverlight</category>
      <category>Touch</category>
      <category>Windows 7</category>
      <category>WPF</category>
      <category>Multi Touch</category>
    </item>
  <item>
      <title>Windows Phone 7 Game Begins Life in WPF -- Now a Silverlight,  Ad Supported App</title>
      <description><![CDATA[ <p><strong>Simon Said</strong> game on began life as a Windows Presentation Foundation&nbsp;(WPF) application that showed off touch user experience. Since then, it's become an advertising supported application for Windows Phone 7.</p><p>David Kelley, User Experience Architect for <a href="http://wirestone.com/">Wirestone</a>, explains how you can get AdCenter working to monetize your Phone application. He talks with ISV Architect Evangelist Bruce Kyle about the performance considerations he did to move his application from WPF to Windows Phone.</p><h3>Getting Started with AdCenter</h3><p>See the AdCenter site&nbsp;<a href="http://advertising.microsoft.com/mobile-apps">Monetize your Windows Phone 7 Apps</a>.</p><ol><li>Download the Ad Control SDK. Download the Ad SDK to build your app and run ads in test mode that requires no on-boarding to try out the Microsoft Advertising SDK for Windows Phone 7. </li><li>Register your mobile apps on pubCenter. Sign up and register your Windows Phone apps using Microsoft Advertising's solution for Windows Phone 7 publishers and app developers.&nbsp; </li><li>Implement and Submit. Set the Application Id and Ad Unit Id properties in the Ad Control and submit your ad-enabled app to the Windows Phone marketplace. </li></ol><p>See the three training videos are now available to help you build, register, and manage your Windows Phone 7 ad-enabled apps:</p><ul><li><a href="http://msdn.microsoft.com/en-us/gg604841">Create an Ad in a Windows Phone 7 XNA Game App</a>. </li><li><a href="http://msdn.microsoft.com/en-us/gg604842">Register Ad-Enabled Windows Phone 7 Apps</a>. </li><li><a href="http://msdn.microsoft.com/en-us/gg604843">Measure Ad Performance of Windows Phone 7 Apps</a>. </li></ul><h3>Getting Started on Windows Phone 7</h3><p>Tools are free. Get started on <a href="http://create.msdn.com">Windows Phone 7 or XBox at App Hub</a>.</p><p>See the <a href="http://channel9.msdn.com/Learn/Courses/WP7TrainingKit">free developer training course for Windows Phone 7 on Channel 9</a>.</p><p><a href="http://www.msdev.com/Directory/SeriesDescription.aspx?CourseId=158">Windows Phone 7 in 7 tutorials</a> on <a href="http://www.msdev.com/">MSDEV</a>. Each short, to-the-point video in this series highlights a feature of Windows Phone 7 in less than 7 minutes. This is a series for developers who want to pick up the basics quickly with brief explanations and hands-on examples. Demonstrations and code samples are based on the beta release of the Windows Phone 7 Developer.</p><h3>Free Help for Windows Phone 7</h3><p>Join <a href="http://microsoftplatformready.com/">Microsoft Platform Ready</a> for free assistance in developing and marketing your Windows Phone 7 applications.</p><h3>Other ISV Videos</h3><p>For videos on developing for Windows Phone 7, see:</p><ul><li><a href="http://www.microsoft.com/industry/government/products/WindowsPhone7/contest/StateAndLocal.aspx">State and Local Governments for Windows Phone 7 applications</a>. </li><li><a href="http://channel9.msdn.com/posts/Talking-with-Karmakcom-about-business-applications-on-Windows-Phone-7">Talking&nbsp; with Karmak.com about business applications on Windows Phone 7</a></li><li><a href="http://channel9.msdn.com/posts/The-BinaryDads-talk-about-building-applications-for-Windows-Phone-7">BinaryDads talk about building applications for Windows Phone 7</a></li><li><a href="http://channel9.msdn.com/Blogs/bruceky/Game-Design-and-Development-in-Silverlight-for-Windows-Phone-7">Game Design and Development in Silverlight for Windows Phone 7</a></li><li><a href="http://channel9.msdn.com/Blogs/bruceky/Credit-Card-Processing-for-Windows-Phone-7-on-Windows-Azure">Credit Card Processing for Windows Phone 7 on Windows Azure</a></li><li><a href="http://channel9.msdn.com/Blogs/bruceky/XNA-Game-Development-on-Windows-Phone-7-in-One-Sitting">XNA Game Development on Windows Phone 7 in One Sitting</a></li></ul><p>For other videos about independent software vendors (ISVs):</p><ul><li><a href="http://channel9.msdn.com/Blogs/bruceky/Quark-Extends-SharePoint-for-Dynamic-Publishing">Quark Extends SharePoint for Dynamic Publishing</a></li><li><a href="http://channel9.msdn.com/Blogs/bruceky/ProModel-Adds-Simulation-Visualization-to-Microsoft-Project">ProModel Adds Simulation, Visualization to Microsoft Project</a></li><li><a href="http://channel9.msdn.com/Blogs/bruceky/Thumb-Driven-Workflow-on-Windows-7-Slates-from-Blue-Dot-Solutions">Thumb-Driven Workflow on Windows 7 Slates from Blue Dot Solutions</a></li><li><a href="http://channel9.msdn.com/Blogs/bruceky/Accumulus-Makes-Subscription-Billing-Easy-for-Windows-Azure">Accumulus Makes Subscription Billing Easy for Windows Azure</a></li><li><a href="https://channel9.msdn.com/Blogs/bruceky/Azure-Email-Enables-Lists-Low-Cost-Storage-for-SharePoint">Azure Email-Enables Lists, Low-Cost Storage for SharePoint</a></li><li><a href="http://channel9.msdn.com/Blogs/bruceky/Crowd-Sourcing-Public-Sector-App-for-Windows-Phone-Azure">Crowd-Sourcing Public Sector App for Windows Phone, Azure</a></li><li><a href="http://channel9.msdn.com/Blogs/bruceky/Food-Buster-Game-Achieves-Scalability-with-Windows-Azure">Food Buster Game Achieves Scalability with Windows Azure</a></li></ul><h3>Up to Date News for ISVs and Software Developers</h3><p>See <a href="http://blogs.msdn.com/usivde">US ISV Community blog</a>.</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:9c8277c5224242e38c559eb80138694f">]]></description>
      <comments>http://channel9.msdn.com/Blogs/bruceky/Windows-Phone-7-Game-Begins-Life-in-WPF-Now-a-Silverlight-Ad-Supported-App</comments>
      <itunes:summary> Simon Said game on began life as a Windows Presentation Foundation&amp;nbsp;(WPF) application that showed off touch user experience. Since then, it&#39;s become an advertising supported application for Windows Phone 7.David Kelley, User Experience Architect for Wirestone, explains how you can get AdCenter working to monetize your Phone application. He talks with ISV Architect Evangelist Bruce Kyle about the performance considerations he did to move his application from WPF to Windows Phone.Getting Started with AdCenterSee the AdCenter site&amp;nbsp;Monetize your Windows Phone 7 Apps.Download the Ad Control SDK. Download the Ad SDK to build your app and run ads in test mode that requires no on-boarding to try out the Microsoft Advertising SDK for Windows Phone 7. Register your mobile apps on pubCenter. Sign up and register your Windows Phone apps using Microsoft Advertising&#39;s solution for Windows Phone 7 publishers and app developers.&amp;nbsp; Implement and Submit. Set the Application Id and Ad Unit Id properties in the Ad Control and submit your ad-enabled app to the Windows Phone marketplace. See the three training videos are now available to help you build, register, and manage your Windows Phone 7 ad-enabled apps:Create an Ad in a Windows Phone 7 XNA Game App. Register Ad-Enabled Windows Phone 7 Apps. Measure Ad Performance of Windows Phone 7 Apps. Getting Started on Windows Phone 7Tools are free. Get started on Windows Phone 7 or XBox at App Hub.See the free developer training course for Windows Phone 7 on Channel 9.Windows Phone 7 in 7 tutorials on MSDEV. Each short, to-the-point video in this series highlights a feature of Windows Phone 7 in less than 7 minutes. This is a series for developers who want to pick up the basics quickly with brief explanations and hands-on examples. Demonstrations and code samples are based on the beta release of the Windows Phone 7 Developer.Free Help for Windows Phone 7Join Microsoft Platform Ready for free assistance in developing and marketi</itunes:summary>
      <itunes:duration>462</itunes:duration>
      <link>http://channel9.msdn.com/Blogs/bruceky/Windows-Phone-7-Game-Begins-Life-in-WPF-Now-a-Silverlight-Ad-Supported-App</link>
      <pubDate>Thu, 07 Apr 2011 00:15:28 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/bruceky/Windows-Phone-7-Game-Begins-Life-in-WPF-Now-a-Silverlight-Ad-Supported-App</guid>
      <media:thumbnail url="http://media.ch9.ms/ch9/694f/9c8277c5-2242-42e3-8c55-9eb80138694f/wirestone1_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/694f/9c8277c5-2242-42e3-8c55-9eb80138694f/wirestone1_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/694f/9c8277c5-2242-42e3-8c55-9eb80138694f/wirestone1_512_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://media.ch9.ms/ch9/694f/9c8277c5-2242-42e3-8c55-9eb80138694f/wirestone1_2MB_ch9.wmv" expression="full" duration="462" fileSize="1060521178" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/694f/9c8277c5-2242-42e3-8c55-9eb80138694f/wirestone1_ch9.mp3" expression="full" duration="462" fileSize="3699562" type="audio/mp3" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/694f/9c8277c5-2242-42e3-8c55-9eb80138694f/wirestone1_ch9.wma" expression="full" duration="462" fileSize="3744959" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/694f/9c8277c5-2242-42e3-8c55-9eb80138694f/wirestone1_ch9.wmv" expression="full" duration="462" fileSize="100904205" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/694f/9c8277c5-2242-42e3-8c55-9eb80138694f/wirestone1_high_ch9.mp4" expression="full" duration="462" fileSize="198993512" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/694f/9c8277c5-2242-42e3-8c55-9eb80138694f/wirestone1_low_ch9.mp4" expression="full" duration="462" fileSize="46738265" type="video/mp4" medium="video"/>
        <media:content url="http://smooth.ch9.ms/ch9/694f/9c8277c5-2242-42e3-8c55-9eb80138694f/wirestone1.ism/manifest" expression="full" duration="462" fileSize="9974" type="video/x-ms-wmv" medium="video"/>
      </media:group>      
      <enclosure url="http://media.ch9.ms/ch9/694f/9c8277c5-2242-42e3-8c55-9eb80138694f/wirestone1_ch9.wmv" length="100904205" type="video/x-ms-wmv"/>
      <dc:creator>Bruce D Kyle</dc:creator>
      <itunes:author>Bruce D Kyle</itunes:author>
      <slash:comments>5</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/bruceky/Windows-Phone-7-Game-Begins-Life-in-WPF-Now-a-Silverlight-Ad-Supported-App/RSS</wfw:commentRss>
      <category>AdCenter</category>
      <category>Game Design</category>
      <category>Games</category>
      <category>Improving User Experience</category>
      <category>Silverlight</category>
      <category>User Experience</category>
      <category>Windows Phone</category>
      <category>Windows Phone 7</category>
      <category>WPF</category>
    </item>
  <item>
      <title>NYC DevReady: MVVM - Session 5 (of 5) - Leveraging MVVM Inside PRISM</title>
      <description><![CDATA[ <p>MVVM. MVVM. MVVM.&nbsp; I bet you’ve seen that acronym more than three times before? Ever wonder what it means?&nbsp; I’ll tell you: “Model View-View Model”</p><p>Ever wonder what THAT means?! <a href="http://en.wikipedia.org/wiki/Model_View_ViewModel">MVVM is a popular design pattern</a> for coding the presentation layer in both Silverlight &amp; Windows Presentation Foundation (WPF). It seems to be the rage that all the cool kids are doing these days, which means YOU should probably pay attention to it!&nbsp; Get your development skills ready for MVVM (Model View View Model Design Pattern) and build some exciting applications for WPF, Silverlight or Windows Phone.</p><p>On March 21st, 2011 in New York City, Microsoft hosted a DevReady MVVM event along with DevExpress. This was a free full day training event.&nbsp; We recorded the event, and now it is here on Channel 9 for your learning pleasure!</p><p>Pop on some headphones and listen &amp; learn at your own pace!</p><p>The sessions were delivered by Microsoft MVP <a href="www.dotnetdude.com">Miguel Castro</a>, Microsoft Developer Evangelist <a href="http://smallandmighty.net/">Dani Diaz</a>, and DevExpress Tech Evangelist <a href="http://community.devexpress.com/blogs/seth/default.aspx">Seth Juarez</a>.</p><p>There are six sessions in total:</p><blockquote><p><strong><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-1-of-5-Demystifying-XAML">Demystifying XAML: Achieving Your Moment Of Clarity</a></strong></p><p>Still find XAML intimidating? Well, throw in MVVM and certain design practices and it can get worse. But the truth is that it isn't as complicated as it appears to be. In this short session, I'll give you the basics of how XAML works. I'll cover its syntax, control usage, the visual tree, and the scariest animal of all, binding. I'll give you your moment of clarity, I promise.</p><p><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-2-of-5-Programming-with-MVVM-Part-1"><strong>Programming with MVVM - </strong><strong>Part 1</strong></a></p><p>WPF overwhelmed us with the most powerful data binding ever released in a development platform. It seemed there was so much to learn in order to use it, but it really isn't that complicated. However, to use it to its full potential, you really do need to introduce the Model-View-ViewModel pattern. The ideas and goal around this pattern seem to vary from person to person, but the one thing that they all share is that it provides a point of binding for XAML pages. In this session, I'll show you what MVVM is and how to use it and what to put in it, in order to get maximum potential out of XAML binding.</p><p><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-3-of-5-Programming-with-MVVM-Part-2"><strong>Programming with MVVM - </strong><strong>Part 2</strong></a></p><p>Now that you’ve sat through my MVVM session (what? you didn’t?), I want to take it to the next level by continuing your studies into this awesome and necessary pattern. In this session, I’ll cover more advanced topics you use when programming using Model-View-ViewModel. These include Design-Time Data, ViewModel-First, Validation, and the ever-so-popular MVVM Frameworks. There I’ll actually show and give you a small MVVM framework with which to launch your development. Though I will do a brief review on the fundamentals and goals of MVVM and its usage, this session does expect a little bit of knowledge on the pattern from you.</p><p><strong><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-4-of-5-How-Using-MVVM-Saved-My-Butt-and-How-Laziness-Came-Back-To-Bite-Me">How Using MVVM Saved My Butt and How Laziness Came Back To Bite Me</a></strong></p><p>Get a preview of upcoming Visual Studio features that will allow you to share code between Microsoft .NET platforms. You’ll learn how to structure applications to maximize the amount of shared code, how to write an app that’s used across Silverlight Desktop and Windows Phone, and how to build business logic and helper functions that work across all 3 Screens plus the cloud.</p><p><strong>Leveraging MVVM Inside PRISM</strong></p><p>Understanding an architecture pattern like MVVM is great but many companies invest in third-party control suites to make their application development less painful. In this session, you'll learn how to leverage some great controls from DevExpress in conjunction with MVVM to build applications in both WPF and Silverlight.</p></blockquote> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:ea4228679b1346afb2919ebd015d3278">]]></description>
      <comments>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-5-of-5-Leveraging-MVVM-Inside-PRISM</comments>
      <itunes:summary> MVVM. MVVM. MVVM.&amp;nbsp; I bet you’ve seen that acronym more than three times before? Ever wonder what it means?&amp;nbsp; I’ll tell you: “Model View-View Model”Ever wonder what THAT means?! MVVM is a popular design pattern for coding the presentation layer in both Silverlight &amp;amp; Windows Presentation Foundation (WPF). It seems to be the rage that all the cool kids are doing these days, which means YOU should probably pay attention to it!&amp;nbsp; Get your development skills ready for MVVM (Model View View Model Design Pattern) and build some exciting applications for WPF, Silverlight or Windows Phone.On March 21st, 2011 in New York City, Microsoft hosted a DevReady MVVM event along with DevExpress. This was a free full day training event.&amp;nbsp; We recorded the event, and now it is here on Channel 9 for your learning pleasure!Pop on some headphones and listen &amp;amp; learn at your own pace!The sessions were delivered by Microsoft MVP Miguel Castro, Microsoft Developer Evangelist Dani Diaz, and DevExpress Tech Evangelist Seth Juarez.There are six sessions in total:Demystifying XAML: Achieving Your Moment Of ClarityStill find XAML intimidating? Well, throw in MVVM and certain design practices and it can get worse. But the truth is that it isn&#39;t as complicated as it appears to be. In this short session, I&#39;ll give you the basics of how XAML works. I&#39;ll cover its syntax, control usage, the visual tree, and the scariest animal of all, binding. I&#39;ll give you your moment of clarity, I promise.Programming with MVVM - Part 1WPF overwhelmed us with the most powerful data binding ever released in a development platform. It seemed there was so much to learn in order to use it, but it really isn&#39;t that complicated. However, to use it to its full potential, you really do need to introduce the Model-View-ViewModel pattern. The ideas and goal around this pattern seem to vary from person to person, but the one thing that they all share is that it provides a point of binding for XAML pages. </itunes:summary>
      <itunes:duration>4674</itunes:duration>
      <link>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-5-of-5-Leveraging-MVVM-Inside-PRISM</link>
      <pubDate>Wed, 06 Apr 2011 13:20:34 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-5-of-5-Leveraging-MVVM-Inside-PRISM</guid>
      <media:thumbnail url="http://media.ch9.ms/ch9/3278/ea422867-9b13-46af-b291-9ebd015d3278/NYCDRMVVMS5_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/3278/ea422867-9b13-46af-b291-9ebd015d3278/NYCDRMVVMS5_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/3278/ea422867-9b13-46af-b291-9ebd015d3278/NYCDRMVVMS5_512_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://media.ch9.ms/ch9/3278/ea422867-9b13-46af-b291-9ebd015d3278/NYCDRMVVMS5_2MB_ch9.wmv" expression="full" duration="4674" fileSize="209882631" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/3278/ea422867-9b13-46af-b291-9ebd015d3278/NYCDRMVVMS5_ch9.mp3" expression="full" duration="4674" fileSize="37396665" type="audio/mp3" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/3278/ea422867-9b13-46af-b291-9ebd015d3278/NYCDRMVVMS5_ch9.wma" expression="full" duration="4674" fileSize="37810317" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/3278/ea422867-9b13-46af-b291-9ebd015d3278/NYCDRMVVMS5_high_ch9.mp4" expression="full" duration="4674" fileSize="1185337337" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/3278/ea422867-9b13-46af-b291-9ebd015d3278/NYCDRMVVMS5_low_ch9.mp4" expression="full" duration="4674" fileSize="78856791" type="video/mp4" medium="video"/>
      </media:group>      
      <enclosure url="http://media.ch9.ms/ch9/3278/ea422867-9b13-46af-b291-9ebd015d3278/NYCDRMVVMS5_2MB_ch9.wmv" length="209882631" type="video/x-ms-wmv"/>
      <dc:creator>Peter Laudati</dc:creator>
      <itunes:author>Peter Laudati</itunes:author>
      <slash:comments>0</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-5-of-5-Leveraging-MVVM-Inside-PRISM/rss</wfw:commentRss>
      <category>MVVM</category>
      <category>Silverlight</category>
      <category>Windows Phone 7</category>
      <category>WPF</category>
      <category>New York City</category>
    </item>
  <item>
      <title>NYC DevReady: MVVM - Session 4 (of 5) - How Using MVVM Saved My Butt and How Laziness Came Back To Bite Me</title>
      <description><![CDATA[ <p>MVVM. MVVM. MVVM.&nbsp; I bet you’ve seen that acronym more than three times before? Ever wonder what it means?&nbsp; I’ll tell you: “Model View-View Model”</p><p>Ever wonder what THAT means?! <a href="http://en.wikipedia.org/wiki/Model_View_ViewModel">MVVM is a popular design pattern</a> for coding the presentation layer in both Silverlight &amp; Windows Presentation Foundation (WPF). It seems to be the rage that all the cool kids are doing these days, which means YOU should probably pay attention to it!&nbsp; Get your development skills ready for MVVM (Model View View Model Design Pattern) and build some exciting applications for WPF, Silverlight or Windows Phone.</p><p>On March 21st, 2011 in New York City, Microsoft hosted a DevReady MVVM event along with DevExpress. This was a free full day training event.&nbsp; We recorded the event, and now it is here on Channel 9 for your learning pleasure!</p><p>Pop on some headphones and listen &amp; learn at your own pace!</p><p>The sessions were delivered by Microsoft MVP <a href="www.dotnetdude.com">Miguel Castro</a>, Microsoft Developer Evangelist <a href="http://smallandmighty.net/">Dani Diaz</a>, and DevExpress Tech Evangelist <a href="http://community.devexpress.com/blogs/seth/default.aspx">Seth Juarez</a>.</p><p>There are six sessions in total:</p><blockquote><p><strong><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-1-of-5-Demystifying-XAML">Demystifying XAML: Achieving Your Moment Of Clarity</a></strong></p><p>Still find XAML intimidating? Well, throw in MVVM and certain design practices and it can get worse. But the truth is that it isn't as complicated as it appears to be. In this short session, I'll give you the basics of how XAML works. I'll cover its syntax, control usage, the visual tree, and the scariest animal of all, binding. I'll give you your moment of clarity, I promise.</p><p><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-2-of-5-Programming-with-MVVM-Part-1"><strong>Programming with MVVM - </strong><strong>Part 1</strong></a></p><p>WPF overwhelmed us with the most powerful data binding ever released in a development platform. It seemed there was so much to learn in order to use it, but it really isn't that complicated. However, to use it to its full potential, you really do need to introduce the Model-View-ViewModel pattern. The ideas and goal around this pattern seem to vary from person to person, but the one thing that they all share is that it provides a point of binding for XAML pages. In this session, I'll show you what MVVM is and how to use it and what to put in it, in order to get maximum potential out of XAML binding.</p><p><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-3-of-5-Programming-with-MVVM-Part-2"><strong>Programming with MVVM - </strong><strong>Part 2</strong></a></p><p>Now that you’ve sat through my MVVM session (what? you didn’t?), I want to take it to the next level by continuing your studies into this awesome and necessary pattern. In this session, I’ll cover more advanced topics you use when programming using Model-View-ViewModel. These include Design-Time Data, ViewModel-First, Validation, and the ever-so-popular MVVM Frameworks. There I’ll actually show and give you a small MVVM framework with which to launch your development. Though I will do a brief review on the fundamentals and goals of MVVM and its usage, this session does expect a little bit of knowledge on the pattern from you.</p><p><strong>How Using MVVM Saved My Butt and How Laziness Came Back To Bite Me</strong></p><p>Get a preview of upcoming Visual Studio features that will allow you to share code between Microsoft .NET platforms. You’ll learn how to structure applications to maximize the amount of shared code, how to write an app that’s used across Silverlight Desktop and Windows Phone, and how to build business logic and helper functions that work across all 3 Screens plus the cloud.</p><p><strong><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-5-of-5-Leveraging-MVVM-Inside-PRISM">Leveraging MVVM Inside PRISM</a></strong></p><p>Understanding an architecture pattern like MVVM is great but many companies invest in third-party control suites to make their application development less painful. In this session, you'll learn how to leverage some great controls from DevExpress in conjunction with MVVM to build applications in both WPF and Silverlight.</p></blockquote> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:f9ec0b9d6fcd45249f649ebd015b42d7">]]></description>
      <comments>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-4-of-5-How-Using-MVVM-Saved-My-Butt-and-How-Laziness-Came-Back-To-Bite-Me</comments>
      <itunes:summary> MVVM. MVVM. MVVM.&amp;nbsp; I bet you’ve seen that acronym more than three times before? Ever wonder what it means?&amp;nbsp; I’ll tell you: “Model View-View Model”Ever wonder what THAT means?! MVVM is a popular design pattern for coding the presentation layer in both Silverlight &amp;amp; Windows Presentation Foundation (WPF). It seems to be the rage that all the cool kids are doing these days, which means YOU should probably pay attention to it!&amp;nbsp; Get your development skills ready for MVVM (Model View View Model Design Pattern) and build some exciting applications for WPF, Silverlight or Windows Phone.On March 21st, 2011 in New York City, Microsoft hosted a DevReady MVVM event along with DevExpress. This was a free full day training event.&amp;nbsp; We recorded the event, and now it is here on Channel 9 for your learning pleasure!Pop on some headphones and listen &amp;amp; learn at your own pace!The sessions were delivered by Microsoft MVP Miguel Castro, Microsoft Developer Evangelist Dani Diaz, and DevExpress Tech Evangelist Seth Juarez.There are six sessions in total:Demystifying XAML: Achieving Your Moment Of ClarityStill find XAML intimidating? Well, throw in MVVM and certain design practices and it can get worse. But the truth is that it isn&#39;t as complicated as it appears to be. In this short session, I&#39;ll give you the basics of how XAML works. I&#39;ll cover its syntax, control usage, the visual tree, and the scariest animal of all, binding. I&#39;ll give you your moment of clarity, I promise.Programming with MVVM - Part 1WPF overwhelmed us with the most powerful data binding ever released in a development platform. It seemed there was so much to learn in order to use it, but it really isn&#39;t that complicated. However, to use it to its full potential, you really do need to introduce the Model-View-ViewModel pattern. The ideas and goal around this pattern seem to vary from person to person, but the one thing that they all share is that it provides a point of binding for XAML pages. </itunes:summary>
      <itunes:duration>3172</itunes:duration>
      <link>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-4-of-5-How-Using-MVVM-Saved-My-Butt-and-How-Laziness-Came-Back-To-Bite-Me</link>
      <pubDate>Wed, 06 Apr 2011 11:26:14 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-4-of-5-How-Using-MVVM-Saved-My-Butt-and-How-Laziness-Came-Back-To-Bite-Me</guid>
      <media:thumbnail url="http://media.ch9.ms/ch9/42d7/f9ec0b9d-6fcd-4524-9f64-9ebd015b42d7/NYCDRMVVMS4_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/42d7/f9ec0b9d-6fcd-4524-9f64-9ebd015b42d7/NYCDRMVVMS4_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/42d7/f9ec0b9d-6fcd-4524-9f64-9ebd015b42d7/NYCDRMVVMS4_512_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://media.ch9.ms/ch9/42d7/f9ec0b9d-6fcd-4524-9f64-9ebd015b42d7/NYCDRMVVMS4_2MB_ch9.wmv" expression="full" duration="3172" fileSize="138886719" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/42d7/f9ec0b9d-6fcd-4524-9f64-9ebd015b42d7/NYCDRMVVMS4_ch9.mp3" expression="full" duration="3172" fileSize="25381877" type="audio/mp3" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/42d7/f9ec0b9d-6fcd-4524-9f64-9ebd015b42d7/NYCDRMVVMS4_ch9.wma" expression="full" duration="3172" fileSize="25659139" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/42d7/f9ec0b9d-6fcd-4524-9f64-9ebd015b42d7/NYCDRMVVMS4_high_ch9.mp4" expression="full" duration="3172" fileSize="807319940" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/42d7/f9ec0b9d-6fcd-4524-9f64-9ebd015b42d7/NYCDRMVVMS4_low_ch9.mp4" expression="full" duration="3172" fileSize="56412155" type="video/mp4" medium="video"/>
      </media:group>      
      <enclosure url="http://media.ch9.ms/ch9/42d7/f9ec0b9d-6fcd-4524-9f64-9ebd015b42d7/NYCDRMVVMS4_2MB_ch9.wmv" length="138886719" type="video/x-ms-wmv"/>
      <dc:creator>Peter Laudati</dc:creator>
      <itunes:author>Peter Laudati</itunes:author>
      <slash:comments>0</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-4-of-5-How-Using-MVVM-Saved-My-Butt-and-How-Laziness-Came-Back-To-Bite-Me/rss</wfw:commentRss>
      <category>MVVM</category>
      <category>Silverlight</category>
      <category>Windows Phone 7</category>
      <category>WPF</category>
      <category>New York City</category>
    </item>
  <item>
      <title>NYC DevReady: MVVM - Session 3 (of 5) - Programming with MVVM - Part 2</title>
      <description><![CDATA[ <p>MVVM. MVVM. MVVM.&nbsp; I bet you’ve seen that acronym more than three times before? Ever wonder what it means?&nbsp; I’ll tell you: “Model View-View Model”</p><p>Ever wonder what THAT means?! <a href="http://en.wikipedia.org/wiki/Model_View_ViewModel">MVVM is a popular design pattern</a> for coding the presentation layer in both Silverlight &amp; Windows Presentation Foundation (WPF). It seems to be the rage that all the cool kids are doing these days, which means YOU should probably pay attention to it!&nbsp; Get your development skills ready for MVVM (Model View View Model Design Pattern) and build some exciting applications for WPF, Silverlight or Windows Phone.</p><p>On March 21st, 2011 in New York City, Microsoft hosted a DevReady MVVM event along with DevExpress. This was a free full day training event.&nbsp; We recorded the event, and now it is here on Channel 9 for your learning pleasure!</p><p>Pop on some headphones and listen &amp; learn at your own pace!</p><p>The sessions were delivered by Microsoft MVP <a href="www.dotnetdude.com">Miguel Castro</a>, Microsoft Developer Evangelist <a href="http://smallandmighty.net/">Dani Diaz</a>, and DevExpress Tech Evangelist <a href="http://community.devexpress.com/blogs/seth/default.aspx">Seth Juarez</a>.</p><p>There are six sessions in total:</p><blockquote><p><strong><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-1-of-5-Demystifying-XAML">Demystifying XAML: Achieving Your Moment Of Clarity</a></strong></p><p>Still find XAML intimidating? Well, throw in MVVM and certain design practices and it can get worse. But the truth is that it isn't as complicated as it appears to be. In this short session, I'll give you the basics of how XAML works. I'll cover its syntax, control usage, the visual tree, and the scariest animal of all, binding. I'll give you your moment of clarity, I promise.</p><p><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-2-of-5-Programming-with-MVVM-Part-1"><strong>Programming with MVVM - </strong><strong>Part 1</strong></a></p><p>WPF overwhelmed us with the most powerful data binding ever released in a development platform. It seemed there was so much to learn in order to use it, but it really isn't that complicated. However, to use it to its full potential, you really do need to introduce the Model-View-ViewModel pattern. The ideas and goal around this pattern seem to vary from person to person, but the one thing that they all share is that it provides a point of binding for XAML pages. In this session, I'll show you what MVVM is and how to use it and what to put in it, in order to get maximum potential out of XAML binding.</p><p><strong>Programming with MVVM - </strong><strong>Part 2</strong></p><p>Now that you’ve sat through my MVVM session (what? you didn’t?), I want to take it to the next level by continuing your studies into this awesome and necessary pattern. In this session, I’ll cover more advanced topics you use when programming using Model-View-ViewModel. These include Design-Time Data, ViewModel-First, Validation, and the ever-so-popular MVVM Frameworks. There I’ll actually show and give you a small MVVM framework with which to launch your development. Though I will do a brief review on the fundamentals and goals of MVVM and its usage, this session does expect a little bit of knowledge on the pattern from you.</p><p><strong><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-4-of-5-How-Using-MVVM-Saved-My-Butt-and-How-Laziness-Came-Back-To-Bite-Me">How Using MVVM Saved My Butt and How Laziness Came Back To Bite Me</a></strong></p><p>Get a preview of upcoming Visual Studio features that will allow you to share code between Microsoft .NET platforms. You’ll learn how to structure applications to maximize the amount of shared code, how to write an app that’s used across Silverlight Desktop and Windows Phone, and how to build business logic and helper functions that work across all 3 Screens plus the cloud.</p><p><strong><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-5-of-5-Leveraging-MVVM-Inside-PRISM">Leveraging MVVM Inside PRISM</a></strong></p><p>Understanding an architecture pattern like MVVM is great but many companies invest in third-party control suites to make their application development less painful. In this session, you'll learn how to leverage some great controls from DevExpress in conjunction with MVVM to build applications in both WPF and Silverlight.</p></blockquote> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:5c3750862910469793f59ebd015a2351">]]></description>
      <comments>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-3-of-5-Programming-with-MVVM-Part-2</comments>
      <itunes:summary> MVVM. MVVM. MVVM.&amp;nbsp; I bet you’ve seen that acronym more than three times before? Ever wonder what it means?&amp;nbsp; I’ll tell you: “Model View-View Model”Ever wonder what THAT means?! MVVM is a popular design pattern for coding the presentation layer in both Silverlight &amp;amp; Windows Presentation Foundation (WPF). It seems to be the rage that all the cool kids are doing these days, which means YOU should probably pay attention to it!&amp;nbsp; Get your development skills ready for MVVM (Model View View Model Design Pattern) and build some exciting applications for WPF, Silverlight or Windows Phone.On March 21st, 2011 in New York City, Microsoft hosted a DevReady MVVM event along with DevExpress. This was a free full day training event.&amp;nbsp; We recorded the event, and now it is here on Channel 9 for your learning pleasure!Pop on some headphones and listen &amp;amp; learn at your own pace!The sessions were delivered by Microsoft MVP Miguel Castro, Microsoft Developer Evangelist Dani Diaz, and DevExpress Tech Evangelist Seth Juarez.There are six sessions in total:Demystifying XAML: Achieving Your Moment Of ClarityStill find XAML intimidating? Well, throw in MVVM and certain design practices and it can get worse. But the truth is that it isn&#39;t as complicated as it appears to be. In this short session, I&#39;ll give you the basics of how XAML works. I&#39;ll cover its syntax, control usage, the visual tree, and the scariest animal of all, binding. I&#39;ll give you your moment of clarity, I promise.Programming with MVVM - Part 1WPF overwhelmed us with the most powerful data binding ever released in a development platform. It seemed there was so much to learn in order to use it, but it really isn&#39;t that complicated. However, to use it to its full potential, you really do need to introduce the Model-View-ViewModel pattern. The ideas and goal around this pattern seem to vary from person to person, but the one thing that they all share is that it provides a point of binding for XAML pages. </itunes:summary>
      <itunes:duration>5117</itunes:duration>
      <link>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-3-of-5-Programming-with-MVVM-Part-2</link>
      <pubDate>Wed, 06 Apr 2011 11:25:44 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-3-of-5-Programming-with-MVVM-Part-2</guid>
      <media:thumbnail url="http://media.ch9.ms/ch9/2351/5c375086-2910-4697-93f5-9ebd015a2351/NYCDRMVVMS3_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/2351/5c375086-2910-4697-93f5-9ebd015a2351/NYCDRMVVMS3_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/2351/5c375086-2910-4697-93f5-9ebd015a2351/NYCDRMVVMS3_512_ch9.jpg" height="384" width="512"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/2351/5c375086-2910-4697-93f5-9ebd015a2351/NYCDRMVVMS3_custom_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://media.ch9.ms/ch9/2351/5c375086-2910-4697-93f5-9ebd015a2351/NYCDRMVVMS3_2MB_ch9.wmv" expression="full" duration="5117" fileSize="191736709" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/2351/5c375086-2910-4697-93f5-9ebd015a2351/NYCDRMVVMS3_ch9.mp3" expression="full" duration="5117" fileSize="40944306" type="audio/mp3" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/2351/5c375086-2910-4697-93f5-9ebd015a2351/NYCDRMVVMS3_ch9.wma" expression="full" duration="5117" fileSize="41391085" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/2351/5c375086-2910-4697-93f5-9ebd015a2351/NYCDRMVVMS3_high_ch9.mp4" expression="full" duration="5117" fileSize="1280187148" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/2351/5c375086-2910-4697-93f5-9ebd015a2351/NYCDRMVVMS3_low_ch9.mp4" expression="full" duration="5117" fileSize="85692772" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/2351/5c375086-2910-4697-93f5-9ebd015a2351/NYCDRMVVMS3_Zune_ch9.wmv" expression="full" duration="5117" fileSize="135156188" type="video/x-ms-wmv" medium="video"/>
      </media:group>      
      <enclosure url="http://media.ch9.ms/ch9/2351/5c375086-2910-4697-93f5-9ebd015a2351/NYCDRMVVMS3_2MB_ch9.wmv" length="191736709" type="video/x-ms-wmv"/>
      <dc:creator>Peter Laudati</dc:creator>
      <itunes:author>Peter Laudati</itunes:author>
      <slash:comments>1</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-3-of-5-Programming-with-MVVM-Part-2/rss</wfw:commentRss>
      <category>MVVM</category>
      <category>Silverlight</category>
      <category>Windows Phone 7</category>
      <category>WPF</category>
      <category>New York City</category>
    </item>
  <item>
      <title>NYC DevReady: MVVM - Session 2 (of 5) - Programming with MVVM - Part 1</title>
      <description><![CDATA[ <p>MVVM. MVVM. MVVM.&nbsp; I bet you’ve seen that acronym more than three times before? Ever wonder what it means?&nbsp; I’ll tell you: “Model View-View Model”</p><p>Ever wonder what THAT means?! <a href="http://en.wikipedia.org/wiki/Model_View_ViewModel">MVVM is a popular design pattern</a> for coding the presentation layer in both Silverlight &amp; Windows Presentation Foundation (WPF). It seems to be the rage that all the cool kids are doing these days, which means YOU should probably pay attention to it!&nbsp; Get your development skills ready for MVVM (Model View View Model Design Pattern) and build some exciting applications for WPF, Silverlight or Windows Phone.</p><p>On March 21st, 2011 in New York City, Microsoft hosted a DevReady MVVM event along with DevExpress. This was a free full day training event.&nbsp; We recorded the event, and now it is here on Channel 9 for your learning pleasure!</p><p>Pop on some headphones and listen &amp; learn at your own pace!</p><p>The sessions were delivered by Microsoft MVP <a href="www.dotnetdude.com">Miguel Castro</a>, Microsoft Developer Evangelist <a href="http://smallandmighty.net/">Dani Diaz</a>, and DevExpress Tech Evangelist <a href="http://community.devexpress.com/blogs/seth/default.aspx">Seth Juarez</a>.</p><p>There are six sessions in total:</p><blockquote><p><strong><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-1-of-5-Demystifying-XAML">Demystifying XAML: Achieving Your Moment Of Clarity</a></strong></p><p>Still find XAML intimidating? Well, throw in MVVM and certain design practices and it can get worse. But the truth is that it isn't as complicated as it appears to be. In this short session, I'll give you the basics of how XAML works. I'll cover its syntax, control usage, the visual tree, and the scariest animal of all, binding. I'll give you your moment of clarity, I promise.</p><p><strong>Programming with MVVM - </strong><strong>Part 1</strong></p><p>WPF overwhelmed us with the most powerful data binding ever released in a development platform. It seemed there was so much to learn in order to use it, but it really isn't that complicated. However, to use it to its full potential, you really do need to introduce the Model-View-ViewModel pattern. The ideas and goal around this pattern seem to vary from person to person, but the one thing that they all share is that it provides a point of binding for XAML pages. In this session, I'll show you what MVVM is and how to use it and what to put in it, in order to get maximum potential out of XAML binding.</p><p><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-3-of-5-Programming-with-MVVM-Part-2"><strong>Programming with MVVM - </strong><strong>Part 2</strong></a></p><p>Now that you’ve sat through my MVVM session (what? you didn’t?), I want to take it to the next level by continuing your studies into this awesome and necessary pattern. In this session, I’ll cover more advanced topics you use when programming using Model-View-ViewModel. These include Design-Time Data, ViewModel-First, Validation, and the ever-so-popular MVVM Frameworks. There I’ll actually show and give you a small MVVM framework with which to launch your development. Though I will do a brief review on the fundamentals and goals of MVVM and its usage, this session does expect a little bit of knowledge on the pattern from you.</p><p><strong><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-4-of-5-How-Using-MVVM-Saved-My-Butt-and-How-Laziness-Came-Back-To-Bite-Me">How Using MVVM Saved My Butt and How Laziness Came Back To Bite Me</a></strong></p><p>Get a preview of upcoming Visual Studio features that will allow you to share code between Microsoft .NET platforms. You’ll learn how to structure applications to maximize the amount of shared code, how to write an app that’s used across Silverlight Desktop and Windows Phone, and how to build business logic and helper functions that work across all 3 Screens plus the cloud.</p><p><strong><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-5-of-5-Leveraging-MVVM-Inside-PRISM">Leveraging MVVM Inside PRISM</a></strong></p><p>Understanding an architecture pattern like MVVM is great but many companies invest in third-party control suites to make their application development less painful. In this session, you'll learn how to leverage some great controls from DevExpress in conjunction with MVVM to build applications in both WPF and Silverlight.</p></blockquote> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:19bd8bd56f13440aa8b99ebd01582451">]]></description>
      <comments>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-2-of-5-Programming-with-MVVM-Part-1</comments>
      <itunes:summary> MVVM. MVVM. MVVM.&amp;nbsp; I bet you’ve seen that acronym more than three times before? Ever wonder what it means?&amp;nbsp; I’ll tell you: “Model View-View Model”Ever wonder what THAT means?! MVVM is a popular design pattern for coding the presentation layer in both Silverlight &amp;amp; Windows Presentation Foundation (WPF). It seems to be the rage that all the cool kids are doing these days, which means YOU should probably pay attention to it!&amp;nbsp; Get your development skills ready for MVVM (Model View View Model Design Pattern) and build some exciting applications for WPF, Silverlight or Windows Phone.On March 21st, 2011 in New York City, Microsoft hosted a DevReady MVVM event along with DevExpress. This was a free full day training event.&amp;nbsp; We recorded the event, and now it is here on Channel 9 for your learning pleasure!Pop on some headphones and listen &amp;amp; learn at your own pace!The sessions were delivered by Microsoft MVP Miguel Castro, Microsoft Developer Evangelist Dani Diaz, and DevExpress Tech Evangelist Seth Juarez.There are six sessions in total:Demystifying XAML: Achieving Your Moment Of ClarityStill find XAML intimidating? Well, throw in MVVM and certain design practices and it can get worse. But the truth is that it isn&#39;t as complicated as it appears to be. In this short session, I&#39;ll give you the basics of how XAML works. I&#39;ll cover its syntax, control usage, the visual tree, and the scariest animal of all, binding. I&#39;ll give you your moment of clarity, I promise.Programming with MVVM - Part 1WPF overwhelmed us with the most powerful data binding ever released in a development platform. It seemed there was so much to learn in order to use it, but it really isn&#39;t that complicated. However, to use it to its full potential, you really do need to introduce the Model-View-ViewModel pattern. The ideas and goal around this pattern seem to vary from person to person, but the one thing that they all share is that it provides a point of binding for XAML pages. </itunes:summary>
      <itunes:duration>4224</itunes:duration>
      <link>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-2-of-5-Programming-with-MVVM-Part-1</link>
      <pubDate>Wed, 06 Apr 2011 10:33:38 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-2-of-5-Programming-with-MVVM-Part-1</guid>
      <media:thumbnail url="http://media.ch9.ms/ch9/2451/19bd8bd5-6f13-440a-a8b9-9ebd01582451/NYCDRMVVMS2_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/2451/19bd8bd5-6f13-440a-a8b9-9ebd01582451/NYCDRMVVMS2_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/2451/19bd8bd5-6f13-440a-a8b9-9ebd01582451/NYCDRMVVMS2_512_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://media.ch9.ms/ch9/2451/19bd8bd5-6f13-440a-a8b9-9ebd01582451/NYCDRMVVMS2_2MB_ch9.wmv" expression="full" duration="4224" fileSize="166484081" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/2451/19bd8bd5-6f13-440a-a8b9-9ebd01582451/NYCDRMVVMS2_ch9.mp3" expression="full" duration="4224" fileSize="33798667" type="audio/mp3" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/2451/19bd8bd5-6f13-440a-a8b9-9ebd01582451/NYCDRMVVMS2_ch9.wma" expression="full" duration="4224" fileSize="34169471" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/2451/19bd8bd5-6f13-440a-a8b9-9ebd01582451/NYCDRMVVMS2_high_ch9.mp4" expression="full" duration="4224" fileSize="1079610206" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/2451/19bd8bd5-6f13-440a-a8b9-9ebd01582451/NYCDRMVVMS2_low_ch9.mp4" expression="full" duration="4224" fileSize="70732879" type="video/mp4" medium="video"/>
      </media:group>      
      <enclosure url="http://media.ch9.ms/ch9/2451/19bd8bd5-6f13-440a-a8b9-9ebd01582451/NYCDRMVVMS2_2MB_ch9.wmv" length="166484081" type="video/x-ms-wmv"/>
      <dc:creator>Peter Laudati</dc:creator>
      <itunes:author>Peter Laudati</itunes:author>
      <slash:comments>0</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-2-of-5-Programming-with-MVVM-Part-1/rss</wfw:commentRss>
      <category>MVVM</category>
      <category>Silverlight</category>
      <category>Windows Phone 7</category>
      <category>WPF</category>
    </item>
  <item>
      <title>NYC DevReady: MVVM - Session 1 (of 5) - Demystifying XAML</title>
      <description><![CDATA[ <p>MVVM. MVVM. MVVM.&nbsp; I bet you’ve seen that acronym more than three times before? Ever wonder what it means?&nbsp; I’ll tell you: “Model View-View Model”</p><p>Ever wonder what THAT means?! <a href="http://en.wikipedia.org/wiki/Model_View_ViewModel">MVVM is a popular design pattern</a> for coding the presentation layer in both Silverlight &amp; Windows Presentation Foundation (WPF). It seems to be the rage that all the cool kids are doing these days, which means YOU should probably pay attention to it!&nbsp; Get your development skills ready for MVVM (Model View View Model Design Pattern) and build some exciting applications for WPF, Silverlight or Windows Phone.</p><p>On March 21st, 2011&nbsp;in New York City, Microsoft hosted a&nbsp;DevReady MVVM event along with DevExpress. This was a free full day training event.&nbsp; We recorded the event, and now it is here on Channel 9 for your learning pleasure!</p><p>Pop on some headphones and listen &amp; learn at your own pace!&nbsp;</p><p>The sessions were delivered by Microsoft MVP <a href="www.dotnetdude.com">Miguel Castro</a>, Microsoft Developer Evangelist <a href="http://smallandmighty.net/">Dani Diaz</a>, and DevExpress Tech Evangelist <a href="http://community.devexpress.com/blogs/seth/default.aspx">Seth Juarez</a>.</p><p>There are six sessions in total:</p><blockquote><p><strong>Demystifying XAML: Achieving Your Moment Of Clarity</strong></p><p>Still find XAML intimidating? Well, throw in MVVM and certain design practices and it can get worse. But the truth is that it isn't as complicated as it appears to be. In this short session, I'll give you the basics of how XAML works. I'll cover its syntax, control usage, the visual tree, and the scariest animal of all, binding. I'll give you your moment of clarity, I promise.</p><p><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-2-of-5-Programming-with-MVVM-Part-1"><strong>Programming with MVVM - </strong><strong>Part 1</strong></a></p><p>WPF overwhelmed us with the most powerful data binding ever released in a development platform. It seemed there was so much to learn in order to use it, but it really isn't that complicated. However, to use it to its full potential, you really do need to introduce the Model-View-ViewModel pattern. The ideas and goal around this pattern seem to vary from person to person, but the one thing that they all share is that it provides a point of binding for XAML pages. In this session, I'll show you what MVVM is and how to use it and what to put in it, in order to get maximum potential out of XAML binding.</p><p><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-3-of-5-Programming-with-MVVM-Part-2"><strong>Programming with MVVM - </strong><strong>Part 2</strong></a></p><p>Now that you’ve sat through my MVVM session (what? you didn’t?), I want to take it to the next level by continuing your studies into this awesome and necessary pattern. In this session, I’ll cover more advanced topics you use when programming using Model-View-ViewModel. These include Design-Time Data, ViewModel-First, Validation, and the ever-so-popular MVVM Frameworks. There I’ll actually show and give you a small MVVM framework with which to launch your development. Though I will do a brief review on the fundamentals and goals of MVVM and its usage, this session does expect a little bit of knowledge on the pattern from you.</p><p><strong><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-4-of-5-How-Using-MVVM-Saved-My-Butt-and-How-Laziness-Came-Back-To-Bite-Me">How Using MVVM Saved My Butt and How Laziness Came Back To Bite Me</a></strong></p><p>Get a preview of upcoming Visual Studio features that will allow you to share code between Microsoft .NET platforms. You’ll learn how to structure applications to maximize the amount of shared code, how to write an app that’s used across Silverlight Desktop and Windows Phone, and how to build business logic and helper functions that work across all 3 Screens plus the cloud.</p><p><strong><a href="http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-5-of-5-Leveraging-MVVM-Inside-PRISM">Leveraging MVVM Inside PRISM</a></strong></p><p>Understanding an architecture pattern like MVVM is great but many companies invest in third-party control suites to make their application development less painful. In this session, you'll learn how to leverage some great controls from DevExpress in conjunction with MVVM to build applications in both WPF and Silverlight.</p></blockquote> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:1cbf48d50d3b4617a10d9ead014d4751">]]></description>
      <comments>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-1-of-5-Demystifying-XAML</comments>
      <itunes:summary> MVVM. MVVM. MVVM.&amp;nbsp; I bet you’ve seen that acronym more than three times before? Ever wonder what it means?&amp;nbsp; I’ll tell you: “Model View-View Model”Ever wonder what THAT means?! MVVM is a popular design pattern for coding the presentation layer in both Silverlight &amp;amp; Windows Presentation Foundation (WPF). It seems to be the rage that all the cool kids are doing these days, which means YOU should probably pay attention to it!&amp;nbsp; Get your development skills ready for MVVM (Model View View Model Design Pattern) and build some exciting applications for WPF, Silverlight or Windows Phone.On March 21st, 2011&amp;nbsp;in New York City, Microsoft hosted a&amp;nbsp;DevReady MVVM event along with DevExpress. This was a free full day training event.&amp;nbsp; We recorded the event, and now it is here on Channel 9 for your learning pleasure!Pop on some headphones and listen &amp;amp; learn at your own pace!&amp;nbsp;The sessions were delivered by Microsoft MVP Miguel Castro, Microsoft Developer Evangelist Dani Diaz, and DevExpress Tech Evangelist Seth Juarez.There are six sessions in total:Demystifying XAML: Achieving Your Moment Of ClarityStill find XAML intimidating? Well, throw in MVVM and certain design practices and it can get worse. But the truth is that it isn&#39;t as complicated as it appears to be. In this short session, I&#39;ll give you the basics of how XAML works. I&#39;ll cover its syntax, control usage, the visual tree, and the scariest animal of all, binding. I&#39;ll give you your moment of clarity, I promise.Programming with MVVM - Part 1WPF overwhelmed us with the most powerful data binding ever released in a development platform. It seemed there was so much to learn in order to use it, but it really isn&#39;t that complicated. However, to use it to its full potential, you really do need to introduce the Model-View-ViewModel pattern. The ideas and goal around this pattern seem to vary from person to person, but the one thing that they all share is that it provides a point of binding </itunes:summary>
      <itunes:duration>5088</itunes:duration>
      <link>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-1-of-5-Demystifying-XAML</link>
      <pubDate>Wed, 06 Apr 2011 10:32:47 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-1-of-5-Demystifying-XAML</guid>
      <media:thumbnail url="http://media.ch9.ms/ch9/4751/1cbf48d5-0d3b-4617-a10d-9ead014d4751/NYCDRMVVMS1_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/4751/1cbf48d5-0d3b-4617-a10d-9ead014d4751/NYCDRMVVMS1_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/4751/1cbf48d5-0d3b-4617-a10d-9ead014d4751/NYCDRMVVMS1_512_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://media.ch9.ms/ch9/4751/1cbf48d5-0d3b-4617-a10d-9ead014d4751/NYCDRMVVMS1_2MB_ch9.wmv" expression="full" duration="5088" fileSize="191772455" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/4751/1cbf48d5-0d3b-4617-a10d-9ead014d4751/NYCDRMVVMS1_ch9.mp3" expression="full" duration="5088" fileSize="40709596" type="audio/mp3" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/4751/1cbf48d5-0d3b-4617-a10d-9ead014d4751/NYCDRMVVMS1_ch9.wma" expression="full" duration="5088" fileSize="41156773" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/4751/1cbf48d5-0d3b-4617-a10d-9ead014d4751/NYCDRMVVMS1_high_ch9.mp4" expression="full" duration="5088" fileSize="1271126139" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/4751/1cbf48d5-0d3b-4617-a10d-9ead014d4751/NYCDRMVVMS1_low_ch9.mp4" expression="full" duration="5088" fileSize="81079265" type="video/mp4" medium="video"/>
      </media:group>      
      <enclosure url="http://media.ch9.ms/ch9/4751/1cbf48d5-0d3b-4617-a10d-9ead014d4751/NYCDRMVVMS1_2MB_ch9.wmv" length="191772455" type="video/x-ms-wmv"/>
      <dc:creator>Peter Laudati</dc:creator>
      <itunes:author>Peter Laudati</itunes:author>
      <slash:comments>1</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/posts/NYC-DevReady-MVVM-Session-1-of-5-Demystifying-XAML/rss</wfw:commentRss>
      <category>MVVM</category>
      <category>Silverlight</category>
      <category>Windows Phone 7</category>
      <category>WPF</category>
      <category>New York City</category>
    </item>
  <item>
      <title>Bytes by MSDN: Ward Bell and Tim Huckaby on all things Silverlight</title>
      <description><![CDATA[ <p>This week, on Bytes by MSDN, meet the Vice-President of Technology for IdeaBlade Inc., Ward Bell. Ward introduces IdeaBlade’s main product, DevForce, which allows you to reach any user, anywhere, with their tools and infrastructure for building desktop, Silverlight, and Web applications for Silverlight, WPF, WinForms, and ASP.NET. Tim Huckaby and Ward transition the conversation to the longevity of Silverlight, community support for Silverlight and how to write applications in Silverlight.</p><h3>About Ward Bell</h3><p>Ward Bell is Vice President of Technology at IdeaBlade where he is responsible for the product direction of the DevForce .NET application framework, a product targeting smart client development. That product extends the ADO.NET Entity Framework with n-tier, client caching, and Silverlight support. Ward misspent much of the last 30 years programming line-of-business applications for numerous companies including several of the Fortune 100. He dispenses unsolicited advice on his blog, Never In Doubt.</p><p>&nbsp;</p><h3>About Tim Huckaby</h3><p>Tim Huckaby is the Founder of InterKnowlogy, experts in Microsoft .NET and Microsoft Platforms, and has 25&#43; years experience including serving on a Microsoft product team as a development lead on an architecture team. Tim is a Microsoft Regional Director, an MVP and serves on multiple Microsoft councils and boards. Currently, Tim is focused on RIA &amp; Rich Client Technologies like WPF, VSTO, Surface, Silverlight, Windows 7 Touch, and Windows Phone 7. He has been called a &quot;Pioneer of the Smart Client Revolution&quot; by the press. Tim has been awarded multiple times for the highest-rated keynote for Microsoft and numerous other technology conferences around the world and is consistently rated in the top 10% of all speakers at these events. Tim has also done keynote demos for numerous Microsoft executives including Bill Gates and Steve Ballmer.</p><p>&nbsp;</p><h3>Ward Bell and Tim Huckaby recommend you check out</h3><p>&nbsp;</p><ul><li><a href="http://www.silverlight.net/">Silverlight</a> </li><li><a href="http://www.microsoft.com/getsilverlight/Get-Started/Install/Default.aspx">Microsoft Silverlight 4 Download</a></li><li><a href="http://team.silverlight.net/">Silverlight Team Blog</a> </li><li><a href="http://www.silverlight.net/learn/videos/all/">Silverlight How Do I? Videos</a></li><li><a href="http://dotnet.uservoice.com/forums/4325-silverlight-feature-suggestions">Silverlight Wish List Forum</a></li><li><a href="http://www.ideablade.com/">IdeaBlade</a> </li></ul> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:31f3e744db9249a79aba9e9c00f62d05">]]></description>
      <comments>http://channel9.msdn.com/Blogs/Bytes+by+MSDN/Bytes-by-MSDN-Ward-Bell-and-Tim-Huckaby-on-all-things-Silverlight</comments>
      <itunes:summary> This week, on Bytes by MSDN, meet the Vice-President of Technology for IdeaBlade Inc., Ward Bell. Ward introduces IdeaBlade’s main product, DevForce, which allows you to reach any user, anywhere, with their tools and infrastructure for building desktop, Silverlight, and Web applications for Silverlight, WPF, WinForms, and ASP.NET. Tim Huckaby and Ward transition the conversation to the longevity of Silverlight, community support for Silverlight and how to write applications in Silverlight.About Ward BellWard Bell is Vice President of Technology at IdeaBlade where he is responsible for the product direction of the DevForce .NET application framework, a product targeting smart client development. That product extends the ADO.NET Entity Framework with n-tier, client caching, and Silverlight support. Ward misspent much of the last 30 years programming line-of-business applications for numerous companies including several of the Fortune 100. He dispenses unsolicited advice on his blog, Never In Doubt.&amp;nbsp;About Tim HuckabyTim Huckaby is the Founder of InterKnowlogy, experts in Microsoft .NET and Microsoft Platforms, and has 25&amp;#43; years experience including serving on a Microsoft product team as a development lead on an architecture team. Tim is a Microsoft Regional Director, an MVP and serves on multiple Microsoft councils and boards. Currently, Tim is focused on RIA &amp;amp; Rich Client Technologies like WPF, VSTO, Surface, Silverlight, Windows 7 Touch, and Windows Phone 7. He has been called a &amp;quot;Pioneer of the Smart Client Revolution&amp;quot; by the press. Tim has been awarded multiple times for the highest-rated keynote for Microsoft and numerous other technology conferences around the world and is consistently rated in the top 10% of all speakers at these events. Tim has also done keynote demos for numerous Microsoft executives including Bill Gates and Steve Ballmer.&amp;nbsp;Ward Bell and Tim Huckaby recommend you check out&amp;nbsp;Silverlight Microsoft Silverlight 4 Dow</itunes:summary>
      <itunes:duration>381</itunes:duration>
      <link>http://channel9.msdn.com/Blogs/Bytes+by+MSDN/Bytes-by-MSDN-Ward-Bell-and-Tim-Huckaby-on-all-things-Silverlight</link>
      <pubDate>Fri, 04 Mar 2011 22:53:10 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/Bytes+by+MSDN/Bytes-by-MSDN-Ward-Bell-and-Tim-Huckaby-on-all-things-Silverlight</guid>
      <media:thumbnail url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_320_ch9.jpg" height="240" width="320"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_512_ch9.jpg" height="384" width="512"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_85_ch9.jpg" height="64" width="85"/>
      <media:group>
        <media:content url="http://files.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell.ism/manifest" expression="full" duration="381" fileSize="8538" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_2MB_ch9.wmv" expression="full" duration="381" fileSize="147807795" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_ch9.mp3" expression="full" duration="381" fileSize="3049402" type="audio/mp3" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_ch9.wma" expression="full" duration="381" fileSize="3087081" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_ch9.wmv" expression="full" duration="381" fileSize="83639711" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_high_ch9.mp4" expression="full" duration="381" fileSize="169552429" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_low_ch9.mp4" expression="full" duration="381" fileSize="38523677" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_Zune_ch9.wmv" expression="full" duration="381" fileSize="53879766" type="video/x-ms-wmv" medium="video"/>
      </media:group>      
      <enclosure url="http://media.ch9.ms/ch9/2d05/31f3e744-db92-49a7-9aba-9e9c00f62d05/BytesbyMSDNWardBell_ch9.wmv" length="83639711" type="video/x-ms-wmv"/>
      <dc:creator>Bytes by MSDN</dc:creator>
      <itunes:author>Bytes by MSDN</itunes:author>
      <slash:comments>0</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/Bytes+by+MSDN/Bytes-by-MSDN-Ward-Bell-and-Tim-Huckaby-on-all-things-Silverlight/RSS</wfw:commentRss>
      <category>ASP.NET</category>
      <category>Bytes by MSDN</category>
      <category>IdeaBlade</category>
      <category>Silverlight</category>
      <category>Tim Huckaby</category>
      <category>WinForms</category>
      <category>WPF</category>
    </item>
  <item>
      <title>Flashcards.Show Version 2 running on Windows Phone and IE</title>
      <description><![CDATA[ <p>Have you ever needed to memorize a number of objects’ names, such as word definitions in a new language, animals' names, people’s names, or tree leaf shape nomenclature? If you did, you might have employed a useful tool, known as the flashcard. By creating cards with questions, pictures, or terms on one side and answers, names, and descriptions on the other side, you can more easily perform the rote memorization of a category of things. The Flashcards.Show application takes that concept and makes it easy for you to produce decks of flashcards and also enables you to play three different types of games that make it easy and fun to learn.</p><p>This is a short video presentation of the Flashcards.Show application, and a sneak-peak to behind the scenes, looking into the code and architecture of the application.</p><p>You are more than welcome to <a href="http://archive.msdn.microsoft.com/FlashCards/Release/ProjectReleases.aspx?ReleaseId=5448">download</a> the source code, which also includes documentation, as well as <a href="http://flashcardsshowclient.blob.core.windows.net/flashcards/WPFClient/FlashCards.Show.application">install</a> the application.</p><p>Follow Windows Phone announcements on Twitter at <a href="http://twitter.com/wp7dev">WP7DEV</a></p><p>Follow <a href="http://twitter.com/yochayk">Yochay on Twitter</a></p><p>Get <a href="http://create.msdn.com/en-US/">started</a> with <a href="http://create.msdn.com/en-us/home/getting_started">free tools</a>, <a href="http://msdn.microsoft.com/en-us/wp7trainingcourse.aspx">free training</a>, and <a href="http://windowsteamblog.com/windows_phone/b/wpdev/archive/2010/08/17/windows-phone-7-jump-start-training.aspx">free Jump Start video course</a></p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:74f823fbb45847a6b0249e8c0143b72d">]]></description>
      <comments>http://channel9.msdn.com/posts/FlashcardsShow-Version-2-running-on-Windows-Phone-and-IE</comments>
      <itunes:summary> Have you ever needed to memorize a number of objects’ names, such as word definitions in a new language, animals&#39; names, people’s names, or tree leaf shape nomenclature? If you did, you might have employed a useful tool, known as the flashcard. By creating cards with questions, pictures, or terms on one side and answers, names, and descriptions on the other side, you can more easily perform the rote memorization of a category of things. The Flashcards.Show application takes that concept and makes it easy for you to produce decks of flashcards and also enables you to play three different types of games that make it easy and fun to learn.This is a short video presentation of the Flashcards.Show application, and a sneak-peak to behind the scenes, looking into the code and architecture of the application.You are more than welcome to download the source code, which also includes documentation, as well as install the application.Follow Windows Phone announcements on Twitter at WP7DEVFollow Yochay on TwitterGet started with free tools, free training, and free Jump Start video course</itunes:summary>
      <itunes:duration>936</itunes:duration>
      <link>http://channel9.msdn.com/posts/FlashcardsShow-Version-2-running-on-Windows-Phone-and-IE</link>
      <pubDate>Thu, 17 Feb 2011 18:53:09 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/posts/FlashcardsShow-Version-2-running-on-Windows-Phone-and-IE</guid>
      <media:thumbnail url="http://media.ch9.ms/ch9/b72d/74f823fb-b458-47a6-b024-9e8c0143b72d/FlashcardsShow_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/b72d/74f823fb-b458-47a6-b024-9e8c0143b72d/FlashcardsShow_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/b72d/74f823fb-b458-47a6-b024-9e8c0143b72d/FlashcardsShow_512_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://media.ch9.ms/ch9/b72d/74f823fb-b458-47a6-b024-9e8c0143b72d/FlashcardsShow_2MB_ch9.wmv" expression="full" duration="936" fileSize="221043079" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/b72d/74f823fb-b458-47a6-b024-9e8c0143b72d/FlashcardsShow_ch9.mp3" expression="full" duration="936" fileSize="7489365" type="audio/mp3" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/b72d/74f823fb-b458-47a6-b024-9e8c0143b72d/FlashcardsShow_ch9.wma" expression="full" duration="936" fileSize="7578063" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/b72d/74f823fb-b458-47a6-b024-9e8c0143b72d/FlashcardsShow_ch9.wmv" expression="full" duration="936" fileSize="69227043" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/b72d/74f823fb-b458-47a6-b024-9e8c0143b72d/FlashcardsShow_high_ch9.mp4" expression="full" duration="936" fileSize="267944983" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/b72d/74f823fb-b458-47a6-b024-9e8c0143b72d/FlashcardsShow_low_ch9.mp4" expression="full" duration="936" fileSize="29218912" type="video/mp4" medium="video"/>
      </media:group>      
      <enclosure url="http://media.ch9.ms/ch9/b72d/74f823fb-b458-47a6-b024-9e8c0143b72d/FlashcardsShow_ch9.wmv" length="69227043" type="video/x-ms-wmv"/>
      <dc:creator>Yochay Kiriaty</dc:creator>
      <itunes:author>Yochay Kiriaty</itunes:author>
      <slash:comments>0</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/posts/FlashcardsShow-Version-2-running-on-Windows-Phone-and-IE/rss</wfw:commentRss>
      <category>Internet Explorer</category>
      <category>sample</category>
      <category>Silverlight</category>
      <category>Windows 7</category>
      <category>Windows Phone</category>
      <category>WPF</category>
    </item>
  <item>
      <title>MJPEG Decoder</title>
      <description><![CDATA[ <p>Last year the Coding4Fun/Channel 9 guys asked me to work on a few things for <a href="http://live.visitmix.com/" target="_blank">MIX10</a>.&nbsp; One of these items was a way to output a webcam stream to Windows Phone 7 for use with Clint's <a href="http://blogs.msdn.com/b/coding4fun/archive/2010/03/16/9979874.aspx" target="_blank">t-shirt cannon project</a> you may have read about.&nbsp; I figured the easiest way to accomplish this was by using a network/IP camera capable of sending a Motion-JPEG stream, which can be easily decoded and displayed that can display a JPEG image.&nbsp; Thus, this library was born.</p><p>It has gone through quite a few changes and I have expanded it to easily display MJPEG streams on a variety of platforms.&nbsp; The developer just references the assembly appropriate to their platform, adds a few lines of code, and away it goes.</p><h2>Usage</h2><p>For those that are just interested in the usage, it's as simple as this:</p><ol><li>Reference one of the following assemblies appropriate for your project: <ul><li><strong>MjpegProcessorSL.dll</strong> - Silverlight (<strong>Out of Browser Only!</strong>) </li><li><strong>MjpegProcessorWP7.dll</strong> - Windows Phone 7 (XNA or Silverlight, performance maxes out around 320x240 @ 15fps, so set your camera settings accordingly) </li><li><strong>MjpegProcessorXna4.dll</strong> - XNA 4.0 (Windows) </li><li><strong>MjpegProcessor.dll</strong> - WinForms and WPF </li></ul></li><li>Create a new <strong>MjpegDecoder</strong> object. </li><li>Hook up the <strong>FrameReady</strong> event. </li><li>In the event handler, take the <strong>Bitmap</strong>/<strong>BitmapImage</strong> and assign it to your image display control: </li><li>In the case of XNA, use the <strong>GetMjpegFrame</strong> method in the Update method, which will return a Texture2D you can use in your Draw method. </li><li>Call the <strong>ParseStream</strong> method with the Uri of the MJPEG &quot;endpoint&quot;. </li></ol><p>That's it!&nbsp; The source code and binaries above both include projects demonstrating how to use the library on each of these platforms.&nbsp; As long as you set the appropriate reference, you can just copy and paste the code in the sample to get your project running (changing the Uri, of course).</p><pre class="brush: csharp;">public partial class MainWindow : Window
{
    MjpegDecoder _mjpeg;

    public MainWindow()
    {
        InitializeComponent();
        _mjpeg = new MjpegDecoder();
        _mjpeg.FrameReady &#43;= mjpeg_FrameReady;
    }

    private void Start_Click(object sender, RoutedEventArgs e)
    {
        _mjpeg.ParseStream(new Uri(&quot;http://192.168.2.200/img/video.mjpeg&quot;));
    }

    private void mjpeg_FrameReady(object sender, FrameReadyEventArgs e)
    {
        image.Source = e.BitmapImage;
    }
}</pre><p>If that doesn't fit your needs, you can also access the <strong>Bitmap/BitmapImage</strong> properties directly from the <strong>MjpegDecoder</strong> object, or the <strong>CurrentFrame</strong> property, which will contain the raw JPEG data prior to being decoded.</p><h2>A Word About Network/IP Cameras</h2><p>I have tested this against several different cameras.&nbsp; Each device has its own quirks, but all of them seem to work with this library with one exception:&nbsp; several cameras will respond differently when an Internet Explorer user agent header is sent with the HTTP request.&nbsp; Instead of sending down an MJPEG stream, it will send a single JPEG image as Internet Explorer does not properly support MJPEG streams.&nbsp; Unfortunately, this causes the Silverlight processor to not work properly as the header cannot be changed from the Internet Explorer default.&nbsp; When this happens, only a single frame will be sent, and the decoding will fail.&nbsp; The only fix I have found is to use a different camera that doesn't work in this way.</p><h2>What is MJPEG?</h2><p>Pretty simply, it's a video format where each frame of video is sent as a separate, compressed JPEG image.&nbsp; A standard HTTP request is made to a specific URL, and a multipart response is sent.&nbsp; Parsing this multipart stream into separate images as they are sent results in a series of JPEG images.&nbsp; The viewer displays those JPEG images as quickly as they are sent and that creates the video.&nbsp; It's not a well documented format, nor is it perfectly standardized, but it does work.&nbsp; For more information, see the <a href="http://en.wikipedia.org/wiki/Motion_JPEG" target="_blank">MJPEG article on Wikipedia</a>.</p><h2>How Do I Find the MJPEG URL of My Camera?</h2><p>Excellent question.&nbsp; Not an excellent answer.&nbsp; The user manual may mention the URL.&nbsp; A quick internet search with the model number should get you a result.&nbsp; Or, you can also try this company's <a href="http://skjm.com/icam/mjpeg.php" target="_blank">lookup tool</a>.</p><h2>How Does It Work?</h2><p>Glad you asked.&nbsp; If you take a look at the project, you'll notice there isn't much code.&nbsp; One single file is used with a variety of compiler directives to compile certain portions based on the platform assembly being generated.&nbsp; The <strong>MjpegDecoder.cs/.vb </strong>contains the entire implementation.</p><p>First, an asynchronous request is made to the provided MJPEG URL inside the <strong>ParseStream</strong> method.&nbsp; If we are in a Silverlight environment, the <strong>AllowReadStreamBuffering</strong> property must be set to <strong>false</strong> so the response returns immediately instead of being buffered.&nbsp; Additionally, we need to register the <strong>http://</strong> prefix to use the client http stack vs. the browser stack.&nbsp; Finally, the request is made using the <strong>BeginGetResponse</strong> method, specifying the <strong>OnGetResponse</strong> method as the callback.&nbsp; This will be called as soon as data is sent from the camera in response to our request.</p><pre class="brush: csharp;">public void ParseStream(Uri uri)
{
#if SILVERLIGHT
    HttpWebRequest.RegisterPrefix(&quot;http://&quot;, WebRequestCreator.ClientHttp);
#endif
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);

#if SILVERLIGHT
    // start the stream immediately
    request.AllowReadStreamBuffering = false;
#endif
    // asynchronously get a response
    request.BeginGetResponse(OnGetResponse, request);
}</pre><p><strong>OnGetResponse</strong> grabs the response headers and uses the Content-Type header to determine the boundary marker that will be sent between JPEG frames.</p><pre class="brush: csharp;">private void OnGetResponse(IAsyncResult asyncResult)
{
    HttpWebResponse resp;
    byte[] buff;
    byte[] imageBuffer = new byte[1024 * 1024];
    Stream s;

    // get the response
    HttpWebRequest req = (HttpWebRequest)asyncResult.AsyncState;
    resp = (HttpWebResponse)req.EndGetResponse(asyncResult);

    // find our magic boundary value
    string contentType = resp.Headers[&quot;Content-Type&quot;];
    if(!string.IsNullOrEmpty(contentType) &amp;&amp; !contentType.Contains(&quot;=&quot;))
        throw new Exception(&quot;Invalid content-type header.  The camera is likely not returning a proper MJPEG stream.&quot;);
    string boundary = resp.Headers[&quot;Content-Type&quot;].Split('=')[1];
    byte[] boundaryBytes = Encoding.UTF8.GetBytes(boundary.StartsWith(&quot;--&quot;) ? boundary : &quot;--&quot; &#43; boundary);
...</pre><p>&nbsp;</p><p>It then streams the response data, looks for a JPEG header marker, then reads until it finds the boundary marker, copies the data into a buffer, decodes it, passes it on to whoever wants it via an event, and then starts over.</p><pre class="brush: csharp;">...
    s = resp.GetResponseStream();
    BinaryReader br = new BinaryReader(s);

    _streamActive = true;

    buff = br.ReadBytes(ChunkSize);

    while (_streamActive)
    {
        int size;

        // find the JPEG header
        int imageStart = buff.Find(JpegHeader);

        if(imageStart != -1)
        {
            // copy the start of the JPEG image to the imageBuffer
            size = buff.Length - imageStart;
            Array.Copy(buff, imageStart, imageBuffer, 0, size);

            while(true)
            {
                buff = br.ReadBytes(ChunkSize);

                // find the boundary text
                int imageEnd = buff.Find(boundaryBytes);
                if(imageEnd != -1)
                {
                    // copy the remainder of the JPEG to the imageBuffer
                    Array.Copy(buff, 0, imageBuffer, size, imageEnd);
                    size &#43;= imageEnd;

                    // create a single JPEG frame
                    CurrentFrame = new byte[size];
                    Array.Copy(imageBuffer, 0, CurrentFrame, 0, size);
#if !XNA
                    ProcessFrame(CurrentFrame);
#endif
                    // copy the leftover data to the start
                    Array.Copy(buff, imageEnd, buff, 0, buff.Length - imageEnd);

                    // fill the remainder of the buffer with new data and start over
                    byte[] temp = br.ReadBytes(imageEnd);

                    Array.Copy(temp, 0, buff, buff.Length - imageEnd, temp.Length);
                    break;
                }

                // copy all of the data to the imageBuffer
                Array.Copy(buff, 0, imageBuffer, size, buff.Length);
                size &#43;= buff.Length;
            }
        }
    }
    resp.Close();
}</pre><p>The <strong>ProcessFrame </strong>method seen above takes the raw byte buffer, which contains an undecoded JPEG image, and decodes it based on the environment.&nbsp; However this isn't called in the case of XNA which we'll see in a moment:</p><pre class="brush: csharp;">private void ProcessFrame(byte[] frameBuffer)
{
#if SILVERLIGHT
    // need to get this back on the UI thread
    Deployment.Current.Dispatcher.BeginInvoke((Action)(() =&gt;
    {
        // resets the BitmapImage to the new frame
        BitmapImage.SetSource(new MemoryStream(frameBuffer, 0, frameBuffer.Length));

        // tell whoever's listening that we have a frame to draw
        if(FrameReady != null)
            FrameReady(this, new FrameReadyEventArgs { FrameBuffer = CurrentFrame, BitmapImage = BitmapImage });
    }));
#endif

#if !SILVERLIGHT &amp;&amp; !XNA
    // I assume if there's an Application.Current then we're in WPF, not WinForms
    if(Application.Current != null)
    {
        // get it on the UI thread
        Application.Current.Dispatcher.BeginInvoke((Action)(() =&gt;
        {
            // create a new BitmapImage from the JPEG bytes
            BitmapImage = new BitmapImage();
            BitmapImage.BeginInit();
            BitmapImage.StreamSource = new MemoryStream(frameBuffer);
            BitmapImage.EndInit();

            // tell whoever's listening that we have a frame to draw
            if(FrameReady != null)
                FrameReady(this, new FrameReadyEventArgs { FrameBuffer = CurrentFrame, Bitmap = Bitmap, BitmapImage = BitmapImage });
        }));
    }
    else
    {
        // create a simple GDI&#43; happy Bitmap
        Bitmap = new Bitmap(new MemoryStream(frameBuffer));

        // tell whoever's listening that we have a frame to draw
        if(FrameReady != null)
            FrameReady(this, new FrameReadyEventArgs { FrameBuffer = CurrentFrame, Bitmap = Bitmap, BitmapImage = BitmapImage });
    }
#endif
}</pre><div>&nbsp;</div><p>In the case of Silverlight, the <strong>BitmapImage</strong> object has a <strong>SetSource</strong> method which takes a stream to be decoded and turned into the image.&nbsp; In WPF, <strong>BitmapImage</strong> works differently.&nbsp; In this case, <strong>BeginInit</strong> is called, then the <strong>StreamSource</strong> property is set to the stream of bytes, and finally <strong>EndInit</strong> is called.&nbsp; In WinForms, the library will return a <strong>Bitmap</strong> object which can be initialized with the stream right in the constructor.</p><p>In the code above, I look at the <strong>Application.Current</strong> property to determine if the library is being used by a WPF project.&nbsp; If that property is not null, it is assumed the library is being called from a WPF project.</p><p>When compiled as an XNA library, we have no use for a <strong>BitmapImage</strong> or a <strong>Bitmap</strong>â€¦we need a <strong>Texture2D</strong> object.&nbsp; The <strong>GetMjpegFrame</strong> method seen below is what is called by an XNA application during the Update method to pull the current frame:</p><pre class="brush: csharp;">public Texture2D GetMjpegFrame(GraphicsDevice graphicsDevice)
{
    // create a Texture2D from the current byte buffer
    if(CurrentFrame != null)
        return Texture2D.FromStream(graphicsDevice, new MemoryStream(CurrentFrame, 0, CurrentFrame.Length));
    return null;
}</pre><h2>Conclusion</h2><p>And that's about it for the library.&nbsp; Give it a try and please contact me with feedback or if you run into any issues.&nbsp; Enjoy!</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:c0c99db087794de090759e86005409c8">]]></description>
      <comments>http://channel9.msdn.com/coding4fun/articles/MJPEG-Decoder</comments>
      <itunes:summary> Last year the Coding4Fun/Channel 9 guys asked me to work on a few things for MIX10.&amp;nbsp; One of these items was a way to output a webcam stream to Windows Phone 7 for use with Clint&#39;s t-shirt cannon project you may have read about.&amp;nbsp; I figured the easiest way to accomplish this was by using a network/IP camera capable of sending a Motion-JPEG stream, which can be easily decoded and displayed that can display a JPEG image.&amp;nbsp; Thus, this library was born.It has gone through quite a few changes and I have expanded it to easily display MJPEG streams on a variety of platforms.&amp;nbsp; The developer just references the assembly appropriate to their platform, adds a few lines of code, and away it goes.UsageFor those that are just interested in the usage, it&#39;s as simple as this:Reference one of the following assemblies appropriate for your project: MjpegProcessorSL.dll - Silverlight (Out of Browser Only!) MjpegProcessorWP7.dll - Windows Phone 7 (XNA or Silverlight, performance maxes out around 320x240 @ 15fps, so set your camera settings accordingly) MjpegProcessorXna4.dll - XNA 4.0 (Windows) MjpegProcessor.dll - WinForms and WPF Create a new MjpegDecoder object. Hook up the FrameReady event. In the event handler, take the Bitmap/BitmapImage and assign it to your image display control: In the case of XNA, use the GetMjpegFrame method in the Update method, which will return a Texture2D you can use in your Draw method. Call the ParseStream method with the Uri of the MJPEG &amp;quot;endpoint&amp;quot;. That&#39;s it!&amp;nbsp; The source code and binaries above both include projects demonstrating how to use the library on each of these platforms.&amp;nbsp; As long as you set the appropriate reference, you can just copy and paste the code in the sample to get your project running (changing the Uri, of course).public partial class MainWindow : Window
{
    MjpegDecoder _mjpeg;

    public MainWindow()
    {
        InitializeComponent();
        _mjpeg = new MjpegDecoder();
        _mjpeg.Fr</itunes:summary>
      <link>http://channel9.msdn.com/coding4fun/articles/MJPEG-Decoder</link>
      <pubDate>Thu, 10 Feb 2011 05:15:49 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/coding4fun/articles/MJPEG-Decoder</guid>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/2460fbee-0ebb-417a-b39e-bfd61639bde7.jpg" height="75" width="100"/>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/4dc598a2-fd65-4ce9-ad22-ef149e4ab524.jpg" height="165" width="220"/>      
      <dc:creator>Brian Peek</dc:creator>
      <itunes:author>Brian Peek</itunes:author>
      <slash:comments>28</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/coding4fun/articles/MJPEG-Decoder/RSS</wfw:commentRss>
      <category>.NET</category>
      <category>.NET Framework</category>
      <category>Hardware</category>
      <category>Silverlight 4</category>
      <category>Windows Forms</category>
      <category>WPF</category>
      <category>XNA</category>
    </item>
  <item>
      <title>Implementing an MVVM MessageBus with XAML</title>
      <description><![CDATA[ <p>Using a Messag Bus to communicate between ViewModels is a very common activity when building an application based on MVVM.&nbsp; In this video, I show how you can build a Message Bus that can be created on a per-page basis and easily connected to the ViewModels on a page using XAML.</p><p>For&nbsp;a deeper written explanation of this approach, and to download the source code for the project seen in the video, <a href="http://slickthought.net/post.aspx?id=b87413b3-9c35-49f8-a753-ac1468b00122">check out my blog post on Slickthought.net</a>.</p><p>&nbsp;</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:e18fb33cea1c4242918c9e7100d50b9c">]]></description>
      <comments>http://channel9.msdn.com/posts/Implementing-an-MVVM-MessageBus-with-XAML</comments>
      <itunes:summary> Using a Messag Bus to communicate between ViewModels is a very common activity when building an application based on MVVM.&amp;nbsp; In this video, I show how you can build a Message Bus that can be created on a per-page basis and easily connected to the ViewModels on a page using XAML.For&amp;nbsp;a deeper written explanation of this approach, and to download the source code for the project seen in the video, check out my blog post on Slickthought.net.&amp;nbsp;</itunes:summary>
      <itunes:duration>852</itunes:duration>
      <link>http://channel9.msdn.com/posts/Implementing-an-MVVM-MessageBus-with-XAML</link>
      <pubDate>Thu, 20 Jan 2011 14:52:20 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/posts/Implementing-an-MVVM-MessageBus-with-XAML</guid>
      <media:thumbnail url="http://media.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus_512_ch9.jpg" height="384" width="512"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus_custom_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://media.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus_2MB_ch9.wmv" expression="full" duration="852" fileSize="142634673" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus_ch9.mp3" expression="full" duration="852" fileSize="6823311" type="audio/mp3" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus_ch9.wma" expression="full" duration="852" fileSize="6902163" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus_ch9.wmv" expression="full" duration="852" fileSize="38122545" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus_high_ch9.mp4" expression="full" duration="852" fileSize="225061123" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus_low_ch9.mp4" expression="full" duration="852" fileSize="21137600" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus_Zune_ch9.wmv" expression="full" duration="852" fileSize="34906600" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://smooth.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus.ism/manifest" expression="full" duration="852" fileSize="8462" type="video/x-ms-wmv" medium="video"/>
      </media:group>      
      <enclosure url="http://media.ch9.ms/ch9/0B9C/E18FB33C-EA1C-4242-918C-9E7100D50B9C/XamlMessageBus_ch9.wmv" length="38122545" type="video/x-ms-wmv"/>
      <dc:creator>Jeff Brand</dc:creator>
      <itunes:author>Jeff Brand</itunes:author>
      <slash:comments>3</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/posts/Implementing-an-MVVM-MessageBus-with-XAML/rss</wfw:commentRss>
      <category>MVVM</category>
      <category>Silverlight</category>
      <category>WPF</category>
    </item>
  <item>
      <title>Autotune.NET</title>
      <description><![CDATA[<p>We've all cringed as a hopelessly out of tune contestant appears on the latest episode of “American Idol.” Occasionally, there's a contestant who manages to be pitch perfect all the way through—right until they flub the final note. And in the cutthroat world
 of televised auditions, sing one slightly flat note and you're out. </p>
<p>So what takes care of a bad-pitch day? Autotune—an effect that corrects the pitch of your voice so you'll never again sing out of tune. And now, with the power of modern microprocessors, autotune is possible in real-time, allowing singers to benefit from
 its almost magical powers during live concerts.</p>
<p>The company most famous for its autotune effect is Antares. <a href="http://www.antarestech.com/products/auto-tune-evo.shtml">
Antares Auto-Tune</a> currently retails for $249, and a stripped down version is available for $100. In addition to simply improving the pitch of a dodgy singer, autotune can be used to create unique robotic sounding vocal effects, a technique massively popular
 in recent years thanks to its use by artists such as T-Pain and the group behind the “<a href="http://www.youtube.com/show/autotunethenews">Auto-Tune the News</a>” YouTube videos. In 1998, when the effect was first used on
<a href="http://en.wikipedia.org/wiki/Believe_%28Cher_song%29">Cher's “Believe” single</a>, the producer used such extreme settings that instead of subtly adjusting the pitch, autotune “snapped” instantaneously to the nearest “correct” note.
</p>
<p>Here is a nerdy example of what Autotune can do.</p>
<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:d3d009f2-6f0d-4a64-96f9-8bbf864e4e06" class="wlWriterEditableSmartContent">
<div></div>
</div>
<h2>How does Autotune work?</h2>
<p>An autotune effect has two parts. The first is <b>pitch detection</b>, which calculates the dominant frequency of the incoming signal, and is the reason autotune is normally used on monophonic audio sources (i.e. playing one note at a time, not whole chords).
 So, if your guitar is out of tune, you're out of luck (<a href="http://www.celemony.com/cms/">Celemony's Melodyne</a> product, however, features some incredible capabilities for pitch-shifting polyphonic audio).</p>
<p>The second stage is <b>pitch shifting</b>, or “correcting” a given note. However, the bigger the pitch shift required, the more artificial the end result will be, and it is worth noting that absolutely perfect pitch is not always desirable. Sometimes the
 blended notes resulting from vibrato, for example, are an important part of the performance, and eliminating them would be detrimental.</p>
<h2>Creating a .NET Autotune Algorithm</h2>
<p>For this project, we will be creating an autotune effect for .NET. Serious recording enthusiasts should just go out and buy a decent autotune effect, but to have a little fun, we'll see if we can make an autotune that can give us a poor man's Cher effect
 (or T-Pain effect, if you prefer).</p>
<p>To get started, I searched to see if there were some pre-existing open source autotune implementations, which brought me to
<a href="http://decabear.com/awesomebox.html">awesomebox</a>, a project created by Ravi Parikh and Keegan Poppen while they were students at Stanford University. They kindly gave me permission to make use of their code, which uses an auto-correlator for pitch
 detection and an open source pitch-shifting algorithm from audio DSP expert <a href="http://www.dspdimension.com">
Stephan M. Bernsee</a>.</p>
<h3>Porting C&#43;&#43; to C#</h3>
<p>Although porting from C/C&#43;&#43; to C# is not exactly fun, there is enough similarity in the syntax that it is possible to complete without too many changes. You need to remember, however, that a
<b>long</b> in C is an <b>int</b> in C# (i.e. 32 bits long not 64). </p>
<p>Additionally, the C# compiler is fussier than C/C&#43;&#43; when it comes to casting between floats, doubles, and ints. Putting the “f” suffix on numeric literals sorts out most of these compiler errors.
</p>
<p>Pointers can be a pain. I tend to replace them with integer variables used to index into an array. You can of course use unsafe code, but that limits your options if you plan to port to Silverlight or Windows Phone 7 at a later date, neither of which allow
 unsafe code or interop into unmanaged code. The necessary mathematical functions are available in the System.Math class.</p>
<p>To see an example, compare this pitch shifting <a href="http://downloads.dspdimension.com/smbPitchShift.cpp">
C&#43;&#43; source file</a> with my <a href="http://voicerecorder.codeplex.com/SourceControl/changeset/view/f067d3f5a443#VoiceRecorder.Audio%2fSmbPitchShift.cs">
C# conversion</a> of it.</p>
<h2>Capturing Audio with NAudio</h2>
<p>Interop wrappers for the NAudio Windows WaveIn APIs capture the audio. Here is the code used to start recording:</p>
<p><strong>c#:</strong></p>
<pre class="csharpcode">waveIn = <span class="kwrd">new</span> WaveIn();
waveIn.DeviceNumber = recordingDevice;
waveIn.DataAvailable &#43;= waveIn_DataAvailable;
waveIn.RecordingStopped &#43;= <span class="kwrd">new</span> EventHandler(waveIn_RecordingStopped);
waveIn.WaveFormat = recordingFormat;
waveIn.StartRecording();</pre>
<p><strong>VB.Net:</strong></p>
<pre class="csharpcode">waveIn = <span class="kwrd">New</span> WaveIn
waveIn.DeviceNumber = recordingDevice
<span class="kwrd">AddHandler</span> waveIn.DataAvailable, <span class="kwrd">AddressOf</span> waveIn_DataAvailable
<span class="kwrd">AddHandler</span> waveIn.RecordingStopped, <span class="kwrd">AddressOf</span> waveIn_RecordingStopped
waveIn.WaveFormat = _recordingFormat
waveIn.StartRecording()</pre>
<p>The steps are:</p>
<ol>
<li>Create a new <b>WaveIn</b> device </li><li>[Optional] set up the device number (0 for default recording device) </li><li>Add a handler to the <b>DataAvailable</b> event—this is where we will receive the raw audio data
</li><li>Add a handler for the <b>RecordingStopped</b> event. This allows us to close the temporary WAV file we created
</li><li>Set up the recording format. For this project we are going to record in mono (i.e. one channel), 16 bit, 44.1kHz audio—the default setting for most microphones
</li><li>Call the <b>StartRecording</b> method </li></ol>
<p>Whenever the soundcard reports a new buffer of recorded audio, we receive it in the
<b>DataAvailable</b> event handler:</p>
<p><strong>c#:</strong></p>
<pre class="csharpcode"><span class="kwrd">void</span> waveIn_DataAvailable(<span class="kwrd">object</span> sender, WaveInEventArgs e)
{
    <span class="kwrd">byte</span>[] buffer = e.Buffer;
    <span class="kwrd">int</span> bytesRecorded = e.BytesRecorded;
    WriteToFile(buffer, bytesRecorded);

    <span class="kwrd">for</span> (<span class="kwrd">int</span> index = 0; index &lt; e.BytesRecorded; index &#43;= 2)
    {
        <span class="kwrd">short</span> sample = (<span class="kwrd">short</span>)((buffer[index &#43; 1] &lt;&lt; 8) |
                                buffer[index &#43; 0]);
        <span class="kwrd">float</span> sample32 = sample / 32768f;
        sampleAggregator.Add(sample32);
    }
}</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Private</span> <span class="kwrd">Sub</span> waveIn_DataAvailable(<span class="kwrd">ByVal</span> sender <span class="kwrd">As</span> <span class="kwrd">Object</span>, <span class="kwrd">ByVal</span> e <span class="kwrd">As</span> WaveInEventArgs)
    <span class="kwrd">Dim</span> buffer() = e.Buffer
    <span class="kwrd">Dim</span> bytesRecorded = e.BytesRecorded
    WriteToFile(buffer, bytesRecorded)

    <span class="kwrd">For</span> index = 0 <span class="kwrd">To</span> e.BytesRecorded - 1 <span class="kwrd">Step</span> 2
        <span class="kwrd">Dim</span> sample = <span class="kwrd">CShort</span>(buffer(index &#43; 1)) &lt;&lt; 8 <span class="kwrd">Or</span> <span class="kwrd">CShort</span>(buffer(index &#43; 0))
        <span class="kwrd">Dim</span> sample32 = sample / 32768.0F
        _sampleAggregator.Add(sample32)
    <span class="kwrd">Next</span> index
<span class="kwrd">End</span> Sub</pre>
<p>The <b>WaveInEventArgs</b> contains the number of bytes recorded (<b>e.BytesRecorded</b>) and a pointer to the buffer containing those bytes (<b>e.Buffer</b>). The handler does two things with the recorded data. First, it calls WriteToFile, which uses the
<b>WaveFileWriter </b>class from NAudio to write the data to disk:</p>
<p><strong>c#:</strong></p>
<pre class="csharpcode"><span class="rem">// before we start recording, set up a WaveFileWriter...</span>
writer = <span class="kwrd">new</span> WaveFileWriter(waveFileName, recordingFormat);

<span class="rem">// ... every block we receive we write it to the WaveFileWriter:</span>
writer.WriteData(buffer, 0, bytesRecorded);

<span class="rem">// ... and when recording stops we must call Dispose to finalize the</span>
<span class="rem">// .WAV file properly</span>
writer.Dispose()</pre>
<p><strong>VB.Net:</strong></p>
<pre class="csharpcode">writer = <span class="kwrd">New</span> WaveFileWriter(waveFileName, _recordingFormat)
writer.WriteData(buffer, 0, bytesRecorded)
writer.Dispose()</pre>
<h3>Converting Audio to Floating Point and Back Again</h3>
<p>Once recording has completed, we have a WAV file on which to perform our autotune effect. However, our WAV file consists of 16 bit samples (i.e.
<b>System.Int16</b> aka <b>short</b>). In other words, we have a sequence of byte pairs, each of which represent a number in the range -32768 to 32767. For the digital signal processing we will be performing, it's best to have a sequence of floating point numbers
 (<b>System.Single</b> or <b>float</b>) in the range -1.0f to 1.0f. This is a common requirement, so NAudio provides a utility class to convert audio from short to float called
<b>Wave16ToFloatProvider</b>. Here's the code that takes a WAV file and implements the autotune algorithm on it:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> ApplyAutoTune(<span class="kwrd">string</span> fileToProcess, <span class="kwrd">string</span> tempFile, AutoTuneSettings autotuneSettings)
{
    <span class="kwrd">using</span> (WaveFileReader reader = <span class="kwrd">new</span> WaveFileReader(fileToProcess))
    {
        IWaveProvider stream32 = <span class="kwrd">new</span> Wave16toFloatProvider(reader);
        IWaveProvider streamEffect = <span class="kwrd">new</span> AutoTuneWaveProvider(stream32, autotuneSettings);
        IWaveProvider stream16 = <span class="kwrd">new</span> WaveFloatTo16Provider(streamEffect);
        <span class="kwrd">using</span> (WaveFileWriter converted = <span class="kwrd">new</span> WaveFileWriter(tempFile, stream16.WaveFormat))
        {
            <span class="rem">// buffer length needs to be a power of 2 for FFT to work nicely</span>
            <span class="rem">// however, make the buffer too long and pitches aren't detected fast enough</span>
            <span class="rem">// successful buffer sizes: 8192, 4096, 2048, 1024</span>
            <span class="rem">// (some pitch detection algorithms need at least 2048)</span>
            <span class="kwrd">byte</span>[] buffer = <span class="kwrd">new</span> <span class="kwrd">byte</span>[8192]; 
            <span class="kwrd">int</span> bytesRead;
            <span class="kwrd">do</span>
            {
                bytesRead = stream16.Read(buffer, 0, buffer.Length);
                converted.WriteData(buffer, 0, bytesRead);
            } <span class="kwrd">while</span> (bytesRead != 0 &amp;&amp; converted.Length &lt; reader.Length);
        }
    }
}</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Public</span> <span class="kwrd">Shared</span> <span class="kwrd">Sub</span> ApplyAutoTune(<span class="kwrd">ByVal</span> fileToProcess <span class="kwrd">As</span> <span class="kwrd">String</span>,
    <span class="kwrd">ByVal</span> tempFile <span class="kwrd">As</span> <span class="kwrd">String</span>,
    <span class="kwrd">ByVal</span> autotuneSettings <span class="kwrd">As</span> AutoTuneSettings)
    Using reader <span class="kwrd">As</span> <span class="kwrd">New</span> WaveFileReader(fileToProcess)
        <span class="kwrd">Dim</span> stream32 <span class="kwrd">As</span> IWaveProvider = <span class="kwrd">New</span> Wave16ToFloatProvider(reader)
        <span class="kwrd">Dim</span> streamEffect <span class="kwrd">As</span> IWaveProvider = <span class="kwrd">New</span> AutoTuneWaveProvider(stream32, autotuneSettings)
        <span class="kwrd">Dim</span> stream16 <span class="kwrd">As</span> IWaveProvider = <span class="kwrd">New</span> WaveFloatTo16Provider(streamEffect)
        Using converted <span class="kwrd">As</span> <span class="kwrd">New</span> WaveFileWriter(tempFile, stream16.WaveFormat)
            <span class="rem">' buffer length needs to be a power of 2 for FFT to work nicely</span>
            <span class="rem">' however, make the buffer too long and pitches aren't detected fast enough</span>
            <span class="rem">' successful buffer sizes: 8192, 4096, 2048, 1024</span>
            <span class="rem">' (some pitch detection algorithms need at least 2048)</span>
            <span class="kwrd">Dim</span> buffer(8191) <span class="kwrd">As</span> <span class="kwrd">Byte</span>
            <span class="kwrd">Dim</span> bytesRead <span class="kwrd">As</span> <span class="kwrd">Integer</span>
            <span class="kwrd">Do</span>
                bytesRead = stream16.Read(buffer, 0, buffer.Length)
                converted.WriteData(buffer, 0, bytesRead)
            <span class="kwrd">Loop</span> <span class="kwrd">While</span> bytesRead &lt;&gt; 0 <span class="kwrd">AndAlso</span> converted.Length &lt; reader.Length
        <span class="kwrd">End</span> Using
    <span class="kwrd">End</span> Using
<span class="kwrd">End</span> Sub</pre>
<p>Here's how it works:</p>
<ol>
<li>First we use a <b>WaveFileReader</b> to open the file that we've just created, which contains 16 bit audio samples
</li><li>Then we use the <b>Wave16ToFloatProvider</b> to perform the conversion to floating point samples
</li><li>Next we pass it through our autotune effect (the <b>AutotuneWaveProvider</b>). We'll explain how this works this later
</li><li>Then we use the <b>WaveFloatTo16Provider</b> to convert back to 16 bit samples ready for saving to WAV (we could save a 32 bit WAV, but it would be rather wasteful of disk space)
</li><li>Having set up the audio pipeline, we can read from the WaveFloatTo16Provider and pull audio right through from the WAV file. We need to read in block sizes that are a power of 2, since we are passing the data through FFTs. If we want to read arbitrary block
 sizes, we need to introduce another element into our pipeline to buffer up enough data to pass through FFTs
</li><li>Finally, we use the <b>WaveFileWriter </b>to write the data we have read into a WAV file
</li></ol>
<h2>The AutoTuneWaveProvider</h2>
<p>As we saw in the last code snippet, the <b>AutoTuneWaveProvider</b> is the piece in our audio pipeline that actually performs the autotune effect. It implements the NAudio
<b>IWaveProvider</b> interface, which allows it to be used in the pipeline for real-time playback if necessary, even though our example code is not doing this (see the section on performance later). Here's the AutoTuneWaveProvider constructor:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">public</span> AutoTuneWaveProvider(IWaveProvider source, AutoTuneSettings autoTuneSettings)
{
    <span class="kwrd">this</span>.autoTuneSettings = autoTuneSettings;
    <span class="kwrd">if</span> (source.WaveFormat.SampleRate != 44100)
        <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentException(<span class="str">&quot;AutoTune only works at 44.1kHz&quot;</span>);
    <span class="kwrd">if</span> (source.WaveFormat.Encoding != WaveFormatEncoding.IeeeFloat)
        <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentException(<span class="str">&quot;AutoTune only works on IEEE floating point audio data&quot;</span>);
    <span class="kwrd">if</span> (source.WaveFormat.Channels != 1)
        <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentException(<span class="str">&quot;AutoTune only works on mono input sources&quot;</span>);

    <span class="kwrd">this</span>.source = source;
    <span class="kwrd">this</span>.pitchDetector = <span class="kwrd">new</span> AutoCorrelator(source.WaveFormat.SampleRate);
    <span class="kwrd">this</span>.pitchShifter = <span class="kwrd">new</span> SmbPitchShifter(Settings);
    <span class="kwrd">this</span>.waveBuffer = <span class="kwrd">new</span> WaveBuffer(8192);
}</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode">Public Sub New(ByVal source As IWaveProvider, ByVal autoTuneSettings As AutoTuneSettings)
    Me.autoTuneSettings = autoTuneSettings
    If source.WaveFormat.SampleRate &lt;&gt; 44100 Then
        Throw New ArgumentException(<span class="str">&quot;AutoTune only works at 44.1kHz&quot;</span>)
    End If
    If source.WaveFormat.Encoding &lt;&gt; WaveFormatEncoding.IeeeFloat Then
        Throw New ArgumentException(<span class="str">&quot;AutoTune only works on IEEE floating point audio data&quot;</span>)
    End If
    If source.WaveFormat.Channels &lt;&gt; 1 Then
        Throw New ArgumentException(<span class="str">&quot;AutoTune only works on mono input sources&quot;</span>)
    End If

    Me.source = source
    Me.pitchDetector = New AutoCorrelator(source.WaveFormat.SampleRate)
    <span class="str">' alternative pitch detector:
    '</span> Me.pitchDetector = New FftPitchDetector(source.WaveFormat.SampleRate)
    Me.pitchShifter = New SmbPitchShifter(Settings, source.WaveFormat.SampleRate)
    Me.waveBuffer = New WaveBuffer(8192)
End Sub</pre>
<p>Some points to notice:</p>
<ol>
<li>We pass in a source <b>IWaveProvider</b>—this is where the data will be coming from
</li><li>We check that the source is in the right format—floating point mono input. </li><li>We also pass in an <b>AutoTuneSettings</b> object. This not only encapsulates the settings for autotune, it is important if you want to adjust the settings in real-time while the effect is running
</li><li>We then create the two key components of our autotune effect: a pitch detector (which uses an autocorrelator), and a pitch shifter
</li><li>Finally we create a buffer to use for audio processing. This can be a byte[] array, but we use
<b>WaveBuffer </b>from NAudio because it uses <a href="http://mark-dot-net.blogspot.com/2008/06/wavebuffer-casting-byte-arrays-to-float.html">
a clever trick</a> that allows us to cast a byte[] into a float[] without using unsafe code or having to copy all of the data
</li></ol>
<p>The key method on any implementation of <b>IWaveProvider</b> is its <b>Read</b> method. This is where the audio consumer, usually the sound card or a WaveFileWriter, asks for data. The data must be supplied as a byte array, and if at all possible you should
 return exactly the number of bytes you were asked for (if you can't, an extra layer of buffering is usually required, or audio playback will be choppy). Here's our implementation of the Read method:</p>
<p><strong>c#:</strong></p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">int</span> Read(<span class="kwrd">byte</span>[] buffer, <span class="kwrd">int</span> offset, <span class="kwrd">int</span> count)
{
    <span class="kwrd">if</span> (waveBuffer == <span class="kwrd">null</span> || waveBuffer.MaxSize &lt; count)
    {
        waveBuffer = <span class="kwrd">new</span> WaveBuffer(count);
    }

    <span class="kwrd">int</span> bytesRead = source.Read(waveBuffer, 0, count);

    <span class="rem">// the last bit sometimes needs to be rounded up:</span>
    <span class="kwrd">if</span> (bytesRead &gt; 0) bytesRead = count;

    <span class="kwrd">int</span> frames = bytesRead / <span class="kwrd">sizeof</span>(<span class="kwrd">float</span>); 
    <span class="kwrd">float</span> pitch = pitchDetector.DetectPitch(waveBuffer.FloatBuffer, frames);
        
    <span class="rem">// an attempt to make it less &quot;warbly&quot; by holding onto the pitch </span>
    <span class="rem">// for at least one more buffer</span>
    <span class="kwrd">if</span> (pitch == 0f &amp;&amp; release &lt; maxHold)
    {
        pitch = previousPitch;
        release&#43;&#43;;
    }
    <span class="kwrd">else</span>
    {
        <span class="kwrd">this</span>.previousPitch = pitch;
        release = 0;
    }
    
    WaveBuffer outBuffer = <span class="kwrd">new</span> WaveBuffer(buffer);

    pitchShifter.ShiftPitch(waveBuffer.FloatBuffer, pitch, 0.0f, outBuffer.FloatBuffer, frames);

    <span class="kwrd">return</span> frames * 4;
}</pre>
<p><strong>VB.Net:</strong></p>
<pre class="csharpcode">Public Function Read(ByVal buffer() As Byte, ByVal offset As Integer,
                        ByVal count As Integer) As Integer Implements NAudio.Wave.IWaveProvider.Read
    If waveBuffer Is Nothing OrElse waveBuffer.MaxSize &lt; count Then
        waveBuffer = New WaveBuffer(count)
    End If

    Dim bytesRead = source.Read(waveBuffer, 0, count)
    <span class="str">'Debug.Assert(bytesRead = count)

    '</span> the last bit sometimes needs to be rounded up:
    If bytesRead &gt; 0 Then
        bytesRead = count
    End If

    <span class="str">'pitchsource-&gt;getPitches()
    Dim frames = bytesRead \ Len(New Single) '</span> MRH: was count
    Dim pitch = pitchDetector.DetectPitch(waveBuffer.FloatBuffer, frames)

    ' MRH: an attempt to make it less <span class="str">&quot;warbly&quot;</span> by holding onto the pitch <span class="kwrd">for</span> at least one more buffer
    If pitch = 0.0F AndAlso release &lt; maxHold Then
        pitch = previousPitch
        release &#43;= 1
    Else
        Me.previousPitch = pitch
        release = 0
    End If

    Dim midiNoteNumber = 40
    Dim targetPitch = CSng(8.175 * Math.Pow(1.05946309, midiNoteNumber))

    Dim outBuffer As New WaveBuffer(buffer)

    pitchShifter.ShiftPitch(waveBuffer.FloatBuffer, pitch, targetPitch, outBuffer.FloatBuffer, frames)

    Return frames * 4
End Function</pre>
<p>Here's what's going on</p>
<ol>
<li>First we need to read from our source (in our case, a WAV file converted to floating point samples)
</li><li>If we get less data than we were expecting, we know that means we're at the end of the file, so we'll just pretend we got a full buffer
</li><li>We then work out how many audio ‘frames' are present (which is the same as the number of samples since this is mono audio). It's floating point audio, so frames equal bytes divided by four
</li><li>We then pass the data through our pitch detector algorithm (see below) </li><li>Next we use some experimental code to stabilize pitch detection by reporting the previous frequency when no pitch is picked up
</li><li>Finally we pass the data into our pitch shifter, including details of the detected pitch
</li></ol>
<p>Now that we've seen the big picture of the <b>AutotuneWaveProvider</b>, let's drill down into its two main components—the pitch detector and pitch shifter.</p>
<h2>Pitch Detection with Autocorrelation</h2>
<p>The pitch detection part of autotune is vital to getting good results. If it can't accurately detect the input pitch, it will incorrectly calculate how much the pitch needs to be adjusted. However, high quality pitch detection is quite difficult to get right.
 First of all, the microphone may well pick up background noise. Second, when you sing a into a microphone, the signal consists not only of a single frequency, but also “harmonics” at different frequencies.</p>
<p>The good news is that we need to detect only the primary pitch. </p>
<p>The awesomebox algorithm makes use of “<a href="http://en.wikipedia.org/wiki/Autocorrelation">autocorrelation</a>” for its pitch detection, but I made a few small tweaks to how the algorithm is implemented in an attempt to improve its accuracy. Autocorrelation
 has the advantage of being a relatively quick process. The basic principle is that if a signal is periodic, it will “correlate” well with itself when shifted forward (or backwards) one cycle.
</p>
<p>Let's say we are looking to see if the note “Middle C” is being sung. The frequency of Middle C is around 262Hz. If we are sampling at 44.1kHz (which is standard for CD quality audio), then we will expect the signal to repeat at approximately every 168 samples
 (44100/262). Accordingly, for every sample in the buffer, we calculate the sum of squares of that sample and the sample 168 samples previous. We do this for every possible offset that measures a frequency in the range we want to detect (I am using 85Hz to
 300Hz, which is adequate for pitch detecting vocals). The offset with the highest score is the most likely frequency.</p>
<p>Let's have a look at the code for an autocorrelation algorithm, starting with the constructor for the
<b>AutoCorrelator</b> class:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">public</span> AutoCorrelator(<span class="kwrd">int</span> sampleRate)
{
    <span class="kwrd">this</span>.sampleRate = (<span class="kwrd">float</span>)sampleRate;
    <span class="kwrd">int</span> minFreq = 85;
    <span class="kwrd">int</span> maxFreq = 255;

    <span class="kwrd">this</span>.maxOffset = sampleRate / minFreq;
    <span class="kwrd">this</span>.minOffset = sampleRate / maxFreq;
}</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Public</span> <span class="kwrd">Sub</span> <span class="kwrd">New</span>(<span class="kwrd">ByVal</span> sampleRate <span class="kwrd">As</span> <span class="kwrd">Integer</span>)
    <span class="kwrd">Me</span>.sampleRate = <span class="kwrd">CSng</span>(sampleRate)
    <span class="kwrd">Dim</span> minFreq = 85
    <span class="kwrd">Dim</span> maxFreq = 255

    <span class="kwrd">Me</span>.maxOffset = sampleRate \ minFreq
    <span class="kwrd">Me</span>.minOffset = sampleRate \ maxFreq
<span class="kwrd">End</span> Sub</pre>
<p>First of all, we pre-calculate some values based on the minimum and maximum frequencies we are looking for. Remember that lower frequencies are harder to detect than higher frequencies, so don't set minFreq too low. MaxOffset and MinOffset are the maximum
 and minimum backwards distances we will be seeking while looking for a match.</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">float</span> DetectPitch(<span class="kwrd">float</span>[] buffer, <span class="kwrd">int</span> frames)
{
    <span class="kwrd">if</span> (prevBuffer == <span class="kwrd">null</span>)
    {
        prevBuffer = <span class="kwrd">new</span> <span class="kwrd">float</span>[frames];
    }

    <span class="kwrd">float</span> maxCorr = 0;
    <span class="kwrd">int</span> maxLag = 0;

    <span class="rem">// starting with low frequencies, working to higher</span>
    <span class="kwrd">for</span> (<span class="kwrd">int</span> lag = maxOffset; lag &gt;= minOffset; lag--)
    {
        <span class="kwrd">float</span> corr = 0; <span class="rem">//  sum of squares</span>
        <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; frames; i&#43;&#43;)
        {
            <span class="kwrd">int</span> oldIndex = i - lag;
            <span class="kwrd">float</span> sample = ((oldIndex &lt; 0) ? prevBuffer[frames &#43; 
            corr &#43;= (sample * buffer[i]);
        }
        <span class="kwrd">if</span> (corr &gt; maxCorr)
        {
            maxCorr = corr;
            maxLag = lag;
        }

    }
    <span class="kwrd">for</span> (<span class="kwrd">int</span> n = 0; n &lt; frames; n&#43;&#43;)
    { 
        prevBuffer[n] = buffer[n]; 
    }
    <span class="kwrd">float</span> noiseThreshold = frames / 1000f;

    <span class="kwrd">if</span> (maxCorr &lt; noiseThreshold || maxLag == 0) <span class="kwrd">return</span> 0.0f;
    <span class="kwrd">return</span> <span class="kwrd">this</span>.sampleRate / maxLag;
}</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Public</span> <span class="kwrd">Function</span> DetectPitch(<span class="kwrd">ByVal</span> buffer() <span class="kwrd">As</span> <span class="kwrd">Single</span>, <span class="kwrd">ByVal</span> frames <span class="kwrd">As</span> <span class="kwrd">Integer</span>) <span class="kwrd">As</span> <span class="kwrd">Single</span> <span class="kwrd">Implements</span> IPitchDetector.DetectPitch
    <span class="kwrd">If</span> prevBuffer <span class="kwrd">Is</span> <span class="kwrd">Nothing</span> <span class="kwrd">Then</span>
        prevBuffer = <span class="kwrd">New</span> <span class="kwrd">Single</span>(frames - 1){}
    <span class="kwrd">End</span> <span class="kwrd">If</span>
    <span class="kwrd">Dim</span> secCor <span class="kwrd">As</span> <span class="kwrd">Single</span> = 0
    <span class="kwrd">Dim</span> secLag = 0

    <span class="kwrd">Dim</span> maxCorr <span class="kwrd">As</span> <span class="kwrd">Single</span> = 0
    <span class="kwrd">Dim</span> maxLag = 0

    <span class="rem">' starting with low frequencies, working to higher</span>
    <span class="kwrd">For</span> lag = maxOffset <span class="kwrd">To</span> minOffset <span class="kwrd">Step</span> -1
        <span class="kwrd">Dim</span> corr <span class="kwrd">As</span> <span class="kwrd">Single</span> = 0 <span class="rem">' this is calculated as the sum of squares</span>
        <span class="kwrd">For</span> i = 0 <span class="kwrd">To</span> frames - 1
            <span class="kwrd">Dim</span> oldIndex = i - lag
            <span class="kwrd">Dim</span> sample = (<span class="kwrd">If</span>(oldIndex &lt; 0, prevBuffer(frames &#43; oldIndex), buffer(oldIndex)))
            corr &#43;= (sample * buffer(i))
        <span class="kwrd">Next</span> i
        <span class="kwrd">If</span> corr &gt; maxCorr <span class="kwrd">Then</span>
            maxCorr = corr
            maxLag = lag
        <span class="kwrd">End</span> <span class="kwrd">If</span>
        <span class="kwrd">If</span> corr &gt;= 0.9 * maxCorr <span class="kwrd">Then</span>
            secCor = corr
            secLag = lag
        <span class="kwrd">End</span> <span class="kwrd">If</span>
    <span class="kwrd">Next</span> lag
    <span class="kwrd">For</span> n = 0 <span class="kwrd">To</span> frames - 1
        prevBuffer(n) = buffer(n)
    <span class="kwrd">Next</span> n
    <span class="kwrd">Dim</span> noiseThreshold = frames / 1000.0F
    <span class="rem">'Debug.WriteLine(String.Format(&quot;Max Corr: {0} ({1}), Sec Corr: {2} ({3})&quot;, Me.sampleRate / maxLag, maxCorr, Me.sampleRate / secLag, secCor))</span>
    <span class="kwrd">If</span> maxCorr &lt; noiseThreshold <span class="kwrd">OrElse</span> maxLag = 0 <span class="kwrd">Then</span>
        <span class="kwrd">Return</span> 0.0F
    <span class="kwrd">End</span> <span class="kwrd">If</span>
    <span class="rem">'Return 44100.0f / secLag '--works better for singing</span>
    <span class="kwrd">Return</span> <span class="kwrd">Me</span>.sampleRate / maxLag
<span class="kwrd">End</span> Function</pre>
<p>A few things to notice:</p>
<ol>
<li>Notice that the audio comes in as an array of floating point numbers. NAudio performs this conversion from 16 bit audio for us by using
<b>Wave16ToFloatProvider</b> </li><li>We store the previous buffer. This allows us to look backwards for correlation
</li><li>We then work through each and every possible integer offset within our range, and calculate a correlation value
</li><li>The correlation is calculated as the sum of squares </li><li>If it is the largest so far, we store the “lag” value (i.e. number of samples back that we correlated with)
</li><li>Notice that we return 0 (i.e. no frequency detected) if we don't find a strong frequency. This noise threshold may need to be tweaked depending on your input
</li><li>Finally, we convert into a frequency with the formula <b>sampleRate / maxLag</b>
</li></ol>
<p>I wrote some unit tests to measure the accuracy of detection with sine waves (which admittedly are the easiest to detect). Here are the results for audio sampled at 44.1kHz:</p>
<p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="140">
<p><b>Test Frequency</b></p>
</td>
<td valign="top" width="132">
<p><b>Detected Pitch</b></p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>109.99Hz</p>
</td>
<td valign="top" width="132">
<p>108.35Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>116.53Hz</p>
</td>
<td valign="top" width="132">
<p>118.23Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>123.46Hz</p>
</td>
<td valign="top" width="132">
<p>123.18Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>130.80Hz</p>
</td>
<td valign="top" width="132">
<p>129.71Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>138.58Hz</p>
</td>
<td valign="top" width="132">
<p>140.00Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>146.82Hz</p>
</td>
<td valign="top" width="132">
<p>148.48Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>155.55Hz</p>
</td>
<td valign="top" width="132">
<p>154.74Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>164.80Hz</p>
</td>
<td valign="top" width="132">
<p>163.33Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>174.60Hz</p>
</td>
<td valign="top" width="132">
<p>172.94Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>184.98Hz</p>
</td>
<td valign="top" width="132">
<p>183.75Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>195.98Hz</p>
</td>
<td valign="top" width="132">
<p>194.27Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>207.63Hz</p>
</td>
<td valign="top" width="132">
<p>206.07Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>219.98Hz</p>
</td>
<td valign="top" width="132">
<p>219.40Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>233.06Hz</p>
</td>
<td valign="top" width="132">
<p>234.57Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>246.92Hz</p>
</td>
<td valign="top" width="132">
<p>247.75Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>261.60Hz</p>
</td>
<td valign="top" width="132">
<p>256.40Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>277.16Hz</p>
</td>
<td valign="top" width="132">
<p>139.56Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>293.64Hz</p>
</td>
<td valign="top" width="132">
<p>146.03Hz</p>
</td>
</tr>
</tbody>
</table>
</p>
<p>Notice that the detected frequencies from the final two tests are actually half the correct amount. This doesn't actually matter for our purposes, since this just means the frequency has been detected as one octave below the correct note.</p>
<p>To improve on the accuracy of the autocorrelator's results, there are a couple of things you can do:</p>
<ul>
<li>Run a band-pass filter before-hand, to remove any frequencies outside of the desired range
</li><li>Combine the results with those obtained from a different technique, such as counting zero-crossings
</li></ul>
<h2>Pitch Detection with the Fast Fourier Transform</h2>
<p>I decided to implement an alternative pitch detection algorithm to see if I could get better results. A different approach is to use the
<a href="http://en.wikipedia.org/wiki/Fast_Fourier_transform">Fast Fourier Transform</a>, which converts signals from the “time domain” into the “frequency domain.”
</p>
<p>The basic approach is to take a block of samples (which must be a power of 2 – e.g. 1024), and run the FFT on them. The FFT takes complex numbers as inputs, which for audio signals are entirely real. The implementation I am using expects real and complex
 parts interleaved for the input buffer. Here's our code setting up <b>fftBuffer </b>
with interleaved samples:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">private</span> <span class="kwrd">float</span>[] fftBuffer;
<span class="kwrd">private</span> <span class="kwrd">float</span>[] prevBuffer;

<span class="kwrd">public</span> <span class="kwrd">float</span> DetectPitch(<span class="kwrd">float</span>[] buffer, <span class="kwrd">int</span> inFrames)
{
    Func&lt;<span class="kwrd">int</span>, <span class="kwrd">int</span>, <span class="kwrd">float</span>&gt; window = HammingWindow;
    <span class="kwrd">if</span> (prevBuffer == <span class="kwrd">null</span>)
    {
        prevBuffer = <span class="kwrd">new</span> <span class="kwrd">float</span>[inFrames];
    }
 
    <span class="rem">// double frames since we are combining present and previous buffers</span>
    <span class="kwrd">int</span> frames = inFrames * 2;
    <span class="kwrd">if</span> (fftBuffer == <span class="kwrd">null</span>)
    {
        fftBuffer = <span class="kwrd">new</span> <span class="kwrd">float</span>[frames * 2]; <span class="rem">// times 2 because it is complex input</span>
    }
 
    <span class="kwrd">for</span> (<span class="kwrd">int</span> n = 0; n &lt; frames; n&#43;&#43;)
    {
        <span class="kwrd">if</span> (n &lt; inFrames)
        {
            fftBuffer[n * 2] = prevBuffer[n] * window(n, frames);
            fftBuffer[n * 2 &#43; 1] = 0; <span class="rem">// need to clear out as fft modifies buffer</span>
        }
        <span class="kwrd">else</span>
        {
            fftBuffer[n * 2] = buffer[n-inFrames] * window(n, frames);
            fftBuffer[n * 2 &#43; 1] = 0; <span class="rem">// need to clear out as fft modifies buffer</span>
        }
    }</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Private</span> fftBuffer() <span class="kwrd">As</span> <span class="kwrd">Single</span>
<span class="kwrd">Private</span> prevBuffer() <span class="kwrd">As</span> <span class="kwrd">Single</span>

<span class="kwrd">Public</span> <span class="kwrd">Function</span> DetectPitch(<span class="kwrd">ByVal</span> buffer() <span class="kwrd">As</span> <span class="kwrd">Single</span>,
                            <span class="kwrd">ByVal</span> inFrames <span class="kwrd">As</span> <span class="kwrd">Integer</span>) <span class="kwrd">As</span> <span class="kwrd">Single</span> <span class="kwrd">Implements</span> IPitchDetector.DetectPitch
    <span class="kwrd">Dim</span> window <span class="kwrd">As</span> Func(Of <span class="kwrd">Integer</span>, <span class="kwrd">Integer</span>, <span class="kwrd">Single</span>) = <span class="kwrd">AddressOf</span> HammingWindow
    <span class="kwrd">If</span> prevBuffer <span class="kwrd">Is</span> <span class="kwrd">Nothing</span> <span class="kwrd">Then</span>
        prevBuffer = <span class="kwrd">New</span> <span class="kwrd">Single</span>(inFrames - 1) {}
    <span class="kwrd">End</span> <span class="kwrd">If</span>

    <span class="rem">' double frames since we are combining present and previous buffers</span>
    <span class="kwrd">Dim</span> frames = inFrames * 2
    <span class="kwrd">If</span> fftBuffer <span class="kwrd">Is</span> <span class="kwrd">Nothing</span> <span class="kwrd">Then</span>
        fftBuffer = <span class="kwrd">New</span> <span class="kwrd">Single</span>(frames * 2 - 1) {} <span class="rem">' times 2 because it is complex input</span>
    <span class="kwrd">End</span> <span class="kwrd">If</span>

    <span class="kwrd">For</span> n = 0 <span class="kwrd">To</span> frames - 1
        <span class="kwrd">If</span> n &lt; inFrames <span class="kwrd">Then</span>
            fftBuffer(n * 2) = prevBuffer(n) * window(n, frames)
            fftBuffer(n * 2 &#43; 1) = 0 <span class="rem">' need to clear out as fft modifies buffer</span>
        <span class="kwrd">Else</span>
            fftBuffer(n * 2) = buffer(n - inFrames) * window(n, frames)
            fftBuffer(n * 2 &#43; 1) = 0 <span class="rem">' need to clear out as fft modifies buffer</span>
        <span class="kwrd">End</span> <span class="kwrd">If</span>
    <span class="kwrd">Next</span> n</pre>
<p>Notice that we prepend the previous buffer we were passed. This is a common way of increasing the accuracy and resolution of an FFT by using overlapping windows, and can be further extended to store three previous buffers, allowing us to have 75% overlapping
 windows instead of just the 50% that we have in this example. </p>
<p>For better peak frequency detection, the signal that is passed into the FFT is best pre-processed with a
<a href="http://en.wikipedia.org/wiki/Window_function">“windowing” function</a>. There are several to choose from, each with its own strengths and weaknesses. I used the Hamming window, which is a fairly common choice:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">private</span> <span class="kwrd">float</span> HammingWindow(<span class="kwrd">int</span> n, <span class="kwrd">int</span> N) 
{
    <span class="kwrd">return</span> 0.54f - 0.46f * (<span class="kwrd">float</span>)Math.Cos((2 * Math.PI * n) / (N - 1));
}</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Private</span> <span class="kwrd">Function</span> HammingWindow(<span class="kwrd">ByVal</span> n <span class="kwrd">As</span> <span class="kwrd">Integer</span>, <span class="kwrd">ByVal</span> _N <span class="kwrd">As</span> <span class="kwrd">Integer</span>) <span class="kwrd">As</span> <span class="kwrd">Single</span>
    <span class="kwrd">Return</span> 0.54F - 0.46F * <span class="kwrd">CSng</span>(Math.Cos((2 * Math.PI * n) / (_N - 1)))
<span class="kwrd">End</span> Function</pre>
<p>The next step is to pass on our interleaved buffer to the FFT algorithm. I am using Stephan Bernsee's here, though there is an alternative implementation in NAudio that I could have used. Since the same function can be used for an inverse FFT, the -1 parameter
 means (rather counter-intuitively), do a forwards FFT. It processes the data in place, which is fine since we don't need to keep the contents of the input buffer:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="rem">// assuming frames is a power of 2</span>
SmbPitchShift.smbFft(fftBuffer, frames, -1);</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="rem">' assuming frames is a power of 2</span>
SmbPitchShift.smbFft(fftBuffer, frames, -1)</pre>
<p>Once we have completed the FFT, we are ready to interpret its output. The output of the FFT consists of complex numbers (again real followed by imaginary in our buffer), which represent frequency “bins.”</p>
<p>We start off by calculating the bin size and working out which bins correspond to the range of frequencies we are interested in detecting:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">float</span> binSize = sampleRate / frames;
<span class="kwrd">int</span> minBin = (<span class="kwrd">int</span>)(85 / binSize);
<span class="kwrd">int</span> maxBin = (<span class="kwrd">int</span>)(300 / binSize);</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Dim</span> binSize = sampleRate / frames
<span class="kwrd">Dim</span> minBin = <span class="kwrd">CInt</span>(Fix(85 / binSize))
<span class="kwrd">Dim</span> maxBin = <span class="kwrd">CInt</span>(Fix(300 / binSize))</pre>
<p>For example, if our sample rate is 44.1kHz and we analyse a block of 1024 samples, then each bin represents 43Hz, which is hardly the granularity we are looking for. To increase resolution, our options are to either sample at a higher rate or analyse a bigger
 chunk. Our approach is to use overlapping blocks of 8192 samples, as we read 4096 samples each time. This means we have a resolution of around 5Hz, which is much more acceptable.</p>
<p>Now we can calculate the magnitude or “intensity” for each frequency by calculating the sum of squares (strictly we should then take the square root, but we don't need to since we are just looking for the largest value):</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">float</span> maxIntensity = 0f;
<span class="kwrd">int</span> maxBinIndex = 0;

<span class="kwrd">for</span> (<span class="kwrd">int</span> bin = minBin; bin &lt;= maxBin; bin&#43;&#43;)
{
    <span class="kwrd">float</span> real = fftBuffer[bin * 2];
    <span class="kwrd">float</span> imaginary = fftBuffer[bin * 2 &#43; 1];
    <span class="kwrd">float</span> intensity = real * real &#43; imaginary * imaginary;
    <span class="kwrd">if</span> (intensity &gt; maxIntensity)
    {
        maxIntensity = intensity;
        maxBinIndex = bin;
    }
}</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Dim</span> maxIntensity = 0.0F
<span class="kwrd">Dim</span> maxBinIndex = 0
<span class="kwrd">For</span> bin = minBin <span class="kwrd">To</span> maxBin
    <span class="kwrd">Dim</span> real = fftBuffer(bin * 2)
    <span class="kwrd">Dim</span> imaginary = fftBuffer(bin * 2 &#43; 1)
    <span class="kwrd">Dim</span> intensity = real * real &#43; imaginary * imaginary
    <span class="kwrd">If</span> intensity &gt; maxIntensity <span class="kwrd">Then</span>
        maxIntensity = intensity
        maxBinIndex = bin
    <span class="kwrd">End</span> <span class="kwrd">If</span>
<span class="kwrd">Next</span> bin</pre>
<p>Since we have identified the bin with the maximum intensity, we can calculate the detected frequency:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">return</span> binSize * maxBinIndex;</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Return</span> binSize * maxBinIndex</pre>
<p>I don't currently specify a minimum threshold for maxIntensity, but perhaps if it were very low, the FFT pitch detector would return zero to indicate no pitch detected instead of returning an answer that is probably not accurate.</p>
<p>Let's have a look at how the FFT pitch detector does:
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="140">
<p><b>Test Frequency</b></p>
</td>
<td valign="top" width="132">
<p><b>Detected Pitch</b></p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>109.99Hz</p>
</td>
<td valign="top" width="132">
<p>107.67Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>116.53Hz</p>
</td>
<td valign="top" width="132">
<p>118.43Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>123.46Hz</p>
</td>
<td valign="top" width="132">
<p>123.82Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>130.80Hz</p>
</td>
<td valign="top" width="132">
<p>129.20Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>138.58Hz</p>
</td>
<td valign="top" width="132">
<p>139.97Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>146.82Hz</p>
</td>
<td valign="top" width="132">
<p>145.35Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>155.55Hz</p>
</td>
<td valign="top" width="132">
<p>156.12Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>164.80Hz</p>
</td>
<td valign="top" width="132">
<p>166.88Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>174.60Hz</p>
</td>
<td valign="top" width="132">
<p>172.27Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>184.98Hz</p>
</td>
<td valign="top" width="132">
<p>183.03Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>195.98Hz</p>
</td>
<td valign="top" width="132">
<p>193.80Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>207.63Hz</p>
</td>
<td valign="top" width="132">
<p>209.95Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>219.98Hz</p>
</td>
<td valign="top" width="132">
<p>220.72Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>233.06Hz</p>
</td>
<td valign="top" width="132">
<p>231.48Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>246.92Hz</p>
</td>
<td valign="top" width="132">
<p>247.63Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>261.60Hz</p>
</td>
<td valign="top" width="132">
<p>263.78Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>277.16Hz</p>
</td>
<td valign="top" width="132">
<p>274.55Hz</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>293.64Hz</p>
</td>
<td valign="top" width="132">
<p>296.08Hz</p>
</td>
</tr>
</tbody>
</table>
</p>
<p>As can be seen, it correctly picks out the primary frequencies of the higher notes, but overall it doesn't get that much closer than the autocorrelator, so I've left that as the default algorithm. You, however, can swap in the FFT detector in the code if
 it works better for the material you are auto-tuning.</p>
<p>There are ways of using the phase information from the FFT output to increase the accuracy of pitch detection even further, but I have left that as an exercise for the reader!</p>
<h4>Pitch Shifting</h4>
<p>The next step is to determine how much we will shift the pitch. The simplest way to do this is to look for the musical pitch that is closest to the detected pitch. Then, the amount of the shift by is simply the ratio of those two notes.
</p>
<p>There are, however, some additional considerations. First, we may want to select a subset of musical notes that are acceptable. For example, only notes in the key of C#, or maybe F# minor pentatonic. This may require a slightly more radical adjustment.</p>
<p>Second, depending on the effect we are after, we may not want to instantaneously jump to the new frequency. The code I am using utilizes a fairly rudimentary “attack” time parameter, allowing you to gradually move to the new frequency.
</p>
<p>The actual DSP for the pitch-shifting effect is more or less untouched from Stephan Bernsee's code, and this is because it works really well. The Bernsee's code makes use of the Fast Fourier Transform, plus a bunch of clever mathematics, which I
<i>almost </i>understand, but not quite well enough to try and explain here! You're better off reading an article in which the man himself explains
<a href="http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/">how it works</a>.</p>
<p>The class that manages the pitch-shifting algorithm is called <b>SmbPitchShifer
</b>and inherits from a <b>PitchShifter</b> base class. This does the bulk of its work in the
<b>ShiftPitch</b> function:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">void</span> ShiftPitch(<span class="kwrd">float</span>[] inputBuff, <span class="kwrd">float</span> inputPitch,
                       <span class="kwrd">float</span> targetPitch, <span class="kwrd">float</span>[] outputBuff, <span class="kwrd">int</span> nFrames)
{
     UpdateSettings();
     detectedPitch = inputPitch;</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Public</span> <span class="kwrd">Sub</span> ShiftPitch(<span class="kwrd">ByVal</span> inputBuff() <span class="kwrd">As</span> <span class="kwrd">Single</span>, <span class="kwrd">ByVal</span> inputPitch <span class="kwrd">As</span> <span class="kwrd">Single</span>,
                    <span class="kwrd">ByVal</span> targetPitch <span class="kwrd">As</span> <span class="kwrd">Single</span>, <span class="kwrd">ByVal</span> outputBuff() <span class="kwrd">As</span> <span class="kwrd">Single</span>, <span class="kwrd">ByVal</span> nFrames <span class="kwrd">As</span> <span class="kwrd">Integer</span>)
    UpdateSettings()
    detectedPitch = inputPitch</pre>
<p>The <b>inputPitch</b> parameter is set to the frequency detected by the PitchDetector. The
<b>targetPitch</b> parameter is currently unused, but will be used to specify the target pitch in real-time when accepting input from, say, a MIDI keyboard. In any case, we call
<b>UpdateSettings</b> in order to see if any of the autotune algorithm settings have changed since last time.</p>
<p>Next we calculate the amount we need to shift the pitch shift. A shift factor of 1 means no change. We don't allow the shift factor to go above 2 or below 0.5, since these figures represent a whole octave change:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">float</span> shiftFactor = 1.0f;

<span class="kwrd">if</span> (inputPitch &gt; 0)
{
    shiftFactor = snapFactor(inputPitch);
}

<span class="kwrd">if</span> (shiftFactor &gt; 2.0) shiftFactor = 2.0f;
<span class="kwrd">if</span> (shiftFactor &lt; 0.5) shiftFactor = 0.5f;</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Dim</span> shiftFactor = 1.0F

<span class="kwrd">If</span> inputPitch &gt; 0 <span class="kwrd">Then</span>
   shiftFactor = snapFactor(inputPitch)
   shiftFactor &#43;= addVibrato(nFrames)
<span class="kwrd">End</span> <span class="kwrd">If</span>

<span class="kwrd">If</span> shiftFactor &gt; 2.0 <span class="kwrd">Then</span>
   shiftFactor = 2.0F
<span class="kwrd">End</span> <span class="kwrd">If</span>
<span class="kwrd">If</span> shiftFactor &lt; 0.5 <span class="kwrd">Then</span>
   shiftFactor = 0.5F
<span class="kwrd">End</span> If</pre>
<p>The decision of what the target note is takes place in the <b>snapFactor</b> function:</p>
<p><strong>c#:</strong></p>
<pre class="csharpcode"><span class="kwrd">protected</span> <span class="kwrd">float</span> snapFactor(<span class="kwrd">float</span> freq)
{
    <span class="kwrd">float</span> previousFrequency = 0.0f;
    <span class="kwrd">float</span> correctedFrequency = 0.0f;
    <span class="kwrd">int</span> previousNote = 0;
    <span class="kwrd">int</span> correctedNote = 0;
    <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 1; i &lt; 120; i&#43;&#43;)
    {
        <span class="kwrd">bool</span> endLoop = <span class="kwrd">false</span>;
        <span class="kwrd">foreach</span> (<span class="kwrd">int</span> note <span class="kwrd">in</span> <span class="kwrd">this</span>.settings.AutoPitches)
        {
            <span class="kwrd">if</span> (i % 12 == note)
            {
                previousFrequency = correctedFrequency;
                previousNote = correctedNote;
                correctedFrequency = (<span class="kwrd">float</span>)(8.175 * Math.Pow(1.05946309, (<span class="kwrd">float</span>)i));
                correctedNote = i;
                <span class="kwrd">if</span> (correctedFrequency &gt; freq) { endLoop = <span class="kwrd">true</span>; }
                <span class="kwrd">break</span>;
            }
        }
        <span class="kwrd">if</span> (endLoop)
        {
            <span class="kwrd">break</span>;
        }
    }
    <span class="kwrd">if</span> (correctedFrequency == 0.0) { <span class="kwrd">return</span> 1.0f; }
    <span class="kwrd">int</span> destinationNote = 0;
    <span class="kwrd">double</span> destinationFrequency = 0.0;
    <span class="rem">// decide whether we are shifting up or down</span>
    <span class="kwrd">if</span> (correctedFrequency - freq &gt; freq - previousFrequency)
    {
        destinationNote = previousNote;
        destinationFrequency = previousFrequency;
    }
    <span class="kwrd">else</span>
    {
        destinationNote = correctedNote;
        destinationFrequency = correctedFrequency;
    }
    <span class="kwrd">if</span> (destinationNote != currPitch)
    {
        numElapsed = 0;
        currPitch = destinationNote;
    }
    <span class="kwrd">if</span> (attack &gt; numElapsed)
    {
        <span class="kwrd">double</span> n = (destinationFrequency - freq) / attack * numElapsed;
        destinationFrequency = freq &#43; n;
    }
    numElapsed&#43;&#43;;
    <span class="kwrd">return</span> (<span class="kwrd">float</span>)(destinationFrequency / freq);
}</pre>
<p><strong>VB.Net:</strong></p>
<pre class="csharpcode"><span class="kwrd">Protected</span> <span class="kwrd">Function</span> snapFactor(<span class="kwrd">ByVal</span> freq <span class="kwrd">As</span> <span class="kwrd">Single</span>) <span class="kwrd">As</span> <span class="kwrd">Single</span>
    <span class="kwrd">Dim</span> previousFrequency = 0.0F
    <span class="kwrd">Dim</span> correctedFrequency = 0.0F
    <span class="kwrd">Dim</span> previousNote = 0
    <span class="kwrd">Dim</span> correctedNote = 0
    <span class="kwrd">For</span> i = 1 <span class="kwrd">To</span> 119
        <span class="kwrd">Dim</span> endLoop = <span class="kwrd">False</span>
        <span class="kwrd">For</span> <span class="kwrd">Each</span> note <span class="kwrd">As</span> <span class="kwrd">Integer</span> <span class="kwrd">In</span> <span class="kwrd">Me</span>.settings.AutoPitches
            <span class="kwrd">If</span> i <span class="kwrd">Mod</span> 12 = note <span class="kwrd">Then</span>
                previousFrequency = correctedFrequency
                previousNote = correctedNote
                correctedFrequency = <span class="kwrd">CSng</span>(8.175 * Math.Pow(1.05946309, <span class="kwrd">CSng</span>(i)))
                correctedNote = i
                <span class="kwrd">If</span> correctedFrequency &gt; freq <span class="kwrd">Then</span>
                    endLoop = <span class="kwrd">True</span>
                <span class="kwrd">End</span> <span class="kwrd">If</span>
                <span class="kwrd">Exit</span> <span class="kwrd">For</span>
            <span class="kwrd">End</span> <span class="kwrd">If</span>
        <span class="kwrd">Next</span> note
        <span class="kwrd">If</span> endLoop <span class="kwrd">Then</span>
            <span class="kwrd">Exit</span> <span class="kwrd">For</span>
        <span class="kwrd">End</span> <span class="kwrd">If</span>
    <span class="kwrd">Next</span> i
    <span class="kwrd">If</span> correctedFrequency = 0.0 <span class="kwrd">Then</span>
        <span class="kwrd">Return</span> 1.0f
    <span class="kwrd">End</span> <span class="kwrd">If</span>
    <span class="kwrd">Dim</span> destinationNote = 0
    <span class="kwrd">Dim</span> destinationFrequency = 0.0
    <span class="rem">' decide whether we are shifting up or down</span>
    <span class="kwrd">If</span> correctedFrequency - freq &gt; freq - previousFrequency <span class="kwrd">Then</span>
        destinationNote = previousNote
        destinationFrequency = previousFrequency
    <span class="kwrd">Else</span>
        destinationNote = correctedNote
        destinationFrequency = correctedFrequency
    <span class="kwrd">End</span> <span class="kwrd">If</span>
    <span class="kwrd">If</span> destinationNote &lt;&gt; currPitch <span class="kwrd">Then</span>
        numElapsed = 0
        currPitch = destinationNote
    <span class="kwrd">End</span> <span class="kwrd">If</span>
    <span class="kwrd">If</span> attack &gt; numElapsed <span class="kwrd">Then</span>
        <span class="kwrd">Dim</span> n = (destinationFrequency - freq) / attack * numElapsed
        destinationFrequency = freq &#43; n
    <span class="kwrd">End</span> <span class="kwrd">If</span>
    numElapsed &#43;= 1
    <span class="kwrd">Return</span> <span class="kwrd">CSng</span>(destinationFrequency / freq)
<span class="kwrd">End</span> Function</pre>
<p>The way this function works is that it runs through the MIDI notes 0-120 and, if that note is selected as one of the valid pitches we support, we remember the “corrected frequency,” which can be calculated from the MIDI note number with the following formula:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode">correctedFrequency = (<span class="kwrd">float</span>)(8.175 * Math.Pow(1.05946309, (<span class="kwrd">float</span>)midiNoteNumber));</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode">correctedFrequency = <span class="kwrd">CSng</span>(8.175 * Math.Pow(1.05946309, <span class="kwrd">CSng</span>(i)))</pre>
<p>Obviously, a pitch is likely to fall somewhere in between two valid notes, so we choose the which pitch to correct by determining which one is closest to the detected frequency.</p>
<p>The <b>snapFactor </b>function is also responsible for implementing the attack time parameter. This allows the destinationFrequency to be slowly moved to the target note over the duration of the attack period. Having calculated our shift factor, we are now
 ready to pass our data on to the actual pitch-shifting algorithm:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">int</span> fftFrameSize = 2048;
<span class="kwrd">int</span> osamp = 8; <span class="rem">// 32 is best quality</span>
SmbPitchShift.smbPitchShift(shiftFactor, nFrames, fftFrameSize, osamp, <span class="kwrd">this</span>.sampleRate, inputBuff, outputBuff);</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Dim</span> fftFrameSize = 2048
<span class="kwrd">Dim</span> osamp = 8 <span class="rem">' 32 is best quality</span>
SmbPitchShift.smbPitchShift(shiftFactor, nFrames, fftFrameSize, osamp, <span class="kwrd">Me</span>.sampleRate, inputBuff, outputBuff)</pre>
<p>The final thing we do in the <b>ShiftPitch </b>function is keep a record of the pitch shifts we have made. These are stored in a queue (maximum of 5000 entries) and are very useful for diagnosing what is going on if you are not getting the results you wanted
 from the algorithm:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode">shiftedPitch = inputPitch * shiftFactor;
updateShifts(detectedPitch, shiftedPitch, <span class="kwrd">this</span>.currPitch);</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode">shiftedPitch = inputPitch * shiftFactor
updateShifts(detectedPitch, shiftedPitch, <span class="kwrd">Me</span>.currPitch)</pre>
<h2>Performance</h2>
<p>Performance, as you might expect in a managed application that has not been extensively optimized, was not good. Using my laptop, I could autotune one minute of audio in about 90 seconds. Obviously, that rules out real-time autotuning. I decided to profile
 the application to see if there were any quick ways I could improve things.</p>
<p>The profiling tools in Visual Studio revealed that 20% of the time was spent on pitch detection and 80% pitch shifting. Unfortunately, there were not too many options available for optimisation, since further investigation pointed to calls to
<b>Math.Sin</b> taking the bulk of the time. Possibly creating lookup tables could save a bit more time.
</p>
<p>Fortunately, we have another option for speeding things up. The pitch-shifting algorithm takes an “oversampling” parameter, which by default is set to 32, the highest value. However, we can trade off speed for quality. Setting it to 16 meant that I could
 autotune a minute of audio in 55ms (on my 2.4GHz Core2Duo laptop) – realtime but only just. Setting it to 8 reduced that down to 36s. The results still sounded reasonable, so I have left it set at 8 in the code.
</p>
<p>An alternative way of speeding it up though would be to swap in a different pitch-shifting algorithm. You could start by trying out one I created as part of the
<a href="http://blogs.msdn.com/b/coding4fun/archive/2009/02/02/9391048.aspx">Skype Voice Changer project</a> previously featured on Coding4Fun, which is also able to operate in real-time (although I haven't done any quality comparisons).</p>
<h2>Creating a Test GUI</h2>
<p>Rather than starting from scratch, I decided to build upon <a href="http://voicerecorder.codeplex.com/">
.NET Voice Recorder</a>, a WPF application I created for <a href="http://blogs.msdn.com/b/coding4fun/archive/2009/10/08/9905168.aspx">
a previous Coding4Fun article</a>. This takes advantage of the <a href="file:///C:/Users/crutkas/AppData/Local/Microsoft/Windows/Temporary Internet Files/Content.IE5/SMJQO6XL/naudio.codeplex.com">
NAudio</a> .NET audio library for audio recording and playback capabilities. The GUI has three screens. On the first is the input device used for recording. The second records a short voice clip. And the third allows you to edit a small portion of saved audio.</p>
<p>Here's a screenshot of the second screen showing a recording in progress:</p>
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10112293/image.png"><img title="image" border="0" alt="image" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10112293/image_thumb.png" width="320" height="380"></a></p>
<p>And here's the screen that allows you to trim the recording, preview it, and save it as WAV:</p>
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10112293/image_3.png"><img title="image" border="0" alt="image" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10112293/image_thumb_3.png" width="320" height="380"></a></p>
<p>As you can see, I have added a new button allowing access to the autotune effect settings. On this screen, you can select which notes are valid, and you can also adjust the “attack time” if you prefer to not go for the robotic effect. I've included a drop-down
 menu that automatically selects the appropriate notes from various keys.</p>
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10112293/image_4.png"><img title="image" border="0" alt="image" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10112293/image_thumb_4.png" width="320" height="360"></a></p>
<p><b></b></p>
<p>When you click “Apply,” the autotune effect is applied (while you wait on a background thread) and then you are returned to the screen, allowing you to play back your recording and see how it sounds. If you'd like, you can then go back and change the autotune
 settings (or turn it off).</p>
<h3>MVVM Light</h3>
<p>The original VoiceRecorder application used a <a href="http://en.wikipedia.org/wiki/Model_View_ViewModel">
MVVM</a> (model-view-viewmodel) architecture for binding data to each view. I have updated it to make use of Laurent Bugnion's excellent
<a href="http://www.galasoft.ch/mvvm/getstarted/">MVVM Light</a> library. This removes the need for my own RelayCommand and ViewModelBase classes, and also enables me to replace my ViewManager with a more extensible framework using the event aggregator (“<a href="http://blog.galasoft.ch/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx">Messenger</a>”)
 that is included with MVVM light. This allows me to quickly navigate from one view to another by sending out a message on the event aggregator:</p>
<p><strong>c#:</strong> </p>
<pre class="csharpcode"><span class="kwrd">private</span> <span class="kwrd">void</span> NavigateToSaveView()
{
   Messenger.Default.Send(<span class="kwrd">new</span> NavigateMessage(SaveViewModel.ViewName, <span class="kwrd">this</span>.voiceRecorderState));
}</pre>
<p><strong>VB.Net</strong></p>
<pre class="csharpcode"><span class="kwrd">Private</span> <span class="kwrd">Sub</span> NavigateToSaveView()
    Messenger.<span class="kwrd">Default</span>.Send(<span class="kwrd">New</span> NavigateMessage(SaveViewModel.ViewName, <span class="kwrd">Me</span>.voiceRecorderState))
<span class="kwrd">End</span> Sub</pre>
<h3>Getting the Best out of Autotune</h3>
<p>Unfortunately, Autotune is an effect that doesn't always produce the desired result . Obviously, if you want great autotune, you're best off buying a commercial implementation, but here are a few tips for getting the most out of an autotune algorithm:</p>
<ul>
<li><b>Get a good quality recording</b>. Avoid background noise, hum, and too quiet or too loud (distorted) recordings. If you need to sing against a backing track, play it in headphones so the microphone doesn't pick it up.
</li><li><b>Know what key you are singing in</b>. This is where the test application won't help you out, since if you don't know what key you are singing in, you can hardly expect to be able to select the appropriate key from the list. You might even be singing
 in between two keys! If you have an in-tune musical instrument at hand, play a note to give yourself a starting pitch.
</li><li><b>Choose your scale. </b>The easiest option is to just go with a chromatic scale, which means all 12 notes are valid. However, you can try to make the autotune force you into a monotone. Pentatonic scales are useful for instant gratification. They have
 five notes in them, and so long as you stick to those five, almost anything you sing will fit in with a backing track in your chosen key.
</li><li><b>Adjust the attack time</b>. An attack time of zero is great for the robot effect. A longer attack time will smooth out transitions.
</li><li><b>Why is it “warbling”? </b>With this autotune algorithm, it is quite common to get a “warbling” effect. This is because it is either changing its mind about what note to pitch shift to (because the pitch detector is not providing stable pitch detection),
 or because the pitch detector couldn't determine a pitch at all, so your voice isn't being pitch shifted. You can play around with the release slider (and may need to modify the release algorithm) if you want to eliminate warbling.
</li></ul>
<h2>Taking it further</h2>
<p>.NET Voice Recorder is open source <a href="http://voicerecorder.codeplex.com">
and hosted on CodePlex</a> in a Mercurial repository. So what you waiting for? Make a fork and have a go at improving it:</p>
<ul>
<li><b>Improve the pitch detector algorithm</b>. I have already given some suggestions for how this can be done. One idea that might be worth experimenting with is making it “hold” the detected frequency for a short period until a strong, new frequency is detected.
</li><li><b>Display the detected pitches.</b> The autotune effect stores data of the detected pitches as well as the pitches it attempts to convert to. You might display this information to the user, perhaps underneath the waveform, so they can see what it is detecting.
 (It currently outputs this information with Debug.WriteLine, which is useful for debugging purposes).
</li><li><b>Suggest an appropriate scale? </b>Instead of leaving it to the user to select what key to snap the notes to, how about auto-selecting the detected notes?
</li><li><b>Allow direct input of desired pitch</b>. Instead of letting the autotune effect try to work out what note it should be targeting at any given time, it is far more effective to let the user input what note they would like to shift to. This could be done
 by entering the note using a MIDI keyboard in real-time, or by drawing the notes in, perhaps on a “piano-roll” control. Or, users could implement a simple, domain-specific language to specify the desired note. For example:
<ul>
<li>0:00.0 C# </li><li>0:01.5 E </li><li>0:02.7 G# </li></ul>
</li><li><b>Port it to Windows Phone 7</b>. This would be quite a cool effect to have on your phone. Of course, you might need to optimize performance a bit more to save battery life. And you'll want to put your graphic designer hat on to give it a more beautiful
 look than it currently has. </li></ul>
<h2>About the Author</h2>
<p>Mark Heath is the author of several open source .NET applications and libraries, including
<a href="http://naudio.codeplex.com">
NAudio</a> and the <a href="http://skypefx.codeplex.com">
Skype Voice Changer</a>. He works for <a href="http://nice.com/">NICE Systems</a>, developing applications that search, display, and play back vast amounts of multimedia data. He has a blog,
<a href="http://mark-dot-net.blogspot.com">Sound Code</a>, and you can follow him on his sporadically updated
<a href="http://twitter.com/mark_heath">Twitter account</a>.</p>
 <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:f73dedce787c457fb8b09e7600c6e4d6">]]></description>
      <comments>http://channel9.msdn.com/coding4fun/articles/AutotuneNET</comments>
      <itunes:summary>We&#39;ve all cringed as a hopelessly out of tune contestant appears on the latest episode of “American Idol.” Occasionally, there&#39;s a contestant who manages to be pitch perfect all the way through—right until they flub the final note. And in the cutthroat world
 of televised auditions, sing one slightly flat note and you&#39;re out. 
So what takes care of a bad-pitch day? Autotune—an effect that corrects the pitch of your voice so you&#39;ll never again sing out of tune. And now, with the power of modern microprocessors, autotune is possible in real-time, allowing singers to benefit from
 its almost magical powers during live concerts.
The company most famous for its autotune effect is Antares. 
Antares Auto-Tune currently retails for $249, and a stripped down version is available for $100. In addition to simply improving the pitch of a dodgy singer, autotune can be used to create unique robotic sounding vocal effects, a technique massively popular
 in recent years thanks to its use by artists such as T-Pain and the group behind the “Auto-Tune the News” YouTube videos. In 1998, when the effect was first used on
Cher&#39;s “Believe” single, the producer used such extreme settings that instead of subtly adjusting the pitch, autotune “snapped” instantaneously to the nearest “correct” note.

Here is a nerdy example of what Autotune can do.



How does Autotune work?
An autotune effect has two parts. The first is pitch detection, which calculates the dominant frequency of the incoming signal, and is the reason autotune is normally used on monophonic audio sources (i.e. playing one note at a time, not whole chords).
 So, if your guitar is out of tune, you&#39;re out of luck (Celemony&#39;s Melodyne product, however, features some incredible capabilities for pitch-shifting polyphonic audio).
The second stage is pitch shifting, or “correcting” a given note. However, the bigger the pitch shift required, the more artificial the end result will be, and it is worth noting that absolutely perfect pitc</itunes:summary>
      <link>http://channel9.msdn.com/coding4fun/articles/AutotuneNET</link>
      <pubDate>Wed, 05 Jan 2011 22:19:46 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/coding4fun/articles/AutotuneNET</guid>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/c4f/images/10112293_100.jpg" height="75" width="100"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/c4f/images/10112293_220.jpg" height="165" width="220"/>      
      <dc:creator>Mark Heath</dc:creator>
      <itunes:author>Mark Heath</itunes:author>
      <slash:comments>20</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/coding4fun/articles/AutotuneNET/RSS</wfw:commentRss>
      <category>Audio</category>
      <category>MVVM</category>
      <category>WPF</category>
    </item>
  <item>
      <title>WPF Brings the Bible to Life</title>
      <description><![CDATA[ <p>Immersion Digital is a BizSpark company based in Orlando, Florida that's bringing the Bible to life through WPF in their Glo Bible software. In this interview,&nbsp;I talked to Nelson Saba, CEO and Founder of Immersion Digital, about Glo and how they came to choose WPF to build the product. </p><p>Links:</p><ul><li><a href="http://globible.com">Glo Bible</a> </li><li><a href="http://windowsclient.net/">Windows Client</a> </li><li><a href="http://bizspark.com">BizSpark Home Page</a> </li><li><a href="http://blogs.msdn.com/ignitionshowcase">Ignition Showcase<br></a></li></ul><p>&nbsp;</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:aedd389e032f4f51af659e410102a0c4">]]></description>
      <comments>http://channel9.msdn.com/Blogs/brianjo/WPF-Brings-the-Bible-to-Life</comments>
      <itunes:summary> Immersion Digital is a BizSpark company based in Orlando, Florida that&#39;s bringing the Bible to life through WPF in their Glo Bible software. In this interview,&amp;nbsp;I talked to Nelson Saba, CEO and Founder of Immersion Digital, about Glo and how they came to choose WPF to build the product. Links:Glo Bible Windows Client BizSpark Home Page Ignition Showcase&amp;nbsp;</itunes:summary>
      <itunes:duration>941</itunes:duration>
      <link>http://channel9.msdn.com/Blogs/brianjo/WPF-Brings-the-Bible-to-Life</link>
      <pubDate>Fri, 03 Dec 2010 16:42:15 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/brianjo/WPF-Brings-the-Bible-to-Life</guid>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/a0c4/aedd389e-032f-4f51-af65-9e410102a0c4/GloBible_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/a0c4/aedd389e-032f-4f51-af65-9e410102a0c4/GloBible_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/a0c4/aedd389e-032f-4f51-af65-9e410102a0c4/GloBible_512_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/a0c4/aedd389e-032f-4f51-af65-9e410102a0c4/GloBible_2MB_ch9.wmv" expression="full" duration="941" fileSize="121219145" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/a0c4/aedd389e-032f-4f51-af65-9e410102a0c4/GloBible_ch9.mp3" expression="full" duration="941" fileSize="7530893" type="audio/mp3" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/a0c4/aedd389e-032f-4f51-af65-9e410102a0c4/GloBible_ch9.wma" expression="full" duration="941" fileSize="7617113" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/a0c4/aedd389e-032f-4f51-af65-9e410102a0c4/GloBible_ch9.wmv" expression="full" duration="941" fileSize="144395077" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/a0c4/aedd389e-032f-4f51-af65-9e410102a0c4/GloBible_high_ch9.mp4" expression="full" duration="941" fileSize="235985250" type="video/mp4" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/a0c4/aedd389e-032f-4f51-af65-9e410102a0c4/GloBible_low_ch9.mp4" expression="full" duration="941" fileSize="72792153" type="video/mp4" medium="video"/>
      </media:group>      
      <enclosure url="http://ecn.channel9.msdn.com/o9/ch9/a0c4/aedd389e-032f-4f51-af65-9e410102a0c4/GloBible_ch9.wmv" length="144395077" type="video/x-ms-wmv"/>
      <dc:creator>Brian Johnson</dc:creator>
      <itunes:author>Brian Johnson</itunes:author>
      <slash:comments>2</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/brianjo/WPF-Brings-the-Bible-to-Life/RSS</wfw:commentRss>
      <category>BizSpark</category>
      <category>mpneast</category>
      <category>Windows</category>
      <category>WPF</category>
      <category>Startup</category>
    </item>
  <item>
      <title>Pete at Microsoft: Joel Barsotti and CalMAN in WPF</title>
      <description><![CDATA[ <p>In September, I met up on campus with Joel Barsotti. Joel, and the company SpectraCal, have created an awesome WPF application used for analyzing and calibrating various types of displays (computer screens, LCDs in stores etc.)</p><p>When Joel first told me about the application, I was really excited about how he leveraged WPF and the power of desktop integration to create something that would have been a lot more work just a few years ago. Watch the video for more info.</p><ul><li><a href="http://spectracal.com/">SpectraCal Home Page</a> </li><li><a href="http://10rem.net/blog">Pete's Site and Blog</a> </li></ul> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:237dcb33fb8e4bd08eb69e1a005d270c">]]></description>
      <comments>http://channel9.msdn.com/Blogs/Psychlist1972/Pete-at-Microsoft-Joel-Barsotti-and-CalMAN-in-WPF</comments>
      <itunes:summary> In September, I met up on campus with Joel Barsotti. Joel, and the company SpectraCal, have created an awesome WPF application used for analyzing and calibrating various types of displays (computer screens, LCDs in stores etc.)When Joel first told me about the application, I was really excited about how he leveraged WPF and the power of desktop integration to create something that would have been a lot more work just a few years ago. Watch the video for more info.SpectraCal Home Page Pete&#39;s Site and Blog </itunes:summary>
      <itunes:duration>747</itunes:duration>
      <link>http://channel9.msdn.com/Blogs/Psychlist1972/Pete-at-Microsoft-Joel-Barsotti-and-CalMAN-in-WPF</link>
      <pubDate>Wed, 27 Oct 2010 05:34:16 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/Psychlist1972/Pete-at-Microsoft-Joel-Barsotti-and-CalMAN-in-WPF</guid>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/270c/237dcb33-fb8e-4bd0-8eb6-9e1a005d270c/PeteAtMicrosoftJoelBarsottiCalMANWPF_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/270c/237dcb33-fb8e-4bd0-8eb6-9e1a005d270c/PeteAtMicrosoftJoelBarsottiCalMANWPF_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/270c/237dcb33-fb8e-4bd0-8eb6-9e1a005d270c/PeteAtMicrosoftJoelBarsottiCalMANWPF_512_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/270c/237dcb33-fb8e-4bd0-8eb6-9e1a005d270c/PeteAtMicrosoftJoelBarsottiCalMANWPF_2MB_ch9.wmv" expression="full" duration="747" fileSize="503430428" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/270c/237dcb33-fb8e-4bd0-8eb6-9e1a005d270c/PeteAtMicrosoftJoelBarsottiCalMANWPF_ch9.mp3" expression="full" duration="747" fileSize="5983649" type="audio/mp3" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/270c/237dcb33-fb8e-4bd0-8eb6-9e1a005d270c/PeteAtMicrosoftJoelBarsottiCalMANWPF_ch9.mp4" expression="full" duration="747" fileSize="83376880" type="video/mp4" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/270c/237dcb33-fb8e-4bd0-8eb6-9e1a005d270c/PeteAtMicrosoftJoelBarsottiCalMANWPF_ch9.wma" expression="full" duration="747" fileSize="6055033" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/270c/237dcb33-fb8e-4bd0-8eb6-9e1a005d270c/PeteAtMicrosoftJoelBarsottiCalMANWPF_ch9.wmv" expression="full" duration="747" fileSize="163817913" type="video/x-ms-wmv" medium="video"/>
      </media:group>      
      <enclosure url="http://ecn.channel9.msdn.com/o9/ch9/270c/237dcb33-fb8e-4bd0-8eb6-9e1a005d270c/PeteAtMicrosoftJoelBarsottiCalMANWPF_ch9.wmv" length="163817913" type="video/x-ms-wmv"/>
      <dc:creator>Pete Brown</dc:creator>
      <itunes:author>Pete Brown</itunes:author>
      <slash:comments>0</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/Psychlist1972/Pete-at-Microsoft-Joel-Barsotti-and-CalMAN-in-WPF/RSS</wfw:commentRss>
      <category>Pete Brown</category>
      <category>WPF</category>
    </item>
  <item>
      <title>TweeVo 1.1 is now available</title>
      <description><![CDATA[
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/2335.image_5F00_68AA9D8C.png"><img title="image" alt="image" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/2335.image_5F00_68AA9D8C.png" align="right" border="0" height="94" width="94"></a>Users
 of <a href="http://www.brianpeek.com/" target="_blank">Brian Peek</a>’s <a href="http://www.tweevo.org/" target="_blank">
TweeVo</a> application have obviously noticed that the application hasn’t been working since early September.&nbsp; Twitter forced all applications to use the
<a href="http://en.wikipedia.org/wiki/Oauth" target="_blank">OAuth</a> authentication scheme, and now TweeVo has been updated to work with this new requirement.&nbsp; You can download the new version with source code over at
<a href="http://tweevo.codeplex.com/" target="_blank">CodePlex</a>.&nbsp; A big thanks to
<a href="http://anotherlab.rajapet.net/" target="_blank">Chris Miller</a> for getting things up and running again.</p>
 <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:d035bae87dcb46efbf1a9e7600c784ac">]]></description>
      <comments>http://channel9.msdn.com/coding4fun/blog/TweeVo-11-is-now-available</comments>
      <itunes:summary>
Users
 of Brian Peek’s 
TweeVo application have obviously noticed that the application hasn’t been working since early September.&amp;nbsp; Twitter forced all applications to use the
OAuth authentication scheme, and now TweeVo has been updated to work with this new requirement.&amp;nbsp; You can download the new version with source code over at
CodePlex.&amp;nbsp; A big thanks to
Chris Miller for getting things up and running again.
</itunes:summary>
      <link>http://channel9.msdn.com/coding4fun/blog/TweeVo-11-is-now-available</link>
      <pubDate>Sat, 16 Oct 2010 07:29:00 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/coding4fun/blog/TweeVo-11-is-now-available</guid>      
      <dc:creator>Clint Rutkas</dc:creator>
      <itunes:author>Clint Rutkas</itunes:author>
      <slash:comments>0</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/coding4fun/blog/TweeVo-11-is-now-available/RSS</wfw:commentRss>
      <category>utility</category>
      <category>Windows</category>
      <category>WPF</category>
      <category>Mash Up</category>
      <category>c4fnews</category>
    </item>
  <item>
      <title>Three Reasons Developers Should Use Expression Blend</title>
      <description><![CDATA[ <p>Lots of developers are building XAML-based applications today.&nbsp; Be it WPF, Silverlight or Windows Phone 7, I have seen a lot of people struggle with certain tasks in Visual Studio that would be much easier if undertaken in Expression Blend.&nbsp; Blend seems to be somewhat intimidating to developers, especially those that are already wrestling with learning XAML. Having spent time in both tools, I can tell you that Blend can make three things dramatically easier, and you should learn how to do these three things with Blend, even if you never use it for anything else.</p><p><a href="http://s3.amazonaws.com/slickthought/Downloads/Code/DevelopersUseBlend.zip">Demo code</a></p><p>&nbsp;</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:c1c12c831c7645eb8cc59e0f011f4bf9">]]></description>
      <comments>http://channel9.msdn.com/Blogs/SlickThought/Three-Reasons-Developers-Should-Use-Expression-Blend</comments>
      <itunes:summary> Lots of developers are building XAML-based applications today.&amp;nbsp; Be it WPF, Silverlight or Windows Phone 7, I have seen a lot of people struggle with certain tasks in Visual Studio that would be much easier if undertaken in Expression Blend.&amp;nbsp; Blend seems to be somewhat intimidating to developers, especially those that are already wrestling with learning XAML. Having spent time in both tools, I can tell you that Blend can make three things dramatically easier, and you should learn how to do these three things with Blend, even if you never use it for anything else.Demo code&amp;nbsp;</itunes:summary>
      <itunes:duration>838</itunes:duration>
      <link>http://channel9.msdn.com/Blogs/SlickThought/Three-Reasons-Developers-Should-Use-Expression-Blend</link>
      <pubDate>Fri, 15 Oct 2010 18:35:16 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/SlickThought/Three-Reasons-Developers-Should-Use-Expression-Blend</guid>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/4bf9/c1c12c83-1c76-45eb-8cc5-9e0f011f4bf9/BlendForDevelopers_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/4bf9/c1c12c83-1c76-45eb-8cc5-9e0f011f4bf9/BlendForDevelopers_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/4bf9/c1c12c83-1c76-45eb-8cc5-9e0f011f4bf9/BlendForDevelopers_512_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4bf9/c1c12c83-1c76-45eb-8cc5-9e0f011f4bf9/BlendForDevelopers_2MB_ch9.wmv" expression="full" duration="838" fileSize="177138479" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4bf9/c1c12c83-1c76-45eb-8cc5-9e0f011f4bf9/BlendForDevelopers_ch9.mp3" expression="full" duration="838" fileSize="6710275" type="audio/mp3" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4bf9/c1c12c83-1c76-45eb-8cc5-9e0f011f4bf9/BlendForDevelopers_ch9.mp4" expression="full" duration="838" fileSize="59021611" type="video/mp4" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4bf9/c1c12c83-1c76-45eb-8cc5-9e0f011f4bf9/BlendForDevelopers_ch9.wma" expression="full" duration="838" fileSize="6788009" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4bf9/c1c12c83-1c76-45eb-8cc5-9e0f011f4bf9/BlendForDevelopers_ch9.wmv" expression="full" duration="838" fileSize="37050459" type="video/x-ms-wmv" medium="video"/>
      </media:group>      
      <enclosure url="http://ecn.channel9.msdn.com/o9/ch9/4bf9/c1c12c83-1c76-45eb-8cc5-9e0f011f4bf9/BlendForDevelopers_ch9.wmv" length="37050459" type="video/x-ms-wmv"/>
      <dc:creator>Jeff Brand</dc:creator>
      <itunes:author>Jeff Brand</itunes:author>
      <slash:comments>2</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/SlickThought/Three-Reasons-Developers-Should-Use-Expression-Blend/RSS</wfw:commentRss>
      <category>Blend</category>
      <category>Silverlight</category>
      <category>WP7</category>
      <category>WPF</category>
      <category>XAML</category>
    </item>
  <item>
      <title>Bytes by MSDN: Billy Hollis&#39; Resources for Summer 2009</title>
      <description><![CDATA[Need some good resources on WPF and Silverlight? Tune in for Billy's list of favorite technical resources, which blogs he reads, and why he's hesitant to tell you about them!<br /><br /><p><a shape="rect" href="http://clk.atdmt.com/MRT/go/249592548/direct/01/" target="_blank" shape="rect"><strong>Click here</strong></a><strong>&nbsp;for Visual Studio Downloads<br /><br /></strong><b>About Billy<br /></b><br />Billy Hollis authored many of the earliest books on .NET, and has been working with WPF and Silverlight for over three years. He is a regular speaker at conferences such as Tech·Ed, PDC, VSLive, and DevConnections, and his two sessions at Tech·Ed 2009 were
 both rated in the top twenty sessions for the conference overall. He has a consulting practice in Nashville, TN, focusing on healthcare applications, advanced rule-driven architectures, and advanced user interface prototyping and development. He also offers
 introductory and advanced training classes on WPF and Silverlight. He is the author of a forthcoming book on WPF.</p>
<p><b>Stuff Billy recommends you check out this summer:</b></p>
<ul>
<li><a shape="rect" href="http://windowsclient.net/learn/" id="ctl00_mainContentContainer_ctl14" shape="rect">WPF videos</a>
</li><li><a shape="rect" href="http://silverlight.net/Learn/" id="ctl00_mainContentContainer_ctl15" shape="rect">Silverlight videos</a>
</li><li><a shape="rect" href="/netframework/aa904594.aspx" id="ctl00_mainContentContainer_ctl16" shape="rect">LINQ</a>
</li><li><a shape="rect" href="http://www.microsoft.com/azure/default.mspx" id="ctl00_mainContentContainer_ctl17" shape="rect">Azure</a>
</li><li><a shape="rect" href="http://silverlight.net/blogs/jesseliberty/" id="ctl00_mainContentContainer_ctl18" shape="rect">Jesse Liberty's Silverlight Blog</a>
</li><li><a shape="rect" href="http://www.beacosta.com/blog/" id="ctl00_mainContentContainer_ctl19" shape="rect">Beatrice Costa on Silverlight and WPF</a>
</li><li><a shape="rect" href="http://www.amazon.com/Whole-New-Mind-Information-Conceptual/dp/1573223085" id="ctl00_mainContentContainer_ctl20" shape="rect"><i>A Whole New Mind</i></a> by Daniel Pink
</li><li><a shape="rect" href="http://www.dnrtv.com/" id="ctl00_mainContentContainer_ctl21" shape="rect">.NET Rocks TV</a>
</li><li><a shape="rect" href="http://www.dnrtv.com/default.aspx?showNum=128" id="ctl00_mainContentContainer_ctl22" shape="rect">Developers Intro to XAML – Part 1</a>
</li><li><a shape="rect" href="http://www.dnrtv.com/default.aspx?showNum=129" id="ctl00_mainContentContainer_ctl23" shape="rect">Developers Intro to XAML – Part 2</a>
</li><li><a shape="rect" href="http://blogs.msdn.com/" id="ctl00_mainContentContainer_ctl24" shape="rect">MSDN Blogs</a>
</li><li>Billy's blog: <a shape="rect" href="http://www.dotnetmasters.com/" id="ctl00_mainContentContainer_ctl25" shape="rect">
http://www.dotnetmasters.com/</a> </li></ul>
 <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:abafe67481da48eb86a49de90187fcf3">]]></description>
      <comments>http://channel9.msdn.com/Blogs/Bytes+by+MSDN/Bytes-by-MSDN-Billy-Hollis-Resources-for-Summer-2009</comments>
      <itunes:summary>Need some good resources on WPF and Silverlight? Tune in for Billy&#39;s list of favorite technical resources, which blogs he reads, and why he&#39;s hesitant to tell you about them!Click here&amp;nbsp;for Visual Studio DownloadsAbout BillyBilly Hollis authored many of the earliest books on .NET, and has been working with WPF and Silverlight for over three years. He is a regular speaker at conferences such as Tech&#183;Ed, PDC, VSLive, and DevConnections, and his two sessions at Tech&#183;Ed 2009 were
 both rated in the top twenty sessions for the conference overall. He has a consulting practice in Nashville, TN, focusing on healthcare applications, advanced rule-driven architectures, and advanced user interface prototyping and development. He also offers
 introductory and advanced training classes on WPF and Silverlight. He is the author of a forthcoming book on WPF.
Stuff Billy recommends you check out this summer:

WPF videos
Silverlight videos
LINQ
Azure
Jesse Liberty&#39;s Silverlight Blog
Beatrice Costa on Silverlight and WPF
A Whole New Mind by Daniel Pink
.NET Rocks TV
Developers Intro to XAML – Part 1
Developers Intro to XAML – Part 2
MSDN Blogs
Billy&#39;s blog: 
http://www.dotnetmasters.com/ 
</itunes:summary>
      <itunes:duration>390</itunes:duration>
      <link>http://channel9.msdn.com/Blogs/Bytes+by+MSDN/Bytes-by-MSDN-Billy-Hollis-Resources-for-Summer-2009</link>
      <pubDate>Mon, 30 Aug 2010 14:33:00 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/Bytes+by+MSDN/Bytes-by-MSDN-Billy-Hollis-Resources-for-Summer-2009</guid>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/previewImages/100/570013_100x75.jpg" height="75" width="100"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/previewImages/220/570013_220x165.jpg" height="165" width="220"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/0013/570013/BytesbyMSDNBillyHollis_320_ch9.jpg" height="240" width="320"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/0013/570013/BytesbyMSDNBillyHollis_512_ch9.jpg" height="384" width="512"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/0013/570013/BytesbyMSDNBillyHollis_85_ch9.jpg" height="64" width="85"/>
      <media:group>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/0013/570013/BytesbyMSDNBillyHollis_2MB_ch9.wmv" expression="full" duration="390" fileSize="20097045" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/0013/570013/BytesbyMSDNBillyHollis_ch9.mp3" expression="full" duration="390" fileSize="3123792" type="audio/mp3" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/0013/570013/BytesbyMSDNBillyHollis_ch9.mp4" expression="full" duration="390" fileSize="45848331" type="video/mp4" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/0013/570013/BytesbyMSDNBillyHollis_ch9.wma" expression="full" duration="390" fileSize="3165185" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/0013/570013/BytesbyMSDNBillyHollis_Zune_ch9.wmv" expression="full" duration="390" fileSize="44743824" type="video/x-ms-wmv" medium="video"/>
      </media:group>      
      <enclosure url="http://ecn.channel9.msdn.com/o9/ch9/0013/570013/BytesbyMSDNBillyHollis_2MB_ch9.wmv" length="20097045" type="video/x-ms-wmv"/>
      <dc:creator>Bytes by MSDN</dc:creator>
      <itunes:author>Bytes by MSDN</itunes:author>
      <slash:comments>0</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/Bytes+by+MSDN/Bytes-by-MSDN-Billy-Hollis-Resources-for-Summer-2009/RSS</wfw:commentRss>
      <category>Bytes by MSDN</category>
      <category>Silverlight</category>
      <category>Visual Studio 2010</category>
      <category>vs2010</category>
      <category>WPF</category>
    </item>
  <item>
      <title>Building the Laser Graffiti System</title>
      <description><![CDATA[
<p>Last year, Clint Rutkas contacted me about building a project involving lasers, graffiti and code. When you get a request like that, you never decline, especially when lasers are involved. The project requirements sounded quite simple: create an application
 that can, using a laser pointer as a virtual spray can, draw virtual graffiti on the side of a building. It sounded a little daunting to me at first, but after it was broken up into small digestible pieces, the project ended up not being very complicated.</p>
<p>Below is the basic hardware setup of the <i>Laser Graffiti System</i>.</p>
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image00110.png"><img title="clip_image001[10]" border="0" alt="clip_image001[10]" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image00110_thumb.png" width="500" height="349"></a></p>
<h3>Building a Laser Tracker Engine</h3>
<h4>Giving Sight to the Blind</h4>
<p>The very first thing that needed to be proven was the ability to track a laser point. The most obvious solution was to give our application some vision with a webcam. Since this was going to be a WPF application, I decided to use my open-source project,
<a href="http://wpfmediakit.codeplex.com/">WPF MediaKit</a>, which comes with a webcam control called the VideoCaptureElement.</p>
<p>At the time, VideoCaptureElement was not very robust, and it occurred to me that my control wasn't very useful beyond looking at your webcam in a WPF app! I needed a way to get high-performance access to every pixel of every frame the webcam spat out. This
 was a good time to add that ability and increase value in my project. Without getting into the gory details of DirectShow and p/invoke, I was able to add a hook to pass me the pixel buffer, where I would wrap it in a Bitmap class and raise an event for each
 frame.</p>
<p>The XAML required to get each video sample from the web camera.</p>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">MediaKit:VideoCaptureElement</span> <span class="attr">LoadedBehavior</span><span class="kwrd">=&quot;Play&quot;</span>
    <span class="attr">RenderOptions</span>.<span class="attr">BitmapScalingMode</span><span class="kwrd">=&quot;LowQuality&quot;</span>
    <span class="attr">UnloadedBehavior</span><span class="kwrd">=&quot;Manual&quot;</span>
    <span class="attr">DesiredPixelWidth</span><span class="kwrd">=&quot;{Binding DesiredPixelWidth}&quot;</span>
    <span class="attr">DesiredPixelHeight</span><span class="kwrd">=&quot;{Binding DesiredPixelHeight}&quot;</span>
    <span class="attr">VideoCaptureDevice</span><span class="kwrd">=&quot;{Binding SelectedItem, ElementName=videoCapDevices}&quot;</span>
    <span class="attr">FPS</span><span class="kwrd">=&quot;30&quot;</span>
    <span class="attr">EnableSampleGrabbing</span><span class="kwrd">=&quot;True&quot;</span>
    <span class="attr">NewVideoSample</span><span class="kwrd">=&quot;VideoCaptureElement_NewVideoSample&quot;</span>
    <span class="attr">Margin</span><span class="kwrd">=&quot;0&quot;</span>
    <span class="attr">x:Name</span><span class="kwrd">=&quot;videoElement&quot;</span>
    <span class="attr">Stretch</span><span class="kwrd">=&quot;Fill&quot;</span>
    <span class="attr">MinHeight</span><span class="kwrd">=&quot;380&quot;</span>
    <span class="attr">MinWidth</span><span class="kwrd">=&quot;500&quot;</span> <span class="kwrd">/&gt;</span></pre>
<style type="text/css">
<!--
.csharpcode, .csharpcode 
	{font-size:small;
	color:black;
	font-family:consolas,"Courier New",courier,monospace;
	background-color:#ffffff}
.csharpcode 
	{margin:0em}
.csharpcode .rem
	{color:#008000}
.csharpcode .kwrd
	{color:#0000ff}
.csharpcode .str
	{color:#006080}
.csharpcode .op
	{color:#0000c0}
.csharpcode .preproc
	{color:#cc6633}
.csharpcode .asp
	{background-color:#ffff00}
.csharpcode .html
	{color:#800000}
.csharpcode .attr
	{color:#ff0000}
.csharpcode .alt
	{background-color:#f4f4f4;
	width:100%;
	margin:0em}
.csharpcode .lnum
	{color:#606060}
-->
</style>
<h4>Did I Mention Lasers?</h4>
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0045.png"><img title="clip_image004[5]" border="0" alt="clip_image004[5]" align="right" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0045_thumb.png" width="240" height="156"></a></p>
<p>Now that I had the ability to look at every pixel sent to me, I needed to make sense of it all. In order to complete the project, we have to be able to find a laser point shined on a wall. The difficulty lies in the fact that a laser can be of varying size
 and color. For example, if you take two consecutive video frames with the same green laser point, you will find the point may slightly differ between the two. This is because we are dealing with analog data and slightly changing lighting conditions. Whatever
 algorithm we choose to find the laser must take this into account.</p>
<p>There are many advanced ways to use video analytics to find the laser pointer, but this project did have a deadline, and I wanted to keep it fun, so I went with a simple method, which allows a user to filter the video based off ranges of hue, saturation,
 and luminance. To do this, we make use of the <a href="http://code.google.com/p/aforge/">
AForge image processing library</a>. AForge is an open-source library that comes with tons of useful utilities for just what we want to do.</p>
<h4>Filtering pixels and counting blobs…</h4>
<p>As previously mentioned, we need to first filter the image based on hue, saturation, and luminance. Luckily, the AForge library comes with such a filter, so there is not much work to be done here:
</p>
<pre class="csharpcode"><span class="rem">/* This AForge class helps us filter out the pixels we do not want */</span>
var hsl = <span class="kwrd">new</span> HSLFiltering
{
    Hue = <span class="kwrd">new</span> IntRange(HueMinimum, HueMaximum),
    Saturation = <span class="kwrd">new</span> DoubleRange(SaturationMinimum, SaturationMaximum),
    Luminance = <span class="kwrd">new</span> DoubleRange(LuminanceMinimum, LuminanceMaximum)
};

var bitmapData = bitmap.LockBits(
    <span class="kwrd">new</span> Rectangle((<span class="kwrd">int</span>)targetSearchArea.X, 
        (<span class="kwrd">int</span>)targetSearchArea.Y, 
        (<span class="kwrd">int</span>)targetSearchArea.Width, 
        (<span class="kwrd">int</span>)targetSearchArea.Height),
    System.Drawing.Imaging.ImageLockMode.ReadWrite, 
    m_lastBitmap.PixelFormat);


<span class="rem">/* Apply the AForge filter.  Doing it &quot;in place&quot; is more efficient as</span>
<span class="rem"> * new bitmap does not have to be allocated and copied */</span>
hsl.ApplyInPlace(bitmapData);</pre>
<p>So, what needs to be done now that we have a filtered image showing only a laser dot? The answer: Blob counting! A blob, in the context of video analytics, is a set of pixels that are all touching, and AForge comes with a class ready to tackle that too!</p>
<p>The AForge blob counter takes in a gray-scale image for processing, and then returns all blobs found in the image. The information included on a blob includes the rectangular pixel area where the laser was found in the video frame. The center of that area
 should be the center of our laser. It's important to note that if the HSL filter is improperly calibrated, we will get an overabundance of blobs and there will accordingly be no way we can tell if it is the laser point or not.</p>
<pre class="csharpcode"><span class="rem">/* Create an initialize our blob counter */</span>
var blobsCounter = <span class="kwrd">new</span> BlobCounter
    {
       FilterBlobs = <span class="kwrd">true</span>,
       ObjectsOrder = ObjectsOrder.Size,
       MinHeight = BlobMinimumHeight,
       MinWidth = BlobMinimumWidth,
       MaxWidth = 25,
       MaxHeight = 25
    };

<span class="rem">/* We first let the blob counter process our image */</span>
blobsCounter.ProcessImage(grayImage);

<span class="rem">/* Retrieve a list of blobs that were found */</span>
Blob[] blobs = blobsCounter.GetObjects(grayImage);</pre>
<p>The early laser tracking prototype. We can literally have it track anything, based off color.<a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0085.jpg"><img title="clip_image008[5]" border="0" alt="clip_image008[5]" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0085_thumb.jpg" width="275" height="397"></a></p>
<h3>Building the Laser Graffiti Application</h3>
<h4>Our Rocket Engine Needs a Rocket</h4>
<p>At this point, I had a working proof of concept and a laser tracker. What I needed now was an application to use it. You know, the laser-graffiti
<i>application</i>.</p>
<p>There are many ways to construct a WPF application and one pattern that's been getting a little bit of traction is MVVM. I chose to make a composite application using Prism and MVVM. Prism is a great guidance library pack for making composite WPF applications
 with tons of tools to help in common scenarios.</p>
<h4><i>Composite</i> What? Huh?</h4>
<p>When developing applications, usually of the larger variety, things can become complex. Complexity turns into a mess. A mess turns into time investment. Time investment turns into money. The more money spent, the fewer bonuses you will receive. To make sure
 we get that end-of-year pay raise, we want to control complexity from the get-go by making our code and our internal systems
<i>loosely coupled</i>. A composite application is just a collection of loosely coupled systems that is composited at runtime.</p>
<p>The advantages of a composite application are:</p>
<p>· Components can be developed independently</p>
<p>· Components can be swapped out more easily than if they were tightly coupled</p>
<p>· The application remains extendable, meaning you can more easily extend your application</p>
<p>· Maintenance is much clearer with less chance of breaking other components</p>
<p>· Unit testing is more feasible</p>
<h4>Composite Application Entrails</h4>
<p>There are many, many excellent resources about Prism available on the internet, so I'd rather not compete with them. I did, however, want to cover the basics, and at least how I've used it within the Laser Graffiti application.</p>
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0095.png"><img title="clip_image009[5]" border="0" alt="clip_image009[5]" align="right" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0095_thumb.png" width="230" height="146"></a></p>
<p><b>The Shell Assembly</b> – This contains the main entry point of the application and the initial or main UI container for the application. Before anything else, this assembly will initialize something called a bootstrapper. The bootstrapper simply does
 any pre-initialization that needs to be done before initializing the rest of the application.</p>
<p><b>Module Assemblies</b> – Each module assembly can be considered a <i>component</i>. The bootstrapper initializes each component and then the module spins up any application
<i>services</i> and adds any user interface to the shell. For instance, the MediaKit module handles the capture of the video and the AForgeModule handles the vision routines.</p>
<p><b>The Infrastructure Assembly</b> – This contains any base classes, well known/shared interfaces or general infrastructure code. Simply put, most if not all modules will have reference to this.</p>
<h3>Rendering the Graffiti</h3>
<p>I needed a way to draw the graffiti to a projector. Overall, this will be accomplished by drawing the graffiti to a window. The window will be set to
<i>maximized</i> with no border. I also needed to write the code to draw the graffiti. Initially, I just used the WPF InkCanvas control, but I found it wasn't well tuned for what I wanted to do with it. So, I decided XNA would give the most performance and
 flexibility with the level of effects desired for drawing graffiti.</p>
<p>I had never really done any XNA development, so this project is certainly not built using best practices. The important part to notice is that the project is more or less a regular XNA application with the exception that the executable is added as a library
 reference. This is because we instantiate the XNA from our WPF application's process. The following snippet of code accomplishes this:</p>
<pre class="csharpcode"><span class="kwrd">private</span> <span class="kwrd">void</span> ShowGraffitiWall(<span class="kwrd">bool</span> show)
{
    <span class="kwrd">if</span> (m_game != <span class="kwrd">null</span>)
        m_game.Exit();

    <span class="kwrd">if</span> (!show) 
        <span class="kwrd">return</span>;

    var t = <span class="kwrd">new</span> Thread((ThreadStart)<span class="kwrd">delegate</span>
    {
        m_game = <span class="kwrd">new</span> XnaGraffitiGame();
        m_game.SetScreen(m_lastScreen);
        m_game.Effect = m_lastGraffitiEffect;
        m_game.Run();
        m_game.Dispose();
    });

    t.SetApartmentState(ApartmentState.STA);
    t.IsBackground = <span class="kwrd">true</span>;
    t.Start();
}</pre>
<p>We instantiate the XNA window this way because it allows our WPF code to send the XNA messages of where the laser pointer was detected.</p>
<h4>Drawing with the GPU</h4>
<p>A blanket statement about XNA is that it is a drawing API. XNA applications can get quite complex when you add in things like 3D or shaders, but for this article, I'm only covering the required simple stuff. That said, I do make the assumption that the reader
 has had at least a few hours of XNA experience.</p>
<p>Our primary goal is to render virtual graffiti using XNA. This means we need to be able to draw a line. I started by creating a PNG file that would act as a “brush.” In XNA, these 2D graphics are also known as sprites. The brush sprite looks like this:</p>
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0115.png"><img title="clip_image011[5]" border="0" alt="clip_image011[5]" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0115_thumb.png" width="273" height="264"></a></p>
<p>Now we can use XNA's SpriteBatch class to draw our brush. The first problem I had, though, was that most XNA tutorials show drawing the sprite, continue, clear the screen, draw the sprite, continue, etc. I needed to retain previous brush strokes, which means
 drawing onto an intermediate drawing surface (RenderTarget2D), then drawing that to the screen.</p>
<p>The next issue I had was that the line I was trying to draw was very broken. See, the laser detection code runs at a maximum 30 FPS (the limit of my web camera). If I moved the laser fast enough, the screen would just look like a bunch of random points were
 being drawn. I had to move the laser very slowly to make it appear like a line. I remember reading an
<a href="http://www.cynergysystems.com/blogs/page/rickbarraza?entry=advanced_render_techniques_with_writeablebitmaps">
excellent article</a> detailing a project by Rick Barraza, which led me to <a href="http://www.cs.unc.edu/~mcmillan/comp136/Lecture6/Lines.html">
a link to some popular algorithms</a> for creating a line where your input is two, 2D points.</p>
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0125.gif"><img title="clip_image012[5]" border="0" alt="clip_image012[5]" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0125_thumb.gif" width="298" height="146"></a></p>
<p>So, drawing a line required only a simple, two-step process of A) getting a new point from laser detection, and B) drawing a line from last_laser_coordinate to current_laser_coordinate. After putting that together, we can now produce some useful looking
 graffiti!</p>
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0144.jpg"><img title="clip_image014[4]" border="0" alt="clip_image014[4]" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0144_thumb.jpg" width="401" height="302"></a></p>
<h4>Adding Crazy Graffiti Effects</h4>
<p>The excitement of drawing simple lines in XNA wore off pretty fast. After all, the GPU is capable of some pretty amazing things. What about drawing with fire? Fire isn't boring:</p>
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0164.jpg"><img title="clip_image016[4]" border="0" alt="clip_image016[4]" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0164_thumb.jpg" width="455" height="281"></a></p>
<p>The fire effect is done using a method slightly similar to the solid color sprite method described earlier. However, since it uses a particle system, the fire effect is much more complex. Each particle has its own shader to control position and color. With
 the time constraints of this project, I had modified code from this <a href="http://creators.xna.com/en-US/sample/particle3d">
XNA tutorial</a>. There weren't many changes from the tutorial's code, but a big hurdle was that the particles took 3D coordinates instead of the 2D coordinates I needed to draw the graffiti. I found a small snippet to handle that, though I was informed by
 other XNA gurus that there is an easier way to accomplish this. If you are curious, this is what it looks like (and it's not for the faint of heart):</p>
<pre class="csharpcode"><span class="kwrd">protected</span> Vector3 ScreenPointToVector3(Point coords)
{
    Matrix viewMatrix = 
        Matrix.CreateTranslation(0, -25, 0) *
        Matrix.CreateRotationY(
            MathHelper.ToRadians(CameraRotation)) *
        Matrix.CreateRotationX(
            MathHelper.ToRadians(CameraArc)) *
        Matrix.CreateLookAt(
            <span class="kwrd">new</span> Vector3(0, 0, -CameraDistance),
            <span class="kwrd">new</span> Vector3(0, 0, 0), 
            Vector3.Up);

    <span class="kwrd">float</span> aspectRatio = 
        (<span class="kwrd">float</span>)m_game.GraphicsDevice.Viewport.Width /
            (<span class="kwrd">float</span>)m_game.GraphicsDevice.Viewport.Height;

    Matrix projectionMatrix = 
        Matrix.CreatePerspectiveFieldOfView(
            MathHelper.PiOver4,
            aspectRatio,
            1, 10000);

    Vector3 nearScreenPoint = <span class="kwrd">new</span> Vector3(coords.X, coords.Y, 0);
    Vector3 farScreenPoint = <span class="kwrd">new</span> Vector3(coords.X, coords.Y, 1);
    Vector3 nearWorldPoint = 
        m_game.GraphicsDevice.Viewport.Unproject(
            nearScreenPoint, 
            projectionMatrix, 
            viewMatrix, 
            Matrix.Identity);
    Vector3 farWorldPoint = 
        m_game.GraphicsDevice.Viewport.Unproject(
            farScreenPoint, 
            projectionMatrix, 
            viewMatrix, 
            Matrix.Identity);

    Vector3 direction = farWorldPoint - nearWorldPoint;

    <span class="kwrd">float</span> zFactor = -nearWorldPoint.Z / direction.Z;
    Vector3 zeroWorldPoint = nearWorldPoint &#43; direction * zFactor;

    <span class="kwrd">return</span> zeroWorldPoint;
}</pre>
<h3>The End Result</h3>
<p>Web-camera device selection:</p>
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0204.jpg"><img title="clip_image020[4]" border="0" alt="clip_image020[4]" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0204_thumb.jpg" width="426" height="350"></a></p>
<p>Fine tuning the laser detection:</p>
<p><a href="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0224.jpg"><img title="clip_image022[4]" border="0" alt="clip_image022[4]" src="http://ecn.channel9.msdn.com/o9/c4fcontent/migration/10042066/clip_image0224_thumb.jpg" width="461" height="385"></a></p>
<h3>About Jeremiah</h3>
<p><a href="http://jmorrill.hjtcentral.com/">Jeremiah Morrill</a> is a software developer and 2010 MVP living in Las Vegas, Nevada. He owns a software company called HJT,
<a title="http://www.hjtcentral.com/" href="http://www.hjtcentral.com/">http://www.hjtcentral.com/</a>, with a couple partners. There he focuses on multimedia and rich user interfaces with WPF and Silverlight. Jeremiah spends a lot of his free time learning,
 listening and helping others in the online development communities.&nbsp; </p>
 <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:1516d45ea42c4399be2b9e7600c8f5c7">]]></description>
      <comments>http://channel9.msdn.com/coding4fun/articles/Building-the-Laser-Graffiti-System</comments>
      <itunes:summary>
Last year, Clint Rutkas contacted me about building a project involving lasers, graffiti and code. When you get a request like that, you never decline, especially when lasers are involved. The project requirements sounded quite simple: create an application
 that can, using a laser pointer as a virtual spray can, draw virtual graffiti on the side of a building. It sounded a little daunting to me at first, but after it was broken up into small digestible pieces, the project ended up not being very complicated.
Below is the basic hardware setup of the Laser Graffiti System.

Building a Laser Tracker Engine
Giving Sight to the Blind
The very first thing that needed to be proven was the ability to track a laser point. The most obvious solution was to give our application some vision with a webcam. Since this was going to be a WPF application, I decided to use my open-source project,
WPF MediaKit, which comes with a webcam control called the VideoCaptureElement.
At the time, VideoCaptureElement was not very robust, and it occurred to me that my control wasn&#39;t very useful beyond looking at your webcam in a WPF app! I needed a way to get high-performance access to every pixel of every frame the webcam spat out. This
 was a good time to add that ability and increase value in my project. Without getting into the gory details of DirectShow and p/invoke, I was able to add a hook to pass me the pixel buffer, where I would wrap it in a Bitmap class and raise an event for each
 frame.
The XAML required to get each video sample from the web camera.
&amp;lt;MediaKit:VideoCaptureElement LoadedBehavior=&amp;quot;Play&amp;quot;
    RenderOptions.BitmapScalingMode=&amp;quot;LowQuality&amp;quot;
    UnloadedBehavior=&amp;quot;Manual&amp;quot;
    DesiredPixelWidth=&amp;quot;{Binding DesiredPixelWidth}&amp;quot;
    DesiredPixelHeight=&amp;quot;{Binding DesiredPixelHeight}&amp;quot;
    VideoCaptureDevice=&amp;quot;{Binding SelectedItem, ElementName=videoCapDevices}&amp;quot;
    FPS=&amp;quot;30&amp;quot;
    EnableSampleGrabbing=&amp;quot;True&amp;quo</itunes:summary>
      <link>http://channel9.msdn.com/coding4fun/articles/Building-the-Laser-Graffiti-System</link>
      <pubDate>Fri, 23 Jul 2010 19:54:04 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/coding4fun/articles/Building-the-Laser-Graffiti-System</guid>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/c4f/images/10042066_100.jpg" height="75" width="100"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/c4f/images/10042066_220.jpg" height="165" width="220"/>      
      <dc:creator>Jeremiah Morrill</dc:creator>
      <itunes:author>Jeremiah Morrill</itunes:author>
      <slash:comments>2</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/coding4fun/articles/Building-the-Laser-Graffiti-System/RSS</wfw:commentRss>
      <category>Hardware</category>
      <category>PDC</category>
      <category>WPF</category>
      <category>XNA</category>
      <category>Lasers</category>
      <category>audiovideo</category>
    </item>
  <item>
      <title>MSDN Radio: Exploring the Visual Studio Designer for WPF and Silverlight with Mark Wilson-Thomas</title>
      <description><![CDATA[Both Windows Presentation Foundation (WPF) and Microsoft&nbsp;Silverlight take advantage of a powerful new paradigm for declaratively creating user interfaces that leverage the graphics power innate in modern personal computers. As we move that same technology
 into the phone space and beyond we need developer tools that work the way we do. Microsoft Visual Studio has been evolving with the advances in WPF and Silverlight, and in the latest release includes a number of great facilities to simplify and improve productivity
 in the UI development process. Join us&nbsp;as we sit down with one of the primary drivers of these advances Mark Wilson-Thomas. He’s been active speaking at conferences around the world and comes to our studios to answer your questions.<br /><br />MSDN Radio is a weekly Developer talk-show that helps answer your questions about the latest Microsoft news, solutions, and technologies. We dive into the challenges of deciphering today’s technology stack. Visit
<a shape="rect" href="http://www.MSDNRadio.com" shape="rect">www.MSDNRadio.com</a> to register&nbsp;for upcoming shows.<br /><br /><p>Mark and the team would love to hear your feedback on the WPF and Silverlight Designer on their
<a shape="rect" href="http://social.msdn.microsoft.com/Forums/en-US/vswpfdesigner" shape="rect">
MSDN Forum</a>. You can also find a ton of great content about the designer on the team’s
<a shape="rect" href="http://blogs.msdn.com/wpfsldesigner/" shape="rect">Blog</a>. You can follow Mark on twitter
<a shape="rect" href="http://twitter.com/markpavwt" shape="rect">@MarkPavWT</a><br /><br /><strong>Host and Guest:</strong> Mike Benkovich, Senior Developer Evangelist, and Mark Wilson-Thomas, Program Manager, Microsoft Corporation<br /><br />Mike Benkovich delivers technical presentations around the U.S. as a developer tools evangelist on the MSDN team at Microsoft. He has worked in a variety of professional roles, including architect, project manager, developer, and technical writer.<br /><br />Mark is a Program Manager on the &quot;Cider&quot; team, which builds the WPF and Silverlight Designers in Visual Studio. He is responsible for the layout and visual designer features of the designer. Prior to joining developer division Mark worked in Microsoft Services
 as a Development Lead, building large scale web-based UIs for the UK Government, the BBC and others.
</p>
 <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:c1c1d77f916a4aa3ab989dea00a5f35a">]]></description>
      <comments>http://channel9.msdn.com/Blogs/egibson/MSDN-Radio-Exploring-the-Visual-Studio-Designer-for-WPF-and-Silverlight-with-Mark-Wilson-Thomas</comments>
      <itunes:summary>Both Windows Presentation Foundation (WPF) and Microsoft&amp;nbsp;Silverlight take advantage of a powerful new paradigm for declaratively creating user interfaces that leverage the graphics power innate in modern personal computers. As we move that same technology
 into the phone space and beyond we need developer tools that work the way we do. Microsoft Visual Studio has been evolving with the advances in WPF and Silverlight, and in the latest release includes a number of great facilities to simplify and improve productivity
 in the UI development process. Join us&amp;nbsp;as we sit down with one of the primary drivers of these advances Mark Wilson-Thomas. He’s been active speaking at conferences around the world and comes to our studios to answer your questions.MSDN Radio is a weekly Developer talk-show that helps answer your questions about the latest Microsoft news, solutions, and technologies. We dive into the challenges of deciphering today’s technology stack. Visit
www.MSDNRadio.com to register&amp;nbsp;for upcoming shows.Mark and the team would love to hear your feedback on the WPF and Silverlight Designer on their

MSDN Forum. You can also find a ton of great content about the designer on the team’s
Blog. You can follow Mark on twitter
@MarkPavWTHost and Guest: Mike Benkovich, Senior Developer Evangelist, and Mark Wilson-Thomas, Program Manager, Microsoft CorporationMike Benkovich delivers technical presentations around the U.S. as a developer tools evangelist on the MSDN team at Microsoft. He has worked in a variety of professional roles, including architect, project manager, developer, and technical writer.Mark is a Program Manager on the &amp;quot;Cider&amp;quot; team, which builds the WPF and Silverlight Designers in Visual Studio. He is responsible for the layout and visual designer features of the designer. Prior to joining developer division Mark worked in Microsoft Services
 as a Development Lead, building large scale web-based UIs for the UK Government, the BB</itunes:summary>
      <itunes:duration>1878</itunes:duration>
      <link>http://channel9.msdn.com/Blogs/egibson/MSDN-Radio-Exploring-the-Visual-Studio-Designer-for-WPF-and-Silverlight-with-Mark-Wilson-Thomas</link>
      <pubDate>Fri, 25 Jun 2010 20:03:00 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/egibson/MSDN-Radio-Exploring-the-Visual-Studio-Designer-for-WPF-and-Silverlight-with-Mark-Wilson-Thomas</guid>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/previewImages/100/557265_100x75.jpg" height="75" width="100"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/previewImages/220/557265_220x165.jpg" height="165" width="220"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/5/6/2/7/5/5/MSDNRadioVisualStudio_320_ch9.png" height="240" width="320"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/5/6/2/7/5/5/MSDNRadioVisualStudio_512_ch9.png" height="384" width="512"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/5/6/2/7/5/5/MSDNRadioVisualStudio_85_ch9.png" height="64" width="85"/>
      <media:group>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/5/6/2/7/5/5/MSDNRadioVisualStudio_2MB_ch9.wmv" expression="full" duration="1878" fileSize="674200693" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/5/6/2/7/5/5/MSDNRadioVisualStudio_ch9.mp3" expression="full" duration="1878" fileSize="15028390" type="audio/mp3" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/5/6/2/7/5/5/MSDNRadioVisualStudio_ch9.mp4" expression="full" duration="1878" fileSize="333952473" type="video/mp4" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/5/6/2/7/5/5/MSDNRadioVisualStudio_ch9.wma" expression="full" duration="1878" fileSize="15202213" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/5/6/2/7/5/5/MSDNRadioVisualStudio_ch9.wmv" expression="full" duration="1878" fileSize="405567825" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/5/6/2/7/5/5/MSDNRadioVisualStudio_Zune_ch9.wmv" expression="full" duration="1878" fileSize="259183877" type="video/x-ms-wmv" medium="video"/>
      </media:group>      
      <enclosure url="http://ecn.channel9.msdn.com/o9/ch9/5/6/2/7/5/5/MSDNRadioVisualStudio_ch9.wmv" length="405567825" type="video/x-ms-wmv"/>
      <dc:creator>MSDN Online Media</dc:creator>
      <itunes:author>MSDN Online Media</itunes:author>
      <slash:comments>1</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/egibson/MSDN-Radio-Exploring-the-Visual-Studio-Designer-for-WPF-and-Silverlight-with-Mark-Wilson-Thomas/RSS</wfw:commentRss>
      <category>DPEField</category>
      <category>Mark Wilson-Thomas</category>
      <category>MSDNRadio</category>
      <category>Silverlight</category>
      <category>Silverlight 4</category>
      <category>talk-radio</category>
      <category>Visual Studio</category>
      <category>Visual Studio 2010</category>
      <category>Windows Phone</category>
      <category>Windows Presenation Foundation</category>
      <category>WPF</category>
      <category>WPF 4</category>
    </item>
  <item>
      <title>Sharing Your Windows Experience Index with WEI Share</title>
      <description><![CDATA[<a shape="rect" href="http://windowsteamblog.com/members/Brandon-LeBlanc/" shape="rect">Brandon LeBlanc</a>&nbsp;from&nbsp;<a shape="rect" href="http://windowsteamblog.com/" shape="rect">The Windows Blog</a> and I talk about using the Azure service WEIShare.net
 to capture scores from your Windows Experience Index.  <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:dc5c4fb48c8e4c659f1e9dea00a208e8">]]></description>
      <comments>http://channel9.msdn.com/Blogs/LarryLarsen/Sharing-Your-Windows-Experience-Index-with-WEI-Share</comments>
      <itunes:summary>Brandon LeBlanc&amp;nbsp;from&amp;nbsp;The Windows Blog and I talk about using the Azure service WEIShare.net
 to capture scores from your Windows Experience Index. </itunes:summary>
      <itunes:duration>364</itunes:duration>
      <link>http://channel9.msdn.com/Blogs/LarryLarsen/Sharing-Your-Windows-Experience-Index-with-WEI-Share</link>
      <pubDate>Wed, 16 Jun 2010 20:23:00 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/LarryLarsen/Sharing-Your-Windows-Experience-Index-with-WEI-Share</guid>
      <media:thumbnail url="http://media.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3_100_ch9.jpg" height="75" width="100"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3_220_ch9.jpg" height="165" width="220"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3_512_ch9.jpg" height="384" width="512"/>
      <media:thumbnail url="http://media.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3_custom_ch9.jpg" height="384" width="512"/>
      <media:group>
        <media:content url="http://media.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3_2MB_ch9.wmv" expression="full" duration="364" fileSize="79769577" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3_ch9.mp3" expression="full" duration="364" fileSize="2917089" type="audio/mp3" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3_ch9.wma" expression="full" duration="364" fileSize="2954905" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://media.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3_ch9.wmv" expression="full" duration="364" fileSize="45831615" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3_high_ch9.mp4" expression="full" duration="364" fileSize="119233021" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3_low_ch9.mp4" expression="full" duration="364" fileSize="22231234" type="video/mp4" medium="video"/>
        <media:content url="http://media.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3_Zune_ch9.wmv" expression="full" duration="364" fileSize="41447670" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://smooth.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3.ism/manifest" expression="full" duration="364" fileSize="6006" type="video/x-ms-wmv" medium="video"/>
      </media:group>      
      <enclosure url="http://media.ch9.ms/ch9/08E8/DC5C4FB4-8C8E-4C65-9F1E-9DEA00A208E8/WEIShare3_ch9.wmv" length="45831615" type="video/x-ms-wmv"/>
      <dc:creator>Larry Larsen</dc:creator>
      <itunes:author>Larry Larsen</itunes:author>
      <slash:comments>0</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/LarryLarsen/Sharing-Your-Windows-Experience-Index-with-WEI-Share/RSS</wfw:commentRss>
      <category>Azure</category>
      <category>Hardware</category>
      <category>Silverlight</category>
      <category>SQL Azure</category>
      <category>Windows 7</category>
      <category>WPF</category>
    </item>
  <item>
      <title>Well-Timed Technology Update on Windows 7</title>
      <description><![CDATA[
<p>Jason De Lorme speaks with Raja Tummla about the Windows 7 features that&nbsp;<a shape="rect" href="http://www.eagleinvsys.com/Pages/Default.aspx" shape="rect">Eagle Investments</a> is leveraging in their NxG application.&nbsp; Eagle was in a position to update their
 technology architecture, and this dovetailed nicely with the advent of new UI features in Windows 7.&nbsp; Raja describes for us how they leaped forward with .NET and Windows 7.<br /><br />Enjoy the show!</p>
<p>John O'Donnell Microsoft Dynamics ISV Architect Evangelist<br />Microsoft Corporation<br /><a shape="rect" href="http://blogs.msdn.com/jodonnell" shape="rect">http://blogs.msdn.com/jodonnell</a><br /><a shape="rect" href="http://blogs.msdn.com/usisvde" shape="rect">http://blogs.msdn.com/usisvde</a><br /><a shape="rect" href="http://www.twitter.com/jodonnel" shape="rect">http://www.twitter.com/jodonnel</a>
</p>
 <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:b8e8ea2125af4160993e9dea00a16ba8">]]></description>
      <comments>http://channel9.msdn.com/Blogs/jodonnell/Well-Timed-Technology-Update-on-Windows-7</comments>
      <itunes:summary>
Jason De Lorme speaks with Raja Tummla about the Windows 7 features that&amp;nbsp;Eagle Investments is leveraging in their NxG application.&amp;nbsp; Eagle was in a position to update their
 technology architecture, and this dovetailed nicely with the advent of new UI features in Windows 7.&amp;nbsp; Raja describes for us how they leaped forward with .NET and Windows 7.Enjoy the show!
John O&#39;Donnell Microsoft Dynamics ISV Architect EvangelistMicrosoft Corporationhttp://blogs.msdn.com/jodonnellhttp://blogs.msdn.com/usisvdehttp://www.twitter.com/jodonnel

</itunes:summary>
      <itunes:duration>191</itunes:duration>
      <link>http://channel9.msdn.com/Blogs/jodonnell/Well-Timed-Technology-Update-on-Windows-7</link>
      <pubDate>Wed, 16 Jun 2010 02:14:00 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/jodonnell/Well-Timed-Technology-Update-on-Windows-7</guid>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/previewImages/100/556194_100x75.jpg" height="75" width="100"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/previewImages/220/556194_220x165.jpg" height="165" width="220"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/4/9/1/6/5/5/Eagle_320_ch9.png" height="240" width="320"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/4/9/1/6/5/5/Eagle_512_ch9.png" height="384" width="512"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/4/9/1/6/5/5/Eagle_85_ch9.png" height="64" width="85"/>
      <media:group>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/1/6/5/5/Eagle_2MB_ch9.wmv" expression="full" duration="191" fileSize="12451147" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/1/6/5/5/Eagle_ch9.mp3" expression="full" duration="191" fileSize="1532802" type="audio/mp3" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/1/6/5/5/Eagle_ch9.mp4" expression="full" duration="191" fileSize="22199343" type="video/mp4" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/1/6/5/5/Eagle_ch9.wma" expression="full" duration="191" fileSize="1555041" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/1/6/5/5/Eagle_ch9.wmv" expression="full" duration="191" fileSize="30808207" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/1/6/5/5/Eagle_Zune_ch9.wmv" expression="full" duration="191" fileSize="22936259" type="video/x-ms-wmv" medium="video"/>
      </media:group>      
      <enclosure url="http://ecn.channel9.msdn.com/o9/ch9/4/9/1/6/5/5/Eagle_ch9.wmv" length="30808207" type="video/x-ms-wmv"/>
      <dc:creator>John O&#39;Donnell</dc:creator>
      <itunes:author>John O&#39;Donnell</itunes:author>
      <slash:comments>0</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/jodonnell/Well-Timed-Technology-Update-on-Windows-7/RSS</wfw:commentRss>
      <category>2010</category>
      <category>Eagle Investments</category>
      <category>Jump Lists</category>
      <category>Task Bar Progress</category>
      <category>Windows 7</category>
      <category>WPF</category>
    </item>
  <item>
      <title>WEI Share: Share your Windows 7 Experience Index</title>
      <description><![CDATA[<a shape="rect" href="http://www.weishare.net/" shape="rect">WEI Share</a>&nbsp;(&quot;We Share&quot;) is a&nbsp;<a shape="rect" href="http://www.coding4fun.com/" shape="rect">Coding4Fun</a> code sample that takes your&nbsp;<a shape="rect" href="http://windows.microsoft.com/en-us/windows7/products/features/windows-experience-index" shape="rect">Windows Experience Index</a> score and shares it with the world (anonymously) to an Azure website with a Silverlight front end and lets you post your WEI score to Facebook for bragging rights. <br><br>Why would you want to share your WEI score with the world? First, this gives us a place to compare WEI scores across a wide range of hardware and even see how many touch points a multitouch computer may give you. Second, a computer's speed is&nbsp;dependent on the efficiency of the drivers. Sometimes WEI scores go up, sometimes they go down. This will allow you to judge the score that various versions of a driver may give you. <br><br>You can run WEI Share at <a shape="rect" href="http://www.weishare.net/" shape="rect">www.WEIShare.net</a> and download the source code at <a shape="rect" href="http://weishare.codeplex.com/" shape="rect">WEIShare.codeplex.com</a>&nbsp;(coming later this week).  <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:d99ed630e02a4ff1b35f9e1001029e35">]]></description>
      <comments>http://channel9.msdn.com/Blogs/LarryLarsen/WEI-Share-Share-your-Windows-7-Experience-Index</comments>
      <itunes:summary>WEI Share&amp;nbsp;(&amp;quot;We Share&amp;quot;) is a&amp;nbsp;Coding4Fun code sample that takes your&amp;nbsp;Windows Experience Index score and shares it with the world (anonymously) to an Azure website with a Silverlight front end and lets you post your WEI score to Facebook for bragging rights. Why would you want to share your WEI score with the world? First, this gives us a place to compare WEI scores across a wide range of hardware and even see how many touch points a multitouch computer may give you. Second, a computer&#39;s speed is&amp;nbsp;dependent on the efficiency of the drivers. Sometimes WEI scores go up, sometimes they go down. This will allow you to judge the score that various versions of a driver may give you. You can run WEI Share at www.WEIShare.net and download the source code at WEIShare.codeplex.com&amp;nbsp;(coming later this week). </itunes:summary>
      <itunes:duration>197</itunes:duration>
      <link>http://channel9.msdn.com/Blogs/LarryLarsen/WEI-Share-Share-your-Windows-7-Experience-Index</link>
      <pubDate>Thu, 10 Jun 2010 17:56:00 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/LarryLarsen/WEI-Share-Share-your-Windows-7-Experience-Index</guid>
      <media:group>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_ch9.mp3" expression="full" duration="197" fileSize="1578156" type="audio/mp3" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_ch9.mp4" expression="full" duration="197" fileSize="25997970" type="video/mp4" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_ch9.mp4" expression="full" duration="197" fileSize="25997970" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_ch9.wma" expression="full" duration="197" fileSize="1600101" type="audio/x-ms-wma" medium="audio"/>
      </media:group>      
      <enclosure url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_ch9.mp4" length="25997970" type="video/x-ms-wmv"/>
      <dc:creator>Larry Larsen</dc:creator>
      <itunes:author>Larry Larsen</itunes:author>
      <slash:comments>0</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/LarryLarsen/WEI-Share-Share-your-Windows-7-Experience-Index/RSS</wfw:commentRss>
      <category>Azure</category>
      <category>DIY</category>
      <category>Hardware</category>
      <category>Silverlight 3</category>
      <category>SQL Azure</category>
      <category>Windows 7</category>
      <category>WPF</category>
    </item>
  <item>
      <title>WEI Share: Share your Windows 7 Experience Index</title>
      <description><![CDATA[<a shape="rect" href="http://www.weishare.net" shape="rect">WEI Share</a>&nbsp;(&quot;We Share&quot;) is a&nbsp;<a shape="rect" href="http://www.coding4fun.com" shape="rect">Coding4Fun</a> code sample that takes your&nbsp;<a shape="rect" href="http://windows.microsoft.com/en-us/windows7/products/features/windows-experience-index" shape="rect">Windows
 Experience Index</a> score and shares it with the world (anonymously) to an Azure website with a Silverlight front end and lets you post your WEI score to Facebook for bragging rights.
<br /><br />Why would you want to share your WEI score with the world? First, this gives us a place to compare WEI scores across a wide range of hardware and even see how many touch points a multitouch computer may give you. Second, a computer's speed is&nbsp;dependent on the
 efficiency of the drivers. Sometimes WEI scores go up, sometimes they go down. This will allow you to judge the score that various versions of a driver may give you.
<br /><br />You can run WEI Share at <a shape="rect" href="http://www.WEIShare.net" shape="rect">
www.WEIShare.net</a> and download the source code at <a shape="rect" href="http://WEIShare.codeplex.com" shape="rect">
WEIShare.codeplex.com</a>&nbsp;(coming later this week).  <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/wpf/RSS&WT.dl=0&WT.entryid=Entry:RSSView:81ebaed1318d47deb8419dea00a20ee2">]]></description>
      <comments>http://channel9.msdn.com/Blogs/LarryLarsen/WEI-Share-Share-you-Windows-7-Experience-Index</comments>
      <itunes:summary>WEI Share&amp;nbsp;(&amp;quot;We Share&amp;quot;) is a&amp;nbsp;Coding4Fun code sample that takes your&amp;nbsp;Windows
 Experience Index score and shares it with the world (anonymously) to an Azure website with a Silverlight front end and lets you post your WEI score to Facebook for bragging rights.
Why would you want to share your WEI score with the world? First, this gives us a place to compare WEI scores across a wide range of hardware and even see how many touch points a multitouch computer may give you. Second, a computer&#39;s speed is&amp;nbsp;dependent on the
 efficiency of the drivers. Sometimes WEI scores go up, sometimes they go down. This will allow you to judge the score that various versions of a driver may give you.
You can run WEI Share at 
www.WEIShare.net and download the source code at 
WEIShare.codeplex.com&amp;nbsp;(coming later this week). </itunes:summary>
      <itunes:duration>197</itunes:duration>
      <link>http://channel9.msdn.com/Blogs/LarryLarsen/WEI-Share-Share-you-Windows-7-Experience-Index</link>
      <pubDate>Tue, 08 Jun 2010 15:34:00 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/LarryLarsen/WEI-Share-Share-you-Windows-7-Experience-Index</guid>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/previewImages/100/554594_100x75.jpg" height="75" width="100"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/previewImages/220/554594_220x165.jpg" height="165" width="220"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_320_ch9.png" height="240" width="320"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_512_ch9.png" height="384" width="512"/>
      <media:thumbnail url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_85_ch9.png" height="64" width="85"/>
      <media:group>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_2MB_ch9.wmv" expression="full" duration="197" fileSize="129809747" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_ch9.mp3" expression="full" duration="197" fileSize="1578156" type="audio/mp3" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_ch9.mp4" expression="full" duration="197" fileSize="25997970" type="video/mp4" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_ch9.wma" expression="full" duration="197" fileSize="1600101" type="audio/x-ms-wma" medium="audio"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_ch9.wmv" expression="full" duration="197" fileSize="40728277" type="video/x-ms-wmv" medium="video"/>
        <media:content url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_Zune_ch9.wmv" expression="full" duration="197" fileSize="27608329" type="video/x-ms-wmv" medium="video"/>
      </media:group>      
      <enclosure url="http://ecn.channel9.msdn.com/o9/ch9/4/9/5/4/5/5/weishare3_ch9.wmv" length="40728277" type="video/x-ms-wmv"/>
      <dc:creator>Larry Larsen</dc:creator>
      <itunes:author>Larry Larsen</itunes:author>
      <slash:comments>14</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/LarryLarsen/WEI-Share-Share-you-Windows-7-Experience-Index/RSS</wfw:commentRss>
      <category>Azure</category>
      <category>DIY</category>
      <category>Hardware</category>
      <category>Silverlight 3</category>
      <category>SQL Azure</category>
      <category>Windows 7</category>
      <category>WPF</category>
    </item>    
</channel>
</rss>
