「Generatio」MML編

***  特徴(と思わしき点)  ***
・「変数」・「マクロ」を定義可能です。
(変数の管理は()内で行うので譜面部分とは混同しにくくなっています。)
・音長指定が「ゲートタイム式」なので、
 「数値の大きさ」と「音の長さ」が直感的にわかりやすく、
 また、「細かな音長指定」も可能です。
(※ちなみに、音長指定の最小単位:「1フレーム」は、
 1000ms * 60 / (_tempo) / (_timebase)の「可変値」であり、
 ユーザ側で変動させることが可能です。)
・「単一のチャンネル」・「同一のタイミング」で「複数の音符」を記述できるので、
 「和音」を単一のチャンネルで鳴らすことが可能です。
    →「~」
・「オリジナルの波形」を記述して楽器として扱うことが可能です。
    →「(LOAD_MEM:)」


/::::   リファレンス   ::::/
以下、両モード共通→(特に表記なし)  通常モード→[normal]  変数モード→[valuable]


***  記号系  ***
;    …    行コメント(=その行は読まない)
\    …    コメント(=次の「\」までの部分を読まない(改行されていても可))


()    …    [normal]変数モード、[valuable]計算優先順位UP


~    …    [normal]和音モード(=次の「~」までを読んだ後、書き込み位置を戻す)
`    …    [normal]装飾音符(=次の「`」の直後の音符(休符)の音長を
             `-`間の分だけ短くする。)
          ※直後の音符(休符)の音長が「`-`間以下」の場合は反映されません。
{}n   …    [normal]連符(={}内の音長を合わせてnになるように等分する)
           (「{abc}24」 = 「a8b8c8」)
          ※割り切れない場合は「連符直後に余り分の休符」が挿入されます
           (「{abc}23」 = 「a7b7c7r2」)
^    …    [normal]値計算(=次の「^」までを読んだ後、計算した値に置き換える)
<, >   …    [normal]オクターブシフト
n  …    [normal]ノートシフト
@    …    [normal]ループ点指定(=終わりまで再生したら、ここまで戻って再度再生)
+, #   …    [normal]半音上げる  {必ず音程の直後に記述}
-    …    [normal]半音下げる  {必ず音程の直後に記述}
/:n-:/  …    [normal]/:〜:/間をn回リピート(=n回くりかえす)
           ---「n」が無い場合は「2」が代入されます。
           ---「/:」〜「:/」の間に「/(通常時)」があった場合、
             最後のくりかえしは「/:」〜「/」間のみ鳴らします。
           (※ネストも可能です(制限なし))
           --- 「/:-:/n」や「/:n1-:/n2」も可能です。
             (後者の場合は、n1回繰り返します)
.    …    [normal]音長を半分のばす
n^n   …    [normal]タイ  {後のnは数値で直後に指定すること}
&    …    [normal]スラー(=「q」の値無視で再生)  {必ず音長の直後に記述}


=    …    [valuable]変数の宣言・代入 {詳細は後述}
|    …    [valuable]マクロ定義    {詳細は後述}
:    …    [valuable]関数呼び出し   {詳細は後述}
+-*/%  …    [valuable]各種演算子(算数と同様)


***  文字系  ***
a〜g   …    [normal](指定した音程の)音符書き込み
r    …    [normal]休符書き込み
p    …    [normal]定位設定(+_max_pan 〜 -_max_panの範囲内で)
v    …    [normal]音量設定(0 〜 _max_volumeの範囲内で)
A〜   …    [normal]設定するパートの指定(Zまで)
           --- 連続して記述することで「+#n」と同様の機能を使用できます。
            「ABC cde」 = 「Acde Bcde Ccde」 = 「#0+#1+#2 cde」
#n    …    [normal]設定するパートの指定(0〜)
+#n   …    [normal]設定するパートの追加指定(0〜)(16個まで同時指定可能)


'    …    [normal]相対ボリューム(+) (直後に数値を入れるとその分だけ+/数値省略時は前回の値)
,    …    [normal]相対ボリューム(-) (直後に数値を入れるとその分だけ-/数値省略時は前回の値)
|^    …    [normal]相対デチューン(+) (直後に数値を入れるとその分だけ+/数値省略時は前回の値)
|v    …    [normal]相対デチューン(-) (直後に数値を入れるとその分だけ-/数値省略時は前回の値)
|>    …    [normal]相対パン(+) (直後に数値を入れるとその分だけ+/数値省略時は前回の値)
<|    …    [normal]相対パン(-) (直後に数値を入れるとその分だけ-/数値省略時は前回の値)




***  マクロ  ***
( name | macro )


name : マクロ名
macro: 置き換えたい文字列


 (MML読み込み時に)文字列nameを文字列macroに置き換えます。
 もし以前に同じnameを持つマクロが存在した時は、今回のmacroで上書きします。
(→前回のマクロは消える)




***  変数  ***
( name = value )


name : 変数名
value: 代入したい値


 変数nameに値valueを代入します。
(特に定義・宣言の必要はありません。
valueに変数や数式を指定することも可能です。)


***  関数  ***
( name : arg1 arg2 ... )


name : 関数名
arg : 引数


 関数nameに引数argを指定して呼び出します。
(「複数の引数を必要とする」ものや、「引数を必要としない」ものもあります。)




***  予約語  ***
==  変数  ==    (<>付きのものは右辺に変数として呼び出すことも可 / 「相:」とあるものは相対値)
<_enable>, _channel     …  [valuable]使用するパート(ch)数      {初期化前のみ変更可}
<_tempo>, t         …  [valuable]テンポ
<_timebase>, _gate     …  [valuable]タイムベース(=一拍間の分解能)
<_inst_num>, _instrument  …  [valuable]使用するインスト(楽器・音色)数 {初期化前のみ変更可}
<_max_volume>, max_v    …  [valuable]最大ボリューム
_master_volume, master_v  …  [valuable]マスターボリューム
_max_tune, max_d      …  [valuable]デチューンの分解能
<_max_pan>, max_p      …  [valuable]パンの分解能
_max_envelope, max_env   …  [valuable]エンベロープの分解能
_max_vibrato, max_vib    …  [valuable]ビブラートの分解能


_octave, o         …  [valuable](パート毎の)オクターブ  [0〜9]
_noteshift, _shift     …  [valuable](パート毎の)(半音単位での)ノートシフト  [-109〜109 / ループ毎にリセット]
_transpose, _slide     …  [valuable](パート毎の)(半音単位での)トランスポーズ [相:-109〜109 / 0で初期化 / ループ後も残る]
_volume, v         …  [valuable](パート毎の)音量     [0〜_max_volume]
_move_volume, vv      …  [valuable](パート毎の)相対音量   [相:「v」との和が0〜_max_volume]
_inst, I          …  [valuable](パート毎の)インスト番号(=楽器・音色)  [0〜_inst_num]
_length, l         …  [valuable](パート毎の)基本長    [1〜]
_pan, p           …  [valuable](パート毎の)定位     [+_max_pan〜-_max_pan]
_envelope, env       …  [valuable](パート毎の)エンベロープ [0〜_max_env / -1で未使用]
_vibrato, vib        …  [valuable](パート毎の)ビブラート  [0〜_max_vib / -1で未使用]
_detune, d         …  [valuable](パート毎の)デチューン  [制限なし(「-65535*25665535*256」は保証外)]


_phase, ph         …  [valuable](パート毎の)初期位相(°単位)


_sustain, s         …  [valuable]サスティン(再生終了後、nフレームかけて停止させる)
_sustain_vib, s_vib     …  [valuable]サスティンデチューン(サスティン中、1フレーム毎にnだけデチューンをかける)
_quantize, q        …  [valuable]実際の再生音長を n / QUANTIZE にする (「n=0」の時は強制的に音長を「1」にする)
_quantize_back, qb      …  [valuable]実際の再生音長を (QUANTIZE-n) / QUANTIZE にする (「n=QUANTIZE」の時は強制的に音長を「1」にする)


_note_volume, nv      …  [valuable](ノート単位の)相対ボリューム
_note_pan, np        …  [valuable](ノート単位の)相対パン
_note_detune, nd      …  [valuable](ノート単位の)相対デチューン


_env_rate, env_t      …  [valuable]エンベロ−プ読み込み速度 [nが大きいほど読み込みは遅くなる]
_vib_rate, vib_t      …  [valuable]ビブラート読み込み速度  [nが大きいほど読み込みは遅くなる]


==  関数  ==
( PART : num name )
… パートnumをnameとして扱えるようにします。
→( name | num )と同じ処理になります。
例 : [パートAを「part1」と言う名前にする]
( PART : A part1 )
A cder = part1 cder
______________________________________________________________________
( INST : num name )
… インストnumをnameとして扱えるようにします。
→( name | num )と同じ処理になります。
例 : [インスト0を「SQUARE」という名前にする]
( INST : 0 SQUARE )
A (I = 0) = A (I = SQUARE)
______________________________________________________________________
( LOAD : inst_num note volume filename )
… filenameのファイルをインストinst_numのnoteの音程に読み込みます。
(inst_numには必ず「7」以上の値を入れて下さい。
また、初期化の前に「_inst_num」に「7」以上の値を代入しておいて下さい)
例 : [「snare.wav」をインスト4のc3にボリューム4として読み込む]
( LOAD : 4 c3 4 snare.wav )
______________________________________________________________________
( LOAD_AT : inst_num note volume low high filename )
… filenameのファイルをインストinst_numのnoteの音程に読み込みます。
また、読み込んだ後、高音にhigh半音分・低音にlow半音分計算して波形を生成します。
(inst_numには必ず「7」以上の値を入れて下さい。
また、初期化の前に「_inst_num」に「7」以上の値を代入しておいて下さい)
例 : [「snare.wav」をインスト4のc3に上12音・下24音分ボリューム4として読み込む]
( LOAD_AT : 4 c3 4 12 24 snare.wav )
______________________________________________________________________
( LOAD_F : inst_num note volume filename )
… filenameのファイルをインストinst_numのnoteの音程に読み込みます。
また、読み込んだ後、インストのすべての音階に計算した波形を生成します。
(inst_numには必ず「7」以上の値を入れて下さい。
また、初期化の前に「_inst_num」に「7」以上の値を代入しておいて下さい。)
→※この処理は非常に重いので
  出来る限り使う分だけを上記の「LOAD_AT」で生成するようにしてください。
例 : [「snare.wav」をインスト4に(c3として)ボリューム4として読み込む]
( LOAD_F : 4 c3 4 snare.wav )
______________________________________________________________________
( LOAD_MEM : inst_num note [memory_data xN(-32768〜32767)] )
… [memory_data]をインストinst_numのnoteの音程に
chチャンネル、量子化ビット16bit、周波数44100Hzのフォーマットで読み込みます。
(もしmemory_dataが一つしか無い場合は、#WAVのその番号の波形を読み込みます。)
(inst_numには必ず「7」以上の値を入れて下さい。
また、初期化の前に「_inst_num」に「7」以上の値を代入しておいて下さい。)
例 : [「10 0 -10」をインスト4に(c3として)2ch、16bit、44100Hzとして読み込む]
( LOAD_MEM : 4 c3 10 0 -10 )
______________________________________________________________________
( LOAD_MEM_8 : inst_num note [memory_data xN(-128〜127)] )
… [memory_data]をインストinst_numのnoteの音程に
chチャンネル、量子化ビット16bit、周波数44100Hzのフォーマットで読み込みます。
(もしmemory_dataが一つしか無い場合は、#WAVのその番号の波形を読み込みます。)
(inst_numには必ず「7」以上の値を入れて下さい。
また、初期化の前に「_inst_num」に「7」以上の値を代入しておいて下さい。)
例 : [「10 0 -10」をインスト4に(c3として)2ch、16bit、44100Hzとして読み込む]
( LOAD_MEM_8 : 4 c3 0 )
______________________________________________________________________
( LOAD_MEM_AT : (fixed) inst_num [memory_data xN(-32768〜32767)] )
… [memory_data]をインストinst_numのnoteの音程にch形式で読み込みます。
fixedに「F」が指定されている場合は、波形を自動でチューニングします。
ch : 1 -> モノラル、2 -> ステレオ、
3 -> (WAVEベタ形式)ステレオ、4 -> 前半分をL・後半分をR
(もしmemory_dataが一つしか無い場合は、#WAVのその番号の波形を読み込みます。)
(inst_numには必ず「7」以上の値を入れて下さい。
また、初期化の前に「_inst_num」に「7」以上の値を代入しておいて下さい。)
例 : [「10 0 -10」をインスト4に(c3として)2ch、16bit、44100Hzとして読み込む]
( LOAD_MEM_AT : F 4 c3 $1 )
______________________________________________________________________
( SET : )
… 初期化を行います。
→この関数を使わなくても
 「最初に設定パートの指定」をするタイミングで初期化されます。
______________________________________________________________________
( CREATE_SQUARE : inst_num duty_rate )
… インストinst_numにduty_rate%の矩形波を作成します。
(可能であれば「inst_num」には未使用のインスト番号を指定して下さい。)
( CREATE_SQUARE : inst_num duty_front duty_rear )
… インストinst_num に duty_front : duty_rear の矩形波を作成します。
(可能であれば「inst_num」には未使用のインスト番号を指定して下さい。)
例 : [インスト4に60%、インスト5に「4:1」の矩形波を作成する]
( CREATE_SQUARE : 4 60 )
( CREATE_SQUARE : 5 4 1 )
______________________________________________________________________
( TUNE_INST : inst_num note low high )
… インストinst_numのnoteの音程の波形を基に、
高音にhigh半音分・低音にlow半音分計算して波形を生成します。
(必ず波形の読み込みが完了したものを指定して下さい。
また、初期化の前に「_inst_num」に「7」以上の値を代入しておいて下さい)
例 : [インスト4のc3を基に上12音・下24音分の波形を生成する]
( TUNE_INST : 4 c3 4 12 24 )
______________________________________________________________________
( INST_LOOP : inst_num note loop_num )
… インストinst_numのnoteの音程のループ回数をloop_num回に設定します。
ドラム等ワンショットの音の場合は、
loop_numに「0」または「once」を指定しましょう
例 : [インスト4のc3をループさせないようにする]
( INST_LOOP : 4 c3 once )
______________________________________________________________________
( INST_POS : inst_num note loop_pos )
… インストinst_numのnoteの音程のループ位置をloop_pos(sample)に設定します。
1秒は「44100 * 2 * 2」 = 「176400」sampleです。
例 : [インスト4のc3のループ位置を176sample(≒1ms)に設定する]
( INST_POS : 4 c3 176 )
______________________________________________________________________
( COPY_INST : inst1 inst2 )
… インストinst1の波形(全音程)を
インストinst2にコピーします。
(必ずinst1には波形の読み込みが完了したものを、
inst2にはまだ何も読み込んでいないものを指定して下さい。
また、初期化の前に「_inst_num」に十分な値(「7」以上の値)を代入しておいて下さい)
例 : [インスト4をインスト5にコピーする]
( COPY_INST : 4 5 )
______________________________________________________________________
( FM_SIN : type inst rate depth )
… インストinstの読み出しデータに
周期:rate%*2π・振幅:depth%の正弦波でtypeに応じた変調をかけます。
→「depth」または「rate・depth」を省略することが出来ます。
(省略した場合は「100」が代入されます。)
(必ずinstには波形の読み込みが完了したものを指定して下さい。)
type : 「MOD」「M」 -> FM変調
「ADD」「A」 -> 加算合成
例 : [インスト3に周期:4π・振幅:1の正弦波でモジュレーションをかける]
( FM_SIN : MOD 3 200 100 )
(→( FM_SIN : MOD 3 200 )でも可能)
______________________________________________________________________
( FM_INST : type inst1 inst2 rate depth )
… インストinst1の読み出しデータに
インストinst2の波形でtypeに応じた変調をかけます。
→「rate」・「depth」を省略することが出来ます。
(省略した場合は「100」が代入されます。)
(必ずinst1・inst2には波形の読み込みが完了したものを指定して下さい。)
type : 「MOD」「M」 -> FM変調
「ADD」「A」 -> 加算合成
例 : [インスト4にインスト3でモジュレーションをかける]
( FM_INST : MOD 4 3 100 100 )
(→( FM_INST : MOD 4 3 )でも可能)
______________________________________________________________________
( FM_TABLE : type inst1 inst2 rate depth )
… インストinst1の読み出しデータに
インストinst2の読み出しデータでtypeに応じた変調をかけます。
→「rate」・「depth」を省略することが出来ます。
(省略した場合は「100」が代入されます。)
(必ずinst1・inst2には波形の読み込みが完了したものを指定して下さい。)
type : 「MOD」「M」 -> FM変調
「ADD」「A」 -> 加算合成
例 : [インスト4にインスト3のE3の読み出しデータでモジュレーションをかける]
( FM_TABLE : MOD 4 3 100 100 )
(→( FM_TABLE : MOD 4 3 )でも可能)
______________________________________________________________________
( FM_INST_S : type inst1 inst2 note rate depth )
… インストinst1の読み出しデータに
インストinst2のnoteの波形でtypeに応じた変調をかけます。
→「rate」・「depth」を省略することが出来ます。
(省略した場合は「100」が代入されます。)
(必ずinst1・inst2には波形の読み込みが完了したものを指定して下さい。)
type : 「MOD」「M」 -> FM変調
「ADD」「A」 -> 加算合成
例 : [インスト4にインスト3のC3の波形でモジュレーションをかける]
( FM_INST : MOD 4 3 c3 100 100 )
(→( FM_INST : MOD 4 3 c3 )でも可能)
______________________________________________________________________
( FM_TABLE : type inst1 inst2 note rate depth )
… インストinst1の読み出しデータに
インストinst2のnoteの読み出しデータでtypeに応じた変調をかけます。
→「rate」・「depth」を省略することが出来ます。
(省略した場合は「100」が代入されます。)
(必ずinst1・inst2には波形の読み込みが完了したものを指定して下さい。)
type : 「MOD」「M」 -> FM変調
「ADD」「A」 -> 加算合成
例 : [インスト4にインスト3のE3の読み出しデータでモジュレーションをかける]
( FM_TABLE : MOD 4 3 e3 100 100 )
(→( FM_TABLE : MOD 4 3 e3 )でも可能)
______________________________________________________________________
( FM_SIN_B : type inst note rate depth )
… インストinstのnoteの音程の読み出しデータに
周期:rate%*2π・振幅:depth%の正弦波でtypeに応じた変調をかけます。
→「rate」・「depth」を省略することが出来ます。
(省略した場合は「100」が代入されます。)
(必ずinstには波形の読み込みが完了したものを指定して下さい。)
type : 「MOD」「M」 -> FM変調
「ADD」「A」 -> 加算合成
例 : [インスト3のE3に周期:4π・振幅:1の正弦波でモジュレーションをかける]
( FM_SIN : MOD 3 e3 200 100 )
(→( FM_SIN : MOD 3 3e 200 )でも可能)
______________________________________________________________________
( FM_INST_B : type inst1 note1 inst2 note2 rate depth )
… インストinst1のnote1の読み出しデータに
インストinst2のnote2の音程の波形でtypeに応じた変調をかけます。
→「rate」・「depth」を省略することが出来ます。
(省略した場合は「100」が代入されます。)
(必ずinst1・inst2には波形の読み込みが完了したものを指定して下さい。)
type : 「MOD」「M」 -> FM変調
「ADD」「A」 -> 加算合成
例 : [インスト4のC4にインスト3のC3の波形でモジュレーションをかける]
( FM_INST : MOD 4 c4 3 c3 100 100 )
(→( FM_INST : MOD 4 c4 3 c3 )でも可能)
______________________________________________________________________
( FM_TABLE_B : type inst1 note1 inst2 note2 rate depth )
… インストinst1のnote1の読み出しデータに
インストinst2のnote2の音程の読み出しデータでtypeに応じた変調をかけます。
→「rate」・「depth」を省略することが出来ます。
(省略した場合は「100」が代入されます。)
(必ずinst1・inst2には波形の読み込みが完了したものを指定して下さい。)
type : 「MOD」「M」 -> FM変調
「ADD」「A」 -> 加算合成
例 : [インスト4のE4にインスト3のE3の読み出しデータでモジュレーションをかける]
( FM_TABLE : MOD 4 e4 3 e3 100 100 )
(→( FM_TABLE : MOD 4 e4 3 e3 )でも可能)


==  プリプロセッサ  ==
※必ず行の初めに書いてください。
部分では、後述する「補間関数」が使用可能です。
*「num」は省略可能です。
 →省略時は「前回のnum + 1」が指定されます。(初回だった場合は「0」)


#READ(または #INCLUDE) >filename<
   … #READ部にfilenameの中身を読み込む


#ENV(または #ENVELOPE) >num, [at_data | dc_data | rl_data]<
   … num番のエンベロープに
内のデータを読み込む
     at_data・dc_data・rl_dataは任意の部位を省略可能。
     
     (→エンベロープを使いたい場合は、
      これで設定した番号を「(env = num)」 と指定してやる)
#VIB(または #VIBRATO) >num, [at_data | dc_data | rl_data]<
   … num番のビブラートに内のデータを読み込む
     at_data・dc_data・rl_dataは任意の部位を省略可能。
     
     (→ビブラートを使いたい場合は、
      これで設定した番号を「(vib = num)」 と指定してやる)
#WAVE(または #WAV) >num, [data]<
   … num番の波形データに
内のデータを読み込む
     (→ここで設定した波形を使いたい場合は、
      これで設定した番号を(LOAD_MEM:)で指定してやればよい
      ( LOAD_MEM_AT : F 7 4 0 ) )
#WAVE8(または #WAV8) >num, [data]<
   … 「#WAV」の8bit版(-128〜127までの値を指定可能)


#INST(または #INST_SWITCH) >num, [at_data | dc_data | rl_data]<
   … num番のインストインデックスに[]内のデータを読み込む
     at_data・dc_data・rl_dataは任意の部位を省略可能。
     <すべて絶対値>
     (→波長単位で使いたい場合は、
      これで設定した番号を「(I = $num)」 と指定してやる
      →フレーム単位で使いたい場合は、
      これで設定した番号を「(I = #num)」 と指定してやる)
     ※データの個数次第では音程が狂うので注意


#MEM(または#MEMORY) >num, [at_data | dc_data | rl_data]<
   … 前述の「#ENV」「#VIB」「#WAV」すべてに共通して使用可能なデータを作成します。
     at_data・dc_data・rl_dataは任意の部位を省略可能。
     *1
SIN_EX< num, rate, depth, phase, center >
   … 周期:rate / 100 x 2π、振幅:depth、
     位相:phase°、y切片:centerの正弦波からnum個取り出した値に置き換えます。



*1:LOAD_MEM:)・(LOAD_MEM_AT:)に指定した場合は       「at_dataのみを参照する」ので注意。       →ここで設定したデータを使用したい場合は、       「$num」と指定してやる       ( LOAD_MEM_AT : F 7 4 $0 )       ( env = $1 )など )
#DIR >directory<    … 「#READ」で読み込むディレクトリの指定      (このディレクトリを読む前に「.exeのあるディレクトリ」       「譜面のあるディレクトリ」を検索します。)
#LENGTH >type<    … 音長の指定方法を変える     OLD -> (省略時)前回指定した音長  (即値で指定)     ORI -> (省略時)「_length(l)」の値 (即値で指定) [初期設定]     COM -> (省略時)「_length(l)」の値 (音符で指定)
#OCTAVE(または#OCTAVE-REV) >0,1またはREVERSE<    … <・>のシフト方向の指定     0    -> 「<」:+、「>」:-     0以外 -> 「<」:-、「>」:+     REVERSE-> 「<」:-、「>」:+
#QUANTIZE >quantize<    … 「q」および「qb」の基準値設定     ※このプリプロセッサを使用した場合は、      初期化時にセットした値が「q」にセットされます。
#END    … 書いた行をMMLの終端として設定します。      =それ以降はMMLとして読み込みません。

----  補間関数  ---- *関数名を省略すると、  引数が二つの時は、「FILL<>」  引数が三つの時は、「LINE<>」  引数が五つの時は、「FOLDLINE<>」と見なされます。
FILL< num, data >    … num個のdataに置き換えます。
LINE< num, start, end >    … start〜endまでの値をnum個に線形補間した値に置き換えます。 SIN< num, rate, depth >    … 周期:rate / 100 x 2π、振幅:depthの正弦波からnum個取り出した値に置き換えます。 TRI< num, rate, depth >    … 周期:rate / 100、振幅:depthの三角波からnum個取り出した値に置き換えます。 SQUARE< num, rate, depth >    … 周期:rate / 100、振幅:depthの矩形波からnum個取り出した値に置き換えます。 PULSE< num, rate, depth >    … 周期:rate / 100、振幅:depthのパルス波からnum個取り出した値に置き換えます。
FOLDLINE< num1, num2, pos1, pos2, pos3 >    … pos1〜pos2までをnum1個に、pos2〜pos3までをnum2個に線形補間した値に置き換えます。      (pos2はpos2〜pos3間に含まれます(=pos1〜pos2間の終端はpos2では無くその直前の値になります。