//TrackName ={"フェイズシフト ver.0.81"} 
Copyright ={"庚申works"}
//MetaText  ={"タイミングズレ対策のTimeBaseの考察を載せました。ミニマルミュージックを、さらに最小単位で再現しています。"}



/*
	ライヒのフェイズシフトサウンドをサクラで再現したものです、。
	3分1秒、56小節です。
	"Piano Phase"やDrumming"の原理を真似てみました。

	聞いた感じではTW-music2が良いかも。
	サクラ純正やや可、PCMの波形にあるアタック音がずれでカリカリします。、、

	曲データの後に、TimeBaseの考察を載せました。、
	ポリリズムや変拍子をする際、タイミングが合わない〜〜などの際、有効です。


	//--- MML部の説明

	Time命令を発行して、少しずつ遅くしていきます。

	現実の曲では、各パートのタイミングが少しづつ速くなっているようで、
	生演奏では、タイミングのずれを速くするほうが、
	演奏しやすいためかもしれません。、

	MMLでの再現として、速くすることは可能です、
	ただ相応の労力が必要になります。、

	逆に遅くするのは、簡単なので、
	プラットホームが違えば、その特性に合わせるのが吉と考えました、。


	仕組みです、。

	TT=200; // [0.1m/s 単位] <- 各TRにある、TT=...　この数字分、
	                            発音タイミングが遅くなります。

	TR=1は、20.0m/s
	TR=2は、26.6m/s、
	TR=3は、40.0m/s単位で発音タイミングが遅くなります。


	TR=1 cde cde  cde  cde ...
	TR=2 cde  cde   cde   cde ...
	TR=3 cde   cde    cde    cde ...

	基本原理を図式化するとこんな感じです。、


	※構造化エディタ対応です。
*/


	Int SW= 0	// <--[0]から、[1]へ変更すると[Normal version]になります。

		//[short version]との違い、
		//ベロシティを絞り、テンポを変更、キーを一つ下げました、
		//調律を純正律へ、かつヒューマングループの幅を広げてます。



 
Include(gs.h); 
ResetGS(); r4

// TW-Music2(DirectX[Music]) Effect
// ReverbSetting	Time Dpth High Mix
   CuePoint={"TwmParam	( 26,  34,  30 ,61)"}	//初期値(127,117,0,127)
//			Time     [0-127],
//			Gain     [0-127],
//			HighFreq [0-127],
//			Mix      [0-127]


	Function Trigger(Int TriggerTime){
		Int TriggerStep=TriggerTime*Tempo*TimeBase/60/10000;	//秒 -> ステップ
		Time=Time+TriggerStep;		//遅延加算
	}

	IF(SW==0){
	//Pitch KeyinA 439Hz(-4セント)
	GSScaleTuning(64- 4,64- 4,64- 4,64- 4,64- 4,64- 4,64- 4,64- 4,64- 4,64- 4,64- 4,64- 4) r8;
	//ヒューマングループ付加
	#HGRV={ t.N(Random(2),Random(2),Random(2)) v.N(106+Random(8),106+Random(8),106+Random(8)); q.N(112+Random(4),112+Random(4),112+Random(4));}
	}
	IF(SW==1){
	//純正律(-4セント)
	GSScaleTuning(64+ 0-4,64+12-4,64+ 4-4,64+16-4,64-14-4,64-2-4,64-10-4,64+2-4,64+14-4,64-16-4,64+18-4,64-12-4) r8;

	#HGRV={ t.N(Random(3),Random(3),Random(3)) v.N(96+Random(9),96+Random(9),96+Random(9)); q.N(112+Random(6),112+Random(6),112+Random(6));}
	}

	#TRG_A={Trigger(TT); #HGRV; l24 o5 cfg;}	//Trigger()を呼出し、遅延発音
	#A    ={#HGRV; cfg;}
	#TRG_B={Trigger(TT); #HGRV; l24 o5 dga;}
	#B    ={#HGRV; dga;}
	#TRG_C={Trigger(TT); #HGRV; l24 o5 egb;}
	#C    ={#HGRV; egb;}


	#DATA3={
		#TRG_A; #B #C	//#TRG_は3回跳び
		#A #TRG_B; #C
		#A #B #TRG_C;}


	IF(SW==0){

		#DATA=#DATA3;
		MetaText  ={"                                                  |3分26秒のNormal版も付帯してます。|"}
		TrackName ={"フェイズシフト ver.0.81 [short version] 3分1秒"}
		System.Keyshift=-1	// Keyin Bへ変更
		Tempo=72
	}
	IF(SW==1){

		#DATA=#DATA3;
		MetaText  ={"                                                  |short版とは違い、いくつか変更してます。|"}
	 	TrackName ={"フェイズシフト ver.0.81 [Normal version] 3分26秒"}
		System.Keyshift=-2	// Keyin Aへ変更
		Tempo=63
	}


	#NEIRO= {@13,0 V=100 EP.W(96+Random(4),127,!96) REV=40}
	Int TT=0;


TimeBase=480
Time=TimeBase*4
TrackSync;

TR=1 #NEIRO; P=7
	TT=200;		// [0.1m/s 単位]

	[46 #DATA;]

TR=2 #NEIRO; P=63
	TT=266;		// [0.1m/s 単位]

	[46 #DATA;]

TR=3 #NEIRO; P=120
	TT=400;		// [0.1m/s 単位]

	[46 #DATA;]



 
//	ココからはTimeBaseの考察です。 

/*

	口語調でかつ、不躾な点は容赦願います、。
	取り留めもなく加筆修正を繰り返しているので、いくらか解りづらいです。


	前置き。
	実は、TimeBaseを意識して曲を書く人はあまりいないのではないかと思うのです。
	只の思い込みかもしれません...、
	本当は、とても必要な部分なので、ここに書きとめておきます。



	TimeBaseとは、四分音符を何ステップに分けるかとの指定で、
	TimeBase=96 は、四分音符を96ステップに分けます。

	実は、何も指定しなければ、デフォルトで96の数字が指定されますが、
	これが難儀なケースがあります、

	変拍子やポリリズムを演奏したいとき、小節の帳尻が合わない!
	という問題を抱える点です。
	曲が長くなるとだんだんズレが広がり、タイミングが合わない!!
	などに陥ります。


	はっきり言います。。5拍子[ 5ビート]はまず問題になります。

	ここからは計算が必要なのですが、4/4拍子を 5つに分けるとして、

	まず全音符の総ステップ数を出し、それを 5で割れば、l5 音符5 [五分音符]のステップ数が出ます。
	この計算で余りが出なければ、帳尻は合いますが...

	96×4 / 5 = 76...4	出てしまいました、。

	この4ステップがずれとして蓄積していきます。、


	この対処法はいくつかあります。


	いちばん確実な方法では、Time()で始まりを指定することで解消します。

	Time(1:1:0)	l5 ccccc
			l5 ccccc
	時間(3:1:0)	音符5 ドドドドド　...


	または、l1 Div {ccccc}, 音符1 連符{ドドドドド} で、小節単位で、ズレを解消する方法があります。


	ただ、どちらも小節区切りで、リズムがわずかに等間隔ではなくなるため、
	何となくノりきれない感じがでるので、気になるといえば、気になります。


	最後のひとつは、、システム命令でTimeBaseを指定するケースです。
	簡単です、TimeBase=120を使用するだけです。

	ここで先ほどの計算です。全音符のステップ数を l5 で割るので、

	120×4 / 5 =96...0	割りきれました。。

	これならズレは蓄積しません。

	言いかえると TimeBase=120の場合、l が、480で割れる数字なら、良! ということが解ります。
	例えば、l15 なら、480 / 15 = 32...0 で使用可能となります。

	当然、5拍子と3拍子のポリリズムなら TimeBase=120で可となります。。



	これで五拍子は解決しましたが、、変拍子や複合拍子にはとんでもないのがあって、
	前半1小節 5拍子、後半1小節 7拍子でセット、みたいなヘンタイ的なことをする曲があったりします。
	すみません、、これがまた TimeBaseにとって面妖です、、


	BD ={l5  Rhythm{Jrr jr }};
	BD ={l7  Rhythm{Jrr jr rr}};

	5拍子はともかく、7拍子で TimeBase=120は余りが出ます、、

	120×4 / 7 = 68...4	割れません。、

	TimeBaseを変更すればよい、、間違ってはいないのですが、一つ問題が浮上します。
	別のソフトにミディ出力し、曲を合成する際、通常手段で互換性が取れないのです。

	最近のDAW[CuBe,Logi,Prtlsなどいろいろ、]は一般的に TimeBase=480を使用するとかで、
	出力する前にサクラで TimeBase=480へ変更して対応しても、
	つまり、ここでも計算なのですが、...

	480×4 / 7 = 274...2	問題発生!

	となります。、

	七拍子における、TimeBase=480 2ステップのズレは小さいので、対処さえすれば、
	気にならない範囲かもしれません...


	サクラはイレギュラーな、TimeBase(48,96,192,480,960など以外、)も対応しているみたいなので、
	互換性を考えなければ、5×7 = 35の倍数のTimeBaseを選択すれば何なく出来ます。

	じゃあ、互換性を考えないとして、最初からなんでも割り切れる数字なら、良いではないか。
	という意見もあると思います、
	例えとして、3拍子に4拍子、5拍子に7拍子に対応するTimeBaseの数値は?

	これをまたまた計算すると、

	3×4×5×7 = 420

	つまり、420の倍数であればズレは生じません、、、

	処理が速いパソであれば、何とかなります...
	ちなみにTimeBase=480では、TWで演奏すると、曲によっては処理落ちが出ました...

	数値が高くなると負担がかかるので、このさじ加減は勝敗を分けます、。



	余談です、、
	荒業として、TimeSignature=5,4;、拍子5,4 に変更するケースもあります、でも実は使いずらい、。
	システム命令にもよりますが、何度も呼び出して変更できないのです。途中で拍子を変更すると、
	最後に指定した拍子に、全て合わせてしまうため、ステップ数が意味不明になります。、
	曲が、他の楽器も含め、単一の拍子で最後まで変わらないのであれば、問題はないのですが、
	楽器によって拍子が違う場合は、どっちに合わせるかで混乱します。、


	素直に 4/4拍子のまま、音符長を変えて相対する、このほうが楽な気がします、、。




	長くなりましたので、そろそろまとめです、。
	変拍子やポリリズムを使用する際は、TimeBaseに注意すると良いです。
	また、必要な拍子のみ掛合わせた、倍数使用で、過度な負担を避けるべきではないかと思うのです。


	2000年代の初期はTimeBase=48の曲もあります、。--- サクラのサンプルファイル参照より。、
	ひょっとすると、処理負担を軽くするためかもしれません。



	自分の解る範囲では、こんな感じです。、ちなみに
	MMLで使用する t は、ステップ値を加算減算して発音するので、当然TimeBaseの影響を受けます。

	本当は、TimeBaseと t は非常につながりが深いので、ある程度説明出来たらよいのですが、、
	深さゆえ、まだ解らない点あり今はまだ悩みの渦中にいます。、


		Step数 =　(Tempo*TimeBase) / (1000*60) * 時間[m/s];


	もし感覚に頼らずに、計算づくでタイミング調整をするのであれば、
	この式で、必要になる時間あたりのステップ数が出るはずです、、




	与太です。

	クリムゾンのFrame By Frameは7/8拍子と13/16拍子のポリリズム...だったりします。
	この場合、7*13=91の倍数のTimeBaseとなります、、拍の強弱がややこしくなりそうです、。

	ディジョネットは小節7+6で叩くとか、実はあまりドラムはくわしくないのですが、、
	他パートがエイトビートであれば、8*13=104の倍数のTimeBaseとなります。

	PMGのFirst Circleも割と有名ですが..変拍子です、意外と変拍子はありふれています。
	6拍子と5拍子のセットともとれ、これは TimeBase=120で、可能なはずです。



	与太の与太?!
	クリムゾンのロバート・フリップはWindows Vistaの起動音を担当したらしいとか。、
	ちなみにWindows 95はアンビニエントの旗手ブライアン・イーノでした、。
	今でも あの95の起動音は結構気に入ってたりします。。


	今回もなんとなく長くなりました。最後まで読んでいただき感謝の念が堪えません。
*/
 
