System.Include(stdmsg.h)
System.MeasureShift(1);
ResetGM();
TrackSync;
TrackName={'chord進行作成2'}
Copyright={'Moritoizumi'}
TimeSignature=4,4
Str Am={[2 acea]};Str C7={[2 cega+]};Str Cm={[2 cd+gc]};Str Cx7={[2 c+fg+b]};
Str Dm={[2 dfad]};Str D7={[2 df+ac]};Str Dxm={[2 d+f+a+]};Str Dx7={[2 d+ga+c+]};
Str Em={[2 egbe]};Str E7={[2 eg+bd]};Str Fm={[2 fg+cf]};Str F7={[2 facd+]};
Str Gm={[2 ga+d]};Str G7={[2 gbdf]};Str B={[2 bd+f+b]};Str Gx7={[2 g+cd+f+]};
Str C={[2 cegc]};Str Dm7={[2 dfac]};Str F={[2 facf]};Str Caug={[2 ceg+c]};
Str Gx={[2 g+cd+g+]};Str Gaug={[2 gbd+g]};Str A7={[2 ac+eg]};Str Cdim={[2 cd+f+a]};
Str Ax7={[2 a+dfg+]};Str Cxdim={[2 c+ega+]};Str B7={[2 bd+f+a]};Str Gdim={[2 ga+c+e]};
Tempo=120 TR=1 CH=1 V(100) l8 @11 P.onNoteWave(32,96,!4) r1 v.N(80,50,80,80,40,70,70,70)

 C     B7    Dm    G7    C     C     B     C     Gx7   Dm   
 C     Cxdim G7    C     Gx    G7    C     Am    Em    Am   
 Cxdim Dm7   G7    C     C7    F     Fm    C     F7    C    
 B7    E7    E7    A7    Dm    C     C7    B7    Em    Am   
 Cxdim Dm7   G7    C     Cxdim G7    C     Gx7   G7    C    
 Gx7   G7    C     B7    Ax7   A7    D7    G7    C     F7   
 C     Dx7   D7    G7    C    
 
//先頭からここまではサンプル曲(ピコサクラ対応)です。
//コード進行作成本体(ピコサクラ未対応)は毎回ランダムに違ったMMLを下側タブに出力・演奏しま
//すが、これを使用する場合は先頭から次行までを消して下さい。
/*



//好きなコード進行から、毎回異なるコード進行を作り、下側タブに表示・演奏します。


//-------------------------------------------------------------------
//好きなコード進行をスペースなしでカッコ内に入力して下さい（いま、サンプルが入っています)

Array X=(C,Am,Gx7,Dm,B7,Em,Dm,E7,E7,A7,Cm,D7,G7,C,D7,G7,C,Am,Em,Am,Em,Caug,F,F,Fm,
C,Dx7,D7,G7,C,A7,Dm,Cx7,C,C,Gx,G7,C,C,Fm,C,Cdim,Dm7,G7,C,A7,D7,Cx7,C,C7,B7,E7,A7,
Cm,D7,G7,C,F7,C,B7,Ax7,A7,Cm,D7,Cx7,C,Dm,G7,C,E7,A7,Dm,C,F7,C,B,C,Am,Cxdim,Dm7,G7,
C,E7,E7,A7,Dm,Cx7,C,Em,Am,Cxdim,G7,C,Cxdim,G7,C,B7,E7,E7,A7,D7,G7,C,Dm,C,Am,Em,Dm,
B7,Em,Caug,F,F,C,B,C,G7,C,Cxdim,Dm7,G7,C,Gx7,G7,C,Gm,A7,Dm,B7,E7,A7,Dm,C,E7,A7,Dm,
B7,Dm,C,Gx7,Dm,B7,Dm,E7,E7,A7,Dm,Em,Am,Cxdim,Dm,E7,A7,Cm,D7,Dm7,G7,C,F7,C,C7,F,G7,
C,Gx7,Dm,C,Dm,B7,E7,A7,Cm,D7,G7,C)
              //コードがStr Am={[2 acea]}などと定義されているか確認して下さい。
              //それぞれ、構成音は4音にして下さい。 
		      //コード名に+を使わずxにして下さい(誤動作防止)。
		  
Int D=5;      //1コードの最大文字数（数字を入力して下さい）
Int TT=120;   //テンポ　（数字を入力して下さい）
Int JJ=11;    //楽器番号（数字を入力して下さい。11はオルゴール）
Int II=60;    //小節数　（数字を入力して下さい）これを超えた後、ドミナントセブンス・ドミナントが来たら終了
Str DM="C";   //上記コード進行のドミナント
Str SV="G7";  //上記コード進行のドミナントセブンス
//--------------------------------------------------------------------


//RandomSeedを使う場合は次行の//を外し、数値を指定してください。同じ数値を指定すると同じコード進行になります。
//Int RR=123456;System.RandomSeed=RR;Print(RR);

Print(X);
DM=MID(DM+"     ",1,D);SV=MID(SV+"     ",1,D)
Int N=SizeOf(X);              //好きなコード進行の全コード数
FOR(Int J=0; J<N; J++){       //コードの文字数を揃える
X(J)=MID(X(J)+"     ",1,D)}
Array Y2=X;
FOR(Int J=0; J<N-1; J++){     //ユニークコードを抽出
FOR(Int I=J+1; I<N; I++){
IF(Y2(J)==Y2(I)){Y2(I)="";}}}

Array Z=Y2;    //次コード
Array L;       //次コード数
Str W=DM;      //初めのコードはドミナント
Str W9=DM;     //旧コード

FOR(Int I=0; I<N-1; I++){
IF(Y2(I)!=""){Z(I)="";L(I)=0;
FOR(Int J=I; J<N-1; J++){
IF(X(J)==X(I)&&X(J+1)!=""){
IF(Z(I)==""){Z(I)=X(J+1);}
ELSE{Z(I)=Z(I)+","+X(J+1);L(I)=L(I)+1;}}}//J bottom
L(I)=L(I)+1;

//ユニークコード、次コード、次コード数のリストを下側タブに表示したい場合は次行の//を外してください。
//Print(Y2(I)+" ; "+Z(I)+" ; "+L(I));

}}//I bottom
Str BR2="
";             　　　　　 //改行
Str MML2="System.Include(stdmsg.h)
System.MeasureShift(1);
ResetGM();
TrackSync;
TrackName={'chord進行作成2'}
Copyright={'Moritoizumi'}
TimeSignature=4,4
Str Am={[2 acea]};Str C7={[2 cega+]};Str Cm={[2 cd+gc]};Str Cx7={[2 c+fg+b]};
Str Dm={[2 dfad]};Str D7={[2 df+ac]};Str Dxm={[2 d+f+a+]};Str Dx7={[2 d+ga+c+]};
Str Em={[2 egbe]};Str E7={[2 eg+bd]};Str Fm={[2 fg+cf]};Str F7={[2 facd+]};
Str Gm={[2 ga+d]};Str G7={[2 gbdf]};Str B={[2 bd+f+b]};Str Gx7={[2 g+cd+f+]};
Str C={[2 cegc]};Str Dm7={[2 dfac]};Str F={[2 facf]};Str Caug={[2 ceg+c]};
Str Gx={[2 g+cd+g+]};Str Gaug={[2 gbd+g]};Str A7={[2 ac+eg]};Str Cdim={[2 cd+f+a]};
Str Ax7={[2 a+dfg+]};Str Cxdim={[2 c+ega+]};Str B7={[2 bd+f+a]};Str Gdim={[2 ga+c+e]};
Tempo="+TT+" TR=1 CH=1 V(100) l8 @"+JJ+" P.onNoteWave(32,96,!4) r1 v.N(80,50,80,80,40,70,70,70)"+BR2;

FOR(Int I=0; I<200; I++){
//IF((I+1)/10*10==I+1){MML2=MML2+BR2}
IF(I%10==0){MML2=MML2+BR2}
IF(I==0){MML2=MML2+{ }+W}Else{
FOR(Int J=0; J<N; J++){
IF(Y2(J)==W){
            Int R=Random(L(J));
            W9=W;W=MID(Z(J),R*(D+1)+1,D);
            MML2=MML2+{ }+W;EXIT;
		}
}//J bottom
}
IF(W9==SV&&W==DM&&I>II){EXIT;}
}//I bottom

Print(MML2);MML2;　　　　　//新コード進行を下側タブに表示・演奏
