ecplayer 1.1.2 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ecplayer.es.js +10 -10
- package/dist/ecplayer.umd.js +1 -1
- package/package.json +1 -1
package/dist/ecplayer.es.js
CHANGED
|
@@ -420,19 +420,19 @@ function yr({
|
|
|
420
420
|
}), [ce, Ee] = k(1), [w, Me] = k(0), [ne, $e] = k(!1), [i, de] = k({
|
|
421
421
|
enable: N.spatialEngine && (a == null ? void 0 : a.enable) !== void 0 ? a.enable : !1,
|
|
422
422
|
spatial: {
|
|
423
|
-
rate: ((kt = a == null ? void 0 : a.spatial) == null ? void 0 : kt.rate) !== void 0 ? a.spatial.rate : 0.
|
|
424
|
-
width: ((qt = a == null ? void 0 : a.spatial) == null ? void 0 : qt.width) !== void 0 ? a.spatial.width :
|
|
425
|
-
focus: ((wt = a == null ? void 0 : a.spatial) == null ? void 0 : wt.focus) !== void 0 ? a.spatial.focus :
|
|
423
|
+
rate: ((kt = a == null ? void 0 : a.spatial) == null ? void 0 : kt.rate) !== void 0 ? a.spatial.rate : 0.2,
|
|
424
|
+
width: ((qt = a == null ? void 0 : a.spatial) == null ? void 0 : qt.width) !== void 0 ? a.spatial.width : 150,
|
|
425
|
+
focus: ((wt = a == null ? void 0 : a.spatial) == null ? void 0 : wt.focus) !== void 0 ? a.spatial.focus : 20
|
|
426
426
|
},
|
|
427
427
|
reverb: {
|
|
428
|
-
size: ((Nt = a == null ? void 0 : a.reverb) == null ? void 0 : Nt.size) !== void 0 ? a.reverb.size :
|
|
429
|
-
tone: (($t = a == null ? void 0 : a.reverb) == null ? void 0 : $t.tone) !== void 0 ? a.reverb.tone :
|
|
428
|
+
size: ((Nt = a == null ? void 0 : a.reverb) == null ? void 0 : Nt.size) !== void 0 ? a.reverb.size : 3,
|
|
429
|
+
tone: (($t = a == null ? void 0 : a.reverb) == null ? void 0 : $t.tone) !== void 0 ? a.reverb.tone : 40,
|
|
430
430
|
mix: ((xt = a == null ? void 0 : a.reverb) == null ? void 0 : xt.mix) !== void 0 ? a.reverb.mix : 30
|
|
431
431
|
},
|
|
432
432
|
echo: {
|
|
433
|
-
time: ((Ct = a == null ? void 0 : a.echo) == null ? void 0 : Ct.time) !== void 0 ? a.echo.time :
|
|
434
|
-
feedback: ((Tt = a == null ? void 0 : a.echo) == null ? void 0 : Tt.feedback) !== void 0 ? a.echo.feedback :
|
|
435
|
-
mix: ((Rt = a == null ? void 0 : a.echo) == null ? void 0 : Rt.mix) !== void 0 ? a.echo.mix :
|
|
433
|
+
time: ((Ct = a == null ? void 0 : a.echo) == null ? void 0 : Ct.time) !== void 0 ? a.echo.time : 50,
|
|
434
|
+
feedback: ((Tt = a == null ? void 0 : a.echo) == null ? void 0 : Tt.feedback) !== void 0 ? a.echo.feedback : 30,
|
|
435
|
+
mix: ((Rt = a == null ? void 0 : a.echo) == null ? void 0 : Rt.mix) !== void 0 ? a.echo.mix : 10
|
|
436
436
|
},
|
|
437
437
|
tape: {
|
|
438
438
|
speed: typeof (a == null ? void 0 : a.tape) == "number" ? a.tape : ((Pt = a == null ? void 0 : a.tape) == null ? void 0 : Pt.speed) !== void 0 ? a.tape.speed : 1,
|
|
@@ -445,7 +445,7 @@ function yr({
|
|
|
445
445
|
enable: !!N.spatialEngine && (a.enable !== void 0 ? a.enable : !0),
|
|
446
446
|
spatial: {
|
|
447
447
|
rate: ((t = a.spatial) == null ? void 0 : t.rate) !== void 0 ? a.spatial.rate : 0.2,
|
|
448
|
-
width: ((l = a.spatial) == null ? void 0 : l.width) !== void 0 ? a.spatial.width :
|
|
448
|
+
width: ((l = a.spatial) == null ? void 0 : l.width) !== void 0 ? a.spatial.width : 150,
|
|
449
449
|
focus: ((g = a.spatial) == null ? void 0 : g.focus) !== void 0 ? a.spatial.focus : 20
|
|
450
450
|
},
|
|
451
451
|
reverb: {
|
|
@@ -455,7 +455,7 @@ function yr({
|
|
|
455
455
|
},
|
|
456
456
|
echo: {
|
|
457
457
|
time: ((ae = a.echo) == null ? void 0 : ae.time) !== void 0 ? a.echo.time : 50,
|
|
458
|
-
feedback: ((X = a.echo) == null ? void 0 : X.feedback) !== void 0 ? a.echo.feedback :
|
|
458
|
+
feedback: ((X = a.echo) == null ? void 0 : X.feedback) !== void 0 ? a.echo.feedback : 30,
|
|
459
459
|
mix: ((J = a.echo) == null ? void 0 : J.mix) !== void 0 ? a.echo.mix : 10
|
|
460
460
|
},
|
|
461
461
|
tape: {
|
package/dist/ecplayer.umd.js
CHANGED
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
*
|
|
75
75
|
* This source code is licensed under the ISC license.
|
|
76
76
|
* See the LICENSE file in the root directory of this source tree.
|
|
77
|
-
*/const sr=be("volume-x",[["path",{d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",key:"uqj9uw"}],["line",{x1:"22",x2:"16",y1:"9",y2:"15",key:"1ewh16"}],["line",{x1:"16",x2:"22",y1:"9",y2:"15",key:"5ykzw1"}]]),ie={rainbow:{name:"Rainbow",bg:"linear-gradient(135deg, #ef444422 0%, #f9731622 15%, #f59e0b22 30%, #10b98122 45%, #06b6d422 60%, #3b82f622 75%, #6366f122 85%, #a855f722 92%, #ec489922 100%)",bars:["#ef4444","#f97316","#f59e0b","#eab308","#84cc16","#22c55e","#10b981","#06b6d4","#0ea5e9","#3b82f6","#6366f1","#8b5cf6","#a855f7","#d946ef","#ec4899","#f43f5e"],peak:"#a0a0a0ff",button:"#ec4899",buttonHover:"#d946ef",slider:"#ec4899"},ocean:{name:"Ocean Blue",bg:"linear-gradient(135deg, #667eea43 0%, #764ba243 100%)",bars:["#0ea5e9","#38bdf8","#06b6d4","#22d3ee"],peak:"#0369a1",button:"#0ea5e9",buttonHover:"#0284c7",slider:"#0ea5e9"},sunset:{name:"Sunset",bg:"linear-gradient(135deg, #f093fb43 0%, #f5576c43 100%)",bars:["#f43f5e","#fb7185","#fda4af","#fecdd3"],peak:"#be123c",button:"#f43f5e",buttonHover:"#e11d48",slider:"#f43f5e"},forest:{name:"Forest Green",bg:"linear-gradient(135deg, #0ba36043 0%, #3cba9243 100%)",bars:["#10b981","#34d399","#6ee7b7","#a7f3d0"],peak:"#047857",button:"#10b981",buttonHover:"#059669",slider:"#10b981"},midnight:{name:"Midnight",bg:"linear-gradient(135deg, #2c3e5043 0%, #3498db43 100%)",bars:["#3b82f6","#60a5fa","#93c5fd","#bfdbfe"],peak:"#1e40af",button:"#3b82f6",buttonHover:"#2563eb",slider:"#3b82f6"},neon:{name:"Neon Cyan",bg:"linear-gradient(135deg, #13547a43 0%, #80d0c743 100%)",bars:["#06b6d4","#22d3ee","#67e8f9","#a5f3fc"],peak:"#0e7490",button:"#06b6d4",buttonHover:"#0891b2",slider:"#06b6d4"},purple:{name:"Royal Purple",bg:"linear-gradient(135deg, #2f1c5622 0%, #764ba243 100%)",bars:["#8b5cf6","#a78bfa","#baabf9ff","#ddd6fe"],peak:"#6d28d9",button:"#8b5cf6",buttonHover:"#7c3aed",slider:"#8b5cf6"},amber:{name:"Amber Gold",bg:"linear-gradient(135deg, #f59e0b43 0%, #d9770643 100%)",bars:["#f59e0b","#fbbf24","#fcd34d","#fde68a"],peak:"#b45309",button:"#f59e0b",buttonHover:"#d97706",slider:"#f59e0b"},rose:{name:"Rose Pink",bg:"linear-gradient(135deg, #ec489943 0%, #be185d43 100%)",bars:["#ec4899","#f472b6","#f9a8d4","#fbcfe8"],peak:"#9f1239",button:"#ec4899",buttonHover:"#db2777",slider:"#ec4899"}};function ur({theme:l,setTheme:d,close:u}){const f=Object.keys(ie).map(x=>({key:x,name:ie[x].name,colors:ie[x].bars}));return e.jsxs("div",{className:"ecp-theme-selector-panel",children:[e.jsxs("div",{className:"ecp-theme-selector-header",children:[e.jsx("h2",{className:"ecp-theme-selector-title",children:"Choose Color Palette"}),e.jsx("button",{onClick:()=>u(),className:"ecp-theme-selector-close",children:"Close"})]}),e.jsx("div",{className:"ecp-theme-grid",children:f.map(x=>e.jsxs("div",{className:`ecp-theme-card${l===x.key?" ecp-theme-card--active":""}`,onClick:()=>d(x.key),children:[e.jsx("div",{className:"ecp-theme-color-preview",style:{background:`linear-gradient(to right, ${x.colors.join(", ")})`}}),e.jsx("div",{className:"ecp-theme-name",children:x.name})]},x.key))})]})}const vr=(l,d)=>{const u=l.sampleRate,f=Math.max(1,Math.floor(u*Math.max(.1,d))),x=l.createBuffer(2,f,u),v=x.getChannelData(0),q=x.getChannelData(1),R=3/d;for(let C=0;C<f;C++){const z=C/u,V=Math.exp(-z*R);v[C]=(Math.random()*2-1)*V,q[C]=(Math.random()*2-1)*V}return x},fr=l=>{const d=Math.max(0,l),u=44100,f=new Float32Array(u),x=Math.PI/180;if(d===0)for(let v=0;v<u;++v)f[v]=v*2/u-1;else for(let v=0;v<u;++v){const q=v*2/u-1;f[v]=(3+d)*q*20*x/(Math.PI+d*Math.abs(q))}return f};function hr({audio:l,name:d="No track loaded",author:u,theme:f="rainbow",volume:x=100,thumbnail:v=null,controls:q={play:!0,pause:!0,stop:!0,seekbar:!0,volume:!0,loop:!0,trackName:!0,equalizer:!0,speed:!0,spatialEngine:!1},mode:R="light",bands:C=null,transparent:z=!1,autoPlay:V=!1,equalizer:X={bass:0,mid:0,treble:0},spatialEngine:c=null}){var Cr,Sr,Tr,Pr,Mr,Ar,Fr,zr,Lr,Er,Ir;const[W,E]=r.useState(!1),[_,Y]=r.useState(0),[H,A]=r.useState(0),[P,Me]=r.useState(x||100),[me,Ce]=r.useState(!1),[B,Ae]=r.useState(!1),[fe,ye]=r.useState(!1),[ke,U]=r.useState([]),[Q,Fe]=r.useState(!1),[Z,Se]=r.useState({bass:X.bass||0,mid:X.mid||0,treble:X.treble||0}),[te,je]=r.useState(1),[k,Te]=r.useState(0),[ee,Ne]=r.useState(!1),[o,le]=r.useState({enable:q.spatialEngine&&(c==null?void 0:c.enable)!==void 0?c.enable:!1,spatial:{rate:((Cr=c==null?void 0:c.spatial)==null?void 0:Cr.rate)!==void 0?c.spatial.rate:.11,width:((Sr=c==null?void 0:c.spatial)==null?void 0:Sr.width)!==void 0?c.spatial.width:135,focus:((Tr=c==null?void 0:c.spatial)==null?void 0:Tr.focus)!==void 0?c.spatial.focus:65},reverb:{size:((Pr=c==null?void 0:c.reverb)==null?void 0:Pr.size)!==void 0?c.reverb.size:2.4,tone:((Mr=c==null?void 0:c.reverb)==null?void 0:Mr.tone)!==void 0?c.reverb.tone:62,mix:((Ar=c==null?void 0:c.reverb)==null?void 0:Ar.mix)!==void 0?c.reverb.mix:30},echo:{time:((Fr=c==null?void 0:c.echo)==null?void 0:Fr.time)!==void 0?c.echo.time:500,feedback:((zr=c==null?void 0:c.echo)==null?void 0:zr.feedback)!==void 0?c.echo.feedback:45,mix:((Lr=c==null?void 0:c.echo)==null?void 0:Lr.mix)!==void 0?c.echo.mix:5},tape:{speed:typeof(c==null?void 0:c.tape)=="number"?c.tape:((Er=c==null?void 0:c.tape)==null?void 0:Er.speed)!==void 0?c.tape.speed:1,drive:typeof(c==null?void 0:c.tape)=="object"&&((Ir=c.tape)==null?void 0:Ir.drive)!==void 0?c.tape.drive:0}});r.useEffect(()=>{var t,n,m,b,g,O,re,G,K,L,ce;c&&le({enable:!!q.spatialEngine&&(c.enable!==void 0?c.enable:!0),spatial:{rate:((t=c.spatial)==null?void 0:t.rate)!==void 0?c.spatial.rate:.2,width:((n=c.spatial)==null?void 0:n.width)!==void 0?c.spatial.width:80,focus:((m=c.spatial)==null?void 0:m.focus)!==void 0?c.spatial.focus:20},reverb:{size:((b=c.reverb)==null?void 0:b.size)!==void 0?c.reverb.size:3,tone:((g=c.reverb)==null?void 0:g.tone)!==void 0?c.reverb.tone:40,mix:((O=c.reverb)==null?void 0:O.mix)!==void 0?c.reverb.mix:30},echo:{time:((re=c.echo)==null?void 0:re.time)!==void 0?c.echo.time:50,feedback:((G=c.echo)==null?void 0:G.feedback)!==void 0?c.echo.feedback:20,mix:((K=c.echo)==null?void 0:K.mix)!==void 0?c.echo.mix:10},tape:{speed:typeof c.tape=="number"?c.tape:((L=c.tape)==null?void 0:L.speed)!==void 0?c.tape.speed:1,drive:typeof c.tape=="object"&&((ce=c.tape)==null?void 0:ce.drive)!==void 0?c.tape.drive:0}})},[c]);const[de,qe]=r.useState("spatial"),S=r.useRef(o),D=r.useRef(te);r.useEffect(()=>{S.current=o},[o]),r.useEffect(()=>{D.current=te},[te]);const se=()=>{if(p.current){const t=S.current.enable,n=t?S.current.tape.speed:1,b=!(t&&n!==1);"preservesPitch"in p.current&&(p.current.preservesPitch=b),"webkitPreservesPitch"in p.current&&(p.current.webkitPreservesPitch=b),"mozPreservesPitch"in p.current&&(p.current.mozPreservesPitch=b),p.current.playbackRate=D.current*n}},s=(t,n,m)=>{le(b=>({...b,enable:!0,[t]:{...b[t],[n]:m}}))},N=()=>{le(t=>({...t,enable:!t.enable}))},M=()=>{le({enable:!0,spatial:{rate:.11,width:135,focus:65},reverb:{size:2.4,tone:62,mix:30},echo:{time:500,feedback:45,mix:5},tape:{speed:1,drive:0}})},p=r.useRef(null),$=r.useRef(null),J=r.useRef(null),T=r.useRef(null),pe=r.useRef(null),Pe=r.useRef(null),we=r.useRef(null),I=r.useRef(null),ue=r.useRef(null),Oe=r.useRef(null),We=r.useRef(null),Ue=r.useRef(null),De=r.useRef(null),_e=r.useRef(null),Ge=r.useRef(null),Ve=r.useRef(null),nr=r.useRef(null),Xe=r.useRef(0),ze=r.useRef(null),$e=r.useRef(null),ae=r.useRef(null),ve=r.useRef(null),Le=r.useRef(0),Ye=r.useRef(null),Re=r.useRef(null);r.useEffect(()=>{const t=Re.current;if(!t)return;const n=new ResizeObserver(m=>{for(let b of m)Te(b.contentRect.width)});return n.observe(t),()=>n.disconnect()},[]),r.useEffect(()=>{const t=[];if(l&&typeof l!="string"&&t.push(["TypeError","audio must be a string (URL or path)"]),d&&typeof d!="string"&&t.push(["TypeError","name must be a string"]),f&&typeof f!="string"&&typeof f!="object")t.push(["TypeError","theme must be a string or a valid theme object"]);else if(typeof f=="object"){const n=["name","bg","bars","peak","button","buttonHover","slider"];for(const m of n)m in f||t.push(["ThemeError",`theme object missing key: ${m}`])}(typeof x!="number"||x<0||x>100)&&t.push(["TypeError","volume must be a number between 0 and 100"]),typeof q!="object"||Array.isArray(q)?t.push(["TypeError","controls must be an object"]):["play","pause","stop","seekbar","volume","loop","trackName","equalizer"].forEach(m=>{q&&m in q&&typeof q[m]!="boolean"&&t.push(["TypeError",`controls.${m} must be a boolean`])}),C&&(Array.isArray(C)?C.length===0?t.push(["ValueError","bands array cannot be empty"]):C.forEach((n,m)=>{typeof n.freq!="number"&&t.push(["TypeError",`bands[${m}].freq must be a number`])}):t.push(["TypeError","bands must be an array"])),t.length>0?(U(t),console.group("%cVisualizePlayer: Prop validation failed","color:red"),t.forEach(n=>console.error(`${n[0]}: ${n[1]}`)),console.groupEnd()):U([])},[l,d,f,x,q,R,C]);const a=C||[{freq:0},{freq:10},{freq:20},{freq:25},{freq:31.5},{freq:40},{freq:50},{freq:63},{freq:80},{freq:100},{freq:125},{freq:160},{freq:200},{freq:250},{freq:315},{freq:400},{freq:500},{freq:630},{freq:800},{freq:1e3},{freq:1250},{freq:1600},{freq:2e3},{freq:2500},{freq:3150},{freq:4e3},{freq:5e3},{freq:6300},{freq:8e3},{freq:1e4},{freq:12500}],h=r.useRef(a.map(()=>0)),w=r.useRef(a.map(()=>0)),F=r.useRef(a.map(()=>0)),j=r.useRef(!1),ne=r.useRef(typeof f=="string"?f:"purple"),[Ee,Zr]=r.useState(0),lr=typeof f=="string"&&f==="rainbow"||typeof f=="object"&&(f==null?void 0:f.name)==="Rainbow";r.useEffect(()=>{if(!lr)return;const t=setInterval(()=>{Zr(n=>(n+1)%ie.rainbow.bars.length)},5e3);return()=>clearInterval(t)},[lr]);const gr=typeof f=="string"?ie[f]||ie.purple:typeof f=="object"?f:ie.purple,i=lr?{...gr,button:ie.rainbow.bars[Ee],buttonHover:ie.rainbow.bars[(Ee+1)%ie.rainbow.bars.length],slider:ie.rainbow.bars[Ee]}:gr,y=R==="dark",er=typeof q=="object"&&Object.keys(q).length===0;r.useEffect(()=>{typeof f=="string"?ne.current=f:ne.current="purple",He()},[f]),r.useEffect(()=>{p.current||(p.current=new Audio);const t=p.current,n=()=>{fe||Y(t.currentTime)},m=()=>A(t.duration),b=()=>{B||(E(!1),ae.current&&cancelAnimationFrame(ae.current))},g=()=>{E(!0),se()},O=()=>E(!1);return t.addEventListener("timeupdate",n),t.addEventListener("loadedmetadata",m),t.addEventListener("ended",b),t.addEventListener("play",g),t.addEventListener("pause",O),()=>{t.removeEventListener("timeupdate",n),t.removeEventListener("loadedmetadata",m),t.removeEventListener("ended",b),t.removeEventListener("play",g),t.removeEventListener("pause",O)}},[fe,B]),r.useEffect(()=>()=>{ve.current&&clearInterval(ve.current),p.current&&(p.current.pause(),p.current.src="",p.current.load()),$.current&&$.current.close().catch(t=>console.warn("AudioContext cleanup error:",t)),ae.current&&cancelAnimationFrame(ae.current)},[]),r.useEffect(()=>{if(l){const t=W,n=P,m=B;if(ae.current&&(cancelAnimationFrame(ae.current),ae.current=null),T.current){try{T.current.disconnect()}catch{}T.current=null}if(J.current){try{J.current.disconnect()}catch{}J.current=null}if(pe.current){try{pe.current.disconnect()}catch{}pe.current=null}if(Pe.current){try{Pe.current.disconnect()}catch{}Pe.current=null}if(we.current){try{we.current.disconnect()}catch{}we.current=null}$.current&&($.current.close().catch(L=>console.warn("AudioContext close error:",L)),$.current=null),p.current&&(p.current.pause(),p.current.src="",p.current.load()),p.current=new Audio;try{p.current.crossOrigin="anonymous"}catch{}p.current.src=l,p.current.preload="auto",p.current.muted=!1,p.current.volume=me?0:n/100,p.current.loop=m,p.current.load();const b=p.current,g=()=>{fe||Y(b.currentTime)},O=()=>A(b.duration),re=()=>{B||E(!1)},G=()=>{E(!0),se()},K=()=>E(!1);b.addEventListener("timeupdate",g),b.addEventListener("loadedmetadata",O),b.addEventListener("ended",re),b.addEventListener("play",G),b.addEventListener("pause",K),Y(0),E(!1),h.current=a.map(()=>0),w.current=a.map(()=>0),F.current=a.map(()=>0),He(),(t||V||er)&&p.current.play().catch(L=>console.error("Play failed:",L))}},[l]),r.useEffect(()=>{p.current&&(p.current.volume=me?0:P/100)},[P,me]),r.useEffect(()=>{p.current&&(p.current.loop=B)},[B]),r.useEffect(()=>{se()},[te,o.tape.speed,o.enable]),r.useEffect(()=>{$.current&&(pe.current&&(pe.current.gain.value=Z.bass),Pe.current&&(Pe.current.gain.value=Z.mid),we.current&&(we.current.gain.value=Z.treble))},[Z]),r.useEffect(()=>{if($.current){const t=o.enable;if(Ve.current&&(Ve.current.curve=fr(t?o.tape.drive:0)),We.current&&(We.current.frequency.value=o.reverb.tone/100*8e3+500),Ue.current&&(Ue.current.gain.value=t?o.reverb.mix/100:0),Oe.current&&$.current)try{Oe.current.buffer=vr($.current,o.reverb.size)}catch{}if(De.current&&(De.current.delayTime.value=Math.max(.01,o.echo.time/1e3)),_e.current&&(_e.current.gain.value=t?Math.min(.85,o.echo.feedback/100):0),Ge.current&&(Ge.current.gain.value=t?o.echo.mix/100:0),!t&&(ue.current&&(ue.current.pan.value=0),I.current&&$.current)){const n=$.current.currentTime;I.current.positionX?(I.current.positionX.setTargetAtTime(0,n,.01),I.current.positionY.setTargetAtTime(0,n,.01),I.current.positionZ.setTargetAtTime(-1.4,n,.01)):I.current.setPosition&&I.current.setPosition(0,0,-1.4)}}},[o]);const yr=()=>{if(!$.current||!j.current)return;const t=S.current;if(!t.enable)return;const n=performance.now(),m=Le.current?Math.min(.1,(n-Le.current)/1e3):.016;Le.current=n;const b=t.spatial.rate;Xe.current+=b*5*m;const g=Xe.current,re=2.3*(t.spatial.width/135),G=Math.sin(g)*re,K=-Math.cos(g)*re,L=Math.sin(g*2)*.4,ce=$.current.currentTime;if(I.current&&(I.current.positionX?(I.current.positionX.setTargetAtTime(G,ce,.04),I.current.positionY.setTargetAtTime(L,ce,.04),I.current.positionZ.setTargetAtTime(K,ce,.04)):I.current.setPosition&&I.current.setPosition(G,L,K)),ue.current){const he=Math.sin(g)*(t.spatial.width/180),ge=(t.spatial.focus-50)/100,Be=Math.max(-1,Math.min(1,he+ge));ue.current.pan.setTargetAtTime(Be,ce,.04)}};r.useEffect(()=>{j.current=W,ae.current&&(cancelAnimationFrame(ae.current),ae.current=null),ve.current&&(clearInterval(ve.current),ve.current=null),W?($.current||Kr(),Le.current=performance.now(),ve.current=window.setInterval(yr,30),Nr()):qr()},[W]);const Kr=()=>{if(!$.current&&p.current)try{const t=window.AudioContext||window.webkitAudioContext;if(t){const n=new t;$.current=n;const m=n.createBiquadFilter();m.type="lowshelf",m.frequency.value=320,m.gain.value=Z.bass;const b=n.createBiquadFilter();b.type="peaking",b.frequency.value=1e3,b.Q.value=.5,b.gain.value=Z.mid;const g=n.createBiquadFilter();g.type="highshelf",g.frequency.value=3200,g.gain.value=Z.treble;const O=n.createWaveShaper();O.curve=fr(S.current.enable?S.current.tape.drive:0),se();let re=null;try{const xe=n.createPanner();xe.panningModel="HRTF",xe.distanceModel="inverse",xe.refDistance=1.4,xe.rolloffFactor=.55,re=xe}catch{}let G=null;if(n.createStereoPanner){const xe=n.createStereoPanner();xe.pan.value=0,G=xe}const K=n.createGain();K.gain.value=1;const L=n.createConvolver();L.buffer=vr(n,S.current.reverb.size);const ce=n.createBiquadFilter();ce.type="lowpass",ce.frequency.value=S.current.reverb.tone/100*8e3+500;const he=n.createGain();he.gain.value=S.current.enable?S.current.reverb.mix/100:0;const ge=n.createDelay(2);ge.delayTime.value=S.current.echo.time/1e3;const Be=n.createGain();Be.gain.value=Math.min(.85,S.current.echo.feedback/100);const rr=n.createGain();rr.gain.value=S.current.enable?S.current.echo.mix/100:0,ge.connect(Be),Be.connect(ge);const Ie=n.createAnalyser();Ie.fftSize=8192,Ie.smoothingTimeConstant=.7;const Dr=n.createMediaElementSource(p.current);Dr.connect(m),m.connect(b),b.connect(g),g.connect(O);const tr=re,Ze=G,or=tr||Ze||O;tr?(O.connect(tr),Ze&&tr.connect(Ze)):Ze&&O.connect(Ze),or.connect(K),K.connect(Ie),or.connect(L),L.connect(ce),ce.connect(he),he.connect(Ie),or.connect(ge),ge.connect(rr),rr.connect(Ie),Ie.connect(n.destination),pe.current=m,Pe.current=b,we.current=g,Ve.current=O,I.current=re,ue.current=G,nr.current=K,Oe.current=L,We.current=ce,Ue.current=he,De.current=ge,_e.current=Be,Ge.current=rr,J.current=Ie,T.current=Dr}}catch(t){console.error("Failed to setup audio context:",t)}},kr=t=>{const n=$.current,m=J.current;if(!n||!m)return 0;const b=n.sampleRate/2,g=Math.round(t/b*m.frequencyBinCount);return Math.min(g,m.frequencyBinCount-1)},qr=()=>{if(j.current)return;h.current=h.current.map(b=>b*.7);const t=Date.now();w.current=w.current.map((b,g)=>t-F.current[g]>1500?b*.95:b),He();const n=Math.max(...h.current),m=Math.max(...w.current);n>.01||m>.01?ae.current=requestAnimationFrame(qr):(j.current||(h.current=a.map(()=>0),w.current=a.map(()=>0),F.current=a.map(()=>0),He()),ae.current&&cancelAnimationFrame(ae.current),ae.current=null)},Nr=()=>{if(!J.current||!j.current)return;const t=S.current;if(t.enable&&$.current){yr();const b=Xe.current,g=t.spatial.width/135;if(ze.current){const O=85*(g>0?1:0),re=55*(g>0?1:0),G=Math.sin(b)*O,K=-Math.cos(b)*re;ze.current.style.transform=`translate(${G}px, ${K}px)`,$e.current&&($e.current.setAttribute("x2",`${110+G}`),$e.current.setAttribute("y2",`${75+K}`))}}else if($.current){const b=$.current.currentTime;I.current&&(I.current.positionX?(I.current.positionX.setTargetAtTime(0,b,.04),I.current.positionY.setTargetAtTime(0,b,.04),I.current.positionZ.setTargetAtTime(-1.4,b,.04)):I.current.setPosition&&I.current.setPosition(0,0,-1.4)),ue.current&&ue.current.pan.setTargetAtTime(0,b,.04),ze.current&&(ze.current.style.transform="translate(0px, 0px)"),$e.current&&($e.current.setAttribute("x2","110"),$e.current.setAttribute("y2","20"))}const n=J.current.frequencyBinCount,m=new Uint8Array(n);J.current.getByteFrequencyData(m),a.forEach((b,g)=>{const O=kr(b.freq),re=g<a.length-1?kr(a[g+1].freq):m.length;let G=0,K=0;for(let he=O;he<re;he++)G+=m[he],K++;let L=K>0?G/K/255:0;L=Math.pow(L,.6),h.current[g]=h.current[g]*.8+L*.2;const ce=Date.now();h.current[g]>w.current[g]?(w.current[g]=h.current[g],F.current[g]=ce):ce-F.current[g]>1500&&(w.current[g]*=.95)}),He(),ae.current=requestAnimationFrame(Nr)},He=()=>{if(!Ye.current)return;const t=ie[ne.current]||ie.rainbow,n=Ye.current;if(n.children.length!==a.length){let g="";a.forEach(()=>{g+=`
|
|
77
|
+
*/const sr=be("volume-x",[["path",{d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",key:"uqj9uw"}],["line",{x1:"22",x2:"16",y1:"9",y2:"15",key:"1ewh16"}],["line",{x1:"16",x2:"22",y1:"9",y2:"15",key:"5ykzw1"}]]),ie={rainbow:{name:"Rainbow",bg:"linear-gradient(135deg, #ef444422 0%, #f9731622 15%, #f59e0b22 30%, #10b98122 45%, #06b6d422 60%, #3b82f622 75%, #6366f122 85%, #a855f722 92%, #ec489922 100%)",bars:["#ef4444","#f97316","#f59e0b","#eab308","#84cc16","#22c55e","#10b981","#06b6d4","#0ea5e9","#3b82f6","#6366f1","#8b5cf6","#a855f7","#d946ef","#ec4899","#f43f5e"],peak:"#a0a0a0ff",button:"#ec4899",buttonHover:"#d946ef",slider:"#ec4899"},ocean:{name:"Ocean Blue",bg:"linear-gradient(135deg, #667eea43 0%, #764ba243 100%)",bars:["#0ea5e9","#38bdf8","#06b6d4","#22d3ee"],peak:"#0369a1",button:"#0ea5e9",buttonHover:"#0284c7",slider:"#0ea5e9"},sunset:{name:"Sunset",bg:"linear-gradient(135deg, #f093fb43 0%, #f5576c43 100%)",bars:["#f43f5e","#fb7185","#fda4af","#fecdd3"],peak:"#be123c",button:"#f43f5e",buttonHover:"#e11d48",slider:"#f43f5e"},forest:{name:"Forest Green",bg:"linear-gradient(135deg, #0ba36043 0%, #3cba9243 100%)",bars:["#10b981","#34d399","#6ee7b7","#a7f3d0"],peak:"#047857",button:"#10b981",buttonHover:"#059669",slider:"#10b981"},midnight:{name:"Midnight",bg:"linear-gradient(135deg, #2c3e5043 0%, #3498db43 100%)",bars:["#3b82f6","#60a5fa","#93c5fd","#bfdbfe"],peak:"#1e40af",button:"#3b82f6",buttonHover:"#2563eb",slider:"#3b82f6"},neon:{name:"Neon Cyan",bg:"linear-gradient(135deg, #13547a43 0%, #80d0c743 100%)",bars:["#06b6d4","#22d3ee","#67e8f9","#a5f3fc"],peak:"#0e7490",button:"#06b6d4",buttonHover:"#0891b2",slider:"#06b6d4"},purple:{name:"Royal Purple",bg:"linear-gradient(135deg, #2f1c5622 0%, #764ba243 100%)",bars:["#8b5cf6","#a78bfa","#baabf9ff","#ddd6fe"],peak:"#6d28d9",button:"#8b5cf6",buttonHover:"#7c3aed",slider:"#8b5cf6"},amber:{name:"Amber Gold",bg:"linear-gradient(135deg, #f59e0b43 0%, #d9770643 100%)",bars:["#f59e0b","#fbbf24","#fcd34d","#fde68a"],peak:"#b45309",button:"#f59e0b",buttonHover:"#d97706",slider:"#f59e0b"},rose:{name:"Rose Pink",bg:"linear-gradient(135deg, #ec489943 0%, #be185d43 100%)",bars:["#ec4899","#f472b6","#f9a8d4","#fbcfe8"],peak:"#9f1239",button:"#ec4899",buttonHover:"#db2777",slider:"#ec4899"}};function ur({theme:l,setTheme:d,close:u}){const f=Object.keys(ie).map(x=>({key:x,name:ie[x].name,colors:ie[x].bars}));return e.jsxs("div",{className:"ecp-theme-selector-panel",children:[e.jsxs("div",{className:"ecp-theme-selector-header",children:[e.jsx("h2",{className:"ecp-theme-selector-title",children:"Choose Color Palette"}),e.jsx("button",{onClick:()=>u(),className:"ecp-theme-selector-close",children:"Close"})]}),e.jsx("div",{className:"ecp-theme-grid",children:f.map(x=>e.jsxs("div",{className:`ecp-theme-card${l===x.key?" ecp-theme-card--active":""}`,onClick:()=>d(x.key),children:[e.jsx("div",{className:"ecp-theme-color-preview",style:{background:`linear-gradient(to right, ${x.colors.join(", ")})`}}),e.jsx("div",{className:"ecp-theme-name",children:x.name})]},x.key))})]})}const vr=(l,d)=>{const u=l.sampleRate,f=Math.max(1,Math.floor(u*Math.max(.1,d))),x=l.createBuffer(2,f,u),v=x.getChannelData(0),q=x.getChannelData(1),R=3/d;for(let C=0;C<f;C++){const z=C/u,V=Math.exp(-z*R);v[C]=(Math.random()*2-1)*V,q[C]=(Math.random()*2-1)*V}return x},fr=l=>{const d=Math.max(0,l),u=44100,f=new Float32Array(u),x=Math.PI/180;if(d===0)for(let v=0;v<u;++v)f[v]=v*2/u-1;else for(let v=0;v<u;++v){const q=v*2/u-1;f[v]=(3+d)*q*20*x/(Math.PI+d*Math.abs(q))}return f};function hr({audio:l,name:d="No track loaded",author:u,theme:f="rainbow",volume:x=100,thumbnail:v=null,controls:q={play:!0,pause:!0,stop:!0,seekbar:!0,volume:!0,loop:!0,trackName:!0,equalizer:!0,speed:!0,spatialEngine:!1},mode:R="light",bands:C=null,transparent:z=!1,autoPlay:V=!1,equalizer:X={bass:0,mid:0,treble:0},spatialEngine:c=null}){var Cr,Sr,Tr,Pr,Mr,Ar,Fr,zr,Lr,Er,Ir;const[W,E]=r.useState(!1),[_,Y]=r.useState(0),[H,A]=r.useState(0),[P,Me]=r.useState(x||100),[me,Ce]=r.useState(!1),[B,Ae]=r.useState(!1),[fe,ye]=r.useState(!1),[ke,U]=r.useState([]),[Q,Fe]=r.useState(!1),[Z,Se]=r.useState({bass:X.bass||0,mid:X.mid||0,treble:X.treble||0}),[te,je]=r.useState(1),[k,Te]=r.useState(0),[ee,Ne]=r.useState(!1),[o,le]=r.useState({enable:q.spatialEngine&&(c==null?void 0:c.enable)!==void 0?c.enable:!1,spatial:{rate:((Cr=c==null?void 0:c.spatial)==null?void 0:Cr.rate)!==void 0?c.spatial.rate:.2,width:((Sr=c==null?void 0:c.spatial)==null?void 0:Sr.width)!==void 0?c.spatial.width:150,focus:((Tr=c==null?void 0:c.spatial)==null?void 0:Tr.focus)!==void 0?c.spatial.focus:20},reverb:{size:((Pr=c==null?void 0:c.reverb)==null?void 0:Pr.size)!==void 0?c.reverb.size:3,tone:((Mr=c==null?void 0:c.reverb)==null?void 0:Mr.tone)!==void 0?c.reverb.tone:40,mix:((Ar=c==null?void 0:c.reverb)==null?void 0:Ar.mix)!==void 0?c.reverb.mix:30},echo:{time:((Fr=c==null?void 0:c.echo)==null?void 0:Fr.time)!==void 0?c.echo.time:50,feedback:((zr=c==null?void 0:c.echo)==null?void 0:zr.feedback)!==void 0?c.echo.feedback:30,mix:((Lr=c==null?void 0:c.echo)==null?void 0:Lr.mix)!==void 0?c.echo.mix:10},tape:{speed:typeof(c==null?void 0:c.tape)=="number"?c.tape:((Er=c==null?void 0:c.tape)==null?void 0:Er.speed)!==void 0?c.tape.speed:1,drive:typeof(c==null?void 0:c.tape)=="object"&&((Ir=c.tape)==null?void 0:Ir.drive)!==void 0?c.tape.drive:0}});r.useEffect(()=>{var t,n,m,b,g,O,re,G,K,L,ce;c&&le({enable:!!q.spatialEngine&&(c.enable!==void 0?c.enable:!0),spatial:{rate:((t=c.spatial)==null?void 0:t.rate)!==void 0?c.spatial.rate:.2,width:((n=c.spatial)==null?void 0:n.width)!==void 0?c.spatial.width:150,focus:((m=c.spatial)==null?void 0:m.focus)!==void 0?c.spatial.focus:20},reverb:{size:((b=c.reverb)==null?void 0:b.size)!==void 0?c.reverb.size:3,tone:((g=c.reverb)==null?void 0:g.tone)!==void 0?c.reverb.tone:40,mix:((O=c.reverb)==null?void 0:O.mix)!==void 0?c.reverb.mix:30},echo:{time:((re=c.echo)==null?void 0:re.time)!==void 0?c.echo.time:50,feedback:((G=c.echo)==null?void 0:G.feedback)!==void 0?c.echo.feedback:30,mix:((K=c.echo)==null?void 0:K.mix)!==void 0?c.echo.mix:10},tape:{speed:typeof c.tape=="number"?c.tape:((L=c.tape)==null?void 0:L.speed)!==void 0?c.tape.speed:1,drive:typeof c.tape=="object"&&((ce=c.tape)==null?void 0:ce.drive)!==void 0?c.tape.drive:0}})},[c]);const[de,qe]=r.useState("spatial"),S=r.useRef(o),D=r.useRef(te);r.useEffect(()=>{S.current=o},[o]),r.useEffect(()=>{D.current=te},[te]);const se=()=>{if(p.current){const t=S.current.enable,n=t?S.current.tape.speed:1,b=!(t&&n!==1);"preservesPitch"in p.current&&(p.current.preservesPitch=b),"webkitPreservesPitch"in p.current&&(p.current.webkitPreservesPitch=b),"mozPreservesPitch"in p.current&&(p.current.mozPreservesPitch=b),p.current.playbackRate=D.current*n}},s=(t,n,m)=>{le(b=>({...b,enable:!0,[t]:{...b[t],[n]:m}}))},N=()=>{le(t=>({...t,enable:!t.enable}))},M=()=>{le({enable:!0,spatial:{rate:.11,width:135,focus:65},reverb:{size:2.4,tone:62,mix:30},echo:{time:500,feedback:45,mix:5},tape:{speed:1,drive:0}})},p=r.useRef(null),$=r.useRef(null),J=r.useRef(null),T=r.useRef(null),pe=r.useRef(null),Pe=r.useRef(null),we=r.useRef(null),I=r.useRef(null),ue=r.useRef(null),Oe=r.useRef(null),We=r.useRef(null),Ue=r.useRef(null),De=r.useRef(null),_e=r.useRef(null),Ge=r.useRef(null),Ve=r.useRef(null),nr=r.useRef(null),Xe=r.useRef(0),ze=r.useRef(null),$e=r.useRef(null),ae=r.useRef(null),ve=r.useRef(null),Le=r.useRef(0),Ye=r.useRef(null),Re=r.useRef(null);r.useEffect(()=>{const t=Re.current;if(!t)return;const n=new ResizeObserver(m=>{for(let b of m)Te(b.contentRect.width)});return n.observe(t),()=>n.disconnect()},[]),r.useEffect(()=>{const t=[];if(l&&typeof l!="string"&&t.push(["TypeError","audio must be a string (URL or path)"]),d&&typeof d!="string"&&t.push(["TypeError","name must be a string"]),f&&typeof f!="string"&&typeof f!="object")t.push(["TypeError","theme must be a string or a valid theme object"]);else if(typeof f=="object"){const n=["name","bg","bars","peak","button","buttonHover","slider"];for(const m of n)m in f||t.push(["ThemeError",`theme object missing key: ${m}`])}(typeof x!="number"||x<0||x>100)&&t.push(["TypeError","volume must be a number between 0 and 100"]),typeof q!="object"||Array.isArray(q)?t.push(["TypeError","controls must be an object"]):["play","pause","stop","seekbar","volume","loop","trackName","equalizer"].forEach(m=>{q&&m in q&&typeof q[m]!="boolean"&&t.push(["TypeError",`controls.${m} must be a boolean`])}),C&&(Array.isArray(C)?C.length===0?t.push(["ValueError","bands array cannot be empty"]):C.forEach((n,m)=>{typeof n.freq!="number"&&t.push(["TypeError",`bands[${m}].freq must be a number`])}):t.push(["TypeError","bands must be an array"])),t.length>0?(U(t),console.group("%cVisualizePlayer: Prop validation failed","color:red"),t.forEach(n=>console.error(`${n[0]}: ${n[1]}`)),console.groupEnd()):U([])},[l,d,f,x,q,R,C]);const a=C||[{freq:0},{freq:10},{freq:20},{freq:25},{freq:31.5},{freq:40},{freq:50},{freq:63},{freq:80},{freq:100},{freq:125},{freq:160},{freq:200},{freq:250},{freq:315},{freq:400},{freq:500},{freq:630},{freq:800},{freq:1e3},{freq:1250},{freq:1600},{freq:2e3},{freq:2500},{freq:3150},{freq:4e3},{freq:5e3},{freq:6300},{freq:8e3},{freq:1e4},{freq:12500}],h=r.useRef(a.map(()=>0)),w=r.useRef(a.map(()=>0)),F=r.useRef(a.map(()=>0)),j=r.useRef(!1),ne=r.useRef(typeof f=="string"?f:"purple"),[Ee,Zr]=r.useState(0),lr=typeof f=="string"&&f==="rainbow"||typeof f=="object"&&(f==null?void 0:f.name)==="Rainbow";r.useEffect(()=>{if(!lr)return;const t=setInterval(()=>{Zr(n=>(n+1)%ie.rainbow.bars.length)},5e3);return()=>clearInterval(t)},[lr]);const gr=typeof f=="string"?ie[f]||ie.purple:typeof f=="object"?f:ie.purple,i=lr?{...gr,button:ie.rainbow.bars[Ee],buttonHover:ie.rainbow.bars[(Ee+1)%ie.rainbow.bars.length],slider:ie.rainbow.bars[Ee]}:gr,y=R==="dark",er=typeof q=="object"&&Object.keys(q).length===0;r.useEffect(()=>{typeof f=="string"?ne.current=f:ne.current="purple",He()},[f]),r.useEffect(()=>{p.current||(p.current=new Audio);const t=p.current,n=()=>{fe||Y(t.currentTime)},m=()=>A(t.duration),b=()=>{B||(E(!1),ae.current&&cancelAnimationFrame(ae.current))},g=()=>{E(!0),se()},O=()=>E(!1);return t.addEventListener("timeupdate",n),t.addEventListener("loadedmetadata",m),t.addEventListener("ended",b),t.addEventListener("play",g),t.addEventListener("pause",O),()=>{t.removeEventListener("timeupdate",n),t.removeEventListener("loadedmetadata",m),t.removeEventListener("ended",b),t.removeEventListener("play",g),t.removeEventListener("pause",O)}},[fe,B]),r.useEffect(()=>()=>{ve.current&&clearInterval(ve.current),p.current&&(p.current.pause(),p.current.src="",p.current.load()),$.current&&$.current.close().catch(t=>console.warn("AudioContext cleanup error:",t)),ae.current&&cancelAnimationFrame(ae.current)},[]),r.useEffect(()=>{if(l){const t=W,n=P,m=B;if(ae.current&&(cancelAnimationFrame(ae.current),ae.current=null),T.current){try{T.current.disconnect()}catch{}T.current=null}if(J.current){try{J.current.disconnect()}catch{}J.current=null}if(pe.current){try{pe.current.disconnect()}catch{}pe.current=null}if(Pe.current){try{Pe.current.disconnect()}catch{}Pe.current=null}if(we.current){try{we.current.disconnect()}catch{}we.current=null}$.current&&($.current.close().catch(L=>console.warn("AudioContext close error:",L)),$.current=null),p.current&&(p.current.pause(),p.current.src="",p.current.load()),p.current=new Audio;try{p.current.crossOrigin="anonymous"}catch{}p.current.src=l,p.current.preload="auto",p.current.muted=!1,p.current.volume=me?0:n/100,p.current.loop=m,p.current.load();const b=p.current,g=()=>{fe||Y(b.currentTime)},O=()=>A(b.duration),re=()=>{B||E(!1)},G=()=>{E(!0),se()},K=()=>E(!1);b.addEventListener("timeupdate",g),b.addEventListener("loadedmetadata",O),b.addEventListener("ended",re),b.addEventListener("play",G),b.addEventListener("pause",K),Y(0),E(!1),h.current=a.map(()=>0),w.current=a.map(()=>0),F.current=a.map(()=>0),He(),(t||V||er)&&p.current.play().catch(L=>console.error("Play failed:",L))}},[l]),r.useEffect(()=>{p.current&&(p.current.volume=me?0:P/100)},[P,me]),r.useEffect(()=>{p.current&&(p.current.loop=B)},[B]),r.useEffect(()=>{se()},[te,o.tape.speed,o.enable]),r.useEffect(()=>{$.current&&(pe.current&&(pe.current.gain.value=Z.bass),Pe.current&&(Pe.current.gain.value=Z.mid),we.current&&(we.current.gain.value=Z.treble))},[Z]),r.useEffect(()=>{if($.current){const t=o.enable;if(Ve.current&&(Ve.current.curve=fr(t?o.tape.drive:0)),We.current&&(We.current.frequency.value=o.reverb.tone/100*8e3+500),Ue.current&&(Ue.current.gain.value=t?o.reverb.mix/100:0),Oe.current&&$.current)try{Oe.current.buffer=vr($.current,o.reverb.size)}catch{}if(De.current&&(De.current.delayTime.value=Math.max(.01,o.echo.time/1e3)),_e.current&&(_e.current.gain.value=t?Math.min(.85,o.echo.feedback/100):0),Ge.current&&(Ge.current.gain.value=t?o.echo.mix/100:0),!t&&(ue.current&&(ue.current.pan.value=0),I.current&&$.current)){const n=$.current.currentTime;I.current.positionX?(I.current.positionX.setTargetAtTime(0,n,.01),I.current.positionY.setTargetAtTime(0,n,.01),I.current.positionZ.setTargetAtTime(-1.4,n,.01)):I.current.setPosition&&I.current.setPosition(0,0,-1.4)}}},[o]);const yr=()=>{if(!$.current||!j.current)return;const t=S.current;if(!t.enable)return;const n=performance.now(),m=Le.current?Math.min(.1,(n-Le.current)/1e3):.016;Le.current=n;const b=t.spatial.rate;Xe.current+=b*5*m;const g=Xe.current,re=2.3*(t.spatial.width/135),G=Math.sin(g)*re,K=-Math.cos(g)*re,L=Math.sin(g*2)*.4,ce=$.current.currentTime;if(I.current&&(I.current.positionX?(I.current.positionX.setTargetAtTime(G,ce,.04),I.current.positionY.setTargetAtTime(L,ce,.04),I.current.positionZ.setTargetAtTime(K,ce,.04)):I.current.setPosition&&I.current.setPosition(G,L,K)),ue.current){const he=Math.sin(g)*(t.spatial.width/180),ge=(t.spatial.focus-50)/100,Be=Math.max(-1,Math.min(1,he+ge));ue.current.pan.setTargetAtTime(Be,ce,.04)}};r.useEffect(()=>{j.current=W,ae.current&&(cancelAnimationFrame(ae.current),ae.current=null),ve.current&&(clearInterval(ve.current),ve.current=null),W?($.current||Kr(),Le.current=performance.now(),ve.current=window.setInterval(yr,30),Nr()):qr()},[W]);const Kr=()=>{if(!$.current&&p.current)try{const t=window.AudioContext||window.webkitAudioContext;if(t){const n=new t;$.current=n;const m=n.createBiquadFilter();m.type="lowshelf",m.frequency.value=320,m.gain.value=Z.bass;const b=n.createBiquadFilter();b.type="peaking",b.frequency.value=1e3,b.Q.value=.5,b.gain.value=Z.mid;const g=n.createBiquadFilter();g.type="highshelf",g.frequency.value=3200,g.gain.value=Z.treble;const O=n.createWaveShaper();O.curve=fr(S.current.enable?S.current.tape.drive:0),se();let re=null;try{const xe=n.createPanner();xe.panningModel="HRTF",xe.distanceModel="inverse",xe.refDistance=1.4,xe.rolloffFactor=.55,re=xe}catch{}let G=null;if(n.createStereoPanner){const xe=n.createStereoPanner();xe.pan.value=0,G=xe}const K=n.createGain();K.gain.value=1;const L=n.createConvolver();L.buffer=vr(n,S.current.reverb.size);const ce=n.createBiquadFilter();ce.type="lowpass",ce.frequency.value=S.current.reverb.tone/100*8e3+500;const he=n.createGain();he.gain.value=S.current.enable?S.current.reverb.mix/100:0;const ge=n.createDelay(2);ge.delayTime.value=S.current.echo.time/1e3;const Be=n.createGain();Be.gain.value=Math.min(.85,S.current.echo.feedback/100);const rr=n.createGain();rr.gain.value=S.current.enable?S.current.echo.mix/100:0,ge.connect(Be),Be.connect(ge);const Ie=n.createAnalyser();Ie.fftSize=8192,Ie.smoothingTimeConstant=.7;const Dr=n.createMediaElementSource(p.current);Dr.connect(m),m.connect(b),b.connect(g),g.connect(O);const tr=re,Ze=G,or=tr||Ze||O;tr?(O.connect(tr),Ze&&tr.connect(Ze)):Ze&&O.connect(Ze),or.connect(K),K.connect(Ie),or.connect(L),L.connect(ce),ce.connect(he),he.connect(Ie),or.connect(ge),ge.connect(rr),rr.connect(Ie),Ie.connect(n.destination),pe.current=m,Pe.current=b,we.current=g,Ve.current=O,I.current=re,ue.current=G,nr.current=K,Oe.current=L,We.current=ce,Ue.current=he,De.current=ge,_e.current=Be,Ge.current=rr,J.current=Ie,T.current=Dr}}catch(t){console.error("Failed to setup audio context:",t)}},kr=t=>{const n=$.current,m=J.current;if(!n||!m)return 0;const b=n.sampleRate/2,g=Math.round(t/b*m.frequencyBinCount);return Math.min(g,m.frequencyBinCount-1)},qr=()=>{if(j.current)return;h.current=h.current.map(b=>b*.7);const t=Date.now();w.current=w.current.map((b,g)=>t-F.current[g]>1500?b*.95:b),He();const n=Math.max(...h.current),m=Math.max(...w.current);n>.01||m>.01?ae.current=requestAnimationFrame(qr):(j.current||(h.current=a.map(()=>0),w.current=a.map(()=>0),F.current=a.map(()=>0),He()),ae.current&&cancelAnimationFrame(ae.current),ae.current=null)},Nr=()=>{if(!J.current||!j.current)return;const t=S.current;if(t.enable&&$.current){yr();const b=Xe.current,g=t.spatial.width/135;if(ze.current){const O=85*(g>0?1:0),re=55*(g>0?1:0),G=Math.sin(b)*O,K=-Math.cos(b)*re;ze.current.style.transform=`translate(${G}px, ${K}px)`,$e.current&&($e.current.setAttribute("x2",`${110+G}`),$e.current.setAttribute("y2",`${75+K}`))}}else if($.current){const b=$.current.currentTime;I.current&&(I.current.positionX?(I.current.positionX.setTargetAtTime(0,b,.04),I.current.positionY.setTargetAtTime(0,b,.04),I.current.positionZ.setTargetAtTime(-1.4,b,.04)):I.current.setPosition&&I.current.setPosition(0,0,-1.4)),ue.current&&ue.current.pan.setTargetAtTime(0,b,.04),ze.current&&(ze.current.style.transform="translate(0px, 0px)"),$e.current&&($e.current.setAttribute("x2","110"),$e.current.setAttribute("y2","20"))}const n=J.current.frequencyBinCount,m=new Uint8Array(n);J.current.getByteFrequencyData(m),a.forEach((b,g)=>{const O=kr(b.freq),re=g<a.length-1?kr(a[g+1].freq):m.length;let G=0,K=0;for(let he=O;he<re;he++)G+=m[he],K++;let L=K>0?G/K/255:0;L=Math.pow(L,.6),h.current[g]=h.current[g]*.8+L*.2;const ce=Date.now();h.current[g]>w.current[g]?(w.current[g]=h.current[g],F.current[g]=ce):ce-F.current[g]>1500&&(w.current[g]*=.95)}),He(),ae.current=requestAnimationFrame(Nr)},He=()=>{if(!Ye.current)return;const t=ie[ne.current]||ie.rainbow,n=Ye.current;if(n.children.length!==a.length){let g="";a.forEach(()=>{g+=`
|
|
78
78
|
<div class="ecp-vu-bar-wrap">
|
|
79
79
|
<div class="ecp-vu-bar-fill"></div>
|
|
80
80
|
<div class="ecp-vu-peak-line" style="display:none;"></div>
|
package/package.json
CHANGED