System.Include(stdmsg.h)
System.MeasureShift(1);
ResetGM();
TimeSignature = 5,4;
TrackSync;
TrackName={"メロディ風鈴5拍子"}
Copyright={"森と泉"}
MetaText={"乱数を使って毎回違ったメロディを奏でます。下側タブにコードと総小節数が出ます。"}
System.TimeBase=96;
Int AA;Int A9;         //音番号、旧の音番号(o5cはn60です)
Int N;Int N9; Int NX; //コード、旧のコード、次コード
Int BB;                //1小節内何番目の音
Int CC;                //音長
Int CX;
Int DD;                //何小節目
Int GG;
Int G8=24;             //前後の音の高さの差をチェックする回数。
Int Z=7;              //前後の音の高さの差を半音何個以内に制限。チェック回数を超えてしまったらそのまま鳴らす。
Int W;                //タイ率
Int X;                //ベロシティ 1音ごとに高い音ほど小(n48はv127・・・n83はv57)
Str Am={[10 'ace']};		Str C7={[10 'cega+']};
Str Cm={[10 'cd+g']};		Str Cx7={[10 'c+fg+b']};
Str Dm={[10 'dfa']};		Str D7={[10 'df+ac']};
Str Dxm={[10 'd+f+a+']};	Str Dx7={[10 'd+ga+c+']};
Str Em={[10 'egb']};		Str E7={[10 'eg+bd']};
Str Fm={[10 'fg+c']};		Str F7={[10 'facd+']};
Str Gm={[10 'ga+d']};		Str G7={[10 'gbdf']};
Str B={[10 'bd+f+']};		Str Gx7={[10 'g+cd+f+']};
Str C={[10 'ceg']};		Str Dm7={[10 'dfac']};
Str F={[10 'fac']};    		Str Caug={[10 'ceg+']};
Str Gx={[10 'g+cd+']};		Str Gaug={[10 'gbd+']};
Str A7={[10 'ac+eg']};		Str Cdim={[10 'cd+f+a']};
Str Ax7={[10 'a+dfg+']};	Str Cxdim={[10 'c+ega+']};
Str B7={[10 'bd+f+a']};		Str Gdim={[10 'ga+c+e']};

//Bass
Str Ax1={a+8a+a+8a+a+a+};Str A1={a8aa8aaa};Str B1={b8bb8bbb};Str C1={c8cc8ccc};
Str Cx1={c+8c+c+8c+c+c+};Str D1={d8dd8ddd};Str Dx1={d+8d+d+8d+d+d+};Str E1={e8ee8eee};
Str F1={f8ff8fff};Str G1={g8gg8ggg};Str Gx1={g+8g+g+8g+g+g+};

Tempo=120

TR=1 CH=1 音色(ElectricPiano1) q400 V(100) P(64) r1^4 l8 v100 //唐突な^は休符とみなされ、うまく演奏されないのでゲートで対応(q400)
TrackKey=4 
TR=2 CH=2 音色(AcousticBass) q150 V(80) P(32) o3 r1^4 l4 v.onNote(80,90,80,90,100,110)
TrackKey=4 
TR=3 CH=3 音色(NylonGuitar) q100 V(60) P(96) o5 r1^4 l8 v.onCycle(!8,40,60,40,60,40,70,40,80,40,90)
TrackKey=4 
TR=8 CH=10 l16 V(60) P(27) o3  l8 [5 n31 r] l16  
TR=9 CH=10 l16 V(60) P(27) o3 r1^4
TR=10 CH=10 l32 V(60) P(27) o3 r1^4
TR=1
N9=1;A9=80;
FOR(DD=0; DD<100; DD++){           //100小節以内演奏する
IF(DD==0){N=5;}ELSE{N=NX;}         //1小節目はC、2小節以降は次コード(NX)から始める
CC=RandomSelect(4,4,8,8,8,8,16,16,32)  //音符
CX=CC+CC/4                 //1小節内の音符数CC=4→CX=5、 CC=8→CX=10、 CC=16→CX=20、 CC=32→CX=40
l(CC)
W=CC*2;                    //タイ率(音符が短いほど大) 4分音符は8%、32分音符は64%
TR=8 cr8.r4crcrr4cr8. TR=9 [2 r4dr8.]dr8. TR=10 [20 f+r]
SWITCH(N){ 
CASE(0){Print{A+7};TR=2 Ax1  TR=3 Ax7 TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(58,70,82,50,62,74,53,65,77,56,68,80);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(5,1);}
CASE(1){Print{A7};TR=2 A1       TR=3 A7 TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(57,69,81,49,61,73,52,64,76,55,67,79);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(14,15,11);}
CASE(2){Print{Am};TR=2 A1       TR=3 Am TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(57,69,81,48,60,72,52,64,76);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(2,15,18,14,7,23);}
CASE(3){Print{B};TR=2 B1        TR=3 B TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(59,71,83,51,63,75,54,66,78);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(5);}
CASE(4){Print{B7};TR=2 B1       TR=3 B7 TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(59,71,83,51,63,75,54,66,78,57,69,81);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(15,18,17,0);}
CASE(5){Print{C};TR=2 C1        TR=3 C TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(48,60,72,52,64,76,55,67,79);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}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);}
CASE(6){Print{C+7};TR=2 Cx1  TR=3 Cx7 TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(49,61,73,53,65,77,56,68,80,59,71,83);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(5);}
CASE(7){Print{C+dim};TR=2 Cx1 TR=3 Cxdim TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(49,61,73,52,64,76,55,67,79,58,70,82);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(15,24,16);}
CASE(8){Print{C7};TR=2 C1       TR=3 C7 TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(48,60,72,52,64,76,55,67,79,58,70,82);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(19,21,20,4);}
CASE(9){Print{Caug};TR=2 C1     TR=3 Caug TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(48,60,72,52,64,76,56,68,80);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(19,2);}
CASE(10){Print{Cdim};TR=2 C1    TR=3 Cdim TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(48,60,72,51,63,75,54,66,78,57,69,81);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(24,16,5);}
CASE(11){Print{Cm};TR=2 C1      TR=3 Cm TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(48,60,72,51,63,75,55,67,79);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(14);}
CASE(12){Print{D+7};TR=2 Dx1 TR=3 Dx7 TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(51,63,75,55,67,79,58,70,82,49,61,73);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(16,14);}
CASE(13){Print{D+m};TR=2 Dx1 TR=3 Dxm TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(51,63,75,54,66,78,58,70,82);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(15);}
CASE(14){Print{D7};TR=2 D1     TR=3 D7 TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(50,62,74,54,66,78,57,69,81,48,60,72);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(24,16,6);}
CASE(15){Print{Dm};TR=2 D1      TR=3 Dm TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(50,62,74,53,65,77,57,69,81);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(24,4,18,5,17,6);}
CASE(16){Print{Dm7};TR=2 D1     TR=3 Dm7 TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(50,62,74,53,65,77,57,69,81,48,60,72);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(24);}
CASE(17){Print{E7};TR=2 E1      TR=3 E7 TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(52,64,76,56,68,80,59,71,83,50,62,74);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(17,1,1);}
CASE(18){Print{Em};TR=2 E1     TR=3 Em TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(52,64,76,55,67,79,59,71,83);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(9,2,15);}
CASE(19){Print{F};TR=2 F1      TR=3 F TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(53,65,77,57,69,81,48,60,72);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(19,5,24,21,24);}
CASE(20){Print{F7};TR=2 F1      TR=3 F7 TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(53,65,77,57,69,81,48,60,72,51,63,75);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(5);}
CASE(21){Print{Fm};TR=2 F1      TR=3 Fm TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(53,65,77,56,68,80,48,60,72);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(5,24);}
CASE(22){Print{G+};TR=2 Gx1  TR=3 Gx TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(56,68,80,48,60,72,51,63,75);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(24);}
CASE(23){Print{G+7};TR=2 Gx1 TR=3 Gx7 TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(56,68,80,48,60,72,51,63,75,54,66,78);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(24,15,5);}
CASE(24){Print{G7};TR=2 G1    TR=3 G7 TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(55,67,79,59,71,83,50,62,74,53,65,77);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(5);}
CASE(25){Print{Gaug};TR=2 G1    TR=3 Gaug TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(55,67,79,59,71,83,51,63,75);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(5);}
CASE(26){Print{Gdim};TR=2 G1    TR=3 Gdim TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(55,67,79,58,70,82,49,61,73,52,64,76);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(24);}
CASE(27){Print{Gm};TR=2 G1     TR=3 Gm TR=1 l(CC) FOR(BB=0; BB<CX; BB++){FOR(GG=0; GG<G8;GG++){
        AA = RandomSelect(55,67,79,58,70,82,50,62,74);IF((AA-A9)*(AA-A9)<=Z*Z){EXIT;}}
        IF(Random(100)>W){X=127-(AA-48)*2 v(X) n(AA) A9=AA;}ELSE{^}}NX=RandomSelect(1);}
DEFAULT{r1}}

IF(DD>60 & N==5 & N9==24){DD=DD+1;Print(DD);EXIT;}   //60小節以上でG7→Cとなったら終了
N9=N;}
TR=8 cr8.r4crcrr4cr8. TR=9 [2 r4dr8.]dr8. TR=10 [20 f+r]