//ダッシュボード　基本形が3連4分音符(l12)用　ここから

RandomSeed=543210;                  //RandomSeedの数値を変えると曲が変わります。
　　　　　　　　　　　　　　        //PicosakuraはこのままでOK。
　　　　　　　　　　　　　　        //SakuraはSystem.RandomSeedとしてください。
Int TMP=120;                        //Tempo
Int INST=16;                        //楽器番号(1=GrandPiano、11=MusicBox、16=Dulcimer、89=NewAgePad等)
Int TK=6;                           //TrackKey
Int DD9=60;                         //最小小節数（これ以降でコード進行がG7,Cとなるか、100小節で終了）
                                                           //WW0〜WW7は各1/8の確率
Array WW0=(0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0); //aaaaaaaaaaaa（３連４分音符）
Array WW1=(0,100,  0,100,  0,100,  0,100,  0,100,  0,100); //a^a^a^a^a^a^（３連２分音符）
Array WW2=(0,100,100,  0,100,100,  0,100,100,  0,100,100); //a^^a^^a^^a^^（４分音符）
Array WW3=(0,100,100,  0,100,100,  0,100,100,  0,100,100); //　　〃　　　（　〃　　）
Array WW4=(0,100,100,100,  0,100,100,100,  0,100,100,100); //a^^^a^^^a^^^（３連全音符）
Array WW5=(0,100,100,100,100,100,  0,100,100,  0,100,100); //a^^^^^a^^a^^（２分音符＋４分音符）
Array WW6=(0,100,100,100,100,100,  0,100,100,100,100,100); //a^^^^^a^^^^^（２分音符）
Array WW7=(0,100,100,100,100,100,100,100,100,100,100,100); //a^^^^^^^^^^^（全音符）
//               　ここまで



Int CX=12;                   //1小節に3連4分音符(l12)を
Int CCC=12;                  //12回使うのが基本形  
Array WW;//1小節内の各音符がタイ(^)に変わる確率(%)
Int AA;Int A9;/*音番号と旧AA（o5cはn60です)*/Array AA1;Int LL/*コード内ノートとそのSIZE*/
Int N;Int N9;Int NX;/*コード、旧コード、次コード*/Int BB;/*1小節内何番目の音*/Int DD;/*何小節目*/Int DDD;//DD+2           
Int EE;/*c,c+,d,d+…を0,1,2,3…で表した数字*/Int E9;//EEの旧値
Int GG;/*前後の音の高さの差をチェックする回数*/Int GG1=100;//GGの最大値。これを超えたらそのまま鳴らす。
Int Z=6;/*前後の音の高さの差を半音6個以内に制限*/Int RX//乱数
Int OO;/*オクターブ*/Int OO9=5;/*旧OO*/Str PP;Str P9//音符またはオクターブ付き音と旧PP
Array AR=({c},{c+},{d},{d+},{e},{f},{f+},{g},{g+},{a},{a+},{b})
Array VE=({},{},{},{},{o4v120},{o5v109},{o6v80}) //オクターブとベロシティ
Str MD="";/*MelodyMML*/Str MC="";/*伴奏MML*/Str MC1;//伴奏MML1音
Str MB="";/*伴奏MML*/Str MB1="";/*伴奏MML1音*/Str MML2="";//MML
Int R9;
Str BR2="
";                    //改行
MML2="System.Include(stdmsg.h);
System.MeasureShift(1);
ResetGM();
TimeSignature = 4,4;
TrackSync;
TrackName={'Melody Chime 4Beat kai3'};
Copyright={'Moritoizumi'}"; 
     //コード名に+を使うと誤動作するのでxにしています。
MML2=MML2+"
Str Am={[8'acea']};Str C7={[8'cega+']};Str Cm={[8'cd+gc']};Str Cx7={[8'c+fg+bc+']};
Str Dm={[8'dfad']};Str D7={[8'df+ac']};Str Dxm={[8'd+f+a+d+']};Str Dx7={[8'd+ga+c+']};
Str Em={[8'egbe']};Str E7={[8'eg+bd']};Str Fm={[8'fg+cf']};Str F7={[8'facd+']};
Str Gm={[8'ga+dg']};Str G7={[8'gbdf']};Str B={[8'bd+f+b']};Str Gx7={[8'g+cd+f+']};
Str C={[8'cegc']};Str Dm7={[8'dfac']};Str F={[8'facf']};Str Caug={[8'ceg+c']};
Str Gx={[8'g+cd+g+']};Str Gaug={[8'gbd+g']};Str A7={[8'ac+eg']};Str Cdim={[8'cd+f+a']};
Str Ax7={[8'a+dfg+']};Str Cxdim={[8'c+ega+']};Str B7={[8'bd+f+a']};Str Gdim={[8'ga+c+e']};
Str Ax1={a+};Str A1={a};Str B1={b};Str C1={c};Str Cx1={c+};Str D1={d};
Str Dx1={d+};Str E1={e};Str F1={f};Str G1={g};Str Gx1={g+};"+BR2;
N9=1;A9=60;MD={};MC={};MB={};
FOR(DD=0; DD<100; DD++){         //100小節以内演奏する
IF(DD==0){N=5}ELSE{N=NX}         //1小節目はC、2小節以降は次コード(NX)から始める

RX=Random(8);//タイの確率
IF(RX=0){WW=WW0;}
IF(RX=1){WW=WW1;}
IF(RX=2){WW=WW2;}
IF(RX=3){WW=WW3;}
IF(RX=4){WW=WW4;}
IF(RX=5){WW=WW5;}
IF(RX=6){WW=WW6;}
IF(RX=7){WW=WW7;}

RX=(DD>DD9)*(N==5)*(N9==24);
IF(RX!=0){WW=(0,100,100,100,100,100,100,100,100,100,100,100)}  //最終小節は全音符とする

//       Organ     Guitar      構成音　　　　　　　　　　　　　　　　　　次コード候補
IF(N=0){MB1="Ax1";MC1="Ax7";  AA1=(58,70,82,50,62,74,53,65,77,56,68,80);NX=RandomSelect(5,1)}
IF(N=1){MB1="A1"; MC1="A7";   AA1=(57,69,81,49,61,73,52,64,76,55,67,79);NX=RandomSelect(14,15,11)}
IF(N=2){MB1="A1"; MC1="Am";   AA1=(57,69,81,48,60,72,52,64,76);         NX=RandomSelect(2,15,18,14,7,23)}
IF(N=3){MB1="B1"; MC1="B";    AA1=(59,71,83,51,63,75,54,66,78);         NX=RandomSelect(5)}
IF(N=4){MB1="B1"; MC1="B7";   AA1=(59,71,83,51,63,75,54,66,78,57,69,81);NX=RandomSelect(15,18,17,0)}
IF(N=5){MB1="C1"; MC1="C";    AA1=(48,60,72,52,64,76,55,67,79);         NX=RandomSelect(5,5,24,19,2,2,10,26,7,3,25,14,1,8,21,20,0,27,4,9,17,12,18,15,22,13,23)}
IF(N=6){MB1="Cx1";MC1="Cx7";  AA1=(49,61,73,53,65,77,56,68,80,59,71,83);NX=RandomSelect(5)}
IF(N=7){MB1="Cx1";MC1="Cxdim";AA1=(49,61,73,52,64,76,55,67,79,58,70,82);NX=RandomSelect(15,24,16)}
IF(N=8){MB1="C1"; MC1="C7";   AA1=(48,60,72,52,64,76,55,67,79,58,70,82);NX=RandomSelect(19,21,20,4)}
IF(N=9){MB1="C1"; MC1="Caug"; AA1=(48,60,72,52,64,76,56,68,80);         NX=RandomSelect(19,2)}
IF(N=10){MB1="C1"; MC1="Cdim"; AA1=(48,60,72,51,63,75,54,66,78,57,69,81);NX=RandomSelect(24,16,5)}
IF(N=11){MB1="C1"; MC1="Cm";   AA1=(48,60,72,51,63,75,55,67,79);         NX=RandomSelect(14)}
IF(N=12){MB1="Dx1";MC1="Dx7";  AA1=(51,63,75,55,67,79,58,70,82,49,61,73);NX=RandomSelect(16,14)}
IF(N=13){MB1="Dx1";MC1="Dxm";  AA1=(51,63,75,54,66,78,58,70,82);         NX=RandomSelect(15)}
IF(N=14){MB1="D1"; MC1="D7";   AA1=(50,62,74,54,66,78,57,69,81,48,60,72);NX=RandomSelect(24,16,6)}
IF(N=15){MB1="D1"; MC1="Dm";   AA1=(50,62,74,53,65,77,57,69,81);         NX=RandomSelect(24,4,18,5,17,6)}
IF(N=16){MB1="D1"; MC1="Dm7";  AA1=(50,62,74,53,65,77,57,69,81,48,60,72);NX=RandomSelect(24)}
IF(N=17){MB1="E1"; MC1="E7";   AA1=(52,64,76,56,68,80,59,71,83,50,62,74);NX=RandomSelect(17,1,1)}
IF(N=18){MB1="E1"; MC1="Em";   AA1=(52,64,76,55,67,79,59,71,83);         NX=RandomSelect(9,2,15)}
IF(N=19){MB1="F1"; MC1="F";    AA1=(53,65,77,57,69,81,48,60,72);         NX=RandomSelect(19,5,24,21,24)}
IF(N=20){MB1="F1"; MC1="F7";   AA1=(53,65,77,57,69,81,48,60,72,51,63,75);NX=RandomSelect(5)}
IF(N=21){MB1="F1"; MC1="Fm";   AA1=(53,65,77,56,68,80,48,60,72);         NX=RandomSelect(5,24)}
IF(N=22){MB1="Gx1";MC1="Gx";   AA1=(56,68,80,48,60,72,51,63,75);         NX=RandomSelect(24)}
IF(N=23){MB1="Gx1";MC1="Gx7";  AA1=(56,68,80,48,60,72,51,63,75,54,66,78);NX=RandomSelect(24,15,5)}
IF(N=24){MB1="G1"; MC1="G7";   AA1=(55,67,79,59,71,83,50,62,74,53,65,77);NX=RandomSelect(5)}
IF(N=25){MB1="G1"; MC1="Gaug"; AA1=(55,67,79,59,71,83,51,63,75);         NX=RandomSelect(5)}
IF(N=26){MB1="G1"; MC1="Gdim"; AA1=(55,67,79,58,70,82,49,61,73,52,64,76);NX=RandomSelect(24)}
IF(N=27){MB1="G1"; MC1="Gm";   AA1=(55,67,79,58,70,82,50,62,74);         NX=RandomSelect(1)}

MB=MB+" "+MB1;MC=MC+" "+MC1;
FOR(BB=0; BB<CCC; BB++){FOR(GG=0; GG<GG1;GG++){        
        LL=SizeOf(AA1);AA=AA1(Random(LL))
      RX=(AA-A9)*(AA-A9);	  
	  IF(RX<=Z*Z){EXIT;}}
        IF(Random(100)<WW(BB)){PP="^"}
        ELSE{OO=AA/12;EE=AA-OO*12;E9=EE;P9=AR(EE);IF(OO==OO9){PP=P9}ELSE{PP=VE(OO)+P9}}
        A9=AA;MD=MD+PP;OO9=OO}
RX=(DD==24)+(DD==49)+(DD==74);
IF(RX!=0){MB=MB+BR2;MC=MC+BR2;}
RX=(DD>DD9)*(N==5)*(N9==24);
IF(RX!=0){DD++;Print("最小小節数(指定)",DD9,"、実際の小節数",DD);EXIT;}   //指定小節以上でG7→Cとなったら終了
R9=DD%2;
IF(R9=1){MD=MD+BR2;}ELSE{MD=MD+" | ";}
N9=N;}
DDD=DD+2
MML2=MML2+"Tempo="+TMP+BR2;
MML2=MML2+"TR=1 CH=1 @"+INST+" V(120) P(64) o5 r1 l12 v100 TrackKey="+TK+" P.onNoteWave(32,96,!4)"
MML2=MML2+BR2+MD+BR2;
MML2=MML2+"TR=2 CH=2 @(DrawbarOrgan) q100 V(70) P(32) o5 r1 l1 v100 v90 TrackKey="+TK+BR2;
MML2=MML2+MB+BR2;
MML2=MML2+"TR=3 CH=3 @(SteelcGuitar) q33 V(70) P(96) o5 r1 l8 v80 
v.N(80,80,80,80,50,50,50,50,80,80,80,80,80,80,80,80,50,50,50,50,80,80,80,80,80,80,80,80,80,80,80,80)
 TrackKey="+TK+BR2;
MML2=MML2+MC;
Print(MML2);
Play(MML2);