「諸概念の迷宮(Things got frantic)」用語集

本編で頻繁に使うロジックと関連用語のまとめ。

【離散フーリエ変換】和音を解析する。

f:id:ochimusha01:20190530175206p:plain 

ところで、こんな話があるのです。

とりあえず音の高さを1、周期を1とします。長3度和音ドミソは純正律Just intonation)だときれいな協和音になりますが、この場合の周波数は次のとおりです。

  • 1.0000
  • 5/4=1.2500
  • 3/2=1.5000

一方、平均律のドミソは次のとおりです。

  • 1.0000
  • 2^(4/12)=1.2599
  • 2^(7/12)=1.4983

若干、ずれが生じます。したがって音にも影響します。 ちなみにこれは明るい感じのするメジャー和音ですが、ドレソ#は暗い感じがします。

純正律Just Intonation

  • 1.0000
  • レ 9/8=1.2500
  • ソ# 10/9=1.111111

平均律Equal Temperament

  • 1.0000
  • レ 2^(2/12) =1.122462
  • ソ# 2^(8/12) =1.587401

 統計言語Rによる純正律再生

library(tuneR)
#純正律再生関数
Just_Intonation<-function(note){
f1<-function(x){(440*2^(-3/12))*x} #チューンダウン
notes<-f1(note)
for (i in notes) {
beep<- sine(i);
play(beep)
}
}
#ドレミファソラシド、ドシラソファミレド
c0<-c(1,9/8,5/4,4/3,3/2,5/3,15/8,2)
c1<-c(c0,rev(c0))
Just_Intonation(c1)
#ドミソ、ドミソ
c0<-c(1,5/4,3/2)
c1<-c(c0,c0)
Just_Intonation(c1)
#ドレソ#、ドレソ#
c0<-c(1,9/8,10/9+16/15-1)
c1<-c(c0,c0)
Just_Intonation(c1)
#ドミ♭ソ、ドミ♭ソ
c0<-c(1,5/4+16/15-1,3/2)
c1<-c(c0,c0)
Just_Intonation(c1)

統計言語Rによる平均律再生

library(tuneR)
#平均律再生関数
Equal_Temperament<-function(note){
f1<-function(x){(440*2^(-3/12))*2^x} #チューンダウン
notes<-f1(note)
for (i in notes) {
beep<- sine(i);
play(beep)
}
}

#ドレミファソラシド、ドシラソファミレド
c0<-c(0,2/12,4/12,5/12,7/12,9/12,11/12,1)
c1<-c(c0,rev(c0))
Equal_Temperament(c1)
#ドミソ、ドミソ
c0<-c(1,4/12,7/12)
c1<-c(c0,c0)
Equal_Temperament(c1)
#ドレソ#、ドレソ#
c0<-c(1,2/12,8/12)
c1<-c(c0,c0)
Equal_Temperament(c1)
#ドミ♭ソ、ドミ♭ソ
c0<-c(1,3/12,7/12)
c1<-c(c0,c0)
Equal_Temperament(c1) 

平均律は周波数を12回、同じ倍率で大きくすると2倍になるような各1回を半音としています。具体的な倍率は2の12乗根で、1.059463倍です。(計算機でこの数字を12回掛けてみてください)つまり、各半音の幅がきっちり同じなわけです。

純正律は、ある調専用(例えばハ長調限定)の調律法で、長3度和音(ドミソド)の周波数が
完全に整数倍になるように合わせます。平均律で合わせた場合はこの周波数が合いません。

ギターで弾くとそれほどの違いは感じられませんし、単音で聞いてこの違いがわかる人もほとんどいないと思われますが、正弦波を発振する装置で両方の和音を聞き比べると
はっきり違いがわかります。チューニングの項で書いた「うなり」が、純正律だと全く発生しないわけです。ただし、ハ長調純正律に合わせた楽器で別の調の曲を弾くと、平均律以上に狂いが目立ってきますので、いろいろな曲をひとつの楽器で弾く場合は平均律に合わせるのが常識となっています。

なおギターのチューニングは、各フレットが平均律で作られていて、ハーモニックスチューニングをすると弦間が純正律という中途半端な形になります。

それでは離散フーリエ変換によって解析してみましょう。

統計言語Rによるプログラミング例FFT解析結果表示関数

Spectrum_disp<-function(x){
N<-length(x)
i <- 0:(N-1) 
spec <- fft(x)/N
plot(i, Re(spec), type='h', xaxt='n', yaxt='n', col='blue', lty=3, lwd=2, ylim=c(-0.8,0.8), main='Spectrum by FFT',ylab='Spectrum', xlab='Samples')
par(new=T) #上書き
plot(i, Im(spec), type='h', xaxt='n', yaxt='n', col='red', lty=1, lwd=2, ylim=c(-0.8,0.8), main='',ylab='', xlab='')
axis(1, pos=0, at=0:N, adj=0)
axis(2, at=seq(-1, 1, by=0.25))
legend(0.5, 0.7, legend=c("Real Number","Imaginary Number"), lty=c(3,1), col=c('blue', 'red'), lwd=c(2,2))
}

統計言語Rによるプログラミング例初期値設定

N<-12# データ数 N=12
i<-0:(N-1)# 添字(index)の範囲 i
j<-seq(0,2*pi,length=12)# 周期関数のX

基本波形「ド(Do)」の解析

Do<-sin(j)
plot(i, Do, xlab='Time', xlim=c(0,11),ylim=c(-1,1),main="Sampling of Do",type='o')
f:id:ochimusha01:20190829203136p:plain
Spectrum_disp(Do)
f:id:ochimusha01:20190829203443p:plain

純正律(Just intonation)「ドミソ」の合成

Do_j<-sin(j)
Mi_j<-sin(j*5/4)
plot(i, Mi_j, xlab='Samples', xlim=c(0,11),ylim=c(-1,1),main="Sampling of Mi(Just intonation)",type='o')

f:id:ochimusha01:20190829211200p:plain
Spectrum_disp(Mi_j)

f:id:ochimusha01:20190830032249p:plain


So_j<-sin(j*3/2)
plot(i, So_j, xlab='Samples', xlim=c(0,11),ylim=c(-1,1),main="Sampling of So(Just intonation)",type='o')

f:id:ochimusha01:20190829211839p:plain
Spectrum_disp(So_j)

f:id:ochimusha01:20190830032520p:plain

DoMiSo_j<-Do_j+Mi_j+So_j
plot(i, DoMiSo_j, xlab='Samples', xlim=c(0,11),ylim=c(-3,3),main="Sampling of DoMiSo(Just intonation)",type='o')
f:id:ochimusha01:20190829205003p:plain
Spectrum_disp(DoMiSo_j)
f:id:ochimusha01:20190829205054p:plain

#スペクトラムの3D表示
library(rgl)
Samples_z<-i
Real_x<-Re(fft(DoMiSo_j))
Imagin_y<-Im(fft(DoMiSo_j))
plot3d(Real_x,Imagin_y,Samples_z)  
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/test")
#Movieファイル出力ディレクトリーは環境依存

f:id:ochimusha01:20190830052617g:plain

 

平均律(Equal Temperament)「ドミソ」の合成

Do_e<-sin(j)
Mi_e<-sin(j*2^(4/12))
plot(i, Mi_e, xlab='Samples', xlim=c(0,11),ylim=c(-1,1),main="Sampling of Mi(Equal Temperament)",type='o')

f:id:ochimusha01:20190830030501p:plain

Spectrum_disp(Mi_e)

f:id:ochimusha01:20190830031707p:plain

So_e<-sin(j*2^(7/12))
plot(i, So_e, xlab='Samples', xlim=c(0,11),ylim=c(-1,1),main="Sampling of So(Equal Temperament)",type='o')

f:id:ochimusha01:20190830031127p:plain
Spectrum_disp(So_e)

f:id:ochimusha01:20190830031953p:plain

DoMiSo_e<-Do_e+Mi_e+So_e
plot(i, DoMiSo_e, xlab='Samples', xlim=c(0,11),ylim=c(-3,3),main="Sampling of DoMiSo(Equal Temperament)",type='o')

f:id:ochimusha01:20190830031245p:plain


Spectrum_disp(DoMiSo_e)

f:id:ochimusha01:20190830031427p:plain
#3D表示
library(rgl)
Samples_z<-i
Real_x<-Re(fft(DoMiSo_e))
Imagin_y<-Im(fft(DoMiSo_e))
plot3d(Real_x,Imagin_y,Samples_z)  
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/test")
#Movieファイル出力ディレクトリーは環境依存

f:id:ochimusha01:20190830052355g:plain

 Sin波のみの合成なのに、どうしてスペクトラムに実数が?