11 luglio 2008

Using Sound

di Marcello Ruta

Premessa

In questo esercizio vedremo come utilizzare alcuni Classi per manipolare il suono, questo breve esercizio non si pone come una guida ma vengono spiegate alcune nozioni di base, e l'utilizzo di metodi e proprietà delle rispettive Classi in gioco.

Cosa faremo in questo esercizio:

  1. Caricare il suono;
  2. Controllare l'audio assegnando dei comportamenti (behavior);
  3. Leggere e mostrare le informazioni ID3 del file audio.

Step 1: Organizzazione del FLA

Il primo step sarà dedicato alla creazione del fla che conterrà due livelli, un livello per le azioni ed uno per per i vari elementi che ci serviranno per manipolare il suono. Apriamo Flash CS 3 New > Document (Nuovo > Documento) nella relativa finestra di dialogo scegliamo Flash File (Actionscript 3.0) e salviamo il file con il seguente nome basic_audio.fla, a questo punto, se ancora non lo avete fatto aggiungiamo un altro livello.

Fatto ciò rinominiamo i livelli, a uno assegniamo action e all'altro Item, quindi salviamo, di nuovo, il nostro documento.

A questo punto apriamo il pannello componenti e trasciniamo sul livello Item un istanza di Button un istanza dello Slider, e con lo Strumento Testo creiamo un campo di testo dinamico al quale assegniamo il seguente nome di istanza info_txt.

Adesso selezioniamo l'istanza di Button, quindi premiamo il tasto ALT (sempre con l'istanza selezionata) e la trasciniamo, ripetiamo l'operazione altre tre volte, alla fine dobbiamo avere cinque istanze di Button sullo stage, esplicata questa procedura andremo ad assegnare i nomi di istanza e le label (etichette) ai vari button e allo slider.

Selezioniamo il primo pulsante, con il pulsante selezionato apriamo il pannello Properties (Proprietà) ed inseriamo il seguente nome di istanza btn_playSnd adesso facciamo clic sulla linguetta Parameters (Parametri) ed facciamo clic in corrispondenza di label e assegniamo il nome Play, ripetiamo la stessa operazione con gli altri pulsanti assegnando nome di istanza e label. Alla fine avremo:

  • Nome Istanza: btn_playSnd >> Label: Play
  • Nome Istanza: btn_stopSnd >> Label: Pause
  • Nome Istanza: btn_ffSnd >> Label: FF>>
  • Nome Istanza: btn_rwSnd >> Label: <<RW
  • Nome Istanza: btn_noVlm >> Label: NoVolume

Infine selezioniamo lo slider ed assegniamo il seguente nome di istanza: sld_Vlm quindi facciamo clic sulla linguetta Parameters (Parametri) ed eseguiamo i seguenti settaggi:

  • impostiamo il liveDragging su true
  • impostiamo maximum a100
  • impostiamo value a50
  • e lasciamo invariati gli valori

Prima di passare allo step 2 quello relativo alla scrittura del codice, faremo una breve panoramica sulle Classi (flash.media) e alcune proprieta' che vengono utilizzate in questo esercizio.

Classe Sound:
Questa classe fa si che possa creare un oggetto Sound per caricare, controllare, e accedere ai metadata del file MP3 che si sta caricando. Quindi da come si evince tale classe avvia la riproduzione del file.

Classe SoundLoaderContext :
Questa classe specifica quanti secondi di bufferizzazione utilizzare durante il caricamento di un file audio. Un oggetto SoundLoaderContext viene utilizzato come parametro per il metodo Sound.load().

Classe SoundChannel:
La classe SoundChannel controlla un suono nell'applicazione. Ogni suono riprodotto viene assegnato a un canale, e in un'applicazione si possono avere canali audio multipli che sono mixati insieme. La classe SoundChannel ha un metodo stop(), e delle proprieta' per il monitoraggio del volume del canale. Ogni suono che viene riprodotto ha un proprio oggetto SoundChannel.
L’oggetto SoundChannel controlla il volume sia del canale sinistro che del canale destro di riproduzione dell’audio.

Classe ID3Info:
La classe ID3Info contiene le proprietà che permettono di recuperare le informazioni dei metadati ID3 che vengono memorizzati nei file audio mp3. Questa classe no fa altro che translare i tag nativi ID3 in modo piu' leggibile. Per esempio la proprietà ID3Info.artist ci permette di ottenere il nome dell'artista.

Classe SoundTransform:
Questa classe contiene dei valori che controllano il volume e la panoramica dell’audio. Un oggetto SoundTransform può essere applicato, tra gli altri, a un singolo oggetto SoundChannel, all’oggetto SoundMixer globale o a un oggetto Microphone.

Dopo questa breve panoramica descriviamo alcune delle proprietà utilizzate nell'applicazione.

SoundTransform Class : Proprietà > volume (è di tipo Number). La proprietà volume, ha un range che va da 0(silenzio audio) a 1(full volume).

SoundChannel Class: Proprietà > soundTransform (è di tipo soundTransform). L'oggetto soundTransform assegnato al canale del suono.

SoundChannel Class: Proprietà > position (è di tipo Number). La posizione corrente  dentro il suono.

ID3Info Class : Proprietà > artist (di tipo String). Con tale proprietà si accede al nome dell'artista; corrisponde al tag ID3 2.0 TPE1

ID3Info Class : Proprietà > songName (di tipo String). Accede al nome del brano; corrisponde al tag ID3 2.0 TIT2

ID3Info Class : Proprietà > album (è di tipo String). Accede al nome dell'album; corrisponde al tag ID3 2.0 TALB

ID3Info Class : Proprietà > comment (è di tipo String). Tale proprietà accede ai commenti della registrazione; corrisponde al tag ID3 2.0 COMM

infine abbiamo le proprietà genre, track e year che fanno parte della classe ID3Info che però non abbiamo trattato.

Dopo una breve trattazione di questi argomenti passiamo al codice.

Step 2: Scrittura del codice

import fl.events.SliderEvent;

// Settaggio delle variabili da utilizzare (a livello globale)
var trackUrl:String; // var che memorizza il percorso del file musicale da caricare
var urlReq:URLRequest; // definiamo oggetto URL request
var snd:Sound; // definiamo un oggetto new Sound
var buffer:SoundLoaderContext; // definiamo un oggetto SoundLoaderContext
var sndChl:SoundChannel; // definiamo un oggetto SoundChannel
var pauseStatus:Boolean; // definiamo una variabile booleana (il default value è false)
var playPosition:Number = 0; // definiamo variabile di tipo Number
var timerFF:Timer; // definiamo un oggetto new Timer
var timerRW:Timer; // definiamo un oggetto new Timer
var song:Sound; // definiamo un oggetto new Sound
var songInfo:ID3Info; // definiamo un oggetto ID3Info
var stVolume:SoundTransform; // definiamo un oggetto new SoundTransform
var statusVlm:Boolean = true; // definiamo una variabile booleana con il valore settato su true
var initVlm:Number = 0.5 // definiamo variabile di tipo Number

stVolume = new SoundTransform();
stVolume.volume = initVlm;

trackUrl = "assets/talk.mp3";
urlReq = new URLRequest(trackUrl);
//
function init():void {
snd = new Sound();
buffer = new SoundLoaderContext(5000);
snd.load(urlReq, buffer);
sndChl = snd.play();
sndChl.soundTransform = stVolume;
}

init();
// Mettere in play e in pausa il suono
btn_playSnd.addEventListener(MouseEvent.CLICK, onPlaySound);
btn_stopSnd.addEventListener(MouseEvent.CLICK, onPauseSound);

btn_playSnd.enabled = false;

function onPlaySound(e:MouseEvent):void {
sndChl = snd.play(playPosition, 1);//Play offset , number of loops
sndChl.soundTransform = stVolume; // la variabile viene impostata per utilizzare l'oggetto SoundTransform modificato.
pauseStatus = false;
btn_playSnd.enabled = false;
//trace("sound isn't in pause: " + pauseStatus);
}

function onPauseSound(e:MouseEvent):void {
playPosition = sndChl.position;
sndChl.stop();
pauseStatus = true;
btn_playSnd.enabled = true;
//trace("sound is in pause: " + pauseStatus);
}

// FF >> Gestiamo l'avanzamento rapido del suono
btn_ffSnd.addEventListener(MouseEvent.MOUSE_DOWN, onTimeHandlerFF); // simuliamo l'onpress del pulsante
btn_ffSnd.addEventListener(MouseEvent.MOUSE_UP, onTimerReleaseFF); // simuliamo il rilascio del pulsante

function onTimeHandlerFF(e:MouseEvent) {
playPosition = sndChl.position;
sndChl.stop();
//sndChl.soundTransform = stVolume;
timerFF = new Timer(100, 0) ;
timerFF.addEventListener(TimerEvent.TIMER, onTimerRunFF);
timerFF.start();
}

function onTimerRunFF(e:TimerEvent):void {
playPosition += 1000;
}

function onTimerReleaseFF(e:MouseEvent):void {
timerFF.stop();
sndChl = snd.play(playPosition, 1);
sndChl.soundTransform = stVolume;
}

// RW >> Gestiamo l'avanzamento rapido all'indietro del suono
btn_rwSnd.addEventListener(MouseEvent.MOUSE_DOWN, onTimeHandlerRW);
btn_rwSnd.addEventListener(MouseEvent.MOUSE_UP, onTimerReleaseRW);

function onTimeHandlerRW(e:MouseEvent):void {
playPosition = sndChl.position;
sndChl.stop();
timerRW = new Timer(100, 0) ;
timerRW.addEventListener(TimerEvent.TIMER, onTimerRunRW);
timerRW.start();
}

function onTimerRunRW(e:TimerEvent):void {
playPosition -= 1000;
}

function onTimerReleaseRW(e:MouseEvent):void {
timerRW.stop();
sndChl = snd.play(playPosition, 1);
sndChl.soundTransform = stVolume;
}
// Ricaviamo i metadati del nostro brano
snd.addEventListener(Event.ID3, id3Handler);

function id3Handler(e:Event):void {
song = Sound(e.target);
songInfo = ID3Info(song.id3);
for (var track in songInfo) {
//trace("ID3 - "+track+" is "+songInfo[track]);
}
var songInfoStr:String = "Artist: " + songInfo.artist + "\n";
var songNameStr:String = "Title: " + songInfo.songName + "\n";
var songAlbm:String = "Album: " + songInfo.album +"\n\n";
var songCmm:String = "Comment: " + songInfo.comment;
info_txt.text = songInfoStr;
info_txt.appendText(songNameStr);
info_txt.appendText(songAlbm);
info_txt.appendText(songCmm);
}
// Controlliamo il Volume
btn_noVlm.addEventListener(MouseEvent.CLICK, onControlVolume);

// con questa funzione settiamo il volume a mute e lo ripristiniamo al valore iniziale
function onControlVolume(e:MouseEvent):void {
if (statusVlm) {
stVolume.volume = 0;
sndChl.soundTransform = stVolume;
btn_noVlm.label = "YesVolume";
statusVlm = false;
sld_Vlm.value = 50;
//trace(statusVlm)
} else {
stVolume.volume = initVlm;
sndChl.soundTransform = stVolume;
btn_noVlm.label = "NoVolume";
statusVlm = true;
//trace(statusVlm)
}
}

sld_Vlm.addEventListener(SliderEvent.CHANGE, onHandlerSlider);

// con questa funzione abbassiamo e aumentiamo il volume
function onHandlerSlider(e:SliderEvent):void {
dragSlider(e);
}

function dragSlider(e:Object):void {
stVolume.volume = (e.value/100);
sndChl.soundTransform = stVolume;
}

File Allegato: Using Sound

Vota

Comments