円周率は3




説明

ゆとり教育ではありません
たぶん2万桁くらいまで正しい
円周率を奏でます

左クリック:速度増
右クリック:速度減


アルゴリズム

+ 円周率
円周率
マチンの公式
π = 16arctan(1/5) - 4arctan(1/239)

arctanの求め方
arctan(1/x) = 1/x - 1/3x^3 + 1/5x^5 - 1/7x^7 ...

桁の大きい数の足し算
4桁ごとに区切る
// a = a + b
#deffunc mdl_add array a, array b
repeat ArraySize
	c = a(cnt) + b(cnt)
	a(cnt) = c \ 10000
	if(c >= 10000){		// 桁上がりするとき
		i = cnt
		repeat		// 1加えると桁上がりするとき
			i--
			if(a(i) != 9999)	:	break
			a(i) = 0
		loop
		a(i)++
	}
loop
return

大きい桁の引き算
// a = a - b		(a>b)
#deffunc mdl_sub array a, array b
repeat ArraySize
	a(cnt) -= b(cnt)
	// 繰り下がり
	if(a(cnt) < 0){		
		a(cnt) += 10000
		i = cnt
		// 上の桁が1以上になるまでループ
		repeat
			i--
			if(a(i))	:	break
			a(i) = 9999
		loop
		a(i)--
	}
loop
return

大きい桁の割り算
// a = a/b			(b>0)
#deffunc mdl_div array a, int b
res = 0
repeat ArraySize
	c = a(cnt) + res*10000
	a(cnt) = c/b	// 商
	res = c\b	// あまり
loop
return

ArraySize=5001とした。
うち1つは整数部分用。
小数部分は5000*4=20000桁程度を計算。
それ以上の桁はそれまでの結果を利用した擬似乱数。(ver0.91)
円周率って乱数だよね。
+ 演奏
演奏
当然、円周率を計算して得た結果を利用している。
基本は2桁ごと。

  • ver0.9
奇数桁を使って一つ前の音からの上下、偶数桁を使って変化量を決める。
8音に一回、伴奏をつける。根音は一番最後に使用した音から2オクターブほど下げた音。
長調時:根音,根音+4,根音+7
短調時:根音,根音+3,根音+7
500桁ごとに曲調を変える。このパラメータは現在処理中の桁の数百桁前の桁を使用する。
長調/短調
音の上下の確率
音の上下の大きさ

  • ver0.91
奇数桁で上下方向、偶数桁で半音上げるかどうかなどを決める。
使用するパラメータは、これまで計算してきた円周率の結果を利用した擬似乱数で決める
パラメータ
長調/短調
調(ハニホヘトイロなど)
拍子
サビ/メロ
主旋律の音の範囲
音の上昇/下降量
同じ音の続く確率
音の質(スタッカート、通常、長音ペダル)
サビ/メロの切り替えも円周率の擬似乱数で。
サビ->メロになったときにパラメータを全て変更する。
メロ->サビになったときはパラメータの一部を変更する。

今後の予定

もっと曲調の変化がわかりやすいようにしたい。
主旋律のバリエーションを増やすとか?
副旋律追加とか?
和音の種類を増やすとか?
最終更新:2010年10月07日 21:26