遊び tokidoki 仕事

数学と音楽と教育と遊び

Top | おしごと | ゼミ | がくせい | すうがく | かがく | きょういく | おんがく | おきにー | Tips | Photo | イベント | ものもう | あれこれ | About

九平次とブルックナーと,そして卒論添削

今年の暮れも,例年の如くゼミ生の卒論添削で年を越す.
f:id:okiraku894:20171221114638j:plain
こうして手直しをする中,結構面白い発見をする.
例えばピタゴラス数を生成する行列の話は,
ピタゴラス数を2パラメータで表示するとき,そのパラメータが動く空間と
原始ピタゴラス数全体のなす空間の関係は,
パラメータ(2,1)を始対象とし,射を(1,1)(2,0)とする圏と
原始ピタゴラス数を含む圏との関手\Phi_2を観察してるに他ならないことだとか,
f:id:okiraku894:20171231202503p:plain
カードマジックで有名なGergonneトリックは一度論文にしたけれど,
Generalized Gergonne's Trick and its Continuous Approximation
いま一度卒論ネタにしてまとめ直すと綺麗に書き直せることとか.
f:id:okiraku894:20171231203127p:plain

まぁ,何にしても年末,
すき焼きとネットでわざわざ注文して手に入れた九平次(雄町!)の取り合わせを楽しんでから,
f:id:okiraku894:20171231175422j:plain:w500
昨年同様,遥か遠く高校時代に衝撃を受けた
マタチッチ指揮のN響によるブルックナー8番を聴きながら,卒論の添削で年を越すのだ.
[asin:B004G8AT9E:detail]
悪くは無い.むしろ誰の為でもなくある種の芸術活動として没頭できるこの時間は
おそらく誰にも理解されないであろう,私だけの幸福のひと時である.

sin波による疑似フォルマントシミュレーション

今年の4年ゼミ生の一人は音声分析・合成をテーマにしている.
EXCEL上でちまちま作業してもらっているが,
線形予測によるフォルマント抽出がうまくいかないのか,
なかなか母音「あいうえお」すら \sin波から合成できないでいる.

手軽にBASICで母音の合成ぐらいできないものかと探したら,
高々6つ程度の倍音の重ね合わせで「あいうえお」らしい音を作っているページを見つけた.
qiita.com
本当に手軽にできそうだったので,10進BASICでサウンド生成する方法を探して作ってみた.
十進BASIC−外部プログラムの利用

でもって,音程も適当に定めて実行したのが↓

う~ん,そう思って聞けば聞こえなくもない程度.

AquesTalkつかえば,簡単なんだけどね↓

https://www.a-quest.com/index.html


以下,BASICソースと使い方.
実行すると,母音と音程の列を入力するよう聞いてくるので,
母音[aiueo]と音程[0~9]の組合せをinput.
上掲の音源では
   a3i7u9e0o2
とinputしてある.
するとソースのある場所に test.wav が生成されダイレクトにそれが再生される.
いや,その予定だったのだけど,やっているうちにダイレクト再生できなくなった.あれれ.
まぁ,生成された test.wav をクリックすれば再生できるようなので.

REM [疑似母音フォルマント シミュレータ]
REM Ver. 2017/12/23
REM 参考:
REM BASIC 元ネタ:http://hp.vector.co.jp/authors/VA008683/ExtProg.htm
REM               testwave.bas  十進BASICによる音声ファイル生成プログラム 
REM               chr$関数の引数として全ての1バイト整数が許される様に、オプションメニューの
REM               「互換性」「動作」で「文字列処理の単位」を「バイト」に設定して実行すること
REM フォルマント:https://qiita.com/rild/items/339c5c36f4c1ad8d4325

OPTION CHARACTER BYTE
DECLARE FUNCTION formant

INPUT  PROMPT "母音とその高さの列をどうぞ.(「あい↑う↑↑え↓お」は a3i7u9e0o2 など)":vw$
LET vwlen=LEN(vw$)
LET d=0.3  !継続時間(秒)
LET f0=220 !正弦波周波数(Hz)
LET db=-10 !生成波形の最大値(±32767を0dBとする)
LET fs=44100 !標本化周波数(Hz)
LET bps=fs*4 !1秒当りのデータ量(ステレオ16ビット量子化)
LET dsize=d*vwlen*fs*4 !オーディオデータサイズ
LET fsize=dsize+36 !ファイルサイズ(先頭8Bを除く)
LET fmtsize=16 !フォーマットサイズ
LET channel=2^17+1 !ステレオPCMデータの指定
LET reso=2^20+4 !16ビットの指定
LET a=10^(db/20)
OPEN #6 : NAME "test.wav" !ファイルを開き、この名前のファイルが
ERASE #6 !既に存在していた場合には上書きを指定
LET t0=TIME
PRINT #6 : "RIFF"; !以下、wavファイルのヘッダーを作成
CALL out4(fsize) !
PRINT #6 : "WAVEfmt "; !
CALL out4(fmtsize) !
CALL out4(channel) !
CALL out4(fs) !
CALL out4(bps) !
CALL out4(reso) !
PRINT #6 : "data"; !
CALL out4(dsize) !ここまでがヘッダー用の出力
LET al=a*32767 !左チャネル係数
LET ar=a*65535 !右チャネル係数
LET k0=f0/fs*PI*2 !引数の刻み
LET audio$="" !オーディオデータバッファを初期化
FOR vw=0 TO vwlen/2-1
   LET count=0 !カウンタをリセット
   LET vow$=vw$(vw*2+1:vw*2+1)
   LET ht=VAL(vw$(vw*2+2:vw*2+2))
   PRINT vow$,ht
   FOR i=1 TO d*fs
      LET vsin=formant(vow$,k0*(1+ht/20))
      LET lch=INT(vsin*al+0.5)
      IF lch<0 THEN LET lch=lch+65536 !負の数は補数表現
      LET rch=INT(vsin*ar+0.5)
      IF rch<0 THEN LET rch=rch+65536 !負の数は補数表現
      LET audio$=audio$&CHR$(MOD(lch,256))&CHR$(INT(lch/256))&CHR$(MOD(rch,256))&CHR$(INT(rch/256))
      LET count=count+1
      IF count=64 THEN !バッファデータが所定の長さ(64サンプル256Bがほぼ最適)に達したら
         PRINT #6 : audio$; !データをファイルに出力して
         LET audio$="" !バッファを初期化し
         LET count=0 !カウンタをリセット
      END IF 
   NEXT i
   PRINT #6 : audio$; !バッファに残ったデータを出力して
NEXT vw
CLOSE #6 !ファイルを閉じる
PRINT "elapsed time = ";TIME-t0;"seconds"

PLAYSOUND "test.wav"

SUB out4(i4) !4バイト整数の出力(little endian)
   LET j4=i4
   FOR m=0 TO 3
      PRINT #6 : CHR$(MOD(j4,256));
      LET j4=INT(j4/256)
   NEXT m
END SUB

FUNCTION formant(v$,k)
   SELECT CASE v$
   CASE "a"
      LET formant=0.19*SIN(i*k*4)+0.09*SIN(i*k*2)+0.08*SIN(i*k*3)+0.08*SIN(i*k*5)+0.07*SIN(i*k*1)+0.07*SIN(i*k*6)
   CASE "i"
      LET formant=0.19*SIN(i*k)+0.09*SIN(i*k*2)+0.08*SIN(i*k*11)+0.08*SIN(i*k*13)+0.07*SIN(i*k*12)
   CASE "u"
      LET formant=0.19*SIN(i*k)+0.09*SIN(i*k*6)+0.08*SIN(i*k*2)+0.08*SIN(i*k*5)+0.08*SIN(i*k*4)
   CASE "e"
      LET formant=0.19*SIN(i*k)+0.09*SIN(i*k*2)+0.08*SIN(i*k*3)+0.08*SIN(i*k*11)+0.07*SIN(i*k*4)
   CASE "o"
      LET formant=0.19*SIN(i*k*4)+0.09*SIN(i*k*2)+0.08*SIN(i*k)+0.08*SIN(i*k*3)
   CASE ELSE
      LET formant=SIN(i*k)
   END SELECT
END FUNCTION
END 

数理音楽の風景(1)-不協和度曲線

2012年度卒業生から始めた当ゼミでの数理音楽なる分野,
その風景を数回シリーズでまとめてみよう.

準周期系の研究において連分数にまつわる力学系を扱うことが多かったことと,
はるか以前から音楽の仕組みに数理的仕組みが見え隠れしていると感じていたので,
ずっと取り扱いたいとは思っていたことだった.
そもそも音階の作り自体,繰り込み的な要素が多分にあるし,
その辺の感覚は連分数力学系そのものに由来する.
DSpace at 愛知教育大学: A Renormalization Approach to Level Statistics on 1-dimensional Rotations

さて,その数理音楽のゼミでの取り扱い開始は2012年度7代目の卒業研究から.
ドレミファそーする?―音律の数理と音階の構成―
不協和度曲線から始まって,連分数展開による音階構成の仕組みまで触れた卒論.
とあるページでもこの卒論が紹介されているのをしばらく前に発見した.
sites.google.com
この卒論,元になった藤沢+クックの論文*1
和音性の計算法と曲線の絵描き方 ―不協和度・緊張度・モダリティ―
の真似事から始まって,
不飽和度曲線で起こっている解析的な現象をちょっと数学的にきちんと書いてみた,
というものだった.
ただ,不協和度曲線の協和点でグラフが尖ってるといった特長があればいいものを,
そうもなっていなかったために,何らかの方法で協和点を解析的に特徴付けねば,
とでっち上げたのが第二種不協和度曲線だった.
tokidoki.hatenablog.jp

不協和度曲線の数理モデルのアイディアはこうだ.
まず,周波数の異なるsin波を同時に2つ鳴らし,
心理的な快不快の度合いを複数の被験者に採点してもらう.
その結果丁度半音階程度ずれたときが最も不快で,
そこを離れるに従い不快感は減っていったので,
この採点結果を適当な関数でモデル化する.それは例えば
f:id:okiraku894:20170129104409p:plain
であり,純音のドに対する別の純音の不協和度が以下.
f:id:okiraku894:20170128144954p:plain

しかし実際の楽器による楽音は複数の倍音が鳴っているため,
複合音の不協和度は純音の不協和度曲線をシフトして重ね合わせたものになるだろう,
つまり協和・不協和感覚に線形性が成り立っているだろう,という仮定を課すのである.
f:id:okiraku894:20170129105131p:plain

その結果,以下のような複合音に対する不協和度曲線が得られる.
例えば楽音のドに対する別の楽音の不協和度は↓
f:id:okiraku894:20170128144955p:plain
そして経験的に人々(正確には西洋音楽圏の人々*2)が協和すると感じる場所で
不協和度が下がっている,という尤もらしい説明ができる,というわけだ.
なお当たり前のことなのだが,この協和点の集合はFarey列にlog2したものに他ならない.

特に完全五度である3/2倍音は常にオクターブに次いで最も協和度が高い.
そのことによってピタゴラスは現在ピタゴラス音律と呼ばれる,
音階づくりのルールを定めたのだった.
そしてそこから連分数力学系が絡む素敵な世界が広がるのだが,その話は次回以降へ.

音律と音階の科学―ドレミ…はどのようにして生まれたか (ブルーバックス)

音律と音階の科学―ドレミ…はどのようにして生まれたか (ブルーバックス)

*1:更にその大元にはPlomp と Leveltによる音楽心理実験があるのだ. R. Plomp and J. M. Levelt "Tonal Consonance and Critical Bandwidth" Journal of the Acoustical Society of America, 1965.

*2:実際,ハーモニーという概念を持たない民族圏の人々は例えば半音差で二音鳴らした場合と完全五度で鳴らした場合とで快不快感に特段の違いは起こらなかった,という実験結果がある.単旋律文化圏であった他ならぬ明治以前の日本人もそうだったのではなかろうか.

四度堆積からの誘い(2)

4月にこのネタで書いてから随分経ってしまった.
tokidoki.hatenablog.jp
このときはTymoczkoの論文を読んだゼミ生の卒論が元となって書いたものだったが,
それ以後も折に触れ(特に毎朝のピアノにて)四度堆積は色々と観察してきた.
四度堆積というのは五度圏を逆に回ることでもある.
そしてそれは数理音楽的にみると極々自然に下方倍音という発想に至るものでもある.
ongakuriron.rulez.jp

四度堆積を4つ重ねた和音,第二音を上げ下げするだけで面白いことになる,
ってのは世間的に色々知られてるのだろうか.
まず第二音を半音上げるとこれがずっと気になっているトリスタン和音.
これはclosed voicingにすればいわゆるhalf diminished m7♭5というやつ.
そしてそれはまたルートから見た下方倍音列の最初の4つでもある.
でも今回書きたいのはこのことではないので,これは次の機会にでも.
f:id:okiraku894:20151231211047p:plain:w300

もう一方の面白いこと.それは第二音を半音下げることだ.
実は四度堆積で遊んでいて,ふとトリスタンと反対に半音下げて弾いたところ,
それがとてもJazzyな響きになって,「おやっ!」となったことに始まる.
これをコードでどう書くのかわからないけど.
f:id:okiraku894:20151231213829p:plain:w300
これ,EとB♭でtritoneになっている.クロマティック12音音階を丁度半分にする,
緊張度の高い音程で,西洋古典音楽では扱い注意の響きだ.
diminishedやAugmentationなど,等間隔に音が並んだ和音は緊張度が高く感じられる,
というのはCook氏らの研究にも述べられている.
(しかしそういえばトリスタンもtritoneを含んでいるね.)
The Psychophysics of Harmony Perception:Harmony is a Three-Tone Phenomenon

で,これどこかに使われてるかな,って探してみると,
例えばBill EvansのWaltz for Debby.
一番最後のオシャレなopen voiceのmaj7thが3つ続いた後の不思議な和音.
その辺にある譜面を見るとこれはC7 altと書かれているわけだけど,
altered scaleからtension一つとってきて載っけた和音と言われても,何だか.
音楽文脈的には四度堆積の変形と見るのは間違いかもしれないが,
もはや三度堆積和音からの解釈は意味を成さないと高らかに謳っているようだ.
そしてついでに最後の和音は完全に四度堆積.
f:id:okiraku894:20151231230142p:plain

そもそも四度堆積そのままでの名曲,Miles DavisのSo whatで
それは宣言されたのだろうけど.

So What by.Miles Davis

でも,この四度堆積の第二音を半音下げる,何かで聴いたよなぁ~
って弾いてたら,緊急地震速報がこれなんだね.
これは四度堆積5つの第三音を半音下げて出来ている.
たったこれだけなんだけど,この危機感はなに?

Beethoven on Doodle!

何でも生誕245年だそうで,L.v.Beethoven.
年末も近づいてきたことだし,日本人特有の現象だけど
第九聴きたくなってきた.
ピアノ・ソナタ悲愴,第一楽章のテーマって不思議なんだよな.
悲愴と言いながらメジャーで攻めるんだよ.
f:id:okiraku894:20151217202510p:plain

そういう話ではなくて,本日のGoogleロゴ,面白かったのでリンクを.
記念日にロゴで遊べるようになってるのだけど,
踏んだり蹴ったりのBeethovenがカワイイ.是非,トライしてみて.
(あ,但しChromeでないと動かないみたいだ.因みに↓は,ただの画像.)
f:id:okiraku894:20151217194128p:plain
アクセスはコチラ↓
www.google.com

あと,こういうロゴはDoodleと言うらしく,
過去の全ての動くロゴがアーカイブされていることを今知った.
www.google.com