On Github jorgenbs / web-audio-api
javascript og åpne web teknologier.
mange som har drevet med javascript?
beklager engelsk-norsk
Skrape overflaten, unngå lydtekniske ting.
Høynivå API, ikke alltid nødvendig
Flash tok over
Tilbydde mye som ikke var mulig av multimedia før
Alle fornøyd med å komme seg videre
Endelig et html element som er laget for playback i browser.
Native Playback
God støtte i de fleste
God browserstøtte i dag
Native look
Egne interfaces
iOS kan man kun spille 1 stream om gangen.
browser som tar seg av bandwidth-sparing, cpu throttling
Presisjon er nøkkelfaktor for det meste av spill, audio software og UX.
Audio brukes ofte som bakgrunnsmusikk
//crossbrowser Webkit + Blink window.AudioContext = (window.AudioContext || window.webkitAudioContext); var context = new AudioContext();audio routing graph
Kun en context per side
Destination er ReadOnly.
Mozilla Audio Data API
Input kan hentes fra forskjellige kilder
Hente fil fra disk eller annet sted, createBufferSource
Hente fra HTML elementer på siden
Hente fra mikrofon/webcam
Produsere lyd fra f.eks en sinusbølge
var context = new AudioContext(); var source = context.createOscillator(); source.connect(context.destination); source.start();PÅ AV
oscillator.frequency.value = n; //Hz 440 default
Det er audiocontext-objekt som tilbyr alle metodene
Skipper audiocontext-oppretting i senere eks.
Hver node implementerer generisk interface AudioNode
AudioNode.connect(AudioNode) AudioNode.numberOfInputs AudioNode.numberOfOutputs
Flere sources
Flere inputs/outputs kobles sammen
Skal ikke gå inn på hver, det fins flere også.
var source = context.createOscillator(); var gainNode = context.createGain(); gainNode.gain = 0.5; source.connect(gainNode); gainNode.connect(context.destination);
Programmatisk eksempel
Viktig å merke koblingene
Tilbyr frekvens og tidsdomene analyse informasjon i sanntid
Visualisering og Analysering
var analyser = context.createAnalyser(); analyser.fftSize = 2048; var bufferLength = analyser.frequencyBinCount; var dataArray = new Uint8Array(bufferLength); analyser.getByteTimeDomainData(dataArray);
Siste node-typen jeg viser
litt mer avansert, men slipper å implementere fast fourier transformasjon
Henter input fra mikrofonen min
SetTimeout() og SetInterval() er unnøyaktig
3-4ms presisjonstap, og utsettes for browser throttling
AudioContext har eget hardware timestamp som starter på 0, og er read-only.
Hver source kjører uforstyrret på egen tråd
//setter avspillig n-sekund i fortiden source.start(n);
Lar deg spille lyder i rytme siden de deler samme timer.
<audio src="examples/machinegun/m4a1.mp3" controls></audio>
var audioElement = document.querySelector('#gun-sample'); var mediaSourceNode = context.createMediaElementSource(audioElement);Long burst M4A1 Time-randomized M4A1 Pitch-randomized M4A1
Sette opp en kø av sources.
Høres unaturlig ut forid det er nøyaktig mellomrom
Mer tilfeldighet i avspillingen mer naturlig ut
for (var i = 0; i < rounds; i++) { var source = context.createMediaElementSource(el); source.connect(gainNode); gainNode.connect(compressorNode); compressorNode.connect(context.destination); //hastighet source.playbackRate.value = 1 + Math.random() * random2; source.start(time + i * interval + Math.random() * random); }
Loopes over antall skudd
koble effektnoder
playbackRate som å spile. Øker pitch (tonehøyde)
AngryBirds lydhåndtering
pannerNode: 3D plassering av lyd, dopplereffekt
Styr apps med lyd
Ser ut som AudioContext eksempelet fra tidligere
Randomisert musikk.
Kreative web eksperiment
Tale-til-tekst -> tekst-til-tale
specc for impl. av talegjennkjenning i nettleser
MIDI er ikke bakgrunnsmusikk. Under chrome-flag inntil videre
appear.in
//cross-browser polyfill navigator.getUserMedia = ( navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia ); navigator.getUserMedia( {audio: true, video: false}, function callback(stream) { var microphoneNode = context.createMediaStreamSource(stream); //gjør noe nyttig... microphoneNode.connect(analyser); });
appear.in
nettleser ber om tillatelse