İşitsel programlama notları

0
misafir
Bu yazıda işitsel(audio) programlama konusunda yaptığım küçük bir araştırmanın sonuçlarını paylaşmak istiyorum. Yazının sonuna kısa bir Perl betiği ekleyeceğim. Bunun için Perl ustalarından özür diliyorum. Çünkü henüz çok acemisi olduğum bir dil Perl.
Bilindiği gibi ses, bir dalgadır. Sesin tonunu belirleyen özellik ise frekansıdır. Örneğin uluslararası bir standart olarak kabul edilen 440 Hz frekansı La notasına karşılık gelmektedir. Oktav ve frekans arasında ise şöyle bir ilişki vardır: Bir üst oktavdaki bir notanın frekansı, bir alt oktavdaki aynı adlı notanın frekansının iki katıdır. Örneğin standart La'nın bir üst oktavındaki La'nın frekansı 880 Hz, bir alt oktavındaki La'nın frekansı ise 220 Hz'dir.

Bir dalga biçimi oluşturmanın belki de en basit yolu sin() yani sinüs fonksiyonunu kullanmaktır. Demek ki, örneğin standart La sesini bir saniye boyunca tınlatmak için y=sin(x) fonksiyonunu 440 kez tekrarlamamız gerekiyor. Sinüs fonksiyonundaki x değeri programlama dillerinde radyan cinsinden kullanılıyor. Yani bir saniye boyunca tınlayan La sesinin dalgasının x ekseni 440*2*pi uzunluğunda olacak. Burada hemen akla şu sorular geliyor: Peki ama 440*2*pi uzunluğunda bir doğru üzerinde sonsuz tane nokta vardır, bu noktaların hangilerinin değerlerini alacağız? Peki bilgisayar bunun bir saniye sürdüğünü nereden bilecek?

Bu sorular bizi örnekleme(sampling) kavramına getiriyor. Örnekleme bir ses dalgasının belli noktalarından örnek değerler almak anlamına gelir. Sesi kaydeden ve çalan program aynı örnekleme değerini kullandığında aynı sesi çıkarmaları mümkün olur. Örneğin telefon hatlarında iletilen sesin örnekleme oranı(sampling rate) 8000Hz'dir. Yani ses dalgasından saniyede 8000 örnek alınır. CD kalitesi dediğimizde ise 44100 Hz'lik bir örnekleme oranını anlıyoruz. Demek ki 440 kez tekrarlanan y=sin(x) fonksiyonundan 44100 tane örnek değer alırsak, CD kalitesinde bir saniye boyunca tınlayan bir La sesi elde edebiliriz.

Peki ama bu 44100 değeri bir dosyaya nasıl kaydedeceğiz? Kısaca cevap vermem gerekirse, 16 bit little-endian olarak. Sanırım bunları da açıklamak iyi olacak. 16 bitin anlamı, değerin 0 ile 65535 arasına olmasıdır. Sinüs fonksiyonu -1 ile +1 arasında sonuçlar verdiğinden, sonuca önce bir ekleyerek 0 ile 2 arasında değerler elde etmek sonra da sonucu 0 ile 32767 arasında bir sayıyla çarpmak pratik bir çözüm gibi görünüyor. Bu son sayı sesin yüksekliğini yani volümünü belirleyecektir. Little-endian ise dosyadaki baytların sıralaması ile ilgili bir terim. Örneğin elimizdeki değer heksadesimal olarak xABCD ise bunu dosyaya CD AB şeklinde yazarsak little-endian olarak kaydetmiş oluruz.

Peki ama değerleri öylece yazmak yeterli mi? Müzik çalan programlar bunu okuyabilir mi? Evet, değerleri öylece kaydettiğimizde dosyanın formatı RAW adını alıyor. Yani ham veri. WAV dosyalarını çalabilen hemen hemen her program ham veriyi de çalabiliyor. Çünkü ham veri ile WAV dosyası arasındaki fark sadece WAV dosyalarının başında bir kafa(header) bölümü bulunması. Bu kafa bölümünde dosyanın örnekleme oranı ve mono mu yoksa stereo mu olduğu gibi bilgiler bulunuyor. Ancak bu bilgileri komut satırından da vermek mümkün.

Aşağıda bir saniye uzunluğunda La sesinden oluşan bir dosya oluşturan bir Perl betiği var. Hatta betiğin son satırını değiştirerek istediğiniz frekanstaki bir sesi istediğiniz uzunlukta çalabilir, buna yeni sesler de ekleyebilirsiniz. Programı kullanmak için şu komutu verebilirsiniz: "perl -w betik.pl > dosya.raw". Sonra isterseniz bu dosyayı oggenc ile OGG formatına çevirebilirsiniz "oggenc -r -C 1 dosya.raw". Dinlemek içinse: "ogg123 dosya.ogg" komutu yeterli olacaktır. Sesi nasıl açıp kısacağız sorusuna ise şöyle cevap vermek istiyorum: "Use the source, Luke!".

#!/usr/bin/perl -w
use strict;
my $pi=3.1415927;
my $sr=44100;
sub play
        {
        my $i=0;
        my $freq=shift;
        my $dur=shift;
        my $rate=$freq*2*$pi/($sr-1);
        for ($i=0; $i<$sr*$dur; $i++)
                {
                my $sample=int(15000*(sin($i*$rate)+1));
                printf("%c", $sample%256);
                printf("%c", int($sample/256));
                }
        }
play(440,1);

Görüşler

0
Ragnor
Bu özel makale için teşekkürler. Açıkcası bu konuda yazılmış bir türkçe makale hatırlamıyorum.

Oldukça kolay anlaşılır bir makale. Sayenizde hiçbir fikrimin olmadı ama öğrenmek istediğim bu konuya gayet rahat ve zahmetsizce giriş yapmış bulunmaktayım. Sonunda anladım SDL'in sound modülünü, o bile yeter :).

Tekrar teşekkürler.
0
myavuzselim
Tesekkurler. Denemek için soyle birsey yaptim:
sound.py
sound2.py

sound.py ilk basta hafiften bekledigim temiz sesi cikariyor, ama sonra zurna gibi bir ses cikiyor. Acaba bir yanlisim mi var?
0
myavuzselim
Buldum. Volum 65535/4 'u gecince oluyor. Neden acaba?
0
misafir
anladığım kadarıyla ses yüksekliği üzerinde bir fonksiyon ile oynama yapmışsınız. bu dalga biçimini değiştirmiş olabilir. zaten enstrümanlar arasındaki tını farkları da dalga biçimi farklarına bağlıdır. herhalde kazara zurnanın dalga biçimini elde ettiniz. iyi kurcalamalar.
0
myavuzselim
Dalgayi 0-2 arasinda almak yanlis cikti veriyor. Dalganin her iki tarafi da ust tarafta kaliyor. Dalga uzunlugu 65535/4'den buyuk olunca hata vermesinin sebebi de buymus.
Bunu duzelttikten sonra yine de bozuk cikti aliyordum. Meger bir de binmode(STDOUT) yapmak gerekiyormus. Su sekilde duzeldi:

#!/usr/bin/perl -w

use strict;

binmode(STDOUT);

my $pi=3.1415927;

my $sr=44100;

sub play {

    my $i=0;

    my $freq=shift;

    my $dur=shift;

    my $rate=$freq*2*$pi/($sr-1);

    for ($i=0; $i < $sr*$dur; $i++) {

        my $sample=int(32000*sin($i*$rate));

        print chr($sample & 0xff);

        print chr(($sample >> 8) & 0xff);

    }

}

play(440,1);

0
misafir
galiba haklısınız. signed-unsigned int konusunu es geçmişim. kodu düzelttiğiniz için teşekkür ederim.
0
anonim
Eline sağlık....
0
acemi_
Çok güzel bir makale. Hemen bir deneme de ben yapayım.
0
Tarık
Mükemmel bir konu. Programlamanın ülkemizde bahsedilmeyen bir yüzü.

Örneği windoze altında Active State Perl'de denedim "sonsuz bir beep döngüsü yarattı " normal mi ?

0
misafir
bana pek normal gelmedi. acaba döngünün sonundaki kıvırcık parantezi mi unuttunuz? ama windows'dan ve perl'den daha iyi anlayan arkadaşlar cevap verirse daha iyi olur herhalde.
0
simor
Bende de aynısını yaptı. Active state perl yorumlayıcı linuxtakinden farklımı acaba? Linuxta problem yok.
0
simor
Ayrıca çok ilginç; ses benim ses kartımdan değil de, anakarttaki buzzerdan geliyor. Daha da ilginci linuxta aynı kod ile ses kartından duyuyordum sesi.
Sürekli döngüyü tekrarlıyor ve kendi kendine termine ediyor ve konsolu kapatıyor win2k da.

Şimdi bu, crossplatform hikayesinin sadece belli kurallara bağlı olduğunu mu yoksa active state in bu işi beceremediğini mi gösteriyor .?

teşekkürler..
0
Tarık
çok ilginç. şu an linux tada denedim, döngüye girmeden anlamsız 5 adet ses çaldı (buzzer dan) ve ekrana saçma sapan karakterler bastı.
0
misafir
arkadaşlar, eğer farketmediyseniz diye yazıyorum, bu perl betiği sesi doğrudan çalmıyor. bir ses dosyası oluşturuyor. o dosyayı çalmak için başka bir programa ihtiyacınız var. bilgisayarımda windows kurulu olmadığı için bilmiyorum ama büyüktür işareti acaba windows kabuğunda çalışıyor mu? bunu kontrol edin bence.
0
simor
Ah işte ah insan yarı cahil olunca benim gibi en kötüsü oluyor. O kadar da anlattınız. Ben zaten linuxta sizin yazdığınız gibi denediğimde verilen süre kadar 440 hz çalmıştı. Fakat windowsta, kodunuzdaki perl yolunu windowsa göre uyarlayıp direk ikonun üzerine iki kere tıkladım ve command prompt u açıp çaldı (buzzerdan) . Sonra linuxta da ses dosaysı oluşturmadan çalayım dedim ve evet tarık arkadaşın dediği gibi çaldı. :) Çalması gerekiyormu gerkmiyormu bilmiyorum tabi . kusura bakmayın .. teşekkürler.
0
FZ
Ciddi anlamda algoritmik müzik ile ilgilenen arkadaşlar şu iki adrese baksınlar ve oradaki KeyKit ile Common Music linklerini takip etsinler. Birer hazine gizli:

Web sitelerini dinliyorum gözüm kapalı

fluxus: scheme, 3d, müzik, fft, sıradışı bir deneyim…

Emacs ile caz çalmak mümkün mü?

Kitap olarak da "Notes from the Metalevel"i tavsiye ederim, Common Music'i geliştiren ve Stanford'da bilgisayarlı besteleme konusundaki üstadlardan besteci Heinrich K. Taube'nin kitabı.
0
FZ
Burada formatlamak zor olduğu için benim blog ortamına yazdım ve bu bağlamda birkaç Common Music kodu ile örnekler verdim:

İşitsel Programlama, Common Music ve ötesi…

0
misafir
herzamanki gibi ufuk açıcı olan yorumunuz için teşekkürler...
0
wolverine81
tebrikler cok basarili bir mekale
Görüş belirtmek için giriş yapın...

İlgili Yazılar

Linux BIOS - Her Şeyin En İyisine Layıksınız

FZ

LinuxBIOS, makinanızı birkaç saniyede GNU/Linux yüklü olarak açmanın kestirme bir yolundan çok daha fazlasıdır.

LinuxBIOS, GPL lisanslı bir program olup pek çok BIOS´un yerini tutabilecek durumdadır, desteklenen sistemler arasında AMD64, x86, Alpha ve PowerPC sistemler de mevcuttur. LinuxBIOS üreticiden ve mimariden bağımsızdır, %95'i C dili ile yazılmıştır ve 4 yıldır geliştirilmektedir, olgunlaşmış bir yazılımdır. En büyük bilgiişlem kümelerinden tutun gömülü cihazlara dek pek çok sistem tarafından tercih edilmektedir. LinuxBIOS, AMD ve Tyan gibi pek çok üretici tarafından desteklenmetedir. Söz gelimi artık Tyan´dan LinuxBIOS yüklü anakart sipariş edebilirsiniz.

Bu makalede LinuxBIOS´un teknik yapısı ve tarihsel gelişimi detaylı olarak anlatılmaktadır. Sanayi ile işbirliği bağlamında da bir vaka analizi olarak okunabilir. En sıkı korunan endüstriyel, teknik bilgileri bize açmaları için büyük üreticileri nasıl ikna ettiğimize dair bazı dersler çıkarabilirsiniz.

IT uzmanlarının bilgilerini paylaşabilecekleri bir platform

anonim

Stackoverflow ya da experts-exchange gibi yurtdışı kaynakların ülkemizdeki eksikliği genelde forumlarla doldurulmaya çalışılıyor. Ancak çok daha genel amaçlı hazırlanmış olan forum yazılımları ihtiyaca tam cevap veremiyor.

Uzmansorusu.com, puanlama sistemi kullanarak bilgisini diğerleri ile paylaşan üyeleri önplana çıkartarak ödüllendiriyor, sosyal ağlardan alıştığımız "kullanıcı grupları" ile aynı ilgi alanlarını paylaşan kişilerin birbileri ile irtibat halinde olmasına olanak sağlıyor, arşivleme ve detaylı filtreleme özellikleri ile kişiye özgü "bilgi veritabanı" tutmalarını sağlıyor.

PlayOnLinux

ErtanGuven

Uzun yıllar Windows kullandınız. Sonra, bir şeyler oldu. Tıpkı çalışan bir saatin sadece zamanı göstermesini yeterli bulmayıp içini açma ve merakınızı giderme isteği gibi, kullandığınız işletim sisteminin de temellerini incelemek ve kurcalamak istediniz. Bir şekilde GNU/Linux'la tanıştınız ve bunu yapabileceğinizi fark ettiniz. Peki bu nereden temin ediliyor? Nasıl yani? İnternet'ten indirilebiliyor mu, hem de yasal bir biçimde? Çok şaşırdınız. Hemen sisteminize bir Linux dağıtımı kurdunuz. Başlarda alışkanlıklarınızı yenmek biraz zor olabilir, ama buna değecek. Üstelik birçok yerde GNU/Linux'un Windows'tan daha güvenli olduğuna ilişkin yazılar okudunuz. Biraz vakit geçti ve bir karar verdiniz; Windows'u sisteminizden uçuracaksınız ve artık sadece bu GNU/Linux dağıtımıyla yolunuza devam edeceksiniz. Ama bir dakika! Siz aynı zamanda bilgisayar oyunu da oynamayı seven bir kullanıcısınız. Peki, Windows'un o meşhur oyunlarını Linux'ta nasıl oynayacaksınız?

SynthMaster: İlk Türk ses işleme ve efekt yazılımı

FZ

Bilgisayarlar sayesinde dolap büyüklüğündeki ses işleme cihazları küçük yazılımlara dönüştü. Son örnek bir Türk'ün imzasını taşıyor.

Bu alandaki dev oyuncuların yanına, işlev olarak hiçbir eksiği bulunmayan bir isim daha katıldı: SynthMaster. Bülent Bıyıkoğlu adlı bir Türk tarafından 1995 yılında o zamanki bir yazılım yarışmasına katılmak için hazırlanmaya başlanan SynthMaster, 2004 yılından bu yana aktif olarak geliştirilerek tam bir ürün haline getirilmiş. Bıyıkoğlu, 90'lı yıllarda bu yazılım için çalışırken hazırladığı EffectsMaster adlı uygulama sayesinde Kanada'dan bir iş teklifi alarak bu ülkeye taşınma kararı vermiş.

Muhasebeci 0.5 Kullanıma Hazır

qorkem

Uzunca bir süreden beri üzerinde çalıştığımız projemizin 0.5 sürümü nihayet bitmiştir. 0.5 sürümünün bu kadar gecikmesinde projenin baştan sona komple elden geçirilmesi, yeni bölümlerin eklenmesi, daha kolay kullanım olanağı sağlanması gibi sebepler neden olmuştur. Yeni sürüm hazıranırken eski sürümlerdeki pek çok hata giderilmiştir. Sorun yaratan kodlar silinip yeniden yazılmıştır. Stabilite için gerekli görünen herşey yapılmıştır. Daha kolay bir kullanım için fonksiyon tuşları, sağ-tıklama menüleri programın her tarafında rahatlıkla görülebilmektedir.

Diğer detaylar icin burayı ziyaret edebilirsiniz.