Bir bilgisayar mühendisi için programlama dili, öğrendiklerini sınadığı, deneyler yaptığı bir laboratuardır ve mühendisler deneylerini, kestiremedikleri sonuçları gözlemlemek için değil, öngördükleri sonuçları doğrulamak için yapar...

Ses Frekanslarını Müzik Notalarının Frekanslarına Yuvarlama

Herhangi bir frekans değerini, 12-tonlu müzikal ölçeğe uygun bir frekans değerine yuvarlama

Dün bir arkadaşım sordu; "Hedefin para kazanmak da değilse, neden yazıyorsun?" Bazen gün sonlarında ya da hafta sonları, gündelik ya da mesleki problemlerden / çarpıklıklardan sıkılıp kafamı meşgul edebileceğim farklı problemler aramaya başlıyorum. Son zamanlarda yazdığım bir uygulama ve uygulamanın içinde çözüme kavuşturmam gereken aşağıdaki basit problem de bu arayışın birer ürünü sayılır. İnsan bir yerden sonra kendi kontrolünde olmayan çarpıklıklardan o kadar bıkıyor ki, daha sorunsuz, daha "kendi kontrolü altında" birşeylerin peşine düşüyor. Muhtemelen bugüne kadar yazdığım her program ya da uygulamanın bununla uzaktan ya da yakından bir alakası var...

Neyse, problemimiz özetle şöyle; temel ferkansı sürekli değişen bir ses sinyalimiz olsun. Frekanslar olası her değerde olabiliyorken, bu frekansları müzik notalarının frekanslarına yuvarlayarak sesin kulağa hoş gelmesini sağlamaya çalışıyor olalım...

Aslında farklı kültürlerde farklı ölçekler de var ama 12-tonlu ölçek, tonları en uyumlu ölçeklerden biri olduğu için aynı zamanda en çok kullanılan ölçeklerden de biri. 12 tondan 7'si uyumlu iken (do, re, mi, fa, sol, la, si) diğer kalan 5'i uyumsuz tonlar (do#, re#, fa#, sol#, la#). Uyumluluk meselesi de ilginç bir şekilde, oranların rasyonel bir sayıya yakın olup olmadığı ile alakalı. Eğer iki notanın birbirine oranı veya bu oranın harmonik tersi (çarpıldığında 1 oktav aralığa eşit olacak iki oran birbirlerinin harmonik tersidir. Yani x*y=2 iken, x ve y birbirlerinin harmonik tersi olur) 3/2, 4/3 gibi (1,2] aralığında bir rasyonel sayı ise veya bu sayıya yakın bir değerde ise, bu iki notayı uyumlu olarak algılıyoruz.

Ara tonları saymayıp ince do'ları dahil ettiğimizde her 1 oktavlık mesafede, 8 uyumlu nota var. Oktavlar 2 ile çarpıla çarpıla ilerliyor. Her oktavı oransal olarak eşit 12 aralığa bölmek için 2'nin 12. dereceden kökünü çarpan olarak kullanıyoruz. Bu ardışık çarpmayı 12 defa yaptığımızda, kökteki 2, kökten kurtuluyor ve aslında başlangıç frekansını 2 ile çarpmış oluyoruz. (İnsanın frekans algısı böyle. Frekans artışlarını doğrusal olarak algılamıyoruz. Örneğin 200Hz ile 220Hz arasında algıladığımız fark, 220 ile 240 Hz arasında algıladığımız farktan daha büyük. Eğer eşit farklar algılamak istiyorsak, 220'nin 200'ün kaç katı olduğunu bulup, o kadar katını almamız gerekiyor. Yani 220/200=1.1 => 200*1.1=220, 220*1.1=242 Bu durumda ilk artışı 20 Hz yaparsak 200'den itibaren artışlarını eşit olarak algılayacağımız 3 frekans değeri 200, 220 ve 242 Hz olur.)

Şimdi yeterli bilgiye sahibiz, hesaplamaya geçebiliriz. Eşit algılayacağımız araklıklandırmayı yapacak çarpanımız olan 2'nin 12. dereceden köküne a diyelim. f'nin minimum 220 olduğunu varsayarak 12-tonlu ölçeğe uyan i. tona yakın ferkans değeri f'yi şu şekilde yazabiliriz:

a=2^(1/12)=1.0594631
f=220*(a^i)

Bu eşitlikte f artarken i de sürekli artacak. Bizim istediğimiz, f sürekli artarken i'nin ölçeğe uygun aralıklarla kademeli olarak artması. Şimdi yapmamız gereken i'yi bulmak ve daha sonra ondalıklı kısımdan kurtarıp tekrar yerine yazarak yuvarlanmış frekans değerine ulaşmak.

i'yi çekmeye çalışalım:

220*(2^(i/12))=f
i/12=log2(f/220)
i=12*log2(f/220)

Programlama dillerinde hazırdaki fonksiyonlar genelde 2 tabanında değil e tabanında logaritma hesaplıyor:

log2(x)=ln(x)/ln(2)
i=12*ln(f/220)/ln(2)

Bu işlemleri gerçek zamanlı olarak sürekli yapacağımız için sabitleri bir araya getirelim ki tekrar tekrar fazladan işlem yapılması gerekmesin:

i=ln(f/220)*(12/ln(2))
i=ln(f/220)*17.3123404

i'ye ulaştık. Şimdi i'yi kendisinden küçük en büyük tamsayıya yuvarlayıp (ona da i_ diyelim), bir nota frekansı olan f_'yi işlemleri tersine sararak tekrar hesaplayalım:

f_=220*a^(i_)

Böylece herhangi bir f frekansını, 12-tonlu ölçeğe kesinlikle uyan bir f_ frekansına çevirmiş olduk.

Başta bahsettiğim gibi bu 12 ton arasında uyumlu olmayan ara tonlar da var. Ancak aralıklar aritmetik olarak eşit olmadığı için frekansları 12 tona yuvarlamak yerine, uyumsuz tonları eleyip sadece 8 tona yuvarlamak biraz daha problemli. Çünkü bu işlemi, frekans artışlarına doğrusal yanıt verecek şekilde yapmamız gerekiyor ki eleyeceğimiz tonlar, kendilerinden önceki veya sonraki tonun aralığını genişletmesin. Bu da başka bir yazının konusu olsun...

Sayfayı
Yayın tarihi: 10 Ekim 2018 Çarşamba, 22:14
Anahtar kelimeler: müzikal ölçek, sekiz nota, oniki ton, frekansları ölçekleme, frekansları çevirme

Yorum Gönder

 
Yorumunuzu -1. yoruma yanıt olarak gönderiyorsunuz. Yanıtlamayı iptal etmek için buraya tıklayabilirsiniz.

 

Yorumlar

Onaylanmış yorum bulunmuyor.
 
 
Sayfa 37 sorgu ile 0.005 saniyede oluşturuldu.
Atasoy Blog v4 © 2008-2018 Hüseyin Atasoy