3 poin oleh GN⁺ 2024-08-11 | 1 komentar | Bagikan ke WhatsApp
  • 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, dan scale bisa digabungkan untuk menyusun pola berulang dan arpeggio secara ringkas
  • Dengan menggabungkan in_thread, ring, flatten, operator splat, dan with_fx, beberapa “instrumen” dapat dijalankan sekaligus dan nada tumpang tindih serta ritme berbeda bisa dilapiskan
  • Pengaturan attack, decay, sustain, dan release pada envelope ADSR berfokus bukan pada reproduksi paduan suara yang realistis, melainkan pada penyesuaian durasi penahanan dan kesan keterpisahan
  • live_loop dapat 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 :c4 digunakan sebagai simbol yang sesuai dengan kode MIDI terkait
    • Chord dapat dibuat dengan memberikan not root dan struktur chord sebagai argumen, seperti chord(:d3, :maj7)
    • play memutar not, dan bersama sleep dari Ruby mengontrol jeda waktu
    • play_pattern_timed menerima daftar not dan interval waktu untuk mempersingkat kode pemutaran berulang
  • 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 70 dan memakai synthesizer pulse lewat use_synth :pulse alih-alih gelombang sinus default
  • Dengan mengulang play :c2, sleep 0.25, not dapat diputar berurutan, dan struktur yang sama bisa ditulis lebih singkat dengan play_pattern_timed [ :c3, :d3, :e3, :g3 ], 0.25
  • Karena bahasa kontrolnya dibangun di atas Ruby, pola bisa diabstraksikan dengan fungsi dan perulangan
    • Fungsi arpeggiate menerima not root dan opsi minor untuk membuat pola naik-turun
    • Perulangan 4.times menjalankan pola yang sama di beberapa oktaf
    • Kondisi mengubah not ketiga saat minor, dan map pada array menambahkan interval ke not root untuk menghasilkan daftar not
  • Opsi default synthesizer bisa diatur lebih dulu dengan use_synth_defaults amp: 0.1, dan opsi juga bisa langsung diberikan ke play atau play_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 do digunakan di Sonic Pi untuk menjalankan kode secara paralel
  • Dengan dua blok in_thread yang 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_timed tidak hanya menerima daftar not, tetapi juga daftar interval waktu
    • [1] * 2 memperpanjang array dengan mengulang isinya, seperti [1, 1]
    • Karena array bertingkat tidak diterima mentah oleh play_pattern_timed, flatten digunakan untuk meratakannya menjadi satu lapis array
  • Untuk membuat nada bertumpuk seperti paduan suara, beberapa not bisa digabung sekaligus seperti ring(:c5, :e5)
  • flatten bisa ikut menggabungkan daftar di dalam ring, sehingga dalam kasus seperti ini isi daftar dibentangkan ke array induk dengan operator splat *

Scope, Efek, dan Penyusunan Bagian Paduan Suara

  • Dengan memakai in_thread bertingkat, 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.2 membuat blok efek, dan aliran sinyal bergerak dari layer paling dalam ke rantai efek di bagian luar
  • mix menunjukkan 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_timed menambahkan nilai sustain, sehingga durasi chord panjang dan pendek dapat disesuaikan secara langsung
  • attack, decay, sustain, dan release adalah envelope ADSR yang menunjukkan bagaimana volume berubah seiring waktu
    • attack adalah waktu dari 0 hingga mencapai puncak pertama, seperti serangan awal saat senar gitar dipetik atau hammer piano menyentuh senar
    • decay adalah waktu turun dari puncak pertama, seperti bagian saat suara perlahan melemah meski tuts piano atau senar gitar masih ditekan
    • sustain adalah durasi mempertahankan suara pada volume stabil, seperti bunyi senar yang digesek atau vokal yang ditahan panjang
    • release adalah 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, sus menerima daftar not dan durasi penahanan, memutarnya bersama lewat ring(*notes), menghitung sustain dan release, lalu menunggu hingga event berikutnya dengan sleep 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_loop akan 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_thread luar yang sudah ada dapat diubah menjadi bentuk live_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 :harp dan live_loop :choir
    • Loop :harp memakai synthesizer :square dan pola arpeggio berdurasi 0.25
    • Loop :choir memutar chord paduan suara dengan synthesizer :saw, sleep 64, with_fx :reverb, mix: 0.75, dan pemanggilan fungsi choral_rings

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

 
GN⁺ 2024-08-11
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

  • 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

    • Benar, tetapi DSL Sonic Pi rasanya sedikit lebih dekat ke Lisp daripada terasa seperti bahasa alami
    • Memang metaprogramming
  • 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

    • Saya juga pernah bertemu Sam. Sekitar 2008–2010, setelah ia memberi presentasi di Clojure Conj, kami makan malam bersama; saat itu pun ia benar-benar orang yang menyenangkan dan presentasinya juga luar biasa
  • 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/

    • Meski begitu, dalam beberapa hal Ruby DSL mengekspresikan niat dengan lebih jelas daripada sequence MIDI
      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
    • Sonic Pi tampaknya lebih berfokus pada musik yang dibuat secara algoritmik, terutama live coding, daripada sebagai alat komposisi umum
      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
    • Ini bisa cocok untuk teoretikus musik yang kurang koordinasi dan kemampuan motorik halus
    • Seperti yang juga diisyaratkan di tulisan asli, sebagian besar karena keterbatasan praktis
      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

    • Tepat sekali. Sebenarnya saya menjalankan find/replace terlalu terburu-buru dan melewatkan beberapa bagian seperti ini XD
  • Saya juga merekomendasikan live coder Sonic Pi favorit saya, alsoknownasrox
    https://www.youtube.com/watch?v=wXIvXrBQFkE