遊び tokidoki 仕事

数学と音楽と教育と遊び

| おしごと - きょういく - がくせい - ゼミ - イベント | すうがく - おんがく - 数理音楽 - DTM - かがく - scratch
| Art - photo - おきにー - Tips - ものもう - あれこれ | About - Top

あいちトリエンナーレ2022ーライヒを全身で浴びる!

冒頭,国際芸術祭「あいち2022」の間違いでは?
と言うでしょうが,敢えて使うよ,あいちトリエンナーレ2022.
相変わらず下品な某市長が騒いだぐらいで「3年に一度の芸術祭」の名称を見かけ上変えるなんてのは,現代アートの名折れだ.(ま,とは言っても自分がキュレーターだったら,やっぱり変えるけどね.芸術祭できなくなったら本末転倒だし.)
tokidoki.hatenablog.jp
で,昨日から始まったのだけど,Steve Reichのコンサートがあるってことで,チケットネット販売開始と同時に予約したね.(ほぼその日のうちに一度販売終了となったのに,その後また販売されたのはなぜ?当日券があんなにあったのはなぜ?コロナ最盛期なのに座席ぎゅう詰めだったのはなぜ?)

Reichの作品はyoutubeにたくさんあって気軽に聞けるのだが,やはり生だね.生Reich.

  • 1曲目:piano phase


www.youtube.com
Reichといえば,まずこれかな,という作品.これ,ソロで弾くという猛者もいるようだけど,今回は録音に奏者が重ねて弾く形.同じフレーズの繰り返しを2台のpianoがテンポをわずかに変えて弾き続けるミニマル作品だけど,聴覚におけるモアレが音楽を聴くときの脳の働き方を再認識させてくれる.目を閉じて聴いていると,様々なゲシュタルトが立ち現れては消えて面白い.

  • 2曲目:Vermont Counterpoint


www.youtube.com
やはりこちらも12名のフルート奏者を用意するわけにはいかず,代わりに11名分の録音とそれに奏者が生演奏を加える形.でもこういったミニマル作品,今どこやってるのか分からなくならないものかな.

  • 3曲目:Different Trains


www.youtube.com
Strings Qualtetと録音音声.3つの異なる時代の列車(第二次大戦前のアメリカー大戦中のヨーロッパー大戦後)を音素材にしたドキュメンタリー作品.これ,生で聴くべき!

  • 4曲目:Electric Counterpoint


www.youtube.com
何か気楽な感じの,ギターを引っ提げたおじさんが(失礼)ひょっこり登場して演奏開始.やはり録音を背景にソロ演奏.この曲はJazz Guiterist, Pat Methenyによって最初のレコーディングが行われた.

  • 5曲目:Double Sextet


www.youtube.com
Strings, flute, clarinet, vibraphone, pianoで構成された作品.今回の出演者総出での演奏.これ,拍子が4,5,6,7と入り乱れて,一体どうやって憶えてるのだろうと不思議.身体で憶えるのだとしても,複雑すぎで,どうなってるのかな.生で聴くべき!

というわけで,今年も始まったトリエンナーレ.
aichitriennale.jp

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

本タイトルエントリーもこれで3つ目となる.
前回は確か Tristan chord が四度堆積和音の半音変形なんだってことを見つけた話だった.
tokidoki.hatenablog.jp
最近 Blackadder chord*1 なるものを某学生が教えてくれた.
これは音楽研究家Joshua Taipale氏によって近年名付けられたコードで,知らぬ間にJ-popに多用されていたものらしい.
www.youtube.com

Tristan はコードの進行力が弱いおかげで独特な浮遊感があってかつ単独で使える独立感のあるコードだと思っている.
これに対し Blackadder は強いベクトルを持ったコードで,然るべきところで使うととても明るい,爽快感のある進行をもたらすが,単独で使うとかなり違和感のあるコードだ.
こうしたかなり性質の違うコードなのだけど,この2つ,実は半音変形で移り合っている.

f:id:okiraku894:20190715140210p:plain
例えば上の譜例では,Blackadderが Gaug/Db であり,Tristanは Em on G/Db と,top noteが半音違うだけだ.
けれど,その違いだけで進行の行き先が大きく違ってくる.
ちょっと聴き比べてみてくだされ↓

前半はBlackadder,後半はTristanをそれぞれ挟んで自然に進みそうなコードを続けてみたが,こうしてみるとBlackadderはtop noteの半音進行が強力な牽引力となっているようで,というよりtop noteを半音進行させたらできてしまったコードのように思えなくもない.
けれどそもそもrootは半音下方進行で,なぜこれで成り立つのかよくわからない.
あるいはこのrootの半音下方進行は裏コードの発想から来ているのかとも考えたが,上に乗っかってるコードが裏コードとBlackadderではえらく違う.
でもとにかくBlackadderはこれで成り立ってしまっている!しかも爽快に飛ばしてくれる!!

Blackadderは分数コードとして捉えると上が Aug なので緊張度が高い.
このあたりの仕組みは最初のエントリーで触れた.
tokidoki.hatenablog.jp
同様なことは dim でも言えるのだけど,これらchromatic 12音を等分割するコードは一般に多数の文脈での解釈が可能だ.
dim や Aug はコード同士の乗り換え・乗り継ぎのためのハブのような役割をする.
更にその Aug のルートに対してこれまた12音を等分割する IV# の音を添える.
だから自ずと Blackadderは多義的解釈ができてしまう,したがって代理和音として様々に使われうるのだろうと想像はするものの,どれだけの可能性があるのかまだ検討していない.

何にしても,四度堆積を意識しながらコードを掴むと,以前の自分にはできなかった微妙なニュアンスの音作りが出来るようになって楽しい.
そんなことを感じながら毎朝ピアノでちょっとずつコードを付けてみたKIMIGAYO2019.
そもそもはDorian modeのコード進行ってどうやるん?というところから始まって,君が代は西洋音楽の枠組みでみるとD-Dorianかなぁ,じゃぁちょっとコードつけてみようか,となった結果である.

隠蔽,捏造,虚偽,忖度,そして分断ーもはや目も当てられないほどに劣化した政治だとか,ただでさえ同調圧力の強い民族性の中,失敗したら落ちていく他ない不安と隣り合わせに生きる国民が抱える大きな閉塞感に覆われた,この国らしいアレンジにしてみた(というあと付け解釈).

*1:某Youtuberによって「イキスギコード」なるいかがわしいネーミングが流行ってしまったのだが.

数理音楽の風景(2)-12ヶ月はLydianを奏でる

「数理音楽の風景」と題したエントリーを書いたのが,もう2年前のことだ.
tokidoki.hatenablog.jp
ちょうどその頃,極大均等性のコンセプト下での調性音楽理解の可能性が見え始めたところで,この点でいくつか書き物をしてきた.

当初は準周期系の話題の延長線上での議論だったが,どういうわけか調性音楽の仕組みと極大均等性の相性が良く,いろいろと説明できてしまう.
あるいは典型的なカデンツである五度進行も説明できるものだろうか,などと思いながらボヤッと運転してたときに,「もしかして」と気づいた事実を動画にしたのが↓.

もちろん,12ヶ月の配置がこのようになっているのは歴史的な偶然だろうと思う一方で,31日ある7ヶ月分をできるだけ均等に12ヶ月に配置しようとした,という無意識/意識的な作用があったとしたら,やはり自動的にこの配置に,しかも一意的に決まる.

さてさて,何を言い出したのか.
今後,「数理音楽」エントリーに毎度現れるであろう極大均等性についてまずは書いておこう.
極大均等性(maximal evenness)とは,例えば白と黒の碁石を円形に並べたとき,白と黒の配置が「できるだけ均等になるように」並べた状態のことだ(いや,ちゃんとした定義は下でするけど).

例えば白と黒が同数ならこれは簡単で,白と黒を交互に並べれば良いだろうし,白が黒の2倍あるなら,黒を3つごとに並べれば均等になるだろう.
一般に白 w個,黒 b個あって,w=kb の倍数関係にあるなら,黒を k個ごとに置けば良いはずだ.
f:id:okiraku894:20190202150408p:plain:h150

では,倍数関係になかったらどうなるだろう.特に互いに素だったら.
よく高校生などに「白石7つと黒石5つをできるだけ均等になるように並べてごらん」というと,白黒を交互に並べて最後に黒の一つを白に変えるとか,黒を4つ配置した後どこか一箇所の白を黒に変える,といった回答をするがこれらはまだ均等に近くはない.
f:id:okiraku894:20190202151006p:plain:h150
実際,白は重さがなく黒が 1g の重りだったとして原点中心の半径1の円に上図のように並べたなら,それらの重心は計算すると(ただし,平均は12ではなく5で割ったがそれは本質ではない)それぞれ

\begin{align*}
\frac{1}{5}\sum_{k\in\{1,3,5,7,11\}}(\cos\frac{\pi k}{12},\sin\frac{\pi k}{12})&=(0,\frac{1}{5})\\
\frac{1}{5}\sum_{k\in\{0,3,6,8,9\}}(\cos\frac{\pi k}{12},\sin\frac{\pi k}{12})&=(-\frac{1}{10},-\frac{\sqrt{3}}{10})
\end{align*}
となり,どちらも重心は原点から距離\frac{1}{5}の位置にある.しかし下図のように黒石を一つ隣に移動してみよう.
f:id:okiraku894:20190202154658p:plain:h150
どちらも同じ配置になるので右の場合で重心を計算してみると,

\begin{equation*}
\frac{1}{5}\sum_{k\in\{0,3,6,8,10\}}(\cos\frac{\pi k}{12},\sin\frac{\pi k}{12})=(0,\frac{1-\sqrt{3}}{5})
\end{equation*}
となって,重心の原点からの距離は\frac{\sqrt{3}-1}{5}<\frac{1}{5} だからさっきより近くなる.
しかしこれよりもっと(そして実は最短となる)重心が原点に寄る配置が,まさにピアノ鍵盤における黒と白の配置だ.
f:id:okiraku894:20190202161101p:plain:h150
右図にした場合,

\begin{equation*}
\frac{1}{5}\sum_{k\in\{1,3,6,8,10\}}(\cos\frac{\pi k}{12},\sin\frac{\pi k}{12})=(-\frac{2-\sqrt{3}}{10},-\frac{2\sqrt{3}-3}{10})
\end{equation*}
となるから,重心の原点からの距離は\frac{2-\sqrt{3}}{5}<\frac{\sqrt{3}-1}{5},つまり更に先程より近くなった.

さて,ここまで先延ばしにしてきた極大均等性のきちんとした定義を述べておこう.


【極大均等性】
0と1からなる無限に続く記号列 {\bf w}=\cdots w_{-1}w_0w_1w_2\cdots について,\bf{w}から同じ長さの任意の2つの有限部分列 {\bf u}=w_kw_{k+1}\cdots w_{k+n},{\bf v}=w_lw_{l+1}\cdots w_{l+n} を取ってくると,必ず

{\bf u} に含まれる1の個数と {\bf v} に含まれる1の個数の差は高々1以下

となるとき,{\bf w} は極大均等であるという.
これは語の組合せ論でいうところの balanced wordの定義に他ならない.
因みに,数理音楽の分野ではこれを Myhillの性質と呼んでいる.
なお,この定義において取ってくる有限部分列の長さはいくらでも良く,また{\bf u} と {\bf v}の一部が被っていようと構わない.

では実際にピアノ鍵盤の場合に当てはまるか見てみよう.
f:id:okiraku894:20190202173824p:plain
この場合,白=0,黒=1として考える無限列は周期が12の列

\begin{equation*}
{\bf w}=\cdots \underline{010100101010}010100101010010100101010\cdots
\end{equation*}
となる.

  • 長さ1の部分列のとき:要するに1文字なので0か1しかなく,だから含まれる1の個数の差は高々1.
  • 長さ2の部分列のとき:現れる組み合わせは00,01,10のみで,だからどの2つを取っても含まれる1の個数の差は高々1.
  • 長さ3の部分列のとき:現れる組み合わせは001,010,100,101のみで,だからどの2つを取っても含まれる1の個数の差は高々1.
  • 長さ4の部分列のとき:現れる組み合わせは0010,0100,0101,1010,1001のみで,だからどの2つを取っても含まれる1の個数の差は高々1.

以下,長さをいくら変えても含まれる1の個数の違いは高々1となることが観察できる.
特に長さを12の倍数に取ると,常に含まれる1の数は等しい.
こんなふうに,どんな長さで比較しようと1の現れ方のブレが高々1なので,とても均等に近い状態で1が並んでいるということになる.

つまり,12ヶ月に31日のある月7ヶ月分をできるだけ均等に並べたい,とか,12音に黒鍵5つをできるだけ均等に並べたい,と思うと,自動的にこの極大均等な配置になってしまうということだ.
さて,このままだと単なる偶然だったりオカルト的だったりするわけだが,少なくとも音階の成り立ちについては,連分数展開に関わるきちんとした数学的裏付けができる.
が,その話は,またの回にて.

Music Theory and Mathematics: Chords, Collections, and Transformations (Eastman Studies in Music)

Music Theory and Mathematics: Chords, Collections, and Transformations (Eastman Studies in Music)

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

今年の暮れも,例年の如くゼミ生の卒論添削で年を越す.
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番を聴きながら,卒論の添削で年を越すのだ.

ブルックナー:交響曲第8番

ブルックナー:交響曲第8番

  • アーティスト: ロヴロ・フォン・マタチッチ,NHK交響楽団
  • 出版社/メーカー: 日本コロムビア
  • 発売日: 2011/03/23
  • メディア: CD
  • 購入: 1人 クリック: 1回
  • この商品を含むブログを見る
悪くは無い.むしろ誰の為でもなくある種の芸術活動として没頭できるこの時間は
おそらく誰にも理解されないであろう,私だけの幸福のひと時である.

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