//森と泉さんの「CHORDで作曲2 for PICOSAKURA」にハマりました。
//　https://sakuramml.com/mmlbbs6/post.php?mml_id=2712
//　　　　　　　　　　　　これは「こんな使い方してみたよ」と報告させていただくものです。

//　ピアノパートは　J.S.Bach:"Prelude in C Major"(バッハ:プレリュード　ハ長調)　の「前半部分」です。
//　グノーのアヴェ・マリアのようなメロディがいくつも出来て楽しいです。
//　RandomSeed=2594や601や1003とか1(!)は個人的に気に入ったものですが、いろいろ変えてみてください。
//　なお「G4」「D4」というコードは、「次の小節で一旦メロを終止に持って行きたい」という時に
//  セブンスの代わりに4度=次のコードのルート(Gならド)を入れてみたものです、
//　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　2025.01.18　てれふたる

//コード進行
Array CD=("C","Dm","G7","C","Am","D7","G","Cmaj7","Am","D4","G","Gdim","Dm","Fdim","C","Fmaj7","Dm","G4");

RandomSeed=2594

Print("CD=",CD)

//音符パターン（拍ごとのタイの確率）
Array TT0=(0,33,33,33,33,33,33,33)       //ほぼ8部音符
Array TT1=(0,66,33,66,33,66,33,66)       //ほぼ4部音符
Array TT2=(0,66,66,66,33,66,66,66)       //ほぼ2部音符
Array TT3=(0,66,66,66,66,66,66,66)       //ほぼ全音符

Int CD1=SizeOf(CD)
Array TT  　　//音符パターン
Array ZZB   　//ノート（n表記）
Int RR  　　  //乱数
Int R1  　　  //乱数
Int NN    　　//ZZBのsize
Int ZZ0
Int Z9=67     //旧ノート（n表記）
Int VV        //velocity
Int V9=100    //旧velocity
Str MM=""     //MMはMML、M1は小節毎のMML
Str M1="TrackName={'CHORDで作曲2 PICOSAKURA'}
Copyright={'Moritoizumi'}"
Print(M1);MM=MM+M1;M1=""
M1="Tempo=74 TR=1 CH=1 @(NewAgePad) V(100) v100 l8 q98 TrackKey=6 P.onNoteWave(32,96,!4)"
M2="TR=4 CH=4 @(GrandPiano) V(80) q96 l16 ceg>ce<g>ce <ceg>ce<g>ce <cda>df<a>df <cda>df<a>df <<b>dg>df<g>df <<b>dg>df<g>df <ceg>ce<g>ce <ceg>ce<g>ce"
M3=" <cea>ea<a>ea <cea>ea<a>ea <cdf+a>d<f+a>d <cdf+a>d<f+a>d <<b>dg>dg<g>dg <<b>dg>dg<g>dg <<b>ceg>c<eg>c <<b>ceg>c<eg>c"
M4=" <<a>ceg>c<eg>c <<a>ceg>c<eg>c <<da>df+>c<df+>c <<da>df+>c<df+>c <<gb>dgbdgb <gb>dgbdgb <ga+>eg>c+<eg>c+ <<ga+>eg>c+<eg>c+"
M5=" <<fa>da>d<da>d <<fa>da>d<da>d <<fg+>dfbdfb <fg+>dfbdfb <eg>cg>c<cg>c <<eg>cg>c<cg>c <<efa>cf<a>cf <efa>cf<a>cf <dfa>cf<a>cf <dfa>cf<a>cf <<g>dgb>f<gb>f <<g>dgb>f<gb>f"
 
Print(M1);MM=MM+M1;M1=""

For(Int I=0; I<SizeOf(CD); I++){

IF(CD(I)="A+7"){ZZB=(58,70,82,50,62,74,53,65,77,56,68,80)}//コード内のノートはn表記の
IF(CD(I)="A7"){ZZB=(57,69,81,49,61,73,52,64,76,55,67,79)} //48〜83とし、9音または12音に
IF(CD(I)="Am"){ZZB=(57,69,81,48,60,72,52,64,76)}          //してください。
IF(CD(I)="B"){ZZB=(59,71,83,51,63,75,54,66,78)}           //ここにないコードは作って下さい。
IF(CD(I)="B7"){ZZB=(59,71,83,51,63,75,54,66,78,57,69,81)}
IF(CD(I)="C"){ZZB=(48,60,72,52,64,76,55,67,79)}
IF(CD(I)="C+7"){ZZB=(49,61,73,53,65,77,56,68,80,59,71,83)}
IF(CD(I)="C+dim"){ZZB=(49,61,73,52,64,76,55,67,79,58,70,82)}
IF(CD(I)="C7"){ZZB=(48,60,72,52,64,76,55,67,79,58,70,82)}
IF(CD(I)="Cmaj7"){ZZB=(48,60,72,52,64,76,55,67,79,59,71,83)}
IF(CD(I)="Caug"){ZZB=(48,60,72,52,64,76,56,68,80)}
IF(CD(I)="Cdim"){ZZB=(48,60,72,51,63,75,54,66,78,57,69,81)}
IF(CD(I)="Cm"){ZZB=(48,60,72,51,63,75,55,67,79)}
IF(CD(I)="D+7"){ZZB=(51,63,75,55,67,79,58,70,82,49,61,73)}
IF(CD(I)="D4"){ZZB=(50,62,74,54,66,78,55,67,79,57,69,81)}
IF(CD(I)="D7"){ZZB=(50,62,74,54,66,78,57,69,81,48,60,72)}
IF(CD(I)="Dm"){ZZB=(50,62,74,53,65,77,57,69,81)}
IF(CD(I)="Dm7"){ZZB=(50,62,74,53,65,77,57,69,81,48,60,72)}
IF(CD(I)="E7"){ZZB=(52,64,76,56,68,80,59,71,83,50,62,74)}
IF(CD(I)="Em"){ZZB=(52,64,76,55,67,79,59,71,83)}
IF(CD(I)="F"){ZZB=(53,65,77,57,69,81,48,60,72)}
IF(CD(I)="F7"){ZZB=(53,65,77,57,69,81,48,60,72,51,63,75)}
IF(CD(I)="Fmaj7"){ZZB=(53,65,77,57,69,81,48,60,72,52,64,76)}
IF(CD(I)="Fm"){ZZB=(53,65,77,56,68,80,48,60,72)}
IF(CD(I)="Fdim"){ZZB=(53,65,77,56,68,80,47,59,71,50,62,74)}
IF(CD(I)="G+"){ZZB=(56,68,80,48,60,72,51,63,75)}
IF(CD(I)="G"){ZZB=(55,67,79,59,71,83,50,62,74)}
IF(CD(I)="G+7"){ZZB=(56,68,80,48,60,72,51,63,75,54,66,78)}
IF(CD(I)="G7"){ZZB=(55,67,79,59,71,83,50,62,74,53,65,77)}
IF(CD(I)="Gaug"){ZZB=(55,67,79,59,71,83,51,63,75)}
IF(CD(I)="Gdim"){ZZB=(55,67,79,58,70,82,49,61,73,52,64,76)}
IF(CD(I)="G4"){ZZB=(55,67,79,59,71,83,48,60,72,50,62,74)}
IF(CD(I)="Gm"){ZZB=(55,67,79,58,70,82,50,62,74)}


RR=RandomSelect(0,1,2,3,4,5)//音符パターンを乱数で決める
IF(RR=0){TT=TT0}
IF(RR=1){TT=TT0}
IF(RR=2){TT=TT0}
IF(RR=3){TT=TT1}
IF(RR=4){TT=TT2}
IF(RR=5){TT=TT3}

For(Int J=0; J<8; J++){ 
IF(TT(J)>RandomSelect(0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100)){M1=M1+"^"}//タイ
  ELSE{
  For(Int K=0; K<25; K++){
  NN=SizeOf(ZZB)
  IF(NN=9){R1=RandomSelect(0,1,2,3,4,5,6,7,8)}    //コード内の音9音または、
  ELSE{R1=RandomSelect(0,1,2,3,4,5,6,7,8,9,10,11)}//　12音からランダムに選ぶ
  ZZ0=(ZZB(R1)-Z9)*(ZZB(R1)-Z9)                   //変化が半音6個以内になる音を探す
  IF(ZZ0<37){
   VV=80                                          //ベロシティは低音ほど大にする
   IF(ZZB(R1)<72){VV=100}
   IF(ZZB(R1)<60){VV=120} 
   IF(VV!=V9){M1=M1+" v"+VV+"n"+ZZB(R1);Z9=ZZB(R1);V9=VV;EXIT}
   ELSE{M1=M1+" n"+ZZB(R1);Z9=ZZB(R1);EXIT}}
      }//K bottom
}
}//J bottom
Print(M1);MM=MM+M1;M1=""
}//I bottom
Print(M2);MM=MM+M2;M2=""
Print(M3);MM=MM+M3;M3=""
Print(M4);MM=MM+M4;M4=""
Print(M5);MM=MM+M5;M5=""
Play(MM)
