/**
 *【名称】TransGate
 *【説明】音をオン/オフ(あるいは音量を変化させる)効果を持つ。
 *       「ステップゲート」や単に「ゲートエフェクト」などと呼ばれる場合もある。
 *【引数】[0] TIME SHIFT(0:NO/1:YES) 指定後に時間をシフトするかどうかの指定
 *        [1] LENGTH                 1ステップの時間の長さ(STEP値)
 *        [2] COUNT                  ステップ数
 *        [3] Expression             音量
 *        [4] TEXT                   ステップのオンオフを示す文字列 ■=オン/□=オフ
 */
Function TransGateA1(Array AaData) {
    Int LnTempTime = Time;
    Int LnShift    = AaData(0);
    Int LnStep     = AaData(1);
    Int LnCnt      = AaData(2);
    Int LnEp       = AaData(3);
    Str LsItem     = {};
    EP(LnEp);
    For (Int I = 0; I < LnCnt; I++) {
        LsItem = MID(AaData(4), I + 1, 1);
        If (LsItem == {■}) {
            EP(LnEp);
        }
        If (LsItem == {□}) {
            EP(0);
        }
        Time(Time + LnStep);
    }
    EP(LnEp);
    If (LnShift == 0) {
        Time(LnTempTime);
    }
}
/**
 *【名称】TransGate
 *【説明】音をオン/オフ(あるいは音量を変化させる)効果を持つ。
 *       「ステップゲート」や単に「ゲートエフェクト」などと呼ばれる場合もある。
 *【引数】[0] TIME SHIFT(0:NO/1:YES) 指定後に時間をシフトするかどうかの指定
 *        [1] LENGTH                 1ステップの時間の長さ(STEP値)
 *        [2] COUNT                  ステップ数
 *        [3] Expression             音量
 *        [4] TEXT                   ステップのオンオフを示す文字列 ■=オン/□=オフ
 *        [5...] Expression          音量(ステップ数分)
 *        [6...] PanPod              パン(ステップ数分)
 */
Function TransGateA2(Array AaData) {
    Int LnTempTime = Time;
    Int LnShift    = AaData(0);
    Int LnStep     = AaData(1);
    Int LnCnt      = AaData(2);
    Int LnEp       = AaData(3);
    Str LsItem     = {};
    EP(LnEp);
    For (Int I = 0; I < LnCnt; I++) {
        LsItem = MID(AaData(4), I + 1, 1);
        If (LsItem == {■}) {
            EP(AaData(5 + I));
            P(AaData(5 + LnCnt + I));
        }
        If (LsItem == {□}) {
            EP(0);
        }
        Time(Time + LnStep);
    }
    EP(LnEp);
    If (LnShift == 0) {
        Time(LnTempTime);
    }
}


Tempo(156)

Track(01) Channel(01) @(87)
EP(110) q100 V(110) v110

a1
g1
f1
e1

l32 arara^^^rarara^^^rarara^^^rarara^^^r
l32 grgrg^^^rgrgrg^^^rgrgrg^^^rgrgrg^^^r
l32 frfrf^^^rfrfrf^^^rfrfrf^^^rfrfrf^^^r
l32 erere^^^rerere^^^rerere^^^rerere^^^r

[
TransGateA1(0, !32, 32, 110, {■□■□■■■□■□■□■■■□■□■□■■■□■□■□■■■□});
a1
TransGateA1(0, !32, 32, 110, {■□■□■■■□■□■□■■■□■□■□■■■□■□■□■■■□});
g1
TransGateA1(0, !32, 32, 110, {■□■□■■■□■□■□■■■□■□■□■■■□■□■□■■■□});
f1
TransGateA1(0, !32, 32, 110, {■□■□■■■□■□■□■■■□■□■□■■■□■□■□■■■□});
e1
]


[
TransGateA2(0, !32, 32, 110, {■□■□■■■□■□■□■■■□■□■□■■■□■□■□■■■□}, 110,0,110,0,110,60,50,0,110,0,110,0,110,60,50,0,110,0,110,0,110,60,50,0,110,0,110,0,110,60,50,0, 0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110);
a1
TransGateA2(0, !32, 32, 110, {■□■□■■■□■□■□■■■□■□■□■■■□■□■□■■■□}, 110,0,110,0,110,60,50,0,110,0,110,0,110,60,50,0,110,0,110,0,110,60,50,0,110,0,110,0,110,60,50,0, 0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110);
g1
TransGateA2(0, !32, 32, 110, {■□■□■■■□■□■□■■■□■□■□■■■□■□■□■■■□}, 110,0,110,0,110,60,50,0,110,0,110,0,110,60,50,0,110,0,110,0,110,60,50,0,110,0,110,0,110,60,50,0, 0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110);
f1
TransGateA2(0, !32, 32, 110, {■□■□■■■□■□■□■■■□■□■□■■■□■□■□■■■□}, 110,0,110,0,110,60,50,0,110,0,110,0,110,60,50,0,110,0,110,0,110,60,50,0,110,0,110,0,110,60,50,0, 0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110,0,0,110,110);
e1
]

Track(10) Channel(10);//リズムチャンネルに
//リズムマクロの定義
$b{n36,}//bにn36,を割り当てる
$s{n38,}//sにn38,を割り当てる
Rhythm{ //リズムモード
  [12 l4 b s b s8s8 | b s b s16s16s8 ]
}