SlideShare uma empresa Scribd logo
1 de 102
Baixar para ler offline
@ALMIRFILHO
almirfilho
almirfilho
onde trabalho
onde compartilho conhecimento
loopinfinito
Web Audio
API
?
<audio>
ALTO NÍVEL : ABSTRAÇÃO
- Carregamento (buffering e streaming)
- Codificação (encoding)
- Controle da mídia (API simples)
- Eventos
<audio>
BAIXO NÍVEL : DINAMICIDADE
- Baixa latência
- Filtros e efeitos
- Maior precisão temporal
- Sintetização de sons
Web AudioAPI
BAIXO NÍVEL : DINAMICIDADE
- Mixagem
- Controle de canais
- Panning (2d e 3d)
- Gravação
Web AudioAPI
Aplicações
- Realidade aumentada
- Hipermídia
...masprincipalmente...
Jogos
Web Audio
<audio>
Um pouco de
história
Elisha Gray
1876
Sintetizador das antigas
W T F
Web Audio
API
AudioContext
AudioContext
fonte destino
fonte destino
?
JS
a brincadeira
acontece aqui
fonte
destino
?
JS
múltiplas
fontes
a brincadeira
acontece aqui
Fluxo de
áudio
s
dashersw.github.com/pedalboard.js/demo/
Nós
Nós
Sources
Gain
Filters
Delay
Analyser
Convolver
Nós
Channel
Splitter & Merger
Script
ProcessorJS
Dynamic
Compressor
Wave Shaper
Panner
Destination
Channel
Splitter & Merger
Script
ProcessorJS
Dynamic
Compressor
Wave Shaper
Panner
Destination
Sources
Gain
Filters
Delay
Analyser
Convolver
Sources
Fontes de dados
Sources
Fontes de dados
mídia input sintetização
BufferSource
MediaElementSource
MediaStreamSource
Interfaces
OscillatorNode
Carregando e
reproduzindo
uma mídia
context.destination
Crie o contexto
var context = new AudioContext();
Carregue os dados
var request = new XMLHttpRequest();
request.open('GET', 'sound.mp3', true);
request.responseType = 'arraybuffer';
request.onload = function(){ /*...*/ };
request.send();
context.destinationsound.mp3
Crie o nó da fonte
// onload
var sourceNode = context.createBufferSource();
sourceNode.buffer =
context.createBuffer(request.response, false);
context.destinationsourceNode
Conecte os nós
context.destinationsourceNode
// conectando à saída
sourceNode.connect(context.destination);
Som na caixa!
context.destinationsourceNode
sourceNode.start(0);
s
Reproduzindo o
conteúdo de um
<audio>
< >
<!doctype html>
<html>
<head>...</head>
<body>
...
<audio id="music" src="music.mp3"></audio>
...
</body>
</html>
// recupera elemento do DOM
var audioEl =
document.getElementById('music');
!
// cria nó
var sourceNode =
context.createMediaElementSource(audioEl);
Capturandoe
reproduzindo som
domicrofone
// captura áudio do microfone
navigator.webkitGetUserMedia(
{ audio: true },
sucessoCallback,
falhaCallback
);
!
function sucessoCallback(stream){
sourceNode =
context.createMediaStreamSource(stream);
// ...
}
Sintetizandosons
Tipos de osciladores
Sine
Square
Sawtooth
Triangle
Custom
context.destinationOscillator
var sourceNode = context.createOscillator();
Crie o nó da fonte
sourceNode.type = 'square';
Configuree
context.destinationOscillator
Conecte os nós
context.destination
sourceNode.connect(context.destination);
sourceNode.start(0);
Oscillator
s
jlongster.com/s/touch.html
s
hora do demo
Gain
Controlando o volume
GainNode
Interface
gainNode
...
outputNodeinputNode
...
gainNode
gainNode
var gainNode = context.createGain();
gainNode.gain.value = 0.2; // 20% volume
Crie e configure
...
outputNodeinputNode
...
inputNode.connect(gainNode);
gainNode.connect(outputNode);
Conecte os nós
gainNode
...
outputNodeinputNode
...
Cross-fading
entre sons
context.destination
Crie o contexto e fontes
midnightCity
sadButTrue
Crie gain nodes
fadeOut
fadeIn
context.destination
midnightCity
sadButTrue
Conecte os nóss
context.destination
fadeOut
fadeInmidnightCity
sadButTrue
Configures
fadeOut.gain.value = 1; // padrão
fadeIn.gain.value = 0;
context.destination
fadeOut
fadeInmidnightCity
sadButTrue
Mudança contínua
fadeOut.gain.value = 1; // padrão
fadeIn.gain.value = 0;
var current = context.currentTime;
var fade = 3;
!
fadeOut.gain
.linearRampToValueAtTime(0, current + fade);
fadeIn.gain
.linearRampToValueAtTime(1, current + fade);
e
Mudança contínuae
1
0
current + fadecurrent
3s
sadButTrue
midnightCity
t
vol
s
hora do demo
Filters
Aplicando efeitos
BiquadFilterNode
Interface
Tipos de filtros
Low pass
High pass
Band pass
All pass
Low shelf
High shelf
Peaking
Notch
Crie e configure
filterNode
e
...
outputNodeinputNode
...
var filterNode = context.createBiquadFilter();
filterNode.type = ‘lowpass';
Conecte os nóse
inputNode.connect(filterNode);
filterNode.connect(outputNode);
filterNode
...
outputNodeinputNode
...
s
hora do demo
Delay
Atrasando tudo
DelayNode
Interface
delayNode
var delayNode = context.createDelay(5);
delayNode.delayTime.value = 5; // seg
Crie e configure
...
outputNodeinputNode
...
inputNode.connect(delayNode);
delayNode.connect(outputNode);
Conecte os nós
delayNode
...
outputNodeinputNode
...
Eco
context.destination
Crie o contexto e fontes
sadButTrue
context.destination
Crie delay nodes
sadButTrue
delayNode
context.destination
Crie gain nodes
sadButTrue
delayNode gainNode
s
context.destination
Configure
sadButTrue
delayNode gainNode
delayNode.delayTime.value = 0.5;
gainNode.gain.linearRampToValueAtTime(0, 1);
s
hora do demo
Analyser
Lendo dados em tempo real
AnalyserNode
Interface
analyserNode
var analyserNode =
context.createAnalyser();
Crie o analisador
...
outputNodeinputNode
...
inputNode.connect(analyserNode);
// analyserNode.connect(outputNode);
Conecte os nós
opcional
analyserNode
...
outputNodeinputNode
...
var dados = new Uint8Array(
analyserNode.frequencyBinCount
);
analyserNode.getByteFrequencyData(dados);
Colete os dados
opcional
s
analyserNode
...
outputNodeinputNode
...
var dados = [
230,
143,
98,
111,
125,
92,
53,
//...
];
Colete os dadoss
s
airtightinteractive.com/demos/js/
reactive/
s
phenomnomnominal.github.com
Convolver
Realizando convolução de sinais
ConvolverNode
Interface
convolverNode
var convolverNode =
context.createConvolver();
Crie o convolver
...
outputNodeinputNode
...
Carregue o sinal
var request = new XMLHttpRequest();
request.open("GET", "sinal.wav", true);
request.responseType = "arraybuffer";
request.onload = function(){ /*...*/ };
request.send();
sinal
r
convolverNode
...
outputNode
inputNode
...
// onload
convolverNode.buffer =
context.createBuffer(request.response, false);
Defina o bufferl
buffer
convolverNode
...
outputNodeinputNode
...
Conecte os nós
inputNode.connect(convolverNode);
convolverNode.connect(outputNode);
buffer
convolverNode
...
outputNodeinputNode
...
s
hora do demo
s
Outros
experimentos
s
webaudiodemos.appspot.com/
Vocoder/index.html
s
webaudiodemos.appspot.com/AudioRecorder
s
uglyhack.appspot.com/webaudiotoy/
s
Valeu!
@ALMIRFILHO

Mais conteúdo relacionado

Semelhante a Web Audio API: Uma introdução concisa

Desenvolvimento de jogos com Cocos2d-x
Desenvolvimento de jogos com Cocos2d-xDesenvolvimento de jogos com Cocos2d-x
Desenvolvimento de jogos com Cocos2d-xRafael Martins
 
Desenvolvimento de Jogos com Corona SDK
Desenvolvimento de Jogos com Corona SDKDesenvolvimento de Jogos com Corona SDK
Desenvolvimento de Jogos com Corona SDKBruno Cicanci
 
Aula 06 barramentos e recursos onboard
Aula 06 barramentos e recursos onboardAula 06 barramentos e recursos onboard
Aula 06 barramentos e recursos onboardAlexandrino Sitoe
 
Compus Party - processing e arduino
Compus Party - processing e arduinoCompus Party - processing e arduino
Compus Party - processing e arduinoCampus Party Brasil
 
Docker na vida real
Docker na vida realDocker na vida real
Docker na vida realFernando Ike
 
Mini Curso Sistemas Embarcados
Mini Curso Sistemas EmbarcadosMini Curso Sistemas Embarcados
Mini Curso Sistemas EmbarcadosSuzana Viana Mota
 
Backend do Iot com rethinkdb e python
Backend do Iot com rethinkdb e pythonBackend do Iot com rethinkdb e python
Backend do Iot com rethinkdb e pythonAfonso Coutinho
 
InterCon 2016 - Backend do IoT com RethinkDB e Python
InterCon 2016 - Backend do IoT com RethinkDB e PythonInterCon 2016 - Backend do IoT com RethinkDB e Python
InterCon 2016 - Backend do IoT com RethinkDB e PythoniMasters
 
PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP
PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHPPHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP
PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHPAryel Tupinambá
 
Redes 1 - Sockets em C#
Redes 1 - Sockets em C#Redes 1 - Sockets em C#
Redes 1 - Sockets em C#Marcelo Charan
 
Manual Básico - Mixer Line 6 M20d StageScape - (PORTUGUÊS)
Manual Básico - Mixer Line 6  M20d StageScape -  (PORTUGUÊS)Manual Básico - Mixer Line 6  M20d StageScape -  (PORTUGUÊS)
Manual Básico - Mixer Line 6 M20d StageScape - (PORTUGUÊS)Habro Group
 
Arduino genius com display lcd 16x2 usando i2 c
Arduino  genius com display lcd 16x2 usando i2 cArduino  genius com display lcd 16x2 usando i2 c
Arduino genius com display lcd 16x2 usando i2 cThiago Pereira
 
Workshop video 2014_metamorfoseii_culturgest
Workshop video 2014_metamorfoseii_culturgestWorkshop video 2014_metamorfoseii_culturgest
Workshop video 2014_metamorfoseii_culturgestArticacc, Lda
 

Semelhante a Web Audio API: Uma introdução concisa (20)

Desenvolvimento de jogos com Cocos2d-x
Desenvolvimento de jogos com Cocos2d-xDesenvolvimento de jogos com Cocos2d-x
Desenvolvimento de jogos com Cocos2d-x
 
Desenvolvimento de Jogos com Corona SDK
Desenvolvimento de Jogos com Corona SDKDesenvolvimento de Jogos com Corona SDK
Desenvolvimento de Jogos com Corona SDK
 
Javascript ao Infinito e Além
Javascript ao Infinito e AlémJavascript ao Infinito e Além
Javascript ao Infinito e Além
 
Introdução a plataforma arduino
Introdução a plataforma arduinoIntrodução a plataforma arduino
Introdução a plataforma arduino
 
Aula de hardware
Aula de hardwareAula de hardware
Aula de hardware
 
Aula 06 barramentos e recursos onboard
Aula 06 barramentos e recursos onboardAula 06 barramentos e recursos onboard
Aula 06 barramentos e recursos onboard
 
Compus Party - processing e arduino
Compus Party - processing e arduinoCompus Party - processing e arduino
Compus Party - processing e arduino
 
Docker na vida real
Docker na vida realDocker na vida real
Docker na vida real
 
Apresentacao Enie2000
Apresentacao Enie2000Apresentacao Enie2000
Apresentacao Enie2000
 
Oficina Arduino
Oficina ArduinoOficina Arduino
Oficina Arduino
 
Mini Curso Sistemas Embarcados
Mini Curso Sistemas EmbarcadosMini Curso Sistemas Embarcados
Mini Curso Sistemas Embarcados
 
Backend do Iot com rethinkdb e python
Backend do Iot com rethinkdb e pythonBackend do Iot com rethinkdb e python
Backend do Iot com rethinkdb e python
 
InterCon 2016 - Backend do IoT com RethinkDB e Python
InterCon 2016 - Backend do IoT com RethinkDB e PythonInterCon 2016 - Backend do IoT com RethinkDB e Python
InterCon 2016 - Backend do IoT com RethinkDB e Python
 
PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP
PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHPPHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP
PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP
 
Minicurso arduino
Minicurso arduinoMinicurso arduino
Minicurso arduino
 
Redes 1 - Sockets em C#
Redes 1 - Sockets em C#Redes 1 - Sockets em C#
Redes 1 - Sockets em C#
 
Manual Básico - Mixer Line 6 M20d StageScape - (PORTUGUÊS)
Manual Básico - Mixer Line 6  M20d StageScape -  (PORTUGUÊS)Manual Básico - Mixer Line 6  M20d StageScape -  (PORTUGUÊS)
Manual Básico - Mixer Line 6 M20d StageScape - (PORTUGUÊS)
 
Arduino genius com display lcd 16x2 usando i2 c
Arduino  genius com display lcd 16x2 usando i2 cArduino  genius com display lcd 16x2 usando i2 c
Arduino genius com display lcd 16x2 usando i2 c
 
Workshop video 2014_metamorfoseii_culturgest
Workshop video 2014_metamorfoseii_culturgestWorkshop video 2014_metamorfoseii_culturgest
Workshop video 2014_metamorfoseii_culturgest
 
Programação para Atari 2600
Programação para Atari 2600Programação para Atari 2600
Programação para Atari 2600
 

Web Audio API: Uma introdução concisa