PowerShellでSmallBasicLibrary.dllを使ってMMLにて「ドレミの歌」を奏でてみよう2013-02-05PowerShellでSmallBasicLibrary.dllを使ってMMLにて「ドレミの歌」を奏でてみようPowerShell前回は、ビープ音で「ドレミの歌」を奏でました。PowerShellでビープ音の「ドレミの歌」を奏でてみようところが、Beep音は同時に鳴らすことができないため、和音は奏でられません。WindowsではWMVの再生などは.Netで出来ますが、どうも音を作って鳴らす事が難しそうです。そこで他の簡単に利用できそうな手段を探して見ると......あるじゃ無いですかSmallBasicLibrary.dllでMMLが奏でられるようです。C#でドレミファソなどの音階を再生することはできるでしょうか今回は、PowerShellでSmallBasicLibrary.dllを参照してMMLを奏でてみます。Basicとは細かいことは調べていただいて(おい)、簡単にいうと無料で利用できる「マイクロソフトの学習用プログラミング言語である。昔私もちょろっと触って、プログラムの世界に迷いこんだ記憶が...。Basic公式ページにはこうあります。Basicをダウンロードしてください。(本メソッドが含まれるのは0.9かららしいです。※05/Feb/2013現在の最新バージョンは1.0です。SmallBasicをインストールします。SmallBasicLobrary.dllが存在する事を確かめます。※私はスクリプトのフォルダにコピーして参照に追加しています。V2.0から追加されました。これにより、外部dllを容易に参照追加できます。今回は、以下のようにスクリプトパスにSmallBasic1.0フォルダを作って、その中にSmallBasicLibrary.dllを入れています。参照追加するには、以下の一文で完了します。".\SmallBasic1.0\SmallBasicLibrary.dll"PlayMusic()メソッドを呼び出すあとは、メソッドを呼び出します。SmallBasicブログによるとMMLを奏でる為のメソッドは、.PlayMusic()です。here!.PlayMusic()メソッドは、Microsoft.SmallBasic.Library.Soundにあるようです。よって、PowerShellでメソッドを呼び出すには、以下のように記述します。)MMLで記述するSmallBasicLibrary.dllへ音を渡すには、MMLのサブセットとして記述する必要が有るようです。C4")MMLの記述はここが分かりやすかったです。使える要素PowerShellで渡すならこうですね。)}Get-PlaymusicでFunction化しておく前回同様、一々メソッドを書いていられないのでfunction化してしまいます。今回は、MMLとして[string]型で渡しますので、filterでコレクション処理する必要はありません。よって、functionとします。)}Doremiの歌もFunction化して実行あとは、楽譜通りに入力するだけです。Get-Playmusic}}doremi-song和音はできるのかさて、肝心の和音ですがMMLはもくろみ通り別々に実行すると和音として奏でられます。コマンドを非同期に「バックグラウンドでなく」実行する方法がナカナカ思いつかず...。最終的には、PowerGUIでexeにコンパイルして非同期に実行させようと思います。楽譜はどこだYoutubeにあった、楽譜のピアノ譜面「右手と左手」でいこうかと思います。ポップスver」(大合奏バンドブラザーズDX)+楽譜PowerGUIでコンパイルする際の注意SmallBasicLibrary.dllをコンパイル時の参照に追加しますが、パスがスクリプトと同一パスになります。よって、以下のように参照を書き換えます。これでスクリプトを今まで通り実行してもコンパイルして実行しても平気ですね。".\SmallBasicLibrary.dll"}}Add-dllSmallBasic右手のスクリプトでは、後は繰り返しなのでどーんと。1行/1小節で記述しています。}}Add-dllSmallBasicdoremi-song左手のスクリプトどどどーんと。1行/1小節で記述しています。33.5はコンパイルして非同期に実行した際の右手のスクリプトとのタイムラグを埋めるためです。33.5doremi-songコンパイル前回の記事で紹介したように、PowerGUIで右手と左手のスクリプトをそれぞれコンパイルします。コンパイルしたファイルを非同期に実行する簡単です。Start-Processコマンドレットで実行するだけです。".\SmallBasic-cmdlt.exe"あるいは、以下のサイトで紹介されている方法もありますが変わりません。外部プログラムを非同期で起動するこの場合、こうでしょうか。Sleepで、スクリプトの実行タイミングを調整しても実行毎に変わります。実行中に左手用のスクリプトが徐々に遅れていって、最終的に4分音符程度まで遅れます。一行毎のステップ実行では同期が取れているのでどうやらこうやらです。まとめあと一歩だったんですが楽しかったのでいいです。-...ファイルの連結について、いい記事があります。色付きメッセージを出してみるPowerShellでのホスト表示にはいくつかの方法があります。読者になるこのブログについて引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。