Cara menghasilkan musik menggunakan simulasi fisika





Simulasi fisika memiliki satu fitur luar biasa - mereka dapat dihentikan, diputar ulang, dan diputar ulang. Ini adalah alat yang sangat ampuh yang dapat digunakan untuk menghasilkan dunia yang tidak biasa. Dalam posting ini, saya akan menjelaskan bagaimana saya menggunakan ini untuk menyinkronkan suara bola yang mengenai musik terkenal. Saya meminta mereka yang tertarik di bawah pemotongan!



pengantar



Saya suka membuat semua jenis visualisasi mewah, simulasi fisika, dan sejenisnya. Jadi dua atau tiga tahun lalu, ketika saya mengembangkan ide saya berikutnya , saya punya ide, tapi bagaimana jika kita menciptakan dunia fisik sehingga proses yang terjadi di dalamnya menciptakan melodi? Memang, dalam simulasi komputer, kita selalu dapat memutar kembali, menelusuri opsi, memilih yang terbaik dan pada saat yang sama kita memiliki semua informasi tentang melodi: not, waktu pemutaran not. Jadi saya punya ide untuk hidup di kepala saya sampai saat yang lebih baik, sampai saya punya waktu untuk menulis sesuatu di karantina, dan dengan demikian proyek dengan artikel ini muncul.



Model



Untuk memulainya, saya memutuskan untuk memilih model yang cukup sederhana. Dalam model saya, hanya ada dua jenis objek: kelereng dan platform atau papan. Platform memiliki koordinat tetap, ditetapkan oleh dua titik ujung dan memiliki lebar konstan. Bola jatuh di bawah pengaruh gravitasi dan dapat memantul dari platform sesuai dengan hukum fisika. Selain itu, saya memutuskan untuk hanya menggunakan tumbukan yang benar-benar elastis sehingga energi sistem selalu tidak berubah. Namun yang paling penting adalah ketika bola dan platform bertabrakan maka terdengar suara yang dimainkan, setiap platform memiliki suaranya sendiri-sendiri dan dapat terdiri dari beberapa not sekaligus.



Dengan demikian, dunia kita terdiri dari banyak platform, yang masing-masing memiliki suara yang ditetapkan untuk dirinya sendiri. Dan bola yang jatuh di dunia ini dapat membuat urutan suara, dan dalam kasus kami, bahkan melodi.



Algoritma



Kami menemukan modelnya, tetapi bagaimana cara membuat dunia seperti itu sehingga suara pukulan bola berbaris dalam melodi yang terkenal ?



Saya memutuskan untuk menggunakan paling canggung, namun, yang terbukti menjadi cukup baik, kekerasan rekursif, dan di masyarakat umum bruteforce . Tetapi agar semuanya berfungsi sebagaimana mestinya, saya harus menggunakan beberapa trik. Semua langkah selanjutnya dilakukan di dalam fungsi rekursif:



  1. Kami mensimulasikan dunia, hingga saat berikutnya Anda perlu memainkan not.
  2. Jika saat simulasi ada tabrakan yang tidak diinginkan, kita kembali ke level yang lebih tinggi.
  3. , , , . , . -70โˆ˜ +70โˆ˜. ยซยป ( , , ).
  4. 4. .
  5. 5. ,
  6. 6. , , m kutu, tidak ada tabrakan yang terjadi, dan jika demikian, kembalikan dunia yang dihasilkan sebagai hasilnya.


Pada gambar Anda dapat melihat visualisasi salah satu langkah dari algoritma ini:







Catatan
, , , . , , . , . , .



Rekursi macet



Seperti algoritme bruteforce lainnya , algoritme ini memiliki kekurangan berupa "rekursi macet", hal ini terjadi ketika beberapa platform "buruk" tidak mengizinkan peta dibuat di masa mendatang, tetapi pada saat yang sama memungkinkan Anda untuk menghasilkan sebagian besar darinya, tetapi tidak sepenuhnya ... Dalam kasus ini, rekursi akan macet sampai ia menyebutkan semua opsi dalam subpohon rekursi yang dimunculkan oleh platform "buruk" ini. Tidak ada masalah bila ketinggian subpohon ini tidak melebihi 4-8 tingkat rekursi, tetapi terkadang dapat mencapai 20-30 tingkat, yang membuatnya tidak mungkin untuk mengulang melalui semua varian subpohon ini.



Oleh karena itu, dalam implementasinya, saya memutuskan untuk menggunakan heuristik untuk mengatasi kemacetan. Idenya adalah untuk menutup beberapa bagian dari rekursi ketika kasus seperti itu terdeteksi. Tampaknya paling jelas bagi saya untuk kembali ked tingkat rekursi lebih tinggi jika selama kiterasi, kami tidak dapat meningkatkan panjang maksimum jalur yang dihasilkan di seluruh platform. Dalam kasus saya, saya memilihk sebagai 10% dari jumlah nada, dan dseperti 2000.



Hasil dari heuristik ini dapat Anda lihat di demo, ketika kemajuan pembuatan peta terkadang akan diatur ulang sebesar 10%. Tetapi pada saat yang sama, ini memungkinkan Anda menyelesaikan pembuatan kartu dalam waktu yang wajar.



Pembuatan berulang



Sekarang mari kita selesaikan masalah berikut: setelah dimulainya pembuatan peta, halaman membeku selama 10-30 detik dan tidak mungkin untuk memahami apa yang terjadi sama sekali, semuanya telah gagal, atau hanya membutuhkan waktu yang sangat lama untuk menghasilkan peta. Oleh karena itu, saya memutuskan untuk menulis juga implementasi berulang dari algoritme generasi sehingga Anda dapat secara konsisten membangun peta dalam porsi kecil.

Saya tidak perlu menemukan sesuatu yang baru, saya hanya menulis ulang algoritma rekursif ke tumpukan eksplisit. Dengan demikian, bilah kemajuan muncul di halaman yang akan membantu Anda memahami bahwa kode tidak jatuh, hanya perlu waktu lama untuk menemukan lokasi platform yang sesuai untuk trek Anda.







Dalam beberapa kasus, pembuatan dapat memakan waktu terlalu lama, untuk ini saya menambahkan tombol Putar , yang menghentikan pembuatan dan memulai simulasi dunia.



Unduh nada dering



Untuk mengunduh melodi, saya menggunakan file midi, tetapi sebelumnya saya menjalankannya melalui tonejs.github.io/Midi untuk mengubahnya menjadi json yang ramah peramban (tetapi saat ini tidak ada fungsi untuk mengunduh file saya dalam demo, hanya pilihan dari daftar yang sudah disiapkan tersedia).



Penting juga untuk dicatat bahwa seringkali akan ada beberapa trek paralel di dalam file midi, tetapi karena algoritme saya sejauh ini hanya berfungsi dengan satu bola, hanya satu trek yang akan dimuat dengan jumlah nada terbesar.



hasil



Setelah menambahkan beberapa efek, saya merekam video pertama:





Setelah meninjaunya beberapa puluh ratus kali, saya memutuskan untuk sedikit meningkatkan bagian visual. Saya menambahkan latar belakang dua lapisan yang bergerak, membuat efek cahaya pada bola dan pada platform saat terjadi benturan, mengganti nada terbang dengan percikan api. Setelah itu, semuanya mulai terlihat jauh lebih bagus, hasil akhirnya ada di video:





Video mungkin menunjukkan desinkronisasi, saya perhatikan ini nanti. Jika Anda pergi ke halaman dengan demo , seharusnya tidak ada yang tidak sinkron (suara sebenarnya dimainkan hanya ketika ketukan terdaftar).



Hasilnya, saya hafal semua melodi ini, dan telinga saya mengenali melodi apa pun dengan dua nada pertama.



Apa berikutnya?



Saya punya rencana untuk menambahkan kemampuan membuat peta seperti itu untuk beberapa bola sekaligus. Saya punya ide tentang cara melakukan ini, saya menguji beberapa opsi, tetapi sejauh ini semuanya bekerja sangat lambat untuk menghasilkan trek lengkap.



Ide lain saya adalah menambahkan objek baru: kancing, papan loncatan, meriam (?), Cincin ... daftarnya dapat ditambah :) Mereka dapat mendiversifikasi dunia secara signifikan.



Kode



Anda dapat menemukan semua kode sumber di repositori saya.



Setiap saran, permintaan tarik, kuis dipersilakan!



All Articles