<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Rob's Rhapsody : Macros</title><link>http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx</link><description>Tags: Macros</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Macro of the Day: Disable Cap [textInDocument]</title><link>http://blogs.msdn.com/robch/archive/2008/11/19/macro-of-the-day-disable-cap-textindocument.aspx</link><pubDate>Thu, 20 Nov 2008 08:20:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9127446</guid><dc:creator>robch</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/robch/comments/9127446.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=9127446</wfw:commentRss><description>&lt;p&gt;A reader recently &lt;a href="mailto:listen@microsoft.com"&gt;wrote to us&lt;/a&gt; here at Microsoft, and asked us if there was a way to disable the built in command for &amp;quot;Cap [textInDocument]&amp;quot;. &lt;/p&gt;  &lt;p&gt;Sometimes, for some people, this command can be recognized a little too easily if you're actually trying to insert text that already exists in the document. So ... I thought ... Time for another Macro of the Day!&lt;/p&gt;  &lt;p&gt;You can disable the built-in command once this macro is in place by saying &amp;quot;Disable Cap [textInDocument]&amp;quot;. You can re-enable it by saying &amp;quot;Enable Cap [textInDocument]&amp;quot;.&lt;/p&gt;  &lt;p&gt;You can download it &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=wsrmacros&amp;amp;DownloadId=3852"&gt;here&lt;/a&gt; in our &lt;a href="http://code.msdn.microsoft.com/wsrmacros"&gt;macro code gallery&lt;/a&gt;, or just take a look at it here:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;speechMacros&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;!-- &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Author:&amp;#160; Rob Chambers [MSFT]     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Contact: listen@microsoft.com &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ================     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; What can I say?      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ================ &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Disable Cap textInDocument     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Enable Cap textInDocument &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ================     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; How does it work      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ================&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For some people, at sometimes, one of the the built-in     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Vista commands (&amp;quot;Cap [textInDocument]&amp;quot;) gets accidentally      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; recognized when it shouldn't. &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; This macro is a work around for that problem. It &amp;quot;hijacks&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; the recognition for &amp;quot;Cap [textInDocument]&amp;quot; (if the command      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; is enabled) and instead just inserts the text in the document. &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; The macro also demonstrates how to have another set of      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; commands that enables and disables a 3rd command...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;lt;listenFor&amp;gt;Disable cap text in document&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;lt;setState name=&amp;quot;disableCapTextInDocument&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;lt;listenFor&amp;gt;Enable cap text in document&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;lt;setState name=&amp;quot;disableCapTextInDocument&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;command priority=&amp;quot;100&amp;quot;&amp;gt;     &lt;br /&gt;&amp;lt;stateIsSet name=&amp;quot;disableCapTextInDocument&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;lt;listenFor&amp;gt;cap [textInDocument]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;lt;setTextFeedback&amp;gt;Inserting text. Say Enable &amp;quot;Cap [textInDocument]&amp;quot; to re-enable...&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;lt;insertText&amp;gt;{[textInDocument]}&amp;lt;/insertText&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;/speechMacros&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9127446" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Macro of the Day: Microphone Control</title><link>http://blogs.msdn.com/robch/archive/2008/11/07/macro-of-the-day-microphone-control.aspx</link><pubDate>Sat, 08 Nov 2008 00:36:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9053108</guid><dc:creator>robch</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/robch/comments/9053108.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=9053108</wfw:commentRss><description>&lt;p&gt;I've got two microphones that I use most of the time.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;An Andrea SoundMAX SuperBeam 2 element array-microphone from Andrea Electronics&lt;/li&gt;    &lt;li&gt;An xTag wireless microphone from RevoLabs&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I really love both of them, and I use them interchangeably throughout the day. &lt;/p&gt;  &lt;p&gt;If I'm doing quick command and control stuff while I'm typing, I prefer to use the Andrea microphone. That way, I can just mash the &amp;lt;ctrl-windows&amp;gt; key, say what I want (like &amp;quot;Insert my public signature&amp;quot;) and wishes come true.&lt;/p&gt;  &lt;p&gt;However, if I'm a more relaxed position, doing dictation, or not sitting near my PC (I have a couch in my office :-)), I'll use my wireless xTag microphone.&lt;/p&gt;  &lt;p&gt;But ... Having two different microphones causes me a bit of a problem sometimes. I have to actually switch back and forth between the two microphones. That's certainly possible in Vista with Windows Speech Recognition, but it's not as easy as I wanted it to be. &lt;/p&gt;  &lt;p&gt;Thus ... A new &amp;quot;Macro of the day!&amp;quot; was born.&lt;/p&gt;  &lt;p&gt;Today's macro allows you to say one of the following things:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Microphone     &lt;br /&gt;Switch microphone &lt;/p&gt;    &lt;p&gt;[microphone] microphone     &lt;br /&gt;Switch to [microphone]      &lt;br /&gt;Switch to [microphone] microphone &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The first two commands will simply bring up a dialog and let you pick which microphone you want to use. The 2nd group of commands will automatically switch to the microphone you want by simply by saying &amp;quot;Andrea microphone&amp;quot;, or &amp;quot;xTag microphone&amp;quot;. &lt;/p&gt;  &lt;p&gt;Now... I till have to use one of the microphones to switch to the other one, but now it's a seamless transfer. &lt;/p&gt;  &lt;p&gt;Here's the macro both in copy/paste form, as well as a direct link to my macro library on MSDN &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=wsrmacros&amp;amp;DownloadId=3711"&gt;here&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&amp;lt;speechMacros&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; &amp;lt;!-- &lt;/p&gt;  &lt;p&gt;&amp;#160; Author:&amp;#160; Rob Chambers [MSFT]   &lt;br /&gt;&amp;#160; Contact: listen@microsoft.com &lt;/p&gt;  &lt;p&gt;&amp;#160; ================   &lt;br /&gt;&amp;#160; What can I say?    &lt;br /&gt;&amp;#160; ================ &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Microphone   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Switch microphone &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; [microphone] microphone   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Switch to [microphone]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Switch to [microphone] microphone &lt;/p&gt;  &lt;p&gt;&amp;#160; ================   &lt;br /&gt;&amp;#160; How does it work    &lt;br /&gt;&amp;#160; ================    &lt;br /&gt;&amp;#160; This macro demonstrates how to build a dynamic rule based on    &lt;br /&gt;&amp;#160; the audio inputs that the Speech API (SAPI) knows to exist    &lt;br /&gt;&amp;#160; on the PC. &lt;/p&gt;  &lt;p&gt;&amp;#160; Upon recognition, it will disambiguate the microphone name   &lt;br /&gt;&amp;#160; if it's ambiguous (or not included in the phrase), and then    &lt;br /&gt;&amp;#160; ultimately set the current microphone to use. &lt;/p&gt;  &lt;p&gt;&amp;#160; --&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;command priority=&amp;quot;100&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Microphone&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;*+ microphone&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;[microphone] microphone&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Switch microphone&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Switch to *+ microphone&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Switch to [microphone] ?microphone&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;disambiguate title=&amp;quot;Which microphone do you want to use?&amp;quot; prompt=&amp;quot;Choose a Microphone&amp;quot; timeout=&amp;quot;15&amp;quot; propname=&amp;quot;TokenId&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[ &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Get the token id that was stored as a semantic property in the populated by script below,   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' as well as the text that was spoken in this utterance that generated the token id semantic property    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strMicrophoneTokenId = &amp;quot;{[TokenId]}&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strMicrophoneName = &amp;quot;{[*TokenId]}&amp;quot; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If there was no matching microphone spoken (e.g. if the user just said, &amp;quot;Microphone&amp;quot;)&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (strMicrophoneTokenId = &amp;quot;&amp;quot;) Then &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the rule generator script below, and tell it to update the list of microhpones on teh system   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set audioInputs = CommandSet.RuleGenerators(&amp;quot;microphone&amp;quot;).Script.UpdateMicrophones() &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Loop thru each of those inputs, and prepare to ask the user which to use with a ChooseForList object   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For i = 0 to audioInputs.Count - 1    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call ChooseFromList.Items.AddItem(audioInputs(i).Phrase, audioInputs(i).Property)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Go ahead and ask the user which microhpone to use    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; audioInputIndex = ChooseFromList.Choose(&amp;quot;Change the default audio input from &amp;quot; + Result.RecoContext.Recognizer.AudioInput.GetDescription() + &amp;quot; to:&amp;quot;, &amp;quot;Change audio input&amp;quot;) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If the user made a selection, update the token id and what the text for that token is   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (audioInputIndex &amp;gt;= 0) Then    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strMicrophoneName = audioInputs(audioInputIndex).Phrase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strMicrophoneTokenId = audioInputs(audioInputIndex).Property    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If we know what microhone to switch to now...    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (strMicrophoneTokenId &amp;lt;&amp;gt; &amp;quot;&amp;quot;) Then &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Tell the speech ux to go to off mode (273 is WM_COMMAND, and 102 is &amp;quot;Off&amp;quot; for the speech ux in Vista)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call Application.SendMessage(&amp;quot;MS:SpeechTopLevel&amp;quot;, &amp;quot;&amp;quot;, 273, 102, 0) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Update the default for the input category to the new microphone token id   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Result.RecoContext.Recognizer.GetAudioInputs()(0).Category.Default = strMicrophoneTokenId    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Let the user know what we did, but automatically time out after 1 second    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call Application.Alert(&amp;quot;Switched to &amp;quot; &amp;amp; strMicrophoneName , &amp;quot;Microphone&amp;quot;, 1) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;   &lt;br /&gt;&amp;#160; &amp;lt;/script&amp;gt;    &lt;br /&gt;&amp;lt;/command&amp;gt;    &lt;br /&gt;&amp;lt;ruleScript name=&amp;quot;microphone&amp;quot; propname=&amp;quot;TokenId&amp;quot; language=&amp;quot;VBScript&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;![CDATA[ &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ' Update the list of Microphones right now   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Call UpdateMicrophones() &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Function UpdateMicrophones() &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Clear all the items in case we're updating the list   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call Rule.Items.RemoveAll &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Create a shared recognizer, get the audio inputs that recognizer can use   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' and add each of the inputs as a phrase to the rule (using the token id as the property)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set recognizer = CreateObject(&amp;quot;SAPI.SpSharedRecognizer&amp;quot;)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set audioInputs = recognizer.GetAudioInputs()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For i = 0 to audioInputs.Count - 1    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call Rule.Items.AddItem(audioInputs(i).GetDescription(), audioInputs.Item(i).Id, True)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Commit the changes to the rule now, and return the items to the caller. This enables   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' us the command's script to use this function to update the list and return the list    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' in a single call/function.    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call Rule.Commit    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set UpdateMicrophones = Rule.Items    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End Function &lt;/p&gt;  &lt;p&gt;&amp;#160; ]]&amp;gt;   &lt;br /&gt;&amp;lt;/ruleScript&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;/speechMacros&amp;gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9053108" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Macro of the Day: Math Test!</title><link>http://blogs.msdn.com/robch/archive/2008/09/11/macro-of-the-day-math-test.aspx</link><pubDate>Thu, 11 Sep 2008 17:33:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8944690</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/8944690.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8944690</wfw:commentRss><description>&lt;p&gt;One of the joys of being a parent is helping them learn. I'm very lucky, in that regard, because my kids love learning. In fact, my son Zac really loves Math. He gets that from both his Mom and his Dad. &lt;/p&gt;  &lt;p&gt;So, when he was a little guy, I made a Word Macro to make math work sheets. At first this was just for Addition. I'd load Word up, tell the macro that I wanted the work sheet to be for +1, it'd create 50 random +1 math problems, I'd print it out, give it to Zac, and he'd do it. We'd do that over and over until he was really good at +1. Then, we'd move on to +2. Etc. Etc. Once he'd mastered addition, I changed the math test to do a +1 through +9 review work sheets. He'd do that until he was really good at it. This progressed thru subtraction, then multiplication, and then division. Around the summer between 2nd and 3rd grade, he had all his math facts squarely mastered. &lt;/p&gt;  &lt;p&gt;All along, one of the challenges for him was actually writing the answers down on paper. It was certainly important that he get better at his dexterity, but it also skewed how well he knew the math facts. &lt;/p&gt;  &lt;p&gt;So ... Being the speech guy that I am, I always thought, &amp;quot;Hmm... Wouldn't it be cool if I wrote a Math Test program for him?&amp;quot; Then, a few years ago when we started developing the Windows Speech Recognition Macro system, I always had in the back of my mind, &amp;quot;Yeah... I should make a Math Test macro someday.&amp;quot;&lt;/p&gt;  &lt;p&gt;Last weekend, I finally decided to give that a go. About an hour later I had the basic macro done. You can download it &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=wsrmacros&amp;amp;DownloadId=2954"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;It's self documenting, but if you're a bit skeptic about reading XML, here's the gist of what you can say to start the math test (the rest of the math test should be self-explanatory):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Math Test &lt;/p&gt;    &lt;p&gt;Math Test [Plus/Minus/Times/Divided by] [0to9]     &lt;br /&gt;Math Test [Plus/Minus/Times/Divided by] [0to9] to [0to9] &lt;/p&gt;    &lt;p&gt;[0to99] problem [Addition/Subtraction/Multiplication/Division] Math Test      &lt;br /&gt;[0to99] problem [Addition/Subtraction/Multiplication/Division] Math Test [0to9] to [0to9] &lt;/p&gt;    &lt;p&gt;[0to99] problem Math Test [Plus/Minus/Times/Divided by] [0to9]     &lt;br /&gt;[0to99] problem Math Test [Plus/Minus/Times/Divided by] [0to9] to [0to9] &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="mailto:listen@microsoft.com?subject=Math%20Test%20Macro%20of%20the%20Day"&gt;Let me know&lt;/a&gt; what you think!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8944690" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Macro of the Day: Search Tivo for That!</title><link>http://blogs.msdn.com/robch/archive/2008/09/01/macro-of-the-day-search-tivo-for-that.aspx</link><pubDate>Tue, 02 Sep 2008 07:35:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8918840</guid><dc:creator>robch</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/robch/comments/8918840.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8918840</wfw:commentRss><description>&lt;p&gt;Every year in the Fall it's time for me to check out &lt;a href="http://www.tvpicks.net/"&gt;what's new on TV&lt;/a&gt;, and decide what, if anything, I'm going to start watching. This year's no different... &lt;/p&gt;  &lt;p&gt;Ah... Well ... It was actually different. This year, just a couple weeks ago, my Tivo completely died. I'd only had it for about 7 months, but it died. Oh well. It was under warranty. &lt;/p&gt;  &lt;p&gt;After a couple back-and-forths with &lt;a href="http://www.tivo.com"&gt;Tivo&lt;/a&gt; customer service, I was the proud owner of a brand new Tivo HD. But ... It didn't have any of my old recorded shows on it, nor did it have any of my programming on it. Sigh. &lt;/p&gt;  &lt;p&gt;If you've ever tried to setup a Tivo with your full schedule of what you watch, you'll probably already know, it's a lot of work to set it up. Especially from the remote control. But ... Tivo does have that fancy &lt;a href="http://www3.tivo.com/tivo-tco/index.do"&gt;Tivo Central Online&lt;/a&gt;, that allows you to use your web browser to find shows, and schedule them for recording.&lt;/p&gt;  &lt;p&gt;Cool! But ... that's still a lot of typing and going back and forth with my web browser. &lt;/p&gt;  &lt;p&gt;Or ... Is it? &lt;/p&gt;  &lt;p&gt;Nope! Not if you're using &lt;a href="http://download.speechmacros.com/"&gt;Windows Speech Recognition Macros&lt;/a&gt;! &lt;/p&gt;  &lt;p&gt;I just whipped up a quick macro that let's me say:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&amp;quot;Search Tivo for that&amp;quot;, or&lt;/li&gt;    &lt;li&gt;&amp;quot;Search Tivo for [...]&amp;quot;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I can say anything I want for the [...] part, too. &lt;/p&gt;  &lt;p&gt;Yeah!!! Now, I can set up my Tivo as easily as saying &amp;quot;Search Tivo for House&amp;quot;, or &amp;quot;Search Tivo for Prison Break&amp;quot;. Neat, eh?&lt;/p&gt;  &lt;p&gt;You too can set up your Tivo this fall, just as easily, by downloading today's Macro of the Day: &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=wsrmacros&amp;amp;DownloadId=2952"&gt;Search Tivo for That&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8918840" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>WSRMacros - A new MSDN Code Gallery for Speech Macros</title><link>http://blogs.msdn.com/robch/archive/2008/08/24/wsrmacros-a-new-msdn-code-gallery-for-speech-macros.aspx</link><pubDate>Mon, 25 Aug 2008 09:07:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8893372</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/8893372.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8893372</wfw:commentRss><description>&lt;p&gt;I've always wanted a good place to upload all my speech macros that I talk about on my Macro of the Day posts. And now ... Finally. I have a home for them.&lt;/p&gt;  &lt;p&gt;Check it out &lt;a href="http://code.msdn.microsoft.com/wsrmacros"&gt;here&lt;/a&gt;. Neat... &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8893372" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Speech Macro of the Day: Speech Dictionary</title><link>http://blogs.msdn.com/robch/archive/2008/08/02/speech-macro-of-the-day-speech-dictionary.aspx</link><pubDate>Sun, 03 Aug 2008 01:06:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8808773</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/8808773.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8808773</wfw:commentRss><description>&lt;p&gt;I get feedback from people, from time to time, that they'd like a more efficient way to add items to their speech dictionary. Although, there is a facility in Windows Speech Recognition already to do this, it's one word at a time, and it only allows you to record the pronunciation, not specify it yourself. &lt;/p&gt;  &lt;p&gt;So ... What do I do when I have request like this? I make a new macro of the day. Thus, today's speech macro of the day: Speech Dictionary.wsrMac&lt;/p&gt;  &lt;p&gt;First, if we're going to be messing around with the speech dictionary, it might be nice to see what's already in it... To do that, I made a command where I can say &amp;quot;Export the speech dictionary&amp;quot;, and it'll export all the words/phrases that have been customized into a text file, and then launch that text file for me to take a look at. Here's the command:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Export ?the speech dictionary&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fileName = &amp;quot;dictionary.txt&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lexToken = CreateObject(&amp;quot;SAPI.SpObjectToken&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lexToken.SetId(&amp;quot;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Speech\CurrentUserLexicon&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lex = lexToken.CreateInstance()      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set words = lex.GetWords(1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set fso = CreateObject(&amp;quot;Scripting.FileSystemObject&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set file = fso.CreateTextFile(fileName, 1) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each word in words     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (word.LangId = 1033) Then &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set prons = word.Pronunciations     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If prons.Count = 0 Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write word.Word &amp;amp; vbCrLf&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each pron in prons      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write word.Word &amp;amp; &amp;quot;/&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If pron.PartOfSpeech = 61440 Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write &amp;quot;BLOCKED&amp;quot; &amp;amp; vbCrLf      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write pron.Symbolic &amp;amp; vbCrLf      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Close      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.Run(fileName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As you can see, it uses a bunch of speech APIs that are already in Vista, that any application can take advantage of. The first 7 lines opens up the speech dictionary (aka User Lexicon), and also opens up a file (dictionary.txt) to stick the words in in a more human readable format. &lt;/p&gt;  &lt;p&gt;Then, for each word that it finds, it checks the language, and if it's 1033 (which means US English), it'll output the word into the file. But to do that, it needs to see how many pronunciations are available for each word. If there are zero, it'll just output the word. If there are more than one, it'll output one line per pronunciation. &lt;/p&gt;  &lt;p&gt;There's also a special case, where if the part of speech is &amp;quot;61440&amp;quot;, it outputs the word &amp;quot;BLOCKED&amp;quot;. &amp;quot;61440&amp;quot; is a special kind of part of speech that the underlying speech platform uses to tell the underlying speech engine, this word should be blocked and not recognized at any time. The &amp;quot;BLOCKED&amp;quot; convention is just one I made up for this macro. &lt;/p&gt;  &lt;p&gt;After looping thru all the words, it'll close the file, and launch the text file that was created. &lt;/p&gt;  &lt;p&gt;Here's a sample of what my speech dictionary looks like when I say &amp;quot;Export the speech dictionary&amp;quot;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Ima/BLOCKED     &lt;br /&gt;im/BLOCKED      &lt;br /&gt;Visual Studio/v ih zh uw l s t uw d iy ow      &lt;br /&gt;antidisestablishmentarianism/ae n t ay d ih s ih s t ae b l ih sh m ax n t eh r iy ax n ih z ax m      &lt;br /&gt;Rob Chambers      &lt;br /&gt;Itamar/ih d ae m aa r      &lt;br /&gt;Itamar/ih t ae m aa r      &lt;br /&gt;Zac Chambers      &lt;br /&gt;Nic Chambers      &lt;br /&gt;Bec Chambers      &lt;br /&gt;Jac Chambers&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The first few I've pasted here are words that the system has learned thru adaptation that I don't actually want it to use. Sometimes when I say &amp;quot;I am a GPM at Microsoft&amp;quot;, it thinks I'm saying Ima or im. Thus... The first time I saw that happen, I selected Ima, and blocked it from my dictionary. More on that in a second...&lt;/p&gt;  &lt;p&gt;Then, you can see for Visual Studio, I've actually got a full pronunciation listed. I probably don't have to, but it's here to show you that you can either have pronunciations listed, or not. Having it added as a single unit, ensures that when I say it, it'll always be cased properly. &lt;/p&gt;  &lt;p&gt;The next word, &amp;quot;antidisestablishmentarianism&amp;quot;, is one of the longest words in the English language, but it's not included in the speech dictionary by default. My son, Zac, loves this word, so of course I have to have it in my speech dictionary. &lt;/p&gt;  &lt;p&gt;Next, you can see my name is listed with no pronunciation. Since both my first and last name are also common words, I've added my name here as a single unit, so when I say &amp;quot;Rob Chambers&amp;quot;, I again get the proper casing. &lt;/p&gt;  &lt;p&gt;Next up, is Itamar, pronounced two different ways. One with a &amp;quot;d&amp;quot; sound and one with a &amp;quot;t&amp;quot; sound. This way, no matter how I end up saying it in a hurry, I can speak Itamar's name properly in email communication with Itamar. BTW ... If you don't know Itamar, you should check out his ms-speech forum on Yahoo! Groups. It's a great place to learn more about Microsoft Speech and speech recognition in general. &lt;/p&gt;  &lt;p&gt;Next up are the names of my kids. I have 4 boys, and they have short forms of more traditional names for their first names, so that their initials actually are the same as their first names. I played a bit too many video games as a kid, and RLC wasn't that cool for initials, compared with other kids in my neighborhood. My kids initials are the same as their names. It throws their teachers for a loop at first, but ... Well ... What can I say... I like it. So do they.&lt;/p&gt;  &lt;p&gt;OK, now that I've described the lines, let's talk about the format of the pronunciations for a minute. These pronunciations are an attempt at human readable form, but using the exact same form as the underlying speech platform. That brings me to the next command, &amp;quot;Show phonemes&amp;quot;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Show phonemes&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;run command=&amp;quot;&lt;a href="http://msdn.microsoft.com/en-us/library/ms717239(VS.85).aspx"/"&gt;http://msdn.microsoft.com/en-us/library/ms717239(VS.85).aspx&amp;quot;/&lt;/a&gt;&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Say it, and it'll take you to the page on MSDN that describes what the American English Phoneme Representation is for the Speech API.&lt;/p&gt;  &lt;p&gt;OK, now we're getting to the fun part. Now, let's say you wanted to add a new word. The command I'm about to show you, will let you say &amp;quot;Add that to the speech dictionary&amp;quot;, and it'll copy whatever word is selected in your document (using the Windows clipboard), and add it to the speech dictionary with no specific pronunciation. &lt;/p&gt;  &lt;p&gt;When I originally wrote this set of commands, I had 4 different commands. One for adding words, one for removing words, one for blocking them, and one for unblocking them. I quickly saw that they were all identical, so I made one command that can do any one of those 4 operations. Here's what it looks like with it's helper listenForList:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;[operationPhrase] ?for that ?from ?to the speech dictionary&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Speech Dictionary: {[operationPhrase]}&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Get the &amp;quot;that&amp;quot; text from the curent application...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SendKeys(&amp;quot;{250 WAIT}{{CTRL}}c{250 WAIT}&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; that = Application.clipboardData.GetData(&amp;quot;text&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Determine if we're adding prons, adding phrases, remove phrases, or blocking phrases     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; operation = &amp;quot;{[operation]}&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If we're adding a pron, we'll need to use the recognizer, otherwise we'll just need the lexicon&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set recognizer = CreateObject(&amp;quot;SAPI.SpSharedRecognizer&amp;quot;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lexToken = CreateObject(&amp;quot;SAPI.SpObjectToken&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lexToken.SetId(&amp;quot;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Speech\CurrentUserLexicon&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lex = lexToken.CreateInstance()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Keep track of how many words/phrases we added, and loop thru the lines in the &amp;quot;that&amp;quot;...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cWords = 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lineStartPos = 1      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Do &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the next line break     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lineSeperatorPos = InStr(lineStartPos, that, Chr(10))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (lineSeperatorPos = 0) Then lineSeperatorPos = Len(that) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the text for that line     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; thisLine = Mid(that, lineStartPos, lineSeperatorPos - lineStartPos + 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lineStartPos = lineStartPos + Len(thisLine) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Trim off the CR/LF     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Right(thisLine, 1) = Chr(10)) Then thisLine = Left(thisLine, Len(thisLine) - 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Right(thisLine, 1) = Chr(13)) Then thisLine = Left(thisLine, Len(thisLine) - 1) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If we have something to operate on     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (Len(Trim(thisLine)) &amp;gt; 0) Then &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Determine if there's a pronuncation included     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pronSeperatorPos = InStr(thisLine, &amp;quot;/&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (pronSeperatorPos = 0) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Perform the operation with no pronuncation      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call recognizer.DisplayUI(65552, thisLine, &amp;quot;AddRemoveWord&amp;quot;, thisLine)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call lex.AddPronunciation(thisLine, 1033, 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call lex.RemovePronunciation(thisLine, 1033, 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call lex.AddPronunciation(thisLine, 1033, 61440)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the pronuncation and collapse it      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; word = Left(thisLine, pronSeperatorPos - 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = Right(thisLine, Len(thisLine) - pronSeperatorPos)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = CollapsePron(pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Special case the &amp;quot;BLOCKED&amp;quot; pronuncation      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; partOfSpeech = 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If pron=&amp;quot;BLOCKED&amp;quot; Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; partOfSpeech = 61440      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = &amp;quot;&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Perform the operation with the pronuncation (and just continue if there's an error)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; On Error Resume Next&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call recognizer.DisplayUI(65552, word, &amp;quot;AddRemoveWord&amp;quot;, word)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call lex.AddPronunciation(word, 1033, partOfSpeech, pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call lex.RemovePronunciation(word, 1033, partOfSpeech, pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call lex.AddPronunciation(word, 1033, 61440, pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; On Error Goto 0&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cWords = cWords + 1 &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Loop while lineStartPos &amp;lt; Len(that) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Tell the user what we did...     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (cWords = 1) Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call Application.Alert(&amp;quot;Added pronunciation for &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call Application.Alert(&amp;quot;Added &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call Application.Alert(&amp;quot;Removed &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call Application.Alert(&amp;quot;Blocked &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call Application.Alert(&amp;quot;Added pronunciations for &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call Application.Alert(&amp;quot;Added &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call Application.Alert(&amp;quot;Removed &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call Application.Alert(&amp;quot;Blocked &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Function CollapsePron(pron) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = &amp;quot;&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insideBrackets = vbFalse      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For i = 1 to Len(pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (Not insideBrackets) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (Mid(pron, i, 1) = &amp;quot;[&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insideBrackets = vbTrue      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ElseIf (Mid(pron, i, 1) &amp;lt;&amp;gt; &amp;quot;/&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = ret &amp;amp; Mid(pron, i, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ElseIf (Mid(pron, i, 1) = &amp;quot;]&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insideBrackets = vbFalse      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CollapsePron = ret      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Function      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;and:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;listenForList name=&amp;quot;operationPhrase&amp;quot; propname=&amp;quot;operation&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;item propval=&amp;quot;addpron&amp;quot;&amp;gt;Add ?a pronunciation&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;item propval=&amp;quot;addpron&amp;quot;&amp;gt;Add ?a pron&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;item propval=&amp;quot;add&amp;quot;&amp;gt;Add&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;item propval=&amp;quot;remove&amp;quot;&amp;gt;Remove&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;item propval=&amp;quot;block&amp;quot;&amp;gt;Block&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;item propval=&amp;quot;remove&amp;quot;&amp;gt;Unblock&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;lt;/listenForList&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I'll leave the details on the specifics for an exercise for the readers. As a user of the macro, though, you can now say things like:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Add a pronunciation for that from the speech dictionary&amp;quot;,     &lt;br /&gt;&amp;quot;Add that to the speech dictionary&amp;quot;,      &lt;br /&gt;&amp;quot;Remove that from the speech dictionary&amp;quot;,      &lt;br /&gt;&amp;quot;Block that from the speech dictionary&amp;quot;, and      &lt;br /&gt;&amp;quot;Unblock that from the speech dictionary&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Your selection will have to be a single word/phrase, or multiple&amp;#160; words/phrases separated by line breaks. The word/phrases can also have a trailing pronunciation, similar in form to what you see in the output from &amp;quot;Export the speech dictionary&amp;quot;.&lt;/p&gt;  &lt;p&gt;&amp;quot;OK, but how can I generate those pronunciations myself?&amp;quot; Good question!&lt;/p&gt;  &lt;p&gt;Use this command:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Sounds like [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Insert sounds like [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[ &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SetTextFeedback(&amp;quot;Sounds like...&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set pc = CreateObject(&amp;quot;SAPI.SpPhoneConverter&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pc.LanguageId = 1033 &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = &amp;quot;/&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; firstElement = Result.PhraseInfo.Properties.Item(0).FirstElement      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; numberOfElements = Result.PhraseInfo.Properties.Item(0).NumberOfElements &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For i = 1 To numberOfElements     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set elem = Result.PhraseInfo.Elements.Item(firstElement + i - 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = pron &amp;amp; &amp;quot;[&amp;quot; &amp;amp; elem.LexicalForm &amp;amp; &amp;quot;]&amp;quot; &amp;amp; &amp;quot;/&amp;quot; &amp;amp; pc.IdToPhone(elem.Pronunciation) &amp;amp; &amp;quot; &amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.Wait(0.25)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SetTextFeedback(&amp;quot;Sounds like: &amp;quot; &amp;amp; pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.InsertText(pron) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This will use dictation to allow you to say &amp;quot;Sounds like Visual Studio&amp;quot;, and it'll output /[visual]/v ih zh uw l /[studio]/s t uw d iy ow. So, if you have a word that you're trying to add, you can use the built in pronunciations of other words that WSR already knows about, to cut and paste together your own pronunciation. &lt;/p&gt;  &lt;p&gt;Another way to do it would be to select the word of phrase you wanted to build a pronunciation for, and saying &amp;quot;What's that sound like?&amp;quot;, which is the final command we'll put into this macro:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;What's that sound like&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;What does that sound like&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[ &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SendKeys(&amp;quot;{250 WAIT}{{CTRL}}c{250 WAIT}&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; that = Application.clipboardData.GetData(&amp;quot;text&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.EmulateRecognition(&amp;quot;Go after that&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.EmulateRecognition(&amp;quot;Insert sounds like &amp;quot; &amp;amp; that) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That will copy the selection, move right after it, and then pretend you actually said it. For many words/phrases, this will work even if Windows Speech Recognition doesn't really know how to pronounce the word/phrase, because the system will make it's best guess on how to pronounce it just like it would if you were trying to click on that word on a web page with your voice. &lt;/p&gt;  &lt;p&gt;OK ... Now here's another command that will make your phrases a little shorter if you're actually using the commands inside Notepad.exe with the dictionary.txt file open:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;notepad.exe&amp;quot; windowTitleContains=&amp;quot;dictionary.txt&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;[operationPhrase] ?for that&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;emulateRecognition&amp;gt;{[operationPhrase]} that the speech dictionary&amp;lt;/emulateRecognition&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This basically only works when notepad is in focus, and it's editing dictionary.txt (as it would be when you've just said &amp;quot;Export the speech dictionary&amp;quot;. This will enable you to say simpler commands like:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Add a pronunciation for that&amp;quot;,     &lt;br /&gt;&amp;quot;Add that&amp;quot;,      &lt;br /&gt;&amp;quot;Remove that&amp;quot;,      &lt;br /&gt;&amp;quot;Block that&amp;quot;, and      &lt;br /&gt;&amp;quot;Unblock that&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here's the macro in complete form:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;speechMacros&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;!-- &lt;/p&gt;    &lt;p&gt;NOTE #1: The magic number 1033 represent en-us      &lt;br /&gt;NOTE #2: The magic number 6552 is a special hack to represent the desktop window handle (Validated on XP, and Vista)      &lt;br /&gt;NOTE #3: The magic number 61440 means that this &amp;quot;word/phrase&amp;quot; should be blocked &lt;/p&gt;    &lt;p&gt;--&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;command&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[operationPhrase] ?for that ?from ?to the speech dictionary&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Speech Dictionary: {[operationPhrase]}&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Get the &amp;quot;that&amp;quot; text from the curent application...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SendKeys(&amp;quot;{250 WAIT}{{CTRL}}c{250 WAIT}&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; that = Application.clipboardData.GetData(&amp;quot;text&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Determine if we're adding prons, adding phrases, remove phrases, or blocking phrases     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; operation = &amp;quot;{[operation]}&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If we're adding a pron, we'll need to use the recognizer, otherwise we'll just need the lexicon&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set recognizer = CreateObject(&amp;quot;SAPI.SpSharedRecognizer&amp;quot;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lexToken = CreateObject(&amp;quot;SAPI.SpObjectToken&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lexToken.SetId(&amp;quot;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Speech\CurrentUserLexicon&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lex = lexToken.CreateInstance()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Keep track of how many words/phrases we added, and loop thru the lines in the &amp;quot;that&amp;quot;...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cWords = 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lineStartPos = 1      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Do &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the next line break     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lineSeperatorPos = InStr(lineStartPos, that, Chr(10))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (lineSeperatorPos = 0) Then lineSeperatorPos = Len(that) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the text for that line     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; thisLine = Mid(that, lineStartPos, lineSeperatorPos - lineStartPos + 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lineStartPos = lineStartPos + Len(thisLine) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Trim off the CR/LF     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Right(thisLine, 1) = Chr(10)) Then thisLine = Left(thisLine, Len(thisLine) - 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Right(thisLine, 1) = Chr(13)) Then thisLine = Left(thisLine, Len(thisLine) - 1) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If we have something to operate on     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (Len(Trim(thisLine)) &amp;gt; 0) Then &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Determine if there's a pronuncation included     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pronSeperatorPos = InStr(thisLine, &amp;quot;/&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (pronSeperatorPos = 0) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Perform the operation with no pronuncation      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call recognizer.DisplayUI(65552, thisLine, &amp;quot;AddRemoveWord&amp;quot;, thisLine)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call lex.AddPronunciation(thisLine, 1033, 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call lex.RemovePronunciation(thisLine, 1033, 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call lex.AddPronunciation(thisLine, 1033, 61440)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the pronuncation and collapse it      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; word = Left(thisLine, pronSeperatorPos - 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = Right(thisLine, Len(thisLine) - pronSeperatorPos)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = CollapsePron(pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Special case the &amp;quot;BLOCKED&amp;quot; pronuncation      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; partOfSpeech = 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If pron=&amp;quot;BLOCKED&amp;quot; Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; partOfSpeech = 61440      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = &amp;quot;&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Perform the operation with the pronuncation (and just continue if there's an error)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; On Error Resume Next&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call recognizer.DisplayUI(65552, word, &amp;quot;AddRemoveWord&amp;quot;, word)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call lex.AddPronunciation(word, 1033, partOfSpeech, pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call lex.RemovePronunciation(word, 1033, partOfSpeech, pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call lex.AddPronunciation(word, 1033, 61440, pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; On Error Goto 0&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cWords = cWords + 1 &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Loop while lineStartPos &amp;lt; Len(that) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Tell the user what we did...     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (cWords = 1) Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call Application.Alert(&amp;quot;Added pronunciation for &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call Application.Alert(&amp;quot;Added &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call Application.Alert(&amp;quot;Removed &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call Application.Alert(&amp;quot;Blocked &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call Application.Alert(&amp;quot;Added pronunciations for &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call Application.Alert(&amp;quot;Added &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call Application.Alert(&amp;quot;Removed &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call Application.Alert(&amp;quot;Blocked &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Function CollapsePron(pron) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = &amp;quot;&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insideBrackets = vbFalse      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For i = 1 to Len(pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (Not insideBrackets) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (Mid(pron, i, 1) = &amp;quot;[&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insideBrackets = vbTrue      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ElseIf (Mid(pron, i, 1) &amp;lt;&amp;gt; &amp;quot;/&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = ret &amp;amp; Mid(pron, i, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ElseIf (Mid(pron, i, 1) = &amp;quot;]&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insideBrackets = vbFalse      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CollapsePron = ret      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Function      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Export ?the speech dictionary&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fileName = &amp;quot;dictionary.txt&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lexToken = CreateObject(&amp;quot;SAPI.SpObjectToken&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lexToken.SetId(&amp;quot;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Speech\CurrentUserLexicon&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lex = lexToken.CreateInstance()      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set words = lex.GetWords(1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set fso = CreateObject(&amp;quot;Scripting.FileSystemObject&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set file = fso.CreateTextFile(fileName, 1) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each word in words     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (word.LangId = 1033) Then &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set prons = word.Pronunciations     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If prons.Count = 0 Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write word.Word &amp;amp; vbCrLf&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each pron in prons      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write word.Word &amp;amp; &amp;quot;/&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If pron.PartOfSpeech = 61440 Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write &amp;quot;BLOCKED&amp;quot; &amp;amp; vbCrLf      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write pron.Symbolic &amp;amp; vbCrLf      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Close      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.Run(fileName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Sounds like [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Insert sounds like [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[ &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SetTextFeedback(&amp;quot;Sounds like...&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set pc = CreateObject(&amp;quot;SAPI.SpPhoneConverter&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pc.LanguageId = 1033 &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = &amp;quot;/&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; firstElement = Result.PhraseInfo.Properties.Item(0).FirstElement      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; numberOfElements = Result.PhraseInfo.Properties.Item(0).NumberOfElements &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For i = 1 To numberOfElements     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set elem = Result.PhraseInfo.Elements.Item(firstElement + i - 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = pron &amp;amp; &amp;quot;[&amp;quot; &amp;amp; elem.LexicalForm &amp;amp; &amp;quot;]&amp;quot; &amp;amp; &amp;quot;/&amp;quot; &amp;amp; pc.IdToPhone(elem.Pronunciation) &amp;amp; &amp;quot; &amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.Wait(0.25)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SetTextFeedback(&amp;quot;Sounds like: &amp;quot; &amp;amp; pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.InsertText(pron) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;What's that sound like&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;What does that sound like&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[ &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SendKeys(&amp;quot;{250 WAIT}{{CTRL}}c{250 WAIT}&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; that = Application.clipboardData.GetData(&amp;quot;text&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.EmulateRecognition(&amp;quot;Go after that&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.EmulateRecognition(&amp;quot;Insert sounds like &amp;quot; &amp;amp; that) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Show phonemes&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;run command=&amp;quot;&lt;a href="http://msdn.microsoft.com/en-us/library/ms717239(VS.85).aspx"/"&gt;http://msdn.microsoft.com/en-us/library/ms717239(VS.85).aspx&amp;quot;/&lt;/a&gt;&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;notepad.exe&amp;quot; windowTitleContains=&amp;quot;dictionary.txt&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[operationPhrase] ?for that&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;emulateRecognition&amp;gt;{[operationPhrase]} that the speech dictionary&amp;lt;/emulateRecognition&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;listenForList name=&amp;quot;operationPhrase&amp;quot; propname=&amp;quot;operation&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;addpron&amp;quot;&amp;gt;Add ?a pronunciation&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;addpron&amp;quot;&amp;gt;Add ?a pron&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;add&amp;quot;&amp;gt;Add&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;remove&amp;quot;&amp;gt;Remove&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;block&amp;quot;&amp;gt;Block&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;remove&amp;quot;&amp;gt;Unblock&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/listenForList&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;/speechMacros&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That's it! I know this is a lot of script to digest, but if you don't really want to, don't! Just use the macro as is. Questions? Comments? &lt;a href="mailto:listen@microsoft.com?subject=Macro of the day: Speech Dictionary"&gt;Let us know&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8808773" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Macro of the Day: Windows Media Player</title><link>http://blogs.msdn.com/robch/archive/2008/07/01/macro-of-the-day-windows-media-player.aspx</link><pubDate>Tue, 01 Jul 2008 19:24:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8677696</guid><dc:creator>robch</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/robch/comments/8677696.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8677696</wfw:commentRss><description>&lt;p&gt;Have you ever wanted to control your media player with your voice? Well now you can! With today’s Macro of the Day, you can say things like “Play Hotel California”, or “Play The Eagles”, or, “Play Genre Rock”, and even “Play something by The Eagles”.&lt;/p&gt;  &lt;p&gt;Today’s macro is one of the first Macros I created when we were developing WSR Macros, and I’ve tweaked it off and on for the last couple years. It’s currently in really good shape, and demonstrates some neat concepts like clarification, using named states, Jscript, and for the first time, it demonstrates the wmpMediaControl, wmpMediaPlay, and wmpMediaItems XML elements from the WSR Macro schema. &lt;/p&gt;  &lt;p&gt;Let’s take a look at the first command in the macro, and the one I use the most:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the artist [Artists]&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the band [Artists]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the group [Artists]&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Playing Artist {[*Artist]}&amp;lt;/setTextFeedback&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;disambiguate title=&amp;quot;Which artist do you want to play?&amp;quot; prompt=&amp;quot;Choose an Artist&amp;quot; timeout=&amp;quot;25&amp;quot; propname=&amp;quot;Artist&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeName&amp;quot; value=&amp;quot;Artist&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeValue&amp;quot; value=&amp;quot;{[*Artist]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrName&amp;quot; value=&amp;quot;WM/AlbumArtist&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrValue&amp;quot; value=&amp;quot;{[Artist]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;emulateRecognition&amp;gt;Play what I asked for&amp;lt;/emulateRecognition&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;/command&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This command listens for a few different ways to say “Play the artist [artist]”. When that, or one if it’s alternatives is recognized, the macro set’s the text feedback, tells the Media Player to pause, and then prompts the user if necessary to clarify (or disambiguate as we say inside the Speech group). After which, it sets a few named states to keep track of the last verbal request, and then emulates “Play what I asked for”. &lt;/p&gt;  &lt;p&gt;“Rob, why are you doing that?” … good question. The first reason is to demonstrate how you can sequence macros together. You’ll see with the other commands for albums and tracks, that they all do some very similar things. By using named states, we can in effect make a voice based sub-routine. The added bonus is that I can also say “Play what I asked for”, and the last media play command will be performed.&lt;/p&gt;  &lt;p&gt;Let’s look at the Play what I asked for command:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play what I asked for ?again&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback speak=&amp;quot;true&amp;quot;&amp;gt;Playing {[playMediaTypeName]} {[playMediaTypeValue]}&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaPlay attrname=&amp;quot;{[playMediaAttrName]}&amp;quot; attrvalue=&amp;quot;{[playMediaAttrValue]}&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;/command&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This command simply pauses the media player, set’s the text feedback to say what it’s about to play, and then it starts playing what was asked for. There are two parts to wmpMediaPlay element is that enable you to tell the media player what to play. You can think of these two as a name and value pair. You can tell it to play an artist (“WM/AlbumArtist”) named The Eagles (“The Eagles”). The first is called the attribute name, and the second is the attribute value. You can learn more about what’s available by looking at the documentation on MSDN for the Windows Media Player SDK. &lt;/p&gt;  &lt;p&gt;Let’s see how the Play Album command is similar to the Play Artist. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the album ?named [Albums]&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the C D ?named [Albums]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the [Albums] C D&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the [Albums] album&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Playing Album {[*Album]}&amp;lt;/setTextFeedback&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;disambiguate title=&amp;quot;Which album do you want to play?&amp;quot; prompt=&amp;quot;Choose an Album&amp;quot; timeout=&amp;quot;25&amp;quot; propname=&amp;quot;Album&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeName&amp;quot; value=&amp;quot;Album&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeValue&amp;quot; value=&amp;quot;{[*Album]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrName&amp;quot; value=&amp;quot;WM/AlbumTitle&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrValue&amp;quot; value=&amp;quot;{[Album]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;emulateRecognition&amp;gt;Play what I asked for&amp;lt;/emulateRecognition&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;/command&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As you can see, it’s very similar to the Play Artist command. In fact, the only real differences are that what we listen for is slightly different, the prompts are slightly different, and the attribute that we tell the mediaPlayerPlay element to play (via the named states) is different.&lt;/p&gt;  &lt;p&gt;Now both of these top level commands that use the Play what I asked for command to actually do the work also are referring to other “rules”. How do those get defined? Good question. The Answer: With the wmpMediaItems element. Let’s look at both of those for Artist and Albums:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;wmpMediaItems     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;Artists&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; propname=&amp;quot;Artist&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; attrname=&amp;quot;WM/AlbumArtist&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;wmpMediaItems      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;Albums&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; propname=&amp;quot;Album&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; attrname=&amp;quot;WM/AlbumTitle&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That’s it. It’s that simple. In fact, these elements will actually pay attention to changes in the media library and they’ll automatically update themselves with the new artists and albums. This could have been done with Jscript and the Media Player OCX, but since I really wanted this to work super well, I just went ahead and included it directly in the schema. &lt;/p&gt;  &lt;p&gt;There are a lot of other commands in this macro, but instead of telling you all the details, I’m going to leave it for discussion in the comments… &lt;/p&gt;  &lt;p&gt;One of my favorite commands here is the “Play something by [artist]” command. Try it out. See if you can see how it works.&lt;/p&gt;  &lt;p&gt;If you don’t understand how something works, let me know…&lt;/p&gt;  &lt;p&gt;Here’s the whole macro:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;!-- Windows Media Player --&amp;gt;     &lt;br /&gt;&amp;lt;speechMacros&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Start Media Player --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Media Player&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;emulateRecognition&amp;gt;start Media Player&amp;lt;/emulateRecognition&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Play Artist Command --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the artist [Artists]&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the band [Artists]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the group [Artists]&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Playing Artist {[*Artist]}&amp;lt;/setTextFeedback&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;disambiguate title=&amp;quot;Which artist do you want to play?&amp;quot; prompt=&amp;quot;Choose an Artist&amp;quot; timeout=&amp;quot;25&amp;quot; propname=&amp;quot;Artist&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeName&amp;quot; value=&amp;quot;Artist&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeValue&amp;quot; value=&amp;quot;{[*Artist]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrName&amp;quot; value=&amp;quot;WM/AlbumArtist&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrValue&amp;quot; value=&amp;quot;{[Artist]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;emulateRecognition&amp;gt;Play what I asked for&amp;lt;/emulateRecognition&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Play Album Command --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the album ?named [Albums]&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the C D ?named [Albums]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the [Albums] C D&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the [Albums] album&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Playing Album {[*Album]}&amp;lt;/setTextFeedback&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;disambiguate title=&amp;quot;Which album do you want to play?&amp;quot; prompt=&amp;quot;Choose an Album&amp;quot; timeout=&amp;quot;25&amp;quot; propname=&amp;quot;Album&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeName&amp;quot; value=&amp;quot;Album&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeValue&amp;quot; value=&amp;quot;{[*Album]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrName&amp;quot; value=&amp;quot;WM/AlbumTitle&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrValue&amp;quot; value=&amp;quot;{[Album]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;emulateRecognition&amp;gt;Play what I asked for&amp;lt;/emulateRecognition&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Play Genre Command --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the genre [Genres]&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Playing Genre {[*Genre]}&amp;lt;/setTextFeedback&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;disambiguate title=&amp;quot;Which genre do you want to play?&amp;quot; prompt=&amp;quot;Choose a Genre&amp;quot; timeout=&amp;quot;25&amp;quot; propname=&amp;quot;Genre&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeName&amp;quot; value=&amp;quot;Genre&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeValue&amp;quot; value=&amp;quot;{[*Genre]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrName&amp;quot; value=&amp;quot;WM/Genre&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrValue&amp;quot; value=&amp;quot;{[Genre]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;emulateRecognition&amp;gt;Play what I asked for&amp;lt;/emulateRecognition&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Play Track Command --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play ?the track ?named [TrackNames]&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Playing Track {[*SourceURL]}&amp;lt;/setTextFeedback&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;disambiguate title=&amp;quot;Which track do you want to play?&amp;quot; prompt=&amp;quot;Choose a Track&amp;quot; timeout=&amp;quot;25&amp;quot; propname=&amp;quot;SourceURL&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeName&amp;quot; value=&amp;quot;Track&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeValue&amp;quot; value=&amp;quot;{[*SourceURL]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrName&amp;quot; value=&amp;quot;SourceURL&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrValue&amp;quot; value=&amp;quot;{[SourceURL]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;emulateRecognition&amp;gt;Play what I asked for&amp;lt;/emulateRecognition&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Play Anything Command --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;play [GenreArtistAlbumTrack]&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Playing {[*GenreArtistAlbumTrack]}&amp;lt;/setTextFeedback&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;JScript&amp;quot; &amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; genreArtistAlbumTrack = &amp;quot;{[*GenreArtistAlbumTrack]}&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; matchingGenres = CommandSet.RuleGenerators(&amp;quot;Genres&amp;quot;).Rule.Items.FindTextMatches(genreArtistAlbumTrack);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; matchingArtists = CommandSet.RuleGenerators(&amp;quot;Artists&amp;quot;).Rule.Items.FindTextMatches(genreArtistAlbumTrack);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; matchingAlbums = CommandSet.RuleGenerators(&amp;quot;Albums&amp;quot;).Rule.Items.FindTextMatches(genreArtistAlbumTrack);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; matchingTracks = CommandSet.RuleGenerators(&amp;quot;TrackNames&amp;quot;).Rule.Items.FindTextMatches(genreArtistAlbumTrack)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; addMediaItems(&amp;quot;Genre:&amp;quot;, matchingGenres, ChooseFromList.Items);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; addMediaItems(&amp;quot;Artist:&amp;quot;, matchingArtists, ChooseFromList.Items);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; addMediaItems(&amp;quot;Album:&amp;quot;, matchingAlbums, ChooseFromList.Items);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; addMediaItems(&amp;quot;Track:&amp;quot;, matchingTracks, ChooseFromList.Items); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (ChooseFromList.Items.Count == 0)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Command.Exit(1);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = ChooseFromList.Items.Count == 1      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ? 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : ChooseFromList.Choose(&amp;quot;What did you want to play?&amp;quot;, &amp;quot;Play media&amp;quot;); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaAttrName&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaAttrValue&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaTypeName&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaTypeValue&amp;quot;); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = findMatchingItem(matchingGenres, chosen, &amp;quot;WM/Genre&amp;quot;, &amp;quot;Genre&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = findMatchingItem(matchingArtists, chosen, &amp;quot;WM/AlbumArtist&amp;quot;, &amp;quot;Artist&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = findMatchingItem(matchingAlbums, chosen, &amp;quot;WM/AlbumTitle&amp;quot;, &amp;quot;Album&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = findMatchingItem(matchingTracks, chosen, &amp;quot;SourceURL&amp;quot;, &amp;quot;Track&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (NamedStates.IsNamedStateSet(&amp;quot;playMediaAttrName&amp;quot;) &amp;amp;&amp;amp; NamedStates.IsNamedStateSet(&amp;quot;playMediaAttrValue&amp;quot;))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.EmulateRecognition(&amp;quot;Play what I asked for&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function addMediaItems(prefix, itemsToAdd, collectionToAddTo)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (i = 0; i &amp;lt; itemsToAdd.Count; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = itemsToAdd.item(i);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; collectionToAddTo.AddItem(prefix + &amp;quot; &amp;quot; + item.Phrase, item.Property);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function findMatchingItem(matchingItems, chosen, playMediaAttrName, playMediaTypeName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (chosen &amp;gt;= 0 &amp;amp;&amp;amp; chosen &amp;lt; matchingItems.Count)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaAttrName&amp;quot;, playMediaAttrName);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaAttrValue&amp;quot;, matchingItems.Item(chosen).Property);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaTypeName&amp;quot;, playMediaTypeName);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaTypeValue&amp;quot;, matchingItems.Item(chosen).Phrase);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = -1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = chosen - matchingItems.Count;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return chosen;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Play Artist/Album/Track/Genre Command --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenForList propname=&amp;quot;PlayWhat&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;Genres&amp;quot;&amp;gt;Play Genre&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;Genres&amp;quot;&amp;gt;+Genres&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;Artists&amp;quot;&amp;gt;Play Artist&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;Artists&amp;quot;&amp;gt;+Artists&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;Albums&amp;quot;&amp;gt;Play Album&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;Albums&amp;quot;&amp;gt;Play C D&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;Albums&amp;quot;&amp;gt;+Albums&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;Albums&amp;quot;&amp;gt;+C +Ds&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;TrackNames&amp;quot;&amp;gt;Play Song&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;TrackNames&amp;quot;&amp;gt;Play Track&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;TrackNames&amp;quot;&amp;gt;+Song&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;TrackNames&amp;quot;&amp;gt;+Tracks&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/listenForList&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Playing {[*PlayWhat]}&amp;lt;/setTextFeedback&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;JScript&amp;quot; &amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; playWhat = &amp;quot;{[PlayWhat]}&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; matchingItems = CommandSet.RuleGenerators(playWhat).Rule.Items;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; addMediaItems(&amp;quot;&amp;quot;, matchingItems, ChooseFromList.Items); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (ChooseFromList.Items.Count == 0)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Command.Exit(1);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = ChooseFromList.Items.Count == 1      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ? 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : ChooseFromList.Choose(&amp;quot;What did you want to play?&amp;quot;, &amp;quot;Play &amp;quot; + playWhat); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaAttrName&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaAttrValue&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaTypeName&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaTypeValue&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (playWhat == &amp;quot;Genres&amp;quot;) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; playMediaTypeName = &amp;quot;Genre&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; playMediaAttrName = &amp;quot;WM/Genre&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if (playWhat == &amp;quot;Artists&amp;quot;) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; playMediaTypeName = &amp;quot;Artist&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; playMediaAttrName = &amp;quot;WM/AlbumArtist&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if (playWhat == &amp;quot;Albums&amp;quot;) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; playMediaTypeName = &amp;quot;Album&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; playMediaAttrName = &amp;quot;WM/AlbumTitle&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if (playWhat == &amp;quot;TrackNames&amp;quot;) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; playMediaTypeName = &amp;quot;Track&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; playMediaAttrName = &amp;quot;SourceURL&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = findMatchingItem(matchingItems, chosen, playMediaAttrName, playMediaTypeName);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (NamedStates.IsNamedStateSet(&amp;quot;playMediaAttrName&amp;quot;) &amp;amp;&amp;amp; NamedStates.IsNamedStateSet(&amp;quot;playMediaAttrValue&amp;quot;))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.EmulateRecognition(&amp;quot;Play what I asked for&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function addMediaItems(prefix, itemsToAdd, collectionToAddTo)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (i = 0; i &amp;lt; itemsToAdd.Count; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = itemsToAdd.item(i);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; collectionToAddTo.AddItem(prefix + &amp;quot; &amp;quot; + item.Phrase, item.Property);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function findMatchingItem(matchingItems, chosen, playMediaAttrName, playMediaTypeName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (chosen &amp;gt;= 0 &amp;amp;&amp;amp; chosen &amp;lt; matchingItems.Count)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaAttrName&amp;quot;, playMediaAttrName);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaAttrValue&amp;quot;, matchingItems.Item(chosen).Property);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaTypeName&amp;quot;, playMediaTypeName);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaTypeValue&amp;quot;, matchingItems.Item(chosen).Phrase);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = -1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = chosen - matchingItems.Count;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return chosen;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Play the album that has [track name] on it --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play the album that has [AlbumByTrackName] on it&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play the C D that has [AlbumByTrackName] on it&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Playing the Album that has {[*AlbumByTrackName]} on it&amp;lt;/setTextFeedback&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;disambiguate title=&amp;quot;Which track's album do you want to play?&amp;quot; prompt=&amp;quot;Choose a Track&amp;quot; timeout=&amp;quot;25&amp;quot; propname=&amp;quot;AlbumByTrackName&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeName&amp;quot; value=&amp;quot;Album&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeValue&amp;quot; value=&amp;quot;{[*AlbumByTrackName]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrName&amp;quot; value=&amp;quot;WM/AlbumTitle&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrValue&amp;quot; value=&amp;quot;{[AlbumByTrackName]}&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;emulateRecognition&amp;gt;Play what I asked for&amp;lt;/emulateRecognition&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Play the artist that sang [track name] --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play the artist that sang [ArtistByTrackName]&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play the artist who sang [ArtistByTrackName]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play the band that sang [ArtistByTrackName]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play the band who sang [ArtistByTrackName]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play the group that sang [ArtistByTrackName]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play the group who sang [ArtistByTrackName]&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Playing the artist that sang {[*ArtistByTrackName]}&amp;lt;/setTextFeedback&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;disambiguate title=&amp;quot;Which track's artist do you want to play?&amp;quot; prompt=&amp;quot;Choose a Track&amp;quot; timeout=&amp;quot;25&amp;quot; propname=&amp;quot;ArtistByTrackName&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeName&amp;quot; value=&amp;quot;Artist&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaTypeValue&amp;quot; value=&amp;quot;{[*ArtistByTrackname]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrName&amp;quot; value=&amp;quot;WM/AlbumArtist&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setState name=&amp;quot;playMediaAttrValue&amp;quot; value=&amp;quot;{[ArtistByTrackName]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;emulateRecognition&amp;gt;Play what I asked for&amp;lt;/emulateRecognition&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Play something sang by [TrackOrAlbumByArtist] --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play something ?sang by [TrackOrAlbumByArtist]&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play something [TrackOrAlbumByArtist]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play something [TrackOrAlbumByArtist] sang&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Playing something by {[*TrackOrAlbumByArtist]}&amp;lt;/setTextFeedback&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;JScript&amp;quot; &amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trackOrAlbumByArtist = &amp;quot;{[*TrackOrAlbumByArtist]}&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; matchingAlbums = CommandSet.RuleGenerators(&amp;quot;AlbumByArtist&amp;quot;).Rule.Items.FindTextMatches(trackOrAlbumByArtist);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; matchingTracks = CommandSet.RuleGenerators(&amp;quot;TrackNameByArtist&amp;quot;).Rule.Items.FindTextMatches(trackOrAlbumByArtist)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; addMediaItems(&amp;quot;Album:&amp;quot;, matchingAlbums, ChooseFromList.Items);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; addMediaItems(&amp;quot;Track:&amp;quot;, matchingTracks, ChooseFromList.Items); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (ChooseFromList.Items.Count == 0)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Command.Exit(1);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = ChooseFromList.Items.Count == 1      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ? 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : ChooseFromList.Choose(&amp;quot;What do you want to play?&amp;quot;, &amp;quot;Play media&amp;quot;); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaAttrName&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaAttrValue&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaTypeName&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaTypeValue&amp;quot;); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = findMatchingItem(matchingAlbums, chosen, &amp;quot;WM/AlbumTitle&amp;quot;, &amp;quot;Album&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = findMatchingItem(matchingTracks, chosen, &amp;quot;Name&amp;quot;, &amp;quot;Track&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (NamedStates.IsNamedStateSet(&amp;quot;playMediaAttrName&amp;quot;) &amp;amp;&amp;amp; NamedStates.IsNamedStateSet(&amp;quot;playMediaAttrValue&amp;quot;))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.EmulateRecognition(&amp;quot;Play what I asked for&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function addMediaItems(prefix, itemsToAdd, collectionToAddTo)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (i = 0; i &amp;lt; itemsToAdd.Count; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = itemsToAdd.item(i);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; collectionToAddTo.AddItem(prefix + &amp;quot; &amp;quot; + item.Property + &amp;quot; (&amp;quot; + item.Phrase + &amp;quot;)&amp;quot;, item.Property);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function findMatchingItem(matchingItems, chosen, playMediaAttrName, playMediaTypeName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (chosen &amp;gt;= 0 &amp;amp;&amp;amp; chosen &amp;lt; matchingItems.Count)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaAttrName&amp;quot;, playMediaAttrName);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaAttrValue&amp;quot;, matchingItems.Item(chosen).Property);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaTypeName&amp;quot;, playMediaTypeName);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaTypeValue&amp;quot;, matchingItems.Item(chosen).Property);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = -1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = chosen - matchingItems.Count;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return chosen;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Play something written in [TrackNameByYear]       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play something written in [TrackOrAlbumByYear]&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Playing something written in {[*TrackOrAlbumByYear]}&amp;lt;/setTextFeedback&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;JScript&amp;quot; &amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trackOrAlbumByYear = &amp;quot;{[*TrackOrAlbumByYear]}&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; matchingAlbums = CommandSet.RuleGenerators(&amp;quot;AlbumByYear&amp;quot;).Rule.Items.FindTextMatches(trackOrAlbumByYear);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; matchingTracks = CommandSet.RuleGenerators(&amp;quot;TrackNameByYear&amp;quot;).Rule.Items.FindTextMatches(trackOrAlbumByYear)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; addMediaItems(&amp;quot;Album:&amp;quot;, matchingAlbums, ChooseFromList.Items);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; addMediaItems(&amp;quot;Track:&amp;quot;, matchingTracks, ChooseFromList.Items); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (ChooseFromList.Items.Count == 0)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Command.Exit(1);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = ChooseFromList.Items.Count == 1      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ? 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : ChooseFromList.Choose(&amp;quot;What do you want to play?&amp;quot;, &amp;quot;Play media&amp;quot;); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaAttrName&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaAttrValue&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaTypeName&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.ClearNamedState(&amp;quot;playMediaTypeValue&amp;quot;); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = findMatchingItem(matchingAlbums, chosen, &amp;quot;WM/AlbumTitle&amp;quot;, &amp;quot;Album&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = findMatchingItem(matchingTracks, chosen, &amp;quot;Name&amp;quot;, &amp;quot;Track&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (NamedStates.IsNamedStateSet(&amp;quot;playMediaAttrName&amp;quot;) &amp;amp;&amp;amp; NamedStates.IsNamedStateSet(&amp;quot;playMediaAttrValue&amp;quot;))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.EmulateRecognition(&amp;quot;Play what I asked for&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function addMediaItems(prefix, itemsToAdd, collectionToAddTo)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (i = 0; i &amp;lt; itemsToAdd.Count; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = itemsToAdd.item(i);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; collectionToAddTo.AddItem(prefix + &amp;quot; &amp;quot; + item.Property + &amp;quot; (&amp;quot; + item.Phrase + &amp;quot;)&amp;quot;, item.Property);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function findMatchingItem(matchingItems, chosen, playMediaAttrName, playMediaTypeName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (chosen &amp;gt;= 0 &amp;amp;&amp;amp; chosen &amp;lt; matchingItems.Count)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaAttrName&amp;quot;, playMediaAttrName);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaAttrValue&amp;quot;, matchingItems.Item(chosen).Property);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaTypeName&amp;quot;, playMediaTypeName);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NamedStates.SetNamedStateValue(&amp;quot;playMediaTypeValue&amp;quot;, matchingItems.Item(chosen).Property);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = -1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chosen = chosen - matchingItems.Count;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return chosen;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/command&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Play what I asked for --&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Play what I asked for ?again&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback speak=&amp;quot;true&amp;quot;&amp;gt;Playing {[playMediaTypeName]} {[playMediaTypeValue]}&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaPlay attrname=&amp;quot;{[playMediaAttrName]}&amp;quot; attrvalue=&amp;quot;{[playMediaAttrValue]}&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;!-- Navigation --&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+next track&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+next song&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+go to ?the +next ?track&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+go to ?the +next song&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;speak&amp;gt;Playing the next track&amp;lt;/speak&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;next&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.5&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;play&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+previous track&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+previous song&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+go to ?the +previous ?track&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+go to ?the +previous song&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;speak&amp;gt;Playing the previous track&amp;lt;/speak&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;previous&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.5&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;play&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[GoBack] one track&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[GoBack] one song&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[GoBack] [1to20times] tracks&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[GoBack] [1to20times] songs&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;speak&amp;gt;Skipping back {[times]} tracks&amp;lt;/speak&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;previous&amp;quot; times=&amp;quot;{[times]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.5&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;play&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[GoForward] one track&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[GoForward] one song&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[GoForward] [1to20times] tracks&amp;lt;/listenFor&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[GoForward] [1to20times] songs&amp;lt;/listenFor&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;speak&amp;gt;Skipping ahead {[times]} tracks&amp;lt;/speak&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;next&amp;quot; times=&amp;quot;{[times]}&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.5&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;play&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+play music&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;play&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+stop music&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+stop playing ?music&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;stop&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+pause music&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+Repeat ?on&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Turn on +repeat&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Turn +repeat on&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;loop_on&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;speak&amp;gt;Repeat is now turned on&amp;lt;/speak&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;play&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+Repeat +off&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Turn +off +repeat&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Turn +repeat +off&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;loop_off&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;speak&amp;gt;Repeat is now turned off&amp;lt;/speak&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;play&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+Toggle +repeat ?setting&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;loop_toggle&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;speak&amp;gt;Toggled the repeat setting&amp;lt;/speak&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;play&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+Shuffle ?on&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Turn +on +shuffle&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Turn +shuffle +on&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;shuffle_on&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;speak&amp;gt;Shuffle is now turned on&amp;lt;/speak&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;play&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+Shuffle&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Turn +off +shuffle&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Turn +shuffle +off&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;shuffle_off&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;speak&amp;gt;Shuffle is now turned off&amp;lt;/speak&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;play&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;+Toggle +shuffle ?setting&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;shuffle_toggle&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;pause&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;speak&amp;gt;Toggled the shuffle setting&amp;lt;/speak&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaControl command=&amp;quot;play&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;!-- Command Set Rules --&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;!-- Various ways to say, &amp;quot;Go Back&amp;quot; --&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;listenForList name=&amp;quot;GoBack&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item&amp;gt;+go +back&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item&amp;gt;+go +up&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item&amp;gt;+go +down&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item&amp;gt;+skip +back&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item&amp;gt;+skip +up&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item&amp;gt;+skip +down&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/listenForList&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;!-- Various ways to say, &amp;quot;Go Forward&amp;quot;--&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;listenForList name=&amp;quot;GoForward&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item&amp;gt;+go +forward&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item&amp;gt;+go +ahead&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item&amp;gt;+go +down&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item&amp;gt;+skip +forward&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item&amp;gt;+skip +ahead&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item&amp;gt;+skip +down&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/listenForList&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;numbers name=&amp;quot;1to20times&amp;quot; propname=&amp;quot;times&amp;quot; start=&amp;quot;1&amp;quot; stop=&amp;quot;20&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;wmpMediaItems     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;Artists&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propname=&amp;quot;Artist&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrname=&amp;quot;WM/AlbumArtist&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;wmpMediaItems      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;Albums&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propname=&amp;quot;Album&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrname=&amp;quot;WM/AlbumTitle&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;wmpMediaItems     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;Genres&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propname=&amp;quot;Genre&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrname=&amp;quot;WM/Genre&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;wmpMediaItems      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;TrackNames&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propname=&amp;quot;SourceURL&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propvalue=&amp;quot;[SourceURL]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrname=&amp;quot;MediaType&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrvalue=&amp;quot;AUDIO&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listenFor=&amp;quot;[Name]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; &amp;lt;wmpMediaItems      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;AlbumByTrackName&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propname=&amp;quot;Album&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propvalue=&amp;quot;[WM/AlbumTitle]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrname=&amp;quot;MediaType&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrvalue=&amp;quot;AUDIO&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listenFor=&amp;quot;[Name]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; &amp;lt;wmpMediaItems      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;ArtistByTrackName&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propname=&amp;quot;Artist&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propvalue=&amp;quot;[WM/AlbumArtist]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrname=&amp;quot;MediaType&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrvalue=&amp;quot;AUDIO&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listenFor=&amp;quot;[Name]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;rule name=&amp;quot;GenreArtistAlbumTrack&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ruleref name=&amp;quot;TrackNames&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ruleref name=&amp;quot;Artists&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ruleref name=&amp;quot;Albums&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ruleref name=&amp;quot;Genres&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/rule&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaItems      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;TrackNameByArtist&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propname=&amp;quot;TrackName&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propvalue=&amp;quot;[Name]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrname=&amp;quot;MediaType&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrvalue=&amp;quot;AUDIO&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listenFor=&amp;quot;[WM/AlbumArtist]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaItems      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;AlbumByArtist&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propname=&amp;quot;Album&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propvalue=&amp;quot;[WM/AlbumTitle]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrname=&amp;quot;MediaType&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrvalue=&amp;quot;AUDIO&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listenFor=&amp;quot;[WM/AlbumArtist]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;rule name=&amp;quot;TrackOrAlbumByArtist&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ruleref name=&amp;quot;TrackNameByArtist&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ruleref name=&amp;quot;AlbumByArtist&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/rule&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaItems       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;TrackNameByYear&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propname=&amp;quot;TrackName&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propvalue=&amp;quot;[Name]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrname=&amp;quot;MediaType&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrvalue=&amp;quot;AUDIO&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listenFor=&amp;quot;[WM/Year]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wmpMediaItems      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;AlbumByYear&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propname=&amp;quot;Album&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propvalue=&amp;quot;[WM/AlbumArtist]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrname=&amp;quot;MediaType&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attrvalue=&amp;quot;AUDIO&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listenFor=&amp;quot;[WM/Year]&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;rule name=&amp;quot;TrackOrAlbumByYear&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ruleref name=&amp;quot;TrackNameByYear&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ruleref name=&amp;quot;AlbumByYear&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/rule&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;      &lt;br /&gt;&amp;lt;/speechMacros&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8677696" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Making a Speech macro Application Specific</title><link>http://blogs.msdn.com/robch/archive/2008/06/30/making-a-speech-macro-application-specific.aspx</link><pubDate>Mon, 30 Jun 2008 16:45:05 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8671424</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/8671424.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8671424</wfw:commentRss><description>&lt;p&gt;A common question I get is, &amp;quot;Hey, Rob, How do I make a speech macro application specific?&amp;quot; I've posted a couple examples of that embedded in other more complex macros, but here's the simple version.&lt;/p&gt;  &lt;p&gt;To make a macro application specific, you'll have to edit the XML by hand. To do that, you can open up the XML file in a text editor, such as NOTEPAD, and add a line that looks like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&amp;lt;appIsInForeground processName=&amp;quot;IEXPLORE.EXE&amp;quot;/&amp;gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So, that would make a simple text insertion macro look like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;speechMacros&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;command&amp;gt;      &lt;br /&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;IEXPLORE.EXE&amp;quot;/&amp;gt;       &lt;br /&gt;&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Insert my signature&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;insertText&amp;gt;--robch&amp;lt;/insertText&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt;      &lt;br /&gt;&amp;lt;/speechMacros&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That's it! Do you have a question about Speech Macros? If so, &lt;a href="mailto:listen@microsoft.com?subject=WSR%20Macro%20Question"&gt;let us know&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8671424" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Macro of the Day: Say what you want and get it! (inside Word, Excel, and PowerPoint)</title><link>http://blogs.msdn.com/robch/archive/2008/06/20/macro-of-the-day-say-what-you-want-and-get-it-inside-word-excel-and-powerpoint.aspx</link><pubDate>Fri, 20 Jun 2008 17:42:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8625422</guid><dc:creator>robch</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/robch/comments/8625422.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8625422</wfw:commentRss><description>&lt;p&gt;Today's macro of the day is a cool trick involving another free tool from Microsoft called Search Commands. &lt;a href="http://www.officelabs.com/projects/searchcommands/Pages/default.aspx"&gt;Search Commands&lt;/a&gt; helps you find commands, options, wizards and other cool stuff in Office 2007 applications (Word, Excel, and PowerPoint). It's like search, but instead of searching content, it searches the tasks that are available in Microsoft Office.&lt;/p&gt;  &lt;p&gt;Search Commands is built in the newly developed &lt;a href="http://www.officelabs.com/"&gt;Office Labs&lt;/a&gt; team. They build software prototypes that are to the software world what concept cars to the automotive world. &lt;/p&gt;  &lt;p&gt;A year or so ago, when I met up with some of the folks on the Search Commands team I fell in love with the Office add-in. &lt;/p&gt;  &lt;p&gt;As implemented today without using the macro of the day, Search Commands is a new &amp;quot;tab&amp;quot; at the top of Office 2007 applications. If you want to find something, you click the tab, click inside the edit box, type what you're looking for, and amazingly quickly it shows you exactly what you're looking for as a set of search results in the Office Ribbon. &lt;/p&gt;  &lt;p&gt;Well ... Being a speech guy, I thought, why can't I just say what I want and get it, right away, in a single command. That's what today's Macro of the Day is.&lt;/p&gt;  &lt;p&gt;Basically, today's macro listens for a series of commands, like &amp;quot;Search commands for [...]&amp;quot;, and will automatically switch to the right tab, place focus in the edit control, type what you said in the [...] section, and allow you to pick from the results. I no longer have to care at all where features are on the ribbon tabs. I just say what I want and get it, in one utterance. &lt;/p&gt;  &lt;p&gt;Let's take a look at the commands in the macro.&lt;/p&gt;  &lt;p&gt;The first command, listens for &amp;quot;Search Commands&amp;quot; if the application that the user is currently using is either Word, Excel, or PowerPoint. Then, if WSR Macros hears that, it'll set the text feedback and send some keys to the application. Those keys (&amp;lt;alt-y&amp;gt; s c o &amp;lt;ctrl-y&amp;gt;) are the magic keyboard shortcuts to put focus into the right field. the &amp;lt;ctrl-a&amp;gt; selects all the text if there's any text already there, and then the {delete} deletes that text. This command helps you get to the right tab, and puts focus in the right field, but only does part of the task for you... &lt;/p&gt;  &lt;p&gt;Let's take a look:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;condition operator=&amp;quot;or&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;winword.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;excel.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;powerpnt.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/condition&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;search commands&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;setTextFeedback speak=&amp;quot;false&amp;quot;&amp;gt;Search for a command&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;sendKeys&amp;gt;%y&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.25&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;sendKeys&amp;gt;sco^a{delete}&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The next command, listens for the same sorts of things, but it also allows you to say what you want, and it'll do the tab switching, as well as filling in the field to do the search for you. Take a look:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;condition operator=&amp;quot;or&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;winword.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;excel.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;powerpnt.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/condition&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;search for ?a command [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;search for ?a command [...] [number]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;search commands ?for [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;search commands ?for [...] [number]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;setTextFeedback speak=&amp;quot;false&amp;quot;&amp;gt;Search for command: {[...]}&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;sendKeys&amp;gt;%y&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.25&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;sendKeys&amp;gt;sco^a&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.25&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;insertText&amp;gt;{[...]}&amp;lt;/insertText&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.25&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;sendKeys&amp;gt;^a&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;sendKeys&amp;gt;{[number]}&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And finally, there's another command that listen's for you to say the same sorts of things, but then just tells you that it can't do what you're asking. This is generally a good GUI/VUI design, to prevent you from trying to use the same voice command in applications that don't currently support it (like Outlook). &lt;/p&gt;  &lt;p&gt;Here's that command:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;condition operator=&amp;quot;not&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;condition operator=&amp;quot;or&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;winword.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;excel.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;powerpnt.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/condition&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/condition&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;search commands&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;search commands ?for [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;search commands ?for [...] [number]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;search for ?a command [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;search for ?a command [...] [number]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;setTextFeedback style=&amp;quot;warning&amp;quot; speak=&amp;quot;false&amp;quot;&amp;gt;What was that?&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;There's one more command in the macro that's pretty useful. It's a command that turns the user's voice saying a number between 1 and 9 into a digit key press, as opposed to a textual insertion in the document. This is important when using Search Commands because if I use the 2nd command above, and say &amp;quot;Search Commands for Background color&amp;quot;, Search Commands will do the right thing, showing the results in the ribbon, and allow the user to press 1 for the first command, 2 for the second command, etc. But ... The speech system on Vista by default doesn't know that, so this command listens for digits, and presses the keys when in Word, PowerPoint, and Excel, instead of allowing you to insert text...&lt;/p&gt;  &lt;p&gt;Here's what that command looks like:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;condition operator=&amp;quot;or&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;winword.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;excel.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;powerpnt.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/condition&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;[number]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;setTextFeedback speak=&amp;quot;false&amp;quot;&amp;gt;{[number]}&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;sendKeys&amp;gt;{[number]}&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So ... If we put it all together, here's the full macro:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;speechMacros&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;condition operator=&amp;quot;or&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;winword.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;excel.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;powerpnt.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/condition&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;search commands&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback speak=&amp;quot;false&amp;quot;&amp;gt;Search for a command&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sendKeys&amp;gt;%y&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.25&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sendKeys&amp;gt;sco^a{delete}&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;condition operator=&amp;quot;or&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;winword.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;excel.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;powerpnt.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/condition&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;search for ?a command [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;search for ?a command [...] [number]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;search commands ?for [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;search commands ?for [...] [number]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback speak=&amp;quot;false&amp;quot;&amp;gt;Search for command: {[...]}&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sendKeys&amp;gt;%y&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.25&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sendKeys&amp;gt;sco^a&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.25&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;insertText&amp;gt;{[...]}&amp;lt;/insertText&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.25&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sendKeys&amp;gt;^a&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sendKeys&amp;gt;{[number]}&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;condition operator=&amp;quot;or&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;winword.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;excel.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;powerpnt.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/condition&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[number]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback speak=&amp;quot;false&amp;quot;&amp;gt;{[number]}&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sendKeys&amp;gt;{[number]}&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;condition operator=&amp;quot;not&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;condition operator=&amp;quot;or&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;winword.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;excel.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;powerpnt.exe&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/condition&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/condition&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;search commands&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;search commands ?for [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;search commands ?for [...] [number]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;search for ?a command [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;search for ?a command [...] [number]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback style=&amp;quot;warning&amp;quot; speak=&amp;quot;false&amp;quot;&amp;gt;What was that?&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;numbers name=&amp;quot;number&amp;quot; start=&amp;quot;1&amp;quot; stop=&amp;quot;9&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;/speechMacros&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Remember, to take advantage of the the power of Search Commands and WSR Macros combined, you'll have to download both, and install this macro in your Speech Macros directory. &lt;/p&gt;  &lt;p&gt;Related links:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://download.speechmacros.com"&gt;Download Speech Macros&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.officelabs.com/projects/searchcommands/Pages/default.aspx"&gt;Download Search Commands&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="mailto:listen@microsoft.com?subject=Macro%20of%20the%20day:%20Search%20Commands"&gt;Let us know&lt;/a&gt; what you think!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8625422" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Disney's "Innovention Dream Home": A look inside</title><link>http://blogs.msdn.com/robch/archive/2008/06/18/disney-s-innovention-dream-home-a-look-inside.aspx</link><pubDate>Wed, 18 Jun 2008 16:44:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8616542</guid><dc:creator>robch</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/robch/comments/8616542.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8616542</wfw:commentRss><description>&lt;p&gt;I love Disneyland, and I love technology, so it's a no-brainer for me to absolutely love Disney's new &amp;quot;&lt;a href="http://www.microsoft.com/presspass/features/2008/jun08/06-16Innoventions.mspx"&gt;Innovention Dream Home&lt;/a&gt;&amp;quot;. Basically, it's a home of the future, as envisioned by &lt;a href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt;, &lt;a href="http://www.hp.com/"&gt;HP&lt;/a&gt;, &lt;a href="http://www.exceptionalinnovation.com/"&gt;Life/ware&lt;/a&gt;, and Disneyland situated right inside the Disneyland park in Southern CA in Tomorrowland. &lt;/p&gt;  &lt;p&gt;I saw a video about the 5,000 square foot home this morning on CNET, and I just had to share it &lt;a href="http://news.cnet.com/1606-2_3-50002670.html?part=rss&amp;amp;tag=rsspr.6241883&amp;amp;subj=news"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Special Note&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Most of the scenarios that are demonstrated with speech recognition and synthesis technology are actually possible today with real live technology built into Windows Vista. &lt;/p&gt;  &lt;p&gt;So, if you want to deck out your house with speech technology, check out &lt;a href="http://www.microsoft.com/enable/products/windowsvista/speech.aspx"&gt;Windows Speech Recognition&lt;/a&gt; included in Windows Vista for the basic speech technology to control the Operating System and all your applications running on Vista, and check out &lt;a href="http://download.speechmacros.com/"&gt;Windows Speech Recognition Macros&lt;/a&gt; (aka WSR Macros) for extending control to just about anything you can imagine. &lt;/p&gt;  &lt;p&gt;Do you have an idea of what you'd like to control in your house? Leave me a comment in the comment section and I'll show you how easy it is... &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Other cool links about the home:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.disneylandevent.com/tsm/27-dreamhome.html"&gt;Innovation Dream Home&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/presspass/events/mshome/default.mspx"&gt;Microsoft's Home of the Future&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Seattle PI: &lt;a href="http://seattlepi.nwsource.com/business/367100_software16.html"&gt;&lt;em&gt;This Dream Home comes with a Mouse&lt;/em&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8616542" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/In+the+News/default.aspx">In the News</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Applications/default.aspx">Speech Applications</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Macro of the Day: Send Email to [OutlookContact]</title><link>http://blogs.msdn.com/robch/archive/2008/06/09/macro-of-the-day-send-email-to-outlookcontact.aspx</link><pubDate>Mon, 09 Jun 2008 17:32:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8585898</guid><dc:creator>robch</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/robch/comments/8585898.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8585898</wfw:commentRss><description>&lt;p&gt;Today's macro let's you say things like &amp;quot;Send email to Rob&amp;quot;, or &amp;quot;Send email to Rob Chambers&amp;quot;, and as long as I'm a contact in your Outlook Contacts, you can send me mail! It also allows you to say &amp;quot;Send email to Rob Chambers about That cool outlook macro&amp;quot;, it'll open up Outlook, create a new email, put me as the recipient, and it'll set the subject to &amp;quot;That cool outlook macro&amp;quot;. Neat, eh?&lt;/p&gt;  &lt;p&gt;Today's macro was inspired by Brad, over in the ms-speech Yahoo! Group, who asked me if WSR Macros could dynamically create rule content last week. Well, Brad, yes it can! Here's an example.&lt;/p&gt;  &lt;p&gt;The most interesting part of today's macro, is the ruleScript element that allows you to define a rule programmatically. The key to this script is that it will find content to add to the rule by hooking up to Outlook's object model (using Create Object(&amp;quot;Outlook.Application&amp;quot;)), and then call the Rule.Items.AddItem method for each email address it finds. &lt;/p&gt;  &lt;p&gt;That ruleScript looks like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;#160; &amp;lt;ruleScript name=&amp;quot;OutlookContact&amp;quot; propname=&amp;quot;EmailAddr&amp;quot; language=&amp;quot;VBScript&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call AddOutlookContacts &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Sub AddOutlookContacts &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; REM Debug.DebugBreak     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Debug.Trace chr(13) &amp;amp; &amp;quot;Adding OutlookContacts...&amp;quot; &amp;amp; chr(13) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Const olFolderContacts = 10     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Const olMSG = 3 &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set objOutlook = CreateObject(&amp;quot;Outlook.Application&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set objNamespace = objOutlook.GetNamespace(&amp;quot;MAPI&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set colContacts = objNamespace.GetDefaultFolder(olFolderContacts).Items &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each objContact in colContacts     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If TypeName(objContact) = &amp;quot;ContactItem&amp;quot; Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If objContact.FullName &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If objContact.Email1Address &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then Rule.Items.AddItem objContact.FullName, objContact.Email1Address, True      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If objContact.Email2Address &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then Rule.Items.AddItem objContact.FullName, objContact.Email2Address, True      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If objContact.Email3Address &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then Rule.Items.AddItem objContact.FullName, objContact.Email3Address, True      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each objRuleItem in Rule.Items      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Debug.Trace objRuleItem.Phrase &amp;amp; &amp;quot; (&amp;quot; &amp;amp; objRuleItem.Property &amp;amp; &amp;quot;)&amp;quot; &amp;amp; chr(13)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Debug.Trace &amp;quot;--&amp;quot; &amp;amp; chr(13) &amp;amp; &amp;quot;Added &amp;quot; &amp;amp; Rule.Items.Count &amp;amp; &amp;quot; items!&amp;quot; &amp;amp; chr(13) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Sub&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/ruleScript&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;There are a couple other interesting things in today's macro:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;I used a Debug.DebugBreak method (currently commented out above), to allow me to debug the macro interactively in Microsoft Visual Studio Express. This is a handy way of single stepping over each and every line in the code. If you have VS installed, when the macro hits that line (if you uncomment it), you'll be asked what debugger to use to debug the macro's script. You pick VS, and then you have F10 single-step control over the macro as it executes. You can do fun things like inspect variables, change flow, etc... All really cool stuff that developers using Microsoft Development tools have grown accustomed to doing.&lt;/li&gt;    &lt;li&gt;I also used Debug.Trace to output to VS what's going on in the macro, so even if I'm not single step debugging it, I can see what contacts got added.&lt;/li&gt;    &lt;li&gt;I used the disambiguate tag to allow the user to disambiguate what email address to use if it's ambiguous. So, for example, if I have 3 people named Rob in my contacts, it'll allow me to pick which one I wanted to send email to. In fact, it'll even show me the email addresses in parenthesis after the person's full name.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Here's the entire macro:&lt;/p&gt;  &lt;p&gt;&amp;lt;speechMacros&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; &amp;lt;command priority=&amp;quot;2&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;send email to [OutlookContact]&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;send email to [OutlookContact] about [subject...]&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;disambiguate title=&amp;quot;Send email to whom?&amp;quot; prompt=&amp;quot;Who would you like to send email to?&amp;quot; timeout=&amp;quot;30&amp;quot; propname=&amp;quot;OutlookContact&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set outlookApp = CreateObject(&amp;quot;Outlook.Application&amp;quot;) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; olMailItem = 0   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set newMessage = outlookApp.CreateItem(olMailItem) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; newMessage.Recipients.Add(&amp;quot;{[OutlookContact.EmailAddr]}&amp;quot;)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; newMessage.Subject = &amp;quot;{[subject...]}&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; newMessage.Display    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; &amp;lt;command priority=&amp;quot;1&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;send email&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;send email to *&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;send email to * about [subject...]&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set contacts = CommandSet.RuleGenerators(&amp;quot;OutlookContact&amp;quot;)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each item in contacts.Rule.Items    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ChooseFromList.Items.AddItem item.Phrase, item.Property, True    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ChooseFromList.Items.Sort    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chose = ChooseFromList.Choose(&amp;quot;Send email to whom?&amp;quot;, &amp;quot;Who would you like to send email to?&amp;quot;)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If chose &amp;gt; 0 Then    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set outlookApp = CreateObject(&amp;quot;Outlook.Application&amp;quot;) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; olMailItem = 0   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set newMessage = outlookApp.CreateItem(olMailItem)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; newMessage.Recipients.Add(ChooseFromList.Items(chose).Property)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; newMessage.Subject = &amp;quot;{[subject...]}&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; newMessage.Display    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;command&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Refresh ?Outlook Email Contacts&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Refresh Outlook ?Email Contacts&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set contacts = CommandSet.RuleGenerators(&amp;quot;OutlookContact&amp;quot;)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contacts.Rule.Items.RemoveAll    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contacts.Script.AddOutlookContacts    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contacts.Rule.Commit    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; &amp;lt;ruleScript name=&amp;quot;OutlookContact&amp;quot; propname=&amp;quot;EmailAddr&amp;quot; language=&amp;quot;VBScript&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call AddOutlookContacts &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Sub AddOutlookContacts &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; REM Debug.DebugBreak   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Debug.Trace chr(13) &amp;amp; &amp;quot;Adding OutlookContacts...&amp;quot; &amp;amp; chr(13) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Const olFolderContacts = 10   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Const olMSG = 3 &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set objOutlook = CreateObject(&amp;quot;Outlook.Application&amp;quot;)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set objNamespace = objOutlook.GetNamespace(&amp;quot;MAPI&amp;quot;) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set colContacts = objNamespace.GetDefaultFolder(olFolderContacts).Items &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each objContact in colContacts   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If TypeName(objContact) = &amp;quot;ContactItem&amp;quot; Then    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If objContact.FullName &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If objContact.Email1Address &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then Rule.Items.AddItem objContact.FullName, objContact.Email1Address, True    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If objContact.Email2Address &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then Rule.Items.AddItem objContact.FullName, objContact.Email2Address, True    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If objContact.Email3Address &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then Rule.Items.AddItem objContact.FullName, objContact.Email3Address, True    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each objRuleItem in Rule.Items    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Debug.Trace objRuleItem.Phrase &amp;amp; &amp;quot; (&amp;quot; &amp;amp; objRuleItem.Property &amp;amp; &amp;quot;)&amp;quot; &amp;amp; chr(13)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Debug.Trace &amp;quot;--&amp;quot; &amp;amp; chr(13) &amp;amp; &amp;quot;Added &amp;quot; &amp;amp; Rule.Items.Count &amp;amp; &amp;quot; items!&amp;quot; &amp;amp; chr(13) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Sub&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;/ruleScript&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;/speechMacros&amp;gt; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8585898" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Q_2600_amp_3B00_A/default.aspx">Q&amp;amp;A</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Macro of the day: Next Slide</title><link>http://blogs.msdn.com/robch/archive/2008/06/03/macro-of-the-day-next-slide.aspx</link><pubDate>Tue, 03 Jun 2008 18:00:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8570971</guid><dc:creator>robch</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/robch/comments/8570971.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8570971</wfw:commentRss><description>&lt;p&gt;Have you ever found yourself giving a presentation about speech recognition and wished you could simply advance from slide to slide using speech recognition? Well ... I have.&lt;/p&gt;  &lt;p&gt;I've been using this really cool microphone I got from eMicrophones, called a RevoLabs xTag. It let's me walk around the audience, and still be able to talk to my PC tethered to the video projection system way back at the front of the room. It makes for an impressive Vista speech demo.&lt;/p&gt;  &lt;p&gt;That's pretty cool, but then how can I go from slide to slide. Good question. That's where today's macro of the day comes in: &amp;quot;Next Slide&amp;quot;. &lt;/p&gt;  &lt;p&gt;It let's you say things like &amp;quot;Next Slide&amp;quot;, or &amp;quot;Previous Slide&amp;quot;, or even more cool than that, &amp;quot;Go to slide [1to99]&amp;quot;. That's really impressive, but only if you can remember the slide numbers for all your slides. I try and do that now for a handful of the important slides in my presentations. &lt;/p&gt;  &lt;p&gt;Check it out:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;speechMacros&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;powerpnt.exe&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Next ?Slide&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sendKeys&amp;gt;{right}&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt;&lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Previous ?Slide&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sendKeys&amp;gt;{left}&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;?Go Forward [1to20] ?Slide&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sendKeys times=&amp;quot;{[1to20]}&amp;quot;&amp;gt;{right}&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;?Go Back [1to20] ?Slide&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sendKeys times=&amp;quot;{[1to20]}&amp;quot;&amp;gt;{left}&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Go To Slide [1to99]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sendKeys&amp;gt;{[1to99]}{enter}&amp;lt;/sendKeys&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;numbers name=&amp;quot;1to20&amp;quot; start=&amp;quot;1&amp;quot; stop=&amp;quot;20&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;numbers name=&amp;quot;1to99&amp;quot; start=&amp;quot;1&amp;quot; stop=&amp;quot;99&amp;quot;/&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;/speechMacros&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8570971" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Macro of the Day: Read that</title><link>http://blogs.msdn.com/robch/archive/2008/05/28/macro-of-the-day-read-that.aspx</link><pubDate>Wed, 28 May 2008 17:31:34 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8556609</guid><dc:creator>robch</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/robch/comments/8556609.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8556609</wfw:commentRss><description>&lt;p&gt;Following up the macro of the day &lt;a href="http://blogs.msdn.com/robch/archive/2008/05/23/wsr-macro-of-the-day-2008-05-23-symbol-that.aspx"&gt;from last week&lt;/a&gt;, here's &amp;quot;Read That&amp;quot;. Instead of inserting quotes, double quotes, and parentheses and/or formatting text, today's macro allows you to say &amp;quot;Read That&amp;quot;, or &amp;quot;Read the next 3 paragraphs&amp;quot;... &lt;/p&gt;  &lt;p&gt;I also threw in &amp;quot;What time is it?&amp;quot; and &amp;quot;What's today's date&amp;quot; just for fun...&lt;/p&gt;  &lt;p&gt;You'll need to download WSRMacros to use it, but that's easy. Just go &lt;a href="http://download.speechmacros.com/"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Check it out:&lt;/p&gt;  &lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;   &lt;br /&gt;&amp;lt;speechMacros&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;!-- Read that --&amp;gt;   &lt;br /&gt;&amp;lt;command priority=&amp;quot;3&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;read that&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;script language=&amp;quot;JScript&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Copy the selected text into the clipboard and wait 1/4 second    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Application.SendKeys(&amp;quot;{250 WAIT}^c{250 WAIT}&amp;quot;);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Get the data out of the clipboard    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var text = Application.clipboardData.getData(&amp;quot;text&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Application.Speak(text);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;/script&amp;gt;    &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;command priority=&amp;quot;2&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;read [something]&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;emulateRecognition&amp;gt;select {[something]}&amp;lt;/emulateRecognition&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.25&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;emulateRecognition&amp;gt;read that&amp;lt;/emulateRecognition&amp;gt;    &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;command priority=&amp;quot;1&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;read [textInDocument]&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;read the word [textInDocument]&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;emulateRecognition waitForDisambiguation=&amp;quot;15&amp;quot;&amp;gt;select {[textInDocument]}&amp;lt;/emulateRecognition&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;waitFor seconds=&amp;quot;.25&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;emulateRecognition&amp;gt;read that&amp;lt;/emulateRecognition&amp;gt;    &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;command priority=&amp;quot;0&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;read *&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;setTextFeedback style=&amp;quot;warning&amp;quot;&amp;gt;What was that?&amp;lt;/setTextFeedback&amp;gt;    &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;!-- Stop Reading --&amp;gt;   &lt;br /&gt;&amp;lt;command&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;?please stop reading&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;speak speakFlags=&amp;quot;2&amp;quot;&amp;gt;Stopped&amp;lt;/speak&amp;gt;    &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; &amp;lt;!-- Time and date --&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; &amp;lt;!-- What time is it? --&amp;gt;   &lt;br /&gt;&amp;#160; &amp;lt;command&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;what time is it&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;JScript&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var date = new Date();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var whatToSay = &amp;quot;It's &amp;quot;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var hours = date.getHours();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var AMorPM;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (date.getHours() &amp;gt;= 12)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AMorPM = &amp;quot; P. M.&amp;quot;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (date.getHours() != 12)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; hours -= 12    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AMorPM = &amp;quot; A. M.&amp;quot;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; whatToSay += hours;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (date.getMinutes() == 0)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; whatToSay += &amp;quot; o'clock&amp;quot;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (date.getMinutes() &amp;lt; 10)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; whatToSay += &amp;quot; o &amp;quot;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; whatToSay += &amp;quot; &amp;quot; + date.getMinutes();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; whatToSay += AMorPM;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.Speak(whatToSay);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;!-- What's the date --&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;command&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;what's today's date&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;what's the date ?today&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; whatToSay = &amp;quot;Today is &amp;quot; &amp;amp; WeekdayName(Weekday(Now)) &amp;amp; &amp;quot; &amp;quot; &amp;amp; MonthName(Month(Now))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dayDate = Day(Now)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dayNumberText = &amp;quot; &amp;quot; &amp;amp; dayDate    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; whatToSay = whatToSay &amp;amp; &amp;quot; &amp;quot; &amp;amp; dayNumberText &amp;amp; &amp;quot; &amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; whatToSay = whatToSay &amp;amp; Year(Now)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.Speak(whatToSay)&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;rule name=&amp;quot;something&amp;quot;&amp;gt;   &lt;br /&gt; &amp;lt;list&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;o&amp;gt;the&amp;lt;/o&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;o&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;previous&amp;lt;/p&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;next&amp;lt;/p&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;o&amp;gt;&amp;lt;ruleref name=&amp;quot;1to20&amp;quot;/&amp;gt;&amp;lt;/o&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/o&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;character&amp;lt;/p&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;characters&amp;lt;/p&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;word&amp;lt;/p&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;words&amp;lt;/p&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;sentence&amp;lt;/p&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;sentences&amp;lt;/p&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;paragraph&amp;lt;/p&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;paragraphs&amp;lt;/p&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;document&amp;lt;/p&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;/p&amp;gt;    &lt;br /&gt; &amp;lt;/list&amp;gt;    &lt;br /&gt;&amp;lt;/rule&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;numbers name=&amp;quot;1to20&amp;quot; start=&amp;quot;1&amp;quot; stop=&amp;quot;20&amp;quot;/&amp;gt;   &lt;br /&gt;&amp;lt;/speechMacros&amp;gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8556609" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Microsoft Speech Powered Azentek Wins International Telematics Award for Best Aftermarket Device</title><link>http://blogs.msdn.com/robch/archive/2008/05/23/microsoft-speech-powered-azentek-wins-international-telematics-award-for-best-aftermarket-device.aspx</link><pubDate>Fri, 23 May 2008 18:53:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8539924</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/8539924.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8539924</wfw:commentRss><description>&lt;p&gt;Did you know you could experience Microsoft's Speech Recognition technology in cars? No, I'm not talking about Ford Sync. I'm talking about an after market system designed to run Windows Vista in an in-dash PC made by Azentek. &lt;/p&gt;  &lt;p&gt;And ... They just won the International Telematics Award for Best Aftermarket Device. Cool! &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Azentek, today announced it has won the &amp;#8220;Best Aftermarket Device&amp;#8221; award for its Atlas CPC-1000, the industry&amp;#8217;s first all-in-one fully integrated in-car multimedia PC.&amp;#160; At an exclusive gala dinner in Detroit, Michigan, Telematics Update Magazine revealed the winners of the sixth annual Telematics Awards on the evening of May 20th.&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I've not played with it myself, so I don't know exactly what kinds of scenarios they've enabled, but ... I do know for a fact that it's using the built-in speech recognition systems of the Windows Vista OS. &lt;/p&gt;  &lt;p&gt;You can read more about it &lt;a href="http://www.azentekonline.com/cms/content/view/76/47/"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;That means I could probably install the latest and greatest &lt;a href="http://download.speechmacros.com"&gt;WSR Macro&lt;/a&gt; tool on the car stereo and really have some fun. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8539924" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/In+the+News/default.aspx">In the News</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Applications/default.aspx">Speech Applications</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item></channel></rss>