模様を音に変える - 反応拡散とフラクタルのSonification
反応拡散の濃度変化とフラクタルの反復計算を説明し、走査した値が音程・発音・強さへ変わる仕組みを比べます。

反応拡散とフラクタルは、どちらも数式から複雑な模様を作ります。ただし、反応拡散は2つの物質の濃度が時間とともに変わる仕組み、フラクタルは同じ計算を繰り返した結果です。模様が生まれる理由と、画面上の値を音程や発音タイミングへ変える仕組みを説明します。
反応拡散で模様が育つ理由 — Gray–Scott model
反応拡散は、場所ごとに持つ2つの濃度 U と V を少しずつ更新するシミュレーションです。Gray–Scott modelでは、UとVが周囲へ広がる拡散と、Uを使ってVが増える反応を同時に計算します。
式は、∂U/∂t = Du∇²U − UV² + f(1−U)、∂V/∂t = Dv∇²V + UV² − (f+k)V と表せます。DuとDvは広がる速さ、f(Feed)はUを補う量、k(Kill)はVが失われる量です。FeedとKillの組み合わせが、点、縞、分裂する斑点などの育ち方を変えます。
Brushで濃度を変えると、その場所が新しい初期条件になります。FeedとKillを同時に動かすと原因を追いにくいため、まず片方だけを変え、模様の幅、分裂の速さ、空白の増え方を見ます。
フラクタルの境界に細部が現れる理由 — Mandelbrot set
Mandelbrot集合は、複素平面上の各点 c について、z₀ = 0、zₙ₊₁ = zₙ² + c を繰り返して調べます。値が一定範囲から外へ逃げた点と、決めた回数まで逃げなかった点を分けると、境界の複雑な形が現れます。
色に使われるEscape Timeは、外へ逃げるまでにかかった反復回数です。集合の内側では上限回数まで残り、境界付近では隣り合う点でも回数が大きく変わります。この差が、走査したときの細かな音程変化や発音の密度になります。
拡大で新しい模様が生まれているのではなく、同じ計算をより狭い範囲へ細かく適用しています。ZoomとPanは、音に読むデータの場所と解像度を選ぶ操作でもあります。
二次元の模様を時間順に読む — 走査
画面は二次元ですが、音楽は時間順に進みます。そのため、横線、縦線、円、境界に沿う経路などを決め、経路上の値を順番に読みます。走査方向を変えると、同じ模様でも値が並ぶ順番が変わり、別のフレーズになります。
反応拡散では、走査している間にも濃度場そのものが変化します。フラクタルは表示範囲を変えない限り元の計算結果は固定され、再生位置だけが進みます。この時間の違いが、育ち続ける音と、同じ地形を別の道で読む音の違いです。
数値を音程・強さ・左右へ割り当てる
Sonificationは、数値を耳で区別できる属性へ対応させる方法です。読み取った値をScale内の音程へ丸め、変化量をVelocity、画面上のX位置をPan、走査速度を発音間隔へ対応させると、模様と音の関係を追えます。
最初からすべてを割り当てると、何が変化の原因か分かりません。まず値からPitchだけを作り、走査線が明るい場所や境界を通ったときに音がどう動くかを確認します。その後でPanやVelocityを加えます。
Thresholdで発音密度を決める
Thresholdは、読み取った値を発音イベントにする境目です。閾値を越えた点だけ鳴らす設定では、値の分布と閾値の位置によって休符の数が変わります。音が詰まりすぎるときは、単にBPMを下げるのではなく、Thresholdで鳴る点そのものを減らします。
模様を一度FREEZEし、走査経路とScaleを変えずにThresholdだけを動かすと、値の選別がリズムへ変わる様子を確認できます。
数式と音の対応を確かめる
反応拡散ではFeedまたはKillを変え、模様をFREEZEしてから同じ経路を走査します。フラクタルでは表示範囲を固定し、HorizontalとBoundaryなど走査経路だけを切り替えます。画面、読み取る値、発音の順に追うと、音の違いを数式上の変化まで戻って説明できます。
見た目が複雑であることと、音楽として聞きやすいことは別です。模様はそのままに、Scale、音域、Threshold、走査速度を整えるのが音楽側の編集です。映像との対応を作品にするなら画面と音を一緒に記録し、音だけを使うならWAVへ残します。
要点
反応拡散は時間とともに変わる濃度、フラクタルは反復計算の結果を持つ平面です。走査で値を時間順に並べ、Thresholdで発音を選び、Pitchなどへ割り当てることで音楽になります。