【数理考古学】「音階論」なる古くて新しい数理空間

以下の投稿は「<font color=purple>それ自体は直接観測不可能な人間の知覚をブラックボックスに見立て、外部からの物理的刺激への反応に関心を集中させた</font>」**精神物理学**(<font color=blue>独Psychophysik/英psychophysics</font>)の話でした。
[【数理考古学】ヴェーバー‐フェヒナーの法則](https://qiita.com/ochimusha01/items/4eaf1972ff487b9bc713)

しかしこの世にはもっと厳格な形で**人間の感性**と**対数法則**が結びついているジャンルもあったりするのです。
[楽論とは - コトバンク](https://kotobank.jp/word/%E6%A5%BD%E8%AB%96-1288620)

>**【中国音楽】より**…しかし墨子は《<font color=purple>非楽</font>》を著し，為政者が楽舞を行うのに，民を搾取して過剰な経費をかけるとの理由から，音楽活動には否定的態度をとった。これに対して，荀子は〈<font color=purple>楽論</font>〉(<font color=blue>前3世紀</font>)で反駁（<font color=blue>はんばく</font>）し，音楽は人間の自然の欲求だから，むしろこれを正しい方向に導くことが，為政者の役割だと主張した。孔子が周朝初期の為政者によって制定された音楽を理想とし，彼の時代(<font color=blue>前6～前5世紀</font>)の娯楽性に富んだものを排斥した言を荀子は受けて，古学あるいは先王の楽と雅楽の概念を鮮明にし，目前の民間音楽(<font color=blue>俗楽</font>)と対峙させた。…

#音階論の世界

[音階について](http://www.takuichi.net/hobby/edu/sonic_wave/musical_scale/doc_html/musical_scale.htm)

>音楽で使う音の高さを世界共通で扱うために決めた特定の周波数を標準高度と呼ぶ。古くからいろいろな標準高度が使われてきたけど、<font color=green>19世紀末</font>からは**パリ会議**(<font color=blue>1859年</font>)と**ウィーン会議**(<font color=blue>1885年</font>)によって、オクターブ４の**ラ**(<font color=blue>A</font>)の音を<font color=green>435Hz</font>とする標準高度が代表的に使われるようになった。しかし、現在では**シュトゥットガルト会議**(<font color=blue>1834年</font>)で決められた**オクターブ**４</font>の**ラ**(<font color=blue>A</font>)の音を<font color=green>440Hz</font>とする標準高度が**演奏会高度**や**MIDI**などコンピュータを使った**DTM**</font>(<font color=blue>Desktop Music</font>) の基準として広く使われている。
>
>この基準周波数を少し高くして<font color=green>441Hz</font>にすると音が全体的に少し高くなる分、音楽が明るくなったような印象を受けるので、演奏家などの注文によって<font color=green>440Hz</font>でなく、<font color=green>441Hz</font>や<font color=green>442Hz</font>、あるいは<font color=green>439Hz</font>で調律して欲しいという要望に応じて調整することもある。
>
>この様に**オクターブ**とはある音からその２倍の高さの音に聞こえる音の範囲を表しているが、**オクターブ**ずつ離れた音だけでは音の数が少なすぎて音楽を作るのに不十分である。そこで、**１オクターブ**内にいくつかの音を作り出し、それらの音に**名前**（<font color=blue>音名</font>）を与える。音楽で普通使われる音名は<font color=purple>ドレミファソラシド</font>である。<font color=purple>ドレミファソラシド</font>はピアノの白鍵の音で、**幹音**と言われる。国によって違った言い方もあるが、**１オクターブ**内でこれらの音を使うのは西洋音楽をはじめとして世界の主流になっている。音を絶対的に指定する場合には「<font color=purple>オクターブ４のラのシャープ</font>(<font color=blue>A#4</font>)」というように指定する。

**音再生ルーチン**(<font color=blue>Win/Mac共用</font>)

```R
library(tuneR)
#音再生ルーチン(Win/Mac振り分け)
#ちなみにWindowsの場合は、Sys.info()["sysname"] == "windows"
ex_play<-function(song){
if(Sys.info()["sysname"] == "Darwin"){
filename <- tempfile("tuneRtemp", fileext = ".wav")
writeWave(song, filename)
system(paste("open -a iTunes", filename))
return(invisible())
}else{
play(song)
return(invisible())
}}
#サンプル再生例
beep<- sine(440)
ex_play(beep)
```
**Macで"/wav"ファイルを鳴らすもっとスマートな方法**

```R
library(tuneR)
#Rであらかじめ以下を入力
setWavPlayer("/usr/bin/afplay")
#サンプル再生例
beep<- sine(440)
ex_play(beep)
```
[音名](http://hp.vector.co.jp/authors/VA028660/mt/ch01.htm)
[色々な国の「ドレミ」の言い方](http://hp.vector.co.jp/authors/VA028660/mt/ch01.htm)

><font color=purple>Do,Re, Mi,Fa,Sol, La</font>は、なんとなく**ドイツ語**かな、と思っていましたが実は**ラテン語**です。**聖ヨハネ賛歌**という**ラテン語**の曲があり、この曲では各小節の頭の音が、<font color=purple>C, D, E, F, G, A</font>になっています。該当する音の**ラテン語**の歌詞は、「<font color=green>Ut</font>」「<font color=green>Resonare</font>」「<font color=green>Mira</font>」「<font color=green>Famuli</font>」「<font color=green>Solve</font>」「<font color=green>Labii</font>」となっていますので、そこから音をとり、「<font color=green>Ut</font>」「<font color=green>Re</font>」「<font color=green>Mi</font>」「<font color=green>Fa</font>」「<font color=green>So</font>」「<font color=green>La</font>」となり、「<font color=green>Ut</font>」は言いにくいので「<font color=green>Do</font>」となったということです。
>
>第７節の２つの単語の頭をとると、「<font color=green>ＳＪ</font>」ですが、<font color=purple>Ｊ</font>はＩ</font>の異体字であり、「<font color=green>Ｊｏｈａｎｎｅｓ</font>」はフランス語で「<font color=green>Ｉａｎ</font>」なので、「<font color=green>Ｓｉ</font>」になりました。こうして、イタリア語の音名「<font color=purple>ドレミファソラシド</font>」ができあがったのです。

<iframe width="480" height="270" src="https://www.youtube.com/embed/jWsEY68EwHI" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<!-- html table generated in R 3.5.2 by xtable 1.8-4 package -->
<!-- Fri Feb 19 14:35:44 2021 -->
<table border=1>
<tr> <th>  </th> <th> American_and_British </th> <th> German </th> <th> Italian </th> <th> French </th> <th> Japanese </th>  </tr>
  <tr> <td align="right"> 1 </td> <td> C </td> <td> C </td> <td> Do </td> <td> Do(Ut) </td> <td> ｲ(I) </td> </tr>
  <tr> <td align="right"> 2 </td> <td> C#=D♭ </td> <td> Cis=Des </td> <td> Do#=Re♭ </td> <td> Do(Ut)dièse=Re bémol </td> <td> 嬰ｲ(I)=変ﾛ(Ro) </td> </tr>
  <tr> <td align="right"> 3 </td> <td> D </td> <td> D </td> <td> Re </td> <td> Re </td> <td> ﾛ(Ro) </td> </tr>
  <tr> <td align="right"> 4 </td> <td> D#=E♭ </td> <td> Dis=Ees </td> <td> Re#=Mi♭ </td> <td> Re dièse=Mi bémol </td> <td> 嬰ﾛ(Ro)=変ﾊ(Ha) </td> </tr>
  <tr> <td align="right"> 5 </td> <td> E </td> <td> E </td> <td> Mi </td> <td> Mi </td> <td> ﾊ(Ha) </td> </tr>
  <tr> <td align="right"> 6 </td> <td> E#=F </td> <td> Eis=Fes </td> <td> Mi#=Fa♭ </td> <td> Mi dièse=Fa bémol </td> <td> 嬰ﾊ(Ha)=変ﾆ(Ni) </td> </tr>
  <tr> <td align="right"> 7 </td> <td> F </td> <td> F </td> <td> Fa </td> <td> Fa </td> <td> ﾆ(Ni) </td> </tr>
  <tr> <td align="right"> 8 </td> <td> G </td> <td> G </td> <td> So </td> <td> So </td> <td> ﾎ(Ho) </td> </tr>
  <tr> <td align="right"> 9 </td> <td> G#=A♭ </td> <td> Gis=Aes </td> <td> So#=Ra♭ </td> <td> So dièse=Ra bémol </td> <td> 嬰ﾎ(Ho)=変ﾍ(He) </td> </tr>
  <tr> <td align="right"> 10 </td> <td> A </td> <td> A </td> <td> Ra </td> <td> Ra </td> <td> ﾍ(He) </td> </tr>
  <tr> <td align="right"> 11 </td> <td> A#=B♭ </td> <td> Ais=Hes </td> <td> Ra#=Si♭ </td> <td> Ra dièse=Si bémol </td> <td> 嬰ﾍ(He)=変ﾄ(To) </td> </tr>
  <tr> <td align="right"> 12 </td> <td> B </td> <td> H </td> <td> Si </td> <td> Si </td> <td> ﾄ(To) </td> </tr>
   </table>

```R
#世界各国の音階表示
american_and_british<-c("C","C#=D♭","D","D#=E♭","E","E#=F","F","G","G#=A♭","A","A#=B♭","B")
german<-c("C","Cis=Des","D","Dis=Ees","E","Eis=Fes","F","G","Gis=Aes","A","Ais=Hes","H")
italian<-c("Do","Do#=Re♭","Re","Re#=Mi♭","Mi","Mi#=Fa♭","Fa","So","So#=Ra♭","Ra","Ra#=Si♭","Si")
french<-c("Do(Ut)","Do(Ut)dièse=Re bémol","Re","Re dièse=Mi bémol","Mi","Mi dièse=Fa bémol","Fa","So","So dièse=Ra bémol","Ra","Ra dièse=Si bémol","Si")
japanese<-c("ｲ(I)","嬰ｲ(I)=変ﾛ(Ro)","ﾛ(Ro)","嬰ﾛ(Ro)=変ﾊ(Ha)","ﾊ(Ha)","嬰ﾊ(Ha)=変ﾆ(Ni)","ﾆ(Ni)","ﾎ(Ho)","嬰ﾎ(Ho)=変ﾍ(He)","ﾍ(He)","嬰ﾍ(He)=変ﾄ(To)","ﾄ(To)")
Music_scales<-data.frame(American_and_British=american_and_british, German=german,Italian=italian,French=french,Japanese=japanese)
library(xtable)
print(xtable(Music_scales), type = "html")
```
**オクターブの上限と下限**

>普通音楽で使われる**オクターブ**は<font color=purple>０</font>から<font color=purple>８</font>ぐらいまでである。**８８鍵ピアノ**は<font color=green>27.5Hz～4096Hz</font>まで出せ、**オクターブ**<font color=purple>０から７の途中</font>までとなる。
>
>**オクターブ**<font color=purple>０</font>の**ラ**(<font color=blue>A</font>)の音の周波数は<font color=green>27.5Hz</font>であり、どうせそれより低いオクターブ-1</font>を作っても人間にはほとんど聞こえない。
**オクターブ**<font color=purple>８</font>以上の音は実際には聞くことができるが音楽ではあまり使われない。**オクターブ**<font color=purple>10</font>の**ラ**(<font color=blue>A</font>)の音の周波数は<font color=green>28160Hz</font>であり、人間には聞こえないと言ってよい。
 また、**MIDI**では鍵盤の数が<font color=purple>0</font>から<font color=purple>127</font>であり、**ノートナンバー**（<font color=blue>鍵盤番号</font>）<font color=purple>127</font>の周波数は<font color=green>42192.3Hz</font>であり、人間には全然聞こえないと言ってよいから、これ以上の番号を用意する必要がない。ちなみに、このように**ノートナンバー**で音を指定する場合、ギターなどの弦楽器で滑らかに音の高さを変化させる演奏（<font color=blue>ポルタメント奏法と言う</font>）は再現できないのではないかと思うかもしれないが、そんな心配は御無用で、**ポルタメント奏法**を指定する命令もあるからMIDIはいろいろな楽器に対応できる。

![Rplot30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/9f03a302-b427-a5ed-58b1-aea0c383f1de.png)

```R
1<-function(x){440*2^x}
plot(f1,xlim=c(-4,4),ylim=c(0,4000),type="l",col=rgb(0,0,0), main="Music Scale",xlab="Octave",ylab="Hz")

#第一区間(2^-4(27.5Hz)~2^-3(55.0Hz))
tc <- round(seq(-4,-3,length=10)) #0から1までを10等分
tcvals <- f1(tc) #それぞれの縦軸の値
polygon(c(-4,tc,-3), #x
c(0,tcvals,0), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(1,0,0)) 　#塗りつぶす色

#第2区間(2^-3(55.0Hz)~2^-2(110Hz))
tc <- seq(-3, -2, length=10) #1から2までを10等分
tcvals <- f1(tc) #それぞれの縦軸の値
polygon(c(-3,tc,-2), #x
c(0,tcvals,0), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(1,0,1)) 　#塗りつぶす色

#第3区間(2^-2(110Hz)~2^-1(220Hz))
tc <- seq(-2, -1, length=10) #3から8までを10等分
tcvals <- f1(tc) #それぞれの縦軸の値
polygon(c(-2,tc,-1), #x
c(0,tcvals,0), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(0,0,1)) 　#塗りつぶす色

#第4区間(2^-1(220Hz)~2^0（440Hz）)
tc <- seq(-1, 0, length=10) #8から16までを10等分
tcvals <- f1(tc) #それぞれの縦軸の値
polygon(c(-1,tc,0), #x
c(0,tcvals,0), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(0,1,0)) 　#塗りつぶす色

#第5区間(2^0(440Hz)〜2^1(880Hz))
tc <- seq(0, 1, length=10) #16から32までを10等分
tcvals <- f1(tc) #それぞれの縦軸の値
polygon(c(0,tc,1), #x
c(0,tcvals,0), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(0,1,1)) 　#塗りつぶす色

#第6区間(2^2(1760Hz)~2^3(1760Hz))
tc <- seq(1, 2, length=10) #32から64までを10等分
tcvals <- f1(tc) #それぞれの縦軸の値
polygon(c(1,tc,2), #x
c(0,tcvals,0), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(1,1,0)) 　#塗りつぶす色

#第8区間(2^3(3520Hz)~2^4(4186Hz))
tc <- seq(3, 4, length=10) #32から64までを10等分
tcvals <- f1(tc) #それぞれの縦軸の値
polygon(c(3,tc,4), #x
c(0,tcvals,0), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(0,0,0)) 　#塗りつぶす色
```

<!-- html table generated in R 3.5.2 by xtable 1.8-4 package -->
<!-- Fri Feb 19 14:51:16 2021 -->
<table border=1>
<tr> <th>  </th> <th> Music_Scale </th> <th> Frequency </th> <th> Approximation </th>  </tr>
  <tr> <td align="right"> 1 </td> <td> C </td> <td> 2^0 </td> <td> 1.000000 </td> </tr>
  <tr> <td align="right"> 2 </td> <td> C#=D♭ </td> <td> 2^(1/12) </td> <td> 1.059463 </td> </tr>
  <tr> <td align="right"> 3 </td> <td> D </td> <td> 2^(2/12) </td> <td> 1.122462 </td> </tr>
  <tr> <td align="right"> 4 </td> <td> D#=E♭ </td> <td> 2^(3/12) </td> <td> 1.189207 </td> </tr>
  <tr> <td align="right"> 5 </td> <td> E </td> <td> 2^(4/12) </td> <td> 1.259921 </td> </tr>
  <tr> <td align="right"> 6 </td> <td> F </td> <td> 2^(5/12) </td> <td> 1.33484 </td> </tr>
  <tr> <td align="right"> 7 </td> <td> F#=G♭ </td> <td> 2^(6/12) </td> <td> 1.414214 </td> </tr>
  <tr> <td align="right"> 8 </td> <td> G </td> <td> 2^(7/12) </td> <td> 1.498307 </td> </tr>
  <tr> <td align="right"> 9 </td> <td> G#=A♭ </td> <td> 2^(8/12) </td> <td> 1.587401 </td> </tr>
  <tr> <td align="right"> 10 </td> <td> A </td> <td> 2^(9/12) </td> <td> 1.681793 </td> </tr>
  <tr> <td align="right"> 11 </td> <td> A#=B♭ </td> <td> 2^(10/12) </td> <td> 1.781797 </td> </tr>
  <tr> <td align="right"> 12 </td> <td> B </td> <td> 2^(11/12) </td> <td> 1.887749 </td> </tr>
   </table>

```R
#音階の対数表現
music_scale<-c("C","C#=D♭","D","D#=E♭","E","F","F#=G♭","G","G#=A♭","A","A#=B♭","B")
frequency<-c("2^0","2^(1/12)","2^(2/12)","2^(3/12)","2^(4/12)","2^(5/12)","2^(6/12)","2^(7/12)","2^(8/12)","2^(9/12)","2^(10/12)","2^(11/12)")
approximation<-c("1.000000","1.059463","1.122462","1.189207","1.259921","1.33484","1.414214","1.498307","1.587401","1.681793","1.781797","1.887749")
scale_calculation<-data.frame(Music_Scale=music_scale, Frequency=frequency,Approximation=approximation)
library(xtable)
print(xtable(scale_calculation), type = "html") 
```
**「ドレミファソラシド、ドシラソファミレド」再生例**

```R
library(tuneR)
f1<-function(x){(440*2^(-3/12))*2^x} #チューンダウン
c0<-f1(c(0,2/12,4/12,5/12,7/12,9/12,11/12,1))
c1<-c(c0,rev(c0))
for (i in c1) {
beep<- sine(i);
play(beep)
}

#参考
c0
[1] 440.0000 493.8833 554.3653 622.2540 659.2551 739.9888 830.6094 880.0000
```
そう、コンピューターは**楽器**でもあり、その働きを理論的に支えているのもまた**数理**という話なんですね。