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);
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.