	TrackName ={"スケールパーコレータ - ver.1.12"}; 
	Copyright ={"庚申works"};


/*	3つのスケール(音階)の雰囲気を表現します。

	最初は、ジプシー(ロマ)音階です。
	Harmonic Minor Perfect 5th Belowの第7音を半音上げたものです。

	間には、スパニッシュ 8スケール、フラメンコでいうミの旋法です。
	フリジアン+M3度 を加えたもの、ないしは、
	Harmonic Minor Perfect 5th Below+m3度 を加えたものです。

	最後に、ビバップスケールです。
	IIm7-> V7 [SD-> D] で適用される事があるスケールです。
	通常、表拍に構成コードのアクセントが入るため、少し違和感が
	あります。



	スケール抽出の基本構造です、。


	CH1-9まではピアノで、
	設定された音高と長さをランダムに選び出します。

	1小節目は 1つ、2小節目は 2つと増やして、
	16小節目より反転減算、最後に1つだけ音を鳴らして終わります。

	1から8CHまでを各小節頭でCHを切り換えて使用します。
	その際、ペダル信号y64,1でホールド、のちy64,0で解除します。


	Piano CH1 y64,1|. y64,0 |
	      CH2      |   y64,1|. .y64,0 |
	      CH3      |        |    y64,1|. ..

	      CH9 .    |        |         |
	E.P   CH11     |      ..|..       |


	図式化するとこんな風です。



	CH9では、ボトムノート専用として、
	各スケールの始めと終りに一回だけ鳴らします。

	CH11は、エレピになっており、
	同じ要領で読込み、スケール単位の1/4ごと 主に8分音符を発声します。


	本来なら主音、導音は、音量や長さに差をつけることで明確にすべきですが、
	選択肢の出現確率を増やすことでアクセント代わりにしています。



	与太話

	ペダルの使い方が、なんとなく解ってきました。

	スケールの駆け上がり、下がりを入れるとそれらしくなるかもしれません。
	人のメロディメイクのすごさが解ります。、

*/
	//	※※ このスクリプトは構造化エディタ対応です。//
 
	//初期化 

	Include(stdmsg.h);			//ミディ音源リセット
		//System.MeasureShift(1);
		Time( 0: 1: 0);
		ResetXG();ResetGS();ResetGM();	//音源リセット命令


	Int Note_no=0;
	Array Elm_chd=();	Array Elm_len=();	Str Chd_str = {};
	Int TB_in = 0;

	Int TR_loop=24;		// 1スケール分小節数 [8]倍数のみ
	Int TR_no = 0;		Int TR_no_b=0;	Int TR_no_p=0;

	Int TB = 0;		Int TB_b = 0;	Int TB_z = 0;

	Int Loop=0;
	Int Rdm_out =0;		Int Rdm_out_b =0;	Int Rdm_out_p =0;

	Str Len_out= {};	Str Len_out_b ={};


	Str Out_put={};		Str Out_put_b= {};	Str Out_put_p={};


	Tempo=112;	TimeBase=120;
 
	FOR(Int Scale_sw=0; Scale_sw < 3; Scale_sw++){	//スケール選択 

		SWITCH(Scale_sw){
		CASE(0){
		Note_no=59;
		Elm_chd = (	-12, 0, 12, 1, 4, 5, -5, 7, 8, 11 );
		Elm_len = (	4, 8, 16, 32);
		Chd_str ={ "Gypsy Scale"};
		}
		CASE(1){
		Note_no=64;
		Elm_chd = (	-12, 0, 12, -11, 1, 3, -8, 4, -7, 5, 7, 8, 10 );
		Elm_len = (	3, 6, 8, 16, 24);
		Chd_str ={ "Spanish 8 note Scale"};
		}
		CASE(2){
		Note_no=57;
		Elm_chd = (	-12, 0, 12, -10, 2, 4, -7, 5, -5, 7, 19, 8, 9, 21, 11, 23 );
		Elm_len = (	2, 6, 4, 12, 8, 24);
		Chd_str ={ "Bebop Scale"};
		}
		} //

		Lyric= Chd_str;



	 
		TB_b = TimeBase*4*Scale_sw*TR_loop + TimeBase*4*Scale_sw*2 + TimeBase*4*Scale_sw; 
		TB_z = TimeBase*4*(Scale_sw+1)*TR_loop + TimeBase*4*(Scale_sw+1)*2 + TimeBase*4*(Scale_sw) - TimeBase*4;

		TB_in= TB_b + TimeBase*4;
 
		TR_no_b= 9;			//ルート出力 

		Out_put_b= Out_put_b+{
			TR=}+TR_no_b+{
			CH=}+TR_no_b+{@1
			Time=}+TB_b+{
			v116};

		Len_out_b ={1+1};
		Rdm_out_b =Note_no-24;

		Out_put_b= Out_put_b+{
			l}+Len_out_b+{		//長さ
			n(}+Rdm_out_b+{)};	//ノートナンバー

		Out_put_b= Out_put_b+{
			Time=}+TB_z+{
			n(}+Rdm_out_b+{)};

 
		FOR(Int I=0; I < TR_loop; I++){		//タイム、トラック出力 

			TB = TimeBase*4*I+TB_in;


	 
			TR_no= I%8+1; 

			Out_put= Out_put+{
				TR=}+TR_no+{
				CH=}+TR_no+{@1
				Time=}+TB+{
				y64,1};

			IF(TR_loop/2<= I){Loop= TR_loop-I;}	//音数加減算
			ELSE{ Loop=I+1;}

			FOR(Int J=0; J< Loop; J++){	//音符出力

				IF(J==0){	Out_put= Out_put+{v121};}
				ELSE{		Out_put= Out_put+{v104};}

				IF(I==0 | I==TR_loop-1){
					Len_out= RandomSelect(Elm_len);
					Rdm_out =Note_no-12;
				}
				ELSE{
					Len_out= RandomSelect(Elm_len);
					Rdm_out =Note_no + RandomSelect(Elm_chd);
				}

				//IF(Scale_sw==0){ Out_put= Out_put+{l36r};}	//休符差込み
				//IF(Scale_sw==1){ Out_put= Out_put+{l48r};}

				Out_put= Out_put+{
					l}+Len_out+{	//長さ
					n(}+Rdm_out+{)};//ノートナンバー
			}


 
			IF(I==0){	// ビープ発音 

				TR_no_p=11;
				Out_put_p= Out_put_p+{
					TR=}+TR_no_p+{
					CH=}+TR_no_p+{@5
					Time=}+(TB+TimeBase*2)+{
					};
				Out_put_p =Out_put_p+{V.T(90,0,!1+1)l8};
				FOR(Int K=0; K< 16; K++){
					Out_put_p =Out_put_p+{n(}+(Note_no+12)+{)};
				}
				Out_put_p =Out_put_p+{V=0}

			}

			IF(I==TR_loop/4 | I==TR_loop*3/4){
				TR_no_p=11;
				Out_put_p= Out_put_p+{
					TR=}+TR_no_p+{
					CH=}+TR_no_p+{@5
					Time=}+(TB+TimeBase*2)+{
					};
				Out_put_p =Out_put_p+{V=90; l8};

				FOR(Int L=0; L< 4; L++){
					Rdm_out_p =Note_no + RandomSelect(Elm_chd);
					Out_put_p =Out_put_p+{n(}+(Rdm_out_p+12)+{)};
				}
			}


			IF(I==TR_loop/2){
				TR_no_p=11;
				Out_put_p= Out_put_p+{
					TR=}+TR_no_p+{
					CH=}+TR_no_p+{@5
					Time=}+(TB+TimeBase*2)+{
					};
				Out_put_p =Out_put_p+{l2};
				Out_put_p =Out_put_p+{n(}+(Rdm_out_p+12)+{)r n(}+(Rdm_out_p+12)+{)r };
			}

			IF(I==TR_loop-1){
				TR_no_p=11;
				Out_put_p= Out_put_p+{
					TR=}+TR_no_p+{
					CH=}+TR_no_p+{@5
					Time=}+(TB+TimeBase*2)+{
					};
				Out_put_p =Out_put_p+{l8};

				IF(Scale_sw==2){
					Out_put_p =Out_put_p+{l16n(}+(Rdm_out_p+24)+{)l8n(}+(Note_no+12)+{)n(}+(Note_no+12)+{)};
				}
				ELSE{
					Out_put_p =Out_put_p+{n(}+(Rdm_out_p+12)+{)n(}+(Rdm_out_p+12)+{)l16n(}+(Note_no+24)+{)};
				}
			}
  
		Out_put= Out_put+{y64,0}; 
		}
  
	//Print(Out_put_p); 
	//Print(Out_put_b);
	//Print(Out_put);
	Out_put_p;
	Out_put_b;
	Out_put;		//最終出力
	}
 
