axjack's blog

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

ハノン練習曲 第1番

Scaleを使ってハノン練習曲 第1番(=ドミファソラソファミ〜♪)をプログラミングしてみる。

分析

degrees(度数)*1[0,2,3,4,5,4,3,2]に固定してプログラミングしたい。ということでどのスケールを使うか検討する。

まず「ドミファソラソファミ」はメジャースケールに見える。そこで「レファソラシラソファ」以降も全てメジャースケールである、と早合点してはならぬ。例えば「ドミファソラソファミ」をハ長調と見なしてニ長調に移調すると、「レファソラシラソファ」ではなく「レファ#ソラシラソファ#」となる。これだとずいぶんと明るめなハノンになってしまう。

では、全てがピアノの白鍵になるような都合の良いスケールと言えば・・・教会旋法(チャーチモード)である。なので、「ドミファソラソファミ」がionian、「レファソラシラソファ」がdorian、と教科書通りチャーチモードを並べていけばdegreesを[0,2,3,4,5,4,3,2]に固定してハノンを奏でることができる。

以上を表にまとめるとこのようになる。

実音 Scale root(MIDI note) degrees
ドミファソラソファミ ionian 60 [0,2,3,4,5,4,3,2]
レファソラシラソファ dorian 62 [0,2,3,4,5,4,3,2]
ミソラシドシラソ phrygian 64 [0,2,3,4,5,4,3,2]
ファラシドレドシラ lydian 65 [0,2,3,4,5,4,3,2]
ソシドレミレドシ mixolydian 67 [0,2,3,4,5,4,3,2]
ラドレミファミレド aeolian 69 [0,2,3,4,5,4,3,2]
シレミファソファミレ locrian 71 [0,2,3,4,5,4,3,2]

この表に基づいてプログラミングしてみる。

コード

//Instrument
(
SynthDef(\h,{
    |amp=0.3,gate=1,out=0,freq=440|
    var sig,e,eg;

    sig = SinOsc.ar(freq);
    e = Env.adsr;
    eg = EnvGen.ar(e,gate,doneAction:2);
    sig = sig * eg;
    Out.ar(out,Pan2.ar(sig,0,amp));
}).add;
);


//Score
(
~r = r({
    var root  = [60,62,64,65,67,69,71];//C D E F G A H
    var hanon_up   = [0,2,3,4,5,4,3,2];//Hanon No.1 going up
    var hanon_down = [5,3,2,1,0,1,2,3];//Hanon No.1 going down
    var mode  = #[
        ionian,dorian,phrygian,
        lydian,mixolydian,
        aeolian,locrian
    ];

    var x;


    /* Hanon Up */
    mode.do({|i,ix|
        hanon_up.do({|j|
            x = Synth(\h,
                [\freq,Scale.at(i).degreeToFreq(j,root[ix].midicps,0)]
            );
            (1/4).wait;
            x.release(0.1);
        });
    });


    /* Hanon Down */
    mode = mode.reverse ++ #[locrian];
    root = root.reverse ++ [59];
    mode.do({|i,ix|
        hanon_down.do({|j|
            x = Synth(\h,
                [\freq,Scale.at(i).degreeToFreq(j,root[ix].midicps,0)]
            );
            (1/4).wait;
            x.release(0.1);
        });
    });


    /* Ending */
    x = Synth(\h,[\freq,60.midicps]);
    2.wait;
    x.release(0.1);

});
);


//Exec
~r.play;
~r.reset;

解説

  • Scale.major == Scale.at(\major);//true

  • #[ionian,dorian,/*略*/ locrian]と書くと、配列の中身はリテラルとなる。リテラルになると何が利点になるのか、はよく分からないが「In literal Arrays names are interpreted as symbols.」*2とのことなので、配列の中身はシンボル扱いされるらしい。シンボルとキーの違いは・・・。(おそらく言葉の使い方としては、シンボルをキーとして扱う、と呼称すると思われる。それ以上の意味は分からない。。)

  • mode.reverse ++ #[locrian];はmodeを逆順にした上でlocrianを最後に追加している。この前学習した通り++と書くと配列は直和される。なお、これを+と書くと#[locrian]は無視される。

参考

ハノン練習曲 第1番

教会旋法

*1:SuperColliderでは、degreesは1からではなく0から始まる。

*2:http://doc.sccode.org/Reference/Literals.html