System.Include(stdmsg.h);
System.MeasureShift(1);
ResetGM();
TrackSync;

Array CD=("C","D7","G7","C","Am","C+dim","Dm7","G7","C","Gaug","C","Am","Dm","E7","A7","D7","C+7","C","Am","Am","Em","Caug","F","Fm","G7","C","A7","D7","Dm7","G7","C","Gdim","G7","C","F7","C","Fm","G7","C","C+dim","Dm7","G7","C","A+7","A7","Cm","D7","Dm7","G7","C","F","C","Gaug","C","D7","Dm7","G7","C","B","C","C+dim","G7","C","B7","A+7","A7","Cm","D7","C+7","C","A7","Cm","D7","C+7","C","E7","E7","A7","Dm","C","Em","Dm","Em","Am","G+7","C","Gm","A7","D7","G7","C","B","C","D+m","Dm","C","E7","A7","D7","G7","C","D+m","Dm","C+7","C","C+dim","Dm7","G7","C","C","F7","C","Dm","G7","C","G+7","C","A7","Dm","C","C+dim","G7","C","Cdim","C","Gdim","G7","C")

                //■■■コード進行やRandomSeedを変えてみよう■■■
RandomSeed=123455 　　　　　  //ピコサクラ用
//System.RandomSeed(123455)   //サクラ用



Print("CD=",CD)
Array NNN=("c","c+","d","d+","e","f","f+","g","g+","a","a+","b");
Int CD1=SizeOf(CD)
Array ZZB   　//ノート（n表記）
Int R5;
Int RR;Int R1;Int R2;Int R3;Int R4  //乱数
Int NN    　　//ZZBのsize
Int ZZ0
Int Z9=67     //旧ノート（n表記）
Int VV        //velocity
Int V9=100    //旧velocity
Str AAA;
Int BBB;
Int J2;       //L値
Int J3;       //タイ率%
Int JT=0;     //次小節へのタイ率%
Str MM="";    //MML
Str M1="";    //TR(1)MML
Str M2="";    //TR(2)MML

Int TMP=120;  //■■■Tempoを変えてみよう■■■

Int Sec=(60*CD1*4)/TMP;
Print("演奏　約"+Sec+"秒");

　　　　　　　　　　　　　　　　　　　　　 //■■■@(楽器)を変えてみよう■■■
MM="TrackName={'CHORDで作曲4 for PICOSAKURA'}
Copyright={'Moritoizumi'}
TimeSignature=4,4
Tempo="+TMP+"
";
M1="TR=1 CH=1 @(OrchestralHarp) V(100) l8  v100 q98 TrackKey=0 P.onNoteWave(32,96,!4) r1
";
M2="TR=2 CH=2 @(OrchestralHarp) V(80)  l16 o5 v80  TrackKey=0 v.N(70,70,80,70,80,70,90,70) r1
";

For(Int I=0; I<CD1; I++){
                     //■■乱数に対するL値とタイ率%を変えてみよう■■■
                     //J2・・・1は全音符、2は2分音符、3は3連全音符、4は4分音符、
                     //        6は3連2分音符、8は8分音符、12は3連4分音符、16は16分音符
                     //J3・・・0〜100%
RR=Random(6);            // 0〜5の目の出るサイコロを振る
IF(RR=0){J2=6;J3=12;}    // 0が出たら、3連2分音符、タイ率12%
IF(RR=1){J2=8;J3=16;}    // 1が出たら、8分音符、タイ率16% 
IF(RR=2){J2=8;J3=16;}    // 2が出たら、8分音符、タイ率16%
IF(RR=3){J2=12;J3=24;}   // 3が出たら、3連4分音符、タイ率24%
IF(RR=4){J2=16;J3=32;}   // 4が出たら、16分音符、タイ率32%
IF(RR=5){J2=16;J3=32;}   // 5が出たら、16分音符、タイ率32%

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<J2; J++){ 
IF(J=0){M1=M1+"l"+J2+" ";}
  R2=Random(100)
    IF(JT=1){M1=M1+"n"+Z9;JT=0}　　　　      //次小節へのタイがあれば旧ノートを表示
    ELSE{IF((J3>R2)*(J>0)){M1=M1+"^"}　　　　//タイ確率に応じてタイ、
      ELSE{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                                   //o6ならv80にする
          IF(ZZB(R1)<72){VV=100}                  //o5ならv100にする
          IF(ZZB(R1)<60){VV=120}                  //o4ならv120にする
          IF(VV!=V9){M1=M1+" v"+VV+"n"+ZZB(R1);Z9=ZZB(R1);V9=VV;EXIT}
            ELSE{M1=M1+"n"+ZZB(R1);Z9=ZZB(R1);EXIT}
                   }}}}
                          }//J bottom
                           //■■■次小節へのタイ率を変えてみよう。例）50%■■■
R5=Random(100);
IF((R5<50)*(I<CD1-1)){M1=M1+"& ";JT=1;}ELSE{M1=M1+" ";JT=0}
M1=M1+"
";  
M2=M2+" [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)+"]";
R5=I%4;
IF(R5=3){M2=M2+"
";}            //4個ごとに改行
}//I bottom

For(Int L=48; L<84; L++){  //ノートをn表示からabc表示へ変更
AAA="n"+L;   
BBB=L%12;
M1=Replace(M1,AAA,NNN(BBB),on)
M2=Replace(M2,AAA,NNN(BBB),on)
}

M1=Replace(M1,"v120","o4v120",on) //o4、o5、o6を追加する。
M1=Replace(M1,"v100","o5v100",on)
M1=Replace(M1,"v80","o6v80",on)

MM=MM+M1+"
"+M2;
Print(MM);
Play(MM)