純正音程の完全四度は振動比が3:4である。たとえば、MIDIノートの60(振動数およそ261[Hz]、中央ド)の純正音程版の完全四度は、261×(4/3) = 348
となる。なので、完全四度をずっと堆積することは基準の振動数(周波数)に4/3を乗算し続ければ良い。良いのではあるが、4/3 > 1
なので3回ぐらい掛け算すると積が2を超えてしまう。2を超えるとオクターブ上がってしまう。
//(4/3)の0乗,1乗,...,12乗を小数点2桁まで求める ( (4/3)**(0..12) ).round(0.01); -> [ 1, 1.33, 1.78, 2.37, 3.16, 4.21, 5.62, 7.49, 9.99, 13.32, 17.76, 23.68, 31.57 ]
ということで、2を超えたら2で割ってオクターブ下げる処理を施しながら完全四度堆積をしてみることにする。
( ~r = r({ var f=1; f.yield; loop({ f = f * (4/3); if(f > 2,{ f = f/2 },{ f }); f.yield; }); }); ) ~r.reset; ~r.nextN(12).round(0.01); -> [ 1, 1.33, 1.78, 1.19, 1.58, 1.05, 1.4, 1.87, 1.25, 1.66, 1.11, 1.48 ]
中央ドから完全四度堆積するコード
( SynthDef(\h,{ |amp=0.1,freq=440| var sig,e,eg; e = Env.perc; eg = EnvGen.kr(e,doneAction:2); sig = SinOsc.ar(freq); sig = sig * eg; Out.ar(0,Pan2.ar(sig,0,amp)); }).add; ) ( ~r = r({ var f = 1,c = 60.midicps; Synth(\h,[\freq,c*f]); 1.wait; inf.do({ f = f * (4/3); if( f > 2, {f = f/2}); (c*f).postln; Synth(\h,[\freq,c*f]); 1.wait; }); }); )