Dinamik olarak oluşturulmuş sesle çalışma

Flash Player 10 ve üstü, Adobe AIR 1.5 ve üstü

Not: Flash Player 10 ve Adobe AIR 1.5'ten itibaren dinamik olarak ses oluşturma yeteneği kullanılabilir.

Varolan bir sesi yüklemek veya akışa almak yerine, dinamik olarak ses verisi oluşturabilirsiniz. Sound nesnesinin sampleData olayı için bir olay dinleyicisi atadığınızda ses verisi oluşturabilirsiniz. ( sampleData olayı, flash.events paketindeki SampleDataEvent sınıfında tanımlanır.) Bu ortamda, Sound nesnesi bir dosyadan ses verilerini yüklemez. Onun yerine, bu olaya atadığınız işlevin kullanımı aracılığıyla kendisine akışa alınan ses verileri için bir soket görevi görür.

Bir Sound nesnesine sampleData olay dinleyicisi eklediğinizde, nesne düzenli aralıklarla ses arabelleğine eklemek için veriler ister. Bu arabellek, oynatılacak Sound nesnesinin verilerini içerir. Sound nesnesinin play() yöntemini çağırdığınızda, bu yöntem yeni ses verileri istenmesi durumunda sampleData olayını gönderir. (Bu yalnızca Sound nesnesi bir dosyadan mp3 verilerini yüklemediğinde gerçekleşir.)

SampleDataEvent nesnesi bir data özelliğine sahiptir. Olay dinleyicinizde, bu data nesnesine ByteArray nesnelerini yazarsınız. Bu nesneye yazdığınız bayt dizileri, Sound nesnesinin oynattığı ses verilerine eklenir. Arabellekteki bayt dizisi, -1 ile 1 arasında kayan nokta değerlerinin bir akışıdır. Her kayan nokta değeri, bir ses örneğinin tek bir kanalının genliğini (sol veya sağ) temsil eder. Ses, saniyede 44.100 örnek hızında örneklenir. Her örnek, bayt dizisinde kayan nokta verisi olarak araya eklenmiş bir sol ve sağ kanal içerir.

İşleyici işlevinizde, sampleData olayının data özelliğine yazmak için ByteArray.writeFloat() yöntemini kullanırsınız. Örneğin, şu kod bir sinüs dalgası oluşturur:

var mySound:Sound = new Sound(); 
mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, sineWaveGenerator); 
mySound.play(); 
function sineWaveGenerator(event:SampleDataEvent):void 
{ 
    for (var i:int = 0; i < 8192; i++) 
    { 
        var n:Number = Math.sin((i + event.position) / Math.PI / 4); 
        event.data.writeFloat(n); 
        event.data.writeFloat(n); 
    } 
}

Sound.play() öğesini çağırdığınızda, uygulama olay dinleyicinizi çağırmaya başlayarak ses örneği verilerini ister. Siz veri sağlamayı durduruncaya kadar veya SoundChannel.stop() öğesini çağırıncaya kadar ses çalındığı sürece uygulama olay göndermeye devam eder.

Olayların gecikmesi platformdan platforma değişiklik gösterir ve Flash Player ve AIR uygulamasının gelecekteki sürümlerinde değişebilir. Belirli bir gecikmeye güvenmeyin; mutlaka gecikmeyi hesaplayın. Gecikmeyi hesaplamak için şu formülü kullanın:

(SampleDataEvent.position / 44.1) - SoundChannelObject.position

SampleDataEvent nesnesinin data özelliğine 2048 ile 8192 arasında örnek sağlayın (olay dinleyicisine yapılan her çağrı için). En iyi performans için mümkün olduğu kadar çok örnek sağlayın (en fazla 8192). Ne kadar az örnek sağlarsanız, oynatma sırasında o kadar çok tıklatma öğesi ve açılır pencere ortaya çıkar. Bu davranış çeşitli platformlarda değişiklik gösterebilir ve çeşitli durumlarda ortaya çıkabilir; örneğin, tarayıcıyı yeniden boyutlandırırken. Yalnızca 2048 örneği sağladığınızda tek bir platformda çalışan kod, farklı bir platformda çalıştırıldığında çalışmayabilir. Olası en düşük gecikme gerekiyorsa, veri miktarını kullanıcı tarafından seçilebilir duruma getirin.

2048'den daha az örnek ( sampleData olay dinleyicisine yapılan her çağrı için) sağlarsanız, kalan örnekler çalıştırıldıktan sonra uygulama durdurulur. Ardından SoundChannel nesnesi bir SoundComplete olayı gönderir.

mp3 verilerinden sesi değiştirme

Sound nesnesinden verileri ayıklamak için Sound.extract() yöntemini kullanırsınız. Oynatma için başka bir Sound nesnesinin dinamik akışına yazmak üzere bu verileri kullanabilirsiniz (ve değiştirebilirsiniz). Örneğin, aşağıdaki kod, yüklenen MP3 dosyasının baytlarını kullanır ve bir filtre işlevi ( upOctave() ) üzerinden bunları iletir:

var mySound:Sound = new Sound(); 
var sourceSnd:Sound = new Sound(); 
var urlReq:URLRequest = new URLRequest("test.mp3"); 
sourceSnd.load(urlReq); 
sourceSnd.addEventListener(Event.COMPLETE, loaded); 
function loaded(event:Event):void 
{ 
    mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound); 
    mySound.play(); 
} 
function processSound(event:SampleDataEvent):void 
{ 
        var bytes:ByteArray = new ByteArray(); 
        sourceSnd.extract(bytes, 8192); 
        event.data.writeBytes(upOctave(bytes)); 
} 
function upOctave(bytes:ByteArray):ByteArray 
{ 
    var returnBytes:ByteArray = new ByteArray(); 
    bytes.position = 0; 
    while(bytes.bytesAvailable > 0) 
    { 
        returnBytes.writeFloat(bytes.readFloat()); 
        returnBytes.writeFloat(bytes.readFloat()); 
        if (bytes.bytesAvailable > 0) 
        { 
            bytes.position += 8; 
        } 
    } 
    return returnBytes; 
}

Oluşturulan seslerdeki sınırlamalar

sampleData olay dinleyicisini bir Sound nesnesiyle kullandığınız zaman etkinleştirilmiş olan diğer Sound yöntemleri yalnızca şunlardır: Sound.extract() ve Sound.play() . Başka bir yöntemin veya özelliğin çağrılması bir istisnayla sonuçlanır. SoundChannel nesnesinin tüm yöntemleri ve özellikleri etkin kalmaya devam eder.