初めに
本スライドはLT登壇した際の内容を記事にしたものです
そのLTのテーマが数学だったので、数学x音楽なものを作ってみました
今年一年のテーマとして、「物理現象を音楽に変換する」というテーマを掲げました。
今回はその第三弾として、二重振り子の運動からメロディを生成するプログラムを作成したので紹介します。
物理と音楽という一見関係のない分野を組み合わせることで、毎回異なるメロディを生み出すシステムを目指しました。
二重振り子とは
二重振り子とは、振り子の先端にさらにもう一つ振り子を取り付けた力学モデルです。見た目はシンプルですが、それぞれの振り子がお互いの運動に影響を与え、複雑な軌道を与えることが知られています。

その複雑な挙動から、カオス理論を説明する代表的な例としてよく用いられています。
今回は二重振り子の一方の紐をばねにした二重ばね振り子を使用しています。理由は後述します。
カオス理論とは
カオス理論とは、決定論的なルールで動いているにもかかわらず、初期条件のわずかな違いによって結果が大きく変化する現象を扱う理論です。
ランダムに見える運動であっても、実際には決まった運動方程式に従っています。しかし、初期値への感度が非常に高いため、長時間先の挙動を正確に予測することが困難になります。
かみ砕いていうと、先が読めず毎回違う挙動を示すということです。
今回はこのカオス理論を使って曲を考えてみようと思いました。
五度圏とは
今回は二重振り子を音楽にするにあたって、五度圏を利用しました。
五度圏とは、12個の調やコードを完全五度の関係で円形に並べた図のことです。

本来はコード進行とかを決めるときに使用するものなのですが、ここでは、音色をいい感じに円形にならべたものぐらいの認識で大丈夫です。
結局何がしたいのか
五度圏は円状に配置されています。
一方で振り子も角度で表現できます。
そこで、
- 振り子同士の角度差 → 音高
- 五度圏 → 角度へ変換
という対応付けを行えば、二重振り子の運動をそのままメロディへ変換できるのではないかと考えました。
二重"ばね"振り子の理由
当初は単純な二重振り子を実装していたのですが、出来上がったメロディを聞いてみると、毎回一定のタイミングで音が切り替わる単調なものになっていました。単調さをなくすために変数をもう一つ設ける必要があったので、音の長さに対応させる変数として振り子の長さを変更できるようにしようと思い、ばねを使用しました。
方針
実装の流れは以下のようになります。
- 二重振り子(ばね付き)の運動を数値シミュレーションする
- 各時刻で振り子の角度差を取得する
- 角度を五度圏へ対応付ける
- Cメジャーのダイアトニック音のみ採用し、それ以外は休符とする
- ばねの長さから音価を決定する
- WAVファイルとMIDIファイルを生成する
このようにして、物理シミュレーションをそのまま楽曲へ変換しています。
コード
コードはPythonで実装しました。
主に使用したライブラリは以下の通りです。
- NumPy
- SciPy
- Matplotlib
- mido
- scipy.io.wavfile
GitHubのリポジトリはこちらです。
実際に作ったもの
実際に生成した音声はこちらです。
動画では
- 二重振り子(ばね付き)の運動
- 現在選択されている音
- 生成されたメロディ
を同時に確認できます。
毎回異なる軌道を描くため、同じプログラムでも毎回違うメロディが生成されるのが面白いところです。
今後やってみたいこと
今回は単音のメロディのみ生成しましたが、
- コード進行の生成
- リズム生成
- ベロシティへの変換
- 他のカオス系(ローレンツ方程式など)への応用
なども試してみたいと考えています。
物理現象を音楽へ変換するというテーマはまだまだ可能性がありそうです。
最後に
今回のプロダクトでは、「二重振り子」という物理モデルと、「五度圏」という音楽理論を組み合わせることで、自動作曲システムを作成しました。
完全なランダムではなく、物理法則に従って生まれるメロディには独特の面白さがあります。
今後も音楽をテーマに、さまざまなプロダクトを作っていこうと思いますので、誤りの指摘や改善案、そのほか面白そうなアイデアがありましたら、教えてくださると大変ありがたいです。