ZMSコンパイルNo.04515
fixerXVI さん 04/11/08 22:36
 
初めまして。マクロをこれから勉強しようとしているfixerXVIと申します。

「秀丸エディタハンドブック」を買って、7-1のコンパイルのところを参考に、以下
のような動作をマクロで組めないかと四苦八苦しているところです。

Z-MusicというMMLのテキストファイルでソースファイルを作っているのですが、
ZMC3.EXEというコンパイラーに
1.今作業しているファイルをいったん保存(上書き可)(拡張子ZMS)
2.保存したファイルをZMC3.EXEに渡し、コンパイルする(run "path\ZMC3.EXE \""
+ filename + "\")
3.コンパイルしてできたファイル(拡張子ZMD)をさらに
スタンダードMIDIファイルにコンバートする(.ZMD→.MID)
(run "path\Z2M3.EXE \"" + filename.zmd + "\")
4.コンバートしたファイルを対応アプリケーションに渡して演奏
run TMIDI.exe filename.mid のような感じで

今のところ、1.まではできますが
こんなマクロファイルです。
// 現在開いているZMSソースファイルをコンパイルするマクロ

if (updated) {
 // もしファイルが更新されていたら保存する
 save;
 if (!result) endmacro;
}

// コンパイラの実行と結果の別ウィンドウへの出力
run "D:\BIN\ZM\ZMC3.exe \"" + filename + "\" > con

この先どう記述していいのかわからないのと、
きちんと変換できたかを確認したいため、標準出力も参照したい
のですが、conの使い方がおかしいのか編集結果に帰ってきません

何かよい方法がありましたらご教授ください。

[ ]
RE:04515 ZMSコンパイルNo.04516
杉浦 まさき さん 04/11/08 23:36
 
fixerXVIさん、こんばんは。
杉浦 まさきと申します。

>// コンパイラの実行と結果の別ウィンドウへの出力
>run "D:\BIN\ZM\ZMC3.exe \"" + filename + "\" > con



run "D:\\BIN\\ZM\\ZMC3.exe \"" + filename + "\" > con";

が正しいです。文字列リテラル中に円記号を書くときは"\\"と
2つ続けて書きます。

その先の話については、またわからなければ
質問してください、ということで(^^;。


[ ]
RE:04516 ZMSコンパイルNo.04517
fixerXVI さん 04/11/10 00:15
 
>杉浦 まさきと申します。

ありがとうございますm(__)m

>run "D:\\BIN\\ZM\\ZMC3.exe \"" + filename + "\" > con";
>が正しいです。文字列リテラル中に円記号を書くときは"\\"と

なるほど、path名にも\\を二つ書くのですね。
無事、コンパイル結果が別ウィンドウで開きました!!

さて、その次はファイル操作ということになりますね。
そのまま、出力した.ZMDファイルを.MIDに変換してTMIDI.EXEに渡す
ということをマクロでやりたいのですが、

マクロでできるかどうかが今回の肝です。
.MIDへの変換は Z2M3.exeに.ZMDファイルをパス名を含んだ形で渡し、
その出力結果をTMIDI.exeにパイプすると言ったらわかりますでしょうか?

[ ]
RE:04517 ZMSコンパイルNo.04518
ENCODINGSHIFTJIS さん 04/11/10 11:19
 
秀丸は コマンドラインプロセッサ ではない
ので、con のリダイレクトは秀丸独自のもので、
また、パイプ結合 もありません。
 
コマンド 引数・・・

の形のみです。.BAT を発生させたり .BAT を起動します。

[ ]
RE:04518 ZMSコンパイルNo.04519
fixerXVI さん 04/11/10 21:05
 
ENCODINGSHIFTJISさま、ありがとうございます。

>秀丸は コマンドラインプロセッサ ではない
>ので、con のリダイレクトは秀丸独自のもので、
>また、パイプ結合 もありません。

そうでしたか。なかなか、思った通りの動作をさせるのは難しいですね。

>コマンド 引数・・・
>の形のみです。.BAT を発生させたり .BAT を起動します。

では、バッチファイルにファイル名を拡張子を含まない形で
引数として渡すことはできますでしょうか?>皆様

このような.BATを考えてます
--
"D:\BIN\ZM\Z2M3.exe" -i0 -x6 -L4 -F10 %1.ZMD -o %1.MID
IF ERRORLEVEL 1 GOTO ERR
DEL %1.ZMD
"D:\BIN\ZM\TMIDCTRL.EXE" execute playfile %1.MID
IF ERRORLEVEL 1 GOTO ERR
GOTO TERMINATE
:ERR
echo
REM BEEPを鳴らす
PAUSE
PAUSE もう一度キーを押すとWindowを閉じます
:TERMINATE
PAUSE
EXIT
--


[ ]
RE:04519 ZMSコンパイルNo.04520
h-tom さん 04/11/10 23:25
 

h-tom です。

>>秀丸は コマンドラインプロセッサ ではない
>>ので、con のリダイレクトは秀丸独自のもので、
>>また、パイプ結合 もありません。
>
>そうでしたか。なかなか、思った通りの動作をさせるのは難しいですね。
秀丸では出来ませんが、cmd.exeやcommand.comを経由すれば出来ますよ。
run getenv("COMSPEC") + " /c dir *.*|sort -r > con";

>では、バッチファイルにファイル名を拡張子を含まない形で
>引数として渡すことはできますでしょうか?>皆様
拡張子があるファイルなら filetype で拡張子がわかるので、filename
から、拡張子の長さを削れば拡張子なしのファイル名が取得できます。

message leftstr(filename, strlen(filename) - strlen(filetype));

NT系OSなら、バッチファイル内で拡張子を含まないファイル名を取得で
きるけどね。

[ ]
RE:04519 ZMSコンパイルNo.04521
encodingshiftjis さん 04/11/10 23:43
 
run  macrodir + "\\a.cmd " +  basename; // 空白を含むファイル名でない場合

a.cmd をマクロと同じディレクトリに入れた場合です。
basename が %1 になります

秀丸マクロヘルプを参照、ファイル名関連キーワード

[ ]
RE:04521 ZMSコンパイルNo.04522
ENCODINGSHIFTJIS さん 04/11/11 18:03
 
 目次−そのほかのコマンド−プログラム実行の詳細
と同様な、ShellExecuteEx? らしいです。
 
basename の代わりに %b、とか %temp% %USERNAME% なども
run文 の起動文字列には効きます。

[ ]
RE:04520 ZMSコンパイルNo.04523
fixerXVI さん 04/11/12 22:34
 
h-tomさん、恐れ入ります。
OSが何かを書いておりませんでした(^^;

WindowXP Home Edition(SP1)です。

>秀丸では出来ませんが、cmd.exeやcommand.comを経由すれば出来ますよ。
>run getenv("COMSPEC") + " /c dir *.*|sort -r > con";

getenv("COMSPEC")までがCMD.EXEを指定しているということですね?
" /c …"がコマンドパラメータということで。

>message leftstr(filename, strlen(filename) - strlen(filetype));
>
>バッチファイル内で拡張子を含まないファイル名を取得できる

すみません。コマンド体系についてほとんど知識がないので
「拡張子を含まないファイル名」とはどのように記述するのでしょうか。%b ? %n ?


[ ]
RE:04523 ZMSコンパイルNo.04524
h-tom さん 04/11/13 00:04
 

h-tom です。

>すみません。コマンド体系についてほとんど知識がないので
>「拡張子を含まないファイル名」とはどのように記述するのでしょうか。%b ? %n ?

"%b"って事はバッチファイルでなく、マクロか「プログラム実行」でいいんです
よね?("%n"なんてないけど・・・)

「拡張子を含まないファイル名」はキーワードで用意されていないので、自分で
どうにかするしかありません。
その方法が
>>message leftstr(filename, strlen(filename) - strlen(filetype));
です。
filenameを使っているのでフルパスになってますが、basename を使えばファイル名
だけになりますよ。

[ ]
RE:04524 ZMSコンパイルNo.04525
fixerXVI さん 04/11/13 19:58
 
>"%b"って事はバッチファイルでなく、マクロか「プログラム実行」でいいんです
>よね?("%n"なんてないけど・・・)

すみません、バッチコマンドには%nというのはありませんでした。
勘違いしていました。本屋に行って少しだけ勉強しましたら
バッチファイルに渡せるパラメータは%0から%9だけでした。

%1に当たるところに

>「拡張子を含まないファイル名」は
>>message leftstr(filename, strlen(filename) - strlen(filetype));

で得た文字列を渡せばいいようですね。

[ ]
RE:04525 ZMSコンパイルNo.04527
三月 さん 04/11/13 21:19
 
>>"%b"って事はバッチファイルでなく、マクロか「プログラム実行」でいいんです
>>よね?("%n"なんてないけど・・・)
>
>すみません、バッチコマンドには%nというのはありませんでした。
>勘違いしていました。本屋に行って少しだけ勉強しましたら
>バッチファイルに渡せるパラメータは%0から%9だけでした。
>
>%1に当たるところに
>
バッチファイルで%1のファイル名の部分を取得するには
「%~n1」にすればよいです。

拡張子を置き換えたフルパス名にするなら
「%~d1%~p1%~n1.mid」
とかにすれば良いです。
「%~dp1%~n1.mid」
でも可能です。

Win2000ならヘルプで
「バッチ ファイル」「置き換え可能パラメータ」
WinXPなら
「バッチ パラメータを使用する」
を参照すれば載ってます。

他のOSの場合は不明ですが。

[ ]
RE:04527 ZMSコンパイルNo.04528
fixerXVI さん 04/11/14 11:58
 
マルチレスで失礼いたします

h-tom様、杉浦まさき様、三月様、ENCODINGSHIFTJIS様
ありがとうございました。
無事、現在編集しているZMSファイルを
1.変更があったら上書き保存
2.ZMC3.EXEへZMSファイルを渡し、コンパイル
3.ZC_FIXER2.BATへbasename2パラメータでファイル名を渡し
4.SMFにコンバート後、鳴らす

までができました。
バッチファイル内において拡張子を含まないファイル名の記述方法が
わからず四苦八苦しておりましたが、三月様のResによって解決いたしました。

マクロの最終書式は今のところ以下の通りです。
"ZMS_COMPILE.mac"
--ここから--
if (updated) {
 // もしファイルが更新されていたら保存する
 save;
 if (!result) endmacro;
}

run macrodir + "\\ZC_FIXER2.BAT " + basename2;
--ここまで--


また、ZC_FIXER2.BATの内容は以下の通りです

--ここから--
"D:\BIN\ZM\ZMC3.exe" %~d1%~p1%~n1.zms -o %~d1%~p1%~n1.ZMD
IF ERRORLEVEL 1 GOTO ERR
"D:\BIN\ZM\Z2M3.exe" -i0 -x6 -L4 -F10 %~d1%~p1%~n1.ZMD -o %~d1%~p1%~n1.MID
IF ERRORLEVEL 1 GOTO ERR
DEL %~d1%~p1%~n1.ZMD
"D:\BIN\ZM\TMIDCTRL.EXE" execute playfile %~d1%~p1%~n1.MID
IF ERRORLEVEL 1 GOTO ERR
GOTO TERMINATE
:ERR
echo
PAUSE
PAUSE もう一度キーを押すとWindowを閉じます
:TERMINATE
EXIT
--ここまで--

余談ですが、ZC_FIXER2.BATは
http://zworks.ibanavi.jp/documents/z_eme3.html
にあるバッチファイルを参考にしました。
もし、ZMUSICを使った作曲をされる方がおられたら参考になれば幸いです。

fixerXVI@www.dia.janis.or.jp/~fixer/index.htm

[ ]