竹内関数で音楽生成

Lisperの人ならみんな知ってる竹内関数(たらいまわし関数)という関数があります。
定義としてはこんな感じ。
 
\text{Tarai}(x,y,z)=\left\{{y \text{       if } x\leq y\\\text{Tarai}(\text{Tarai}(x-1,y,z),\text{Tarai}(y-1,z,x),\text{Tarai}(z-1,x,y))\text{  otherwise}}
 
そのシンプルな定義からは想像もつかないほど複雑で膨大な再帰呼び出しがおこなわれるとても興味深い関数です。たとえば引数にTarai(10,5,0)を与えると343,073回も再帰呼び出しされたりします。
 
この関数呼び出しの引数がどのように変化するか知りたくてプログラムを書いて調べてみたところ、Tarai(10,5,0)の場合は3つの引数がそれぞれ0〜10(xは-1〜10)の間で少しずつ変化するなかで、2つの値を固定してひとつの値が下降していくような挙動があったりして、なんだか音楽の3和音のコード進行を思わせるような動き方です。
 
そういうことなら、ということで実際に音にして聴いてみました。Tarai関数が呼ばれるたびに引数のx、y、zを、0=ミ、1=ファ、2=ソ、……、のように音に割りあて3和音にして鳴らしています。せっかくなので音源の自動アルペジオ機能でミニマルっぽくしています。この手の自動生成音楽にしては緊張感の変化があってちょっと面白いんじゃないかと思います。
動画では60小節で止めていますが、この曲のフルバージョンは343,073小節あります。
 

 
関連エントリー竹内関数が音楽的に聴こえる理由について考えてみた
 


初めての人のためのLISP[増補改訂版]

初めての人のためのLISP[増補改訂版]