Adlib Tracker IIとMIDIアプリを同時に立ち上げるWSH

前回のエントリで自動化出来なかった部分ですが、WSHを使ってどうにか実現できたので公開します。
ていうか最初、「WSHならどうにかなんじゃね?」と思って色々調べてたんですね。WSHは確かJScriptが使える……というおぼろげな記憶があったので。文法さえ知ってればあとは必要なオブジェクトの使い方を覚えるだけでいけますし。
ところが調べていくうちに、cmd.exeとWSHを統合したようなPowerShellとかいう次世代シェルが浮上してきまして。
「今後こいつが標準化していくなら、WSHよりこっち覚えた方がよくね?」
これが運の尽きでした……。
色々と面白そうな気配はあるものの、全くちんぷんかんぷんでしてね! というか、どうもこいつはシステム管理者向けに設計されているらしく、今回のような自動化処理をするための手引きはいくら探しても出てこないんですよ。
「こうすれば過去の資産を利用出来ますよ。はい終わり」てな感じで。
で、むせび泣きながらWSHで書きました。WSHでも結構詰まりましたが。
オブジェクトに対する「for ~ in」のループでメンバの列挙が出来ないとか。DontEnum属性とかそういうやつ? でもEnumeratorとかいう謎のオブジェクトで列挙出来ちゃうのね不思議。
あと、どうやってもフルスクリーン化だけは出来ませんでした……。どうもSendKeys()が効かないらしく。
ウィンドウ表示だと、横幅が足らなくて表示が化けちゃうんですよね……。
また、起動後にフルスクリーンにすると、この場合も横幅が足らなくて横スクロールが発生してしまいます。どうにかAT2起動前にフルスクリーン化出来ないもんでしょうか……。
ほんとはショートカットのプロパティであらかじめ全画面を指定しておいて、ショートカットから起動させたかったんです。
でも、Exec()メソッドはショートカットを実行可能ファイルとして認識してくれない……。
Run()メソッドだとちゃんと実行してくれるんですが、こっちはこっちで色々とへたれてるんですよね。第三引数でtrueを指定出来ないとか、単純にショートカットのパスを指定するだけだと起動した瞬間に終了してしまうとか、「cmd /k」で立ち上げるとcmd.exeが残っちゃってAT2の操作がバグるだとか……。
だれかどうにかして下さい。
追記。
フルスクリーン出来ました!
下記も最新版のWSHに差し替えてあります。
前置き長すぎますね。これです。ご利用は自己責任でお願いします。
これのショートカットをよく使う場所に置いておけばクリックひとつでAT2が起動出来ます。
↓ソース。
/*
Adlib Tracker II 起動スクリプト
2009-01-14 KAY
・環境設定は、ご自身の環境に合わせて適宜変更して下さい。
・環境設定に記述するパスのセパレータは、「\(バックスラッシュ)」ではなく「/」または「\\」を使用して下さい。
・vbei.exeが必要です。別途ダウンロードしてこのスクリプトと同じディレクトリに置いて下さい。
*/
//環境設定
var aioPath = //AllowIo.exeのパス
"d:/porttalk/allowio";
var at2Path = //AT2のパス
"adtrack2";
var at2Port = //AT2が使用するポート
"0x388";
var midiName = //MIDIアプリのファイル名(プロセス名)
"MidiKeyB.exe";
var midiPath = //MIDIアプリのパス
"d:/midikeyb/";
var waitTime = //MIDIアプリがMIDIデバイスを使い始めるまでの遅延時間
1000;
////////////////////////////////////////////////////////////////////////////////
var wso = WScript.CreateObject("WScript.Shell");
var exist = false;
var midiApp = null;
//プロセスを調べてMIDIアプリが立ち上がっているかを調べる
for(var i = new Enumerator(GetObject("winmgmts:").InstancesOf("Win32_Process")); !i.atEnd(); i.moveNext()) {
if(i.item().Name == midiName) {
exist = true;
break;
}
}
//MIDIアプリが無ければ立ち上げて、少し待つ
if(!exist) {
midiApp = wso.Exec(midiPath + midiName);
WScript.Sleep(waitTime);
}
//AT2を起動(StdOut.ReadAll()でAT2の終了まで待つ事が出来る)
wso.Exec("cmd /c us & vbei & " + aioPath + " " + at2Path + " " + at2Port).StdOut.ReadAll();
//このスクリプト内でMIDIアプリが立ち上げられていれば、終了を促す
(midiApp !== null) && (midiApp.Status == 0) && wso.Run("cmd /c taskkill /pid " + midiApp.ProcessId, 7);
スクリプト冒頭の環境設定の部分はご自身の環境に合わせて書き換えて下さいね。
vbei.exeはこちらからダウンロードして下さい。→LP-Project (DOS & DOS/V Tools)
at2_up.jsをadtrack2.exeと違うディレクトリに置く場合は、at2Pathはフルパスで記入して下さい。
AT2の起動に失敗する場合はwaitTimeの値を増やしてみて下さい。
ところで、色々判ってる人だったら、ActiveX越しに直接MIDIデバイスと会話出来るのかな?



