Bir Beste Aracı Olarak Ruby: Sonic Pi
(bhmt.dev)- Sonic Pi, enstrüman veya ekipman olmadan müzik yapılabilen bir ortam olarak tanıtılıyor; Ruby tabanlı DSL’iyle notaları, akorları, gamları ve zamanlamayı doğrudan yazmak mümkün
- Ruby’nin fonksiyonları, dizileri, koşul ifadeleri, döngüleri ve scope yapısı kullanılarak
play,sleep,play_pattern_timed,chord,scalebirlikte ele alınabilir ve tekrarlayan pattern’ler ile arpejler kısa biçimde kurulabilir in_thread,ring,flatten, splat operatörü vewith_fxbirleştirildiğinde birden çok “enstrüman” aynı anda çalıştırılabilir; üst üste binen sesler ve farklı ritimler katmanlanabilir- ADSR envelope’unda
attack,decay,sustain,releaseayarları gerçekçi bir koro yeniden üretmekten çok süreyi ve ayrışma hissini tutturmaya odaklanıyor live_loop, çalan kodu güncelleyerek tekrar tekrar çalıştırmaya izin veriyor; bu da Sonic Pi’yi canlı performans aracı haline getirirken kodu hem okunabilir metin hem de yaratıcı eylem olarak görmeyi sağlıyor
Kodla Kontrol Edilen Sonic Pi
- Sonic Pi, sıradan ses uygulamalarından farklı olarak yalnızca kodla kontrol edilen bir yazılım synthesizer’ıdır
- Kendi kontrol dili, Ruby’yi genişleten domain-specific language (DSL) niteliğindedir ve müzik ile ses kavramlarını Ruby sözdizimi üzerine eşler
- Temel öğeler Ruby değerlerinden ve Sonic Pi fonksiyonlarından oluşur
:c4gibi nota adları, karşılık gelen MIDI koduna denk gelen symbol olarak kullanılırchord(:d3, :maj7)gibi kök nota ve akor yapısı argüman olarak verilerek akor oluşturulabilirplaynotayı çalar; Ruby’ninsleepfonksiyonuyla birlikte zaman aralıkları kontrol edilirplay_pattern_timed, nota listesi ve zaman aralığı alarak tekrarlı çalma kodunu kısaltır
- Örneğin amacı, harici MIDI veya sample olmadan yalnızca Sonic Pi’nin temel özellikleriyle demo amaçlı eşliği kodla oluşturmaktır
- Sonic Pi uygulamasını kurduğunuzda örnek kodu yapıştırıp izleyebilirsiniz; dil dokümantasyonu ve öğreticiler de varsayılan olarak sunulur
Ruby Sözdizimiyle Tekrarlayan Pattern’ler Oluşturma
- Temel örnek,
use_bpm 70ile BPM’i değiştirir ve varsayılan sinüs dalgası yerineuse_synth :pulseile pulse synthesizer kullanır play :c2,sleep 0.25tekrar edilerek notalar sırayla çalınabilir; aynı yapıplay_pattern_timed [ :c3, :d3, :e3, :g3 ], 0.25ile daha kısa yazılabilir- Kontrol dili Ruby üzerine kurulu olduğundan, fonksiyonlar ve döngülerle pattern’ler soyutlanabilir
arpeggiatefonksiyonu kök notayı ve isteğe bağlı minör olup olmadığını alarak yükselen ve alçalan bir pattern oluşturur4.timesdöngüsü aynı pattern’i birden fazla oktav boyunca çalıştırır- Koşul ifadesi minör durumda üçüncü sesi değiştirir; dizinin
mapmetodu kök notaya aralıklar ekleyerek nota listesi üretir
use_synth_defaults amp: 0.1gibi synthesizer varsayılan seçenekleri önceden ayarlanabilir; seçenekler doğrudanplayveyaplay_pattern_timediçine de verilebilir- Ruby’de fonksiyon çağrısı parantezleri isteğe bağlıdır, ancak
play chord(:a3, maj7)gibi durumlarda ayrımı netleştirmek gerekebilir
Paralel Çalıştırma ve Katmanlama
in_thread dobloğu, Sonic Pi’de kodu paralel çalıştırmak için kullanılır- Farklı
in_threadblokları yerleştirildiğinde iki ayrı “enstrüman” aynı anda çalıştırılabilir- Bir thread arpej pattern’ini üstlenebilir
- Diğer thread
use_synth :saw, melodi dizisi ve ritim dizisi kullanarak ayrı bir ezgi çalabilir
play_pattern_timed, nota listesinin yanı sıra zaman aralığı listesi de alabilir[1] * 2,[1, 1]gibi dizi uzunluğunu artırarak içeriği tekrarlar- İç içe dizileri
play_pattern_timedolduğu gibi kabul etmediğinden,flattenile tek katmanlı diziye açıp kullanmak gerekir
- Koro gibi üst üste binen sesler üretirken
ring(:c5, :e5)ile birden çok nota birlikte gruplanabilir flatten,ringiçindeki listeyi de birleştirebildiği için bu durumda splat operatörü*ile liste içeriğini üst diziye açma yöntemi kullanılır
Scope, Efektler ve Koro Partilerinin Kurulumu
- İç içe
in_threadkullanıldığında dış scope’taki ritim parçaları paylaşılırken, her iç thread’de aynı değişken adları yeniden kullanılabilir - Soprano ve alto gibi partiler ayrı thread’lere bölündüğünde her blok kendi scope’una sahip olur; bu yüzden birbirlerinin değişkenlerine doğrudan erişmezler
with_fx :reverb, mix: 0.2bir efekt bloğu oluşturur; sinyal akışı en iç katmandan başlar ve dıştaki efekt zincirine doğru ilerlermix, wet sinyal ile dry sinyalin karışım oranını ifade eder- wet sinyal, efekt uygulanmış sinyaldir
- dry sinyal, efektsiz sinyaldir
- Tüm grubu tek bir efektle sarmak, DAW’daki bus’a benzer biçimde kullanılabilir; ancak daha derin routing elle yapılır ve scope nedeniyle çoğunlukla yukarıdan aşağıya kurulması gerekir
- Sonic Pi’yi hassas bir prodüksiyon aracı olmaktan çok enstrüman gibi ele almak daha doğaldır
ADSR Envelope ile Nota Süresini Ayarlama
play_pattern_timed,sustaindeğeri eklediği için uzun ve kısa akorların süreleri doğrudan ayarlanabilirattack,decay,sustain,release, ses yüksekliğinin zaman içinde nasıl değiştiğini gösteren ADSR envelope’udurattack, 0’dan ilk tepe noktasına ulaşma süresidir; gitar telinin çekilmesi veya piyano çekicinin tele vurması gibi ilk darbe anına karşılık gelirdecay, ilk tepe noktasından aşağı inme süresidir; piyano tuşuna ya da gitar teline basılı tutulsa bile sesin yavaş yavaş azaldığı bölüme karşılık gelirsustain, sesin kararlı bir seviyede tutulduğu süredir; yayla çalınan tel veya uzun tutulan vokal gibi sürdürülen seslere karşılık gelirrelease, sesi bıraktıktan sonra gerçekten sessizleşene kadar geçen süredir
- Her ses tüm ADSR öğelerine sahip değildir
- Synthesizer tonları üretilmiş sesler olduğu için mutlaka ilk build-up veya kuyruk/reverb hissi taşımaz
- Doğal enstrümanlarda öğelerin oranı çalma biçimine göre değişir
- Örnekteki koro simülasyonu gerçekçilikten çok notaların doğru süre boyunca sürdürülmesine ve akorlar arasında hafif bir ayrışma oluşmasına odaklanır
choral_rings notes, susfonksiyonu nota listesini ve sustain süresini alır,ring(*notes)ile birlikte çalar;sustainvereleasedeğerlerini hesapladıktan sonrasleep susile sonraki event’e kadar bekler
live_loop ile Canlı Kodlama
live_loopkullanıldığında kod süresiz olarak tekrarlı çalıştırılabilir- Sonic Pi, canlı performansı oldukça gözeten bir araçtır;
live_loopiçindeki kod, program durdurulana kadar çalışır - Çalma sırasında döngü içeriği değiştirilebilir; başlatma komutu yeniden çalıştırıldığında güncellenmiş döngü bir sonraki tekrardan itibaren uygulanır
- Mevcut dış
in_threaddöngülerilive_loop :some_unique_namebiçimine dönüştürülebilir - Efekt zinciri döngü her döndüğünde yeniden oluşturulduğu için efekt sayısı arttıkça bunu
live_loopdışında tutmak kaynak kullanımı açısından daha ucuzdur - Son örnek
live_loop :harpvelive_loop :choiryapılarından oluşur:harpdöngüsü:squaresynthesizer ve 0.25 uzunluklu arpej pattern’i kullanır:choirdöngüsü:sawsynthesizer,sleep 64,with_fx :reverb, mix: 0.75vechoral_ringsfonksiyon çağrısıyla koro akorları çalar
Programlamayı Yaratıcı Bir Eylem Olarak Görmek
- Teknik işler genellikle bilgisayar bilimi perspektifinden tartışılır, ancak programlama da sanat olabilir
- Yalnızca ses üretimi veya CSS layout gibi bilinçli olarak yaratıcı çıktılar üretildiğinde sanatsal sayılmaz
- Kod, yalnızca makineye optimize edilmiş komutlar değil; başkaları ve gelecekteki kendimiz tarafından okunan düzenlenmiş bir metindir
- İyi kod, başka birinin veya 6 ay sonraki kendinizin bir bakışta anlayabileceği şekilde yazılmış koddur
- Bazen kodun sanatsallığı başlı başına amaç olur; Sonic Pi örneği bu noktayı müzik üretimi üzerinden gösterir
1 yorum
Hacker News yorumları
Live coding’e ilginiz varsa Glicol(https://glicol.org) da denemeye değer.
TidalCycles da var; Haskell ve Ruby’nin DSL oluşturma becerisi gerçekten övgüyü hak ediyor.
Glicol’de synthesizer’dan ilham alan söz dizimine, beste yapma hızına ve sound design kolaylığına odaklanılıyor. Mevcut programlama alışkanlıklarını alıp belirli bir dile hapsolmayan bir DSL tasarlama fikri.
https://github.com/tidalcycles/strudel
Birkaç yıl önce YouTube’da birinin Sonic Pi ile THX Deep Note’u yeniden oluşturduğu bir video izlemiştim.
Başta ne yapacağını açıklamıyor, sesin tek bir “notasını” oluşturup ona arı diyordu. O arı sesini azar azar ayarlayıp dinlettikten sonra en sonda “bu arıdan birkaç yüz tane yapıp kovanda nasıl duyulduğuna bakalım” gibi ilerliyordu; o anda Deep Note ortaya çıkmıştı.
O video gerçekten harikaydı ama sonradan bir daha bulamadım. Linkini bilen varsa paylaşırsa sevinirim.
Bence Ruby’nin parladığı durumlardan biri. Metaprogramlama sayesinde söz dizimini neredeyse İngilizce gibi gösterebiliyorsunuz.
Birkaç yıl önce Sam Aaron’ı, yani Sonic Pi’nin yaratıcısını, Sonic Pi ile live performans yaparken izlemiştim.
Kod gerçek zamanlı değiştikçe müzik de sürekli evriliyordu ve gerçekten iyiydi.
Sonic Pi kullanan sanatçı örnekleri merak ediyorsanız, eskiden DJ_Dave’i keşfetmiştim; yetenekli ve deneyimli bir müzisyenin bu aracı iyi kullanmasına güzel bir örnek olduğunu düşünüyorum.
Eskiden Reddit’te AMA de yapmıştı, GitHub’da da çalışmaları var gibi görünüyor.
[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
Bir Ruby geliştiricisi olarak gerçekten harika görünüyor. Algoritmik üretilmiş müzik için kullanmak eğlenceli olabilir; gürültülü git deposu event’lerini bir tür algoritmik müziğe dönüştürmek istemiştim, buna çok uygun görünüyor.
Ama birden fazla klavyeli enstrümanı olan bir müzisyen açısından, beste yapmak için MIDI klavye ile çalabilir ya da akustik enstrümanı kaydedip loop’a alabilirim; müzik sekanslarını özellikle Ruby ile yazmam için nedeni pek göremiyorum. Ruby DSL ile istediğimi girebildiğimi anlıyorum ama kullanıcı deneyimi açısından piyano tuşlarına kıyasla iyi demek zor.
Başka bir deyişle, Logic’in yerine bunu kullanacağımı sanmıyorum. Elbette bu kişisel tercih.
Referans: http://listen.hatnote.com/
Gerçekten de bazen “şimdi Do minör arpej, şimdi Fa majör arpej” diye düşünüyorsunuz; bu niyeti fonksiyonlarla çok net biçimde besteleyebilmek güzel.
Tek tek notaları çalmaktan ziyade algoritmayla üretmek asıl meseleye daha yakın görünüyor.
Yine de normalde kullanmayacağınız bir aracı sıra dışı kısıtlar yüzünden ilginç biçimde kullanmak, Hacker News’in ilgi alanına epey uyuyor.
Sevdiğim bir klavyem var ve teorik olarak bu iş için kullanabilirim; ama kişisel olarak karmaşık bazı nedenlerden dolayı enstrümanlarımın hepsi bir süredir depoda duruyor.
Birkaç gün önce tesadüfen Sonic Pi’yi düşünüyordum ve birkaç çevrimiçi video izledim.
Birkaç yıl önce biraz kurcalamıştım sadece; o zaman klasik Old MacDonald ve Hot Cross Buns gibi parçaları denemiştim.
Müzik programlamaya başka yaklaşımlar merak ediyorsanız, live olmasa da Python için scamp[0] da bakmaya değer.
Yaratıcısı YouTube’a bununla yaptığı çalışmaların çok sayıda videosunu koydu; örneğin Fourier Elise videosu[1] var.
[0] http://scamp.marcevanstein.com/
[1] https://www.youtube.com/watch?v=zq32bIud3OM
HTML yorumları çalışmıyor gibi. Editör
--şeklindeki iki tireyi tek bir em dash olan—karakterine çevirmiş sanırım.En sevdiğim Sonic Pi live coder’ı alsoknownasrox’u da öneririm.
https://www.youtube.com/watch?v=wXIvXrBQFkE