プチコン3号&BIGまとめWiki

投稿プログラム : Extended MML フォーマット

パンくずリスト

2019年6月17日投稿 / 2019年7月8日更新 / 投稿者 : Na / タグ : 投稿プログラム 実用ツール ツール MML 音楽

概要

MML文字列にタイトルなどの情報を埋め込むための音楽フォーマットです。
再生する際はBGMPLAYに渡すだけでよく、とても簡単です。

記述方法

拡張子は「.MML」にします。
タグの記述は{TITLE=あいうえお}のように行います。
この文字列は、MML文字列内のどこに置いてもかまいません。
また、改行は/n\n、改行(文字コード10)のいずれかで指定します。
指定可能なタグは以下の通りです。
これらすべてを指定する必要はありません。また、この順番である必要もありません。
この一覧にあるものしか指定できないわけではありません。
(高原のなさんのNMPACKSで指定できるものはすべて指定できます。というか丸コピです。)

TITLE曲のタイトル
ALBUMアルバム
COMP作曲者(composerの略)
ARR編曲者(arrangerの略)
LRCIST作詞者(lyricistの略)
PERF演奏者(performerの略)
LYRIC歌詞(表示目的?)
TEXT曲の説明など
GENREジャンル
COPYRコピーライト
DATE制作日時(yyyy-mm-dd形式が望ましいが、区切り文字は/や漢字による助数詞も許容されるらしいです。)
WAVxxxWAVSET用のデータ。アタック,ディケイ,サスティン,リリース,定義文字列[,基準音程]を指定する。
VERバージョン情報。3は3号用、4は4用、0は両対応であることを表す。省略時は0。

NMPACKSとの相違点は、

  • すべて大文字。
  • 仕様上7文字しか入らないため上の表のとおりの省略形を使う。
  • 埋め込み構文は使用しない。

また、仕様上、:{}は使用できません。

  • {}の個数が一致し、括弧が正しく対応している場合はokです。
  • どうしても表示させたい場合は、全角の:(文字コード&HFF1A)(&HFF5B)(&HFF5D)を使用できます。

以下に例を示します。

  1. {TITLE=テスト}
  2. {ALBUM=hogehoge}
  3. {VER=3}
  4. :0@144Q8L4CDEF
  5. GAB<C
  6. {TEXT=ここで改行→
  7. 改行終わり}
  8. {WAV224=127,127,127,127,80808080FFFFFFFF80808080FFFFFFFF}

MML文字列中の改行は、BGMPLAYには影響を及ぼしませんので、EDITモードでの編集が可能です。

再生方法

詳細は、同梱のEXMML_SAMPLEをご確認ください。

タグの取得

INSTRを使って取得します。
サンプルに入っているEXMML$(MML$,META$)を使用すると簡単です。

WAVSET

INSTRを使ってなんとかします。
サンプルに入っているEXMML_WAVSET MML$を使用すると簡単です。

3号/4の変換

MMLTO4$関数及び、4→3号の変換であるMMLTO3$を同梱しました。(完全ではありませんが。)
3号→4の変換の際、マクロを定義前に使用するとエラーになるため、MML_REP$をお使いください。(公開キーのプログラムには入ってません。)

再生

BGMPLAY

公開キー

プチコン3号用の公開キーです。トップメニューの「作品公開とダウンロード」から公開キーを入力すると、作品をダウンロードすることができます。

ver1.1
KKRE7KHV

ver1.1 タグ内に{}があると正しく取得できないバグを修正。 ver1.2 EXMML_DEL$(指定したタグ削除)追加。MMLTO3$で@130〜@148を@131に変更するようにした。

プログラムリスト

  1. ’Extended MML Library ver1.3
  2. DEF EXMML$(MML$,META$)’19/7/8 更新
  3.  VAR I,J,K=0,R$=””
  4.  I=INSTR(MML$,”{”+META$+”=”)
  5.  IF I!=−1 THEN
  6.   I=I+LEN(META$)+2
  7.   FOR J=I TO LEN(MML$)−1
  8.    IF MML$[J]==”{” THEN INK K
  9.    IF MML$[J]==”}” AND K==0 THEN BREAK
  10.    IF MML$[J]==”}” THEN DEC K
  11.   NEXT
  12.   R$=MID$(MML$,I,J−I)
  13.  ENDIF
  14.  I=INSTR(R$,”/n”)
  15.  WHILE I>=0
  16.   R$=SUBST$(R$,I,2,CHR$(10))
  17.   I=INSTR(R$,”/n”)
  18.  WEND
  19.  I=INSTR(R$,”\n”)
  20.  WHILE I>=0
  21.   R$=SUBST$(R$,I,2,CHR$(10))
  22.   I=INSTR(R$,”\n”)
  23.  WEND
  24.  RETURN R$
  25. END
  26. ’−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  27. DEF EXMML_DEL$(MML$,META$)’19/7/20
  28.  VAR I,J,K=0,R$=MML$+””
  29.  I=INSTR(MML$,”{”+META$+”=”)
  30.  IF I!=−1 THEN
  31.   FOR J=I+LEN(META$)+2 TO LEN(MML$)−1
  32.    IF MML$[J]==”{” THEN INK K
  33.    IF MML$[J]==”}” AND K==0 THEN BREAK
  34.    IF MML$[J]==”}” THEN DEC K
  35.   NEXT
  36.   R$=SUBST$(MML$,I,J+1−I,””)
  37.  ENDIF
  38.  RETURN R$
  39. END
  40. ’−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  41. DEF EXMML_WAVSET MML$ ’19/6/17
  42.  VAR I,J,K,T$,C,P$[6],N
  43.  I=INSTR(MML$,”{WAV”)
  44.  WHILE I!=−1
  45.   FILL P$,””
  46.   I=I+4
  47.   C=VAL(MID$(MML$,I,3))
  48.   IF C>=224 AND C<=255 THEN
  49.    I=I+4
  50.    J=INSTR(I,MML$,”}”)
  51.    IF J!=−1 THEN
  52.     T$=MID$(MML$,I,J−I)
  53.     J=0
  54.     K=INSTR(T$,”,”)
  55.     N=0
  56.     WHILE K!=−1 AND N<6
  57.      P$[N]=MID$(T$,J,K−J)
  58.      J=K+1
  59.      K=INSTR(J,T$,”,”)
  60.      INC N
  61.     WEND
  62.     IF N<6 THEN P$[N]=MID$(T$,J,LEN(T$)−J)
  63.     IF P$[5]==”” THEN P$[5]=”69”
  64.     WAVSET C,VAL(P$[0]),VAL(P$[1]),VAL(P$[2]),VAL(P$[3]),P$[4],VAL(P$[5])
  65.    ENDIF
  66.   ENDIF
  67.   I=INSTR(I,MML$,”{WAV”)
  68.  WEND
  69. END
  70. ’−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  71. DEF MMLTO4$(_M$)’19/6/17
  72.  VAR I,V,M$=_M$+””
  73.  I=INSTR(M$,”Q”)
  74.  WHILE I>=0
  75.   V=VAL(MID$(M$,I+1,1))
  76.   M$=SUBST$(M$,I+1,1,STR$(V*4))
  77.   I=INSTR(I+1,M$,”Q”)
  78.  WEND
  79.  I=INSTR(M$,”@”)
  80.  WHILE I>=0
  81.   V=VAL(MID$(M$,I+1,3))
  82.   IF V>=144 AND V<=151 THEN
  83.    M$=SUBST$(M$,I+1,3,STR$(V+72))
  84.   ENDIF
  85.   I=INSTR(I+1,M$,”@”)
  86.  WEND
  87.  RETURN M$
  88. END
  89. ’−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  90. DEF MMLTO3$(_M$)’19/7/20 更新
  91.  VAR I,V,M$=_M$+””
  92.  I=INSTR(M$,”Q”)
  93.  WHILE I>=0
  94.   V=VAL(MID$(M$,I+1,2))
  95.   IF V>0 THEN
  96.    M$=SUBST$(M$,I+1,2,STR$(V>>2))
  97.   ELSE
  98.    V=VAL(MID$(M$,I+1,1))
  99.    M$=SUBST$(M$,I+1,1,STR$(V>>2))
  100.   ENDIF
  101.   I=INSTR(I+1,M$,”Q”)
  102.  WEND
  103.  I=INSTR(M$,”@”)
  104.  WHILE I>=0
  105.   V=VAL(MID$(M$,I+1,3))
  106.   IF V>=130 AND V<=148 THEN
  107.    M$=SUBST$(M$,I+1,3,”131”)
  108.   ENDIF
  109.   IF V>=216 AND V<=223 THEN
  110.    M$=SUBST$(M$,I+1,3,STR$(V−72))
  111.   ENDIF
  112.   I=INSTR(I+1,M$,”@”)
  113.  WEND
  114.  RETURN M$
  115. END
  116. ’−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  117. DEF MML_REP$(OLD$) ’19/8/18 追加
  118.  VAR MML$=OLD$+””,I,J,K,N$,R$
  119.  FOR I=0 TO LEN(MML$)−1 ’1文字ずつしらべる
  120.   
  121.   ’マクロ以外の部分はそのまま
  122.   IF MML$[I]!=”{” THEN CONTINUE
  123.   
  124.   K=0 ’Kはかっこが何重になっているか表す
  125.   FOR J=I+1 TO LEN(MML$)−1 ’{から先を調べる
  126.    IF MML$[J]==”{” THEN K=K+1
  127.    IF MML$[J]==”}” AND K==0 THEN BREAK ’}の位置がJに入っている
  128.    IF MML$[J]==”}” THEN K=K−1
  129.   NEXT
  130.   ’Kはもう使っていない
  131.   ’=が{}の中にあったら無視する
  132.   K=INSTR(I,MML$,”=”)
  133.   IF K!=−1 AND K<J THEN I=K:CONTINUE
  134.   ’↑でI=Kとしたのは{A={B}}などの時に”=”以降の”{B}”も置き換えするため
  135.   
  136.   N$=MID$(MML$,I+1,J−I−1) ’マクロの名前を取り出す
  137.   R$=EXMML$(MML$,N$) ’そのマクロの中身を取り出す
  138.   ’(EXMML$はExtendedMMLのライブラリにある)
  139.   
  140.   MML$=SUBST$(MML$,I,J−I+1,R$) ’マクロ全体を中身に置き換える
  141.   I=I−1 ’1文字戻してもう一回調べる
  142.  NEXT
  143.  
  144.  RETURN MML$
  145. END

CHECKER FLAG (ひとことコメント)

この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)


メニュー 【3号】

ヘルプ

リンク

最近の更新

最近の人気ページ

オンライン情報

  • 現在同時に 1 人がこのサイトを見ています
  • このページはこれまでに 389 回、本日は 1 回、昨日は 5 回閲覧されました

ページの先頭に戻る

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.029 秒 | このページの最終更新 : 2019/08/18 (日) 14:50:11 (65d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30