System.Include(stdmsg.h)
System.MeasureShift(1);
ResetGM();
TrackSync;
TrackName={"メロディ風鈴"}
Copyright={"森と泉"}
MetaText={"乱数を使って毎回違ったメロディを奏でます。下側タブにコードと総小節数が出ます。"}
System.TimeBase=48
Int A;Int A9;         //音番号、旧の音番号（o5cはn60です）
Int N;Int N9; Int NX; //コード、旧のコード、次コード、0 A7,1 Am,2 B7,3 C,4 C7,5 D7,6 Dm,7 E7,8 Em,9 F,10 Fm,11 G7
Int B;                //1小節内何番目の音
Int C;                //音長
Int D;                //何小節目
Int G;
Int G1=8;             //前後の音の高さの差をチェックする回数。
Int Z=6;              //前後の音の高さの差を半音何個以内に制限。チェック回数を超えてしまったらそのまま鳴らす。
Int W;                //タイ率
Int X;                //ベロシティ
Tempo=120

TR=1 CH=1 音色(NylonGuitar) q400 V(100) r1 l8 v100 //唐突な^は休符とみなされ、うまく演奏されないのでゲートで対応(q400)
TrackKey=0 
TR=2 CH=2 音色(AcousticBass) q100 V(100) o3 r1 l4 v100
TrackKey=0 
TR=8 CH=10 l16 V(70) P(27) o3  l8 [4 n31 r] l16  
TR=9 CH=10 l16 V(70) P(27) o3 r1
TR=10 CH=10 l32 V(70) P(27) o3 r1
TR=1
N9=1;A9=60;
FOR(D=0; D<100; D++){                //100小節以内演奏する
IF(D==0){N=3;}ELSE{N=NX;}            //1小節目はC、2小節以降は次コード(NX)から始める
C=RandomSelect(2,3,4,4,6,8,8,8,12,16)//出したい音符をいくつでも指定。多く出したい音符はダブらせて。
//2,4,8,16は分かると思いますが、3,6,12は3連2分、3連4分、3連8分音符です。
l(C)
X=127-3*C                            //ベロシティ(2分音符はv127・・・16分音符はv79)
v(X)
W=C*3;                               //タイ率(2分音符は6%・・・16分音符は48%)
TR=8 cr8.r4crcrr4 TR=9 [r4dr8.] TR=10 [16 f+r]
SWITCH(N){ 
CASE(0){Print{A7};TR=2 a4.a4.a4
        TR=1 l(C) FOR(B=0; B<C; B++){FOR(G=0; G<G1;G++){
	  A = RandomSelect(55,57,61,64,67,69,73,76);IF((A-A9)*(A-A9)<=Z*Z){EXIT;}}
	  IF(Random(100)>W){n(A) A9=A;}ELSE{^}}NX=6;}
CASE(1){Print{Am};TR=2 a4.a4.a4
        TR=1 l(C) FOR(B=0; B<C; B++){FOR(G=0; G<G1;G++;){
	  A = RandomSelect(57,60,64,69,72,76);IF((A-A9)*(A-A9)<=Z*Z){EXIT;}}
	  IF(Random(100)>W){n(A) A9=A;}ELSE{^}}NX=RandomSelect(0,3,6,8);}
CASE(2){Print{B7};TR=2 b4.b4.b4
        TR=1 l(C) FOR(B=0; B<C; B++){FOR(G=0; G<G1;G++;){
	  A = RandomSelect(57,59,63,66,69,71,75);IF((A-A9)*(A-A9)<=Z*Z){EXIT;}}
	  IF(Random(100)>W){n(A) A9=A;}ELSE{^}}NX=7;}
CASE(3){Print{C};TR=2 c4.c4.c4
        TR=1 l(C) FOR(B=0; B<C; B++){FOR(G=0; G<G1;G++;){
	  A = RandomSelect(55,60,64,67,72,76);IF((A-A9)*(A-A9)<=Z*Z){EXIT;}}
	  IF(Random(100)>W){n(A) A9=A;}ELSE{^}}NX=RandomSelect(1,3,4,5,7,8,9,9);}
CASE(4){Print{C7};TR=2 c4.c4.c4
        TR=1 l(C) FOR(B=0; B<C; B++){FOR(G=0; G<G1;G++;){
	  A = RandomSelect(55,58,60,64,67,70,72,76);IF((A-A9)*(A-A9)<=Z*Z){EXIT;}}
	  IF(Random(100)>W){n(A) A9=A;}ELSE{^}}NX=9;}
CASE(5){Print{D7};TR=2 d4.d4.d4
        TR=1 l(C) FOR(B=0; B<C; B++){FOR(G=0; G<G1;G++;){
	  A = RandomSelect(57,60,62,66,69,72,74);IF((A-A9)*(A-A9)<=Z*Z){EXIT;}}
	  IF(Random(100)>W){n(A) A9=A;}ELSE{^}}NX=11;}
CASE(6){Print{Dm};TR=2 d4.d4.d4
        TR=1 l(C) FOR(B=0; B<C; B++){FOR(G=0; G<G1;G++;){
	  A = RandomSelect(57,62,65,69,74,77);IF((A-A9)*(A-A9)<=Z*Z){EXIT;}}
	  IF(Random(100)>W){n(A) A9=A;}ELSE{^}}NX=RandomSelect(1,2,7,8,9,11);}
CASE(7){Print{E7};TR=2 e4.e4.e4
        TR=1 l(C) FOR(B=0; B<C; B++){FOR(G=0; G<G1;G++;){
	  A = RandomSelect(56,59,62,64,68,71,74,76);IF((A-A9)*(A-A9)<=Z*Z){EXIT;}}
	  IF(Random(100)>W){n(A) A9=A;}ELSE{^}}NX=RandomSelect(1,3,11);}
CASE(8){Print{Em};TR=2 e4.e4.e4
        TR=1 l(C) FOR(B=0; B<C; B++){FOR(G=0; G<G1;G++;){
	  A = RandomSelect(55,59,64,67,71,76);IF((A-A9)*(A-A9)<=Z*Z){EXIT;}}
	  IF(Random(100)>W){n(A) A9=A;}ELSE{^}}NX=RandomSelect(1,3,6,9);}
CASE(9){Print{F};TR=2 f4.f4.f4
        TR=1 l(C) FOR(B=0; B<C; B++){FOR(G=0; G<G1;G++;){
	  A = RandomSelect(57,60,65,69,72,77);IF((A-A9)*(A-A9)<=Z*Z){EXIT;}}
	  IF(Random(100)>W){n(A) A9=A;}ELSE{^}}NX=RandomSelect(3,3,5,6,9,10,11,11);}
CASE(10){Print{Fm};TR=2 f4.f4.f4
        TR=1 l(C) FOR(B=0; B<C; B++){FOR(G=0; G<G1;G++;){
	  A = RandomSelect(56,60,65,68,72,77);IF((A-A9)*(A-A9)<=Z*Z){EXIT;}}
	  IF(Random(100)>W){n(A) A9=A;}ELSE{^}}NX=RandomSelect(3,6,9,11);}
CASE(11){Print{G7};TR=2 g4.g4.g4
        TR=1 l(C) FOR(B=0; B<C; B++){FOR(G=0; G<G1;G++;){
	  A = RandomSelect(55,59,62,65,67,71,74,77);IF((A-A9)*(A-A9)<=Z*Z){EXIT;}}
	  IF(Random(100)>W){n(A) A9=A;}ELSE{^}}NX=RandomSelect(3,3,7,9,11);}
DEFAULT{r}}

IF(D>60 & N==3 & N9==11){D=D+1;Print(D);EXIT;}   //60小節以上でG7→Cとなったら終了
N9=N;}
TR=8 cr8.r4crcrr4 TR=9 [r4dr8.] TR=10 [16 f+r]
