Sonic Pi ile Müzik yaparak Veri yapılarına giriş

nafi durmuş
nafidurmus-blog
Published in
5 min readJun 9, 2020

Sonic Pi ile kod yazarak müzik serisini 8. bölümünde programla dillerinde çok önemli bir yere sahip olan veri yapılarına ufaktan giriş yapacağız ve müziğimizi güzelleştirmeye çalışacağız.

Önceki bölümlere göz atmak için bölüm 1(sonic pi nedir) , bölüm 2 (ses süresi ve genliği ayarlama) , bölüm 3 (örnek melodiler) , bölüm 4 (Rastgele Sayılar Kullanarak Müzik yapmak), bölüm 5 (Biraz Kod Biraz Müzik), bölüm 6 (Müziğe yankı eklemek), bölüm 7 (Çıkan Sesi Kontrol Etme)bölümlere göz atabilirsiniz. Şimdi bu bölüme başlayalım.

1-Listeler(Lists) kullanarak müzik yapalım. Örnek bir kullanım ;

play choose([55, 59, 65])

sleep metodunu kullanmazsak bütün seslerin aynı anda çıktığını fark edersiniz. Örneğin ;

play 55
play 59
play 65

Ana yukarıdaki kod parçası yerine ;

play [55, 59, 65]

Liste şeklinde kullanırsak her şey daha sade ve anlaşılır olur.

Önceki bölümlerde gördüğümüz yardımcı düzenleyicileri(amp , pan gibi) listelerle birlikte kullanabiliriz.

play [52, 55, 59], amp: 0.3

Sayıların karşılık geldiği notaları da kullanabilir.

play [:C, :D, :E]

Çalıştırıp log/kayıt alanına bakarsak aşağıdaki gibi değerleri görebiliriz.

Ayrıca aşağıdaki gibi oktavlı şekilde de kullanabiliriz.(1 bölümde bahsetmiştim.)

play [:C3, :D4, :E5]

Liste kullanmanın en güzel taradı içinden yer alan sadece bir sesi kullanabilmemizdir. Aşağıda net bir şekilde görünmektedir. Sol taraftan itibaren 0–1–2 olarak adlandırmıştır. Programlama 1 den değil 0 dan başlar adlandırma.

# indexes:  0   1   2
[52, 55, 59]

Örnek olarak kullanalım.

puts [52, 55, 59][1]
çalışan nota

Peki bunların yerine sadece akor isimleri ile çağırsak.

play chord(:E3, :minor)

Aşağıdaki sesleri deneyerek farklı sesleri akor cinsinden görebilirsibiz.

  • chord(:E3, :m7)
  • chord(:E3, :minor)
  • chord(:E3, :dim7)
  • chord(:E3, :dom7)

Şimdi sizlerle arpej yapar gibi sesler çıkaracağız. İlk olarak arpejin ne olduğunu merak ediyorsanız aşağıdaki videoya göz atabilirsiniz.

örnek bir arpej gösterimi(teli aşağı yukarı vurmadan sadece çekerek çalmak diyebiliriz)

Deneyelim.

play_pattern chord(:E3, :m7)

Çıkan seslerin videodaki gibi tellerin çekilir gibi olduğunu fark etmişsinizdir. Yukarıda sleep 1(bir şey yazmadığımız için) idi. Şimdi biraz daha düşürelim.

play_pattern_timed chord(:E3, :m7), 0.25

Bekleme daha az olunca daha hızlı ilerliyor.(evet yukarıdaki gibi gösterebiliriz)

play_pattern_timed chord(:E3, :m13), [0.25, 0.5]

Yukarıdaki gibi yaparsak ise 2 tur olacak şekilde farklı aralıklar sesler çıkar. Ya da yukarıdakini yazmak yerine aşağıdaki gibi yazabilirsiniz.

play 52
sleep 0.25
play 55
sleep 0.5
play 59
sleep 0.25
play 62
sleep 0.5
play 66
sleep 0.25
play 69
sleep 0.5
play 73

Hangisi daha anlaşılır. Tabii ki ilk yazdığımız 😄

C3 notası üzerinde biraz çalışalım.

play_pattern_timed scale(:c3, :major), 0.125, release: 0.1

İlk bölümde oktavdan bahsetmiştim hatırladınız mı ?

play_pattern_timed scale(:c3, :major, num_octaves: 3), 0.125, release: 0.1

Deneyelim. major yerine major_pentatonic yazalım.

play_pattern_timed (scale :c3, :major_pentatonic, num_octaves: 3), 0.125, release: 0.1

Ses giderek inceleşiyor.

Önceki bölümlerde rastgele ses üretmeye küçük bir giriş yapmıştık. Bu bölümde öğrendiklerimizle birlikte kullanalım.

use_synth :tb303
loop do
play choose(chord(:E3, :minor)), release: 0.3, cutoff: rrand(60, 120)
sleep 0.25
end

Yukarıdaki kod parçasında :E3 yeri C yazarak deneyelim. Ne kadar da güzel sesler çıkıyor.

Yazının başında listelerden bahsetmiştim. Şimdi listelerin biraz daha kullanımına bakalım.

puts [52, 55, 59][1]

Şu şekilde çalıştırınca 55 değerinin çıktığını görüyoruz. Bunda ses çalmaz. Ses isterseniz puts yerine play yazabilirsiniz.

counter = 0
notes = [52, 55, 59]
counter = (inc counter)
puts notes[counter]

Yukarıda counter ı 0 olarak tanımladık. Sonra 3. satırda inc ile 1 arttırdık ve sonuç olarak 55 değeri dönmüş oldu.

Şimdi ring metoduna bakalım.

puts (ring 52, 55, 59)

ya da

puts [52, 55, 59].ring

Burada bir halka oluşturuyoruz gibi düşünebiliriz. ring metodu ile halka oluşturursak ve liste gibi numaralandırma yaparsak aşağıdaki gibi olur.

puts (ring 52, 55, 59)[0] #=> 52
puts (ring 52, 55, 59)[1] #=> 55
puts (ring 52, 55, 59)[2] #=> 59
puts (ring 52, 55, 59)[3] #=> 52
puts (ring 52, 55, 59)[-1] #=> 59

ring gibi başka metotlara bakalım.

  • range bools knit spread kullanımlarına daha sonra bakacağız.

Devam edelim. puts ile gösteriyorum çalıştırmak için puts yerine play yazmanız yeterli.

puts (ring 10, 20, 30, 40, 50)

Yukarıdaki liste ters çevirmek istersek reverse kullanabiliriz.

puts(ring 10, 20, 30, 40, 50).reverse  #=> (ring 50, 40, 30, 20, 10)

Ya da ilk 2 elemanı kullanmak istesek take(2) kullanabiliriz.

puts (ring 10, 20, 30, 40, 50).take(3)  #=> (ring 10, 20)

Karıştırmak istersek shuffle kullanabiliriz.

(ring 10, 20, 30, 40, 50).shuffle  #=> (ring 40, 30, 10, 50, 20)

Ama sonic pi de olduğumuz için her seferinde aynı değer döner.

Şimdi örnek bir senaryoya bakalım.

  1. (ring 10, 20, 30, 40, 50) -
  2. (ring 10, 20, 30, 40, 50).shuffle - > (ring 40, 30, 10, 50, 20)
  3. (ring 10, 20, 30, 40, 50).shuffle.drop(1)->(ring 30, 10, 50, 40)
  4. (ring 10, 20, 30, 40, 50).shuffle.drop(1).take(3) ->(ring 30, 10, 50)

Yukarıda drop(1) elemanı silmeye yarıyor. Baştan itibaren puts ile çalıştırarak neler olduğunu görebilirsiniz.

Diğer kullanışlı metotlar. Bunlar biraz da kodlama tarafı ama işimi yarayacak.

  • .reverse - ring ile oluşturduğumuz listeyi ters çevirmeye
  • .sort - ring ile oluşturduğumuz listeyi küçükten büyüğe sıralama
  • .shuffle - ring ile oluşturduğumuz listeyi
  • .pick(3) - listeden 3 değer döndürüyor
  • .pick - listeden 1 değer döndürüyor
  • .take(5) - ilk 5 elemanı döndürüyor
  • .drop(3) - ilk 2 elemanı silmek içim kullanıyor
  • .butlast - son elemanı silerek döndürüyor
  • .drop_last(3) - son 3 elemanı silip döndürmeye yarıyor
  • .stretch(2) - listedeki elemanları çiftleyerek döndürüyor.
  • .repeat(3) - listeyi sırayla 3 kere yazarak döndürüyor
  • .mirror - listenin sonuna tersini eklemeye yarıyor
  • .reflect - mirror gibi ama son eleman tek olarak alınıyor.
  • .scale(2) - listedeki elemanları 2 ile çarparak double(ondalıklı) döndürüyor.

Yukarıdaki metotları değiştirerek deneyebilirsiniz. Denemek için aşağıdaki kod parçasında . dan sonraya yukarıdaki metodları deneyerek kullanabilirsiniz.

puts (ring 10, 20, 30, 40, 50).

Yazıyı burada bitiriyorum. Başka bir yazıda görüşmek üzere.

Bu bölümü burada bitiriyorum. Başla bir bölümde görüşmek üzere.

bu yazıyı alkışlayarak beni motive edebilirsiniz.

Bana ulaşabileceğiniz iletişim adresleri,

nafidurmus.com| Twitter | Instagram | Facebook | Medium

Github| Linkedin | Youtube | Mail

Yararlandığım kaynak ;

--

--