MetaText  ={"                                                  '2分 14秒'"} 
TrackName ={"アナログフィール partC rev."}
Copyright ={"庚申works"}


 
/*rireki ---- 

'14 12 8	ポーティングもどき開始
       9	おおよそ完成
      10	前回の音へ寄せるための手直し
      11	デバックとちょっとだけ音色変更
      12	Splitへオクターブ変化など機能追加

      20	Splitへ繰り返しコード機能追加
      22	とりあえず完成
      25	NoteCnvtでKey不使用版へ変更、若干重くなった..
*/

/*概要 ----

　アナログフィール ver.1.61
　http://oto.chu.jp/mmlbbs6/post.php?mml_id=898

　Chord+.hをつかい、上記の旧曲partC - PlayFrom(157:1:0)を新たに書き直したものです。
　構造化エディタ対応です。
　GM,GS,XG対応、TW,Sakura可 XP以外のMSGSでは未確認
*/

/*説明 ----

　　旧曲では与えられた期間があったため、noteナンバーを使用して曲を考えましたが、
　今改めて見るとすぐには理解できないであろう代物でしたので、これを文字ベースで全面的に書き直してみました。
　これならば、スクリプトが読める人なら、何の処理をしているか分かるとは思います。

　　処理を簡単に説明すると、CentralのChdファンクションが読まれると、Synthファンクションで演奏されるものです。
　コード全体は少なめに書いたつもりです、無駄な行程も見受けられますがこれは実力不足の賜物とお察し下さい。


	                     // CM7
	TR=1 o5 q390 l8 @34  ' c `c' '"e `e' ' g``g' '"b``b'
	TR=2 o6 q390 l8 @74  '"e``e' '"g `g' ' b `b' '"c  c'
	TR=3 o5 q390 l8 @1   '"g `g' ' b``b' '"c `c' '"e  e'

　MML表記であれば上記の形となります。
　このように、書き込まれるのを自動化したものとなってます。


*/



// 以下、曲データ ----

 
#DATA={ 

	
Include(gs.h)	ResetGS()r4 
CH=10	GS_RHYTHM(1)r8

SysEx$ = F0,41,10,42,12,{40,00,00,00,02,0C,02},F7;r48 //MASTER TUNE 432Hz auto chksum Vn

//	TW-Music2(DirectX[Music]) Effect
//	      ReverbSetting     Time Dpth High Mix
   	CuePoint={"TwmParam	( 22,  22,  66,121)"}	//初期値(127,117,0,127)
//	Time     [0-127],
//	Gain     [0-127],
//	HighFreq [0-127],
//	Mix      [0-127]

//	       ChorusSetting    Wave  Mix Dpth  FB Freq Dly Phs
	CuePoint={"TwmChorus	(  1, 121,  77,111, 101,126,  4)"}	//初期値(0,64,25,79,14,114,3)
//	Waveform [0-1],
//	WetDryMix[0-127],
//	Depth    [0-127],
//	Feedback [0-127],
//	Frequency[0-127],
//	Delay    [0-127],
//	Phase    [0-4]

TimeBase=192
Tempo=142



// トラック指定 ---
 
TR=3 Time=(!1) P=115 V=(100-33) EP=127 M=0 TrackKey=(30+2) REV=54 CHO=11 
     o3 l2 v90 q390 @34,0//@33,0

TR=2 Time=(!1) P=64 V=(99-18) EP=127 M=0 TrackKey=(-6+2) REV=54 CHO=11
     o6 l2 v93 q390 @74,0//@73,0

TR=1 Time=(!1) P=12 V=(95-22) EP=127 M=0 TrackKey=(6+2) REV=54 CHO=11
     o5 l2 v100 q390 @1,0//@2,0



// コードによる演奏 ----

Chd3({ [4 Gm7(11)^] },{"フリジアン"})

Chd3({ FM9^ E7#9^ | Am9^ Gm7on5^     | FM9^ E7#9^ | Am9^ Gm7on5^  },{"R&Bコード"})
Chd3({ Am9^ Dm9^  | Bm7b5b13^ E7#9^  | Am9^ Dm9^  | Bm7b5b13^ E7#9^ },{"マイナーサントラ"})


Chd3({ FM9^ E7#9^    | Em9^ Am9^  },{"ORIGINAL 同主調"})
Chd3({ Fm7^ G#augM7^ | G#M7^ Fm6^ },{"ORIGINAL マイナー"})
Chd3({ FM9^ E7#9^    | Em9^ Am9^  },{"ORIGINAL 同主調"})
Chd3({ Fm7^ G#augM7^ | G#M7^ Fm6^ },{"ORIGINAL マイナー"},{If(TR==2){>} })
Chd3({ F#m7^ B7^     | Em9^ A7^   | Dm7^ G7^ },{"ドミナントモーション"},{TrackKey=(TrackKey+3) })


Chd3({ FM9^ E7#9^ | Am9^ C7on5^      | FM9^ E7#9^ | Am9^ Gm7on5^ },{"R&Bコード"})
Chd3({ FM9^ E7#9^ | Am9^ Gm7on5^     | FM9^ E7#9^ | Am9^ Gm7on5^ },{"R&Bコード"},{TrackKey=(TrackKey+1) })
Chd3({ FM9^ E7#9^ | Gm7on5^ Gm7on5^  | FM9^ E7#9^ | FM9^ E7#9^   },{"R&Bコード"})

Chd3({ [6 Gm7(11)^ FM9^] },{"フリジアン"})

 
} //data 



  
// ここから Chord+.hブロック ---- 

	
//Function Synth block --- 
 
 Function Lgth(Str TT,""){ // ^rx 

  Int SW=1 //x ^rx
  Str XX;
  For(Int i=1; i< SizeOf(TT)+1; i++){

   XX=MID(TT,i,1) // i=1~
   Switch(XX){
    Case("^"){ SW++ }
    Case("r"){ SW++ }
    Case("x"){ SW++ }
   } //sw
  } //

  Result=SW;
 } //func
 
Function Rudm(Str TT,""){ // ` 
 Switch(Random(2)){
  Case(0){} // ["]
  Case(1){ If(TT=="`"){ TT=TT+TT } If(TT==""){ TT=CHR(34) } }
 } //sw

 Result=TT; // ` or ``
} //func
 
Function Gousei(Array RR){ // "a,c,e 
 Str ZZ; Int i=0
 While(1){
  ZZ=ZZ+RR(i) i++; If(i==SizeOf(RR)){ Exit }
 } //
  ZZ={'}+ZZ+{'}
 Result=ZZ; // '"ace'
} //func
 
Function Synth(Str XX,Array RR){ // ^^x, (c,d,g) 

 Str Veltck={ v_=(Random(4)*2-Random(2)) t_=(Random(4)*2-Random(2)) q_=(Random(4)*2-Random(2)) }

 Str TT; Int i=0; Int j=Lgth(XX)*MML(l%)/(!8) // i=0~

 While(1){ i++
  TT= RR((i+(TR-1))%SizeOf(RR) )
  TT= {'}+ Veltck +Rudm()+TT + Veltck+{v_=-30}+Rudm("`")+TT +{v_=0 '8} TT;

  If(i==j){ Exit } // [i:l1/8]
 } //

} //func
 
// Function Chd block --- 
 
Function OctCnvt(Int NN,""){ // -2 
 Str TT=""
 If(NN>0){
  While(1){ TT=TT+"`"; NN--; If(NN==0){Exit;} }
 }
 If(NN<0){
  While(1){ TT=TT+CHR(34); NN++; If(NN==0){Exit;} }
 }

 Result=TT; // [""]
} //func
 
Function ElmSplit(Str TT,""){ // 'c<`e-g' 

 Str XX; Str ZZ; Str CC; Array RR
 Int SW=0; Int SC=0; Int SZ=0; Int CHK=0

 For(Int i=1; i< SizeOf(TT)+1; i++){

  XX=MID(TT,i,1) // i=1~
  Switch(XX){
   Case("'"){ XX="" } //gomicut
   Case(" "){ XX="" }
   Case("a"){ SW++ }
   Case("b"){ SW++ }
   Case("c"){ SW++ }
   Case("d"){ SW++ }
   Case("e"){ SW++ }
   Case("f"){ SW++ }
   Case("g"){ SW++ }
   Case(">"){ SC++; XX="" }
   Case("<"){ SC--; XX="" }
   Case("`"){ SZ++; XX="" }
   Case(CHR(34)){ SZ--; XX="" } // ["]
  } //sw

  If(SW==1&CHK==0){ CC=OctCnvt(SC+SZ) SZ=0; CHK=1 } //1st.cut
  If(SW==2){
   ZZ=CC+ZZ; RR=(RR, ZZ); ZZ=""; CC=OctCnvt(SC+SZ); SZ=0; SW=1
  }

  ZZ=ZZ+XX
 } //

 ZZ=CC+ZZ; RR= (RR, ZZ) Result= RR; // c,e-,"g
} //func
 
Function Chddata0(Str TT,""){ // m7(11) 

 Switch(TT){
  Case(""){		TT={ceg}	} // [,] can't chdname
  Case("m"){		TT={ce-g}	}
  Case("sus2"){		TT={cdg}	}
  Case("sus4"){		TT={cfg}	}
  Case("7sus4"){	TT={cfgb-}	}
  Case("dim"){		TT={ce-g-}	}
  Case("dim7"){		TT={ce-g-a}	}
  Case("m7b5"){		TT={ce-g-b-}	}

  Case("M9"){		TT={cegb `d}	}
  Case("7#9"){		TT={cegb- `e-}	}
  Case("m9"){		TT={ce-gb- `d}	}
  Case("m7"){		TT={ce-gb-}	}
  Case("m7on5"){	TT={"g e-cgb-}	}
  Case("7on5"){		TT={"g ecgb-}	}

  Case("7"){		TT={cegb-}	}

  Case("augM7"){	TT={ceg#b}	}
  Case("M7"){		TT={cegb}	}
  Case("m6"){		TT={ce-ga}	}
  Case("m7(11)"){	TT={ce-gfb-}	}
  Case("m7b5b13"){	TT={ce-g-a-b-}	}

  Default{ Print({"usage:コードがない / "}+TT) }
 } //sw

 Array RR= ElmSplit(TT)
 Result=RR; // c,e-,f,g,b-
} //func
 
Function OctSplit(Str TT,""){ // ``Ab 
 Str XX; Str ZZ; Array RR
 Int SW=0

 For(Int i=1; i< SizeOf(TT)+1; i++){

  XX=MID(TT,i,1) // i=1~
  Switch(XX){
   Case("`"){ SW++ }
   Case(CHR(34)){ SW-- } // ["]
   Default{ ZZ=ZZ+XX }
  } //sw
 } //
 RR=(SW,ZZ)
 Result=RR; // 2,Ab
} //func
 
Function Keydata(Str TT,""){ // `G# 

 Array RR= OctSplit(TT)
 Int NN;
 Switch(RR(1)){
  Case("C"){  NN=0  }
  Case("C#"){ NN=-11}Case("Db"){ NN=-11}
  Case("D"){  NN=-10}
  Case("D#"){ NN=-9 }Case("Eb"){ NN=-9 }
  Case("E"){  NN=-8 }

  Case("F"){  NN=-7 }
  Case("F#"){ NN=-6 }Case("Gb"){ NN=-6 }
  Case("G"){  NN=-5 }
  Case("G#"){ NN=-4 }Case("Ab"){ NN=-4 }
  Case("A"){  NN=-3 }
  Case("A#"){ NN=-2 }Case("Bb"){ NN=-2 }
  Case("B"){  NN=-1 }

  Default{ Print({"usage:キー変換に問題 / "}+RR(1)) End }
 } //sw

 NN=NN+ RR(0)*12
 Result=NN; // 8
} //func
 
Function Seiryu(Str TT,""){ 
 Int SW=0
 Switch(TT){
  Case("c#"){ TT={d-} }
  Case("d#"){ TT={e-} }
  Case("f#"){ TT={g-} }
  Case("g#"){ TT={a-} }
  Case("a#"){ TT={b-} }

  Case("e#"){ SW=1 }
  Case("f-"){ SW=1 }
  Case("b#"){ SW=1 }
  Case("c-"){ SW=1 }
 } //sw

 If(SW==1){ Print({"usage:存在しない音です / TT:"}+TT) End }
 Result=TT;
} //func
 
Function NoteCnvt(Int NN,Array RR){ //-3, "a#,e-,g 

 Array LL=({c},{d-},{d},{e-},{e},{f},{g-},{g},{a-},{a},{b-},{b})

 Int Oct=0; Int Num=0; Int FF=0

 Int j=0; Array KK;
 For(Int i=0; i<SizeOf(RR); i++){

  KK= OctSplit(RR(i))
  KK(1)=Seiryu(KK(1))
  While(1){
   If(KK(1)==LL(j)){ FF=j+NN;
    Oct=FF/12 If(FF<0){  Oct=Oct-1  }
    Num=FF%12 If(Num<0){ Num=Num+12 }

    If(Num<0|Num>11){ Print({"usage:配列バッファフロー / Num:"}+Num) End }

    RR(i)=OctCnvt(KK(0)+Oct)+LL(Num) j=0; Exit;
   }
   j++;
   If(j==SizeOf(LL)){ Print({"usage:無限ループ / j:"}+j) End }
  } //
 } //

 Result=RR; // "g,c,e
} //func

 
Function ChdCut(Str TT,""){ //{`Ab7(11)^^x } 
 Str XX; Str ZZ; Array RR=("","","")
 Int SW=0; Int FG=0

 For(Int i=1; i< SizeOf(TT)+1; i++){

  XX=MID(TT,i,1) // i=1~
  Switch(XX){
   Case(" "){ XX="" } // gomicut
   Case("A"){ SW=0 }
   Case("B"){ SW=0 }
   Case("C"){ SW=0 }
   Case("D"){ SW=0 }
   Case("E"){ SW=0 }
   Case("F"){ SW=0 }
   Case("G"){ SW=0 }
   Case("b"){ If(SW!=1){ SW=0 } }
   Case("#"){ If(SW!=1){ SW=0 } }
   Case("r"){ SW=2 }
   Case("^"){ SW=2 }
   Case("x"){ SW=2 }
   Case("`"){ SW=0 }
   Case(CHR(34)){ SW=0 } // ["]
   Default{ SW=1 }
  } //sw

  RR(SW)=RR(SW)+XX
 } //

 Result= RR; //(`Ab,7(11),^^x )
} //func
 
Function Split(Str TT,""){ // FM9|"E7#9 >X^^x 

 TT.s("
","") // [\n] gomicut

 Str XX; Str CC; Str ZZ; Str OP; Str GG; Array RR
 Int SW=0; Int SX=0; Int SC=0; Int SZ=0; Int CHK=0

 For(Int i=1; i< SizeOf(TT)+1; i++){

  XX=MID(TT,i,1) // i=1~
  Switch(XX){
   Case("|"){ XX="" } // gomicut
   Case(" "){ XX="" } // [space]
// Case("　"){ XX="" } // [2byte space]
   Case("	"){ XX="" } // [tab]
   Case("A"){ SW++ }
   Case("B"){ SW++ }
   Case("C"){ SW++ }
   Case("D"){ SW++ }
   Case("E"){ SW++ }
   Case("F"){ SW++ }
   Case("G"){ SW++ }
   Case("X"){ SW++ SX=1 XX="" }
   Case("r"){ SX=2 }
   Case("^"){ SX=2 }
   Case("x"){ SX=2 }
   Case(">"){ SC++; XX="" }
   Case("<"){ SC--; XX="" }
   Case("`"){ SZ++; XX="" }
   Case(CHR(34)){ SZ--; XX="" } // ["]
  } //sw

  If(SW==1&CHK==0){ CC=OctCnvt(SC+SZ) SZ=0; CHK=1 } //1st.cut
  If(SW==2){
   If(SX==1){ GG=ZZ } //X
   ZZ=CC+ZZ+OP; If(ZZ==""){ Print({"usage:リストに空代入 / ZZ="}+ZZ) End }
   RR=(RR, ZZ); OP=""; ZZ=""; CC=OctCnvt(SC+SZ); SZ=0; SW=1
  }

  Switch(SX){
   Case(0){ ZZ=ZZ+XX }
   Case(1){ ZZ=GG; SX=0 }
   Case(2){ OP=OP+XX; SX=0 }
  } //sw
 } //

 ZZ=CC+ZZ+OP; If(ZZ==""){ Print({"usage:リストに空代入 / ZZ="}+ZZ) End }
 RR= (RR, ZZ)

 Result=RR; // (FM9,"E7#9,`E7#9^^x)
} //func
 
Function LopBrk(Str TT,""){ //[C^:`X^] [A^:"X^] 

 Str XX; Str ZZ; Str CC; Array RR=(,"","")
 Int SW=0; Int FLG=0; Int VLB=0; Int LOP=0; Int Chk=0

 For(Int i=1; i< SizeOf(TT)+1; i++){

  XX=MID(TT,i,1) // i=1~
  Switch(XX){
   Case("["){ FLG=1 XX=""; Chk++ }
   Case(":"){ FLG=2 XX="" }
   Case("]"){ FLG=3 XX=""; Chk-- }
  } //sw

  If(FLG!=0){
   If(FLG==1&VLB==0){
    Switch(XX){
     Case(""){}
     Case(" "){}
     Case("0"){ CC=CC+XX; XX="" }
     Case("1"){ CC=CC+XX; XX="" }
     Case("2"){ CC=CC+XX; XX="" }
     Case("3"){ CC=CC+XX; XX="" }
     Case("4"){ CC=CC+XX; XX="" }
     Case("5"){ CC=CC+XX; XX="" }
     Case("6"){ CC=CC+XX; XX="" }
     Case("7"){ CC=CC+XX; XX="" }
     Case("8"){ CC=CC+XX; XX="" }
     Case("9"){ CC=CC+XX; XX="" }
     Default{ VLB=1 }
    } //sw
   }

   If(FLG!=3){ RR(FLG)=RR(FLG)+XX }
   Else{ FLG=0; VLB=0
    If(CC==""){ LOP=2 }Else{ LOP=CC; CC="" }

    While(1){ LOP--
     If(LOP<0){ Print({"usage:無限ループ / LOP:"}+LOP) End }

     ZZ= ZZ+RR(1) If(LOP==0){ Exit; }
     ZZ= ZZ+RR(2)
    } //
    RR=(,"","")
   }

  }
  Else{ ZZ= ZZ+XX }
 } //
 If(Chk!=0){ Print({"Usage:[カッコ]が対応してない / Chk="}+Chk ) End }

 Result=ZZ; //C^`X^C^ A^"X^A^
} //func
  
Function Chd3(Str TT,Str GG,Str CC){ // FM9|E7#9, "...", If(TR==2){>} 

 Array RR=Split(LopBrk(TT) ) // RR= FshrYtes(RR)

 TR=3 CC;
 TR=2 CC;
 TR=1 CC;

 Array LL; Array BB
 For(Int i=0;i<SizeOf(RR);i++){

  LL= ChdCut(RR(i) )
  BB=NoteCnvt(Keydata(LL(0) ),Chddata0(LL(1) ) )

 If(SizeOf(BB)==0){ Print({"usage:中身が空 / BB:"}+BB) End }

  TR=1 Lyric=RR(i)+{ / }+Gousei(BB)+{ / }+ GG;
       Synth(LL(2),BB) // ^^x,(c,e,g,b,`d)
  TR=2 Synth(LL(2),BB)
  TR=3 Synth(LL(2),BB)
 } //
} //Central func


 
#DATA; 
 
