物理シミュレーションを使用して音楽を生成する方法





物理シミュレーションには、1つの驚くべき機能があります。停止、巻き戻し、および再生が可能です。これは、異常な世界を生成するために使用できる非常に強力なツールです。この投稿では、これを使用して、有名な音楽を打つボールの音を同期させる方法について説明します。カットの下で興味のある方にお願いします!



前書き



私はあらゆる種類の派手な視覚化、物理シミュレーション、およびそのようなものすべてを作成するのが大好きです。それで、2、3年前、次のアイデアを開発していたときにアイデアがありましたが、そこで行われるプロセスがメロディーを作成するように物理的な世界を生成するとどうなるでしょうか。実際、コンピューターシミュレーションでは、いつでもロールバックしてオプションを確認し、最適なものを選択すると同時に、メロディーに関するすべての情報(ノート、ノートの再生時間)を取得できます。だから私は、検疫で何かを書く時間があるまで、より良い時まで頭の中で生きるというこの考えを持っていたので、この記事を含むこのプロジェクトが登場しました。



モデル



まず、かなりシンプルなモデルを選ぶことにしました。私のモデルでは、オブジェクトには大理石とプラットフォームまたは厚板の2種類しかありません。プラットフォームは厳密に固定された座標を持ち、2つの端点によって設定され、一定の幅を持ちます。ボールは重力の影響下にあり、物理法則に従ってプラットフォームから跳ね返ることができます。また、システムのエネルギーが常に変化しないように、絶対弾性衝突のみを使用することにしました。しかし、最も重要なことは、ボールとプラットフォームが衝突すると、サウンドが再生され、各プラットフォームには独自のサウンドがあり、一度に複数のノートで構成できることです。



したがって、私たちの世界は多くのプラットフォームで構成されており、それぞれにサウンドが割り当てられています。そして、この世界に落ちるボールは、一連の音、そして私たちの場合はメロディーさえも作り出すことができます。



アルゴリズム



モデルを考え出したのですが、ボールを叩く音がよく知られているメロディーに並ぶように、どうやってそのような世界を作り出すのでしょうか?



私はかなり良い、再帰的なブルートフォース、および一般の人々の中にあることが証明され、それにもかかわらず、最も不器用を使用することにしましたブルートフォースしかし、すべてが正常に機能するためには、いくつかのトリックを使用する必要がありました。以降のすべての手順は、再帰関数内で実行されます。



  1. 次の音符を演奏する必要がある瞬間まで、私たちは世界をシミュレートします。
  2. シミュレーション中に不要な衝突が発生した場合は、より高いレベルに戻ります。
  3. , , , . , . 70 +70. «» ( , , ).
  4. 4. .
  5. 5. ,
  6. 6. , , m ティック、衝突は発生していません。発生した場合は、結果のワールドを結果として返します。


写真では、このアルゴリズムの1つのステップの視覚化を見ることができます。







注意
, , , . , , . , . , .



再帰がスタックしている



他のブルートフォースアルゴリズムと同様に、これには「再帰がスタックしている」という欠点があります。これは、「悪い」プラットフォームでマップを将来生成できない場合に発生しますが、同時に、マップの十分な大きさの部分を生成できますが、完全ではありません。 ..。この場合、この「悪い」プラットフォームが生成する再帰サブツリー内のすべてのオプションが列挙されるまで、再帰はスタックします。このサブツリーの高さが4〜8レベルの再帰を超えない場合は問題ありませんが、20〜30レベルに達する場合があり、このサブツリーのすべてのバリアントを繰り返すことが不可能になります。



したがって、私の実装では、行き詰まりを克服するためにヒューリスティックを使用することにしました。そのようなケースが検出されたときに、再帰の一部を折りたたむという考え方です。に戻ることは私にとって最も明白であるように思われましたd 中の場合、再帰のレベルは高くなります k繰り返し、プラットフォーム間で生成されたパスの最大長を改善できませんでした。私の場合、私はk ノート数の10%として、 d2000のように。



このヒューリスティックの結果は、マップ生成の進行状況が10%リセットされることがあるデモで確認できます。しかし同時に、それはあなたが合理的な時間でカードの生成を完了することを可能にします。



反復生成



ここで、次の問題を解決します。マップ生成の開始後、ページが10〜30秒間フリーズし、何が起こっているのかをまったく理解できない、すべてが落ちている、またはマップの生成に非常に長い時間がかかる。したがって、私は、生成アルゴリズムの反復実装も記述して、一貫して小さな部分でマップを作成できるようにすることにしました。

何か新しいものを発明する必要はありませんでした。再帰アルゴリズムを明示的なスタックに書き直しただけです。したがって、進行状況バーがページに表示され、コードが落ちていないことを理解するのに役立ちます。トラックに適したプラットフォームの場所を見つけるのに長い時間がかかるだけです。







場合によっては、生成に時間がかかりすぎることがあります。そのために、生成を停止して世界のシミュレーションを開始する[再生]ボタンを追加しました



ダウンロード着メロ



メロディーをダウンロードするには、midiファイルを使用しますが、その前に、tonejs.github.io / Midi実行し、ブラウザー対応のjsonに変換しました(ただし、現時点では、デモにはファイルをダウンロードする機能がなく、既製のリストから選択することしかできません)。



また、midiファイル内には複数の並列トラックが存在する場合が多いことに注意することも重要ですが、これまでの私のアルゴリズムは1つのボールでしか機能しないため、最大数のノートがロードされるのは1つのトラックだけです。



結果



いくつかのエフェクトを追加した後、最初のビデオを録画しました。





そのいくつか確認した後 回、私は少し視覚的な部分を改善することを決めました。動く2層の背景を追加し、インパクト時にボールとプラットフォームにグロー効果を加え、フライングノートをスパークに置き換えました。その後、すべてがはるかに良く見え始めました、最終結果はビデオにあります:





ビデオは非同期を示しているかもしれません、私は後でこれに気づきました。デモのあるページに移動すると、同期がずれることはありません(実際には、ビートが登録されている場合にのみサウンドが再生されます)。



その結果、私はこれらすべてのメロディーを心から知っており、私の耳は最初の2つの音符でメロディーを認識します。



次は何ですか?



一度に複数のボールのそのようなマップを生成する機能を追加する予定です。これを行う方法についてのアイデアがあり、いくつかのオプションをテストしましたが、これまでのところ、完全なトラックを生成するためにそれらはすべて非常にゆっくりと動作します。



私の別のアイデアは、新しいオブジェクトを追加することでした:ボタン、スプリングボード、銃(?)、リング...リストを補足することができます:)それらは世界を大幅に多様化することができます。



コード



すべてのソースコードは私のリポジトリにあります。



提案、プルリクエスト、クイズは大歓迎です。



All Articles