axjack's blog

axjack is said to be an abbreviation for An eXistent JApanese Cool Klutz.

純正音程の完全四度堆積

純正音程の完全四度は振動比が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;
    });
});
)

参考

Wikipedia:完全四度