Copyright = {"spark.K"}
TrackName = {"冒険の始まりだ！"}
MetaText = {"for Microsoft GS Wavetable SW Synth"}

#loop = 2;      // 繰り返し回数

/*
    ------------------------------------------------------------
    テキスト音楽「サクラ」ヘッダーファイル「sparkmml.h」
    2010/11/07 Ver.
                                      Copyright(C) 2010 spark.K
                               http://user.freespace.jp/sparkk/
    ------------------------------------------------------------
*/

// ここは編集しない
Int ___ = -1; // デフォルト値を使用する
Int XXX = -2; // このパラメーターをスキップする

// デフォルト値（全般）
Int Tbdef  = 480; // タイムベース
Int Voldef = 127; // ボリューム
Int Bpmdef = 120; // テンポ

// 各パラメーターのデフォルト値
Int Veldef = 100; // ベロシティー
Int Quadef = 096; // クオンタイズ
Int Expdef = 127; // エクスプレッション
Int Pandef = 064; // パンポット
Int Voidef = 001; // プログラムチェンジ
Int Msbdef = 000; // MSB
Int Lsbdef = 000; // LSB
Int Revdef = 000; // リバーブ
Int Chodef = 000; // コーラス

// 音源初期化の有無（0：なし、1：GM、2：GS、3：XG）
Int NONE = 0;
Int GM = 1;
Int GS = 2;
Int XG = 3;
Int _initdone = off;
Int _resetmode = NONE;

// 文字列関連
Str NULL = CHR($00);

// IのXパーセント
Function Per (Int I, Int X) {
    Result = (I * X) / 100;
}

// 楽器名を書き込む
Function Ins (Str _ins)
{
    InstrumentName = _ins;
}

// CC111を書き込む
Function LoopPoint (Int Len)
{
    If (Len != 0)
	{
        r%(-Len) y111,0 r%(Len)
	} Else {
	    y111,0
	}
}

// セットアップその他
Str SetupAdd = {}

// セットアップ関数
Function Setup (Tr, Ch, Vel, Qua, Exp, Pan, Voi, Msb, Lsb, Rev, Cho) {
    If (_initdone == off) // 初期化していなければ、初期化関数を実行する
	{
	    Init (NONE, 0);
	}

    If (Tr == ___) { Tr = Ch; } If (Tr != XXX) { TR (Tr); CH (Ch); }
	Time (0:1:0); l4 o5 t0 SetupAdd; V (Voldef);
    If (Vel == ___) { Vel = Veldef; } If (Vel != XXX) { v (Vel); }
    If (Qua == ___) { Qua = Quadef; } If (Qua != XXX) { q (Qua); }
    If (Exp == ___) { Exp = Expdef; } If (Exp != XXX) { EP (Exp); }
    If (Pan == ___) { Pan = Pandef; } If (Pan != XXX) { P (Pan); }
    If (Msb == ___) { Msb = Msbdef; } If (Msb != XXX) { y0,(Msb); }
    If (Lsb == ___) { Lsb = Lsbdef; } If (Lsb != XXX) { y32,(Lsb); }
    If (Voi == ___) { Voi = Voidef; } If (Voi != XXX) { @ (Voi) }
    If (Rev == ___) { Rev = Revdef; } If (Rev != XXX) { REV (Rev); }
    If (Cho == ___) { Cho = Chodef; } If (Cho != XXX) { CHO (Cho); }
}

// 初期化関数（Modeで初期化モードを指定する。Restは空ける小節数）
Function Init (Int Mode, Int Rest, Int SetTempo) {
    If (_initdone == off) {
        TR(0) CH(1) Time (-1:1:0) Tempo = 250;

		Str Msg; // メッセージ用
        If (Mode == GM) { ResetGM; _resetmode = GM; Msg = "GM SYSTEM ON"; }
	    If (Mode == GS) { ResetGS; _resetmode = GS; Msg = "GS RESET"; }
	    If (Mode == XG) { ResetXG; _resetmode = XG; Msg = "XG SYSTEM ON"; }
	    If (Mode == NONE) { _resetmode = NONE; Msg = "NO RESET"; }

		// Rest小節遅らせる
		System.MeasureShift (Rest + 1);
		
		// <2010/10/5> 以前のMMLと互換性を保つため
		If (SetTempo != 0 && SetTempo != XXX) {
		    Time (0:1:0) Tempo = SetTempo; // テンポの設定
		};

		_initdone = on; // 初期化完了フラグON
		Print (Msg); // 初期化モードの表示
	}
}

// セットアップ関数の使い方を表示するには「#help」マクロを使う
#help = {
    #newline = CHR($0d0a);
    #help00  = #newline + {Copyright = {""}}
    #help00  = #help00 + #newline + {TrackName = {""}}
    #help00  = #help00 + #newline + { MetaText = {""}}
    #help01  = #newline + {"Init (GM, 1, 120);"}
	#help02  = #newline + {"
//      tr, ch,  v,  q,exp,pan, @1, @2, @3,rev,cho
Setup (___,001,___,___,___,___,___,___,___,___,___)
"}
Print (#help00 + #help01 + #help02)
}

// タイムベースの設定
TimeBase (Tbdef);

Init ( GM , 1 , 120 );

//    ( tr, ch,  v,  q,exp,pan, @1, @2, @3,rev,cho)
Setup (___,001,120,___,___,___,083,___,___,090,030) InstrumentName = {"melo"}
Setup (___,011,080,___,___,___,063,___,___,120,000) InstrumentName = {"melo (delay)"}
Setup (002,002,120,___,___,___,038,___,___,030,030) InstrumentName = {"bass"}
Setup (052,002,080,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX) InstrumentName = {"bass (octave)"}
Setup (___,003,100,___,___,___,049,___,___,060,030) InstrumentName = {"chord"}
Setup (___,010,080,___,___,___,002,___,___,060,000) InstrumentName = {"perc"}

Str PianoS = {
    // 1a
        [2 r1 ]
	// 1b
    	l4 o5
		y64,127 a>e^^ ^^^^ y64,0
}

Str Piano = {
	// 2a
    	[2
    	    o5
    	    l4 q80 a^^ q96 l12 b^>c | l4 d^f+ l8 df+ :
    		l4 ec"bc "a^d^<
        ]   l4 ec<bg a^>f+^
	// 2b
    Sub {
	    [2
	        o6
	        l4 q80 e^^ q96 g | l4 f+^a^ :
		    l4 `caga f+^f+^
        ]   l4 `cage f+^`d^
    }
	[2
	    o6
	    l4 q80 a^^ q96 l12 bb>c | l4 d^f+ l8 df+ :
		l4 ec"bc "a^d^<
    ]   l4 ec<bg a^>f+^
	// 3
	    //l4 "ac<ba> c^d^
	    Sub {
    	    o5
    		l4 aafa gggg | b`c+^^ `c+^a^
    		l4 aafa ggab | ba`c+^ `e^^r
		}
	    o6
		[2 l4 ec"bc d"bcd :| de^^ e^d^ ] dc+e^ a^^r
}

Str BassS = {
    // 1ab
        [2
            l16 o3 [2 a^a^ rraa a^a^ : rrrr ] : l12 gag
    	]   l12 b-gb-
}

Str Bass = {
	// 2a
	    [4
		    l8 o3 [3 "aa ] "b`c | [3 d`d ] c"b 
		]
	// 2b
	    [4
		    l8 o3 [3 "aa ] "b`c :| [3 d`d ] c"b 
		] [2 d`d ] d`c<ba
	// 3
	    [2
		    l8 o3 [4 "ff ] [3 "gg ] "ee
			l8 o3 [7 "aa ] : "gg
		] "aa
}

$+{n40,} // Snare 2
$-{n51,} // Ride Cymbal

Str PercS = {
    Rhythm {
	// 1ab
	    [2
            l16 +,60r+r rr++ +r+,60r -rrr |
                +,60r+r rr+,60+ +r+r : l12 ++,70+,60
	    ]   l12 +,60+,70+
	}
}

Str Perc = {
    Rhythm {
	// 2ab, 3
	    [((4 * 3))
            l16 +r++ +r++ +r++ ++,60+,70+ |
                +r++ +r++ +r++ ++,60+,70+
		]
	}
}

Str ChordS = {
    // 1ab
        [2 r1 ]
		l4 o6 rr y64,127 db | g^^^ y64,0
}

Str Chord = {
	Rhythm {
        $a{'"ace'}
    	$d{'"adf+'}
		(o5)
    	    [4 l8 rara rara rdrd rdrd ]
    	    [4 l8 r`ar`a r`ar`a r`dr`d r`dr`d ]
		$f{'"fce'}
		$g{'"g"bd'}
		$a{'"ac+e'}
		(o5)
		    [2 l8 rfrf rfrf rgrg rgrg | rara rara : rara rara ]
			$a{'c+ea'} rara rara
	}
}

#piano  = { [(#loop) PianoS [2 Piano    ] ] }
#bass   = { [(#loop) BassS  [2 Bass     ] ] }
#perc   = { [(#loop) PercS  [2 Perc     ] ] }
#chord  = { [(#loop) ChordS [2 Chord    ] ] }

TR(01) M(30) y111,0 #piano
TR(11) BR(1) p60 #piano
TR(02) #bass
TR(52) TrackKey = -12; #bass
TR(03) #chord
TR(10) ArgOrder(lvqto); UseKeyShift(off) #perc UseKeyShift(on)
