C-64 ve MIDI

Profesyonel müzisyenlerin uzun zamandır tanıdıkları bir kavram: MIDI. Bu kelimenin ardında yatan ne? Bilgisayar meraklıları bu teknolojiden nasıl yararlanabilirler?

Çoğu kişi artık MIDI kavramını yakından tanıyor. Birçok müzisyen artık C64'ünü bir ya da birden çok synthesizer'la bağlamak için bu arabirimi kullanıyor. Bu teknolojinin sunduğu olanaklar bununla da kısıtlı değil. Uygun yazılım kullanılarak 16 taneye kadar C64'ü birbirine bağlayıp bir ağ oluşturmak mümkün. Bunun oyunlar, bilimsel ya da ticari işlerle ilgili olarak bir fantezi düzeyinde kalmaması için, biraz donanım ve bunun programlanması konusuyla ilgilenelim.

MIDI DONANIMININ YAPISI

C64 için sıradan bir MIDI arabiriminde MIDI-In, MIDI-

Thru ve MIDI-Out olmak üzere üç uç bulunur. Bunlardan MIDI-Thru ucu, giren verilerin aktarılmasını sağlayan çok basit bir donanımdan oluşur. Bunun aksine MIDI-In ve MIDI-Out uçları, entegre bir arabirim elemanı tarafından denetlenirler. Burada kullanılan eleman, Motorola tarafından üretilen UART (Universal Asynchronous Receiver Transmitter) 68B50'dir. Bu eleman bir kuvars osilatörü üzerinden 2 MHz'lik işletim frekansıyla beslenir. Bu frekans dealt bölümleme yöntemiyle diğerlerinin yanı sıra MIDI aktarım standardı için gerekli olan 31.25 kHz'lik bit frekansı elde edilir. UART 68B50'nin bu amaçla kullanılan programlanabilir bir bölücüsü vardır. 31.25 KBaud'luk aktarım değerine 1:64'lük bir bölmeyle erişildiğine göre, mutlaka daha yüksek hızlara erişilebileceği düşünülebilir. Matematiksel olarak 1:1'lik bir bölme oranında 2 Mbaud'luk bir veri aktarım değeri söz konusu olabilir. Tabii bu düzeyde bir aktarım değeri, C64'te kendi işleyiş hızından dolayı fazla gelecektir. Bu yazıyı okuyan “hız fanatikleri”ni bunun aksini kanıtlamaya çağırıyoruz. Aktarım hızını kısıtlayan bir başka faktör de arabirim donanımının kendisidir. Birbirine bağlı aletler arasındaki potansiyel farklarından ötürü oluşması muhtemel “boşalma felaketleri”ni engellemek üzere, giriş hattında (MIDI-In) galvanize ayrımı sağlayacak bir optokoppler bulunmaktadır. Bu optokopplerin limit frekansı, erişilebilecek bit frekansı için bir üst sınır oluşturmaktadır. 1:16 oranıyla elde edilen 125 Kbaud'luk bir aktarım hızı, klasik donanımlarda müzik elektroniği alanında da kullanılan gerçekçi bir değerdir. Dijitalize edilmiş ses verilerinin aktarımı için geliştirilmiş bir norm olan “MIDI-Sample-Dump-Standard”la bağlantılı olarak, bazı üreticiler bu işletim türüne dönüştürmeyi sağlayan bazı komutlar ürettiler, çok kapsamlı sample verilerinin (bazen MByte'lara varan) aktarılması böylece kabul edilebilir zaman süreleri içinde gerçekleşebiliyor. Eğer yönetim yazılımı oluşturmak isterseniz, en başta UART 68B50'nin işleyiş biçimini ve sicil yerleşimini açıkça bilmeniz gerekir (resim). Arabirim elemanı ikisi veri sicili olmak üzere dört adet 8 bitlik sicil içerir. Veri gönderme sicilinde yazılım her defasında bir biti aktarım için ayırabilir. UART bu baytın gönderilmesini sağlar, daha sonra durum sicili aracılığıyla veri gönderme sicilinin bir sonraki bayt için serbest olduğu bildirilir. Veri alma sicili tarafından her de-

6 5 8 va Gönderilen veriler sicili ($DE05) Gönderilen veriler Alınan veriler sicili ($DE07) Alınan veriler Yönetim Alma (Gönderme) Aktarım Bölümleme ($DE04) IRQ formatı oranı Durum sicili Parite Alım (Gönderme) Alma ($DE06) hatası taşması FE CT5 DOO sicili sicili boş dolu fasında en son alınan bayt okunur. Programlama açısından en önemlisi, yönetim sicilidir. Bu sicil, işletim parametrelerinin ve veri aktarım değerlerinin belirlenmesini sağlar. Yönetim sicilinin en küçük değere sahip iki biti, bunun için bölme oranını belirler (Tablo 1). Elemanın içinde entegre olarak bulunan bölücü, 1 MHz'lik işletim hızını örneğin istenen 31.25 kHz'lik hıza indirir (MIDI standardı). Her iki bit de doluysa (master reset), eleman bir önceki hatalı programı ciddiye almaz. Dolayısıyla bu master reset'in, çalıştırmak için bir çok kez deneme yapmaya gerek bırakmayacak şekilde, her MIDI programının başına konmasında yarar var. Deneme için 2. bitten 4. bite kadarki ayarlamalar da ilginç olabilir (Tablo 2). Burada esas olarak 8 bit aktarım formatları tablonun alt yarısında yer alıyor, bununla artık tarihi sayılabilecek teleksler MIDI üzerinden ses verir hale getirilebiliyor. (Teleksleri şaşırtıcı bir şekilde taklit edebilen) Synthesizer'lar ve Sampler'lar, F ayarındaki MIDI normuna (8 veri biti, parite yok, 1 stop biti) tepki gösterirler. Fakat çok daha güvenli olduğundan, bilgisayarlar arasında veri değiş tokuşunda Parity bitinin kullanılması mutlaka daha yararlıdır. Çift (G) veya tek (H) olması önemli değildir, MIDI kablosunun her iki ucundaki formatların birbirine uyması yeterlidir.

Resim: 68B50 arabirim elemanının sicili.

Veri aktarımında herhangi bir hatanın olup olmadığının denetimini arabirim bizzat üstlenmiş durumdadır. Bozuk byte'ların değiş tokuşu (ya da tekrarlanması), üreticinin (gönderen bilgisayarın) yazılımı tarafından gerçekleştirilmek durumundadır. 5. ve 6. bitlerin anlamı, Tablo 3'te görülüyor. Bir MIDI bağlantısının varlığında burada yalnızca A ve B bir anlam taşımaktadır (68B50, başka türde seri bağlantı kullanımlarında da yararlı olmaktadır). 6. bit, MIDI bağlantısında daima sıfırdır, 5. bit ise gönderim Interrupt'unu açar. Eğer bir bayt kablo üzerinden başarılı bir biçimde gönderilmişse ve gönderilen veriler sicili yeni baytları bekliyorsa, gönderim Interrupt'unun açık olması (B) durumunda bir IRQ gerçekleşir. 7. bit, aynı şekilde alıcı Interrupt'unu açar. Bu durumda ise bir IRQ'nun gerçekleşmesi, bir baytın tümüyle varmasıyla olur. Kaliteli MIDI programlarında bu mutlaka “1” olmalıdır, böylece gelen baytlar derhal alınan veriler sici-

Yönetim sicili: Bölümleme oranı — Aktarım hızı Bit 1 Bit 0 1:1 2 MBaud 0 0 1:16 125 KBaud 1 0 1:64 31,25 KBaud 1 1 Arabirim elemanını başlangıç durumuna getirir (Master Reset) Tablo 1. Bu bitler aktarım hızını belirler Yönetim sicili bit Veri biti Stop-bit — Format 4 3 2 0 0 0 7 2 Çift A 0 0 1 7 2 Tek B 0 1 0 7 1 Çift C 0 1 1 7 Tek D 1 0 0 7 1 Tek D 1 0 0 8 2 Yok E 1 0 1 8 1 Yok F 1 1 0 8 Çift G 1 1 1 8 Tek H Tablo 2. UART 6850'nin aktarım formatları Gönderme kontrol bitleri ta Send Format 0 0 Engellenmiş 0 A 0 1 Serbest 0 B 1 0 Engellenmiş 1 C 1 1 Engellenmiş/ 0 D kesme sinyali gönderiyor linden güvenli bir bellek alanına aktarılabilir. Aksi takdirde gelen baytın bir sonraki tarafından silinmesi olasılığı vardır. Durum sicili, aktarma işlemine ilişkin bilgileri içerir. Alınan veriler sicili dolu olduğunda, yani bir bayt alındığında, 0. bit “1” olur. Arabirim elemanı gönderilen veriler siciline yerleşmiş olan bayttan kurtulduğunda, durum sicilinin 1. biti dolu olur. 2.-4. bitlerin MIDI programlanması açısından özel bir önemleri yoktur. Tabloda bu bitlerin verilmesi, eksik sanılmamaları içindir. Eğer yazılım, alınan bir baytı alınan veriler sicilinden zamanında okuyamamışsa, 5. bit “1” olur. İyi programlanmış MIDI yazılımlarında, yukarıda da belirtildiği gibi, böyle bir durumun ortaya çıkmaması gerekir. Bu kuralın pek istenmeyen istisnaları, Interrupt'larla yönetilen her veri aktarım işleminde meydana gelebilir. Bu durum, bilgisayarın işletim hızının ayarlanmış veri aktarım hızına (örneğin 2 Mbaud) yetmediğini ya da veri alım rutininin yeterli hıza erişmediğini ortaya koyan bir göstergedir. Durum sicilinin 6. biti, pariteli bir aktarım formatı kullanıldığında önem kazanır. Eğer bu bit doluysa, son olarak alınan bayta dikkat edilmelidir, çünkü UART bir parite hatası buldu demektir. Arabirim elemanı, durum sicilinin son defa kullanılmasından sonra bir Interrupt gerçekleştirdiyse, 7. bit “1” değerini alır. Böylece bir Interrupt-servis rutini, MIDI arabiriminin bir IRQ verip vermediğini denetlemiş olur. Döküm 1 adıyla yayınladığımız Assembler programı, MIDI standart formatındaki verilerin Interrupt'larla yönetilen alınmasını ve gönderilmesini sağlayan rutinleri içeriyor. Alınan ya da gönderilmek üzere belirlenen baytlar her defasında 256 baytlık bir ara belleğe depolanır. Böylece bu rutinlere dayalı kullanımlar, aktarımdan bağımsız olarak çalışabilirler. Aktarılacak baytlar kullanıcı program tarafından 51987 adresinden (BASIC, Assembler'de $CB60) başlayan rutinler üzerinden çıkış çember arabelleğine iletilir. Esas çıkış ise Interrupt sırasında gerçekleşir. Alınan baytlar aynı şekilde bir Interrupt gerçekleştirirler ve IRQ servis rutini tarafından giriş çember arabelleğine iletilirler. Oradan BYTEGET ($CB1D, ondalık 51997) rutini aracı-

Tablo 3. Yönetim sicilinin gönderme kontrol bitleri

ebü00 cbf'7

ız
60
00
£7
cb
ad
20
ea
e&
dd
a9
15
ad
eb 58 60 03

lığıyla kullanıcı programa alınabilirler. Her defasında bir bayt aküye geri verilir. Çember arabelleğin ve arabirim elemanının adlandırılması ve aynı zamanda sistem-Interrupt'unun etrafından dolaşılabilmesi için diğer rutinlerin kullanılmasından önce, INIT'in ($CB00, ondalık 51968) çağrılması gerekir. Kaynak kodlarının dökümünü bu sayımızın okuyucu servisi bölümünde bulabilirsiniz. Döküm 2, gönderme ve alma rutinlerinin denenmesi için kısa bir demo programı (lütfen Checksummer kullanın ve SAVE “MIDITEST”, 8 komutuyla saklayın). Kapalı durumdaki bilgisayarınızın expansion portuna

PROGRAM ADI :

TEST
REM *& MİDİ TEST
00915
TO &
90030 RENO E, :
5v5 Sise7,
<134>
60860 FOR Izi TO & xB54;
2009076 5Y5 Siğar
PRİNT
HEXT 1
©0100 DATA 2

MIDI arabirimini takın ve MIDI-Out çıkışından bir kabloyu MIDI-In girişine bağlayın. Şimdi C64'ünüzü açın ve önce assembler rutinini ve sonra demo programını yükleyin. Bunu yapmak için

LOAD“MIDI1.OBI”,8,8
ve
LOAD “MIDITEST”,8,0

satırlarını yazmanız ve ardından RUN etmeniz gerekiyor. Bunu yaptığınızda arabirim, DATA satırındaki rastlantısal sayıları kendisine gönderir ve gönderilen ve alınan verileri ekranda görüntüler. Sayıların birbiriyle uyuşması durumunda MIDI arabirimi ve sürücü rutinleri uyumlu bir şekilde birlikte çalışırlar. Eğer ilginizi çekerse, rutinleri, C64'ten dairesel bir MIDI ağında anlamlı bir veri aktarımı oluşturacak şekilde geliştirebiliriz. Bunu yaparken kendinize özgü program çözümleri üretmenizi sağlamak için, ağ yazılımlarının oluşturulmasına ilişkin bazı temel bilgilere sahip olmanız gerekir. Çember biçimli bağlantı, bu sayımızdaki “Bilgisayar Bağlantı Arıyor” yazımızda açıklanıyor. Bu bağlantıda, çember içinde aktarılan bilgilerin istasyondan istasyona iletilmesi gerektiğini görüyorsunuz. Bu iş, ağ yazılımı tarafından olabildiğince gecikmesiz olarak yapılmalıdır. Bu sırada işlemciden oluşan ağır yükün yanı sıra, MIDI-Thru üzerinden yapılan donanımı destekli veri aktarımına oranla daha büyük bir zamansal gecikme ortaya çıkar. Ayrıca çember içinde yollanan tüm bilgilerin adres verileriyle donatılmış olması gerekir. Müzik enstrümanları için geçerli olan MIDI aktarım standardında, doğru alıcı istasyonunun bulunabilmesi için, her bilgi paketinin kendinden önce yollanan bir durum baytını takip etmesi gerekir. Bu durum baytının betimlenmesi için kullanılan en yüksek değerli bit, bu durum baytının diğer yüksek değerli üç biti komut modunu belirtir. Bilgiyi alan enstrümana, bir sesin başlamasını, sonunu veya ton değişikliği, ses yüksekliği (Pitch-Bend) vb. diğer MIDI fonksiyonlarını yerine getirmesini bildirir. Düşük değerli 4. bitle olası 16 aktarım kanalından biri seçilir. Bilgisayarlar arasında veri aktarımında bu yolla birbirinden farklı 16 adresin oluşturulması mümkün. Ayrıca üç komut biti aracılığıyla sekiz farklı işletim türü tanımlamak da mümkün. Fakat bu bitleri kullanarak yapılacak en yararlı iş, daha sonra gelen veri baytlarının sayısını bildirmek. Bu bilginin iletilmesinden kaçınılacak olursa, bir veri baytının en yüksek değerli bitinde 1 bulunmaması gerekir, aksi takdirde bunu bir durum bitinden ayırmak olanaksızdır. Böylece aktarılacak verilerin 8 bitlik bir yapıdan 7 bitlik bir yapıya dönüştürülmesi gerekiyor. Bunun yapılması hesaplama ve program kullanımını oldukça hızlandırıyor.