MetaText  ={"                                                  '51秒'"} 
TrackName ={"音響合成生命体"}
Copyright ={"庚申works"}



 
//	#SW="R" 

//	上記の#SW="R"のコメント // を外すことにより、
//	開始時の値を変更できます。


//	通常は固定値の配列から始まりますが、試しにもし、
//	ランダム出力された配列から始めたいときに使用して下さい。
//
//	時々、固定物体や振動子でとどまるケースもありますが、
//	ライフゲームのアルゴリズムを使用しているため、
//	数世代で消滅するケースが多いです。

//	一応ループ回数制限を入れてまして、60世代までです。



//	※構造化エディタ対応です。
//	TW,sakura,GM,GS,XG可


 	
/*	ライフゲームのアルゴリズムで曲にしてみました。 

	いまは修正されてなくなってしまいましたが、
	イグナー・アナ様によるらくがき1 のコメントを見て、当初試しで
	ランダムを利用して曲をつくっていたのですがあまりうまくいかず、
	くじら飛行机様の最近の本にちょこっと記載されていたキーワード、
	ライフゲームという言葉を思い出し、このアルゴリズムを使ってみよう
	と思い立ったのが始まりでした。

	ライフゲームは、wikiなどを参考して頂ければ分かりやすいと思います。
	自分もこのwikiを元にサクラ上でプログラムを組んでます、

	もっとも当プログラムは見れば分かりますが、結構ずるしているので、
	手本としてはお勧めできない部類です、

	実は事前に、ライフゲームのプログラムをジャバスクリプトで組まれている
	サイト様のソースをみたところ、まず 2次元配列の使用、数値処理が多いのには、
	正直恐れ戦いていました、でも正当な方法はこちらが正しいと思います。


	今回のケースでは、自分のするべき方向性が明確なのであと考えるべきは、
	このアルゴリズムをいかに可視性が良いまま、音楽的にするかでした。
	そのため色々考えた挙句、まずライフゲームの格子数は 7*7に設定しています。
	音楽的に 7という数字があつかいやすいためです。


	続いて音楽的表現法の簡単な説明です。
	ただし特に音色の選択も含め、この表現法以外もいろいろ考えられると思います。

	まず使用する音の並びを考えました。
	ラングメソッドにおいてマイナーコードの親和性は下方倍音列で説明できる、
	ことは分かっていたので、これをヒントに使用スケールを逆配列へ変更しました。
	結果論ですが、順配列ではなんとなく聞いたことがあるカラーになってしまうので、
	まあこれはこれでよかったのかな、と思ってます。

	このスケールを再生時に見栄も良くなるため、オクターブおきに配置しています。
	音色はBowedPad - @93のみで 7トラック全てで使用しています。


*/


 
 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  ={ @93 l2 o5 v101 v.Random=66 q88 q.Random=44 } 
#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) 


 
 Array NoteR=({"""b},{""a},{"g},{f#},{`e},{``d-},{```c}) // cd-efgab 

// Array NoteR=({"""b-},{""a-},{"g},{f},{`e-},{``d},{```c}) // マイナー cde-fga-b-
// Array NoteR=({"""b-},{""a-},{"g},{f},{`e-},{``d},{```c}) // ナポリタンマイナー cd-e-fga-b


 
Array LL; 

 If(#SW=="R"){
	For(Int i=0; i< 7*7; i++){ //
	 LL=(LL,Random(2))
	} //
 }
 Else{
	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)
 }


 
Include(gs.h); 
 ResetGM()r4
 SysEx$ = F0,41,10,42,12,{40,00,00,00,03,0D,09},F7;r48	//MASTER TUNE 439Hz auto chksum

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) // 演奏部
]



 
/*	りれき 

	'13 8 23	program開始

			スクリプトのゲラ
			Array LL=(	1,1,0,0,
					1,1,0,0,
					0,0,1,1,
					0,0,1,1)

			//LL(0) i%4==0 & i< 4
			 If( LL(i+1  )==1){ j++ }
			 If( LL(i+4  )==1){ j++ }
			 If( LL(i+4+1)==1){ j++ }

	    8 24	コメント書き込み
	    8 26	パン出力修正
	    8 29	アップ

	'14 7 19	コメント修正
*/
 
