竹内関数が音楽的に聴こえる理由について考えてみた

前回のエントリーが予想以上に反響が大きくてびっくりしています。
プログラミング言語好きの僕にとってはヒーローみたいなすごいプログラマーたちにツイートしてもらってびびっていたところ、今日になって竹内先生ご本人からのコメントをいただいてしまって本気で腰抜かしそうになりました。せっかくなので自分なりに竹内関数が音楽的に聴こえる理由についての考えを書いてみます。
 
■ちょっとした工夫
最初に少し種明かしをすると、より音楽的になるように以下のような工夫をしています。
 
・ダイアトニックスケール(白鍵)だけを使用し調性の外れた音が出ないようにした
・最小値(-1)をレにわりあてることで少し寂しげなドリアンスケールにした
 (とはいえ-1の出現頻度が低いのでミからはじまるフリジアンスケール的かも)
・オートアルペジオ、テンポ、音色の設定でミニマルミュージック風にした
 
上記のことをおこなうと、ただの乱数でもわりとそれっぽく聴こえるかと思います。しかし、これらのささいな演出を加えなくても、以下に述べる竹内関数の数学的特徴そのものがとても音楽的な構造になっている部分があり、それが前回興味深く感じたポイントです。
 
■竹内関数の音楽的特徴
竹内関数の引数の動きを音楽的に見ていくと、xとyの関係によって以下のようなことがおこっているようです。
 
(1) x > y のとき
x > y の場合、yとzの値は変化せずに1回再帰するたびにxが1ずつ減少します*1。これは音楽でいうクリシェにあたり、メロディアスで切ない雰囲気や、宗教曲のような厳かな感じが出ます。またクリシェを速いアルペジオで弾くとちょっとバッハようなバロック音楽のフレーズっぽくなります。
 
(2)x = y のとき
xが減少していってyと等しくなるとそれまでのメロディアスな動きが止まって停滞した感じになります。いままで3和音であったアルペジオが2和音になって明らかにフレーズが変わりメロディの区切りがきたように感じます。
 
(3)x <= y の次の進行
竹内関数は三分木の枝をひたすら再帰計算していきますが、x <= yになったときにひとつの枝の先端までたどりつきます。そのため、次は元の枝を遡って別の枝の計算に移ります。ずっと連続的進行だったxが跳躍的進行になり、それまで固定だったy、zも一気に変化するので調性が変わりAメロからBメロに移ったような雰囲気が出て、ふたたび仕切りなおしたクリシェがはじまります。
 
つまり、
 クリシェ → 停滞 → 調性切替 → クリシェ → 停滞 → 調性切替 → クリシェ → ……
といった感じで場面が時間とともに変化していくことになります。
 
クリシェの部分はとてもメロディアスで魅力的であるもののそれだけでは音楽になりません。クリシェが数小節続いて単調になりかけたときに1小節の停滞がきて、その後別の調性に展開するので退屈せずに聴き続けられる音楽になっているのではないかと思います。
 
動画の34小節目あたり(1:05)でクリシェがなかなか続かず頻繁に停滞してしまう状態が続いた後に44小節目(1:23)で調性が変わるときの開放感がなんともいえず好きです。

*1:処理系がtarai(x,y,z)の引数を評価する順序にもよると思いますが