System.Include(stdmsg.h);
System.MeasureShift(1);
ResetGM();
TrackSync;

Array CD=("C","F","C","Em","F","Dm","Am","A7","Dm","G7","C","E7","G7","E7","G7","C","C","F","C","Em","F","Dm","Am","A7","Dm","G7","C","E7","G7","E7","G7","C","C","F","C","Em","F","Dm","Am","A7","Dm","G7","C","E7","G7","E7","G7","C")

RandomSeed=123456 　　　　　//ピコサクラ用
//System.RandomSeed(123456) //サクラ用

Int ZZZ=5                   //3連符の確率%(0〜10)


Print("CD=",CD)
Array NNN=("c","c+","d","d+","e","f","f+","g","g+","a","a+","b");
Int CD1=SizeOf(CD)
Array TT  　　//音符パターン
Array ZZB   　//ノート（n表記）
Int RR  　　  //乱数
Int R1  　　  //乱数
Int R2
Int R3
Int R4
Int NN    　　//ZZBのsize
Int ZZ0
Int Z9=67     //旧ノート（n表記）
Int Z8=67  　 //旧旧ノート（n表記）
Int Z7=67   　//旧旧旧ノート（n表記）
Int PP        //0,2,4,6拍目はPP=0、他はPP=1
Int TH=1      //直前が3連符=1,それ以外=0
Int VV        //velocity
Int V9=100    //旧velocity
Str MM=""     //MMはMML、M1は小節毎のMML

Str M1="TrackName={'CHORDで作曲3 PICOSAKURA'}
Copyright={'Moritoizumi'}
TimeSignature=4,4;
Tempo=74;
TR=1 CH=1 @(NewAgePad)　V(100) l8  o5 v100 TrackKey=6 q98 P.onNoteWave(32,96,!4) r1
TR=2 CH=2 @(GrandPiano) V(80)  l16 o5 v80  TrackKey=6 v.N(70,70,80,70,80,70,90,70) r1"
Print(M1);MM=MM+M1;M1="";

//音符パターン（拍ごとのタイの確率）
Array TT0=(0,33,33,33,33,33,33,33)       //ほぼ8分音符//------
Array TT1=(0,66,33,66,33,66,33,66)       //ほぼ4分音符//------
Array TT2=(0,66,66,66,33,66,66,66)       //ほぼ2分音符//------
Array TT3=(0,66,66,66,66,66,66,66)       //ほぼ全音符 //------

For(Int I=0; I<SizeOf(CD); I++){

RR=Random(6)//音符パターンを0〜5の乱数で決める
IF(RR=0){TT=TT0}
IF(RR=1){TT=TT0}//------
IF(RR=2){TT=TT0}//------
IF(RR=3){TT=TT1}
IF(RR=4){TT=TT2}
IF(RR=5){TT=TT3}

IF(CD(I)="A+7"){ZZB=(58,70,82,50,62,74,53,65,77,56,68,80)}//コード内のノートはn表記の
IF(CD(I)="A7"){ZZB=(57,69,81,49,61,73,52,64,76,55,67,79)} //48〜83とし、9音または12音に
IF(CD(I)="Am"){ZZB=(57,69,81,48,60,72,52,64,76)}        //してください。
IF(CD(I)="B"){ZZB=(59,71,83,51,63,75,54,66,78)}        //ここにないコードは作って下さい。
IF(CD(I)="B7"){ZZB=(59,71,83,51,63,75,54,66,78,57,69,81)}
IF(CD(I)="C"){ZZB=(48,60,72,52,64,76,55,67,79)}
IF(CD(I)="C+7"){ZZB=(49,61,73,53,65,77,56,68,80,59,71,83)}
IF(CD(I)="C+dim"){ZZB=(49,61,73,52,64,76,55,67,79,58,70,82)}
IF(CD(I)="C7"){ZZB=(48,60,72,52,64,76,55,67,79,58,70,82)}
IF(CD(I)="Caug"){ZZB=(48,60,72,52,64,76,56,68,80)}
IF(CD(I)="Cdim"){ZZB=(48,60,72,51,63,75,54,66,78,57,69,81)}
IF(CD(I)="Cm"){ZZB=(48,60,72,51,63,75,55,67,79)}
IF(CD(I)="D+7"){ZZB=(51,63,75,55,67,79,58,70,82,49,61,73)}
IF(CD(I)="Dxm"){ZZB=(51,63,75,54,66,78,58,70,82)}
IF(CD(I)="D7"){ZZB=(50,62,74,54,66,78,57,69,81,48,60,72)}
IF(CD(I)="Dm"){ZZB=(50,62,74,53,65,77,57,69,81)}
IF(CD(I)="Dm7"){ZZB=(50,62,74,53,65,77,57,69,81,48,60,72)}
IF(CD(I)="E7"){ZZB=(52,64,76,56,68,80,59,71,83,50,62,74)}
IF(CD(I)="Em"){ZZB=(52,64,76,55,67,79,59,71,83)}
IF(CD(I)="F"){ZZB=(53,65,77,57,69,81,48,60,72)}
IF(CD(I)="F7"){ZZB=(53,65,77,57,69,81,48,60,72,51,63,75)}
IF(CD(I)="Fm"){ZZB=(53,65,77,56,68,80,48,60,72)}
IF(CD(I)="G+"){ZZB=(56,68,80,48,60,72,51,63,75)}
IF(CD(I)="G+7"){ZZB=(56,68,80,48,60,72,51,63,75,54,66,78)}
IF(CD(I)="G7"){ZZB=(55,67,79,59,71,83,50,62,74,53,65,77)}
IF(CD(I)="Gaug"){ZZB=(55,67,79,59,71,83,51,63,75)}
IF(CD(I)="Gdim"){ZZB=(55,67,79,58,70,82,49,61,73,52,64,76)}
IF(CD(I)="Gm"){ZZB=(55,67,79,58,70,82,50,62,74)}

For(Int J=0; J<8; J++){ 
  R2=Random(100)
　PP=J%2;IF(J=0){PP=1}  //2,4,6拍目はPP=0、他はPP=1

IF(PP=0){
  IF(R2<ZZZ){M1=M1+"Div{n"+Z7+"n"+Z8+"n"+Z9+"}4";J++;TH=1}//2,4,6拍目はZZZ%の確率で3連符

    ELSE{                                          //その他は、
  IF(TH=0){R4=R2}ELSE{R4=0}　　　　　　　　　　　　//前拍が3連符でないかJ=0でなければ
  IF(J=0){R4=0}
    IF(TT(J)<R4){TH=0;M1=M1+"^"}　　　　　　　　　//音符パターンの確率でタイ、//------
      ELSE{TH=0;FOR(Int K=0; K<25; K++){　　　　　//残りはノート
      NN=SizeOf(ZZB)
      IF(NN=9){R1=Random(9)}     //コード内の音9音または、
        ELSE{R1=Random(12)}//12音からランダムに選ぶ
        ZZ0=(ZZB(R1)-Z9)*(ZZB(R1)-Z9)             //変化が半音6個以内になる音を探す
        IF(ZZ0<37){

          VV=80                                   //ベロシティは低音ほど大にする
          IF(ZZB(R1)<72){VV=100}
          IF(ZZB(R1)<60){VV=120} 

          IF(VV!=V9){M1=M1+" v"+VV+"n"+ZZB(R1);Z9=ZZB(R1);V9=VV;EXIT}
            ELSE{M1=M1+"n"+ZZB(R1);Z7=Z8;Z8=Z9;Z9=ZZB(R1);EXIT}}
                                       }}}
      }
ELSE{　　　　　　　　　　　　　　　　　　　　　　  //1,3,5,7拍目は
  IF(TH=0){R4=R2}ELSE{R4=0}　　　　　　　　　　　　//前拍が3連符でないかJ=0でなければ
  IF(J=0){R4=0}
  IF(TT(J)<R4){TH=0;M1=M1+"^"}　　　　　　　　　 　//音符パターンの確率でタイ、
  ELSE{TH=0;For(Int K=0; K<25; K++){　　　　　　   //残りはノート
      NN=SizeOf(ZZB)
      IF(NN=9){R1=Random(9)}    //コード内の音9音または、
      ELSE{R1=Random(12)}//12音からランダムに選ぶ
      ZZ0=(ZZB(R1)-Z9)*(ZZB(R1)-Z9)                  //変化が半音6個以内の音を探す
      IF(ZZ0<37){

      VV=80                                       //ベロシティは低音ほど大にする
      IF(ZZB(R1)<72){VV=100}
      IF(ZZB(R1)<60){VV=120} 

      IF(VV!=V9){M1=M1+" v"+VV+"n"+ZZB(R1);Z9=ZZB(R1);V9=VV;EXIT}
      ELSE{M1=M1+"n"+ZZB(R1);Z7=Z8;Z8=Z9;Z9=ZZB(R1);EXIT}}
      }//K bottom
      }//IF END
      }//ELSE END
}//J bottom
M1="TR=1 "+M1+" TR=2 [2 n"+ZZB(0)+"n"+ZZB(3)+"n"+ZZB(6)+"n"+ZZB(1)+"n"+ZZB(6)+"n"+ZZB(1)+"n"+ZZB(4)+"n"+ZZB(1)+"]"

For(Int L=48; L<84; L++){            //n表記からabc表記に変換●ここから●
Str AAA="n"+L;   
Int BBB=L%12;
M1=Replace(M1,AAA,NNN(BBB),on)
}
M1=Replace(M1,"v120","o4v120",on)
M1=Replace(M1,"v100","o5v100",on)
M1=Replace(M1,"v80","o6v80",on)      //n表記からabc表記に変換●ここまで ●

Print(M1);

MM=MM+M1;M1="";
}//I bottom

Play(MM)