Flash.jpw

  • Obecné
  • Adobe Flash
  • ActionScript 1 & 2.0
  • ActionScript 3.0
  • ActionScript 3.0

  • Úvod do ActionScriptu 3.0
  • Nové jazykové pomůcky
  • Metody a funkce
  • Třídy
  • Systém událostí
  • Display objekty a Display list
  • Regulární výrazy
  • XML a E4X
  • Zvuk
  • Internetová komunikace
  • Předchozí: XML a E4X
  • Následující: Internetová komunikace
  • Zvuk

    Ke streamovanému přehrávání zvuků přidává AS3 i práci se surovými zvukovými daty, což umožňuje zvuk vizualizovat nebo naopak generovat a filtrovat. Třetí verze také zpřehledňuje hierarchii zvukových objektů.

    Ukázky opravdu produkují zvuk, ne zemlbábu. Dvoukilohertzové pískání ve tři v noci sousedy probudit bez větších problémů zvládne.

    Obecná ergonomie

    Ambientní hudbu je radno nepoužívat nebo omezit na nezbytné minimum. Je totiž otravná jak činže.

    Pokud klient trpí přeludem, že jeho kýčovité fotogalerii chybí k dokonalosti už jen Mozart, je dost náročné mu to vyvracet. V takovém případě je vhodné viditelně umístit ovládací prvek hlasitosti, který, a na to programátoři typicky z vysoka serou, by si měl pamatovat své nastavení prostřednictvím cookie nebo SharedObject i do příští návštěvy.

    Taky je vhodné návštěvníky nelekat a používat jemné přechodové efekty hlasitosti a tu celkově nevolit s maximální výchozí hodnotou.

    Objektová hierarchie zvuku

    Hierarchie zvukových objektů

    Objekt Sound reprezentuje externí zvukový soubor (typicky mp3) nebo interní zvuk v knihovně. Jeho spuštění iniciuje metoda play, které je možné předat také nastavení vyvážení a hlasitosti objektem SoundTransform.

    Pro přehrávání je otevřen nový zvukový kanál, který reprezentuje objekt SoundChannel. Jeho instance je návratovou hodnotou zmíněné metody play. Počet současně otevřených kanálů je omezen Flash Playerem. Podle dokumentace je to aktuálně 32.

    Na nejvyšším místě hierarchie je statický objekt SoundMixer, sdružující všechny kanály.

    Jednoduché načtení externího zvuku

    Vzhledem k tomu, že zvukové soubory už dosahují velikostí v řádech megabajtů, nepřidávají se do knihovny SWF, ale přehrávají se externě a streamovaně už během načítání.

    var sound:Sound = new Sound();
    sound.load(new URLRequest('sample.mp3'), new SoundLoaderContext(2000));
    var channel:SoundChannel = sound.play();

    Jak můžete vidět, je načten soubor sample.mp3 pomocí klasického URLRequest. Velikost bufferu je definována v instanci objektu SoundLoaderContext na dvě sekundy.

    Při zavolání metody play je pak zvuk spuštěn ve chvíli, kdy jsou načteny alespoň dvě sekundy. Průběh načítání také signalizují události progress a complete.

    Za zmínku stojí také událost id3, která signalizuje, že jsou k dispozici pod stejnojmennou vlastností metadata mp3 souboru, jako je název alba, autora a podobně.

    SoundChannel

    Ovládání zvuku je pak cíleno na zvukový kanál.

    channel.stop();

    Metoda stop například zvuk zastaví. Opětovné spuštění je pak opět třeba provést metodou play - tentokrát s nenulovým ofsetem.

    channel = sound.play(channel.position);

    Vlastnost position je aktuální (poslední) pozice přehrávání.

    SoundTransform

    Především hlasitost nastavuje objekt SoundTransform. Ten je možné kanálu předat už při spuštění, nebo je dostažitelný také ve vlastnosti soundTransform.

    channel.soundTransform = new SoundTransform(0.5);

    Zde je zvukový kanál zeslaben na 50%.

    Vizualizace

    Zvukový mixér, statický objekt SoundMixer, obsahuje metodu computeSpectrum, která umí získat aktuální sadu vzorků přehrávaného zvuku. To umožňuje velmi jednoduchou tvorbu vizualizací.

    Notoricky známý je frekvenční histogram, typicky zobrazovaný jako sloupcový graf. Dá se získat Fourierovou transformací aktuální zvukové vlny. S tou se naštěstí trápit nemusíme, metoda ji umí spočítat sama.

    SoundMixer.computeSpectrum(currentSpectrum, true, 2);

    První parametr je objekt ByteArray, tedy pole bajtů, které bude naplněno hodnotami. Druhým parametrem zapínáme Fourierovu transformaci, výsledkem tedy nebude vlna, ale histogram. Poslední parametr je rozlišení - v našem případě 11kHz, čtvrtinové oproti vzorkovací frekvenci.

    Pole currentSpectrum je nyní naplněno 256 bajty frekvenčního histogramu od nízkých po vysoké frekvence. Přečíst jej můžeme postupným voláním metody readFloat.
    var histogram:Array = [];
     
    for (var i:uint = 0; i < 256; i++) {
    		histogram.push(currentSpectrum.readFloat());
    	}
    }

    Pokud ponecháme druhý parametr metody computeSpectrum jako false, výsledkem bude pole vzorků aktuální zvukové vlny. V tomto případě dvakrát 256 vzorků za sebou pro levý a pravý stereo kanál.

    Generování zvuku

    Jak už bylo zmíněno výše, metoda play objektu Sound otvírá zvukový kanál pro interní nebo externí zvukový soubor. Pokud ale tuto metodu zavoláme u prázdného objektu Sound, bude se pak chovat jako socket a začne v pravidelných intervalech žádat o surová zvuková data událostí sampleData.

    Takto je možné skriptově generovat zvuk nebo upravovat surová sample data z jiného souboru.

    var sound:Sound = new Sound();
    var freq:Number = 200;
     
    sound.addEventListener(SampleDataEvent.SAMPLE_DATA, waveGenerator);
    sound.play();
     
     
    function waveGenerator(e:SampleDataEvent):void {
    	var wave:Number;
    	for (var i:int=0; i<8192; i++) {
    		wave = Math.sin((i+e.position)*2*Math.PI*freq/44e3)*0.2;
    		e.data.writeFloat(wave);
    		e.data.writeFloat(wave);
    	}
    }

    Zde generujeme harmonický sinusový signál s frekvencí 200Hz. Data jsou očekávána ve vlastnosti data události SampleDataEvent a to vždy po dvojicích bajtů pro levý a pravý stereo kanál.

    Latence přehrávání se liší podle platformy a aktuální zátěže procesoru. Dokumentace radí poskytovat objektu od dvou do osmi kilobajtů vzorků pro každou sampleData událost. Vzorkovací frekvence je klasických 44kHz.

    Ke stažení