MetaText  ={"                                                  '修正版'"} 
TrackName ={"音響合成生命体 ver2.0"}
Copyright ={"庚申works"}



 
//	　取扱説明書
//
//	下記を#SW="L"のように変更すると、開始値を固定値に変更できます。

	#SW="R"  // [  R, B1, B2, S, L ] 



//	"R"はランダムに最初の配列を設定します。
// 	ライフゲームにおいては、こちらのほうが正しいと思います。
//
//	このため Playを押す度に、長さは毎回変わります。
//	時々、固定物体や振動子でとどまるケースがあります、
//	全体的に数世代で消滅するケースが多いです。
//	一応、60世代制限があります。

//	なお、WAV版は"L"で出力したものとなっています。


//	※構造化エディタ対応です。
//	TW,sakura,GM,GS可
//
//	TWのほうが見た目は綺麗です。


 
/* 
	　簡単な詳細

	ライフゲームのアルゴリズムを使った曲です。
	エンジンは、前に作ったものをそのまま使用しています。

	　変更点です。

	配列の初期値と音色の変更、
	単音選択からいくらかの複音選択に構成を変更しています。
	マスターチューンを432kHzへ変更しました。

	前回の曲
	http://oto.chu.jp/mmlbbs6/post.php?mml_id=1324

	ライフゲームについて
	http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0

	使用しているスケールは、cd-e f#gab となります。
	前より幾分音楽的には、なったような気がしてます。

*/



 
/*	　りれき 

	'14 11 2	修正開始
	'14 11 4	可読性の修正、簡易マスタリング、コメント修正
*/



 
 Function Count(Int i, Array LL){ //for:i, hold data 

  Int Swt=0 Int Swf=0
  If(i  <  7){ Swt=1 } //top
  If(7*6<= i){ Swt=2 } //bottom
  If(i%7==0 ){ Swf=1 } //front
  If(i%7==6 ){ Swf=2 } //rear

  Int j=0
  Switch(Swt){ //top
   Case(1){
    If( LL(i+7)==1){ j++ }

    If(Swf!=1){
     If( LL(i-1  )==1){ j++ }
     If( LL(i-1+7)==1){ j++ }
    }
    If(Swf!=2){
     If( LL(i+1  )==1){ j++ }
     If( LL(i+1+7)==1){ j++ }
    }
   }
   Case(0){
    If( LL(i-7)==1){ j++ }
    If( LL(i+7)==1){ j++ }

    If(Swf!=1){
     If( LL(i-1  )==1){ j++ }
     If( LL(i-1-7)==1){ j++ }
     If( LL(i-1+7)==1){ j++ }
    }
    If(Swf!=2){
     If( LL(i+1  )==1){ j++ }
     If( LL(i+1-7)==1){ j++ }
     If( LL(i+1+7)==1){ j++ }
    }
   }
   Case(2){ //bottom
    If( LL(i-7)==1){ j++ }

    If(Swf!=1){
     If( LL(i-1  )==1){ j++ }
     If( LL(i-1-7)==1){ j++ }
    }
    If(Swf!=2){
     If( LL(i+1  )==1){ j++ }
     If( LL(i+1-7)==1){ j++ }
    }
   }
  } //sw

  Result=j; //[j:0-8]
//Print(j)

 } //func


 	
 Function Output(Int i, Int j){ //i:LL(num) [j:0-8] 

 Switch(j){
  Case(0){ i=0 }	//過疎
  Case(1){ i=0 }	//過疎
  Case(2){ }		//存続
  Case(3){ i=1 }	//生誕
  Case(4){ i=0 }	//過密
  Case(5){ i=0 }	//過密
  Case(6){ i=0 }	//過密
  Case(7){ i=0 }	//過密
  Case(8){ i=0 }	//過密
 } //sw

 Result=i //[i:0,1]
//Print(i)

 } //func


 
 Function Life(Array LL){ 

  Array RR=() // LLは読み終わりまで維持
  For(Int i=0; i< SizeOf(LL); i++){

   RR(i)= Output( LL(i), Count(i, LL) )
 } //

 Result=RR;

 } //func


 
#TRp  ={ EP=124 @102 o5 v101 q66 v.Random=66 q88 q.Random=44 } // GS 
#TR1  ={ TR=1 #TRp }
#TR2  ={ TR=2 #TRp }
#TR3  ={ TR=3 #TRp }
#TR4  ={ TR=4 #TRp }

#TR5  ={ TR=5 #TRp }
#TR6  ={ TR=6 #TRp }
#TR7  ={ TR=7 #TRp }


 Array TrR=(	#TR1, #TR2, #TR3, #TR4,
             	#TR5, #TR6, #TR7)


 
 Array Pv=(30,41,52,63,74,85,96) // Pan 


 
#NS={ l12 r`g^r rrr"f rrc^24r24 } 
Array NoteR=({Key=-25 #NS},{Key=-15 #NS},{Key=-5 #NS},{Key=6 #NS},{Key=16 #NS},{Key=25 #NS},{Key=36 #NS}) // cd-ef#gab

 
Array LL; 

 Switch(#SW){
  Case("R"){ Lyric={" ランダム "}

   For(Int i=0; i< 7*7; i++){ //
    LL=(LL,Random(2))
   } //
  }
  Case("L"){ Lyric={" 長生き 1m17s "}
   LL=( 0,1,0,0, 1,0,0,
        0,0,0,0, 0,1,0,
        0,1,0,0, 0,1,0,
        0,0,1,1, 1,1,0,

        0,0,0,1, 1,1,0,
        0,0,0,1, 0,0,0,
        0,0,0,1, 0,0,0)
  }
  Case("B2"){ Lyric={" ブリンカー2 "}
   LL=( 0,1,0,0, 1,0,0,
        0,0,0,0, 0,1,0,
        0,1,0,0, 0,1,0,
        0,0,1,1, 1,1,0,

        0,0,0,1, 1,0,0,
        0,0,0,1, 0,0,0,
        0,0,0,1, 0,0,0)
  }
  Case("B1"){ Lyric={" ブリンカー1 "}
   LL=( 0,1,0,0, 1,0,0,
        0,0,0,0, 0,1,0,
	0,1,0,0, 0,1,0,
        0,0,1,1, 1,1,0,

        0,0,0,0, 1,0,0,
        0,0,0,1, 0,0,0,
        0,0,0,1, 0,0,0)
  }

  Case("S"){ Lyric={" スタンダード 51s "}
   LL=( 0,1,0,0, 1,0,0,
        0,0,0,0, 0,1,0,
        0,1,0,0, 0,1,0,
        0,0,1,1, 1,1,0,

        0,0,0,0, 1,0,0,
        0,0,0,0, 1,0,0,
        0,0,0,1, 0,0,0)
  }
 } //sw

 
Include(gs.h); 
 ResetGM()r4
 SysEx$ = F0,41,10,42,12,{40,00,00,00,02,0C,02},F7;r48 //MASTER TUNE 432Hz auto chksum Vn

TimeBase=120; Tempo=96

Int Tc=(!2) Str Piyo=""
Int Panchk=0; Int Panout; Int j=0

[60 // 回数制限

 For(Int i=0; i< SizeOf(LL); i++){

  If(LL(i)==1){

   Piyo= Piyo +TrR(i/7)
   Piyo= Piyo +"Time=" +Tc +"[" +(i/7) +" r16]"

   j++
   Panchk= Panchk +Pv(i%7); Panout= Panchk /j
// Print({} +Panchk +{:} +j )

   Piyo= Piyo +"P=" +Panout

   Piyo= Piyo+ NoteR(i%7) +"
  ";
  }

  If(i%7==6){ Panchk=0 j=0 }
 } //

// Print(Piyo)
 Piyo Piyo={} Tc=Tc +(!2) LL=Life(LL) // 演奏部

]

 
