コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
takumi ◆Ce3Q40uXWJjn
2019/8/18 9:12
質問
MMLのマクロ定義を自動で先頭に持ってくる方法
プチコン3号では大丈夫だったマクロの一部機能の、定義前でもマクロを記述可能とういうこと。
ですが、プチコン4ではできません。
そこで、次のような命令を作りたいのですが、MIDとかINSTRとか使ってもできません。。。
誰か教えてください。。。

命令
MML=LEN(MML$)
MML内から"{"を探す
もしあれば、それより後の文字列から"}"を探す
もしあれば、"{""}"の中から"="を探す
もしなければ、スルー
もしあれば、"{"〜"}"の部分をMML$から削除する
削除したのをMML$の先頭にもってくる
次へ(移動した部分はする)

コメント

アバター
Na 2019/8/18 13:12 ◆QoELVrBXBQCI
とりあえずそのまま作ると
I=INSTR(MML$,"{")
WHILE I>=0
J=INSTR(I,MML$,"}")
K=INSTR(I,MML$,"=")
IF K!=-1 AND K<J THEN '=があるとき
M$=MID$(MML$,I,J+1-I) '{〜}を取り出す
MML$=SUBST$(MML$,I,J+1-I,"") '{〜}を消す
MML$=M$+MML$ '先頭に持ってくる
I=J '}の位置まで移動
ENDIF
I=INSTR(I+1,MML$,"{") '次の{の位置
WEND

ところがこれだと2重マクロ(例えば、{A={B}}など)が正しく処理されません。
2重マクロまで対応させるなら、INSTRを使わずにFORで1文字ずつ調べる必要があります。

ちなみにMPlay1(で使っているVisualMML)はマクロをすべて展開するので4でも再生できちゃいます(宣伝)
アバター
takumi 2019/8/18 13:44 ◆Ce3Q40uXWJjn
なるほど...展開ってことにすればできるかも知れないのか。。。
展開のDEFがVisualMMLについているってことですね?
アバター
Na 2019/8/18 13:47 ◆QoELVrBXBQCI
いや、その部分だけではDEFになってないです。
アバター
takumi 2019/8/18 13:47 ◆Ce3Q40uXWJjn
それ使うか...(やりなげ
アバター
Na 2019/8/18 13:49 ◆QoELVrBXBQCI
Visual MMLの
DEF LD PS (←LDが関数名でPSが変数)の中の、
IF C$=="{" THEN 〜
の部分がそれですね。
ただその部分だけ使うなら変数とか書き直さないと...
アバター
Na 2019/8/18 14:09 ◆QoELVrBXBQCI
DEF MML_REP$(OLD$)
VAR MML$=OLD$+"",I,J,K,N$,R$
FOR I=0 TO LEN(MML$)-1 '1文字ずつしらべる

'マクロ以外の部分はそのまま
IF MML$[I]!="{" THEN CONTINUE

K=0 'Kはかっこが何重になっているか表す
FOR J=I+1 TO LEN(MML$)-1 '{から先を調べる
IF MML$[J]=="{" THEN K=K+1
IF MML$[J]=="}" AND K==0 THEN BREAK '}の位置がJに入っている
IF MML$[J]=="}" THEN K=K-1
NEXT
'Kはもう使っていない
'=が{}の中にあったら無視する
K=INSTR(I,MML$,"=")
IF K!=-1 AND K<J THEN I=K:CONTINUE
'↑でI=Kとしたのは{A={B}}などの時に"="以降の"{B}"も置き換えするため

N$=MID$(MML$,I+1,J-I-1) 'マクロの名前を取り出す
R$=EXMML$(MML$,N$) 'そのマクロの中身を取り出す
'(EXMML$はExtendedMMLのライブラリにある)

MML$=SUBST$(MML$,I,J-I+1,R$) 'マクロ全体を中身に置き換える
I=I-1 '1文字戻してもう一回調べる
NEXT

RETURN MML$
END
たぶんこんな感じでいけるはずです。
アバター
takumi 2019/8/18 14:42 ◆Ce3Q40uXWJjn
この部分だけ公開...無理だよね...
アバター
Na 2019/8/18 14:49 ◆QoELVrBXBQCI
まだ動作テストしてないですがExtendedMMLのページに同じコード置いときました。
公開キーは気が向いたら更新します。
http://wiki.hosiken.jp/petc3gou/?Toukou%2FExtendedMML
アバター
あきと 2019/8/18 17:53 ◆qGd5dQw2g3a2
興味が出たのでマクロ定義を前に持ってくるブログラムを作ってみました。
公開キー【更新しました】
ファイル名「MACRO_MOVE」

◎使い方
ソースの一番下にあるDATA文を削除して、マクロ定義を入れ替えたいMML文を貼り付けてください。
プログラムを実行すると保存するファイル名を決めるダイアログが出てマクロ定義を置き換えたMMLが保存されます。

MMLはきっちり決まった形式で保存されてるわけではないのでソース内にDATA定義する方法にしました。
あとマクロ内マクロには対応してません。
テスト実行用におもちつきのMMLをいくつかコピーしました。
アバター
takumi 2019/8/18 18:33 ◆Ce3Q40uXWJjn
ありがとうございます!
これと、Q数値変換機能を付けて再公開しようと思います。
(musics5のBGMFILE、このマクロのせいで118曲が42曲に減少したのです)
アバター
あきと 2019/8/18 19:29 ◆qGd5dQw2g3a2
マクロ内マクロの対応をするには{}が入れ子状に出て来る所の検出と、マクロ定義の順番の変更もたぶん必要なのかなと思いました。

ex)
{A={B}FGH}{B=CDE} ←Bの定義を前に持ってこないといけない。

MMLの細かい仕様を知らないのですが{A=CDE{B=FGH}}もありなのですか?
アバター
あきと 2019/8/20 2:41 ◆qGd5dQw2g3a2
MACRO_MOVEを更新しました。
公開キー【7K23338S】

MML文字列内のマクロ定義を前に持っていくプログラムで、さらにマクロ定義の中でマクロを参照している時はその順番も入れ替えます。

例えば
{A={B}FGH}{B=CDE}
この時は
{B=CDE}{A={B}FGH}
と定義する順番を入れ替えます。
循環定義してたらどうしようって感じですがそれはMML実行時エラーが出ることに期待します。

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -