divrot in an infinitesimal box

Julia, python, algorithmのメモです

Generalized Coltrane Changes

Coltrane changesは、IIm-V7-I もしくはV7-Iなどが+5度上に転調していく進行のことである。これを数学的に表記してみよう。Giant Stepsを例にとると

B D7 G Bb7 Eb ~

という感じではじまるが、これはトニックだけをとりだすと

B G Eb

なので、+5度上に+5度上に動いているだけである。もう一度+5度上にいくと戻って

B G Eb B

になるわけだから三回の操作で元に戻る循環である。これは+5度とかいうと分かりにくいのだけれど、Cから順に、

C=0, Db=1, D=2, Eb=3, E=4, F=5, Gb=6, G=7, Ab=8, A=9, Bb=10, B=11

という風に数字(index)を割り付けると考えやすい。オクターブを無視すると音階は12回でもとにもどるから、12以上のindexや負のindexやindexは12で割った余りと等しいとする(つまり12を法とした整数を考える)。

そうすると+5度上にいくという変換F8は、単にindex iに8を足すだけである

F8(i) = i + 8 (mod 12)

具体的に見てみよう。Bはi=11だから一回目の変換は

F8(11) = 11 + 8 (mod 12) = 7 つまりGになる。もう一度変換すると

F8(7) = 7 + 8 (mod 12) = 3 つまりEbとなっている。さらに変換すると

F8(3) = 3 + 8 (mod 12) = 11 でBに戻っている

上では8を足す変換を考えたが、いま一般にnを足す変換

Fn(i) = i + n (mod 12)

は循環をつくる。例えばF5(i)は普通のいわゆるDominant motion (C-F-Bb-Eb-Ab….)を表現できる。

では、もともとのGiant Steps

B D7 G Bb7 Eb ~

はどのような変換で表記できるだろうか?これにはnを偶数回目と奇数回目の変換で異なる物をとればよい。kを変換の回数として

F(i) = i + n_k (mod 12)

n_k = 5 (kが偶数) 、n_k = 3 (k が奇数)

さらにkが偶数のときはt_1=Major、奇数のときは t_2=7thをとるとする。

具体的に見てみよう。Bはi=11だからk=1回目の変換は

F(11) = 11 + 3 (mod 12) = 2 つまりD7になる。k=2回目の変換は F(2) = 2 + 5 (mod 12) = 7 つまりGになる。k=3回目の変換は F(7) = 7 + 3 (mod 12) = 10 つまりBb7になる。k=3回目の変換は F(10) = 10 + 5 (mod 12) = 3 つまりEbになり、Giant Stepsの最初の部分が再現される。ここで3+5=8となっていることが、先ほどの+5度の進行に対応している。

というわけで、このColtrane Changeの法則を一般化してみよう。いまn_kをM回で元に戻る数列{n_1, n_2, … , n_M}

n_k = n_(k mod M)

だとして、コードの部分をL回で元に戻るハーモニー部分{t_1, t_2,…,t_L}とする(ここにはMajorだとか7thだとかdiminishだとかがはいる)

t_k = t_(k mod L)

一般化コルトレーンチェンジ列はこれら{n_1, n_2, … , n_M}と{t_1, t_2,…,t_L}

を用い ルート音: F(i) = i + n_k (mod 12) とハーモニー t_kで構成される。

一番下に簡単なPythonコードを添付しておく。Giant stepsの場合はn_k={5,3}, t_k={Major, 7th}である。計算結果

GCC: for n_k= [5, 3] t_k= [“, ‘7’] B D7 G Bb7 Eb Gb7 B D7 G Bb7 Eb Gb7 B D7 G Bb7 Eb Gb7 B D7 G Bb7 Eb Gb7 B

ちゃんと再現されてますね。

LはMと等しくなくても良い。一般化コルトレーンチェンジで様々なコード進行が作成できるので試されたし、

GCC: for n_k= [5, 3, 1] and t_k= ['mb5’, '7’, ’m’, '7’, ”] Bmb5 D7 Ebm Ab7 B Cmb5 F7 Abm A7 D Fmb5 Gb7 Bm D7 Eb Abmb5 B7 Cm F7 Ab Amb5 D7 Fm Gb7 B Dmb5 Eb7 Abm B7 C Fmb5 Ab7 Am D7 F Gbmb5 B7 Dm Eb7 Ab Bmb5 C7 Fm Ab7 A Dmb5 F7 Gbm B7 D Ebmb5 Ab7 Bm C7 F Abmb5 A7 Dm F7 Gb Bmb5

レヴィ・ストロース「親族の基本構造」内にあるアンドレ・ヴェイユの補遺を参考にしました。

追加

pyaudioを用いて、一般化コルトレーンチェンジの音が出るようにしました。下にコードあり。Thanks, matu_mitani !

GCC音声ファイル: http://secondearths.sakura.ne.jp/music/gcc/

ただ、正弦波はイマイチなので波形はそのうち変えたい。 matu_mitaniのご助言に従って倍音成分入れました。コードが聞きやすくなった(30 July 2015)。それからedgeをexpでdampしてプチプチいうのを防ぎました。(31 July 2015)

Hajime_dxdydz (July 29, 2015)

環境

python 2.7+numpy+pyaudio

使用法

./gcc.py -key 11 -nk 5 3 -tk Maj 7 -o coltrane.wav

generalized Coltrane Changes

sound_driver for GCC