Audio
Transcript
Audio
Audio effetti sonori, musica e linguaggio naturale Marco Faella Università di Napoli “Federico II” esempi 1985: Super Mario Bros Marco Faella Università di Napoli “Federico II” 1987: Street Fighter Marco Faella Università di Napoli “Federico II” 1993: Doom Marco Faella Università di Napoli “Federico II” 2011: Skyrim Marco Faella Università di Napoli “Federico II” Giochi musicali Crypt of the Necrodancer, PC 2015 Marco Faella Università di Napoli “Federico II” Giochi musicali Planet Quest, iOS 2015 Marco Faella Università di Napoli “Federico II” Tipi di suoni Effetti sonori campionato Musica ibrida Parlato Marco Faella sintetizzato Università di Napoli “Federico II” Suoni campionati vs sintetizzati Suono campionato: un file contiene la registrazione digitale di un suono reale Suono sintetizzato: il programma contiene istruzioni per generare un suono Marco Faella Università di Napoli “Federico II” Il suono del Commodore 128 Dal manuale del Commodore 128 (1985): 7.1 INTRODUCTION [...] Here are the new sound and music statements available on the Commodore 128: ● ● ● ● ● ● SOUND ENVELOPE VOL TEMPO PLAY FILTER Marco Faella Università di Napoli “Federico II” Istruzione “SOUND” 7.2 THE SOUND STATEMENT The SOUND statement is designed primarily for quick and easy sound effects in your programs. You will learn a more intricate way of playing complete musical arragements with the other sound statements later in this section. [...] 100 SOUND 1, 49152, 240, 1, 0, 100, 1, 0 ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | Voice ---------+ | | | | | | | Frequency ----------+ | | | | | | Duration -----------------+ | | | | | Sweep Direction --------------+ | | | | Minimum Sweep Frequency ---------+ | | | Step Value for Sweep ----------------+ | | Waveform --------------------------------+ | Pulse Width for variable width | waveform --------------------------------+ Marco Faella Università di Napoli “Federico II” Le tecnologie Audio campionato: digital-analog converter (DAC) Audio sintetizzato: sintetizzatori in modulazione di frequenza (FM synthesizer) Commodore 64/128 (1982): sintetizzatore con 3 “voci” Sound Blaster (1989): sintetizzatore con 11 “voci” e riproduzione di file campionati a 8 bit, fino a 22khz Marco Faella Università di Napoli “Federico II” Il difetto del sintetizzatore C64 Un rumore di fondo può essere modulato usando il volume (4 bit) Sfruttato per riprodurre il parlato! Impossible Mission, Epyx, C64 1984 Marco Faella Università di Napoli “Federico II” effetti sonori campionati Formati audio campionato lossy: mp3, ogg vorbis, aac lossless: wav, flac parametri lossless: frequenza di campionamento: 22, 40, 44.1, 48, 96 khz bit per campione: 8, 16, 24 parametri lossy: bit-rate (mp3, aac): costante o variabile, da 8 a 320 kbps qualità (ogg vorbis): da -1 a 10 Marco Faella Università di Napoli “Federico II” Dimensioni Formato Configurazione Byte al minuto PCM (wav) 16bit, 44.1khz 10MB 16bit, 22khz 5MB 16kbps 120KB 32kbps 240KB 64kbps 480KB qualità 0 ~480KB qualità 3 (default) ~780KB mp3 ogg vorbis Marco Faella Università di Napoli “Federico II” musica Musica sintetizzata Il file contiene solo lo spartito, il computer sintetizza i suoni Formato: MIDI + Estremamente compatto + Adattabile dinamicamente alle situazioni - Qualità media Marco Faella Università di Napoli “Federico II” Musica campionata File di grandi dimensioni Per lo storage: compressione Per l’occupazione di memoria: streaming + Qualità alta - Grande dimensione Marco Faella Università di Napoli “Federico II” parlato Interazione vocale Parlato campionato onnipresente nei titoli maggiori Parlato sintetizzato (text-to-speech) non usato per la qualità/range emotivo limitato (link) Riconoscimento vocale (speech-to-text) poco usato, ma in crescita Marco Faella Università di Napoli “Federico II” Giochi con riconoscimento vocale There came an echo, PC+console 2015 Marco Faella Università di Napoli “Federico II” in Android Formati supportati lossless: PCM/WAV, FLAC lossy: mp3, AAC, ogg vorbis musica sintetizzata: MIDI Collocazione tipica: res/raw/ oppure assets/ Marco Faella Università di Napoli “Federico II” API Android per l’audio ● SoundPool: API Java di livello alto ● MediaPlayer: API Java di livello intermedio ● AudioTrack: API Java di livello basso ● JetPlayer: API Java per riprodurre musica dinamica ● OpenSL ES: API C per audio di basso livello (maggiore controllo e performance) Marco Faella Università di Napoli “Federico II” SoundPool Un insieme di brevi suoni campionati Può riprodurre più suoni contemporaneamente il costruttore accetta il numero massimo di suoni simultanei se si supera il massimo, il suono più “vecchio” viene soppresso Ideale per gli effetti sonori di un gioco Marco Faella Università di Napoli “Federico II” Caratteristiche di SoundPool Parametri di un suono: ● numero di ripetizioni (looping) ● volume ● velocità di riproduzione (da 0.5 a 2.0) Altre funzionalità: ● sospendere un suono (pause) ● fermare un suono (stop) ● riprendere un suono (resume) Marco Faella Università di Napoli “Federico II” Usare un SoundPool int SIMULTANEOUS_CHANNELS = 5; SoundPool soundPool = new SoundPool(SIMULTANEOUS_CHANNELS, AudioManager.STREAM_MUSIC, 0); Nota: a partire da API 21, usare un Builder al posto del costruttore int soundId = soundPool.load(“prova.mp3”, 0); float volume int priority int loops float rate = = = = 0.5f; 0; 0; 1; // // // // da 0 a 1 0 è il minimo riproduce una sola volta (-1 = infinito) velocità normale (va da 0.5 a 2) soundPool.play(soundId, volume, volume, priority, loops, rate); Marco Faella Università di Napoli “Federico II” Caricare un file audio A partire dal nome: soundPool.load(“res/raw/explosion.ogg”, PRIORITY); A partire dall’identificativo di risorsa: file “res/raw/explosion.ogg” soundPool.load(context, R.raw.explosion, PRIORITY); A partire da un descrittore: file “assets/explosion.ogg” AssetFileDescriptor afd = assetManager.openFd(“explosion.ogg”); soundPool.load(afd, PRIORITY); Marco Faella Università di Napoli “Federico II” API Android per l’audio ● SoundPool: API Java di livello alto ● MediaPlayer: API Java di livello intermedio ● AudioTrack: API Java di livello basso ● JetPlayer: API Java per riprodurre musica dinamica sintetizzata ● OpenSL ES: API C per audio di basso livello (maggiore controllo e performance) Marco Faella Università di Napoli “Federico II” MediaPlayer Ogni istanza gestisce un unico suono La sorgente può essere locale o remota Supporta file di grandi dimensioni Controllo fine sul caricamento Marco Faella Università di Napoli “Federico II” Lo stato di un MediaPlayer Marco Faella Università di Napoli “Federico II” Lo stato di un MediaPlayer (zoom) Marco Faella Università di Napoli “Federico II” Usare MediaPlayer suono in assets/musica.ogg: AssetManager assetManager = myActivity.getAssets(); AssetFileDescriptor afd = assetManager.openFd(“musica.ogg”); FileDescriptor fd = afd.getFileDescriptor(); MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(fd); mediaPlayer.prepare(); // bloccante mediaPlayer.start(); Marco Faella Università di Napoli “Federico II” Usare MediaPlayer suono in res/raw/musica.ogg: MediaPlayer mediaPlayer = MediaPlayer.create(myActivity, R.raw.musica); mediaPlayer.start(); Note: ● create è bloccante ● se il file è grande, sarebbe meglio caricarlo in modo asincrono Marco Faella Università di Napoli “Federico II” I suoni e il ciclo di vita dell’app Di default, i suoni continuano anche se l’app è in pausa Quindi: sospendere i suoni in onPause riprendere i suoni in onResume Marco Faella Università di Napoli “Federico II” framework B.A. G. Architettura Distingue suoni da musiche Suoni: riprodotti tramite un unico SoundPool condiviso Musiche: riprodotte tramite altrettanti oggetti MediaPlayer Assume che tutti i file audio si trovino in assets/ Marco Faella Università di Napoli “Federico II” Le interfacce public interface Audio { Music newMusic(String filename); Sound newSound(String filename); } public interface Sound { public interface Music { void play(float volume); void play(); void dispose(); void stop(); } void pause(); void dispose(); ... } Marco Faella Università di Napoli “Federico II” L’implementazione di Sound public class AndroidSound implements Sound { int soundId; SoundPool soundPool; public AndroidSound(SoundPool soundPool, int soundId) { … } @Override public void play(float volume) { soundPool.play(soundId, volume, volume, 0, 0, 1); } @Override public void dispose() { soundPool.unload(soundId); } } Marco Faella Università di Napoli “Federico II” L’implementazione di Music public class AndroidMusic implements Music, OnCompletionListener { MediaPlayer mediaPlayer; boolean isPrepared = false; public AndroidMusic(AssetFileDescriptor assetDescriptor) { mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(assetDescriptor.getFileDescriptor()); mediaPlayer.prepare(); isPrepared = true; mediaPlayer.setOnCompletionListener(this); } catch (Exception e) { throw new RuntimeException("Couldn't load music"); } } ... Marco Faella Università di Napoli “Federico II” parlato Speech-to-text L’applicazione invoca il riconoscimento tramite un intento Il riconoscimento avviene in un’altra attività Alla fine, il controllo ritorna alla prima applicazione, tramite uno specifico entry point A seconda della configurazione del telefono, il riconoscimento avviene in locale o in remoto prima di JellyBean: in remoto a partire da JellyBean: in remoto o in locale (installando offline speech recognition pack) Marco Faella Università di Napoli “Federico II” Avviare il riconoscimento all’interno di una Activity: Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US"); try { this.startActivityForResult(intent, REQUEST_OK); } catch (Exception e) { Log.e(“MyActivity”, “Error initializing speech to text engine."); } Marco Faella Università di Napoli “Federico II” Ricevere il risultato del riconoscimento all’interno di una Activity: @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode==REQUEST_OK && resultCode==RESULT_OK) { ArrayList<String> parole = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); ... } else { Log.w(“MyActivity”, “Speech recognition failed”); } } Marco Faella Università di Napoli “Federico II” Approfondimenti ● Karen Collins, Game Sound: An introduction to the History, Theory, and Practice of Video Game Music and Sound Design, MIT Press ○ taglio accademico ● Horowitz e Looney, The Essential Guide to Game Audio: The Theory and Practice of Sound for Games, Focal Press 2014 ○ ● taglio pratico MacLean, Komatineni e Allen, Pro Android 5, Apress 2015 ● GDC 2014 talk sul sound design di Grand Theft Auto V: link Marco Faella Università di Napoli “Federico II”