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 veya 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 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ü giriş frekansı doğrusal olarak yükselirken çıkış frekansı, basamakları eşit genişlikte olan bir merdiven gibi kademeli olarak yükselmeli. Eleyeceğimiz tonlar, kendilerinden önceki veya sonraki tonun aralığını genişletmemeli. Bu da başka bir yazının konusu olsun...
Bu terimlere, hesaplamalara uzağım. Ama zevkle okudum. Bu zevke beni çeken ise;kendimce bağlama çalmam ve yeni aldığım orgumun beni dürtmesi olmuştur. En azından (LA/A) notasının 440 Hz olduğunu, insan kulağının 20-20.000 Hz sesleri duyduğunu geç de olsa sayenizde 68 yaşımda öğrendim.! Saygılarımla teşekkürlerimi sunarım...!
merhabalar, hocam çalıştığım firma hiçte bilgi sahibi olmadığım bir alanda benden bir uygulama istedi. Vaktimde çok daraldı. Ses konusunda deneyiminizden dolayı sizi buldum. öksürük tanıma uygulaması geliştirme imkanınız var mı acaba. bir kaç hazır makale de şablonlar ve formüller buldum fakat, daha önce hiç bu alanla ilgilenmemiştim. Mesajıma acil dönüş yapmanızı sabırsızlıkla bekliyorum.
Hızlıca yazılabilecek bir uygulama gibi görünmüyor ve malesef farklı bir şeylerle ilgilenmek için bu aralar pek zamanım yok :(
Hocam makaleniz çok güzel olmuş. Elinize, bilginize sağlık. Devamının heyecanla bekliyoruz. Saygılarımla...