diff options
Diffstat (limited to 'libs/music/player.d/main_static.js')
-rw-r--r-- | libs/music/player.d/main_static.js | 80 |
1 files changed, 79 insertions, 1 deletions
diff --git a/libs/music/player.d/main_static.js b/libs/music/player.d/main_static.js index 213dcc9..f4077bb 100644 --- a/libs/music/player.d/main_static.js +++ b/libs/music/player.d/main_static.js @@ -420,13 +420,26 @@ NSAudio={ }; NSVisualization={ - nbins:1024, + nbinsp:10, + nbins:Math.pow(2,10), spectgrmw:1200, spectrw:0.7, spectrm:0.08125, caps:[], cctx:null, spectgrmp:0, + _61spbins:29, + _61spfintv:Math.pow(1024,1./29), + _61spbinw:9, + _61spaccel:.35, + _61spmaxvel:6.17274873, + _61spgvel:.025, + _61spelas:1.33*.617274873, + _61spf:6.17274873, + _61spelasth:.017274873, + _61spcaps:new Float32Array(29), + _61spcapsv:new Float32Array(29), + _61spft:new Date(), init:function() { window.requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame; @@ -459,6 +472,68 @@ NSVisualization={ } } }, + update_61_spectrum:function() + { + const cctx=this.cctx,canvas=NSUI.canvas; + cctx.clearRect(0,0,canvas.width,canvas.height); + try{ + let freqdomv=new Float32Array(NSAudio.anlznode.frequencyBinCount); + NSAudio.anlznode.getFloatFrequencyData(freqdomv); + let binl=Math.pow(2,(this._61spbinw-1)*this.nbinsp/(this._61spbins-1+this._61spbinw))-1; + let _61spfdomv=new Float32Array(this._61spbins); + const ft=new Date()-this._61spft; + this._61spft=new Date(); + const rft=ft/1000*24; + for(let i=0;i<this._61spbins;++i) + { + let binr=Math.pow(2,(i+this._61spbinw)*this.nbinsp/(this._61spbins-1+this._61spbinw))-1; + if(Math.floor(binr)<=Math.floor(binl))binr=binl+1; + let binli=Math.floor(binl); + let binri=Math.floor(binr); + const clamp=(x)=>Math.max(0,Math.min(1,x)); + _61spfdomv[i]=Math.pow(freqdomv. + slice(binli,binri+1). + reduce( + (s,c)=>s+ + clamp( + (c-NSAudio.anlznode.minDecibels) + /(NSAudio.anlznode.maxDecibels-NSAudio.anlznode.minDecibels) + )/(binri-binli+1) + ,0),2);//iS tHiS dBv^2? + binl=binr; + + if(ft>1000) + { + this._61spcaps[i]=0; + this._61spcapsv[i]=0; + continue; + } + let vel=this._61spgvel*this._61spcapsv[i]; + if(this._61spcaps[i]-vel*rft<=_61spfdomv[i]) + { + let elf=0; + if(vel>rft*this._61spelasth) + elf=this._61spcapsv[i]*this._61spelas; + this._61spcapsv[i]=(this._61spcaps[i]-vel*rft-_61spfdomv[i])*this._61spf-elf; + this._61spcaps[i]=_61spfdomv[i]; + } + else + { + if(this._61spcapsv[i]+rft*this._61spaccel<=this._61spmaxvel) + this._61spcapsv[i]+=rft*this._61spaccel; + else this._61spcapsv[i]=this._61spmaxvel; + vel=this._61spgvel*this._61spcapsv[i]; + this._61spcaps[i]-=Math.min(rft*vel,this._61spcaps[i]); + } + + cctx.fillStyle=`rgba(70,130,180,${0.36+0.64*_61spfdomv[i]})`; + cctx.fillRect(i*(canvas.width/this._61spbins),canvas.height-(canvas.height*_61spfdomv[i]),canvas.width/this._61spbins*0.96,canvas.height*_61spfdomv[i]); + + cctx.fillStyle='rgb(110,139,161)'; + cctx.fillRect(i*(canvas.width/this._61spbins),canvas.height-(canvas.height*this._61spcaps[i])-4,canvas.width/this._61spbins*0.96,4); + } + }catch(e){} + }, update_scope:function() { const cctx=this.cctx,canvas=NSUI.canvas; @@ -511,6 +586,9 @@ NSVisualization={ case 'spectrum': NSVisualization.update_spectrum(); break; + case 'spspectrum': + NSVisualization.update_61_spectrum(); + break; case 'scope': NSVisualization.update_scope(); break; |