Bu sayfadaki yazılar
Sayfanın metni
Sayfa 16
Bu işlemi başlatmak için, önce grid ölçünüzü uygun bir değere ayarlamanız gerekiyor. Sonra Pause tuşuna, ardından Record tuşuna basıyorsunuz ve kayıt başlıyor. Her notayı girdikten sonra, ekrandaki "Step" tuşunu kliklemeniz gerekiyor. Eğer pulldown menüden "Auto Step" seçimini yapmışsanız, buna da gerek yok; çünkü her basılan notadan sonra editör, yeni nota için otomatik olarak yerini alıyor. Yanlış girilen nota için ise, "Back" tuşuna basarak işlemi geri alabiliyorsunuz. Kaydı sonuçlandırmak için, Stop tuşunu kliklemeniz yeterli.
Gördüğünüz gibi geçen ay gayet detaylı tasarlanmış bir sequencer sayfasından sonra, şimdi de aynı derecede ayrıntılı ve pek çok kolaylık içeren kompleks bir editörü tanıdık. Üstelik bu da yetmiyormuş gibi, bir ikinci editör sayfasına daha sahibiz.
EVENT (OLAY) EDİTÖR
SAYFASI Olay editörünü, çubuk editörden farkları ile tanıtacağız çünkü birçok işlem her iki editörde farklı tekniklerle de olsa aynı. Çubuk editörün grafik yapısından kaynaklanan kolay algılanır ve kullanılırlığı, olay editöründe pek yok.
Ekran tasarımı, yine çubuk editöre benziyor; fakat Skor penceresinin yerine yukarıdan aşağı zamana göre sıralanmış olayların listesini veren ve neredeyse bir kelime işlemci editörü gibi çalışan bir pencere var. Liste, bir takım sütunlara bölünmüş. Bu sütunlar sırası ile; olay sıra numarasını gösterir sütun (Event), olayın zamandaki yerini bağıl ya da mutlak gösteren sütun (Time), olayın atandığı midi kanal numarası sütunu (Ch), olay tipini tanımlayan sütun (Type) ve olayın veri dökümü (Data). Listenin solunda da uzun bir listede alt sayfalara hızlı erişim için bir kaydırma çubuğu var. Yine bir alet listesi ve çalma/kayıt kontrol tuşları, kanal no. seçim tuşları, olay tipi seçim tuşları ve göstergeler ekranı tamamlıyor.
Her satırda yer alan sayısal ve nota değerleri klavyeden yazılarak, + ve - tuşları ile ya da sağ alt köşedeki sürgüler ile ayarlanabiliyor. Kursor'unuzu satırlar üzerinde yukarı-aşağı, sola-sağa ok tuşları ile veya mouse yardımı ile gezdirebiliyorsunuz.
Alet listesinde farklı iki madde dikkati çekiyor;
Dup: Kursorun üzerinde durduğu satırın bir kopyası olan yeni bir satır üretiyor.
Remove: Kursorun üzerinde bulunduğu satırı (olayı) listeden siliyor.
Çalma ve kayıt işlerinin de çubuk editörden farkı yok.
Her iki editörden de pulldown menüdeki "Exit" komutu ile sequencer sayfasına çıkış sırasında yapılan değiştirme ve çalışmanın (eğer yapılmışsa) akıbeti ile ilgili olarak, size edit buffer'ının değiştirilmiş olduğu ve bu değişikliği kaydedip etmeyeceğiniz soruluyor ve dört seçenek sunuluyor;
1. CANCEL, çıkışın iptali 2. DISCARD, yapılan değişikliğin iptal edilip çıkılması
3. HOLD, sequence değiştirildiği hali ile edit buffer'ında saklansın fakat sequence belleğine kaydedilmesin ve sequencer sayfasına dönülsün, bu durumda tekrar dönüp editasyona devam edilebilecek ve sequence'in orijinal hali bozulmayacaktır ve aynı zamanda sequencer sayfasında anlatılan PREVIEW tuşu ile sequence'ın bu değişik versiyonu ile orijinali parça içinde karşılaştırılıp denenebilecektir.
4. STORE, Edit buffer'ı üstünde çalışılan sequence üzerine kaydedilip çıkılacaktır. Böylece değişiklik kalıcı kılınmış ve sequence'in eski hali iptal edilmiş oluyor.
Editör sayfalarında pulldown modül menüsünde yer alan önemli üç modül programdan söz edelim biraz da. QUANTIZER MODULE Quantizer, bir sequence'daki olayların zamanlamasının grup halinde değiştirilmesi veya düzeltilmesine yardımcı oluyor. Quantizer seçmiş olduğunuz bir ideal grid değerine göre işlem yapıyor, olayların zaman içindeki konumlarını otomatik olarak grid'in en yakın katlarına oturtuyor. Bu işi notalarla ilgili olarak farklı seçimlerle gerçekleştirmek mümkün oluyor. Notaların sırf başlangıç noktaları, sırf uzunlukları, sırf bitiş noktaları ya da bunların ikili kombinasyonları için quantizasyon gerçekleştirmek olası. Ayrıca işlem tüm sequence'daki olaylara veya sadece seçilmiş olan olaylara uygulanabiliyor.
VELOCITY SCALING
MODULE İki tür velocity söz konusudur. Attack Velocity, notanın klavyeden ne kadar hızlı basıldığını gösteren değerdir. Release Velocity ise, basılı tuşun ne kadar hızlı serbest bırakıldığını gösterir. Program içinde iki tür velocity seçenekli ve işlem tüm sequence'a ya da yalnız seçilmiş notalara uygulanabiliyor. Seçilen notaların velocity değerlerinin yeniden düzenlenmesini sağlıyor. Seçim bölgesinin başlangıcında ve sonunda yüzde kaç düzeyinde velocity değer değişimi istediğinizi sürgülerle ayarlıyor; hatta isterseniz, vurgulara biraz doğallık katmak için belli bir yüzde ile rastlantısallık da uygulatabiliyorsunuz. Program bu değerlere bağlı olarak sequence'in veya seçtiğiniz notaların velocity değerlerini değiştiriyor. AFTERTOUCH SCALING MODULE
Aftertouch mesajı, klavyeden tuşa ne kadar sert basıldığını gösterir. Parametreler ve çalışma mantığı, velocity scaling module ile aynıdır; fakat onda olduğu gibi scale aftertouch olayı iki değişik türde seçilebilmekte.
Channel aftertouch: sol elle bir akor basarken sağ elle bastığınız bir tuşa uyguladığınız baskıyı değiştirdiğinizde, elde ettiğiniz tepkideki değişim sol elin bastığı akor seslerinde de kendini hissettirdiğinde gözlenir.
Her notanın farklı efektler vermesi durumu ise Polyphonic aftertouch'ın görüntüsüdür.
Gördüğünüz gibi, belki başlangıç için karmaşık gelebilecek fakat biraz pratikle ve programın size sunduğu uygulama kolaylıkları ile kısa sürede keyifle güzel şeyler üretmenizi sağlayacak yapıda geniş ve tüm MIDI olanaklarına hakim bir yazılım Music-X.
Amatör bir müzisyene de, profesyonele olduğu kadar yardımcı olunmuş. Müzik her ne kadar bir yaratıcılık olayı ise de, güzele erişmek için ağır işçilik gerektiren bir sanat dalı olduğunu da unutmamalı. Music-X, olayın işçilik yönünü önemli ölçüde hafifletirken değişik algılama ve keyifli bir çalışma ortamı sunarak, işinizi kolaylaştırıyor. Gerisi artık sizin yaratıcılığınıza ve çabanıza kalıyor.
Buraya kadar, programın sequencer işlevlerini açıklamaya çalıştık. Önümüzdeki sayıda ise, MIDI ufkunuzu daha da geliştireceğini düşündüğüm destek amaçlı diğer sayfalarına bakacağız.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 17
Selam Assembler meraklıları! İşte bir ay aradan sonra yine beraberiz. Geçen ay fark etmişsinizdir, artık bu köşeyi ben yazıyorum. Zira bu köşenin eski yazarı Ömer Sinan POLAT, babasının yanına Hollanda'ya gitti. Fakat üzülmeyin, gene kaldığımız yerden programlı bir şekilde ilerleyeceğiz. Ayrıca bu ay dergimizde yeni bir köşe daha başladı. Bu yeni köşede, daha gelişmiş Assembler görebilirsiniz. Her zamanki gibi Amiga ve Assembler köşesinde Intuition başta olmak üzere, library ağırlıklı program hazırlamasını öğreneceğiz. Diğer köşede ise daha çok demo ve oyun programlamaya yarayan gizli bilgileri inceleyeceğiz. Blitter, copper gibi birimlere erişmek ya da kendi kopya koruma programınızı hazırlamayı GELİŞMİŞ ASSEMBLER köşesinde açıklayacağım.
Bu arada size MasterSeka assembler derleyicisinin yeni versiyonunun (v1.75) ele geldiğini de müjdelemeden edemeyeceğim. Önümüzdeki ay, MasterSeka'yı komple tanıtacağım; zira eklenen bir sürü komut ve fonksiyon, Assembler'da daha rahat çalışmamızı sağlamakta.
Bu ay yine, window'larla uğraşacağız. Bir window'a nasıl yazı yazabileceğimizi, window içine nasıl çizgi çizeceğimizi gösterdikten sonra artık window'a gerçek grafik nasıl yüklenir, onu göstereceğim. Hemen listemizi Seka yardımıyla yazalım.
Gelelim programın açıklamasına; bu program iki ay önce yayınladığım listeye bir hayli benzemekte. Bu yüzden temel rutinleri çok kısa olarak geçiştireceğim. İlk satırlara bakınca, bsr komutu olan birkaç satır görüyoruz. Bunlardan ilki INIT-LIBS altrutinine dallanmamızı sağlıyor. Bu rutinde gerekli library'ler açılmakta ve bunların base adresleri INTBASE ve GFXBASE isimli değişkenlere kaydedilmekte. Bu arada library'leri açtıktan hemen sonra d0 register'inin içeriğini kontrol etmemiz gerektiğini unutmuyoruz. Zira bu register içeriği library rutininden döndükten sonra 0 değerini taşıyorsa, o library rutini çağrılışında hata oluştu demektir. Bu hata, genelde library rutinlerine eksik bilgi aktarıldığında ya da bilgisayarınızın hafızası dolmaya başladığında ortaya çıkar. Genelde library rutinlerinin çoğu, programa geri dönerlerken d0 register'ine bir adres ya da değer yazar. Bu bilgi çağrılan library'e göre değişir.
İkinci bsr satırı INITSCREEN'e gitmemizi sağlamakta. Burada da screen ve window açılarak bunların RastPort'ları birbirine bağlanmakta. Bu arada sonraki kullanımlar için screen ve window structure'ının hafızadaki başlangıç adresleri SCREENPTR ve WINDOWPTR değişkenlerine yazılmakta. Window'a ait bulunan rastport structure'ının adresi ise, RASTPORT değişkenine yazılmakta. Bu değişkeni az ilerde kullanacağımızdan bu çok önemli.
Bir sonraki bsr satırımız, DRAWBOXES altrutinini göstermekte. İşte burası dikkat etmemiz gereken bir altrutin. Burada çizgilerin nasıl çizildiğini göreceğiz.
İlk üç satırda d0 ve d1 register'lerini longword olarak siliyoruz. Bu şekilde, en ufak bir hatanın oluşması bile engellenir. Ardından da GFXBASE değişkeninin içeriği a6 register'ine atanmakta. Bu da Graphics library'sini aktif library yapmakta.
Hemen ardından LINES değişkeninin hafızadaki adresi d7 register'ine atılmakta ve <sub.l #COORDS,d7> satırıyla da, bu adresten COORDS değişkeninin adresi çıkarılmakta. Bu sayede iki değişken arasındaki bilginin büyüklüğünü elde ederiz. Şimdi diyeceksiniz ki, bu büyüklüğü bulmamız niye gerekliydi? Okumaya devam ederseniz, nedenini siz de anlayacaksınız.
Hemen, bahsettiğim bu iki değişkenin satırlarına bakıyoruz. COORDS label'ı aslında bir değişkeni değil, bir data tablosunu göstermekte. LINE değişkeni ise sadece adres tespiti için kullandığım gereksiz bir değişken. Aynı şekilde bu değişken byte ya da word uzunluğunda da olabilirdi. Ya da dilerseniz label'dan sonra hiçbir komut yazmayın. Ne de olsa bize sadece label'ın adresi lazım.
COORDS label'ından sonra gelen data tablosuna bir göz atalım; buradaki tüm bilgiler word olarak. Label isminden de anlayacağınız gibi, bunlar x ve y koordinatları.
Her neyse, nerede kalmıştık? İki label adreslerini birbirinden çıkarınca, bu iki label arasındaki data tablosunun uzunluğunu elde ederiz. Bundan sonraki satır ise, bize koordinat çiftlerinin kaç adet olduğunu hesaplar. Aslında bizim burada iki defa ardarda, <divu #2,d7> komutunu kullanmamız lazımdı. Neden mi iki defa divu kullanıyoruz? İlki, data tablosunda kaç word olduğunu bulmamızı sağlayacaktır
(unuttunuz mu? bir word=iki byte.) İkinci divu ile, data tablosunda kaç çift sayı olduğu bulunacaktır. Data tablosunda ardarda gelen her iki sayı, bir ekran koordinatını temsil etmekte. Bu değerler noktanın x ve y eksenleri üzerindeki yerlerini belirler.
Programımıza tekrar dönelim. d7 registerine tabloda kaç çift koordinat olduğunu hesaplattırıp yazmıştık. Fakat bir sonraki satırda, bu sayıyı bir azaltıyoruz. Bu, biraz ilerde kullanmış olduğumuz dbf komutu ile yapılıyor. Bu komutun görevi, aslında iki-üç komutun görevine bedeldir. İlk önce verilen register kontrol edilerek, 0'ın altında bir değere ulaşıp ulaşmadığı kontrol edilir. Eğer register içeriği 0'ın altında bir sayıya ulaşmışsa, programa devam edilir. Aksi halde registerden hemen sonra verilen label'a atlanılır. Komutun kullanışı aşağıdaki gibidir:
DBF dx,ADRES dx, burada herhangi bir data registerini (d0-d7), ADRES ise hafıza blok diyagramında bulunan bir adresi temsil etmektedir.
lea COORDSPTR,a0 move.l (a0).a0
Geliyoruz LP label'ına. Burada COORDSPTR label'ının hafızadaki adresi a0 adres registerine atılmakta ve hemen ardından bu adreste bulunan değer, yine a0 registerine aktarılmakta. Program listemizde COORDSPTR değişkenine bakarsak, bu değişkenin COORDS data tablosunun başını gösterdiğini görürüz. Bu şekilde dolaylı bir yöntemle a0'ın COORDS data tablosunun başını göstermesini sağlarız. Niye dolaylı bir yol seçtiğime gelince, bunu da az ilerde anlatacağım.
move.w 0(a0),d0 move.w 2(a0),d1 Bu iki satır, data tablosundaki ilk iki word'ü (ilk x ve y koordinatın çiftini) d0 ve d1 registerlerine koyar. Buradaki adresleme şekline dikkatinizi çekmek istiyorum. Bu adreslemeye indexli ya da ofsetli
AMIGA ASSEMBLER