Web Audio Hero

102
@ALMIRFILHO

description

Desvendaremos esta nova API de alto nível para processamento e sintetização de áudio em aplicações web: Web Audio API – que nos permitirá quebrar o silêncio da web sem limitações.

Transcript of Web Audio Hero

Page 1: Web Audio Hero

@ALMIRFILHO

Page 2: Web Audio Hero

almirfilho

almirfilho

Page 3: Web Audio Hero

onde trabalho

Page 4: Web Audio Hero

onde compartilho conhecimento

loopinfinito

Page 5: Web Audio Hero

Web Audio API

Page 6: Web Audio Hero

?<audio>

Page 7: Web Audio Hero

ALTO NÍVEL : ABSTRAÇÃO

- Carregamento (buffering e streaming) - Codificação (encoding)

- Controle da mídia (API simples)

- Eventos

<audio>

Page 8: Web Audio Hero

BAIXO NÍVEL : DINAMICIDADE

- Baixa latência - Filtros e efeitos

- Maior precisão temporal - Sintetização de sons

Web Audio API

Page 9: Web Audio Hero

BAIXO NÍVEL : DINAMICIDADE

- Mixagem - Controle de canais - Panning (2d e 3d)

- Gravação

Web Audio API

Page 10: Web Audio Hero

Aplicações

- Realidade aumentada

- Hipermídia. . .mas principalmente. . .

Page 11: Web Audio Hero

Jogos

Page 12: Web Audio Hero

Web Audio

<audio>

Page 13: Web Audio Hero

Um pouco de história

Page 14: Web Audio Hero

Elisha Gray1876

Page 15: Web Audio Hero

Sintetizador das antigas

Page 16: Web Audio Hero
Page 17: Web Audio Hero
Page 18: Web Audio Hero
Page 19: Web Audio Hero

W T F

Page 20: Web Audio Hero

Web Audio API

Page 21: Web Audio Hero

AudioContext

Page 22: Web Audio Hero

AudioContext

fonte destino

Page 23: Web Audio Hero

fonte destino

?

JS

a brincadeira acontece aqui

Page 24: Web Audio Hero

fonte

destino

?

JS

múltiplas fontes

a brincadeira acontece aqui

Page 25: Web Audio Hero

Fluxo de áudio

Page 26: Web Audio Hero

Crie o contextoConecte os nós

dashersw.github.com/pedalboard.js/demo/

Page 27: Web Audio Hero

Nós

Page 28: Web Audio Hero

Nós

Sources

Gain

Filters

Delay

Analyser

Convolver

Page 29: Web Audio Hero

Nós

Channel Splitter & MergerScript ProcessorJS

Dynamic Compressor

Wave Shaper

Panner

Destination

Page 30: Web Audio Hero

Channel Splitter & MergerScript ProcessorJS

Dynamic Compressor

Wave Shaper

Panner

Destination

Sources

Gain

Filters

Delay

Analyser

Convolver

Page 31: Web Audio Hero

SourcesFontes de dados

Page 32: Web Audio Hero

SourcesFontes de dados

mídia input sintetização

Page 33: Web Audio Hero
Page 34: Web Audio Hero

BufferSource MediaElementSource

MediaStreamSource

Interfaces

OscillatorNode

Page 35: Web Audio Hero

Carregando e reproduzindo

uma mídia

Page 36: Web Audio Hero

context.destination

Crie o contexto

var context = new AudioContext();

Carregue os dados

Page 37: Web Audio Hero

Carregue os dadosCrie o contexto

var request = new XMLHttpRequest(); request.open('GET', 'sound.mp3', true); request.responseType = 'arraybuffer'; request.onload = function(){ /*...*/ }; request.send();

context.destination

Crie o nó da fonte

sound.mp3

Page 38: Web Audio Hero

Crie o nó da fonteCrie o contexto

// onload var sourceNode = context.createBufferSource(); sourceNode.buffer = context.createBuffer(request.response, false);

context.destinationsourceNode

Carregue os dados Conecte os nós

Page 39: Web Audio Hero

Conecte os nósCrie o contexto

context.destinationsourceNode

// conectando à saída sourceNode.connect(context.destination);

Crie o nó da fonte Som na caixa!

Page 40: Web Audio Hero

Som na caixa!Crie o contexto

context.destinationsourceNode

sourceNode.start(0);

Conecte os nós

Page 41: Web Audio Hero

Reproduzindo o conteúdo de um

<audio>

< >

Page 42: Web Audio Hero

<!doctype html>

<html>

<head>...</head>

<body>

...

<audio id="music" src="music.mp3"></audio>

...

</body>

</html>

Page 43: Web Audio Hero

// recupera elemento do DOM var audioEl = document.getElementById('music'); !

// cria nó var sourceNode = context.createMediaElementSource(audioEl);

Page 44: Web Audio Hero

Capturando e reproduzindo som

do microfone

Page 45: Web Audio Hero

// captura áudio do microfone navigator.webkitGetUserMedia( { audio: true }, sucessoCallback, falhaCallback ); !

function sucessoCallback(stream){ sourceNode = context.createMediaStreamSource(stream); // ... }

Page 46: Web Audio Hero

Sintetizando sons

Page 47: Web Audio Hero

Tipos de osciladores

Sine

Square

Sawtooth

Triangle

Custom

Page 48: Web Audio Hero

context.destinationOscillator

var sourceNode = context.createOscillator();

Crie o nó da fonteCrie o contexto Configure

Page 49: Web Audio Hero

sourceNode.type = 'square';

ConfigureCrie o contextoCrie o nó da fonte Conecte os nós

context.destinationOscillator

Page 50: Web Audio Hero

Conecte os nósCrie o contexto

context.destination

sourceNode.connect(context.destination); sourceNode.start(0);

Crie o nó da fonte Som na caixa!

Oscillator

Page 51: Web Audio Hero

Crie o contextoConecte os nós

jlongster.com/s/touch.html

Page 52: Web Audio Hero

Crie o contextoConecte os nós

hora do demo

Page 53: Web Audio Hero

GainControlando o volume

Page 54: Web Audio Hero

GainNode

Interface

Page 55: Web Audio Hero

gainNode

...outputNodeinputNode

...

Page 56: Web Audio Hero

gainNode

Page 57: Web Audio Hero

gainNode

var gainNode = context.createGain(); gainNode.gain.value = 0.2; // 20% volume

Crie e configure Conecte os nós

...outputNodeinputNode

...

Page 58: Web Audio Hero

inputNode.connect(gainNode); gainNode.connect(outputNode);

Conecte os nós

gainNode

Crie e configure

...outputNodeinputNode

...

Page 59: Web Audio Hero

Cross-fading entre sons

Page 60: Web Audio Hero

context.destination

Crie o contexto e fontes

midnightCity

sadButTrue

Crie gain nodes

Page 61: Web Audio Hero

Crie gain nodes

fadeOut

fadeIn

Crie o contexto e fontes Conecte os nós

context.destination

midnightCity

sadButTrue

Page 62: Web Audio Hero

Conecte os nós Capture o somCrie gain nodes

context.destination

fadeOut

fadeInmidnightCity

sadButTrue

Page 63: Web Audio Hero

ConfigureCrie gain nodes

fadeOut.gain.value = 1; // padrão fadeIn.gain.value = 0;

Mudança contínua

context.destination

fadeOut

fadeInmidnightCity

sadButTrue

Page 64: Web Audio Hero

Mudança contínuafadeOut.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);

Configure

Page 65: Web Audio Hero

Mudança contínua Capture o somConfigure1

0

current + fadecurrent3s

sadButTrue

midnightCity

t

vol

Page 66: Web Audio Hero

Crie o contextoConecte os nós

hora do demo

Page 67: Web Audio Hero

FiltersAplicando efeitos

Page 68: Web Audio Hero

BiquadFilterNode

Interface

Page 69: Web Audio Hero

Tipos de filtros

Low pass

High pass

Band pass

All pass

Low shelf

High shelf

Peaking

Notch

Page 70: Web Audio Hero

Crie e configure

filterNode

Crie um gain node

...outputNodeinputNode

...

var filterNode = context.createBiquadFilter(); filterNode.type = ‘lowpass';

Conecte os nós

Page 71: Web Audio Hero

Conecte os nósCrie um gain node

inputNode.connect(filterNode); filterNode.connect(outputNode);

Crie e configure

filterNode

...outputNodeinputNode

...

Page 72: Web Audio Hero

Crie o contextoConecte os nós

hora do demo

Page 73: Web Audio Hero

DelayAtrasando tudo

Page 74: Web Audio Hero

DelayNode

Interface

Page 75: Web Audio Hero

delayNode

var delayNode = context.createDelay(5); delayNode.delayTime.value = 5; // seg

Crie e configure Conecte os nós

...outputNodeinputNode

...

Page 76: Web Audio Hero

inputNode.connect(delayNode); delayNode.connect(outputNode);

Conecte os nósCrie e configure

delayNode

...outputNodeinputNode

...

Page 77: Web Audio Hero

Eco

Page 78: Web Audio Hero

context.destination

Crie o contexto e fontes

sadButTrue

Crie delay nodes

Page 79: Web Audio Hero

context.destination

Crie delay nodes

sadButTrue

delayNode

Crie gain nodes

Page 80: Web Audio Hero

context.destination

Crie gain nodes

sadButTrue

delayNode gainNode

ConfigureCrie delay nodes

Page 81: Web Audio Hero

context.destination

Configure

sadButTrue

delayNode gainNode

delayNode.delayTime.value = 0.5; gainNode.gain.linearRampToValueAtTime(0, 1);

Crie gain nodes

Page 82: Web Audio Hero

Crie o contextoConecte os nós

hora do demo

Page 83: Web Audio Hero

AnalyserLendo dados em tempo real

Page 84: Web Audio Hero

AnalyserNode

Interface

Page 85: Web Audio Hero

analyserNode

var analyserNode = context.createAnalyser();

Crie o analisador Conecte os nós

...outputNodeinputNode

...

Page 86: Web Audio Hero

inputNode.connect(analyserNode); // analyserNode.connect(outputNode);

Conecte os nósCrie e configure

opcional

Crie o analisador Colete os dados

analyserNode

...outputNodeinputNode

...

Page 87: Web Audio Hero

var dados = new Uint8Array( analyserNode.frequencyBinCount ); analyserNode.getByteFrequencyData(dados);

Colete os dadosCrie e configure

opcional

Conecte os nós

analyserNode

...outputNodeinputNode

...

Page 88: Web Audio Hero

var dados = [ 230, 143, 98, 111, 125, 92, 53, //... ];

Colete os dadosCrie e configureConecte os nós

Page 89: Web Audio Hero

Crie o contextoConecte os nós

airtightinteractive.com/demos/js/reactive/

Page 90: Web Audio Hero

Crie o contextoConecte os nós

phenomnomnominal.github.com

Page 91: Web Audio Hero

ConvolverRealizando convolução de sinais

Page 92: Web Audio Hero

ConvolverNode

Interface

Page 93: Web Audio Hero

convolverNode

var convolverNode = context.createConvolver();

Crie o convolver

...outputNodeinputNode

...

Carregue o sinal

Page 94: Web Audio Hero

Carregue o sinal

var request = new XMLHttpRequest(); request.open("GET", "sinal.wav", true); request.responseType = "arraybuffer"; request.onload = function(){ /*...*/ }; request.send();

sinal

Crie o convolver Defina o buffer

convolverNode

...outputNode

inputNode

...

Page 95: Web Audio Hero

// onload convolverNode.buffer = context.createBuffer(request.response, false);

Defina o bufferCarregue o sinal Conecte os nósbuffer

convolverNode

...outputNodeinputNode

...

Page 96: Web Audio Hero

Conecte os nós

inputNode.connect(convolverNode); convolverNode.connect(outputNode);

Defina o buffer Experimentebuffer

convolverNode

...outputNodeinputNode

...

Page 97: Web Audio Hero

Crie o contextoConecte os nós

hora do demo

Page 98: Web Audio Hero

Crie o contextoConecte os nós

Outros experimentos

Page 99: Web Audio Hero

Crie o contextoConecte os nós

webaudiodemos.appspot.com/Vocoder/index.html

Page 100: Web Audio Hero

Crie o contextoConecte os nós

webaudiodemos.appspot.com/AudioRecorder

Page 101: Web Audio Hero

Crie o contextoConecte os nós

uglyhack.appspot.com/webaudiotoy/

Page 102: Web Audio Hero

Crie o contextoConecte os nósValeu!

@ALMIRFILHO