3 puan yazan GN⁺ 2024-08-11 | 1 yorum | WhatsApp'ta paylaş
  • 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, scale birlikte ele alınabilir ve tekrarlayan pattern’ler ile arpejler kısa biçimde kurulabilir
  • in_thread, ring, flatten, splat operatörü ve with_fx birleş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, release ayarları 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
    • :c4 gibi nota adları, karşılık gelen MIDI koduna denk gelen symbol olarak kullanılır
    • chord(:d3, :maj7) gibi kök nota ve akor yapısı argüman olarak verilerek akor oluşturulabilir
    • play notayı çalar; Ruby’nin sleep fonksiyonuyla birlikte zaman aralıkları kontrol edilir
    • play_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 70 ile BPM’i değiştirir ve varsayılan sinüs dalgası yerine use_synth :pulse ile pulse synthesizer kullanır
  • play :c2, sleep 0.25 tekrar edilerek notalar sırayla çalınabilir; aynı yapı play_pattern_timed [ :c3, :d3, :e3, :g3 ], 0.25 ile daha kısa yazılabilir
  • Kontrol dili Ruby üzerine kurulu olduğundan, fonksiyonlar ve döngülerle pattern’ler soyutlanabilir
    • arpeggiate fonksiyonu kök notayı ve isteğe bağlı minör olup olmadığını alarak yükselen ve alçalan bir pattern oluşturur
    • 4.times dö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 map metodu kök notaya aralıklar ekleyerek nota listesi üretir
  • use_synth_defaults amp: 0.1 gibi synthesizer varsayılan seçenekleri önceden ayarlanabilir; seçenekler doğrudan play veya play_pattern_timed iç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 do bloğu, Sonic Pi’de kodu paralel çalıştırmak için kullanılır
  • Farklı in_thread blokları 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_timed olduğu gibi kabul etmediğinden, flatten ile tek katmanlı diziye açıp kullanmak gerekir
  • Koro gibi üst üste binen sesler üretirken ring(:c5, :e5) ile birden çok nota birlikte gruplanabilir
  • flatten, ring iç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_thread kullanı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.2 bir efekt bloğu oluşturur; sinyal akışı en iç katmandan başlar ve dıştaki efekt zincirine doğru ilerler
  • mix, 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, sustain değeri eklediği için uzun ve kısa akorların süreleri doğrudan ayarlanabilir
  • attack, decay, sustain, release, ses yüksekliğinin zaman içinde nasıl değiştiğini gösteren ADSR envelope’udur
    • attack, 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 gelir
    • decay, 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 gelir
    • sustain, 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 gelir
    • release, 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, sus fonksiyonu nota listesini ve sustain süresini alır, ring(*notes) ile birlikte çalar; sustain ve release değerlerini hesapladıktan sonra sleep sus ile sonraki event’e kadar bekler

live_loop ile Canlı Kodlama

  • live_loop kullanıldığında kod süresiz olarak tekrarlı çalıştırılabilir
  • Sonic Pi, canlı performansı oldukça gözeten bir araçtır; live_loop iç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_thread döngüleri live_loop :some_unique_name biç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_loop dışında tutmak kaynak kullanımı açısından daha ucuzdur
  • Son örnek live_loop :harp ve live_loop :choir yapılarından oluşur
    • :harp döngüsü :square synthesizer ve 0.25 uzunluklu arpej pattern’i kullanır
    • :choir döngüsü :saw synthesizer, sleep 64, with_fx :reverb, mix: 0.75 ve choral_rings fonksiyon ç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

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

  • 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.

    • Doğru, ama Sonic Pi DSL’i doğal dil hissinden çok biraz Lisp’e daha yakın hissettiriyor.
    • Evet, metaprogramlama.
  • 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.

    • Ben de Sam’le tanışmıştım. 2008~2010 civarında Clojure Conj’da sunum yaptıktan sonra birlikte akşam yemeği yemiştik; o zaman da gerçekten iyi biriydi ve sunumu da harikaydı.
  • 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/

    • Yine de bazı açılardan Ruby DSL, niyeti MIDI sekanslarından daha açık ifade ediyor.
      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.
    • Sonic Pi, genel amaçlı bir beste aracından çok algoritmayla yapılan müzik, özellikle de live coding odaklı gibi görünüyor.
      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.
    • Koordinasyonu ve ince motor becerileri zayıf olan müzik teorisyenleri için uygun olabilir.
    • Asıl yazıda da ima edildiği gibi, bunun çoğu pratik kısıtlardan kaynaklanıyor.
      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.

    • İyi yakaladın. Aslında bul/değiştir’i fazla acele çalıştırırken böyle birkaç yeri kaçırmışım XD
  • En sevdiğim Sonic Pi live coder’ı alsoknownasrox’u da öneririm.
    https://www.youtube.com/watch?v=wXIvXrBQFkE