System.Include(stdmsg.h)
System.MeasureShift(1);
ResetGM();
TrackSync;
TrackName={'chord進行作成'}
Copyright={'Moritoizumi'}
System.TimeBase=48
TimeSignature=4,4
Str Am={[8 'acea']};Str C7={[8 'cega+']};Str Cm={[8 'cd+gc']};Str Cx7={[8 'c+fg+b']};
Str Dm={[8 'dfad']};Str D7={[8 'df+ac']};Str Dxm={[8 'd+f+a+']};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+d']};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']};
Tempo=120 TR=1 CH=1 V(100) l8 @26 P.onNoteWave(32,96,!4) r1
v.N(80,80,80,80,60,60,60,60,80,80,80,80,80,80,80,80,60,60,60,60,80,80,80,80,80,80,80,80,80,80,80,80)
Am E7 Dm E7 Dm Am C  G7 C  Em 
D7 G7 C  Em D7 G7 C  Am E7 Dm 
Am G7 C  Em D7 G7 C  Em D7 G7 
C  G7 C  Em D7 G7 E7 Am Dm E7 
Am E7 Dm Am E7 Dm E7 E7 Dm F  
E7 E7 Am E7 Am E7 Am E7 Dm E7 

//先頭からここまではサンプル曲(ピコサクラ対応)です。
//コード進行作成本体(ピコサクラ未対応)は毎回ランダムに違ったMMLを下側タブに出力・演奏しま
//すが、これを使用する場合は先頭から次行までを消して下さい。
/*



//好きなコード進行から、毎回異なるコード進行を作り、下側タブに表示・演奏します。


//-------------------------------------------------------------------
//好きなコード進行をカッコ内に入力して下さい(スペースなしで)

Array X=(Am,E7,Dm,E7,Dm,Am,E7,Am,G7,C,Am,C,G7,C,Em,D7,G7,E7,Am,Dm,E7,Am,Am,E7,
Dm,E7,Dm,Am,E7,Am,E7,E7,E7,Am,Dm,F,E7,Am,E7,Dm,E7,Dm,Am,E7,Am)
              //コードがStr Am={[8 'acea']}などと定義されているか確認して下さい。
              //それぞれ、構成音は4音にして下さい。 
		      //コード名に+を使わずxにして下さい(誤動作防止)。
		  
Int D=2;      //1コードの最大文字数（数字を入力して下さい）
Int TT=120;   //テンポ　（数字を入力して下さい）
Int JJ=26;    //楽器番号（数字を入力して下さい）
Int II=60;    //小節数　（数字を入力して下さい）
//--------------------------------------------------------------------



Int N=SizeOf(X);              //好きなコード進行の全コード数
FOR(Int J=0; J<N; J++){       //コードの文字数を揃える
X(J)=MID(X(J)+"     ",1,D)}
Array Y=X;
FOR(Int J=0; J<N-1; J++){     //ユニークコードを抽出
FOR(Int I=J+1; I<N; I++){
IF(Y(J)==Y(I)){Y(I)="";}}}
//ユニークコードと次コード・次コード数の表を作成・下側タブに表示
Array Z=Y;    //次コード
Array L;      //次コード数
Str W=X(0);   //初めのコードは好きなコード進行と同じ
Print("chord　次chord候補　　　　　　　候補数")

FOR(Int I=0; I<N-1; I++){
IF(Y(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;}}}
L(I)=L(I)+1;
Print(Y(I)+" ; "+Z(I)+" "+L(I));}}



Str BR2="
";             　　　　　 //改行
Str MML2="System.Include(stdmsg.h)
System.MeasureShift(1);
ResetGM();
TrackSync;
TrackName={'chord進行作成'}
Copyright={'Moritoizumi'}
System.TimeBase=48
TimeSignature=4,4
Str Am={[8 'acea']};Str C7={[8 'cega+']};Str Cm={[8 'cd+gc']};Str Cx7={[8 'c+fg+b']};
Str Dm={[8 'dfad']};Str D7={[8 'df+ac']};Str Dxm={[8 'd+f+a+']};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+d']};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']};
Tempo="+TT+" TR=1 CH=1 V(100) l8 @"+JJ+" P.onNoteWave(32,96,!4) r1
v.N(80,80,80,80,60,60,60,60,80,80,80,80,80,80,80,80,60,60,60,60,80,80,80,80,80,80,80,80,80,80,80,80)"+BR2; 

FOR(Int I=0; I<II; I++){
MML2=MML2+W+" ";
IF((I+1)/10*10=I+1){MML2=MML2+BR2}
FOR(Int J=0; J<N; J++){
IF(Y(J)=W){
Int R=Random(L(J));
W=MID(Z(J),R*(D+1)+1,D);EXIT}
}}

Print(MML2);MML2;　　　　　//新コード進行を下側タブに表示・演奏
