@chordbook/tuner
Version:
The tuner used by ChordBook.app
2 lines • 2.07 kB
JavaScript
;var h=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var N=(e,t)=>{for(var a in t)h(e,a,{get:t[a],enumerable:!0})},w=(e,t,a,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of x(t))!C.call(e,n)&&n!==a&&h(e,n,{get:()=>t[n],enumerable:!(s=g(t,n))||s.enumerable});return e};var A=e=>w(h({},"__esModule",{value:!0}),e);var R={};N(R,{TunerDefaults:()=>v,createTuner:()=>I});module.exports=A(R);var T=require("pitchy"),F=69,z=["C","C\u266F","D","D\u266F","E","F","F\u266F","G","G\u266F","A","A\u266F","B"],v={a4:440,clarityThreshold:.9,minVolumeDecibels:-1e3,bufferSize:8192,smoothingTimeConstant:.8,minFrequency:27.5,maxFrequency:4186.01,updateInterval:50,sampleRate:44100};function I(e={}){e={...v,...e};let t=new AudioContext({sampleRate:e.sampleRate}),a=new BiquadFilterNode(t,{type:"highpass",frequency:e.minFrequency}),s=new BiquadFilterNode(t,{type:"lowpass",frequency:e.maxFrequency}),n=new AnalyserNode(t,{fftSize:e.bufferSize,smoothingTimeConstant:e.smoothingTimeConstant});s.connect(a).connect(n);let i=T.PitchDetector.forFloat32Array(n.fftSize);i.minVolumeDecibels=e.minVolumeDecibels;let p=new Float32Array(i.inputLength),u,b,y=0;async function q(){u=await navigator.mediaDevices.getUserMedia({audio:!0}),b=t.createMediaStreamSource(u),b.connect(s),y=setInterval(M,e.updateInterval)}function M(){let{clarityThreshold:r,minFrequency:l,maxFrequency:o,onNote:d}=e;n.getFloatTimeDomainData(p);let[c,m]=i.findPitch(p,t.sampleRate);m>r&&c>l&&c<o&&d?.(f(c,m))}function f(r,l){let o=Math.round(12*(Math.log(r/e.a4)/Math.log(2)))+F,d=e.a4*Math.pow(2,(o-F)/12),c=Math.floor(1200*Math.log(r/d)/Math.log(2)),m=z[o%12],S=Math.floor(o/12)-1;return{frequency:r,name:m,value:o,cents:c,octave:S,clarity:l}}async function D(){clearInterval(y),u.getTracks().forEach(r=>r.stop()),u.removeTrack(u.getAudioTracks()[0])}return{start:q,stop:D,context:t,analyser:n,detector:i,config:e,getNote:f}}0&&(module.exports={TunerDefaults,createTuner});
//# sourceMappingURL=index.cjs.map