地図/信号/リズムと作曲

ここから先は未踏 — 確率と seed

決め打ちの配列でなく、音符そのものを乱数で抽選すると、毎回ちがうメロが出る。次の音をどの高さにするかを重み付きの抽選で選び、抽選元をスケールに縛っておけば、外れた音にはならない。重みを「前の音に近い高さほど大きく」しておくと、跳ね回らず段で繋がった旋律になる。前の音が次の音の重みを決める形が、マルコフ連鎖

重み付き抽選は、各選択肢に重みを割り当て、重みの総和ぶんの幅に乱数を落として当たった区間を選ぶ。選択肢ごとの確率が重みに比例する。遷移を直前の状態だけに依存させると一次のマルコフ連鎖になり、状態(音)ごとの遷移確率を表に持てば、純粋な一様乱数より滑らかな流れが作れる。Markov が 1906 年に提示した、過去全体でなく直前だけで次が決まる確率過程。

抽選に使う乱数を mulberry32 のような seeded PRNG にすると、種(整数ひとつ)から決まった順で乱数が出る。同じ種からは毎回まったく同じ列が出るので、メロも完全に同じ。種を一つ変えれば別のメロになる。下は 16 ステップ × 5 段のペンタ格子で、再生ヘッドが一巡するたびに種を 1 進めて、その種だけから旋律を組み直す。各段は上が高音、下が低音。

pick が重み配列を受け取って、1 / (1 + |row - prev|) で前の音に近い段ほど大きい重みを与える。旋律は隣の段へ滑らかに移り、rng() < 0.32 を引いた所は -1 の休符で抜ける。再生ヘッドが右端で折り返すたびに seed が 1 進んで、新しい種から旋律が引き直される。種を戻せば同じ旋律がそのまま戻る。種を一つずらした旋律は、似た歩き方のまま別の並びになる。

確率で作った曲は、種を持たなければ一度きりで消える。気に入った旋律が出てもリロードすれば二度と戻らない。seeded PRNG は種の整数一個から決定論的に乱数列を出すので、種を固定すれば同じ曲が再現できる。種を URL に焼けば「この曲」を渡せ、種を一つずらせば近いが少し違う曲が出て、気に入った種の周りを探って育てられる。決定論的な乱数が、生成した音楽を保存・比較・進化させる前提になる。

横軸を空間から時間に替えても、確率分布の上を歩く酔歩も、状態を持つマルコフ連鎖も、種で固定する seeded PRNG も、そのまま音の設計図になる。