C-64 ile Müzik

SID'ın Yapısı ve Programlanması

Samet Kumaş size SID'in 29 sicilden oluştuğunu söyledi, ama onu nerede bulabileceğinizi, ona nasıl erişebileceğinizi anlatmadı. İsterseniz biz de bunlardan başlayalım. SID'imiz (SID - 54272)'de ikamet ettiğine göre, bu adreslere

POKE 54272 4 REGİSTER, İlk başta tek osilatörden başlayalım, diğerleri yedişer adres daha ileri- DEĞER de olacaktır. Şimdi SID'in görünüşükomutuyla ya da makine dilinde ne tablodan bakalım. Dikkat eder- LDA # DEĞER seniz ilk 20 adres, daha doğrusu Re- STA $ D4004 REGİSTER gister, yedili aralıklarla birbirlerini » tekrar ediyor. 0'ıncı ve 1'inci adres» komutlarıyla erişebiliriz. Burada RE- ler çıkacak sesin frekansı ile ilgilidir. GIİSTER, SID içerisindeki 29 sicilden Buralara koyacağınız değerler çıkacak bizim ilgilendiğimiz sicilin numarası, sesin frekansını belirler. Unutmaya- DEĞER ise bu sicile vermek istediği- lım, buradaki Register'lar sadece yamiz değerdir. Şimdi SID'i oluşturan zılabilir türden olduğundan, buraya bu sicilleri teker teker inceleyelim: konan değerleri tekrar okuyamayız. commodore

Dolayısıyla istediğimizde bu değerlerin tekrar okunabilmesini sağlamak, biz programcılara düşer. Buraya koyduğumuz değerlerin sonuç olarak üreteceği sesin frekansını, yani çıkış frekansını, aşağıdaki Formül I ile bulabiliriz. FORMÜL I Fçıkış = (Fn * Fclk / 16777216) Hz. Formül I'de Fn değeri 0 ve 1 no.lu Registerlara yazılacak değerler toplamıdır. (0 byte, 1 - high byte). FORMÜL II Fn = Register 0 + Register 1 * 256 Fn değerini yukarıda verdiğimiz Formül II'den elde edebiliriz. Fakat elimizdeki formül (I) çıkış frekansını veriyor. Bize şu anda gereken ise bu değil; Fn, yani bizim kendi vermiş olduğumuz ve artık okuyamadığımız değerlerin toplamı. Bunu göz önünde bulundurarak formülü tekrar yazarsak, III. formülümüzü elde ederiz: FORMÜL III Fn = 16777216 * Fçıkış / Fclk Fclk, 64'ün sistem darbe üreticisinin frekansıdır. Bu yaklaşık 1 megahertz (MHz) olarak kabul edilebilir. Şimdi formül Fn = 16777216 * Fçıkış / 1000000 halinde yazılabilir. Sabitleri hesaplatırsak (Commodore'a tabii) 16.777216 gibi bir sayı çıkar (hiç de güzel görünmüyor). Bunu biraz kırparak 16.78 ya da kulağınız böylesi bir farktan rahatsız olmayacak kadar duyarsızsa, 17 olarak da kabul edebiliriz. Böylelikle şöyle bir formül elde ederiz: Fn = 17 * Fçıkış

Fizikten Müziğe

Notaların değerleri ile oynamak ya da bu sayıda röportajını yayınladığımız Osman İşmen'in yaptıklarını siz de denemek isterseniz formülde başka sayılar da kullanabilirsiniz. Ancak, biz standart notalarla yetinelim: Piyanonun tam orta yerinde bulunan LA notasının standart frekansı (saniyede titreşim sayısı) 440 Hz.'dir. Bu notayı SID'den elde etmek istersek, Fn = 17 * 440 = 7480 sayısını elde ederiz. Bunu HI byte LO byte'lara ayırırsak; (7480/256): HI = 29; LO = 7480 AND 255 (Formülle savaşmak istemeyenler nota değerlerini kullanım kitaplarının

Ek (APPENDIX) kısmında bulabilirler. Bu sayıları POKE SID + 0, INT (Fn/256) POKE SID + 1, Fn - INT (Fn/256)*256 ya da POKE SID + 1, Fn AND 255 şeklinde yerleştirilerek frekans değerini tespit etmiş oluyoruz. Bunlardan sonra gelen iki Register darbe tipinde dalga üretilirken gerekli olan oranlama işine yardımcı olurlar. Darbe tipi dalgalar diğerlerinden daha karmaşık olduğundan bu tip dalgalardan ilerde bahsedilecektir. Sıra 4'üncü Register'e geldi ama bunu öğrenmeden önce isterseniz bir sesin nasıl oluştuğunu inceleyelim. Bir nota üretildiği enstrümanın karakterlerini taşır. Böyle bir sesi SID ile sentezleyebiliriz. Bu karakterler yükselme, iniş, istikrar, sönme (ATTACK, DECAY, SUSTAIN, RELEASE) evrelerinden geçer. SID'i programlayarak bu evrelerin benzetimlerini yapabiliriz. ATTACK evresi 5'inci

Register'in üst 4 bit'i (bit 7-4). DECAY evresi aynı Register'in alt 4 bit'i (bit 3-0) ile programlanabilir. SUSTAIN ve RELEASE ile aynı düzende

6'ıncı Register'den kontrol edilebilir. TEPE DÜZEYİ ATTACK, İSTİKRAR DECAY diğerlerinde SUSTAIN, İSTİKRAR diğerlerini de RELEASE şeklinde verebiliriz. Büyük ATTACK değerleri sesin maximum seviyesine daha geç erişmesine, büyük DECAY değerleri sesin SUSTAIN değerine daha geç erişmesine, büyük SUSTAIN değerleri sesin uzama evresine maximuma daha yakın bir alanda girmesine, büyük RELEASE değerleri sesin yok olma süresinin uzamasına neden olur. Tersini de aynı mantıkla yazabiliriz. Küçük ATTACK değerleri sesin maximuma daha çabuk erişmesine neden olur gibi... Şimdi tekrar Register 4'e dönelim. Bu GATE (Kapı, bit 0) bit'i sesi başlatmaya yarar. Bu bit 1 olduğunda ses ATTACK evresine girer bu gerekli değere eriştikten sonra decay evresine girer, bundan sonra sustain evresine girer ve bu evrede kalır. Eğer şimdi GA-

YÜKSELME | iniş |

TE bit'ini 0 yaparsak ses RELEASE evresine girer ve kaybolur. Aynı Register'in üst 4 (7-4) bit'i ise dalga şeklini belirler. Örneğin üçgen dalga bir ses çıkarmak için 4'üncü bit'i seçmemiz gerek. Bunun değeri 16 olacaktır, buna GATE değerini de eklersek 16 + 1 sesin başlamasına neden olacaktır. Eğer şu ana kadar anlattıklarımı denediyseniz, hakkımda pek iyi düşünmediğinize eminim; sanırım 64 ses vermiyor. Yapacağınız şey en yakın Te-

leteknik yetkili servisine değil tabii. Genellikle ses ile ilgili cihazlarda volüm kontrolü yer alır, SID'imiz de böyle bir volüme sahip ama bu bildiğimiz bir düğme değil verdiğimiz rakamlarla programlanarak çalışıyor. SID'imizin volüm kontrolü 24'üncü Register'de yer alıyor. Bu Register 0-15 arasında ayarlanabilir (Reg 24, 0-3 bit volum kontroluna POKE SID + 24, VOL (0 <= VOL <= 15) şeklinde erişebiliriz.

m

! Tablo: SID Registerları Haritası ADDRESS REG DATA REG NAME REG Aş A3 A> Aş Aç (HEX) D; Ds D4 D3 D> Do Voice 1 TYPE 0 0 0 00 F7 Fe Fs Fa F3 F> Fi | fo FREO LO WRITE-ONLY 1 1 01 Fıs Fu | Fa Fı> Fn Fo Fa FREO HI WRITE-ONLY 2 o 1 o2 | Pw; | Pws | Pws | Pw, | Pw> PW> | | Pwo PW LO WRITE-ONLY 3 0 1 1 03 z Tİ | — Pm, wp | PWy PW HI WRITE-ONLY 4 o o 1 o 04 | | OVA | AVA | TEST Ne SYNC | GATE CONTROL REG WRITE-ONLY 5 o 1 0. 1 05 | ATK3 | ATK, ATK, | DCY3 | DCY, | bey, | ATTACK/DECAY WRITE-ONLY 6 0“ 1 o 06 STN3 | STN> | STN, RLS3 | RLS> Vs, RLSo SUSTAIN/RELEASE WRITE-ONLY Voice 2 o o 1 1 “1 07 F7 Fe Fs Fa F3 F> Fo FREO LO WRITE-ONLY 8 1 or <08 Fıs Fia | Faz Fır Fito Fa Fa FREO HI WRITE ONLY 9 0 1 0 1 09 PW> | PWs | Pws | Pw, | Pw3 | Pw> | Pw; | Pwo PW LO WRİTE-ONLY 10 0 1 0 1 0 ez — — | | PWo PWg PW HI WRITE-ONLY o 1 | AA | AAA | test | ERG | Sync | GATE conTRoL REG WRİTE-ONLY 12 o 1 1 hi h) oc | ATK> | ATK, OcY3 | | Dev, | ATTACK/DECAY WRITE-ONLİ 13 0 1 1 o 1 0D STN> | STN> > | SİN, | ALS) | RLS> | | RLSo SUSTAİN/RELEASE WRITE-ONL” Voice 3 14 1 1 1 o OE Er | Fe Fs Fi F3 | F> Fo FREO LO WRİTE-ONLY 15 0 1 1 1 1 OF Fıs Fra | Fı> Fa Fo Fg FREO HI WRİTE:ONLY 16 1 o 0 10 Pwz | Pws | Pws | | Pw3 | Pw> | Pwo PW LO ı7 1 o 0 o 1 11 Z | — - | | PWs | PWg PW HI WRİTE-ONLY 18 1 0 1 12 NOİSE | AA | Test | | Gate CONTROL REG WRITE-ONLY 19 1 1 1 13 ATK3 | ATK> | ATK, | ATKo | | | | ATTACK/DECAY WRITE-ONLY 20 1 0 1 o o YA STN3 | STN> | STN, | | TE RUS) | RUS, | SUSTAİN/RELEASE WRITE-ONLY Filter 21 1 0 1 1 15 E FCo 22 1 1 1 16 FCg FC; | FC3 FC HI WRITE-ONLY 2 Vu h) 1 1 1 ız | Res, | Res, | RES, | Der 3 | FiLT rn FILT A RESİFİLT WRITE-ONLY 24 1 1 0 o o 18 | | HP BP | VOL3 | VoL> | VOL, MODENVOL WRITE-ONLY — Misc. 25 Vin 1 o o 1 19 PX7 PX5 PX5 PX4 PX3 PXo POT x READ-ONLY 26 1 1 o 1 0 | Pre | İM | PYo POTY READ-ONLY 27 1 1 o 1 1 18 Or | Os 5 O, 03 | 0> O; Oo * READ-ONLY 28 1 1 o 1c Er Es & | a E> E, Eo READ-ONLY | LL kr Aa,

Artık bir program yazmanın zamanıdır. Bir osilatörü kullanacak yeterli bilgileri edindik. Aşağıdaki UFO sesi örneğini ele alalım. SID 1 programında önce SID registerlerini sıfırlıyoruz (son dördü dışındakiler çünkü onlar sadece okunabilen tipte). Daha sonra VOLUME registerlerini maksimuma ayarlıyoruz. Nedendir bilinmez hep bu maximuma ayarlanır. Bu işlemden sonra ATT, DEC, SUS ve REL değerlerini ayarlayarak sesimizin karakterini belirliyoruz. Bunlar uzun ATTACK ve yüksek seviyede SUSTAIN'e ayarlı DECAY ve RELEASE değerleri sıfırda. Ve Tanrı bir pardon gate'i 1 yapıyoruz, üçgen dalgayı seçiyoruz. Bu satırdaki 17 rakamını 33 (32 + 1) yaparak daha değişik efektler elde edebilirsiniz. Gate'e 33 verildiğinde dalga testere dişi karakteri taşıyacaktır. Şimdi frekansı devamlı kaydıracağımızdan onu döngü içinde değiştiriyoruz. Ve bu oyun böylece devam ediyor. İkinci olarak yine sadece bir tek osilatörü kullanarak ama bu sefer makine dilinde bir program vereceğim bunu yazıp joystiğinizi ikinci port'a takın ileri ve geri oynatarak ilginç efektler elde edeceksiniz. Açıklamaları bir dahaki sayıda.

88110 FOR
08156 GOT0O 118
20010 REM PROGRAM -MAHMUT C.GENCELİ
08020 REM TIRNAK ICİNDE ÖNCE SHİFT/CLR-HOME SONRA CONTROL/1 <896>
00230 POKE 53280,21POKE 53281,2:PRINT "<CLR><CTRL- İİ >LUÜTFEN

PROGRAM ADI : SID

00818 REM 'LERİ YAZMAYIN DAHA IYI CALISIR
©8015 REM TIRNAK İCİNDE <SHİFT/CLR-HOME)> VE <RYS ON>
"<CLR><RYSONDU.F.O"
80830 REM TUM REGİSTER'LERİ SIFIRLA DOLDÜR
00048 Ts TO 24:POKE T
00850 POKE YOLUME MAKSIMUM
068068 REM ATT-15,DEC-0,SUS-15,REL-O
88076 POKE SI1D*4*5,240:POKE SI1D*4*6,240
80080 REM
080890 POKE
©8180 REM DEGİSKEN SESLER ICİN DONGÜU
TO TO 88
80120 REM SADECE HI BYTE'INIİ KULLANIYORUZ
086130 POKE TiNEXT
08148 REM GİT BİR DAHA KAFA SISIR

PROGRAM ADI : SID 2

8 MART 1986

<164>
<110>
<098>
<041>
<234>
<064>
<113>
<8619>
<172>
<156>
<168>
<132>
<217>
<235>
BEKLEYINIZ"
08002050
READ A<B THEN 88 <129>
POKE 68
06888 IF CK<>12166 THEN PRİNT "<CLR>DATALARDA YANLISLIK V
80885 REM TIRNAK ICİNDE ÖNCE SHİFT/CLR-HOME SONRA 12 CRSR A
SAGI, 6& CRSR SAGA <075>
686890 PRINT CİKMAK ICIN RUN-STOP/RESTO
RE" <126>
681886 SYS TEM <125>
68110 DATA
06128 DATA 141,806,212,169,815,141,624,212
681386 DATA <249>
08148 DATA 024 <214>
08150 DATA 173,000,220,133,253,041,001,208 <248>
68168 DATA 085,236,251,076,2024,132,165,253
08178 DATA <05351)>
08180 DATA 192,144,007,165,252,141,001,212 <236>
081986 DATA 208,007,165,251,141,001,212,169
28200 DATA 017,141,804,212,162,030,202,208 <2826>
08216 DATA <247>
686220 DATA 208,073,001,141,032,208,141,033 <164>
082306 DATA <131>
EE

Amatörler içinde profesyonel bir klavye: