BASIC'TE SES KULLANIMI

Gürkaynak Merhabalar. Bir yazı, normal olarak giriş, gelişme ve sonuç bölümlerinden oluşmalıdır. Ne var ki bu ay köşemiz, bu köşeyi yazmak ne zor, af dileme ve asıl yazı kısımlarından oluşuyor. Evet efendim yazıyı hazırlamak zor, bir konuyu mümkünse bir ayda yazıp bitirmemiz gerekiyor. Bu da her ay yani bir konu bulma zorunluluğu getiriyor. Konu anlatılıyor, bir de örnek verilmesi gerekiyor. Ancak bu örneğin Amiga Basic'te çalışması şart, öyle fazla da uzun olmamalı (Yoksa hayat boyu o programı kimse okuyup yazmaz.) En önemlisi çalışmalı. Sözü buraya kadar uzatmamın sebebi bu. Amiga Basic, Microsoft firması tarafından Amiga'ya uyarlanmış bir Basic. Korkarım fazla başarılı olamamışlar. Amiga ile uğraşan bir ekip tarafından yazılmamış olması, bu kullanışsız olmasının temel sebeplerinden biri. Yavaş, kullanışsız olması o kadar değil, ancak bazen insanı yarı yolda da bırakabiliyor (Aynı şey PC Basic'lerinde de söz konusu). Düşünün her şeyi tasarlıyor, hesaplıyorsunuz, el kitabından fonksiyonların nasıl kullanılacaklarını bulup programı hazırlıyorsunuz, o da ne, program isteneni etmiyor. İlk olarak programda kendi hatalarınızı aramak durumundasınız. Ancak buna rağmen hatalı programlar olacaktır. Bu ne yapmalı, size en temiz çözümü önereyim (İnsan ruh sağlığı açısından); bu programı bir süre unutmak. Bir zaman sonra yeniden, ama başka bir teknikle aynı program üzerinde çalışmaya başlarsınız. Aslında size bu ay sevimli bir oyunum olacaktı, ancak (ancağı mancağı yok işte, beceremedik) yukarıda belirttiğim sendroma düştüm. Diyeceksiniz ki, bu kadar kötüledin bu dili, niye bu dille ilgili örnek veriyorsun? Çünkü Basic, şirketten de insanı programcılığa alıştıran en basit dil. Göstermek istiyorum ki bu kadar basit bir dille bile oldukça sevimli ve kullanışlı işler çıkarabiliriz. Her ne ise, artık yazımızın harbi kısmına başlayabiliriz. Madem bu ay oyun yazmayacağız, başka bir konu arama girişimlerine başladım. Daha önce de bazı alıntılar yaptığım Amir R. Amir'in Profesyoneller için Basic (Orjinali Almanca) kitabından ilginç bir program örneği buldum. Bu ay Amiga ile ses yapacağız. Hemen üzülmeyin lütfen, Sound emri ile fazla ilgilenmeyeceğiz: Biz daha çok Soundtracker, Noistracker gibi programların kullandığı örneklenmiş sesleri kullanacağız. Sadece kullanmakla kalmayıp, bu işlerin neyini, nasılı da mele ya Umarım herkes mutludur. İşin sıkıcı fizik kısmı şu: Ses aslında bir titreşimden ibarettir. Bir titreşimin ses açısından önemli iki parametresi vardır. Bunlardan ilki genliktir. Salınım'ın diyebileceğimiz bu değer, sesin volumünü belirler (yani sesin ne kadar sesli olduğunu). İkinci parametre ise frekans adını alır ve saniyede oluşan titreşim sayısına eşittir, birimi ise Hertz'tir (Hz). İnsan kulağı 20 ile 20.000 arasındaki titreşimleri ses olarak algılayabilir. Kısaca ses dediğimiz, bu 20 ile 20.000 Hz arasındaki titreşimlerden ibarettir. Peki bizim sevgili bilgisayarımız sesi nasıl üretebilir? Ses sesler kullanır. Örneklemek demek, bir sesin genliğini belirli aralıklarla kaydetmek demektir. Eğer siz bu örneklenen sesi aynı hızla geri verirseniz ve yeteri kadar sıklıkla örnekler orijinal sese çok yakın sesler elde edersiniz. Amiga bu örnek ses değerleri için 8 bit kullanır. Yani bir andaki örnek ses değeri 0 ile 255 arası bir değer alır (Mesela Compact diskler 16 bit ile çalışırlar ve her örnekleri 0 ile 65535 arasında bir değer alır, dolayısı ile ses kalitesi çok daha olur.). Şimdi basit bir aritmetik kullanalım. Diyelim ki saniyede 10000 örnek almak istiyoruz, 10 saniyelik bir kayıt için 100 Kbyte'a yakın hafıza gerekir. Örnek sayısı düşerse, bu defa sesin anlaşılırlığı Peki bu 10000 örnek/sn'lik sesi biz daha yavaş çalarsak, yavaşlatılmış plak gibi ses bas- Hızlandırırsak da fare sesi gibi incelir. le diyeyim helal olsun, bayağı bir teori kazandınız. Artık ses olayı nedir biliyor Gelelim biraz ne yapabileceklerimize, ses örneklemek bizim konumuz değil. Eğer bir Sound varsa, istediğiniz her sesi alabilirsiniz; şayet yoksa, piyasada bol miktarda örneklenmiş ses mevcut, bunları kullanabilirsiniz. Mutlaka duyanlarınız olmuştur, Amiga'nın en önemli yapı taşları özel olarak geliştirilen entegreleridir. Agnus, Denise ve Paula adı altındaki bu üç temel entegre Amiga'nın başarısında büyük sahibidir. Bu üçlü'nün yaptığı en önemli olay, 68000'den bağımsız olarak hafızaya erişebilmek (DMA, Direct Access) ve ses, disket çıkışlarını kontrol etmektir. Ne var ki bu entegreler, hafızanın her yerine doğrudan ulaşamazlar. Ancak Chip Memory adı verilen e hareket edebilirler. Bu üç entegreye ne yapacaklarını söylemek mümkün. Bunların çalışmalarını kontrol eden bir hafıza bölgesi var, bu sabit hafıza bölgesine Poke yardımı ile bazı emirler yazmak olası (Daha önce de belirtmiştim, Amiga'da $4 dışındaki adresleri sabit kabul etmel YANLI: Bu yaptığımız YANLIŞ, ancak çalıştığı sürece mesele yok!). Bakalım bizlere ses için neler lazım ? 1. Chip RAM'da bulunan ve sesi oluşturan byte dizisi 2. Bu dizinin ne uzunlukta olduğu 3. Bu sesin volumünün değeri (Kısık sesli, son ses) 4. Bu dizinin ne hızla çalınacağı, Bu kadar basit. Yapmamız gerekenleri de özetleyelim: 1, Disketten veya RAM:'dan ses datasını yüklememiz lazım. Bu datayı muhakkak Chip RAM'a kopyalamalıyız, kopyaladığımız yerin başını bilmeliyiz. 2. Yüklenen ses datasının uzunluğunu öğrenmeli 3. Sesi hangi hız ve volümde çalacağımızı belirtmeli 4. Tüm bu bilgileri Kontrol register'larına yüklemeli ve sonra sesi çaldırtmalıyız. Artık işi çıkarıp yavaş Be inle dökme zamanı geldi. İlk ihtiyacınız olan DMA Register'ları ve adresleri olacaktır. Amiga'nın 4 adet ses kanalı olduğundan, tüm register'lardan dörder adet mevcuttur. Bu sayede dört farklı sesi farklı özelliklerle mümkün. AUDXLCH : x numaralı ses kanalına gönderilecek datanın başlangıç adresi buraya LONG olarak (POKEW emri ile) yazılmalı; AUDXLEN : x numaralı kanalda çalınan sesin uzunluğu, WORD olarak WORD cinsinden yazılmalıdır. Bildiğiniz gibi iki byte bir word edecektir, dolayısı ile dosya yarısı bu değeri size verir. Dikkat ederseniz, buraya uzunluk WORD olarak girilecektir. Bu yüzden bir kanaldan çalabileceğiniz en uzun ses, 131070 byte'çık olacaktır. Bu uzunlukta ses sizi tatmin etmeli, yok yetmediyse bunu le ve yolu var, ancak konu dışına taşmadan bu kadarı ile yetinelim. AUDXxVOL : x numaralı kanalın ses yükseklik (Volüm) değeri, Bu değer 0 ile 64 arasında bir sayı olmalı ve WORD olarak ile) yazılmalıdır. 0 ile sesin duyulmamasını 64 ile son ses çıkmasını sağlayabilirsiniz. AUDXPER : x numaralı kanaldaki sesin çalınma hızını belirler, maalesef burada Hz cinsinden hızı belirlemek mümkün değil. Bu sayı WORD olarak girilmeli, dolayısıyla teorik maksimum 65535, ancak 1000 değeri neredeyse her sample için çok yavaş ve 1 değeri de en hızlı kaçıyor, kısacası bu sayıyı 1 ile 1000 arasında tutmalısınız. DMACON: Bu register'a yazarak istenen ses kanalını açıp kapatmak mümkün. Buraya aç 1 0 numaralı kanalı kapa 32770 1 numaralı kanalı aç 1 numaralı kanalı kapa 32772 2. numaralı kanalı aç

4 2 numaralı kanalı kapa â 3 numaralı kanalı kapa 382776 3 numaralı kanalı

DMACON'un adresi ise HEX DFF096 veya Türkçe 14676118 (14 676 118). Buraya da POKEW komutu ile erişeceğiz. 0 numaralı kanalı açabilmek için, POKEW 14676118&,32769& ve sonra yeterince dinledikten sonra POKEW ile de kanalı kapayacağız. Belirtmeme gerek yok bu emri kullanmadan önce diğer register'larda mantıklı değerler olması şart. İşte öbür yi listesi ADI. HEXADRES Decimal Adres AUDOLCH 14676128 AUDILCH DEFOBO 14676144 AUD2LCH DEFOCO 14676160 AUD3LCH DFFODO 14676176

DEFOA4A 14676132
AÜUDİLEN DFEFOB4 14676148
AÜDZLEN DEFOC4 14676164
AUD3LEN DFFOD4 14676180
AUDOVOL 14676136
AUDIVOL DEFOB8 14676152
AUD2VOL DEFOC8 14676168
AUD3VOL DFFOD8 14676184
AUDOPER 14676134
AÜDIPER DEFOB6 14676150
AÜD2PER DEFOC6 14676166
AUD3PER 14676182

Not olarak belirteyim, bu sayıların hepsini elle yazdım, ancak çifter çifter yazıldıkları ve aralarında sıkı ilişki olduğundan, olası hataları yok edebilirsiniz. Artık en büyük insan sizsiniz, rahatça istenen bir sesi çalabilirsiniz. Yok hemen acele etmeyin, bir iki ufak sorunumuz var, Bunların ilki, sesi yüklemek. Aklınıza gelebilecek en basit çözüm OPEN ile dosyayı byte byte okuyup hafızaya hall olacaktır. Ne var ki DIM ile açabileceğiniz hafıza, CHIP MEMORY olmayabilecektir. Dolayısı ile kendinize belirli bir uzunlukta CHIP hafıza ayırmak zorundasınız. Takıldık mı, hayır ancak Library kullanmak zorundayız. Madem Library ile başladık devam da edebiliriz ve Librarylerin OPEN ve READ fonksiyonlarını kullanabiliriz. (Basic'in kendi OPEN ve READ'i ile karışmasın diye bu fonksiyonlar XOPEN ve XREAD olarak adlandırılacak). Library fonksiyonlarına ilişkin genel sorunlara örneğin arkasından değineceğim.

DECLARE FUNCTİON AllocRemember& LİBRARY
DECLARE FUNCTİON xOpen& LİBRARY
DECLARE FUNCTİON xRead& LİBRARY
LIBRARY "dht
li rary”
ad$
OPEN ad$ FOR İNPUT AS 1
boyâ& - LOF(1)
CLOSE 1
RAMtipi > 2 4
Remember& - 0
tir bel VARPTR (Remember&)
Mem& z AllocRemember (RememberKey&,boy&,RAMtipi)
1F THEN FreeRemember&RememberKey,-1:END
Handle& xOpen& (SADD(ad$),1005)
İF Handle& < Ö then sor
Lengthâ& — xRead& (Handle&,Mem&,boyâ)
xClose& Handle&
POKEL 14676128&,Mem&  :REM Datanın yeri
POKEW 14676132&,boy&/2 :REM Word olarak uzunluk
POKEW 14676136&,64 — :REM Son ses
POKEW 146761348&,250 :REM Çalış hizi
POKEW 14676118&,32769& : REM Artik ses var
WHİLE INKEY$ : WEND
REM buralarda istediginiz degisikligi yapın !!!!
son:
POKEW 14676118&,1 — : REM Yeter artık
FreeRemember&,RememberKey&,-i
AM CLOSE

Evet, ben yazabildiğime göre, siz de haydi haydi yazabilirsiniz. Ses konusundaki kontrol sizi hiç şaşırtmamış olmalı, DMA çalışırken ses sürekli tekrar edecektir. Bu arada istediğiniz değişikliği yapabilme şansına sahipsiniz. Mesela ile çalışma hızını ayarlayabilirsiniz. Kanallar arası parametrelerde 16 fark olduğunu düşünerek kolayca tüm kanalları çalan programlar geliştirebilirsiniz. Mesela kanal 0 ve kanal 3 olmak üzere: POKEW 14676134, 4 kanal*16, hız ile ayarlanabilir. Aynı zamanda tüm ses hazır hafızada iken bu sesin neye benzediğini görebilmek için bunu ekrana bastırabilirsiniz. Hatta basit bir editör bile tasarlayabilirsiniz. Programın en başında dosya uzunluğunu bilmek için sesi bir dosya gibi açıyor ve LOF fonksiyonu ile uzunluğunu öğreniyoruz. Daha sonra AllocMem Library fonksiyonu ile kendimize CHIP hafıza ayırıyoruz. Daha sonra ses Chip RAM'a dos Library komutlarınca kopyalanıyor. Bu bölüm orijinal örnekte olduğu için aldım. İsterseniz dosyadan teker teker okuyup POKE emri ile Mem adını alan sırayla yazabilirsiniz. Ancak örnekteki çözüm hem pratik, hem de oldukça hızlı. Sonra ise biraz önce üzerinde durduğumuz DMA kontrol register'ları geliyor. Daha önceki bazı örnek programlarda da Library kullanmıştım. Bunun ne gibi sorunlar yarattığının farkındayım, ancak iyi bir şeyler yapabilmek için bazı fe-

* dakarlıklar gerekiyor. Bu Library komutlarını bir kere kullanmaya alışınca, size getirdiği rahatlıktan son mutlu olacaksınız, bunun yanısıra başka bir dile uyum sağlamanız kolaylaşacak. Her şeyden önemlisi daha önceden yapamayacağınızı düşündüğünüz birçok şeyi yapabilme şansı bulabileceksiniz. Bir kere daha bu library kullanımı için gereken bmap dosyalarını anlatıyorum; Basic library'lerle iletişim kurmak için bazı ara dosyalara gerek duyuyor. Bu dosyalara bmap dosyaları deniyor ve sonları .bmap ile bitiyor. Örneğin verilen hik dh i:user/basic/bmaps directory'sinde (bu benim bilgisayarım için geçerli) dos library'sine ait dos.bmap isimli bir dosya bulunuyor. Ancak programı LIBRARY emrinin içine "...dos.library" şeklinde belirtiliyor. Bence de kullanım saçma, ancak Microsoft öyle öngörmüş, ne Peki bu bmap dosyalarını nereden bulabilirsiniz?, Çok basit, Amiga'yı aldığınız zaman size iki adet disket verilecektir. Bunlardan ilki Workbench ikincisi ise Basic/Extras disketidir. Bu ikinci Basic/Extras disketinin BasicDemos isimli bir içinde bu bmap dosyalarından en önemlileri mevcuttur. Olmasa bile bu directory içinde mutlaka ConvertFD isimli bir program bulunur. Bu program ile bmap dosyaları oluşturulabilir. ConvertFD programı, FD formatındaki dosyaları kullanılabilir bmap dosyalarına çevirecektir, FD dosyaları yine bu diskette FD1.3 directory'sinde (veya benzer bir directory'de) bulmanız mümkün. Bunlara rağmen yine dergi ile aldığınız PD disketlerine en yakın zamanda bu dosyaları eklemeye çalışacağım söz (Yine sorun çıkarsa her zaman dergiyi arayıp, not bırakabilirsiniz!!!), » Son olarak yine biraz ses üzerinde durmak istiyorum. Eğer programı çalıştırırsanız göreceksiniz, ses sürekli çalınacaktır. Eğer örneklenen ses bir enstrümansa bu pek hoş olmayacaktır, ancak bir ritm veya bir ölçü melodi tam olarak örneklenebilir. Bu sürekli alındığında son derece güzel sonuç verir. Mesela 'orts of en başında isim girerken çıkan müzik, bu türde hazırlanmıştır Sadece bir nota çalabilmek için sesin nerede bittiğini beklemek ve durdurmak gerekir. Ne var ki bu tür iyi bir zamanlama yapabilmek için Basic yetersiz kalmaktadır. Uğraşarak belirli sesler için tatmin edici sonuçlar verecek olan bir iki yöntem bulmanız olası. Kendinize bir editör yaparak kısa sample'ları kendinizde oluşturabilirsiniz. Sadece ses şekillerini görebilmek için ekrana bastırmakta oldukça basit ve etkili bir fikir. Hele bir sampleriniz varsa, kendinize basit bir ses işleme programı bile tasarlayabilirsiniz. Sor olarak bazı ses formatlarına değinmek istiyorum. Programımız, RAW adı verilen ve sadece ses datasından oluşan sesleri çalar. Aslında İFF standardında bir örneklenmiş ses standardı mevcuttur. 8SVX isimli bu standarttaki sesleri, SONİX türü Beden kullanır. Bu DEVİCES & AUTO- (1-63)'te bulabilirsiniz. Yazılarımın işinize yaradığını ümit ediyorum (Heyy burayı okuyan vaaaaar mı ?????), bir dahaki sefere dek Herkese başarılar ve mutluluklar.