フレットレスギター風
このワークシートはMath by Codeの一部です。
アプレット、背景、実装の順に見ていきましょう。
今まで、コードと音階を、そのあとで周波数と音の波を学んだね。
今回は、周波数と音階をつなぐために、音律の歴史を振り返ってみよう。
フレットレスギターもどき
ピタゴラス音律
純正律
平均律
純正律と平均律のズレ
1.背景
音階を具体的にどんな周波数の階段にするかというのが音律というものだ。
その始まりに来るのがピタゴラス教団。
<ピタゴラス律>
ピタゴラス教団は、音楽と数学と鍛錬を日課とする
宗教団体だったという説がある。
音楽も数学も鍛錬も、心身が世界との調和・共鳴を感じることにつながる
それを共通点として見れば、その説もうなづける。
世界は「数の調和」でできていて欲しいものだ。
音楽の領域では、
弦の真ん中で押さえてひくとオクターブ上、
弦の3分の2に短くすると、CがGの音(完全5度上)
になることを見つけていた。
ピタゴラス音律の秘密をさぐろう。
半音あがると音程を1プラスとして、
Cを0スタートとして7つの白鍵を数値化してみよう。
すると、C,D,E,F,G,A,B≡0,2,4,5,7,9,11(mod12)と分類できる。
CがGになると、音程は7-0=7増える。(完全5度上)
このことは、スタートをどこにしても成り立ってほしい。
弦楽器では弦の長さがに短くなると、周波数は逆数倍になる。
ルール1.P0基準から完全5度上のP7は剰余が7増える。
(周波数は=1.5倍する。P0⇒P7とかこう。)
ルール2.剰余を7を増やして12を超えるときは、12-7=5ひく。
(周波数を倍。P0→P-5)を繰り返してみよう。
5→ 0 ⇒ 7→ 2 ⇒ 9 → 4 ⇒ 11
F→ C⇒ G→ D ⇒A→ E ⇒Bから、
C⇒→D⇒→E⇒→⇒→⇒→⇒F→⇒G→⇒A→⇒B
全音上に動くと、2=7-5だから、⇒→のセットで周波数があがるから、 =1.125倍上になる。
まとめると、C=1なら、G=1.5、D==1.125、A= =1.6875、E==1.265625 、
B= =1.8984375
F→Cが 倍して1だから、Fは1÷
しかし、Eから順に上げていく方法でFに行こうとすると大変なことになる。
半音上のEからFに上げるには1+12=13半音上げると考えることもできる。
⇒→⇒→⇒→⇒つまり、7-5+7-5+7-5+7=13あがることで、13-12=1あげられる。
しかし、これでは、周波数が2倍近く上がってしまうから、周波数を半分にしよう。
つまり、Fの音は でもあるから多義的になってしまう。
あまり美しい感じはしないですね。
ピタゴラス律の功績は、何と言っても完全5度(美しさと単純さ)の発見です。
以上から、
C:D :E :F :G :A :B :C
=1:1.125:1.265625:1.33333....:1.5:1.6875:1.8984375:2
<純正律>
CDEFGABCの音程差を12半音階でみると、
全全半全全全半だね。
Cから「数える」とC自身は1個目だから1度。
Cから3番目のEが3度(音程は全全)。
Cから5番目のGが完全5度(音程は全全半全)
C,E,GはコードCメジャーの構成音になっている。
周波数比を基準:長3度:完全5度=4:5:6とするのが「純正律」
完全5度上が=1.5倍の周波数になるというのはピタゴラス音階と同じですが、
長3度(全全)はちがう。
ピタゴラス音階で全音がだったので全全は 倍になり、64: 81=4 : 81/16= 4 : 5.0625
純正律では4:5になる。長3度は微妙にちがうね。
この連比を他の音名にもあてはめてみよう。
C=1として、周波数が何倍かをまとめてみよう。
Cを基準とするとき、4の2倍が8だから、C,E,G,Cの周波数比=4:5:6:8=1: 1.25 : 1.5 : 2
Fを基準とするとき、6の半分が3だから、C,F,A,Cの周波数比=3:4:5:6=1:1.33333... : 1.666666...: 2
Gを基準にするとき、G,B,Dの周波数比=4:5:6=1.5: 1.5÷4×5:1.5×1.5=1.5: 7.5/4: 4.5/2= 1.5: 1.875: 2.25
だから、G=1.5にすると、D:G:Bの周波数比=2.25/2: 1.5: 1.875=1.125 : 1.5 : 1.875
以上から、
C:D :E :F :G :A :B:C
=1:1.125:1.25:1.33333....:1.5:1.6666....:1.875:2
<平均律>
平均律はとっても数学的な定義だ。
y=sin(220 *2 π x)(A3音)に対して
周波数(1秒間の山の数)が2倍のy=sin(440 *2 π x)が1オクターブ上のA4音でした。
半音あがると周波数がr倍になるとしたら、
12半音あがり周波数がrの12乗倍になると1オクターブ上、つまり、2倍になるはず。
=2とすると、r===1.0594630943592953
から、
初項がA3=220で等比がrの等比数列。これで、「平均律」の出来上がりだね。
12個の音名をnotename=[C,C#,D,D#,E, F,F#,G,G#,A,A#,B]を単位円の頂点に配置してみよう。
平均律では、円周(または、中心角)を12等分する。
音名が1つ進むと、周波数を角度に換算すると360度÷12=30度増えるということになるね。
複素数e^i2πk/12で音名を表すと、
num=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,......]を12で割った剰余が、notenameが1対1に対応するね。
中央C3の周波数は130.813 Hz(1秒間の振動数)と言われている。
円を1周すると、周波数は2倍になる。
num=0に対して、freq0=130.813とすると、複素数e^0で、名前はnotename[0]="C"。
num=1に対して、freq1=freq0*rとなり、複素数e^1で、名前はnotename[1]="C#"。
num=kに対して、freqk=freq0*r^kで、複素数e^i2πk/12、名前はnotename[k]。
num=12には、freq12=freq0*r^12=freq0*2で、複素数e^0,名前はnotename[0]="C"。
つまり、基本周波数をC3のfreq0にすると、半音をk回上ると、周波数は(rのk乗)倍になる。
複素数の番号がk増え、単位円上の角度はReal軸にあるC3から30k(度)左に進むということだ。
とても美しい。
C,E,Gの3和音、コードCでの周波数はC3が基準周波数の倍率で1表示すると、
・平均律では
Eの音程は全全上で、周波数はr^4=1.259921倍 ( R軸から30×4=120度左にある)
Gの音程は全全半全上で、r^7=1.4983(R軸から30×7=210度左にある)
他の音律ではどうだろうか。
・ピタゴラス律では
CからEに. =1.265625倍の周波数で、平均律の1.259921より高め、
(r^x=1.059463^x=1.265625の解はx=log(1.265625)/log(1.059463)=4.0782だから、
R軸から30×4.0782=122.346度左にある。)
CからGには計算しなくても1.5倍だから、平均律の1.4983より高めだ。
(r^x=1.5の解はx=log(1.5)/log(1.059463)=7.02だから、R軸から30×7.02=210.6度左)
・純正律では
Eが1.25でどれよりも低めで、
Gは1.5でピタゴラスと同じく高めの方。
(r^x=1.25の解はx=log(1.25)/log(1.059463)=3.86314から、R軸から30×3.86314=115.8942度左)
かなり低い音だ。
平均律で楽器が調整されているとしたら、移調しても周波数の構造が一様性が成り立っているので、
響きは変わらないというメリットがあります。そして、通常は平均律で調律します。
ハード的には、フレットのあるギターは平均律で音がでるようにできてます。
しかし、響きの点からしたら、平均律はピタゴラスや純正律より比が複雑だから、うなりの原因になるということです。ピタゴラス律からしたら、暗い感じになってます。純正律のEが一番比が単純ですから、
響きもきれいでしょう。
フレットレスのベースとか、音律機能のついたDAWアプリなら、
純正律の美しい響きが体験できるかもしれません。
2.実装
質問:3つの音律をgeogebraで実装するにはどうしたらよいでしょうか。
・ピタゴラス音律
「A4の周波数=440」を使って作ることができます。
半音階という意味でクロマチックの周波数の13個の数列をC0~C12とします。
そのうち、Cメジャースケールのchroma ={C0,C2,C4,C5,C7,C9,C11,C12} を作ることをゴールにしましょう。
A4はこの数列ではC9ですから、
C9=440とします。
Cの番号が+7でp=3/2倍、Cの番号が-5でq=3/2*1/2倍。
5→ 0 ⇒ 7→ 2 ⇒ 9 → 4 ⇒ 11
F→ C⇒ G→ D ⇒A→ E ⇒B
9-5=4, 4+7=11だから、C4=C9×q, C11=C4×p
同様にして、5-5=0, 0+7=7,7-5=2, 2+7=9だから、C9から C2,C7,C0,C5が逆算できる。
C0=260.740740740740になる。
以下のコードをボタンの「クリックして」にスクリプト記述にgegebraスクリプトとして
貼り付ければよいね。
//=============================
p = 3/2
q= 3/2 * 1/2
C9 = 440
C4= C9 * q
C11 = C4 *p
C2= C9 / p
C7 =C2 / q
C0 =C7 / p
C5 =C0 / q
C12=C0 * 2
chroma ={C0,C2,C4,C5,C7,C9,C11,C12}
//=============================
C,D,E,F,G,A,B,Cのボタンに、
たとえば、最初のCなら次のスクリプトを「クリックして」に貼り付ければよいね。
PlaySound(sin(chroma(1) 2Pi x), 0, 1)
音律の実装
・純正律
C4=260.740740740740になる。
これをA0として、A0に対する比率をかけていけばいいね。
C:D :E :F :G :A :B
=1:1.125=9/8:1.25:1.33333....=4/3:1.5 :1.6666...=5/3:1.875=15/8から、
//=========================
A0 = 260.740740740740
A02= A0 * 10/9
A04 =A0 * 1.25
A05= A0 * 4/3
A07= A0 * 1.5
A09 = A0 * 5/3
A11 = A0 * 15/8
A12 = A0 * 2
chroma ={A0,A02,A04,A05,A07,A09,A11,A12}
//=============================
・平均律
スタートをA3の周波数=220とすると、シンプルになるね。
//===========================================
r=1.0594630943592953
A0=220
A01=A0 * r
A02= A01 * r
A03 =A02 * r
A04 =A03 * r
A05= A04 * r
A06 =A05 * r
A07= A06 * r
A08= A07 * r
A09 = A08 * r
A10 = A09 * r
A11 = A10 * r
A12 = A11 * r
chroma ={A0,A01, A02,A03, A04,A05,A06,A07,A08,A09,A10,A11,A12}
//===========================================
質問:音律のちがいをGeogebraで視覚化するにはどうしたらよいでしょうか。
たとえば、先に平均律を単位円周上の12点で表しましょう。
その同じ円周上に、純正律を表す点を打ちたいですね。
まず、平均律の12点は複素平面でe^(i 2 pi n/12) (n=0...11)と定義できるね。
Real軸にあるn=0のときの点(音名C)からk個すすむ点の音は(r^k)倍の周波数になる。
番号を表すはずの変数kを連続数として意味づけしましょう。
そうして作ったのが、冒頭の上から5番目のアプレットです。
だから、周波数の倍がyとなるkはy=r^kの解だから、k=logry=log(y)/log(r)で求められるはずだね。
rp={1,1.125,1.25,1.33333,1.5,1.6666, 1.875}として、
r=2^(1/12)とするとき、
j=Zip(log(p)/log(r), p, rp)
とすることで、
倍率数列rpから、円周を12とするときの進む大きさ数列jがでる。
これをkの置き換えるだけで、純正律の点が作れるね。
Zip(e^(i 2 pi n/12, n, j)が純正律の点だ。
本当に、オイラーとガウスは偉大だ。感謝します。
質問:鍵盤ではなく、弦楽器イメージで音律を体験できるアプリはどうやったら作れますか。
6本の開放弦のギターをイメージします。
それをスライダーで表しましょう。
左端が0、右端が10です。それを画面に合わせます。
合わせ方は、スライダーの設定の幅の数値を変えることで微調整しましょう。
上からn本目のスライダーの値をstnとします。
an=1-stn/10は、第n弦の右端からの位置の割合(周期)を表しますね。
bn=1/anは、第n弦の開放弦に対する周波数の倍率を表します。
fnが第n弦の開放弦の周波数としたら、
第n弦のスライダーの更新情報(onUpdate)のスクリプト記述をgeogebraで、
sin( 2pai fn bn x, 0, 1)とすれば、音がでるはずです。
ギターのフレットは5フレット目と12フレット目と17フレット目が大切です。
これらは平均律で、r12=2の解r= 1.059463を利用すると、
bai=[r**k for k in range(18)]
これが周波数の倍率だ。
fle=[10*(1-1/x) for x in bai]
これが、右端からmフレット目のx座標になるね。
小数第2位を四捨五入すると、
flet=[int(x*10+0.5)/10 for x in fle]=
[0.0,
0.6, 1.1, 1.6, 2.1, 2.5,
2.9, 3.3, 3.7, 4.1, 4.4, 4.7, 5.0,
5.3, 5.5, 5.8, 6.0, 6.3]
これをフレットを押さえる目安にできるように画面にテキストとしてはりつけておこう。
次はいよいよ発音のしくみ。
1弦:329.63 Hz (E)
2弦:246.94 Hz (B)
3弦:196.00 Hz (G)
4弦:146.83 Hz (D)
5弦:110.00 Hz (A)
6弦:82.41 Hz (E)
という計算結果を流用します。
だから、
fn={329.63, 246.94, 196.00, 146.83 ,110.00, 82.41 }
数式に入れましょう。たとえば、3弦の更新情報はsin( 2pai fn(3) b3 x, 0, 1)とします。
チャレンジテーマをテキストで表示しておこう。
1.1オクターブ上の音を出そう。
2.完全4度上(5フレット)の音を出そう。
2.完全5度上(7フレット)の音を出そう。
解答がわかるように、フレットの表示/非表示の切り替えができるようにセグメントを準備しよう。
l1=zip((k,0),k,flet)
l2=zip((k,4),k,flet)
l3=zip(segment(a,b),a,l1,b,l2)がフレットになります。