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”