web-audio-beat-detector
Version:
A beat detection utility which is using the Web Audio API.
43 lines (37 loc) • 5.76 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('web-audio-beat-detector-broker')) :
typeof define === 'function' && define.amd ? define(['exports', 'web-audio-beat-detector-broker'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.webAudioBeatDetector = {}, global.webAudioBeatDetectorBroker));
})(this, (function (exports, webAudioBeatDetectorBroker) { 'use strict';
var createLoadOrReturnBroker = function createLoadOrReturnBroker(loadBroker, worker) {
var broker = null;
return function () {
if (broker !== null) {
return broker;
}
var blob = new Blob([worker], {
type: 'application/javascript; charset=utf-8'
});
var url = URL.createObjectURL(blob);
broker = loadBroker(url);
// Bug #1: Edge up until v18 didn't like the URL to be revoked directly.
setTimeout(function () {
return URL.revokeObjectURL(url);
});
return broker;
};
};
// This is the minified and stringified code of the web-audio-beat-detector-worker package.
var worker = "(()=>{var e={416:function(e,t,r){!function(e){\"use strict\";var t=function(e){var t=[];return e.forEach((function(r,o){for(var n=Math.min(e.length-o,10),a=function(){var n=e[o+s]-r;t.some((function(e){return e.interval===n&&(e.peaks.push(r),!0)}))||t.push({interval:n,peaks:[r]})},s=1;s<n;s+=1)a()})),t},r=function(e){for(var t=0,r=e.length,o=0;o<r;o+=1)e[o]>t&&(t=e[o]);return t},o=function(e,t,r){for(var o=e.length,n=[],a=!1,s=0;s<o;s+=1)e[s]>t?a=!0:a&&(a=!1,n.push(s-1),s+=r/4-1);return a&&n.push(o-1),n},n=function(t,r){var o,n,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s=Math.max(0,null!==(o=a.minTempo)&&void 0!==o?o:90),p=Math.max(0,null!==(n=a.maxTempo)&&void 0!==n?n:180),u=[];return t.forEach((function(t){for(var o=60/(t.interval/r);o<s;)o*=2;for(;o>p;)o/=2;var n=!1,a=t.peaks.length;u.forEach((function(r){if(r.tempo===o&&(r.score+=t.peaks.length,r.peaks=[].concat(e(r.peaks),e(t.peaks)),n=!0),r.tempo>o-.5&&r.tempo<o+.5){var s=2*Math.abs(r.tempo-o);a+=(1-s)*r.peaks.length,r.score+=(1-s)*t.peaks.length}})),n||u.push({peaks:t.peaks,score:a,tempo:o})})),u},a=30,s=function(e,s,p){var u=r(e),i=.3*u,l=[],f=u-.05*u;if(u>.25)for(;l.length<a&&f>=i;)l=o(e,f,s),f-=.05*u;var c=t(l),d=n(c,s,p);return d.sort((function(e,t){return t.score-e.score})),d},p=function(e,t,r){var o=s(e,t,r);if(0===o.length)throw new Error(\"The given channelData does not contain any detectable beats.\");return o[0].tempo},u=function(e,t,r){var o=s(e,t,r);if(0===o.length)throw new Error(\"The given channelData does not contain any detectable beats.\");var n=o[0],a=n.peaks,p=n.tempo,u=Math.round(p),i=60/u;a.sort((function(e,t){return e-t}));for(var l=a[0]/t;l>i;)l-=i;return{bpm:u,offset:l,tempo:p}};addEventListener(\"message\",(function(e){var t=e.data;try{if(\"analyze\"===t.method){var r=t.id,o=t.params,n=o.channelData,a=o.sampleRate,s=o.tempoSettings,i=p(n,a,s);postMessage({error:null,id:r,result:{tempo:i}})}else{if(\"guess\"!==t.method)throw new Error('The given method \"'.concat(t.method,'\" is not supported'));var l=t.id,f=t.params,c=f.channelData,d=f.sampleRate,m=f.tempoSettings,h=u(c,d,m),v=h.bpm,x=h.offset,g=h.tempo;postMessage({error:null,id:l,result:{bpm:v,offset:x,tempo:g}})}}catch(e){postMessage({error:{message:e.message},id:t.id,result:null})}}))}(r(724))},899:e=>{e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,o=new Array(t);r<t;r++)o[r]=e[r];return o},e.exports.__esModule=!0,e.exports.default=e.exports},920:(e,t,r)=>{var o=r(899);e.exports=function(e){if(Array.isArray(e))return o(e)},e.exports.__esModule=!0,e.exports.default=e.exports},203:e=>{e.exports=function(e){if(\"undefined\"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e[\"@@iterator\"])return Array.from(e)},e.exports.__esModule=!0,e.exports.default=e.exports},752:e=>{e.exports=function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},e.exports.__esModule=!0,e.exports.default=e.exports},724:(e,t,r)=>{var o=r(920),n=r(203),a=r(384),s=r(752);e.exports=function(e){return o(e)||n(e)||a(e)||s()},e.exports.__esModule=!0,e.exports.default=e.exports},384:(e,t,r)=>{var o=r(899);e.exports=function(e,t){if(e){if(\"string\"==typeof e)return o(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return\"Object\"===r&&e.constructor&&(r=e.constructor.name),\"Map\"===r||\"Set\"===r?Array.from(e):\"Arguments\"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?o(e,t):void 0}},e.exports.__esModule=!0,e.exports.default=e.exports}},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var a=t[o]={exports:{}};return e[o].call(a.exports,a,a.exports,r),a.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{\"use strict\";r(416)})()})();"; // tslint:disable-line:max-line-length
var loadOrReturnBroker = createLoadOrReturnBroker(webAudioBeatDetectorBroker.load, worker);
var analyze = function analyze() {
var _loadOrReturnBroker;
return (_loadOrReturnBroker = loadOrReturnBroker()).analyze.apply(_loadOrReturnBroker, arguments);
};
var guess = function guess() {
var _loadOrReturnBroker2;
return (_loadOrReturnBroker2 = loadOrReturnBroker()).guess.apply(_loadOrReturnBroker2, arguments);
};
exports.analyze = analyze;
exports.guess = guess;
}));