domenica 13 novembre 2011

XNA gestione suoni ed effetti

Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_tutorial-xna-utilizzo-del-suono_1104.aspx



Introduzione
In questo articolo, vediamo come gestire i file audio ed i suoni nei nostri giochi creati con la tecnologia XNA, il tutto tramite il linguaggio di programmazione C#. Inoltre vedremo l’utilizzo del programma “Microsoft Cross-Platform Audio Creation Tool” per la realizzazione di effetti sonori ed aggiungere al codice la manipolazione dell’audio.



Creazione del gioco
Dopo aver creato un nuovo progetto in XNA, aggiungete al content un nuovo file audio, per esempio un file di tipo “wave” , si ricorda che sono validi altri formati audio, come per esempio wma, mp3, xap.
Fatto ciò, vediamo come eseguire questo file nelle nostre applicazioni.
Si creano a livello di classe, due oggetti, uno di tipo “SoundEffect” che ha il compito di gestire l’audio ed un oggetto di tipo SpriteFont, per visualizzare le informazioni a video
Qui di seguito si riporta la dichiarazione di oggetti delle suddette classi.



//oggetto per il suono



SoundEffect suono;



SpriteFont fontTesto;





Con l’oggetto di tipo SoundEffect, andremo a gestire il file audio, mentre con l’oggetto di tipo SpriteFont, il testo, si ricrdao di aver aggiunto nel content, un oggetto sprintfont ed un file audio nel nostro caso chiamato "gameOver.wav”.
Nell’evento LoadContent, inizialiamo gli oggetti creati in precedenza, ed in particolare, caricando il file audio e font, inseriti precedentemente.
Il tutto come riportato nell’esempio qui di seguito.




protected override void LoadContent()



{



// Create a new SpriteBatch, which can be used to draw textures.



spriteBatch = new SpriteBatch(GraphicsDevice);



//carico il suono che fa parte del progretto



suono = Content.Load<SoundEffect>("gameOver"); //nome file audio



fontTesto = Content.Load<SpriteFont>("SpriteFont1"); //nome file





A questo punto, nell’evento update, andremo ad utilizzare il nostro oggetto per il suono, ed in particolare il metodo “Play” che permette di eseguire l’audio.
Qui di seguito si riporta il frammento di codice, dove se viene digitato da tastiera il tasto S, viene emesso un suono.




protected override void Update(GameTime gameTime)



{



// Allows the game to exit



if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)



this.Exit();





// TODO: Add your update logic here



//eseguo il suono



if(Keyboard.GetState().IsKeyDown(Keys.S))



{



suono.Play();







}







La classe “SoundEffect” contiene diverse proprietà e metodi, che permettono di rilevare informazioni, come la durata oppure eseguire il suono.
Vedremo come rilevare la durata del nostro file.
Nell’evento “Draw”, visualizziamo a video, il tempo di questo nostro file audio, tramite l’utilizzo della proprietà Duration.



Qui di seguito si riporta un esempio di codice.




protected override void Draw(GameTime gameTime)



{



GraphicsDevice.Clear(Color.CornflowerBlue);





// TODO: Add your drawing code here



spriteBatch.Begin();



string testoDurata = "Durata: " + suono.Duration.ToString();



spriteBatch.DrawString(fontTesto, testoDurata, new Vector2(10, 10), Color.White);



spriteBatch.End();



base.Draw(gameTime);



}





Utilizzo di Microsoft Cross-Platform Audio Creation Tool (XACT) v3.0
Quando si installa XNA, vengono installati diversi strumenti, essi si trovano nel menu programmi e precisamente nel menu “Tools” del nostro menu di XNA.
Lo strumento Microsoft Cross-Platform Audio Creation Tool, permette di manipolare i file audio, gestire effetti particolari e tanto altro.
Apriamo tale strumento, ci verrà visualizzata la finestra vuota, il tutto come mostrato in figura 1.





Figura 1




Facciamo click sulla voce di menu, file, e successivamente “New Project”, ci verrà chiesto dove salvare il file “XAP”, si consiglia di metterla nella cartella content del nostro progetto XNA, anzi, prima di procedere a tale operazioni, consigliamo vivamente la creazione di una cartella (Es. suoni) in cui andremo a salvare il nostro file XAP (generato dal tools) ed il file audio.
Ora in questa cartella, inserite un file audio, che volete gestire con effetti particolare, nel nostro caso, è stato inserito un file di tipo wav “end.wav”.
Terminata tale operazione, facciamo click sul pulsante File, e poi salva, e nella finestra di dialogo che ci viene aperta, andiamo a ricercare la cartella “Suoni” creata nel nostro progetto, precedentemente.
A questo punto, salviamo il nostro progetto (per esempio con il nome “suoni”) in questo modo verrà generato un file di tipo XAP.
Facciamo click sulla voce “Wave Banks” con il tasto destro, e nel menu di scelta rapida, selezioniamo la voce “New Wave Bank”, in questo modo verrà genato un oggetto di tipo “Wave Bank” nel quale andrà inserito il nostro file audio.



Possiamo lasciare anche il nome che viene assegnato automaticamente, ossia “Wave Bank”, il tutto come mostrato in figura 2.







Figura 2



Nella finestra di destra, quella relativa al dettaglio di “Wave Bank” facciamo click con il tasto destro, e nel menu di scelta rapida, selezioniamo la voce “insert wave File…” e andremo a ricercare il file end, che abbiamo copiato nella cartella Suoni, del nostro progetto.
Verranno visualizzati le informazioni di questo file, come nome, dimensione, ed altro ancora, il tutto come mostrato in figura 3








Figura 3



Terminato di impostare le informazioni di questo, facciamo click con il tasto destro del mouse sulla voce “Sound Banks” e dal menu di scelta rapida, selezioniamo la voce “New Sound Bank”.
Verrà visualizzata una finestra tutta bianca (figura 4).










Figura 4




Anche in questo caso, troviamo nella parte sinistra, una finestra delle proprietà. Questa finestra, ci fornisce alcune informazioni di dettaglio degli elementi che abbiamo selezionato, sia per quanto concerne la finestra del “Wave Bank” che per quanto concerne questa finestra.
Sono finestre, che permettono di gestire gli effetti al nostro file audio.
Ricordiamo che non è compito di questo articolo, approfondire lo strumento messo a disposizione di XNA, anche perché la gestione dei suoni, di norma, nella creazione di progetti, viene fatta da figure preposte a questo tipo di attività e quindi con una buona preparazione in ambito musicale, la nostra guida, a solo lo scopo illustrativo.
Dalla finestra “Wave Bank” trasciniamo (Drag & Drop) il file nell’elenco, nella lista “Cue Name” della finestra “Sound Bank” in questo viene generato il riferimento al file, il tutto come mostrato in figura 5









Figura 5



Assicurarsi dopo aver selezionato il nome della lista “Sound Name” della finestra “Sound Bank”, che nella finestra delle proprietà, la lista “Attached to Cues” ha la voce del cue, ossia “end” nel nostro caso, il tutto come mostrato in figura 5.
A questo punto, salviamo il nostro progetto, tramite la voce di menu “Salva”, situata nel menu File e successivamente compiliamo tramite la voce “Build” sempre del menu “File”.
Quando si fa click sulla voce “Build”, verrà visualizzata una finestra, lasciate l’opzione su “none” e fate click sul pulsante “Finish” a questo punto verrà generato un file xap, di nome suoni.xap.
Non solo, anche due cartelle, nominate Win e Xbox, nella cartella Win, troviamo alcuni file, che utilizzeremo nel nostro progetto.
Copiamo questi tre file (suoni.xgs, Sound Bank.xsb, e Wave Bank.xwb) nella cartella superiore, dove si trova il file “suoni.xap”.



Aggiungiamo al nostro progetto e precisamente nella cartella “Suoni”, il nostro file di tipo XAP, ossia suoni.xap, generato dalla compilazione del tools di XNA.
Il tutto come mostrato in figura 6.





Figura 6



Ora non ci resta che compilare il nostro progetto, di visual studio. Facciamo click nella finestra esplora soluzione, sul nome della soluzione e facciamo build e rebuild della nostra soluzione.
Nella finestra di output, verranno visualizzati i files che sono stati generati precedentemente dal tools “Microsoft Cross-Platform Audio Creation Tool”, nella figura 7 viene mostrato l’output della ricompilazione della nostra soluzione.







Figura 7.



Ora non ci resta che scrivere il codice, per utilizzare i file creati e manipolati.
Nel nostro progetto XNA, si creano a livello di classe, tre oggetti di tipo AudioEngine, SoundBank, e WaveBank, i quali hanno il compito di gestire i file creati.
Qui di seguito si riporta un frammento di codice d’esempio.




//per la gestione effetto suono



AudioEngine audioEngine;



SoundBank soundBank;



WaveBank waveBank;







Nell’evento loadContent, si inizializzano tali oggetti, con i relativi file.




protected override void LoadContent()



{



// Create a new SpriteBatch, which can be used to draw textures.



spriteBatch = new SpriteBatch(GraphicsDevice);



//carico il suono che fa parte del progretto



suono = Content.Load<SoundEffect>("gameOver"); //nome file audio



fontTesto = Content.Load<SpriteFont>("SpriteFont1"); //nome file



//imposto il suono



audioEngine = new AudioEngine("Content\\Suoni\\suoni.xgs");



soundBank = new SoundBank(audioEngine, "Content\\Suoni\\Sound Bank.xsb");



waveBank = new WaveBank(audioEngine, "Content\\Suoni\\Wave Bank.xwb");







// TODO: use this.Content to load your game content here



}



Come si vede dal codice d’esempio, l’oggetto di tipo AudioEngine, viene associato il file suoni.xgs, mentre soundBank la classe soundbank, che accetta due parametri, un oggetto di tipo “AudioEngine” ed il percorso del file “.xsb”. Infine per l’oggetto di tipo “WaveBank”, viene impostato oltre all’oggetto di tipo AudioEngine, il file di tipo “.xwb”, il tutto nell’evento Loadcontent.
Nell’evento Update, verifichiamo che l’utente ha digitato il tasto “A” in tal caso, tramite il metodo PlayCue, che accetta come parametro, il valore relativo al campo “Cue Name” visto nel tools “Microsoft Cross-Platform Audio Creation Tool” viene eseguto l’effetto sonoro.



Qui di seguito si riporta l’esempio di codice delle sudette operazioni.



protected override void Update(GameTime gameTime)



{





//Eseguo gli effetti suono



if (Keyboard.GetState().IsKeyDown(Keys.A))



{





soundBank.PlayCue("end");



}









base.Update(gameTime);



}





Conclusioni
L'articolo è giunto al termine, non ci resta che testare il nostro programma e digiare il tasto “A” per verificare gli effett sonori. Come si è visto in questo articolo, le potenzialità offerte dagli strumenti messia a disposizioni da XNA, permettono la gestione degli effetti audio, permettono di creare giochi con della musica, molto ma molta complessa.
Per approfondire l’utilizzo dello strumento “Microsoft Cross-Platform Audio Creation Tool” , il lettore potrà consultare dal seguente sito http://msdn.microsoft.com/it-it/library/ff827590.aspx un tutorial, che illustra l’utilizzo di questo strumento.


Nessun commento: