Java'da Ses

CorsaiR

Emektar
27 Ara 2005
1,228
18
Çekirdekten
Java'da SesSesin Önemi

Yirmi sene kadar önceki bilgisayarlarda henuz ekranlar gelişmediğinden, bilgisayarın kullanıcıya verdiği tüm yanıtlar kağıt üzerinde olurdu. Kullanıcılar sorunlarını delikli kartlar üzerinde hazırlarlar, cardreader denilen aygıtlarla bu kartların içerikleri bilgisayara iletilir, bilgisayarın yanıtları ise teleks türü yazıcılarla kağıt üzerine çıkardı. Klavye ve ekranların geliştirilmesi ile bu işlemler oldukça kolaylaştı. Artık kullanıcı bilgisayar ile bir tür diyalog kurabiliyor., sorunlarını klavye ile bilgisayara aktarıyor, yanıtları ise ekran üzerinde beliren yazılardan alıyordu. artık bu yöntemde zamanla yetersiz kaldı. Ekranda artık yalnızca yazılar değil, resimler, grafiklerde belirmeye başladı. Mouse ve dokunmatik ekranlar gibi aygıtlarla klavye kullanımı oldukça azaldı. Artık bir kullanıcı, özellikle Windows gibi grafiksel işletim sistemlerinde, klavyeden daha çok mouse'u kullanmaya başladı. Bilgisayardan alınan yanıtlarda görsel olmanın yanında, ses olarakta oluşmaya başlayınca, kullanım oldukça kolaylaştı. Yakın bir gelecekte eminim ki klavye ve mouse'un yerinide ses alacaktır ve bilgisayarla yapılan tüm diyaloglar ses ile gerçekleştirilecektir.

Java programlama dilide, sesli ortamı desteklemektedir. Bu bölümde Java programları içine nasıl, ses dosyalarını yerleştireceğimizi, bu dosyaları nasıl kullanabileceğimizi, özellikle applet üzerinde belirli alanları klikleyince belirli sesleri, sesli mesajları nasıl elde edeceğimizi öğreneceğiz.

Sesin Dosyaları

Windows işletim sisteminin standart ses dosyaları .WAV cinsinden olan dosyalardır, fakat java bu tür dosyaları desteklemez. Java'nın desteklediği ses dosyaları .AU türünden olup 8 bit mono ses içerirler. Ses kaliteleri pek iyi değildir, buna karşılık boyutları ufak olduğundan Internet bilgi iletişiminde fazla bir zaman kaybına neden olmazlar. Burada yapacağımız örneklerde kullanacağımız .AU ses dosyalarını Internet'ten elde ettim. Örneklere başlamadan önce aşağıdaki .AU ses dosyalarını java programlarını koyacağınız (çalıştıracağınız) dizine kaydedin.


eye.au 29.4 KB
inek.au 12.8 KB
kopek.au 34.7 KB
kuzu.au 5.57 KB


<html>
<title>ses.html</title>

<body>

<applet code=ses.class width=130 height=130></applet>

</body>

</html>


Şimdide aşağıdaki Java kaynak kodunu yazın.


import java.awt.*;
import java.applet.*;
import java.io.*;
import java.net.*;
import java.util.*;

public class ses extends Applet
{
public **** paint(Graphics graf)
{
graf.drawRect(10,10,100,100);
play(getCodeBase(), "eye.au");
}
}


Programımızı derleyip appletviewer ile çalıştırırsak asağıdaki görüntü gelecek ve bilgisayarınıza bir ses kartı ve hoparlör bağlı ise garip bir gülme sesi duyacaksınız.



Bu programda kullanılan ses dosyası eye.au adını taşıyor. Fakat siz dilediğiniz başka bir ses dosyasınıda kullanabilirsiniz. Bunun için Internet'in olanaklarından faydalanabilir ve bir çok değişik ses dosyasını bilgisayarınıza alabilirsiniz.
İşte size birçok .AU dosyasını bulabileceğiniz bir adres: http://info.fuw.edu.pl/multimedia/sounds/

Bu programda applet çalıştığı anada sesleri duymaya başlıyoruz. Belirli bir süre sonrada bu sesler kesiliyor. Eğer browser'ınızdaki scroolbarları (sağ tarafında bulunan yatay cubuk) applet gözden kaybolup yeniden ekrana gelicek şekilde hareket ettirirseniz sesler yeniden duyulmaya başlayacaktır. Applet penceresine her yeniden çiz komutu geldiğinde Java ses dosyasınıda yeniden çalacaktır.

Ses dosyasını:
play(getCodeBase(),"eye.au");
komutu ile devreye sokuyoruz. Programda dikdörtgen çizme nedenimiz, bu dikdörtgenin her çiziminde ses dosyasının Java tarafından çalınmasını sağlamaktı. Eğer bilgisayarınızda ses kartınız yoksa sadece dikdörtgen çizimini göreceksiniz.

Ses dosyalarının appletin çalıştığı alanda bulunması zorunlu değildir. Programa ufak bir eklenti ile ses dosyalarınızı istediğiniz dizinde tutabilirsiniz. Bunun için programı
play(getCodeBase(), "/audio/eye.au");
Şeklinde değiştirsek eye dosyasının audio adlı dizinde olması gerekir. Burada dikkat etmeniz gereken en önemli özellik kullanılan taksim işaretinin normal taksim işareti (/) olduğudur. Eğer ters taksim kullanılırsa ses dosyası program tarafından bulunmayacak ve herhangi bir ses duyulamayacaktır.

Mouse Kontrollü Ses Kullanımı ve Mouse Ko0rdinatları
Yazacağımız yeni appletin daha büyük bir alana ihtiyacı olduğundan önce yeni bir html dosyası oluşturalım.

<html>
<title>mouseses.html</title>
<body>

<applet code=mouseses.class width=400 height=300> </applet>

</body>

</html>


Yazacağımız programın Java kaynak kodu:


import java.awt.*;
import java.applet.*;
import java.io.*;
import java.net.*;
import java.util.*;

public class mouseses extends Applet
{
int xKoordinati;
int yKoordinati;
//-------------------------------------------------------
public **** paint(Graphics graf)
{
String xPozisyonu;
String yPozisyonu;

graf.drawRect(10,10,150,150);
graf.drawRect(175,10,150,150);

xPozisyonu="Farenin x pozisyonu:";
Pozisyonu="Farenin y pozisyonu:";

Pozisyonu=xPozisyonu+String.valueOf(xKoordinati);
yPozisyonu=yPozisyonu+String.valueOf(yKoordinati);

graf.drawString(xPozisyonu,25,200);
graf.drawString(yPozisyonu,25,250);

}//paint class'inin sonu

public boolean mouseDown(java.awt.Event e,int x,int y)
{

xKoordinati=x;
yKoordinati=y;

if ((x>9) & (x<161) & (y>9) & (y<161))
play(getCodeBase(),"inek.au");
else if ((x>174) & (x<326) & (y>9) & (y<161))
play(getCodeBase(),"kopek.au");
else play(getCodeBase(),"kuzu.au");

repaint();
return true;

}//mouseDown metodunun sonu
}

Programımızı derlayip appletviewer ile derlersek aşağıdaki görüntüyü elde edersiniz. Soldaki dikdörtgen içerisinde mouse'u kliklerseniz, sağdaki dikdörtgen içindeki kliklemeden farklı bir ses duyarsınız. Her iki dikdörtgenin dışında kalan bir alanda butona bastığınızda değişik üçüncü bir ses duyarsınız.
Mouse'un her kliklenişinden sonra pencerenin alt bölümünde, klikleniş esnasında mouse cursor'unun hangi koordinatlarda olduğu ekranda belirecektir.


<applet code="mouseses.class" align="baseline" width="400" height="300"></applet>

mouseses.class appletini kullanıyor


Şimdi programımızı açıklamaya geçelim:
Mouse koordinatlarını barındıran iki değişkeni :


int xKoordinati;
int yKoordinati;


program satırları ile tanımlıyoruz. Ekrana yansıyacak olan iki mesajın tanımı ise


String xPozisyonu;
String yPozisyonu;


satırları ile gerçekleştiriyoruz. Applet penceresi içine yerleştirmek istediğimiz 2 dikdörtgeni

graf.drawRect(10,10,150,150);
graf.drawRect(175,10,150,150);


satırları ile çiziyoruz. Ekranda belirmesi gereken mesajın içeriğini


xPozisyonu="Farenin x pozisyonu:";
yPozisyonu="Farenin y Pozisyonu";

xPozisyonu=xPozisyonu+String.valueOf(xKoordinati);
yPozisyonu=yPozisyonu+String.valueOf(yKoordinati);


satırları ile hazırlıyor ve


graf.drawString(xPozisyonu,25,200);
graf.drawString(yPozisyonu,25,250);


satırları ile bu mesajı ekrana getiriyoruz.
Bundan sonraki mouseDown metodu, applet üzerinde herhangi bir yer kliklendiğinde devreye giriyor. Klikleniş esnasında cursor kordinatlarını


xKoordinati=x;
yKoordinati=y;


satırları ile saklıyoruz.
Sıra klikleniş koordinatlarına göre değişik bir ses dosyasını devreye sokmaya geliyor. Bu mantığı


if ((x>9) & (x<161) & (y>9) & (y<161))
play(getCodeBase(),"inek.au");
else if ((x>174) & (x<326) & (y>9) & (y<161))
play(getCodeBase(),"kopek.au");
else play(getCodeBase(),"kuzu.au");


program satırları ile gerçekleştiriyoruz. Soldaki dikdörtgenin sol üst köşesi pencere içinde x=10 ve y=10 koordinatlarında bulunuyor. Eni ve yüksekliği 150 pixel olduğundan bu dikdörtgenin sınırlarını (x>9 & x<161 & y>9 & y<161) ifadeleri belirtir. Buna göre x koordinatlarının değeri 10 ile 160 arasında ise ve y koordinatlarının değeride 10 ile 160 arasındaysa, mouse butonu soldaki dikdörtgen içinde kliklenmiş olacaktır. Basit bir if tekniği ile bu belirleme yapılmıştır.

if (x>9 & x<161 & y>9 & y<161)
Bu if tekniğinde eğer karşılaştırma doğru ise fare soldaki dikdörtgende kliklenmiş olacak ve

play(getCodeBase(),"inek.au");

program satırı ile inek.au dosyası çalınacak ve metod terkedilecektir. sağdaki dikdörtgenin sol üst köşesi pencere içinde x=175 ve y=10 koordinatlarında bulunuyor. Eni ve yüksekliğide 150 pixel olduğundan sınırları kolayca hesaplanıp basit bir if tekniği yazılmıştır. Buna göre x koordinatının değeri 175 ile 325 arasında ise ve y koordinatlarının değeride 10 ile 160 arasında ise, mouse butonunun sağdaki dikdörtgen içinde kliklendiği ortaya çıkıyor. Bunu if mantığı ile şu şekilde kullandık.

else if (x>174 & x<326 & y>9 & y<161)

bu karşılaştırmanın sonucu doğru ise

play(getCodeBase(),"kopek.au);

program satırı ile kopek.au dosyasını çalıp , metodu terkediyoruz. Eğer her iki dikdörtgenin içinde de mouse kliklenmemişse

else play(getCodeBase(),"kuzu.au");

program satırı ile kuzu.au dosyası çalınıp metod terkediliyor.

rapaint();

komutu ile ise mouse her kliklenişinde ses dosyalarının çalınmasını sağlıyoruz.
Susmayan Bilgisayar
Bir appletin çaldığı bir ses dosyasının daha değişik bir kontrol yöntemini, aşağıda yaptığımız yeni programda görmektesiniz. Yine önce HTML dosyamızı oluşturalım.


<html>
<title>susmayan bilgisayar</title>

<body>

<applet code=music.class width=400 height=300></applet>

</body>

</html>


Şimdi de Java programımızın kaynak kodunu yazalım.


import java.awt.*;
import java.applet.*;
import java.io.*;
import java.net.*;
import java.util.*;

public class music extends Applet
{

int xKoordinati;
int yKoordinati;
//-------------------------------------------------------
public **** paint(Graphics graf)
{

String xPozisyonu;
String yPozisyonu;

graf.drawRect(10,10,150,150);
graf.drawRect(175,10,150,150);

xPozisyonu="Farenin x pozisyonu:";
yPozisyonu="Farenin y pozisyonu:";

xPozisyonu=xPozisyonu+String.valueOf(xKoordinati);
yPozisyonu=yPozisyonu+String.valueOf(yKoordinati);

graf.drawString(xPozisyonu,25,200);
graf.drawString(yPozisyonu,25,250);

}//paint class'inin sonu

public boolean mouseDown(java.awt.Event olay,int x,int y)
{

xKoordinati=x;
yKoordinati=y;

AudioClip music1=getAudioClip(getCodeBase(),"music1.au");

AudioClip music2=getAudioClip(getCodeBase(),"music2.au");

AudioClip music3=getAudioClip(getCodeBase(),"ciglik.au");

if (x>9 & x<161 & y>9 & y<161)
{
music2.stop();
music1.loop();
}
else if (x>174 & x<326 & y>9 & y<161)
{
music1.stop();
music2.loop();
}
else {
music1.stop();
music2.stop();
music3.play();
}

repaint();

return true;
}
//mouseDown metodunun sonu

}



music1.au 144 KB
music2.au 153 KB
ciglik.au 6.91 KB


music.class appletini kullanıyor.



Bu programda


AudioClip music1=getAudioClip(getCodeBase(),"music1.au");
AudioClip music2=getAudioClip(getCodeBase(),"music2.au");
AudioClip music3=getAudioClip(getCodeBase(),"ciglik.au");


satırları ile üç değişik ses dosyasını, üç parça olarak tanımlıyoruz. Bu üç değişik müzik dosyasına muzik1, muzik2 ve muzik3 adlarını veriyoruz.
Eğer bir parçayı bir kez çalmak istiyorsak:

muzik1.play();

komutu yeterlidir. Sürekli olarak çalmak istiyorsak:

muzik1.loop();

komutunu kullanıyoruz. Sürekli olarak çalmakta olan bir ses dosyasını durdurmak için ise

muzik1.stop();

komutundan yararlanıyoruz.
Örneğimizde sol dikdörtgen kliklenince sürekli bir müzik çalınır aynı şekilde sağ dikdörgen kliklenince de sürekli değişik bir müzik çalınır. dikdörtgenlerin dışındaki bir alan kliklenincede bir cığlık duyularak bilgisayar susar.

şağıdaki örnekte, çoklu sunum ortamında kaydedilen bir sesin Java ile nasıl bir Web sayfasına aktarıldığını görmektesiniz. Bu işlem için çoklu sunu ortamının ses kaydedici modülü ve mikrofon ile ses .WAV formatında kaydedilir. WAV formatı ile kaydedilen ses .AU Formatına (Goldwave, v.b.yazılımlar kullanılarak) dönüştürülür. Aşağıda kodlaması verilen Java programı ile kullanıma sunulur.


import java.awt.*;
import java.applet.*;
import java.io.*;
import java.net.*;
import java.util.*;

public class benimsesim extends Applet
{
public **** paint(Graphics graf)
{
graf.drawRect(10,10,100,100);
play(getCodeBase(),"ses.au");
}
}
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.