円周率は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桁ごと。
奇数桁を使って一つ前の音からの上下、偶数桁を使って変化量を決める。
8音に一回、伴奏をつける。根音は一番最後に使用した音から2オクターブほど下げた音。
長調時:根音,根音+4,根音+7
短調時:根音,根音+3,根音+7
500桁ごとに曲調を変える。このパラメータは現在処理中の桁の数百桁前の桁を使用する。
長調/短調
音の上下の確率
音の上下の大きさ
奇数桁で上下方向、偶数桁で半音上げるかどうかなどを決める。
使用するパラメータは、これまで計算してきた円周率の結果を利用した擬似乱数で決める
パラメータ
長調/短調
調(ハニホヘトイロなど)
拍子
サビ/メロ
主旋律の音の範囲
音の上昇/下降量
同じ音の続く確率
音の質(スタッカート、通常、長音ペダル)
サビ/メロの切り替えも円周率の擬似乱数で。
サビ->メロになったときにパラメータを全て変更する。
メロ->サビになったときはパラメータの一部を変更する。
|
今後の予定
もっと曲調の変化がわかりやすいようにしたい。
主旋律のバリエーションを増やすとか?
副旋律追加とか?
和音の種類を増やすとか?
最終更新:2010年10月07日 21:26