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:SuperColliderでは、degreesは1からではなく0から始まる。