SES VE MÜZİK İÇİN DİGİTİZER
Retro bilgisayarBu seferki devremiz, çevreden gelen ses bilgilerini dijitale (bilgisayarın anlayacağı biçime) çevirmeyi amaçlıyor. Donanım gereksinimi, benzeri devrelere göre oldukça az olan bu ayki uygulamamızın bir diğer özelliği de oldukça ekonomik olarak gerçekleştirilebilmesi. Vereceğimiz devre ve kullanım programı (Basic-extension şeklinde) yardımıyla, çevreden gelen birçok ses sinyalini, mesela radyodan, rahat bir biçimde bilgisayarın hafızasına okut-
AYHAN KALAYLIOĞLU manız sağlanıyor. Hafızanın alabileceği ses bilgisi miktarı, kullanılan örnekleme hızına bağlı olarak değişiyor. Kullandığınız örnekleme hızı, aynı zamanda dijitale çevrilen bilginin ses kalitesini de belirliyor. Yüksek bir hız seçerseniz, örneklemenin kalitesi yükseliyor, fakat hafızayı daha süratli harcıyor. Kullanılabilecek tüm RAM bölgesini bu iş için ayırdığınızda, en yüksek hızda 14, en düşük hızda 45 saniye örnekleme yapmanız mümkün
Ses örneği bilgisayarın hafızasına alındığında, bu örnek belirli işlemlerden geçirilip işlenip bilgisayarın ses kanallarından verilebiliyor. RAP, ECHO veya HALL efektlerine benzer efektler elde etmek de mümkün. Bunun için geri verme frekansı ile oynamak veya geri verme hızını değiştirmek veya örneğin geri verilmesi bitmeden tekrar başlatmak gibi teknikler kullanılıyor. Bütün bunları, gerek ufak bir yardımcı BASIC programla, gerek direkt modda elden vereceğiniz komutlarla yapmanız mümkün. Herhalde çoğunuz, tanıtım kısmını burada bitirip, olayın teknik kısmına geçmemizi istiyorsunuz. Peki öyleyse başlıyoruz!.. Speech-Basic, bir adet iki bitlik ses digitizer devresi ve 4 KByte uzunluğunda Basic-extension (Basic'e özel bir konuda bazı özel komutlar eklemek suretiyle daha zengin bir Basic yaratmak) programından oluşuyor. Her ikisinin birlikte uyumlu çalışması sonucunda gerek sesleri gerek müzik parçalarını rahat bir biçimde örneklemeniz ve işlemeniz sağlanıyor. Speech-Basic için kullanabileceğiniz 57.5 KByte'lık maksimum hafıza miktarı yüksek hızdaki örneklemede bile 14 saniye yetiyor. Bu süreyi, ses kalitesinden fedakârlık ederek 45 saniyeye kadar uzatmanız mümkün. En kötü durumda bile ses kalitesi, SAM ses synthesizer programından daha yüksek!
DEVRENİN GERÇEKLEŞTİRİLMESİ
Devreyi epoksi üzerine, Şekil 1'de verdiğimiz yerleşim planıyla kurarsanız hiçbir sorunla karşılaşmazsınız. Plaketi işlemeye üşenen olursa delikli pertinaksta kullanabilir. Plaketin üzerindeki delikler için 0.8 mm'lik bir matkap ucu en uygunudur. 1 kOhm'luk trimmer için delik çapını biraz daha geniş tutmanızı hatırlatalım. İlk önce rezistansları plakete yerleştirin ve lehimleyin. Böylece sıra kondansatörlere gelir. Tantal tipte olanların kutuplarının doğruluğuna dikkat edin. 10 mikrofarad'lık olanın eksi kutbu plaketin dışına, 1 mikrofarad değerinde olanın eksi kutbu ise LM 324 çipine dönük olmalıdır. Trimmeri de yerine yerleştirdikten sonra JOYSTICK port'una girecek olan fişi monte edin ve lehimleyin. Beş kanallı olan kısmının plaketin yukarısında, dört kanallı kısmının plaketin bakırlı tarafında olmasına dikkat edin. Kuvvetli yapıştırıcılar kullanarak, bu montajı biraz daha da sağlamlaştırabilirsiniz. Sıra geldi tel köprüleri yerleştirmeye. Bunlardan ikisi JOYSTICK fişinin, plaket ile irtibatını sağlıyor.
2 köprü" ———” TE 2x1.2Ka | TALSI4 Tel köprü — a LM 324 2 Ses kaynağı ? köprü
2x478n
A 2x18Ka e Ha
ApF
Devre elemanlarının yerleşim planı
Üçüncü tel köprü LM 324 ve 74LS14 çipleri arasında yer alıyor. Dördüncü tel köprü, 1 mikrofaradlık kondansatörün eksi kutbunu, girişin şasesiyle bağlıyor. Sinyal girişi ise çift kanallı bir koaksiyel kablo tarafından yapılıyor. (İki koaksiyel kablonun dışındaki zırhı şaseye bağlıyor.) Herhangi bir stereo ses çıkışını, ses kaynağınız olarak kullanmak için iki seçeneğiniz var. Birincisi yalnızca tek kanalı kullanmak. Bir diğeri ise her iki kanalın ses bilgilerini birleştirmek. Pek tabii ki, bunu stereo çıkışın iki kanalını birbirine kısa devre ederek yapmıyorsunuz. En güvenli yöntem, bu iki ses kaynağının geldiği kanalların üzerine birer 47 nF değerinde kondansatörleri seri olarak eklemek. Böylece, ses kaynağınıza zarar verme olasılığınız ortadan kalkıyor. 47 nF'ların seri olarak yer aldığı yeni ses kaynaklarınızı gönül rahatlığıyla birbirine kısa devre edebilirsiniz. Biraz daha açıklama yapalım isterseniz. Ses kaynağınızın şase çıkışı zaten ortaktır. Onunla ilgilenmeyin. Sizin ilgileneceğiniz, her iki kanalın “canlı” uçlarıdır. Bunların sonrasına 47'şer nanofarad'lık kondansatörler ekleyeceksiniz. Canlı tarafla hiçbir irtibatınız olmayacak yani. Tekli kullanımlar için zaten devre üzerinde bir izolasyon sağlanmış olduğu için araya hiçbir şey bağlamanıza gerek yok. Diyelim ki ses kaynağınızın şasesini tam olarak bulamadınız, böyle durumlarda, çıkışlı bir ses kuvvetlendirici katıyla karşı karşıyasınız demektir. Böyle durumlarda yapılacak ses karıştırma işlemi başka birçok şeyi de karıştırabileceğinden, sadece ve sadece tek kanalı kullanmanızı salık vereceğiz. Dönelim montaj işinde en son kaldığımız yere. Girişin yapılacağı koaksiyel kablonun montajını yapmıştık en son. Şimdi devre üzerinde tek eksik olan şey çiplerin monte edilmesi işlemi. Burada dikkat edilecek işlem LM 324'ün üzerindeki çentiğin ses girişine, diğer iki çipin de tam ters yöne dönük olması gerektiği. Gelelim malzemelerin temin işine. Buradaki malzemeler oldukça bol ve rahat olarak, üstelik de ucuza piyasadan temin edilebiliyor. Şimdilik garanti etmemekle birlikte, Teleteknik bu malzemelerin hepsini bir poşet içinde satışa sunacak. Yer olarak Teleteknik'in Demo-Center binasını kullanacaklar. Poşete baskılı devrenin de dahil olması ve İstanbul dışındakiler için ödemeli gönderilmesi de ihtimaller dahilinde.
Malzeme listemiz aşağıda.
Yarı iletkenler: 1 LM 324 1 74LS14 1 74LS00
Kondansatörler: 1 5.6 nF 1 1 mikrofarad/16V Tantal 1 10 mikrofarad/16V Tantal
Rezistanslar: (Hepsi 1/4 Watt, tolerans)
2 470 Ohm 2 1.2 kOhm 2 18 kOhm 2 22 kOhm
Trimpotlar: 1 1 kOhm (yatık pozisyonda) Diğerleri: 1 Plaket 3 Entegre devre soketi (14 bacaklı) 1 JOYSTICK fişi (9 kanallı) 1 Koaksiyel kablo 1 Ses kaynağına bağlamak için fiş (kullanacağınız ses kaynağına özel ve mono)
ÇALIŞMA PRENSİBİ
Algıladığımız ses, havada oluşan 20 ila 15000 Hertz frekanslı dalgalardır. Bilgisayarın bu dalgaları algılayabilmesi için özellikle bunları bilgisayarın algılayabileceği bir şekle sokmak lazımdır. Havadaki ses dalgalarını algılayan ilk birim bir mikrofondur. Bu ünite, algıladığı hava basınç değişimlerini (sesin başka bir tanımı) çok zayıf elektrik sinyallerine dönüştürür. Digitizer denilen ünitenin görevi ise kesiksiz ve seviyesiz olarak gelen elektrik sinyallerini seviyeli olarak dijitale çevirmektir. Dijital ile analog arasındaki farkı göstermek için Şekil 3'ü yayınladık. Digitizer'ın çözünürlüğü ne kadar yüksekse sinyal o kadar çok seviyeyle temsil edilir. Yani, daha açık olarak belirtirsek ses kalitesi o kadar yüksektir. Tabii bu durumda kullanılacak hafıza miktarı da artacaktır. Bizim devremiz iki bitlik çözünürlüğüyle dört seviyeyi temsil edebiliyor. Bu sayının, bilgisayarın hafıza kapasitesinin kullanımı ile, kulağın istediği ses kalitesi arasındaki dengeyi kurduğu inancındayız. Digitizer devremizi, bir walkman'in, radyo-teyp sisteminin veya müzik setinin kulaklık çıkışına bağlayabilirsiniz. Devreye ulaşan ses sinyali üç adet işlemsel kuvvetlendirici ile dört değişik seviyeye ayrılır ve bu seviyelerle karşılaştırılır. Seviye karşılaştırmalarının temiz birer dijital seviyeyi temsil etmeleri için her işlemsel kuvvetlendiricinin çıkışına birer ters çeviren tetikleyici kapı konulmuştur. Geriye kalan son çipin içindeki mantıksal kapıların görevi, karşılaştırmalar sonunda elde edilen üç adet sinyali iki bitlik dijital bilgi olarak toparlıyor. Bu şekilde dört değeri temsil edebiliyoruz. Aşağıda sırasıyla, her değeri gösteren iki bitlik çıkışları ve karşılaştırmada elde edilen ara değerleri bulacaksınız.
1. değerde bitler:00; 1; karşılaştırma:110 3. değerde bitler:10; karşılaştırma:100 4. değerde bitler:li; karşılaştırma:000
Devremiz oluşturulan bu iki biti 2 numaralı JOYSTICK portunun UP (yukarı) ve DOWN (aşağı) kanallarına gönderiyor. Buradan da bu iki bit saniyede 18000 okunabiliyor. Gelen bilgilerin dördü bir araya getirilip bir Byte olarak paketlenip hafızada saklanıyor. Sesin daha sonra geri verilme işlemi SID çipinin $D418 ($54272 - 54248 = 24) adresli ses şiddeti ayarlama register'ı üzerinden yapılıyor. Söz konusu register'ın bir özelliği, herhangi bir ses kanalı açık olmasa da, buranın değeriyle oynayarak bu register'ı dijitalden analoga çeviren bir ünite olarak kullanabileceğimiz. Ses geri verilirken sadece bilgisayarın ses kanalları kullanıldığından devrenin takılı olmasına gerek yoktur. Yani siz bir sesi kendi sisteminizle örnekleyip başkasına bir program olarak gönderebilirsiniz. O da, digitizer devresi olmamasına rağmen sesi dinleyebilir. Programın sağladığı bir avantaj, elde edilen değişik örnekleme seviyesine karşılık gelecek ses şiddeti değerini (0'dan 15'e kadar) sizin belirlemeniz. En basit kombinasyon tipleri olarak 6 değişik lineer kombinasyonu gösterebiliriz. (Hepsinin 0 olması da dahil, bu durumda geri verilen ses duyulmaz.) Bu lineer kombinasyonlar:
Merhaba
0,0, 0, 0 0,1, 2, 3 0,2, 4, 8 0,3, 6, 9 0,4, 8,12 0, 5,10, 15 olarak gösterilebilir. İsterseniz daha değişik ve lineer olmayan kombinasyonlar da deneyebilirsiniz. Elde edeceğiniz neticeleri beğenmenize bağlı sadece. İsterseniz bu kombinasyonları dinamik (ses geri verilmekte iken) olarak da değiştirebilirsiniz. Böylece demin yukarıda sözünü ettiğimiz HALL ve ECHO efektlerini elde etmeniz daha da kolaylaşır.
İLK SEFER
İlk kaydımızı yapmadan önce donanımımızın bir fonksiyon testi ve basit bir ayar yapmak gerekli. Bunun için önce “Speech-Basic” adlı listing'i MDE ile yazın ve diskette saklayın. Ayar işlemini yapmanız için bir de ufak ayar tornavidasına ihtiyacınız olacak. Bilgisayarınızı kapatıp, digitizer devrenizi JOYSTICK-PORT'a takın. Henüz herhangi bir ses kaynağı bağlamayın. Bilgisayarınızı açıp tüm tuşları kontrol edin. Tüm tuşlar gayet güzel çalışıyorsa sorun yok! Böylece devrenin yapımında büyük bir hata yapmadığınızı garanti ettiniz. Şimdi Speech-Basic programını;
LOAD“SPEECH-BASIC”',8
ile yükleyin ve RUN komutunu kullanarak çalıştırın. Bilgisayar, hemen “C 64 SPEECH SYSTEM V2.7” mesajı ile cevap verecektir. Speech-Basic mesajlarını daima küçük harf modunda verir. Diyelim ki Speech-Basic herhangi bir şekilde bilgisayarın kontrolünü kaybetti (mesela RESTORE'den sonra). Böyle durumlarda, yeni bir komut olan RESET komutunu kullanarak Basic'in birçok şeyi düzeltebilirsiniz. Bu arada hafızada bulunan program silinmez. Bazı Commodore 64'lerin RESTORE tuşu içiçe birkaç tane NMI yaratıp programın kafasını karıştırabilir. Böyle durumlarda da RESET komutunu kullanmanızı tavsiye ederiz. Çünkü bu komut hiç olmazsa bilgisayarı belli bir duruma getiriyor. Örnekleme seviyelerini renklerle de belirleyebiliriz. Bunun için örnek olarak COLDEFO,11,12,15 komutunu vererek dört değişik gri tonunu istediğimiz renk tonları olarak belirleriz. Şimdi HEAR SPEED 1 komutunu verdiğinizde, girilen sesi dinleme durumuna geçersiniz. Bu işlem sırasında ekran kapanır (kasetten yükleme yapılır gibi) ve tanımlanmış dört renkten birini gösterir. Şimdi trimpotu en soldaki pozisyonuna getirip, yavaşça en sağdaki pozisyonuna doğru hareket ettirirseniz, demin tanımladığımız dört renk aynı sırayla ekranda görünür. Şayet gerçekten bu durum gerçekleşirse devreniz kusursuz çalışıyor demektir. Tam kalibrasyonu yapmak için trimpotu bu sefer oldukça yavaş olmak üzere tekrar sola çevirin. Kalibrasyonu gözle izleyin ve 3. renkten, 2. renge (bu örnekte griden koyu griye) geçtiği anda bırakın. Bu nokta sizin kalibrasyon (sıfır) noktanızdır. Başka bir nokta da kalibrasyonu çok abartmayın. Mesela çok uğraşıp bu iki renk arasındaki çok hassas bir geçiş bölgesi bulabilirsiniz. Bu geçiş bölgesi o kadar hassastır ki, digitizer'ın girişinde hiçbir sinyal olmasa da ekranda her iki renk gidip gelir. Böyle bir durum aşırı hassaslıktan başka bir şey değildir ve her şeyin aşırısı gibi o da zararlıdır. Böyle bir ayarla yapacağınız örnekleme sırasında bol bol gürültü elde edersiniz, bilhassa ortamda hiçbir şey yokken. Girişi dinleme modunu bitirmek için boşluk tuşuna basın. Böylece bilgisayar normale döner.
SESİN ÖRNEKLENMESİ
Speech-Basic'in 4 KByte uzunluğunda bir program olduğunu söylemiştik. Bu program kendi başına hafızanın $0800'den $1800 adresine kadar kaplar. Bunu hemen arkasından Basic program ve değişkenleri için kullanılan hafıza gelir. Bu hafıza bölgesinin bir sonu vardır ve işletim sisteminde HIMEM diye adlandırılır. Normal olarak bu sınır $A000 (40960) adresinde bulunur. İsterseniz bu sınırı aynı isme sahip (HIMEM) komut ile istediğiniz bölgeye (mantıkhi olmak koşuluyla) oturtabilirsiniz. Speech-Basic, ses bilgilerini HIHEM değerinden başlayıp hafızanın (aşağı, yukarı) son adresine kadar saklıyor. Böylece HIHEM değerini değiştirmekle, aynı zamanda hafızanın BA-SIC ve ses bilgileri arasında paylaşım oranını da belirliyorsunuz. Direkt modda yapılan çalışmalarda ne kadar çok ses hafızası ayrılırsa o kadar rahat bir çalışma yapıldığı gözlenmiştir. Örneğin HIHEM $1A00 aşağı yukarı 57.5 KByte'lık hafızayı ses bilgileri için rezerve ediyor. Ayrıca BA-SIC'te yazabileceğiniz kontrol programı için henüz 512 Byte'lik yeriniz mevcut. Diyelim ki o anlık hafıza paylaşımını bilmiyorsunuz ve bu bilgi size gerekli. Böyle bir durumda MEM komutunu kullanarak sözkonusu bilgiyi ekranda görebilirsiniz. Gerçek bir çalışma için dört adet örnekleme değerlerine karşılık gelen, gerek ses değerleri, gerekse renk değerlerini belirlemeniz gerekir. Örnek olarak başlangıçta COLDEFO, 11,12, 15 ve VOLDEF0,5,10,15 komutlarını kullanın. Tecrübe ile daha değişik kombinasyonlar bulursanız bunları da kullanabilirsiniz. Diyelim ki WALKMAN ile çalışıyorsunuz. Devre ile ses kaynağı (burada walkman) arasındaki bağlantıyı kurun ve kaseti istediğiniz bir yere sarın. Walkman'in üzerinden sesi ve bas sesleri sıfıra indirin (sonuna kadar kısın). Şimdi;
Bu şekilde analog ve digital kavramları arasındaki fark açıkça belli oluyor.
HEAR:RECORD SPEED |
veya F4 tuşu, verin. Bilgisayar gene dinleme durumuna geçecektir. Fakat bu sefer işlem daha ciddi olarak gerçekleşecektir. Şimdi teybi (walkman'i) başlatın ve ses şiddetini yavaş yavaş açın. Bu arada renk bantlarının ekran üzerindeki dağılımına dikkat edin. Gözlemler sonucu elde edilen tecrübeye göre en iyi sonuç tüm renklere ait bantların ekranda aşağı yukarı aynı sıklıkta bulunduğu ses şiddeti değeri sırasında elde edilmektedir. Bu arada bas seslerin şiddeti ile oynayın. Bu arada dikkat çeken bir olay bas seslerin belli bir değerin üstüne çıktıklarında tüm sesi örttükleri. Tüm bunları gözönünde bulundurarak bu parça ile ilgili ses ve bas şiddet ayarlarını optimal sonucu elde edene kadar yapın. Optimal ayarı elde ettiğiniz anda bandı tekrar aynı yere sarıp bir daha başlatın. Şimdi boşluk tuşuna bastığınızda örneklenen sesler hafızaya kaydedilmeye başlanacaktır. Aşağı yukarı 14 saniye sonra hafıza dolacak ve bilgisayar tekrar ekranını açıp mesaj verecektir. Hafızaya okuma işlemini, ara bir yerde durdurmak istediğinizde ise yapacağınız sadece (RESTORE) tuşuna ((RUN-STOP)'suz) basmak. Böylece direkt moda geri döner ve hafızaya okuma işleminin kesildiği adresi belirten mesajı alırsınız. Eğer yapacağınız kaydın tüm hafızayı doldurmasını istemiyorsanız, o zaman RECORD komutundan sonra kayıt sırasında doldurması için bir adres aralığı vermeniz gerekiyor. Bunun kullanımı ise şöyle:
RECORD FROM başl.adr.
TO bit.adr.SPEED x
Burada başlangıç adresi ve bitiş adresi HIMEM değerinden büyük olmalı ve tabii ki bitiş, başlangıçtan ileride olmalı. En son parametre x ise O'dan büyük olması dışında sınırlamaya tâbi değil. Örneklenmiş sesin geri verilmesi PLAY (ya da F3 tuşu) komutu ile yapılıyor. Buna ait parametrelerin kullanımı ise RECORD komutundakilerin aynı. Detaylara daha ileride değineceğiz.
DİSKET İŞLEMLERİ
Demin de belirttiğimiz gibi, Speech-Basic her iki ROM'un altındaki RAM'i oldukça yoğun bir biçimde kullanıyor. Ortaya ufak bir sorun çıkıyor tabii ki. İşletim sistemindeki standart LOAD ve SAVE rutinleri bu bölgeler için. Bu yüzden söz konusu rutinler bir kere daha yazılmış durumda. Yeni komutlarımızın adları BLOAD, BSAVE ve sadece RAM'e hitap ediyorlar. Her iki emir sadece disket işlemleri için kullanılıyor. Zaten başka bir türlüsü de saçma olurdu! Düşünün bir kere, 60 KByte'ı tek parça olarak kasete saklamışsınız. Ses bilgileri için ayrılmış hafıza bölgesini tümüyle diskete saklamak için sadece *BSAVE demeniz yeterli. Bu komutu tüm parametreleri ile görmek istersek:
MEHMET ÜNSEL.
BSAVE"'isim”,sürücü no.su
FROM başl.adr. TO bit.adr.
En sondan başlayarak, başa doğru tüm parametreler istenilse verilmeyebilir. Böyle bir durumda o parametre için bilinen belli bir değer kullanılır. BLOAD komutunun parametreleri ile birlikte kullanımı BSA VE komutu ile aynı. Burada kullanılan adres, disketten alınan bilginin hangi adreslerin arasına gideceğini belirtir. Bitiş adresi bir sınırı temsil eder ve yükleme sırasında hiçbir türlü aşılmaz. Mesela, yüklenen dosya, belirtilen aralıktan daha büyükse, dosyanın geri kalan kısmı dikkate alınmaz ve yükleme işlemi orada kesilir. Böylece, yükleme işlemi üzerinde de kesin bir kontrol elde edilir. Bunlardan başka, Speech-Basic her türlü disket işlemini rahat olarak gerçekleştirebilmeniz için DISK ve DIR gibi komutlar da sunmakta. Bunlardan ilki, disket sürücüsüne emir göndermek için, diğeri de disketin içeriğini görmek için kullanılıyor.
SINIRLANMIŞ ÖRNEKLER, BLOK TABLOSU
Speech-Basic'te her bir kelimeyi, cümleyi veya istediğiniz ses bölgelerini bulup, izole etmek oldukça kolaydır. Bunun için, örneklenmiş sesi iki kere dinleyip, birinde kelimenin başında, diğerinde ise sonunda (RES-TORE) tuşlarına basıp, başlangıç ve sonuç adreslerini belirlemek gerekiyor. ((RESTORE)'a basıldığında dinleme işlemi kesiliyor ve kesilme adresi belirtiliyordu.) Kelimenin bulunduğu bölgeyi belirledikten sonra, bu bölgeyi, FROM başl.adr. TO bit.adr.
3 bir kullanımla özetleyebili komutunu vererek dinleyebilirsiniz. Burada, başlangıç ve bitiş adreslerini biraz değiştirerek birkaç kere daha dinleyin. En sonunda, istediğiniz ses bölümünü kesin olarak elde edin. Şimdi elde ettiğiniz sayıları pratikte nasıl kullanacaksınız? Bunları bir kenara mı not etmek lazım? Hayır! Böyle bir kullanım için, ses bloklarını bilgisayardan aklında tutmasını isteyebiliriz. Speech-Basic'te bu tip blokların başlangıcını ve bitişini lında tutabilmesi için aynı isimle anılan bir komutu mevcut. Bunun kullanımı ise:
BLOCKx (FROM başl.adr.
(TO BİT.adr.)) (string)
Burada, başlangıç ve bitiş adreslerini demin belirlemiştik. String ise, 8 karakterden oluşan ve bu bloğu tanımlayan kısa bir açıklama. Blok numarasını belirleyen x'ise 1 ile 31 arasında bir sayı olabilir. 30 numaralı blok için daha evvelden, fonksiyon tuşlarının tanımlandığı bölgenin adresi ile belirlenmiş durumda. 31 numaralı blok için ise blok tanımlama tablosunun başlangıç ve sonuç adresi tanımlanmış durumda. Sıfır numaralı blok, gerçekte varolmasına rağmen, kullanıcı tarafından değiştirilemiyor. Bunun görevi, en son BLO-AD işleminin başlangıç ve bitiş adresini akılda tutmak. FROM başl.adr. TO bit.adr. parametrelerini gerektiren bir yerde, bunun yerine belirlenmiş bir blok bölgesini kullanabiliriz. Bunun için sözkonusu parametreleri BLOCKx gibi iz. Speech- Basic başlangıç ve bitiş adreslerini otomatik olarak blok tanımlamasından alır ve kullanır. Bu kullanım, PLAY, RECORD, BLOAD, BSA-VE, MON ve BLOCK komutunun kendisinde geçerlidir. Mesela, buna göre şöyle bir satır yanlış olmaz:
BLOCK 1 BLOCK 0 “Merhaba”
Böylece, yeni yüklenmiş olan, “Merhaba” adlı ses örneğini BLOCK Ve saklar ve BLOCK O'ın içeriğini başka bir yerde saklayarak daha sonraki işlemler için kullanılmak üzere serbest hale getiririz. Gene benzer şekilde:
BSAVE“'f-tuşları””,8 BLOCK 30 kullanım olarak hatalı değildir. ve fonksiyon tuşlarının tanımlanmasını, daha sonra kullanılmak üzere diskette saklamaya yarar. Blok tablosunu tümüyle silmek için şu döngüyü kurmamız gereklidir.
T529:BLOCKx
Burada, başlangıç ve bitiş adresleri verilmediği için, bunların yerine otomatikman kullanılabilecek en düşük adres (HIMEM)'ile, kullanılabilecek en yüksek adres ($FFF8) oturtulur. Blok tablosunu görmek istediğinizde, MAPx-y komutunu kullanmanız gerekir. Buradaki x ve y parametrelerinin kullanımı, LIST komutundaki kullanımın olduğu gibi aynısıdır. Örnek olarak, MAP 10, MAP 10-20, MAP-I0 verebiliriz. Altı numaralı fonksiyon tuşu kendinden BLOCK komutu ile tanımlanmıştır. (Tabif, bu tanımlamayı siz de değiştirebilirsiniz.) Şayet F6 tuşundan sonra (RETURN) tuşuna basarsanız, tüm blok tablosunu görürsünüz. Çünkü, BLOCK komutu, parametresiz olarak kullanıldığında MAP 0-31 komutu ile özdeştir.
BAZI ÖZEL EFEKTLER
Örneklediğimiz tüm sesleri izole edebildik mi, ses efektleri elde etmek artık çocuk oyuncağı gibi bir şey. Zaten, sözkonusu efektler program modunda bir şeyler yapmak gereksinimini doğuran tek neden. Diğer tüm işlemleri, direkt modda yapmak daha akıl kârı. En basit olarak elde edilen efekt RAP veya BREAK efekti, yani bir kelimenin kesik kesik tekrarlanması. Bunun için önce kelimenin kendisini (2), bunun içinde yeraldığı cümleyi (1) ve o kelimeden geri kalan kısmını (3) izole etmek ve belirlemek lazımdır. Daha sonra en basit şekliyle 1,2,2,3 sırasıyla ses geri verildiğinde sözkonusu efekt elde edilir. Geri verme sırasında, sesin hızıyla da oynanırsa SCRATCH efektleri elde etmek mümkün. Bir cümlenin son kelimesini belirleyip, cümlenin arkasından bu kelimeyi tekrarlı ve azalan bir ses şiddetiyle geri verirsek ECHO veya HALL efektleri elde edilebilir. Burada, ufak bir aksaklık keşfediyoruz. Ses geri verilirken her bir örnekten bir diğerine geçilirken ekran bir kere göz kırpıyor ve geçiş bölgesi yarattığı hafif parazitle kulak tırmalıyor. Bu durumda yardımımıza EXEC komutu yetişiyor. EXEC sadece parametre kullanan bir komut. Parametreler bir karakter string'inin içinde yeralıyor ve çeşitli harf ve rakamlardan oluşuyor. Her bir harf bir komutu simgeliyor. Örnek verecek olursak, aşağıdaki program;
10 PLAY BLOCK 1: SPEED |
20 PLAY BLOCK 2
30 PLAY BLOCK 3
40 PLAY BLOCK 4
olarak toparlanabiliyor. Tabif ki bustring'in işlenmesi programın yürümesinden daha hızlı olarak gerçekleşiyor ve sesin geri verilmesi sırasında ekran daima kapalı kalıyor. Şimdiye kadar anlattıklarımızı tam anlamıyla takip ettiyseniz, Speech- Basic'in nasıl çalıştığını ve neler yapılabileceğini anlamış olmanız gerekir. Fakat gene de, aşağıda yeralan (oldukça sıkıcı bir işlem ama ne yapalım), komutların kullanımını anlatan bölümü okumanız gerekiyor. Ayrıca, şimdiye kadar bahsedilmemiş birkaç komut ile ilgili açıklamaları da bulacaksınız aşağıda.
KOMUT LİSTESİ
Aşağıda, tüm komutlar yaptıkları işlerin benzerliği altında gruplanmıştır. Anlatım sırasında kullanılan büyük harfler komutların kendisi, küçük harfler ise bunlara ait parametrelerdir. Parantezler, sadece parametrelerin kullanılmama sırasını göstermek için konmuştur. Kullanılmayan parametrelerin yerine bilinen bir değer kullanılır. “Str” diye bahsedilen şey karakterlerden oluşmuş bir string'i temsil eder. Blok adı ile anılan şey belli bir hafıza bölgesidir ve üç türlü belirtilebilir:
1- FROM başl.adr. TO bit.adr. 2- başl.adr. , bit.adr. 3- BLOCK x
Büyük 'A' harfi (A), iki byte'lık bir tamsayıyı (adres) simgeler. Büyük 'N' harfi ise (N), bir byte'lık bir tamsayıyı temsil eder. Dv kısaltması, alet numarasıdır (device number). Disketle yapılan tüm bilgi taşıma işlemleri, 127 no.lu mantıksal dosya kanalını kullanırlar. Bu kanalın bir özelliği, RUN/STOP + RESTORE işlemi sırasında otomatik olarak kapanmasıdır. Bu dünya kanalını kendi programlarınızda kullanamazsınız. LISTING sırasında, (SHIFT) tuşu ile bekletme yapmak mümkündür. Her yerde, onaltılık ve ikili sistemde sayılar kullanmak mümkündür. $A000, %011011. Onaltılık sayılar, önlerinde yer alan '$' dolar işareti ile ayırt edilirler. İkili sayıların önünde ise '%' yüzde işareti bulunmak zorundadır. Onaltılık sayıların kullanımında karşınıza çıkabilecek bir sorundan bahsedelim. İçinde “DEF” dizilimi bulunan onaltılık sayıyı “D EF” gibi ayrı olarak yazın. Sayı olarak bu son kullanım gene geçerli olacaktır. Fakat,
Devre Plaketi
Basic yorumlayıcısının, bunu “DEF” komutu olarak yorumlayıp, ona ait token'ı (Basic yorumlayıcısının kendi komutlarını ayırt etmek için kullandığı kodlama) yerleştirmesi önlenecektir. Bu kurala uymadığınız takdirde, hata mesajı ile karşılaşırsınız. IF...THEN komutları ile kurulmuş şartlı programlama satırlarında, THEN komutundan sonra yeni komutlardan biri gelecekse iki nokta üst üste ile ayrılmış olması gereklidir. Yoksa, yazılımınız doğru olsa bile, hata mesajı ile karşılaşırsınız.
A) BAZI TEMEL KOMUTLAR
RESET-SID çipini, VIC çipini ve CIA çiplerini siler. Kernal'ın (işletim sistemi) sistem vektörlerini ilk değerlerle yükler. RESET komutu, her BASIC programın ilk komutlarından biri olmalıdır. © BASIC-Speech-Basic yardımcı programını terk etme ve normal BASIC'e dönme. Bu komutu verdiğinizde “are you sure?” (emin misiniz?) sorusu ile karşılaşırsınız. Cevap olarak 'Y' (= yes) verirseniz, komut yürütülür. Başka herhangi bir cevapta, komut yürütülmez ve normal işlemler devam eder. Şayet, bu komut bir program satırının içinde kullanılmışsa bu soru sorulmaz ve komut doğrudan yürütülür. Bu arada, BASIC'in LOMEM (BASIC işlemleri için kullanabileceği en düşük adresli hafıza) değişkeni tekrar $0800 adresine oturtulmaz ve programın yürümesi kesilmez, sadece yeni eklenmiş komutların yürütülmesi kesilir. HELP-Speech-Basic'e özel tüm komutları listeler. HELP* şeklinde bir kullanım, normal BASIC V2 komutlarını listeler.
B) DİSKET KOMUTLARI VE ÖZEL KOMUTLAR
KEY (n,str)- Fonksiyon tuşlarına bazı işlevler yüklemek. Bu komutu parametresiz kullandığımızda, tüm tuşlara atanmış işlevleri, ekranda edit edilebilecek bir şekilde görürüz. Eksi işareti “-” hiçbir tuşun tanımı sırasında kullanılamaz. Çünkü, bu işaret RETURN tuşunun kodunu ($0D) temsil etmektedir. Maksimum 15 karakterden oluşmuş tanımlar kullanılabilir. Speech-Basic'i ilk kullanmaya başladığınızda, programın kendisinden bazı tanımlar bu tuşlara yüklenmiştir. Bunlar:
F1 - RUN F2 - LIST F3 - PLAY F4 - HEAR:RECORD F5 - HELP/DISPLAY KEYS F6 - BLOCK
F7 - F8 - DISK-STATUS
Aslında, normal çalışma sırasında, F5 tuşunu komutu ile yüklemek oldukça uygun olur. Diyelim ki söz konusu değişikliği yaptınız ve Speech-Basic'inizin artık böyle çalışmasını istiyorsunuz. Yapacağınız tek işlem Speech-Basic'in yeni versiyonunu diskete saklamak. Bunun için:
BSAVE“SPEECH-BASIC”,8
FROM $0801 TO $1800
komutunu kullanın. MEM- O sıradaki hafıza bölüşümünü rapor eder. Rapor aşağıdaki örnekteki gibi görünür:
BASIC SOUND : $a000 to $fff8
:$1801 to $1803
KEYS : $0c6f to $0cef BLOCKS: $165b to $17db
DISK(str(,dv))- Disk kanalı ile ilgili işlemleri yürütmek. Bu komut parametresiz kullanıldığında, disket sürücüsünün durumunu ekranda gösterir. Eğer komut stringini kullanırsanız, bu disket sürücüsüne gönderilir. Fakat disket sürücüsünün mesajı alınmaz. Böylece istenirse, program içinde INPUT komutu ile hatanın veya durumun daha ayrıntılı işlenmesine olanak sağlanır. DIR(str(,dv))- Disketin içeriğini görme. Parametresiz kullanıldığında disketin tüm içeriği gösterilir. Gönderilen parametre, dosya adı ve tipine göre seçim yapılmasını sağlayan bir maskedir. Bu maskenin kullanımının detayları için “1541 Disket Sürücüsü Kullanım Kılavuzu'na bakın. İsmi verilmiş dosyayı “dv' numaralı aletten hafızaya yüklemek. Blok kullanılırsa, yükleme işlemi burada belirtilen adresten başlar. Şayet kullanılmazsa, dosya kendi belirlediği adrese yüklenir. Yükleme işlemi dosya bittiğinde veya (belirtilmişse) bitiş adresine varıldığında biter. BLOAD komutunun LOAD komutundan bir başka farkı ise bunun normal bir BASIC komutu gibi yürütülmesi. Yani LOAD'daki gibi yükleme işlemi bittikten sonra program baştan başlamıyor. Yüklenen dosyanın başlangıç ve bitiş adresini belirlemek istiyorsanız BLOCK 0'ı kullanabilirsiniz. BLOAD komutu daimi RAM'e yükler (zaten istese de ROM'a yükleyemez, burada belirtilmek istenen bütün yükleme işlemi sırasında RAM konfigürasyonunun kullanıldığı, yani $D000-$DFFF adresleri arasını yüklerken bile bilgisayar “crash' etmiyor, çünkü dosya buranın üç (!) kat altındaki RAM bölgesine yükleniyor). BLOAD komutunun kullanımına bazı örnekler vermek istersek:
BLOAD“s.test”
BLOAD"s.test'',8 FROM $A000
BLOAD"s.test'',8 FROM
$8000
BLOAD"“b.test”,8 BLOCK 31:REM
blok talosunu yüklemek.
BSAVE “prog.ismi”,(dv),(block)- Başlangıç ve bitişi belirtilen bölge verilmiş isim altında dv numaralı alete saklanır. Burada dosyaları ayırt edebilmeniz için bir önerimiz var: Diyelim ki aynı örnekler için ses bilgilerini ve bunların içindeki başlangıç ve bitişlerini belirtilen blok tablosunu saklamak istiyorsanız. Her iki dosyayı aynı isimle saklayın; tek farkla: Ses bilgilerinin başına 's.' (ses), blok tablolarının başına 'b.' (blok) ekleyin. Böylece, ileride oluşabilecek karışıklıkların önüne geçersiniz. BSAVE komutuna ait birkaç örnek: BSAVE "s.test"
BSAVE"s.test”',8 FROM $A000
BSAVE"“s.test'””,8 FROM $SA000,
$8000
BSAVE"'b,test”',8 BLOCK 31:REM
blok tablosunu saklamak
C) SES KONTROL KOMUTLARI
HEAR(SPEED n)- Örneklenen sesin aynı anda duyulmasını sağlar. Burada dört değişik örnekleme seviyesine karşılık olarak dört değişik ses şiddeti seviyesi ve dört değişik rengin belirlenmesi gerekmektedir. Renk değerleri $D020, ses şiddeti değerleri $D418 adresli registere yazılmaktadır. Dinleme işlemini bitirmek için boşluk tuşuna basın. RECORD (block) (SPEED n)- HEAR komutu ile aynı biçimde çalışır. Tek fark, dinlenen sesin aynı zamanda hafızaya da yazılmasıdır. Blok dolmadan, ses kayıt işlemi kesilmek istenirse RESTORE tuşuna basmak yeterlidir. Direkt moddayken bu işlem yapılırsa, kesilme adresi “stopped at xxxxx.” mesajı ile belirtilir. Örnekleme 1 ile 40 arasında değişen bir tamsayıdır. Burada 1, en hızlı kaydı, 40 ise en yavaş kaydı sağlar. Örnek olarak: RECORD RECORD FROM $A000 TO $D000 RECORD SPEED 1 RECORD BLOCK 1 SPEED 10
PLAY(block)(SPEED n)- RECORD işleminin tam tersi: içindeki bilgiler, ses bilgisi olarak yorumlanıp, karşılık gelen ses şiddet değerleri ve renk değerleri kullanılarak geri verilir. En yüksek geri verme hızı olarak “0” kullanabiliriz. Yani sesi kayıttan daha hızlı geri verebiliriz.
VOLDEF (n,(n,(n,(n))))
COLDEF (n,n,n,n) Dört değişik örnekleme seviyesine karşılık gelen ses şiddet ve renk değerlerini belirlemek. Digitizer devresinden elde edilen değerler doğrudan ses ve renk kanallarına yazılmaz. Bu işlemden önce gelen bilgiler, sizin bu komutlarla belirlediğiniz tablolar vasıtasıyla işlenir ve öyle kullanılır. İki değişik örnekle, VOLDEF ve COLDEF komutlarının parametrelerinin etkilerini inceleyelim:
VOLDEFO, 1,2,3:COLDEFO, 11,12,
15: REM alçak sesli ve gri tonları
VOLDEFO,5,10,15:COLDEF7,2,5,
6: REM yüksek sesli ve çok renkli
D) DAHA İLERİ SEVİYEDEKİ KOMUTLAR
BLOCK n (block)(str)- Bir blok, 60 tanım olarak, başı ve sonu belirlenmiş ve bunlarla sınırlanmış hafıza bölgesidir. Birçok komutun kullanımında yeralan (block) parametresi ya “FROM başl.adr. TO bit.adr.” biçiminde, ya da FROM ve TO komutları kullanılmayarak yeni “başl.adr., bit.adr.” biçiminde kullanılabilir. Başlangıç ve bitiş adresleri genelde ayrı ayrı kullanılmadığı için BLOCK komutu geliştirilmiş ve her iki adresi tek komutta işlemeye olanak vermiştir. Bitiş adresi olarak tanımlanan sayının, başlangıç adresinden büyük ve $FFF9 adresinden küçük olması gerekir. BLOCK komutu parametresiz kullanıldığı zaman KEY komutu gibi tüm blok tanımlamalarını ekranda listeler. Blokların sayısı 0'dan 31'e kadar uzanabilir. Fakat 0'ıncı blok özel bir işlem için ayrılmış olduğundan bu blok'un kullanıcı tarafından tanımlanması mümkün değildir. Bu blok, en son yapılan BLOAD işleminin başlangıç ve bitiş adresini aklında tutar. 30 numaralı blok, fonksiyon tuşlarının başlangıç ve bitiş adresini, 31 numaralı blok, blok tablosunun bulunduğu bölgenin başlangıç ve bitiş adreslerini aklında tutar. Gerektiğinde bu bölgeler diskette saklanmak istendiğinde (gerçekten de saklamak gerekiyor bu bölgeleri) sözkonusu adresleri aklınızda tutmanız gerekmiyor, komut bu işi sizin için hallediyor. Fakat isterseniz 30 ve 31 numaralı blokları kendi istediğiniz biçimde yeniden tanımlayabiliyorsunuz. Şayet böyle bir işlem sonucu, sözkonusu değerleri kaybettiyseniz bunları MEM komutundan elde edebilirsiniz. Burada parametre olarak verilen str adlı string ise, sekiz karakteri aşmayan ve yalnızca blok tablosu istendiğinde ortaya çıkan, blokların içeriği ile ilgili kısa bilgileri saklasın diye bırakılmış bir açıklama bölgesidir. Blok tablosunu RESET'lemek için (tümüyle silmek, ilk ve temiz haline getirmek için): FOR n=1 TO 29:BLOCK n:NEXT n satırını vermeniz yeterlidir. Bu komuta ait birkaç örnek isterseniz:
BLOCK 1 blok'u silme BLOCK 1,$A000:REM bitiş adresi olarak $FFF8 kullanılır BLOCK 1,$A000,$8000:REM aşağıdakinin kısaltılmışıdır.
1 numaralı
BLOCK 1 FROM $A000 TO $8000
BLOCK | BLOCK 0:REM 0 numa-
ralı blok'un içeriğini saklamak
BLOCK | BLOCK 0:REM 0 numa-
ralı blok'un içeriğini saklamak” ve
isimlendirmek.
BLOCK | TO $8000:REM
YANLIŞ!!!
map(x(y))(y)- Blok tablosunu edit edilebilir şekilde listeler. MAP komutunun arkasında yeralan parametre listesi sizde korku yaratmasın. Aslında parametreler göründüğü kadar korkunç değil, tam aksine LIST komutunun kullanımı ile olduğu gibi aynı bu parametrelerin kullanımı. HIMEM A- Basic için kullanılabilecek hafızanın sonunu (üst sınırını) belirliyor. Böylece, aynı zamanda ses bilgileri için kullanılabilecek alt sınırı da belirlemiş oluyoruz. 'A' değeri, o sırada hafızada bulunan programın son adresinden büyük ve $A000'dan küçük olmak zorundadır. HIMEM komutu yürürken CLR işlemini de yürütür. Örnekler:
Digitizer devre şeması
SUolt
«Pin? * Pini 1.2k * Pin2 22k si “A4 ase - —Pin8 Giriş Karşılaştırıcılar TTL-katı Kodlama Bilgisayar
EXEC Verilen stringin içindeki karakterleri birçok ses komutunun kısaltılmışı olarak değerlendirir. Bunlardan başka, ses şiddeti ve renk değerleri de bu string'in içinde belirlenebilir. Kısaltılmış olarak yeralan komutlar şunlardır:
p w ; w numaralı blok'u çalma $ w ; hızı belirleme ; w/60 saniye beklemek ses şiddet değerlerini belirlemek © w,w,w,w ; renk değerlerinin belirlenmesi # str ; str diye belirtilen değişkenin de yürütülmesi © ; EXEC işleminin bitirilmesi
Diğer karakterlerden herhangi biri EXEC komutunun yürümesinin kesilmesine neden olur. Her bir komut birbirinden, iki nokta üstüste işareti ile ayrılabilir, fakat şart değildir, istenirse kullanılmayabilir. Parametreleri simgeleyen 'w' bir sabit veya bir değişken olabilir. DİKKAT: EXEC işlemini bitiren '©' işaretini mutlaka kullanın. Yoksa, programınız istenmeyen komutları (!) yürütebilir.
Örnekler:
EXEC
EXEC *s1v0,5,10,15pl c$”
EXEC a$ * “(&”:REM işleminin sıh-
hatli olarak bitirilmesini kesinleştirme
EXEC
E) DİĞER KOMUTLAR
HEX ve DEZ- RESTORE tuşu ile yapılan durdurma işlemleri sırasında verilen mesajın içindeki sayının hangi sistemde verileceğini belirler. ('stopped at xxxxx') HEX komutu, hekzadesimal yani onaltılık sistemi, DEZ komutu ise desimal yani onluk sistemi seçer. SCREEN flag- Ekranın, ses ile ilgili işlemler sırasında (HEAR, RECORD, PLAY ve EXEC) kapanıp kapanmaması gerektiğini belirler. Normalde bütün bu işlemler sırasında ekran kapalıdır ve bu durum ses kalitesini kısmen yükseltmektedir. Parametre olarak belirtilen ON ve OFF olabilir. Bundan başka, bu komutun hemen arkasından gelecek bir matematiksel önerme de aynı işi görür. (Önermenin değerinin sıfır veya sıfırdan farklı olması.) MON (block)- Ses monitörü. MON komutuyla, örneklenen bilgiler ekrana listelenir. Dört adet örnek bir oluşturur. Her bir değer, verilen ses şiddeti değerleri ile duyulabilir sese, verilen renk değerleri ile gözün algılayabileceği renk bantlarına dönüştürülür. Değerler, üzerine gidip yazmak suretiyle değiştirilebilir. Değişiklikler yapıldıktan sonra RETURN tuşuna basmak gerekmektedir. MON komutuyla, kısa süreli gürültülü aralıkları düzeltmek mümkündür. MON komutu en çok, Digitizer devremizin ayarını, kontrolünü yapmamıza yarar. Örnek verecek olursak:
MON FROM $0400 TO $0401 komu-
tunun sonucu; $0400:42444244
İyi ayarlanmış: $BO00:
11112234443322111
Yüksek ayarlanmış: $B000:
1111144444441111
Alçak ayarlanmış: $B000:
2223233433222212
Şekil-4'te, digitizer devresinin komple devre şemasını bulacaksınız. Yeni digitizer'ınızla yapacağınız çalışmalar sırasında bol bol eğlenceler diliyoruz. 0