Basic Ses Dünyası
Retro bilgisayarCommodore sahipleri araçlarının ses ve müzik yeteneklerinin ne kadar zengin olduğunu bazen unutuyorlar. C-64 ile yapılan başlangıç hâlâ etkileyiciliğini sürdürüyor ve C-128 bize altı ses verebilecek yeni bir SID çipine sahip olmamakla birlikte sesle çalışmayı çok daha fazla kolaylaştıran BASIC ses ve müzik komutlarına sahip.
SID'E BAŞLANGIÇ
C-64 ile iyi müzik yapmak için SID çipi hakkında her şeyi bilmenize gerek yok. Ama biraz ön bilgi deneylerinizin doğru yönde gitmesini sağlayacaktır. C-64'teki tüm sesler MOS6581(SID) tarafından üretilir. (ses arabirim aracı) Bu cihazın aynı anda üç ses çıkartma yeteneği vardır. SID kütük denilen belirli bellek yerlerine değişik değerler (tüm baytlar ya da bir baytta tek bir bit) yerleştirerek üretilir. C-64'te bu değerleri kendiniz yerleştirmeniz gerekir. Bunun için bir makine dili programından bellek-depolama işlemleri kullanmak ya da BASIC'ten POKE komutları almak gerekir. C-128'in BASIC 7.0 konumunda SOUND, ENVELOPE, VOLUME ve PLAY komutları bu poke'ları otomatik olarak yapar ve bazı karmaşık ses etkileri kolayca elde edilir. Bununla birlikte Bank 15'te kaldığınız sürece C-64 stili ses yaratabilirsiniz. Yani C-64'te sesle ilgili öğrendiğiniz hiçbir şey C-128'de boşa gitmez. C-64 Programcının El Kitabında, C-128 kılavuzunda SID çipinin ayrıntılı bir betimlemesi vardır. C-64 kılavuzunda verilen bilgiler daha ayrıntılı.
SESLERİN ÖZELLİKLERİ
Bir notanın frekansı onun dalga formundaki her saniyedeki titreşim (cycle) sayısıdır. Bu notanın tiz ya da bas olmasını belirler. Yüksek frekanslı bir ses düşük frekanslıya göre daha şiddetlidir. SID'in üç sesinin herbirinin pitch'i iki byte'lık kütüğe değerler POKE edilerek belirlenir. 6502 programcılarının alışık olduğu düşük byte, yüksek byte stilinde. İki byte kullanmak gereklidir çünkü her byte'ta 0-255 arasında değerler bulunur, oysa frekans binlere kadar yükselebilir. Yüksek byte kütüğünde depolanan değer 256 ile çarpılır (Yük. Frek.) ve düşük byte kütüğündekilere eklenir. 440 sayısını frekans kütüklerinde depolamak için 1'i yüksek byte'a POKE edip 184'ü de düşük byte'a POKE etmelisiniz. Ne yazık ki bu değerler gerçek frekanslara tekabül etmez. Bir SID frekans kütüğüne POKE edilmiş 440 sn/titreşimlik bir Hertz A notası çıkartmaz. Bu nedenle C-64 ve C-128 program kılavuzlarına kullanabileceğiniz frekans çevirme tabloları eklenmiştir. ARMONİK
440 Hz'lik bir notanın 440 Hz'lik bir temel frekans olduğunu söylüyoruz. Bu frekansa ilk armonik de denir, çünkü sesin en önemli öğesidir. En saf sinüs dalgası jeneratörleri dışında her aygıtta ekstra armonikler de duyarsınız. 800 frekanslık ana armoniğin iki katı olan ve 1200 frekanslık üç katı olan armonikler gibi. Armoniklerin frekansı arttıkça güçleri de azalır. İşin doğrusu çoğunlukla ana frekans dışındaki frekansların farkına armonikleri çıkartana ve sesin ne denli ince olduğunun farkına varıncaya kadar varmazsınız. Armonikler bir notanın klarnet, keman ya da trompette farklı duyulması nedenlerinden biridir.
DALGA BİÇİMLERİ
Commodore SID çipinin üretebildiği dört dalga biçiminin üçünü üretebilmek için değişik matematiksel armonik kombinasyonları kullanılmıştır: Kare, üçgen ve testere dişidir bu biçimler. Dördüncü dalga biçimi olan parazit (noise) matematiksel olarak önceden kestirilemeyecek sesler üretmek üzere tasarlanmıştır. Her saniye bir titreşimlik bir frekansla kulaklarınıza gelen bir ses olduğunu düşünün. Bu ses gerçekte duyulmak için çok alçak ama dalga biçimlerini gözümüzde canlandırmakta yararlı olacaktır. Ses dalgasının sağ kulağınıza çarptığını düşünün. Hemen kulak zarını sola iter, yarım saniye bekler sonra da kalan yarım saniyede zar yerine döner. Bu “kare dalga” biçiminin grafik tasarımı şöyle görünebilir.
Şekil 1- Kare Dalga Biçiminin grafik gösterimi.
Bu teorik olarak mükemmel bir dalga biçimidir. Kulak zarınızın ve moleküllerin özellikleri gerçek bir mükemmel dalga biçimini olanaksız kılar. Şimdi kulağınıza ses dalgasının çarptığını düşünün. Yavaş yavaş ve eşit olarak kulak zarınızı yarım saniye için sola iter, sonra da zar yavaş yavaş yerine döner. Bu dalga biçiminin grafik tasarımı üçgen adını alır çünkü şöyle görünür:
Şekil 2- Üçgen Dalga Biçimi.
Şimdi de ses dalgasının kulağınıza çarpıp yavaş yavaş ve eşit olarak kulak zarınızı bir saniye için sola ittiğini düşünün. Sonra hemen onu serbest bırakır. Bu dalga biçiminin grafik tasarımı “testere” olarak adlandırılır:
KA AŞ AA
Şekil 3- Testere Dişi Dalga Biçimi.
Son olarak ses dalgasının kulağınıza tamamıyla rastgele çarptığını düşünün. Bu dalga biçimi de şöyle görünebilir:
Şekil 4- Parazit Dalga Biçimi.
Döküm-1'deki C-64 programı bu biçimlerin her birinin nasıl olduğunu gösterir. Bu programı bir C-128'le de çalıştırabilirsiniz ama ondan önce bir BANK 15 komutu vermeyi unutmayın. (Şimdi bütün PEEK ve POKE komutlarının ne olduğunu anlayamamaktan ötürü moraliniz bozulmasın. Onları daha sonra açıklayacağım.)
i
883 ETE
VOLÜM
Bir sesin volümü sadece onun yüksekliği, şiddetidir. Testere dişi dalga boyunda bir sesimiz olduğunu düşünelim. Şöyle görünecektir:
Şekil 5- Testere dişi dalga biçimiyle üretilmiş ses.
Aynı nota daha şiddetli olarak şöyle görünürdü:
Şekil 6- Aynı sesin yüksek volümlüsü.
Dalgalar arasındaki uzaklığın her seferinde aynı olduğuna dikkat edin. İki notanın da aynı frekansta olduğunu göreceksiniz. Ama ikinci sesin volümü, şiddeti daha yüksektir.
ENVELOPE
Bir notanın envelopu aynı notanın tonlarının dört değişik parçasını içerir. ATAK ya da notanın azami volüme çıkması için gereken süre; DÜŞÜŞ notanın ortalama düzeyine ne kadar zamanda düştüğü; SÜREKLİLİK o düzeyde ne kadar kaldığı; DAĞILMA da sesin sona ermesi için geçmesi gereken süredir. Bu envelopun nasıl görünebileceğinin grafik bir tasarımını aşağıda veriyorum:
Ül
ATIM rası
Şekil 7- Ses Envelope'unun görünümü,
Bir sesin frekansını gösteren daha önceki şekillerden farklı olarak bu şekil relatif volümü gösterir, notanın başladığı andan son anına kadar. Eğer ses iki dörtlük bir çekiç sesi ise atak ve düşüş kısımları süreklilik ve dağılma olmaksızın uzardı. Çünkü çekiç ve iki dörtlük ses uyumlu değildir. Kemanın tellerine yay sürüldüğünde atak daha naziktir, düşüş yoktur ve yayın hareketi durana kadar süreklilik devam eder. Döküm-3 atak, düşüş, süreklilik ve dağılma oranlarıyla oynamakta kullanılan bir C-64 programıdır. Şekil 8'deki değerleri deneyin ve farklı sonuçları dikkate alın. Atak için bir negatif satır görünceye kadar program RUN etmeye devam edecektir. C-128'de atak, düşüş, süreklilik ve dağılmaları ayarlamak ve dalga biçimi seçmek için bir Envelope komutu vardır. Ne yazık ki bu komutla oluşturulan enveloplar C-128'lerin ses ko-
MEHMET ULUSEL komutu ile çalışmaz. Onları sadece PLAY komutu ile kullanabilirsiniz. Kendi zarflarınızı tasarlatmanın yanısıra C-128'de PLAY komutuyla kullanmak için on tane önceden tanımlanmış envelope vardır. Sesleri değişik müzik aletleri gibi duyulur. ENVELOPE komutunu verilen hazır envelopları yeniden tanımlamak için kullanabilirsiniz. Format şöyledir: (ENVELOPE sayı, atak, düşüş, süreklilik, dalga biçimi, sinüs genişliği) Sayı değiştirmek istediğiniz envelope sayısıdır (0-9). Atak, düşüş, süreklilik ve 0 ile 15 arasındaki değerlere sahiptir. Dalga biçimi 0 ile 3 arasında değişir. FİLTRELER
SID istediğiniz sesi elde edebilmeniz için bir sesin belirli frekanslarını çıkartmak üzere filtre kullanabilir. Üç çeşit filtre vardır: Alçak Filtre, Yüksek Filtre ve Band Filtresi. Bunları kullanabilmek için frekans kesinti noktalarını bulmalısınız. Bir filtre bu noktanın altındaki her frekansı geçirir, düşük armonileri duyarsınız. Yüksek filtre kesinti noktası üzerindeki frekansları geçirir, yüksek armonileri duyarsınız. Band filtresi ile istediğiniz frekanslar aralarına gelecek biçimde alçak ve yüksek kesinti noktalarını ayarlayabilirsiniz. Filtreler hakkında daha fazla bilgi edinmek için C-64 Programcının El Kitabı'ndaki filtre bölümüne ve C-128 Kullanma Kılavuzu'ndaki filtre komutu açıklamasına bakın.
SES YARATMAK
SID chipinden gelen sesleri yirmidört byte kontrol eder. Bunlar bu yazıdaki tüm örneklerinde SD değişkeninin set edildiği 54272 bellek adresinde başlarlar. Bu baytların tanımladığı parametreler tablo 1'de gösterilmiştir. SID Kontrol eden baytlar hakkında daha ayrıntılı bilgi için C-64 Programcının El Kitabı'ndaki bellek haritası bölümüne bakın.
Ses 1 kontrol kütüğü ve Volüm ve Filtre kontrol kütükleri en çok kafa karıştırıcı olanlar, çünkü SID'i baytlar yerine tek tek bitler kontrol eder. Bu konuda bir nutuğun sırası değil ama bir parça sözünü etmek de gerekli. Geleneksel onluk sayı sistemimiz on rakam kullanır, 0-9 ve bir sayıdaki her rakamın gerçek değeri sayı içindeki yerine göre değişir. Onlar, yüzler, binler gibi. İkinin üsleri üzerine rakam vardır: 0 ve 1. Bilgisayarlarda bu sistemi kullanıyoruz çünkü 0 “kapalı” 1 “açığı” temsil edebilir, bu da elektronik devrelere çok iyi uyar. Her byte sekiz bitten oluşur. Her bit “yer değerinin” sayıda kullanılmış olup olmadığına bağlı olarak 1 ya da 0(kapalı)'dır. Şekil 9'da 10010011 ikilik sayısındaki her bitin onluk değeri gösterilmektedir. Açık olanları toplarsak 128+16+4+2+1=147. O halde ikilik sistemdeki 147'ye eşittir. Şimdi bitler üzerine bilgi sahibi olmanın neden önemli olduğunu görelim. Tablo 2'de Ses 1 için olan kontrol kütüğünün kontrol ettiği bitlerin bir listesini bulabilirsiniz. Tablo 3'de de Volüm ve Filtre kontrol kütükleri vardır. Basic'te bir biti açıp kapamanın direkt bir yolu yoktur. Bu AND, OR, PEEK ya da POKE komutlarıyla yapılmalıdır. Örneğin kontrol kütüğündeki 5. bitin testere dişli dalga biçimini çıkartmasını istiyorsunuz. İkilik sistemdeki 5. bitin onluk sistemdeki değerinin 32 olduğunu biliyorsunuz. Ama kütüğe sadece bir 32 POKE edemezsiniz 32 ikilik sistemdeki 00100000'dır. Tüm bu sıfırlar açık olmasını istediğiniz bir şeyi kapatabilir. Bu nedenle 5. biti açmak kontrol kütüğündeki değeri PEEK etmeli, o sayı ve 255-32'nin sonucu ile bir AND işlemi yapmalı ve yeni değeri kontrol kütüğüne yeniden POKE etmelisiniz. (Bu size anlaşılır ve anlamlı gelmiyorsa sayıların ikilik eşdeğerlerini kâğıda yazıp yeniden deneyin.)
Şekil 8- Döküm 2'deki değerler.
Atak — 10: Ataka 0: Düşüşe Atak 10: Düşüş— Atak- 15: Düşüşe
Süreklilik - 0: Dağılma 0 Süreklilik - 0: Dağılma 0 süreklilik 10: Dağılma — 10 - 3: Dağılma -3
Tablo 1- SID Kontrol Byte'ları.
Sesi Ses 2 Ses 3 SD Alçak Frekans Alçak Frekans — SD+1 Alçak Frekans SD+8 Yüksek Fr. Yüksek Fr. SD+9 Yüksek Fr. SD+16 Kare dal. alçak — SD+2 Kare dal. alçak — SD+10 Kare dal. alçak SD+17 Kare dal. yüksek — 10 Kare dal. yük. — SD+11 Kare dal. yük. SD+18 Kontrol Kütüğü — SD+4 Kontrol Kütüğü SD+12 Kontrol Kütüğü SD+19 Atak/Düşüş SD+5 Atak/Düşüş — 13 Atak/Düşüş SD+20 Süreklilik/dağıl. — SD+6 Sür./Dağ. SD+14 Sür./Dağ.
SD+21 Filtre kapatma frekansı (düşük nibble) SD+22 Filtre kapatma frekansı (yüksek byte) SD+24 Volüm kontrolü, Filtre kontrolü Not: SD'nin bellek adresi 54272'dir.
lamlı gelmiyorsa sayıların ikilik eşdeğerlerini kâğıda yazıp yeniden deneyin.)
OYUN ZAMANI
Bunların bazılarına aklınız ermediyse endişelenmeyin; başka insanların ses rutinlerindeki değişken değerleriyle oynarken, teoriyi de yavaş yavaş öğrenebilirsiniz. Döküm 3 başlangıç için bir rutin sunmaktadır.
$
HE İ
ARST (12șŘŚš
Siren sesi üreten bir C-64 programı olan döküm üçteki her işlemin anlamını açıklayacağım. Satır 30 tüm SID kütüklerinin, $D424'teki volüm kontrol byte'ı dışındaki her kütük yerine 0 değerini POKE eden bir subrutini çağırarak temizlenmesini garantiler. ($D424'e yapılan POKE'ların BASIC ses programlarındaki bazı can sıkıcı klik seslerinin kökeni olduğunu keşfettim.) Satır 40 ve 50 $D422 ve $D423'e kare dalga biçimini kullanmak için değerler POKE eder. 0 ile 255 arasındaki her değeri $D422'ye; 0 ile 15 arasındaki her değeri de $D423'e POKE edebilirsiniz. Hoşuma giden bir kombinasyon bulana kadar bu sayılarla epeyce oynadım. Satır 60, volümü maksimuma (15)
çıkartır. 15'in ikilik sistemde karşılığı olan 00001111'deki geri kalan sıfırlar istemediğiniz tüm filtre seçeneklerini kapatır. Bu tür POKE'ları doğrudan ve eğer bütün byte'ın tam olarak nasıl olması gerektiğini biliyorsanız, AND ya da OR işlemlerini kütükte olan değerlerle yapabilirsiniz. Satır 80 ses için atak ve düşüşü başlatır. $D425'deki byte'ın üst dört biti ataklarınızı ayarlar (xxxx....) (düşük sayılar daha hızlıdır) ve alttaki dört bit düşüş zamanınızı ayarlar (yine düşük sayılar daha hızlıdır). Bu arada hatırlatalım yarım byte'a nibble denir. Atağı yüksek nibble'a ayarlamak için 0-15 arasında bir değeri alıp, 16 ile çarpmak ve sonucu 0-15 arasındaki düşüş değerinize POKE etmek durumundasınız. Gördüğünüz gibi uzun ve sıkıcı bir işlem. Satır 100'de aynı şeyi $D424 ile süreklilik ve dağılma için yapıyoruz. 110, satır kontrol kütüğünün bit 6'sını $D424'e yerleştirerek kare dalga biçimini seçer. Ben değeri $D424'e OR'lamakla uğraşmadım, çünkü bitlerin geriye kalanlarının sıfıra ayarlı olmasını istiyordum. Not: Sesi açmadan önce dalga biçimi kütüğünü ($D424) ayarlamayı unutmayın. SID çipindeki bir şey onun bu kütüğün içindekilerini
“unutmasına” neden oluyor. Neden bilmiyorum ama bunun olduğunu gördüm. Satır 150 işleri düzenler. SID, kontrol kütüğünün bit 1'i açılıncaya kadar hiç ses çıkartmaz. Bu atak/düşüş/süreklilik devrini başlatmak içindir. Burada $D424'e sadece bir 1 POKE etmemeye dikkat etmem gerekiyordu. Çünkü 110. satırla bit 6'ya bir 0 yerleştirilmişti. Onun için $D424'e 1 POKE ederek elde ettiğim değerle bir OR işlemi gerçekleştirip, sonucu yeniden $D424'e yerleştirdim. (Düzgün çıkması için çözülmesi gereken
Şekil 9- Örnek Byte'ın Dağılımı.
Bit 7 Bit 6 Bit 5 Bit 4 (128) — (64) (32) (16) 1 0 0 1
Bit 3 Bit 2 Bit 1 Bit 0 (8) (4) (2) (1) 0 0 1 1
Bit Kontrolü
Eğer 1 ise 1. sesi açar Eğer 0 ise 1. sesi kapar
Tablo 2- SID'in 1. Sesindeki Kontrol Kütük Değerleri.
0 Eğer 1 ise Atak/Düşüş/Süreklilik devri Eğer 0 ise Dağılma'nın başlaması Eğer 1 ise 1. sesi ve 3. sesi senkronize eder Eğer 1 ise 1. sesi ve 3. sesi modüler olarak bağlar sava
Eğer 1 ise üçgen dalga biçimini seçer Eğer 1 ise testere dişi dalga biçimini seçer Eğer 1 ise kare dalga biçimini seçer Eğer 1 ise parazit dalga biçimini seçer sesler için, bit 1'i POKE $D424, PEEK($D424) AND 254 işlemi ile kapatmak gerekiyor. Programdaki siren sesinin çözülmesi gerekmediğinden bu işleme gerek duymadım.) Kontrol kütüğünün bit 1'i şimdi ayarlanmış olsa bile hâlâ ses yoktur. Çünkü $D422 ve $D423 frekans kütüğündeki değerler hâlâ 0'dır. (0 frekans oldukça sessizdir.) Bu siren rutininde değişir, ses yükselir ve sesi kapat rutininde ses dalar ve durur. Satır 190, frekans düşük byte'ına 1 ve satır 200 frekans yüksek byte'ına değişken bir değer (x) yerleştirir.
Program iki FOR-NEXT döngüsünden her geçişinde, yüksek byte kütüğündeki değer 1'le değişir, bu da tüm frekans değerini 256 ile değiştirmekle aynıdır. (Yüksek byte'ın 256 ile çarpıldığını unutmayın, bu rakam düşük byte'a eklenerek frekans sayısı bulunur.) Satır 210-280 sesi uzatmak için bir düşüş döngüsü kullanır. 1. dökümü yazdıktan sonra SAVE edin. Bu programdaki değişkenlerle oynayarak deneyler yapabilirsiniz. Satır 110'da değişik bir dalga biçimi Sirene bir iki ses2 ve ses3'deki ses kütükleri ayarlanabilir.
DOĞAYA DÖNÜŞ Döküm 4'de C-64 için cırcır böceği sesi çıkartan bir program var. Bu programı kurbağa sesi çıkartan bir programa dönüştürebilirsiniz. Bunun için dökümdeki 130 satırı POKE $D421,20 yapın. Şöyle bir 135. satır ekleyin: 135 :POKE $D424,X 2 ve 160 satırı değiştirin: 160 DT=20: GOSUB 200
Şimdi senaryoyu değiştirelim. Dalga sesine ne dersiniz? Döküm 5 size dalga sesi sunacak. Dalga sesinden sıkılıp havai fişek patlaması duymak istediğinizde 70. satırdaki ATAK değişkenini (A) 3 yapmanız yeterli. Makineli tüfek sesi duymak istiyorsanız 130. satırdaki DÜŞÜŞ döngüsünü kısaltın. Umarım sesler güzeldir. Ve yine umuyorum ki bu yetersiz yazının yardımıyla arkadaşlarınız ve programlarınız için birbirinden güzel sesler üretmeyi başarırsınız.
KUTUK RESET