Ruby sebagai Alat Komposisi: Sonic Pi
(bhmt.dev)- Sonic Pi diperkenalkan sebagai lingkungan untuk membuat musik tanpa perlu instrumen atau peralatan, dan memungkinkan penulisan langsung not, chord, scale, dan timing melalui DSL berbasis Ruby
- Dengan memanfaatkan fungsi, array, kondisi, perulangan, dan scope di Ruby,
play,sleep,play_pattern_timed,chord, danscalebisa digabungkan untuk menyusun pola berulang dan arpeggio secara ringkas - Dengan menggabungkan
in_thread,ring,flatten, operator splat, danwith_fx, beberapa “instrumen” dapat dijalankan sekaligus dan nada tumpang tindih serta ritme berbeda bisa dilapiskan - Pengaturan
attack,decay,sustain, danreleasepada envelope ADSR berfokus bukan pada reproduksi paduan suara yang realistis, melainkan pada penyesuaian durasi penahanan dan kesan keterpisahan live_loopdapat memperbarui kode yang sedang diputar sambil terus mengulang eksekusi, menjadikan Sonic Pi sebagai alat untuk pertunjukan live dan memandang kode sebagai teks yang dapat dibaca sekaligus tindakan kreatif
Sonic Pi yang Dikendalikan dengan Kode
- Sonic Pi berbeda dari aplikasi audio pada umumnya karena merupakan synthesizer perangkat lunak yang dikendalikan sepenuhnya lewat kode
- Bahasa kontrol bawaannya adalah bahasa spesifik domain (DSL) yang memperluas Ruby dan memetakan konsep musik serta audio ke atas sintaks Ruby
- Elemen dasarnya terdiri dari nilai Ruby dan fungsi Sonic Pi
- Nama not seperti
:c4digunakan sebagai simbol yang sesuai dengan kode MIDI terkait - Chord dapat dibuat dengan memberikan not root dan struktur chord sebagai argumen, seperti
chord(:d3, :maj7) playmemutar not, dan bersamasleepdari Ruby mengontrol jeda waktuplay_pattern_timedmenerima daftar not dan interval waktu untuk mempersingkat kode pemutaran berulang
- Nama not seperti
- Tujuan contoh ini adalah membuat iringan demo lewat kode hanya dengan fitur bawaan Sonic Pi, tanpa MIDI eksternal atau sample
- Setelah memasang aplikasi Sonic Pi, kode contoh bisa langsung ditempel dan diikuti, dan dokumentasi bahasa serta tutorial juga sudah disediakan
Membuat Pola Berulang dengan Sintaks Ruby
- Contoh dasar mengubah BPM dengan
use_bpm 70dan memakai synthesizer pulse lewatuse_synth :pulsealih-alih gelombang sinus default - Dengan mengulang
play :c2,sleep 0.25, not dapat diputar berurutan, dan struktur yang sama bisa ditulis lebih singkat denganplay_pattern_timed [ :c3, :d3, :e3, :g3 ], 0.25 - Karena bahasa kontrolnya dibangun di atas Ruby, pola bisa diabstraksikan dengan fungsi dan perulangan
- Fungsi
arpeggiatemenerima not root dan opsi minor untuk membuat pola naik-turun - Perulangan
4.timesmenjalankan pola yang sama di beberapa oktaf - Kondisi mengubah not ketiga saat minor, dan
mappada array menambahkan interval ke not root untuk menghasilkan daftar not
- Fungsi
- Opsi default synthesizer bisa diatur lebih dulu dengan
use_synth_defaults amp: 0.1, dan opsi juga bisa langsung diberikan keplayatauplay_pattern_timed - Di Ruby, tanda kurung pada pemanggilan fungsi bersifat opsional, tetapi dalam kasus seperti
play chord(:a3, maj7)pemisahan mungkin perlu dibuat lebih jelas
Eksekusi Paralel dan Layering
- Blok
in_thread dodigunakan di Sonic Pi untuk menjalankan kode secara paralel - Dengan dua blok
in_threadyang berbeda, dua “instrumen” terpisah dapat dijalankan secara bersamaan- Satu thread dapat menangani pola arpeggio
- Thread lain dapat memutar melodi terpisah dengan
use_synth :saw, array melodi, dan array ritme
play_pattern_timedtidak hanya menerima daftar not, tetapi juga daftar interval waktu[1] * 2memperpanjang array dengan mengulang isinya, seperti[1, 1]- Karena array bertingkat tidak diterima mentah oleh
play_pattern_timed,flattendigunakan untuk meratakannya menjadi satu lapis array
- Untuk membuat nada bertumpuk seperti paduan suara, beberapa not bisa digabung sekaligus seperti
ring(:c5, :e5) flattenbisa ikut menggabungkan daftar di dalamring, sehingga dalam kasus seperti ini isi daftar dibentangkan ke array induk dengan operator splat*
Scope, Efek, dan Penyusunan Bagian Paduan Suara
- Dengan memakai
in_threadbertingkat, potongan ritme dari scope luar dapat dibagikan sambil tetap memungkinkan setiap thread dalam menggunakan nama variabel yang sama lagi - Jika bagian seperti soprano dan alto dipisah ke thread terpisah, setiap blok memiliki scope sendiri sehingga tidak dapat langsung mengakses variabel satu sama lain
with_fx :reverb, mix: 0.2membuat blok efek, dan aliran sinyal bergerak dari layer paling dalam ke rantai efek di bagian luarmixmenunjukkan tingkat pencampuran antara sinyal wet dan dry- Sinyal wet adalah sinyal yang sudah diberi efek
- Sinyal dry adalah sinyal tanpa efek
- Membungkus seluruh grup dengan satu efek bisa dipakai mirip bus di DAW, tetapi routing yang lebih dalam bersifat manual dan karena scope umumnya perlu disusun dari atas ke bawah
- Sonic Pi terasa lebih alami bila diperlakukan sebagai instrumen ketimbang alat produksi yang sangat canggih
Menyesuaikan Panjang Nada dengan Envelope ADSR
play_pattern_timedmenambahkan nilaisustain, sehingga durasi chord panjang dan pendek dapat disesuaikan secara langsungattack,decay,sustain, danreleaseadalah envelope ADSR yang menunjukkan bagaimana volume berubah seiring waktuattackadalah waktu dari 0 hingga mencapai puncak pertama, seperti serangan awal saat senar gitar dipetik atau hammer piano menyentuh senardecayadalah waktu turun dari puncak pertama, seperti bagian saat suara perlahan melemah meski tuts piano atau senar gitar masih ditekansustainadalah durasi mempertahankan suara pada volume stabil, seperti bunyi senar yang digesek atau vokal yang ditahan panjangreleaseadalah waktu dari saat suara dilepas hingga benar-benar menjadi hening
- Tidak semua bunyi memiliki semua elemen ADSR
- Tone synthesizer adalah bunyi yang dihasilkan, sehingga tidak selalu memiliki buildup awal atau sisa gema
- Pada instrumen alami, proporsi tiap elemen berubah tergantung cara memainkannya
- Simulasi paduan suara dalam contoh ini berfokus bukan pada kesan realistis, melainkan agar nada bertahan selama waktu yang tepat dan ada sedikit pemisahan antarchord
- Fungsi
choral_rings notes, susmenerima daftar not dan durasi penahanan, memutarnya bersama lewatring(*notes), menghitungsustaindanrelease, lalu menunggu hingga event berikutnya dengansleep sus
Live Coding dengan live_loop
- Dengan
live_loop, kode dapat dieksekusi berulang tanpa batas - Sonic Pi adalah alat yang sangat mempertimbangkan pertunjukan live, dan kode di dalam
live_loopakan berjalan sampai program dihentikan - Isi loop dapat diubah saat pemutaran berlangsung, dan jika perintah mulai dijalankan lagi, loop yang diperbarui akan diterapkan mulai iterasi berikutnya
- Loop
in_threadluar yang sudah ada dapat diubah menjadi bentuklive_loop :some_unique_name - Karena rantai efek dibuat ulang setiap kali loop berputar, semakin banyak efek ditumpuk semakin hemat sumber daya bila diletakkan di luar
live_loop - Contoh akhir terdiri dari
live_loop :harpdanlive_loop :choir- Loop
:harpmemakai synthesizer:squaredan pola arpeggio berdurasi 0.25 - Loop
:choirmemutar chord paduan suara dengan synthesizer:saw,sleep 64,with_fx :reverb, mix: 0.75, dan pemanggilan fungsichoral_rings
- Loop
Memandang Pemrograman sebagai Tindakan Kreatif
- Pekerjaan teknis biasanya dibahas dari sudut pandang ilmu komputer, tetapi pemrograman juga bisa menjadi seni
- Ia bukan hanya artistik saat menghasilkan karya yang sengaja kreatif seperti pembuatan audio atau layout CSS
- Kode bukan sekadar instruksi yang dioptimalkan untuk mesin, melainkan teks terstruktur yang dibaca orang lain dan diri kita di masa depan
- Kode yang baik adalah kode yang ditulis agar orang lain, atau diri sendiri enam bulan kemudian, dapat langsung memahaminya
- Kadang nilai artistik kode itu sendiri menjadi tujuan, dan contoh Sonic Pi menunjukkan titik itu melalui pembuatan musik
1 komentar
Komentar Hacker News
Kalau tertarik dengan live coding, Glicol(https://glicol.org) juga layak dicoba
Ada juga TidalCycles, dan kemampuan Haskell serta Ruby dalam membuat DSL memang patut dipuji
Glicol berfokus pada sintaks yang terinspirasi dari synthesizer, kecepatan komposisi, dan kemudahan desain suara. Idenya adalah merancang DSL yang membawa kebiasaan pemrograman yang sudah ada, tetapi tidak terkurung pada bahasa tertentu
https://github.com/tidalcycles/strudel
Beberapa tahun lalu di YouTube, saya pernah melihat video seseorang merekonstruksi THX Deep Note dengan Sonic Pi
Awalnya ia tidak menjelaskan apa yang akan dibuat, lalu membuat satu “nada” suara dan menyebutnya lebah. Ia sedikit demi sedikit menyesuaikan dan memperdengarkan suara lebah itu, lalu di akhir berkata kira-kira, “mari kita buat beberapa ratus lebah ini dan lihat seperti apa bunyinya di sarang lebah”; pada saat itu Deep Note muncul
Video itu benar-benar bagus, tetapi sejak itu saya tidak bisa menemukannya lagi. Kalau ada yang tahu tautannya, akan menyenangkan kalau bisa dibagikan
Menurut saya ini salah satu kasus ketika Ruby benar-benar bersinar. Berkat metaprogramming, sintaksnya bisa dibuat hampir terlihat seperti bahasa Inggris
Beberapa tahun lalu saya pernah melihat Sam Aaron, yaitu pembuat Sonic Pi, tampil live dengan Sonic Pi
Setiap kali kodenya berubah secara real time, musiknya juga terus berevolusi, dan hasilnya memang bagus
Kalau penasaran dengan contoh artis yang memakai Sonic Pi, dulu saya menemukan DJ_Dave, dan menurut saya ia contoh bagus tentang musisi berbakat dan terampil yang memakai alat ini dengan baik
Dulu ia juga pernah AMA di Reddit, dan sepertinya ada juga karyanya di GitHub
[1] https://www.youtube.com/watch?v=JiQHclg_648
[2] https://www.reddit.com/r/audius/comments/19dxmy6/hey_audius_...
[3] https://github.com/algorave-dave
Sebagai developer Ruby, ini terlihat sangat keren. Sepertinya menarik dipakai untuk musik generatif algoritmik, dan saya pernah ingin mengubah event repositori git yang ramai menjadi semacam musik algoritmik; ini tampaknya cocok untuk itu
Namun sebagai musisi yang punya beberapa instrumen keyboard, kalau ingin menggubah lagu saya bisa memainkan MIDI keyboard atau merekam instrumen akustik lalu membuat loop, jadi saya tidak begitu paham alasan harus menyusun sequence musik dengan Ruby. Saya paham kita bisa memasukkan apa yang diinginkan lewat Ruby DSL, tetapi sulit mengatakan pengalaman penggunanya lebih baik dibanding tuts piano
Dengan kata lain, saya rasa saya tidak akan memakai ini untuk menggantikan Logic. Tentu ini soal selera pribadi
Referensi: http://listen.hatnote.com/
Pada praktiknya ada saat ketika kita berpikir seperti “sekarang arpeggio C minor, sekarang arpeggio F major”, dan menyenangkan bahwa niat semacam itu bisa digubah dengan sangat jelas sebagai fungsi
Intinya lebih pada menghasilkan musik dengan algoritma, bukan memainkan setiap nada satu per satu
Meski begitu, memanfaatkan alat yang biasanya tidak akan dipakai secara menarik karena batasan yang unik cukup sesuai dengan minat Hacker News
Saya punya keyboard yang saya suka dan secara teori bisa dipakai untuk pekerjaan ini, tetapi karena situasi pribadi yang rumit, semua instrumen saya untuk sementara masuk gudang
Beberapa hari lalu kebetulan saya memikirkan Sonic Pi dan menonton beberapa video online
Saya hanya pernah mencobanya sebentar beberapa tahun lalu, dan waktu itu saya memainkan lagu-lagu klasik seperti Old MacDonald dan Hot Cross Buns
Kalau ingin melihat pendekatan lain untuk pemrograman musik, meski bukan live, scamp[0] untuk Python juga layak dilihat
Pembuatnya mengunggah banyak video pekerjaan yang dibuat dengannya di YouTube; salah satu contohnya adalah video Fourier Elise[1]
[0] http://scamp.marcevanstein.com/
[1] https://www.youtube.com/watch?v=zq32bIud3OM
Sepertinya komentar HTML tidak berfungsi. Tampaknya editor mengubah dua tanda hubung
--menjadi satu em dash—Saya juga merekomendasikan live coder Sonic Pi favorit saya, alsoknownasrox
https://www.youtube.com/watch?v=wXIvXrBQFkE