UNPKG

freelizer

Version:

Simple package on pure JavaScript with Audio Web API usage that was made for purpose of calculation sound frequency from microphone

42 lines (35 loc) 1.21 kB
'use strict' import { USER_MEDIA_CONSTRAINTS, FFT_SIZE } from './constants.js' import { autoCorrelate } from './algorithm.js' import getDataFromFrequency from './getDataFromFrequency.js' export const freelizer = async () => { let rafID let audioContext let analyser let callbacks = [] const init = async () => { const stream = await navigator.mediaDevices.getUserMedia( USER_MEDIA_CONSTRAINTS ) audioContext = new AudioContext() analyser = audioContext.createAnalyser() analyser.fftSize = FFT_SIZE audioContext.createMediaStreamSource(stream).connect(analyser) } const update = () => { const buffer = new Float32Array(FFT_SIZE) analyser.getFloatTimeDomainData(buffer) const frequency = autoCorrelate(buffer, audioContext.sampleRate) callbacks.forEach((fn) => fn(frequency ? getDataFromFrequency(frequency) : {}) ) rafID = requestAnimationFrame(update) } await init() return { start: () => update(), stop: () => cancelAnimationFrame(rafID), subscribe: (fn) => (callbacks = [...callbacks, fn]), unsubscribe: (fn) => (callbacks = callbacks.filter((el) => el !== fn)), } }