supersonic-scsynth 0.63.0 → 0.64.0
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/README.md +1 -1
- package/README.npm.md +1 -1
- package/dist/supersonic.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
package/README.npm.md
CHANGED
package/dist/supersonic.js
CHANGED
|
@@ -2,7 +2,7 @@ var C=class i{constructor(e){if(new.target===i)throw new Error("Transport is abs
|
|
|
2
2
|
`)&&(a=a.slice(0,-1)),this.#o++,this.#S+=n.length,this.#n&&this.#n({text:a,timestamp:performance.now(),sequence:n.sequence})}catch(o){console.error("[PostMessageTransport] Failed to decode debug message:",o)}}}}getPreschedulerMetrics(){return this.#a}getMetrics(){return{oscInMessagesReceived:this.#b,oscInBytesReceived:this.#g,oscInMessagesDropped:this.#y,debugMessagesReceived:this.#o,debugBytesReceived:this.#S}}get ready(){return this.#l&&!this._disposed}dispose(){this._disposed||(this.#e&&(this.#e.postMessage({type:"stop"}),this.#e.terminate(),this.#e=null),this.#i=null,this.#l=!1,super.dispose())}#w(e){return new Promise((t,s)=>{let r=setTimeout(()=>{s(new Error("Prescheduler worker initialization timeout"))},5e3),n=o=>{o.data.type==="initialized"&&(clearTimeout(r),this.#e.removeEventListener("message",n),t())};this.#e.addEventListener("message",n),this.#e.postMessage({type:"init",mode:"postMessage",maxPendingMessages:this.#f,snapshotIntervalMs:this.#m,bypassLookaheadS:this._config.bypassLookaheadS,workletPort:e},[e])})}#B(e){switch(e.type){case"oscReplies":if(e.messages&&e.count>0&&e.buffer){let t=new Uint8Array(e.buffer);for(let s=0;s<e.count;s++){let r=e.messages[s],n=t.subarray(r.offset,r.offset+r.length);if(r.sequence!==void 0&&this.#s>=0){let o=this.#s+1&4294967295;if(r.sequence!==o){let a=r.sequence-o+4294967296&4294967295;a<1e3&&(this.#y+=a)}}r.sequence!==void 0&&(this.#s=r.sequence),this.#b++,this.#g+=r.length,this.#p&&this.#p(n,r.sequence,A())}}break;case"metrics":break;case"bufferLoaded":break;case"debugRawBatch":this.handleDebugRaw(e);break;case"oscLog":if(this.#u&&e.count>0&&e.buffer&&e.entries){let t=new Uint8Array(e.buffer),s=[];for(let r=0;r<e.count;r++){let n=e.entries[r],o=t.subarray(n.offset,n.offset+n.length);s.push({oscData:o,sourceId:n.sourceId,sequence:n.sequence,timestamp:A(),truncated:n.length<n.originalLength,originalLength:n.originalLength})}this.#u(s)}break;case"error":console.error("[PostMessageTransport] Worklet error:",e.error),this.#y++,this.#r&&this.#r(e.error,"worklet");break;case"debug":break}}#M(e){switch(e.type){case"preschedulerMetrics":this.#a=e.metrics;break;case"error":console.error("[PostMessageTransport] Prescheduler error:",e.error),this.#y++,this.#r&&this.#r(e.error,"oscOut");break}}};function Ke(i,e){if(i==="sab")return new x(e);if(i==="postMessage")return new v(e);throw new Error(`Unknown transport mode: ${i}. Use 'sab' or 'postMessage'`)}var Pt={5120:"i8",5121:"u8",5122:"i16",5123:"u16",5124:"i32",5125:"u32",5126:"f32"};var je={u8:1,u8c:1,i8:1,u16:2,i16:2,u32:4,i32:4,i64:8,u64:8,f32:4,f64:8};var Ft={f32:Float32Array,f64:Float64Array},Nt={i8:Int8Array,i16:Int16Array,i32:Int32Array},xt={u8:Uint8Array,u8c:Uint8ClampedArray,u16:Uint16Array,u32:Uint32Array},vt={i64:BigInt64Array,u64:BigUint64Array},Ht={...Ft,...Nt,...xt},zt=i=>{let e=Pt[i];return e!==void 0?e:i};function Qe(i,...e){let t=vt[i];return new(t||Ht[zt(i)])(...e)}var H=(i,e)=>(e--,i+e&~e);var Je=i=>typeof i=="number";var q=(i,e=t=>t!==void 0?": "+t:"")=>class extends Error{origMessage;constructor(t){super(i(t)+e(t)),this.origMessage=t!==void 0?String(t):""}};var $t=q(()=>"Assertion failed"),de=(typeof process<"u"&&process.env!==void 0?process.env.UMBRELLA_ASSERTS:!import.meta.env||import.meta.env.MODE!=="production"||import.meta.env.UMBRELLA_ASSERTS||import.meta.env.VITE_UMBRELLA_ASSERTS)?(i,e)=>{if(typeof i=="function"&&!i()||!i)throw new $t(typeof e=="function"?e():e)}:()=>{};var Yt=q(()=>"illegal argument(s)"),et=i=>{throw new Yt(i)};var tt=0,st=1,rt=2,it=3,nt=4,F=5,ot=6,pe=1,me=2,at=7*4,ye=0,Se=1,w=2*4,$=class{buf;start;u8;u32;state;constructor(e={}){if(this.buf=e.buf?e.buf:new ArrayBuffer(e.size||4096),this.start=e.start!=null?H(Math.max(e.start,0),4):0,this.u8=new Uint8Array(this.buf),this.u32=new Uint32Array(this.buf),this.state=new Uint32Array(this.buf,this.start,at/4),!e.skipInitialization){let t=e.align||8;de(t>=8,`invalid alignment: ${t}, must be a pow2 and >= 8`);let s=this.initialTop(t),r=e.end!=null?Math.min(e.end,this.buf.byteLength):this.buf.byteLength;s>=r&&et(`insufficient address range (0x${this.start.toString(16)} - 0x${r.toString(16)})`),this.align=t,this.doCompact=e.compact!==!1,this.doSplit=e.split!==!1,this.minSplit=e.minSplit||16,this.end=r,this.top=s,this._free=0,this._used=0}}stats(){let e=s=>{let r=0,n=0;for(;s;)r++,n+=this.blockSize(s),s=this.blockNext(s);return{count:r,size:n}},t=e(this._free);return{free:t,used:e(this._used),top:this.top,available:this.end-this.top+t.size,total:this.buf.byteLength}}callocAs(e,t,s=0){let r=this.mallocAs(e,t);return r?.fill(s),r}mallocAs(e,t){let s=this.malloc(t*je[e]);return s?Qe(e,this.buf,s,t):void 0}calloc(e,t=0){let s=this.malloc(e);return s&&this.u8.fill(t,s,s+e),s}malloc(e){if(e<=0)return 0;let t=H(e+w,this.align),s=this.end,r=this.top,n=this._free,o=0;for(;n;){let a=this.blockSize(n),c=n+a>=r;if(c||a>=t)return this.mallocTop(n,o,a,t,c);o=n,n=this.blockNext(n)}return n=r,r=n+t,r<=s?(this.initBlock(n,t,this._used),this._used=n,this.top=r,z(n)):0}mallocTop(e,t,s,r,n){if(n&&e+r>this.end)return 0;if(t?this.unlinkBlock(t,e):this._free=this.blockNext(e),this.setBlockNext(e,this._used),this._used=e,n)this.top=e+this.setBlockSize(e,r);else if(this.doSplit){let o=s-r;o>=this.minSplit&&this.splitBlock(e,r,o)}return z(e)}realloc(e,t){if(t<=0)return 0;let s=Ee(e),r=0,n=this._used,o=0;for(;n;){if(n===s){[r,o]=this.reallocBlock(n,t);break}n=this.blockNext(n)}return r&&r!==s&&this.u8.copyWithin(z(r),z(s),o),z(r)}reallocBlock(e,t){let s=this.blockSize(e),r=e+s,n=r>=this.top,o=H(t+w,this.align);if(o<=s){if(this.doSplit){let a=s-o;a>=this.minSplit?this.splitBlock(e,o,a):n&&(this.top=e+o)}else n&&(this.top=e+o);return[e,r]}return n&&e+o<this.end?(this.top=e+this.setBlockSize(e,o),[e,r]):(this.free(e),[Ee(this.malloc(t)),r])}reallocArray(e,t){if(e.buffer!==this.buf)return;let s=this.realloc(e.byteOffset,t*e.BYTES_PER_ELEMENT);return s?new e.constructor(this.buf,s,t):void 0}free(e){let t;if(Je(e))t=e;else{if(e.buffer!==this.buf)return!1;t=e.byteOffset}t=Ee(t);let s=this._used,r=0;for(;s;){if(s===t)return r?this.unlinkBlock(r,s):this._used=this.blockNext(s),this.insert(s),this.doCompact&&this.compact(),!0;r=s,s=this.blockNext(s)}return!1}freeAll(){this._free=0,this._used=0,this.top=this.initialTop()}release(){return delete this.u8,delete this.u32,delete this.state,delete this.buf,!0}get align(){return this.state[nt]}set align(e){this.state[nt]=e}get end(){return this.state[it]}set end(e){this.state[it]=e}get top(){return this.state[rt]}set top(e){this.state[rt]=e}get _free(){return this.state[tt]}set _free(e){this.state[tt]=e}get _used(){return this.state[st]}set _used(e){this.state[st]=e}get doCompact(){return!!(this.state[F]&pe)}set doCompact(e){e?this.state[F]|=1<<pe-1:this.state[F]&=~pe}get doSplit(){return!!(this.state[F]&me)}set doSplit(e){e?this.state[F]|=1<<me-1:this.state[F]&=~me}get minSplit(){return this.state[ot]}set minSplit(e){de(e>w,`illegal min split threshold: ${e}, require at least ${w+1}`),this.state[ot]=e}blockSize(e){return this.u32[(e>>2)+ye]}setBlockSize(e,t){return this.u32[(e>>2)+ye]=t,t}blockNext(e){return this.u32[(e>>2)+Se]}setBlockNext(e,t){this.u32[(e>>2)+Se]=t}initBlock(e,t,s){let r=e>>>2;return this.u32[r+ye]=t,this.u32[r+Se]=s,e}unlinkBlock(e,t){this.setBlockNext(e,this.blockNext(t))}splitBlock(e,t,s){this.insert(this.initBlock(e+this.setBlockSize(e,t),s,0)),this.doCompact&&this.compact()}initialTop(e=this.align){return H(this.start+at+w,e)-w}compact(){let e=this._free,t=0,s=0,r,n=!1;for(;e;){for(r=e,s=this.blockNext(e);s&&r+this.blockSize(r)===s;)r=s,s=this.blockNext(s);if(r!==e){let o=r-e+this.blockSize(r);this.setBlockSize(e,o);let a=this.blockNext(r),c=this.blockNext(e);for(;c&&c!==a;){let u=this.blockNext(c);this.setBlockNext(c,0),c=u}this.setBlockNext(e,a),n=!0}e+this.blockSize(e)>=this.top&&(this.top=e,t?this.unlinkBlock(t,e):this._free=this.blockNext(e)),t=e,e=this.blockNext(e)}return n}insert(e){let t=this._free,s=0;for(;t&&!(e<=t);)s=t,t=this.blockNext(t);s?this.setBlockNext(s,e):this._free=e,this.setBlockNext(e,t)}},z=i=>i>0?i+w:0,Ee=i=>i>0?i-w:0;function ct(i){if(i.byteLength<12)return!1;let e=new Uint8Array(i,0,12),t=String.fromCharCode(e[0],e[1],e[2],e[3]),s=String.fromCharCode(e[8],e[9],e[10],e[11]);return t==="FORM"&&(s==="AIFF"||s==="AIFC")}function Gt(i){let e=i[0]>>7&1,t=(i[0]&127)<<8|i[1],s=0;for(let n=2;n<10;n++)s=s*256+i[n];if(t===0)return 0;let r=s*Math.pow(2,t-16383-63);return e?-r:r}function ge(i,e){let t=12;for(;t<i.byteLength-8;){let s=String.fromCharCode(i.getUint8(t),i.getUint8(t+1),i.getUint8(t+2),i.getUint8(t+3)),r=i.getUint32(t+4,!1);if(s===e)return{offset:t+8,size:r};t+=8+r+r%2}return null}function lt(i){let e=new DataView(i),t=String.fromCharCode(e.getUint8(8),e.getUint8(9),e.getUint8(10),e.getUint8(11)),s=ge(e,"COMM");if(!s)throw new Error("AIFF file missing COMM chunk");let r=e.getUint16(s.offset,!1),n=e.getUint32(s.offset+2,!1),o=e.getUint16(s.offset+6,!1),a=new Uint8Array(i,s.offset+8,10),c=Gt(a);if(t==="AIFC"&&s.size>=22){let d=String.fromCharCode(e.getUint8(s.offset+18),e.getUint8(s.offset+19),e.getUint8(s.offset+20),e.getUint8(s.offset+21));if(d!=="NONE"&&d!=="sowt")throw new Error(`AIFC compression type '${d}' is not supported. Only uncompressed AIFF/AIFC files are supported.`);if(d==="sowt")return Wt(i,r,n,o,c)}let u=ge(e,"SSND");if(!u)throw new Error("AIFF file missing SSND chunk");let l=e.getUint32(u.offset,!1),f=u.offset+8+l,h=o/8,E=n*r*h;if(f+E>i.byteLength)throw new Error("AIFF file truncated: not enough audio data");let p=44,g=new ArrayBuffer(p+E),m=new DataView(g),S=new Uint8Array(g);ut(m,{numChannels:r,sampleRate:Math.round(c),bitsPerSample:o,dataSize:E});let _=new Uint8Array(i,f,E);if(h===1)for(let d=0;d<E;d++)S[p+d]=_[d]+128;else if(h===2)for(let d=0;d<E;d+=2)S[p+d]=_[d+1],S[p+d+1]=_[d];else if(h===3)for(let d=0;d<E;d+=3)S[p+d]=_[d+2],S[p+d+1]=_[d+1],S[p+d+2]=_[d];else if(h===4)for(let d=0;d<E;d+=4)S[p+d]=_[d+3],S[p+d+1]=_[d+2],S[p+d+2]=_[d+1],S[p+d+3]=_[d];else throw new Error(`Unsupported bit depth: ${o}`);return g}function Wt(i,e,t,s,r){let n=new DataView(i),o=ge(n,"SSND");if(!o)throw new Error("AIFF file missing SSND chunk");let a=n.getUint32(o.offset,!1),c=o.offset+8+a,u=s/8,l=t*e*u;if(c+l>i.byteLength)throw new Error("AIFF file truncated: not enough audio data");let f=44,h=new ArrayBuffer(f+l),E=new DataView(h),p=new Uint8Array(h);ut(E,{numChannels:e,sampleRate:Math.round(r),bitsPerSample:s,dataSize:l});let g=new Uint8Array(i,c,l);if(u===1)for(let m=0;m<l;m++)p[f+m]=g[m]+128;else p.set(g,f);return h}function ut(i,{numChannels:e,sampleRate:t,bitsPerSample:s,dataSize:r}){let n=t*e*(s/8),o=e*(s/8);i.setUint8(0,82),i.setUint8(1,73),i.setUint8(2,70),i.setUint8(3,70),i.setUint32(4,36+r,!0),i.setUint8(8,87),i.setUint8(9,65),i.setUint8(10,86),i.setUint8(11,69),i.setUint8(12,102),i.setUint8(13,109),i.setUint8(14,116),i.setUint8(15,32),i.setUint32(16,16,!0),i.setUint16(20,1,!0),i.setUint16(22,e,!0),i.setUint32(24,t,!0),i.setUint32(28,n,!0),i.setUint16(32,o,!0),i.setUint16(34,s,!0),i.setUint8(36,100),i.setUint8(37,97),i.setUint8(38,116),i.setUint8(39,97),i.setUint32(40,r,!0)}var ft=8,Z=class{#i;#e;#t;#p;#n;#r;#u;#c;#a;#l;#f;#m;constructor(e){let{mode:t="sab",audioContext:s,sharedBuffer:r,bufferPoolConfig:n,sampleBaseURL:o,maxBuffers:a=1024,assetLoader:c=null,workletPort:u=null}=e;if(this.#i=t,!s)throw new Error("BufferManager requires audioContext");if(t==="sab"){if(!r||!(r instanceof SharedArrayBuffer))throw new Error("BufferManager requires sharedBuffer (SharedArrayBuffer) in SAB mode");if(!n||typeof n!="object")throw new Error("BufferManager requires bufferPoolConfig (object with start, size, align)");if(!Number.isFinite(n.start)||n.start<0)throw new Error("bufferPoolConfig.start must be a non-negative number");if(!Number.isFinite(n.size)||n.size<=0)throw new Error("bufferPoolConfig.size must be a positive number")}if(t==="postMessage"&&(!n||typeof n!="object"))throw new Error("BufferManager requires bufferPoolConfig in postMessage mode");if(!Number.isInteger(a)||a<=0)throw new Error("maxBuffers must be a positive integer");if(this.#p=s,this.#n=r,this.#e=o,this.#t=c,this.#m=u,t==="sab")this.#r=new $({buf:r,start:n.start,size:n.size,align:ft}),this.#u=n.size,this.#c=n.start;else{let h=new ArrayBuffer(n.start+n.size);this.#r=new $({buf:h,start:n.start,size:n.size,align:ft}),this.#u=n.size,this.#c=n.start}this.#a=new Map,this.#l=new Map,this.#f=new Map,this.GUARD_BEFORE=3,this.GUARD_AFTER=1,this.MAX_BUFFERS=a;let l=(n.size/(1024*1024)).toFixed(0),f=(n.start/(1024*1024)).toFixed(0)}async#_(e){let t=e.byteOffset===0&&e.byteLength===e.buffer.byteLength?e.buffer:e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength),s=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(s)).map(r=>r.toString(16).padStart(2,"0")).join("")}async#h({source:e,startFrame:t=0,numFrames:s=0,channels:r=null}){let n,o;if(typeof e=="string"){let m=this.#g(e),S=e.split("/").pop();n=await this.#t.fetch(m,{type:"sample",name:S}),o={type:"file",path:e,startFrame:t,numFrames:s,channels:r}}else n=e instanceof ArrayBuffer?e:e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength),o=null;let a=await this.#b(n),c=Math.max(0,Math.floor(t||0)),u=a.length-c,l=s&&s>0?Math.min(Math.floor(s),u):u;if(l<=0)throw new Error("No audio frames available");let f=this.#S(r,a.numberOfChannels),h=f.length,E=l*h+(this.GUARD_BEFORE+this.GUARD_AFTER)*h,p=new Float32Array(E),g=this.GUARD_BEFORE*h;for(let m=0;m<l;m++)for(let S=0;S<h;S++){let _=a.getChannelData(f[S]);p[g+m*h+S]=_[c+m]}return{interleaved:p,numFrames:l,numChannels:h,sampleRate:a.sampleRate,sourceInfo:o}}async#y(e){let t=this.#E(e.length);return await this.#A(t,e),t}async#d(e,t,s,r){let n,o=await this.#o(e,t,async()=>{let[c,u]=await Promise.all([this.#_(s.interleaved),this.#y(s.interleaved)]);return n=c,{ptr:u,sizeBytes:s.interleaved.length*4,numFrames:s.numFrames,numChannels:s.numChannels,sampleRate:s.sampleRate,source:r||null}}),a=this.#a.get(e);return a&&(a.hash=n),{...o,hash:n}}async#b(e){return ct(e)&&(e=lt(e)),this.#p.decodeAudioData(e)}setWorkletPort(e){if(this.#i==="postMessage"){if(!e)throw new Error("BufferManager.setWorkletPort() requires a valid port");this.#m=e}}#g(e){if(typeof e!="string"||e.length===0)throw new Error("Invalid audio path: must be a non-empty string");if(e.includes(".."))throw new Error(`Invalid audio path: path cannot contain '..' (got: ${e})`);if(e.includes("%2e")||e.includes("%2E"))throw new Error(`Invalid audio path: path cannot contain URL-encoded characters (got: ${e})`);if(e.includes("\\"))throw new Error(`Invalid audio path: use forward slashes only (got: ${e})`);if(e.includes("://")||e.startsWith("/")||e.startsWith("./"))return e;if(!this.#e)throw new Error(`sampleBaseURL not configured. Please set it in SuperSonic constructor options.
|
|
3
3
|
Example: new SuperSonic({ sampleBaseURL: "./dist/samples/" })
|
|
4
4
|
Or use CDN: new SuperSonic({ sampleBaseURL: "https://unpkg.com/supersonic-scsynth-samples@latest/samples/" })
|
|
5
|
-
Or install: npm install supersonic-scsynth-samples`);return this.#e+e}#s(e){if(!Number.isInteger(e)||e<0||e>=this.MAX_BUFFERS)throw new Error(`Invalid buffer number ${e} (must be 0-${this.MAX_BUFFERS-1})`)}async#o(e,t,s){let r=null,n=null,o=!1,a=await this.#M(e),c=!1;try{await this.#I(e);let{ptr:u,sizeBytes:l,numFrames:f,numChannels:h,sampleRate:E,source:p,...g}=await s();r=u;let{uuid:m,allocationComplete:S}=this.#B(e,t);n=m,this.#R(e,r,l,m,S,{numFrames:f,numChannels:h,sampleRate:E,source:p}),o=!0;let _=this.#O(e,m,S);return a(),c=!0,{ptr:r,uuid:m,allocationComplete:_,numFrames:f,numChannels:h,sampleRate:E,...g}}catch(u){throw o&&n?this.#C(e,n,!1):r&&this.#r.free(r),u}finally{c||a()}}async prepareFromBlob(e){let{bufnum:t,blob:s,startFrame:r=0,numFrames:n=0,channels:o=null}=e;if(this.#s(t),!s||!(s instanceof ArrayBuffer||ArrayBuffer.isView(s)))throw new Error("/b_allocFile requires audio data as ArrayBuffer or typed array");let a=await this.#h({source:s,startFrame:r,numFrames:n,channels:o});return this.#d(t,3e4,a,null)}async prepareFromFile(e){let{bufnum:t,path:s,startFrame:r=0,numFrames:n=0,channels:o=null}=e;this.#s(t);let a=await this.#h({source:s,startFrame:r,numFrames:n,channels:o});return this.#d(t,6e4,a,a.sourceInfo)}async prepareEmpty(e){let{bufnum:t,numFrames:s,numChannels:r=1,sampleRate:n=null}=e;if(this.#s(t),!Number.isFinite(s)||s<=0)throw new Error(`/b_alloc requires a positive number of frames (got ${s})`);if(!Number.isFinite(r)||r<=0)throw new Error(`/b_alloc requires a positive channel count (got ${r})`);let o=Math.floor(s),a=Math.floor(r),c=o*a+(this.GUARD_BEFORE+this.GUARD_AFTER)*a,l={interleaved:new Float32Array(c),numFrames:o,numChannels:a,sampleRate:n||this.#p.sampleRate};return this.#d(t,5e3,l,null)}#S(e,t){return!e||e.length===0?Array.from({length:t},(s,r)=>r):(e.forEach(s=>{if(!Number.isInteger(s)||s<0||s>=t)throw new Error(`Channel ${s} is out of range (file has ${t} channels)`)}),e)}#E(e){let t=e*4,s=this.#r.malloc(t);if(s===0){let r=this.#r.stats(),n=((r.available||0)/(1024*1024)).toFixed(2),o=((r.total||0)/(1024*1024)).toFixed(2),a=(t/(1024*1024)).toFixed(2);throw new Error(`Buffer pool allocation failed: requested ${a}MB, available ${n}MB of ${o}MB total`)}return s}async#A(e,t){if(this.#i==="sab")new Float32Array(this.#n,e,t.length).set(t);else{let s=crypto.randomUUID(),r=new Promise((o,a)=>{let c=setTimeout(()=>{a(new Error("Buffer copy to WASM memory timed out"))},1e4),u=l=>{let f=l.data;f.type==="bufferCopied"&&f.copyId===s&&(this.#m.removeEventListener("message",u),clearTimeout(c),f.success?o():a(new Error(f.error||"Buffer copy failed")))};this.#m.addEventListener("message",u)}),n=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength);this.#m.postMessage({type:"copyBufferData",copyId:s,ptr:e,data:n},[n]),await r}}#w(e,t,s){return new Promise((r,n)=>{let o=setTimeout(()=>{this.#l.delete(e),n(new Error(`Buffer ${t} allocation timeout (${s}ms)`))},s);this.#l.set(e,{resolve:r,reject:n,timeout:o})})}#B(e,t){let s=crypto.randomUUID(),r=this.#w(s,e,t);return{uuid:s,allocationComplete:r}}async#M(e){let t=this.#f.get(e)||Promise.resolve(),s,r=new Promise(n=>{s=n});return this.#f.set(e,t.then(()=>r)),await t,()=>{s&&(s(),s=null),this.#f.get(e)===r&&this.#f.delete(e)}}#R(e,t,s,r,n,o={}){let a=this.#a.get(e),c={ptr:t,size:s,numFrames:o.numFrames||0,numChannels:o.numChannels||1,sampleRate:o.sampleRate||48e3,pendingToken:r,pendingPromise:n,previousAllocation:a?{ptr:a.ptr,size:a.size}:null,source:o.source||null};return this.#a.set(e,c),c}async#I(e){let t=this.#a.get(e);if(t&&t.pendingToken&&t.pendingPromise)try{await t.pendingPromise}catch{}}#O(e,t,s){return!s||typeof s.then!="function"?(this.#C(e,t,!0),Promise.resolve()):s.then(r=>(this.#C(e,t,!0),r)).catch(r=>{throw this.#C(e,t,!1),r})}#C(e,t,s){let r=this.#a.get(e);if(!r||r.pendingToken!==t)return;let n=r.previousAllocation;if(s){r.pendingToken=null,r.pendingPromise=null,r.previousAllocation=null,n?.ptr&&this.#r.free(n.ptr);return}r.ptr&&this.#r.free(r.ptr),r.pendingPromise=null,n?.ptr?this.#a.set(e,{ptr:n.ptr,size:n.size,pendingToken:null,previousAllocation:null}):this.#a.delete(e)}handleBufferFreed(e){let t=e[0],s=e[1],r=this.#a.get(t);if(!r){typeof s=="number"&&s!==0&&this.#r.free(s);return}if(typeof s=="number"&&s===r.ptr){this.#r.free(r.ptr),this.#a.delete(t);return}if(typeof s=="number"&&r.previousAllocation&&r.previousAllocation.ptr===s){this.#r.free(s),r.previousAllocation=null;return}this.#r.free(r.ptr),this.#a.delete(t)}handleBufferAllocated(e){let t=e[0],s=e[1],r=this.#l.get(t);r&&(clearTimeout(r.timeout),r.resolve({bufnum:s}),this.#l.delete(t))}allocate(e){let t=e*4,s=this.#r.malloc(t);if(s===0){let r=this.#r.stats(),n=((r.available||0)/(1024*1024)).toFixed(2),o=((r.total||0)/(1024*1024)).toFixed(2),a=(t/(1024*1024)).toFixed(2);console.error(`[BufferManager] Allocation failed: requested ${a}MB, available ${n}MB of ${o}MB total`)}return s}free(e){return this.#r.free(e)}getView(e,t){return new Float32Array(this.#n,e,t)}getStats(){return this.#r?this.#r.stats():{total:0,available:0,used:0,allocations:0}}async sampleInfo({source:e,startFrame:t=0,numFrames:s=0,channels:r=null}){let n=await this.#h({source:e,startFrame:t,numFrames:s,channels:r});return{hash:await this.#_(n.interleaved),source:n.sourceInfo?.path||null,numFrames:n.numFrames,numChannels:n.numChannels,sampleRate:n.sampleRate,duration:n.sampleRate>0?n.numFrames/n.sampleRate:0}}getAllocatedBuffers(){let e=[];for(let[t,s]of this.#a.entries())!s||!s.ptr||e.push({bufnum:t,ptr:s.ptr,numFrames:s.numFrames,numChannels:s.numChannels,sampleRate:s.sampleRate,source:s.source||null,hash:s.hash||null});return e}updateAudioContext(e){if(!e)throw new Error("BufferManager.updateAudioContext requires audioContext");this.#p=e}getDiagnostics(){let e=this.#r.stats(),t=0,s=0;for(let r of this.#a.values())r&&(t+=r.size||0,r.pendingToken&&s++);return{active:this.#a.size,pending:s,bytesActive:t,pool:{total:this.#u,available:e.available||0,freeBytes:e.free?.size||0,freeBlocks:e.free?.count||0,usedBytes:e.used?.size||0,usedBlocks:e.used?.count||0}}}destroy(){for(let[e,t]of this.#l.entries())clearTimeout(t.timeout),t.reject(new Error("BufferManager destroyed"));this.#l.clear();for(let[e,t]of this.#a.entries())t.ptr&&this.#r.free(t.ptr);this.#a.clear(),this.#f.clear()}};var X=class{#i;#e;#t;#p;constructor(e={}){let{onLoadingEvent:t=null,maxRetries:s=3,baseDelay:r=1e3,skipHeadRequests:n=!1}=e;this.#i=t,this.#e=s,this.#t=r,this.#p=n}async fetch(e,{type:t,name:s}){let r=this.#r(e);if(this.#p)this.#i?.("loading:start",{type:t,name:s});else{let a=await this.#n(e);this.#i?.("loading:start",{type:t,name:s,...a!=null&&{size:a}})}let o=await(await r).arrayBuffer();return this.#i?.("loading:complete",{type:t,name:s,size:o.byteLength}),o}async#n(e){try{let t=await fetch(e,{method:"HEAD"});if(t.ok){let s=t.headers.get("Content-Length");return s?parseInt(s,10):null}return null}catch{return null}}async#r(e){let t;for(let s=0;s<=this.#e;s++)try{let r=await fetch(e);if(r.status>=400&&r.status<500)throw new Error(`Failed to fetch ${e}: ${r.status} ${r.statusText}`);if(!r.ok)throw new Error(`Server error fetching ${e}: ${r.status} ${r.statusText}`);return r}catch(r){if(t=r,r.message.includes("Failed to fetch")&&r.message.includes("4"))throw r;if(s<this.#e){let n=this.#t*Math.pow(2,s);await this.#u(n)}}throw t}#u(e){return new Promise(t=>setTimeout(t,e))}};var K=class{#i;#e;constructor({bufferManager:e,getDefaultSampleRate:t}){if(!e)throw new Error("OSCRewriter requires bufferManager");if(typeof t!="function")throw new Error("OSCRewriter requires getDefaultSampleRate callback");this.#i=e,this.#e=t}async rewritePacket(e){if(Array.isArray(e)){let{message:t,changed:s}=await this.#t(e);return{packet:t,changed:s}}if(this.#a(e)){let t=await Promise.all(e.packets.map(n=>this.rewritePacket(n)));if(!t.some(n=>n.changed))return{packet:e,changed:!1};let r=t.map(n=>n.packet);return{packet:{timeTag:e.timeTag,packets:r},changed:!0}}return{packet:e,changed:!1}}async#t(e){let t=e[0],s=e.slice(1);switch(t){case"/b_alloc":return{message:await this.#p(s),changed:!0};case"/b_allocRead":return{message:await this.#n(s),changed:!0};case"/b_allocReadChannel":return{message:await this.#r(s),changed:!0};case"/b_allocFile":return{message:await this.#u(s),changed:!0};default:return{message:e,changed:!1}}}async#p(e){let t=this.#m(e,0,"/b_alloc requires a buffer number"),s=this.#m(e,1,"/b_alloc requires a frame count"),r=2,n=1,o=this.#e();this.#d(this.#l(e,r))&&(n=Math.max(1,this.#_(e,r,1)),r++),this.#l(e,r)?.type==="b"&&r++,this.#d(this.#l(e,r))&&(o=this.#f(this.#l(e,r)));let a=await this.#i.prepareEmpty({bufnum:t,numFrames:s,numChannels:n,sampleRate:o});return this.#b(a.allocationComplete,`/b_alloc ${t}`),this.#c(t,a)}async#n(e){let t=this.#m(e,0,"/b_allocRead requires a buffer number"),s=this.#h(e,1,"/b_allocRead requires a file path"),r=this.#_(e,2,0),n=this.#_(e,3,0),o=await this.#i.prepareFromFile({bufnum:t,path:s,startFrame:r,numFrames:n});return this.#b(o.allocationComplete,`/b_allocRead ${t}`),this.#c(t,o)}async#r(e){let t=this.#m(e,0,"/b_allocReadChannel requires a buffer number"),s=this.#h(e,1,"/b_allocReadChannel requires a file path"),r=this.#_(e,2,0),n=this.#_(e,3,0),o=[];for(let c=4;c<(e?.length||0)&&this.#d(e[c]);c++)o.push(Math.floor(this.#f(e[c])));let a=await this.#i.prepareFromFile({bufnum:t,path:s,startFrame:r,numFrames:n,channels:o.length>0?o:null});return this.#b(a.allocationComplete,`/b_allocReadChannel ${t}`),this.#c(t,a)}async#u(e){let t=this.#m(e,0,"/b_allocFile requires a buffer number"),s=this.#y(e,1,"/b_allocFile requires audio file data as blob"),r=await this.#i.prepareFromBlob({bufnum:t,blob:s});return this.#b(r.allocationComplete,`/b_allocFile ${t}`),this.#c(t,r)}#c(e,t){return["/b_allocPtr",Math.floor(e),Math.floor(t.ptr),Math.floor(t.numFrames),Math.floor(t.numChannels),t.sampleRate,String(t.uuid)]}#a(e){return e&&e.timeTag!==void 0&&Array.isArray(e.packets)}#l(e,t){if(Array.isArray(e))return e[t]}#f(e){if(e!=null)return typeof e=="object"&&Object.prototype.hasOwnProperty.call(e,"value")?e.value:e}#m(e,t,s){let r=this.#f(this.#l(e,t));if(!Number.isFinite(r))throw new Error(s);return Math.floor(r)}#_(e,t,s=0){let r=this.#f(this.#l(e,t));return Number.isFinite(r)?Math.floor(r):s}#h(e,t,s){let r=this.#f(this.#l(e,t));if(typeof r!="string")throw new Error(s);return r}#y(e,t,s){let r=this.#f(this.#l(e,t));if(!(r instanceof Uint8Array||r instanceof ArrayBuffer))throw new Error(s);return r}#d(e){if(!e)return!1;let t=this.#f(e);return Number.isFinite(t)}#b(e,t){!e||typeof e.catch!="function"||e.catch(s=>{console.error(`[OSCRewriter] ${t} allocation failed:`,s)})}};function N(i){if(!i)return null;if(typeof i=="string")return(i.split("/").filter(Boolean).pop()||i).replace(/\.scsyndef$/i,"");let e=i instanceof ArrayBuffer?new Uint8Array(i):i;if(!(e instanceof Uint8Array)||e.length<11||e[0]!==83||e[1]!==67||e[2]!==103||e[3]!==102)return null;let s=(e[4]<<24|e[5]<<16|e[6]<<8|e[7])>=3?14:10;if(s>=e.length)return null;let r=e[s];if(r===0||s+1+r>e.length)return null;try{return new TextDecoder().decode(e.slice(s+1,s+1+r))}catch{return null}}var j=class{#i=new Map;on(e,t){if(typeof t!="function")throw new Error("Callback must be a function");return this.#i.has(e)||this.#i.set(e,new Set),this.#i.get(e).add(t),()=>this.off(e,t)}off(e,t){let s=this.#i.get(e);return s&&s.delete(t),this}once(e,t){let s=(...r)=>{this.off(e,s),t(...r)};return this.on(e,s)}removeAllListeners(e){return e===void 0?this.#i.clear():this.#i.delete(e),this}hasListeners(e){let t=this.#i.get(e);return t?t.size>0:!1}emit(e,...t){let s=this.#i.get(e);if(s)for(let r of s)try{r(...t)}catch(n){console.error(`[EventEmitter] Error in ${e} listener:`,n)}}async emitAsync(e,...t){let s=this.#i.get(e);if(s)for(let r of s)try{await r(...t)}catch(n){console.error(`[EventEmitter] Error in ${e} listener:`,n)}}clearAllListeners(){this.#i.clear()}};var Q=class{#i;#e;#t;#p;#n;#r;#u;#c=null;#a=new Uint32Array(64);#l=new DataView(this.#a.buffer);constructor(e={}){this.#p=e.mode||"sab",this.#i=e.sharedBuffer||null,this.#e=e.ringBufferBase||0,this.#t=e.bufferConstants||null}initSharedViews(e,t,s){if(this.#i=e,this.#e=t,this.#t=s,this.#p==="sab"&&e&&s){this.#n=new Int32Array(e),this.#u=Ze(t,s.CONTROL_START);let r=t+s.METRICS_START;this.#r=new Uint32Array(e,r,s.METRICS_SIZE/4)}}updateSnapshot(e){this.#c=e}getSnapshotBuffer(){return this.#c}getMetricsView(){return this.#r}addMetric(e,t=1){if(!this.#r)return;let r={oscOutMessagesSent:24,oscOutBytesSent:25,preschedulerBypassed:22,bypassNonBundle:38,bypassImmediate:39,bypassNearFuture:40,bypassLate:41}[e];r!==void 0&&Atomics.add(this.#r,r,t)}parseMetricsBuffer(e){return{scsynthProcessCount:e[0],scsynthMessagesProcessed:e[1],scsynthMessagesDropped:e[2],scsynthSchedulerDepth:e[3],scsynthSchedulerPeakDepth:e[4],scsynthSchedulerDropped:e[5],scsynthSequenceGaps:e[6],scsynthSchedulerLates:e[8],scsynthSchedulerMaxLateMs:e[42],scsynthSchedulerLastLateMs:e[43],scsynthSchedulerLastLateTick:e[44],preschedulerPending:e[9],preschedulerPendingPeak:e[10],preschedulerDispatched:e[12],preschedulerRetriesSucceeded:e[16],preschedulerRetriesFailed:e[17],preschedulerBundlesScheduled:e[11],preschedulerEventsCancelled:e[13],preschedulerTotalDispatches:e[21],preschedulerMessagesRetried:e[20],preschedulerRetryQueueSize:e[18],preschedulerRetryQueuePeak:e[19],preschedulerBypassed:e[22],oscInMessagesReceived:e[26],oscInMessagesDropped:e[28],oscInBytesReceived:e[27],debugMessagesReceived:e[30],debugBytesReceived:e[31],oscOutMessagesSent:e[24],oscOutBytesSent:e[25],preschedulerMinHeadroomMs:e[14],preschedulerLates:e[15],preschedulerMaxLateMs:e[23],scsynthWasmErrors:e[7],oscInCorrupted:e[29],ringBufferDirectWriteFails:e[45],inBufferUsedBytes:e[32],outBufferUsedBytes:e[33],debugBufferUsedBytes:e[34],inBufferPeakBytes:e[35],outBufferPeakBytes:e[36],debugBufferPeakBytes:e[37],bypassNonBundle:e[38],bypassImmediate:e[39],bypassNearFuture:e[40],bypassLate:e[41]}}getSABMetrics(){return this.#r?this.parseMetricsBuffer(this.#r):null}getBufferUsage(){if(!this.#n||!this.#t||!this.#u)return null;let e=this.#t,t=this.#u,s=this.#n,r=Atomics.load(s,t.IN_HEAD),n=Atomics.load(s,t.IN_TAIL),o=Atomics.load(s,t.OUT_HEAD),a=Atomics.load(s,t.OUT_TAIL),c=Atomics.load(s,t.DEBUG_HEAD),u=Atomics.load(s,t.DEBUG_TAIL),l=(r-n+e.IN_BUFFER_SIZE)%e.IN_BUFFER_SIZE,f=(o-a+e.OUT_BUFFER_SIZE)%e.OUT_BUFFER_SIZE,h=(c-u+e.DEBUG_BUFFER_SIZE)%e.DEBUG_BUFFER_SIZE;return{inBufferUsed:{bytes:l,percentage:l/e.IN_BUFFER_SIZE*100,capacity:e.IN_BUFFER_SIZE},outBufferUsed:{bytes:f,percentage:f/e.OUT_BUFFER_SIZE*100,capacity:e.OUT_BUFFER_SIZE},debugBufferUsed:{bytes:h,percentage:h/e.DEBUG_BUFFER_SIZE*100,capacity:e.DEBUG_BUFFER_SIZE}}}overlayPreschedulerMetrics(e){if(!this.#c||!e)return;let t=new Uint32Array(this.#c,0,46),s=9,r=13;t.set(e.subarray(s,s+r),s),t[23]=e[23]}gatherMetrics(e={}){let t;if(this.#p==="postMessage")if(e.preschedulerMetrics&&this.overlayPreschedulerMetrics(e.preschedulerMetrics),this.#c){let s=new Uint32Array(this.#c,0,46);t=this.parseMetricsBuffer(s)}else t={};else t=this.getSABMetrics()||{};if(t.inBufferUsedBytes!==void 0&&this.#t){let s=this.#t;t.inBufferUsed={bytes:t.inBufferUsedBytes,percentage:t.inBufferUsedBytes/s.IN_BUFFER_SIZE*100,peakBytes:t.inBufferPeakBytes,peakPercentage:t.inBufferPeakBytes/s.IN_BUFFER_SIZE*100,capacity:s.IN_BUFFER_SIZE},t.outBufferUsed={bytes:t.outBufferUsedBytes,percentage:t.outBufferUsedBytes/s.OUT_BUFFER_SIZE*100,peakBytes:t.outBufferPeakBytes,peakPercentage:t.outBufferPeakBytes/s.OUT_BUFFER_SIZE*100,capacity:s.OUT_BUFFER_SIZE},t.debugBufferUsed={bytes:t.debugBufferUsedBytes,percentage:t.debugBufferUsedBytes/s.DEBUG_BUFFER_SIZE*100,peakBytes:t.debugBufferPeakBytes,peakPercentage:t.debugBufferPeakBytes/s.DEBUG_BUFFER_SIZE*100,capacity:s.DEBUG_BUFFER_SIZE},delete t.inBufferUsedBytes,delete t.outBufferUsedBytes,delete t.debugBufferUsedBytes,delete t.inBufferPeakBytes,delete t.outBufferPeakBytes,delete t.debugBufferPeakBytes}return t.mode=this.#p,this.#t?.scheduler_slot_count!==void 0&&(t.scsynthSchedulerCapacity=this.#t.scheduler_slot_count),e.driftOffsetMs!==void 0&&(t.driftOffsetMs=e.driftOffsetMs),e.ntpStartTime!==void 0&&(t.ntpStartTime=e.ntpStartTime),e.clockOffsetMs!==void 0&&(t.clockOffsetMs=e.clockOffsetMs),e.audioContextState&&(t.audioContextState=e.audioContextState),e.bufferPoolStats&&(t.bufferPoolUsedBytes=e.bufferPoolStats.used.size,t.bufferPoolAvailableBytes=e.bufferPoolStats.available,t.bufferPoolAllocations=e.bufferPoolStats.used.count),e.loadedSynthDefsCount!==void 0&&(t.loadedSynthDefs=e.loadedSynthDefsCount),e.preschedulerCapacity!==void 0&&(t.preschedulerCapacity=e.preschedulerCapacity),this.#p==="postMessage"&&e.transportMetrics&&Object.assign(t,e.transportMetrics),t}updateMergedArray(e={}){let t=this.#a;if(this.#p==="postMessage"){if(e.preschedulerMetrics&&this.overlayPreschedulerMetrics(e.preschedulerMetrics),this.#c){let a=new Uint32Array(this.#c,0,46);t.set(a)}e.transportMetrics&&(e.transportMetrics.oscOutMessagesSent!==void 0&&(t[24]=e.transportMetrics.oscOutMessagesSent),e.transportMetrics.oscOutBytesSent!==void 0&&(t[25]=e.transportMetrics.oscOutBytesSent),e.transportMetrics.preschedulerBypassed!==void 0&&(t[22]=e.transportMetrics.preschedulerBypassed),e.transportMetrics.bypassNonBundle!==void 0&&(t[38]=e.transportMetrics.bypassNonBundle),e.transportMetrics.bypassImmediate!==void 0&&(t[39]=e.transportMetrics.bypassImmediate),e.transportMetrics.bypassNearFuture!==void 0&&(t[40]=e.transportMetrics.bypassNearFuture),e.transportMetrics.bypassLate!==void 0&&(t[41]=e.transportMetrics.bypassLate))}else this.#r&&t.set(this.#r);let s=this.#l;s.setInt32(46*4,e.driftOffsetMs??0,!0),s.setInt32(47*4,e.clockOffsetMs??0,!0);let r=e.audioContextState||"unknown",n={unknown:0,running:1,suspended:2,closed:3,interrupted:4};t[48]=n[r]??0,e.bufferPoolStats&&(t[49]=e.bufferPoolStats.used?.size??0,t[50]=e.bufferPoolStats.available??0,t[51]=e.bufferPoolStats.used?.count??0),t[52]=e.loadedSynthDefsCount??0;let o=this.#t;t[53]=o?.scheduler_slot_count??0,t[54]=e.preschedulerCapacity??0,t[55]=o?.IN_BUFFER_SIZE??0,t[56]=o?.OUT_BUFFER_SIZE??0,t[57]=o?.DEBUG_BUFFER_SIZE??0,t[58]=this.#p==="sab"?0:1}getMergedArray(){return this.#a}get bufferConstants(){return this.#t}get ringBufferBase(){return this.#e}get sharedBuffer(){return this.#i}};function J(i){return i/1e3+2208988800}function Te(i,e){return i-e}function ht(i,e){let t=i-e;return Math.round(t*1e3)}var ee=class{#i;#e;#t;#p;#n;#r;#u;#c;#a;#l=0;#f=0;#m=null;constructor(e={}){this.#i=e.mode||"sab",this.#e=e.audioContext,this.#t=e.workletPort||null}initSharedViews(e,t,s){this.#n=t,this.#p=s,this.#i==="sab"&&e&&s&&(this.#r=new Float64Array(e,t+s.NTP_START_TIME_START,1),this.#u=new Int32Array(e,t+s.DRIFT_OFFSET_START,1),this.#c=new Int32Array(e,t+s.GLOBAL_OFFSET_START,1))}setWorkletPort(e){this.#t=e}updateAudioContext(e){this.#e=e}async initialize(){if(!this.#e)return;let e;for(;e=this.#e.getOutputTimestamp(),!(e.contextTime>0);)await new Promise(o=>setTimeout(o,50));e=this.#e.getOutputTimestamp();let t=performance.timeOrigin+e.performanceTime,s=J(t),r=e.contextTime,n=Te(s,r);this.#i==="sab"&&this.#r?this.#r[0]=n:this.#t&&this.#t.postMessage({type:"setNTPStartTime",ntpStartTime:n}),this.#a=n,await new Promise(o=>setTimeout(o,500)),this.updateDriftOffset()}updateDriftOffset(){if(!this.#e||this.#a===void 0)return;let e=this.#e.getOutputTimestamp(),t=performance.timeOrigin+e.performanceTime,r=J(t)-this.#a,n=ht(r,e.contextTime);this.#l=n,this.#i==="sab"&&this.#u?Atomics.store(this.#u,0,n):this.#t&&this.#t.postMessage({type:"setDriftOffset",driftOffsetMs:n})}resync(){if(!this.#e)return;let e=this.#e.getOutputTimestamp();if(!e||e.contextTime<=0)return;let t=performance.timeOrigin+e.performanceTime,s=J(t),r=Te(s,e.contextTime);this.#i==="sab"&&this.#r?this.#r[0]=r:this.#t&&this.#t.postMessage({type:"setNTPStartTime",ntpStartTime:r}),this.#a=r,this.updateDriftOffset()}startDriftTimer(){this.stopDriftTimer(),this.#m=setInterval(()=>{this.updateDriftOffset()},1e3)}stopDriftTimer(){this.#m&&(clearInterval(this.#m),this.#m=null)}getDriftOffset(){return this.#u?Atomics.load(this.#u,0):this.#l}getNTPStartTime(){return this.#r?this.#r[0]:this.#a??0}getClockOffset(){return this.#c?Atomics.load(this.#c,0):this.#f}setClockOffset(e){let t=Math.round(e*1e3);this.#f=t,this.#i==="sab"&&this.#c?Atomics.store(this.#c,0,t):this.#t&&this.#t.postMessage({type:"setClockOffset",clockOffsetMs:t})}calculateBundleWait(e){if(e.length<16||String.fromCharCode.apply(null,e.slice(0,8))!=="#bundle\0")return null;let s=this.getNTPStartTime();if(s===0)return console.warn("[NTPTiming] NTP start time not yet initialized"),null;let n=this.getDriftOffset()/1e3,a=this.getClockOffset()/1e3,c=s+n+a,u=new DataView(e.buffer,e.byteOffset),l=u.getUint32(8,!1),f=u.getUint32(12,!1);if(l===0&&(f===0||f===1))return null;let E=l+f/4294967296-c,p=this.#e?.currentTime??0;return{audioTimeS:E,currentTimeS:p}}reset(){this.stopDriftTimer(),this.#a=void 0,this.#l=0,this.#f=0,this.#r=null,this.#u=null,this.#c=null}};var te=class{#i;#e;#t;constructor(e={}){this.#i=e.sharedBuffer||null,this.#e=e.bufferConstants||null,this.#t=e.ringBufferBase||0}update(e,t,s){this.#i=e,this.#t=t,this.#e=s}isAvailable(){return!!(this.#i&&this.#e)}start(){if(!this.isAvailable())throw new Error("AudioCapture not initialized");let e=this.#e,t=this.#t+e.AUDIO_CAPTURE_START,s=new Uint32Array(this.#i,t,4);Atomics.store(s,1,0),Atomics.store(s,0,1)}stop(){if(!this.isAvailable())throw new Error("AudioCapture not initialized");let e=this.#e,t=this.#t+e.AUDIO_CAPTURE_START,s=new Uint32Array(this.#i,t,4);Atomics.store(s,0,0);let r=Atomics.load(s,1),n=s[2],o=s[3],a=t+e.AUDIO_CAPTURE_HEADER_SIZE,c=new Float32Array(this.#i,a,r*o),u=new Float32Array(r),l=o>1?new Float32Array(r):null;for(let f=0;f<r;f++)u[f]=c[f*o],l&&(l[f]=c[f*o+1]);return{sampleRate:n,channels:o,frames:r,left:u,right:l}}isEnabled(){if(!this.isAvailable())return!1;let e=this.#e,t=this.#t+e.AUDIO_CAPTURE_START,s=new Uint32Array(this.#i,t,1);return Atomics.load(s,0)===1}getFrameCount(){if(!this.isAvailable())return 0;let e=this.#e,t=this.#t+e.AUDIO_CAPTURE_START,s=new Uint32Array(this.#i,t,2);return Atomics.load(s,1)}getMaxDuration(){if(!this.#e)return 0;let e=this.#e;return e.AUDIO_CAPTURE_FRAMES/(e.AUDIO_CAPTURE_SAMPLE_RATE||48e3)}};function dt(i,e,t){let s=t,r=new Uint32Array(i,e,3),n=r[0],o=r[1],a=r[2],c=e+s.NODE_TREE_HEADER_SIZE,u=s.NODE_TREE_MIRROR_MAX_NODES,l=s.NODE_TREE_ENTRY_SIZE,f=s.NODE_TREE_DEF_NAME_SIZE,h=new DataView(i,c,u*l),E=new TextDecoder("utf-8"),p=[],g=0;for(let m=0;m<u&&g<n;m++){let S=m*l,_=h.getInt32(S,!0);if(_===-1)continue;g++;let d=c+S+24,M=new Uint8Array(i,d,f),ce=new Uint8Array(f);ce.set(M);let le=ce.indexOf(0);le===-1&&(le=f);let Ut=E.decode(ce.subarray(0,le));p.push({id:_,parentId:h.getInt32(S+4,!0),isGroup:h.getInt32(S+8,!0)===1,prevId:h.getInt32(S+12,!0),nextId:h.getInt32(S+16,!0),headId:h.getInt32(S+20,!0),defName:Ut})}return{nodeCount:n,version:o,droppedCount:a,nodes:p}}var De=new Uint8Array(2097152),pt=new DataView(De.buffer),y=De,b=pt,Ae=new Map,Zs=1e3,Xs=new TextDecoder,Ks=new TextEncoder,ke=2208988800,ie=4294967296,Le=new Uint8Array([35,98,117,110,100,108,101,0]),mt=44,we=105,Me=102,Ce=115,Re=98,Oe=84,Ue=70,yt=104,St=100,Et=116,gt=117;function se(i,e){let t=i.length+4;t+=e.length+4;for(let s of e)if(s instanceof Uint8Array)t+=4+s.length+3;else if(s instanceof ArrayBuffer)t+=4+s.byteLength+3;else if(typeof s=="string")t+=s.length*3+4;else if(s&&s.type==="string")t+=s.value.length*3+4;else if(s&&s.type==="blob"){let r=s.value,n=r instanceof Uint8Array?r.length:r.byteLength;t+=4+n+3}else s&&s.type==="uuid"?t+=16:t+=8;return t}function _t(i){let e=16;for(let t of i)e+=4,Array.isArray(t)?e+=se(t[0],t.slice(1)):t.packets!==void 0?e+=_t(t.packets):e+=se(t.address,t.args||[]);return e}function Pe(i){if(i<=2097152){y=De,b=pt;return}y=new Uint8Array(i),b=new DataView(y.buffer)}function bt(i,e=[]){let t=se(i,e);Pe(t);let s=0;s=Fe(i,s),s=Ne(e,s);for(let r=0;r<e.length;r++)s=ne(e[r],s);return y.subarray(0,s)}function Tt(i,e){let t=_t(e);Pe(t);let s=0;y.set(Le,s),s+=8,s=oe(i,s);for(let r=0;r<e.length;r++){let n=e[r],o=s;s+=4;let a=s;Array.isArray(n)?s=re(n[0],n.slice(1),s):n.packets!==void 0?s=Bt(n.timeTag,n.packets,s):s=re(n.address,n.args||[],s);let c=s-a;b.setUint32(o,c,!1)}return y.subarray(0,s)}function At(i,e,t=[]){let s=20+se(e,t);Pe(s);let r=0;y.set(Le,r),r+=8,r=oe(i,r);let n=r;r+=4;let o=r;r=Fe(e,r),r=Ne(t,r);for(let a=0;a<t.length;a++)r=ne(t[a],r);return b.setUint32(n,r-o,!1),y.subarray(0,r)}function re(i,e,t){t=Fe(i,t),t=Ne(e,t);for(let s=0;s<e.length;s++)t=ne(e[s],t);return t}function Bt(i,e,t){y.set(Le,t),t+=8,t=oe(i,t);for(let s=0;s<e.length;s++){let r=e[s],n=t;t+=4;let o=t;Array.isArray(r)?t=re(r[0],r.slice(1),t):r.packets!==void 0?t=Bt(r.timeTag,r.packets,t):t=re(r.address,r.args||[],t),b.setUint32(n,t-o,!1)}return t}function Fe(i,e){let t=Ae.get(i);if(t)return y.set(t,e),e+t.length;let s=e;if(e=Ie(i,e),Ae.size<Zs){let r=y.slice(s,e);Ae.set(i,r)}return e}function Ie(i,e){let t=!1;for(let s=0;s<i.length;s++)if(i.charCodeAt(s)>=128){t=!0;break}if(t){let s=Ks.encodeInto(i,y.subarray(e));e+=s.written}else for(let s=0;s<i.length;s++)y[e++]=i.charCodeAt(s);for(y[e++]=0;e&3;)y[e++]=0;return e}function Ne(i,e){y[e++]=mt;for(let t=0;t<i.length;t++){let s=i[t],r=typeof s;if(r==="number")y[e++]=Number.isInteger(s)?we:Me;else if(r==="string")y[e++]=Ce;else if(r==="boolean")y[e++]=s?Oe:Ue;else if(s instanceof Uint8Array||s instanceof ArrayBuffer)y[e++]=Re;else if(s&&s.type==="int")y[e++]=we;else if(s&&s.type==="float")y[e++]=Me;else if(s&&s.type==="string")y[e++]=Ce;else if(s&&s.type==="blob")y[e++]=Re;else if(s&&s.type==="bool")y[e++]=s.value?Oe:Ue;else if(s&&s.type==="int64")y[e++]=yt;else if(s&&s.type==="double")y[e++]=St;else if(s&&s.type==="timetag")y[e++]=Et;else if(s&&s.type==="uuid")y[e++]=gt;else throw s==null?new Error(`OSC argument at index ${t} is ${s}`):new Error(`Unknown OSC argument type at index ${t}: ${r}`)}for(y[e++]=0;e&3;)y[e++]=0;return e}function ne(i,e){let t=typeof i;if(t==="number")return Number.isInteger(i)?(b.setInt32(e,i,!1),e+4):(b.setFloat32(e,i,!1),e+4);if(t==="string")return Ie(i,e);if(t==="boolean")return e;if(i instanceof Uint8Array){let s=i.length;for(b.setUint32(e,s,!1),e+=4,y.set(i,e),e+=s;e&3;)y[e++]=0;return e}if(i instanceof ArrayBuffer)return ne(new Uint8Array(i),e);if(i&&i.type==="int")return b.setInt32(e,i.value,!1),e+4;if(i&&i.type==="float")return b.setFloat32(e,i.value,!1),e+4;if(i&&i.type==="string")return Ie(i.value,e);if(i&&i.type==="blob"){let s=i.value instanceof Uint8Array?i.value:new Uint8Array(i.value),r=s.length;for(b.setUint32(e,r,!1),e+=4,y.set(s,e),e+=r;e&3;)y[e++]=0;return e}return i&&i.type==="bool"?e:i&&i.type==="int64"?(b.setBigInt64(e,BigInt(i.value),!1),e+8):i&&i.type==="double"?(b.setFloat64(e,i.value,!1),e+8):i&&i.type==="timetag"?oe(i.value,e):i&&i.type==="uuid"?(y.set(i.value,e),e+16):e}function oe(i,e){if(i===1||i===null||i===void 0)return b.setUint32(e,0,!1),b.setUint32(e+4,1,!1),e+8;if(Array.isArray(i)){if(i.length!==2)throw new Error(`TimeTag array must have exactly 2 elements [seconds, fraction], got ${i.length}`);return b.setUint32(e,i[0]>>>0,!1),b.setUint32(e+4,i[1]>>>0,!1),e+8}if(typeof i!="number")throw new TypeError(`TimeTag must be a number, array, null, or undefined, got ${typeof i}`);i>1&&i<ke&&console.warn(`TimeTag ${i} looks like a Unix timestamp (< NTP_EPOCH_OFFSET). Did you mean to add NTP_EPOCH_OFFSET (2208988800)?`);let t=i>>>0,s=(i-Math.floor(i))*ie>>>0;return b.setUint32(e,t,!1),b.setUint32(e+4,s,!1),e+8}function Y(i){return i instanceof Uint8Array||(i=new Uint8Array(i)),i[0]===35&&i[1]===98?Qs(i):js(i)}function js(i){i instanceof Uint8Array||(i=new Uint8Array(i));let e=new DataView(i.buffer,i.byteOffset,i.byteLength),t=0,[s,r]=Be(i,t);if(t=r,t>=i.length||i[t]!==mt)return[s];let[n,o]=Be(i,t);t=o;let a=[s];for(let c=1;c<n.length;c++)switch(n.charCodeAt(c)){case we:a.push(e.getInt32(t,!1)),t+=4;break;case Me:a.push(e.getFloat32(t,!1)),t+=4;break;case Ce:let[l,f]=Be(i,t);a.push(l),t=f;break;case Re:let h=e.getUint32(t,!1);t+=4,a.push(i.slice(t,t+h)),t+=h,t=t+3&-4;break;case yt:a.push(e.getBigInt64(t,!1)),t+=8;break;case St:a.push(e.getFloat64(t,!1)),t+=8;break;case Oe:a.push(!0);break;case Ue:a.push(!1);break;case Et:let E=e.getUint32(t,!1),p=e.getUint32(t+4,!1);a.push(E+p/ie),t+=8;break;case gt:a.push({type:"uuid",value:i.slice(t,t+16)}),t+=16;break}return a}function Qs(i){i instanceof Uint8Array||(i=new Uint8Array(i));let e=new DataView(i.buffer,i.byteOffset,i.byteLength),t=8,s=e.getUint32(t,!1),r=e.getUint32(t+4,!1),n=s+r/ie;t+=8;let o=[];for(;t<i.length;){let a=e.getUint32(t,!1);if(t+=4,a>0&&t+a<=i.length){let c=i.subarray(t,t+a);o.push(Y(c))}t+=a}return{timeTag:n,packets:o}}function Be(i,e){let t=e;for(;t<i.length&&i[t]!==0;)t++;let s=Xs.decode(i.subarray(e,t));return t++,t=t+3&-4,[s,t]}function ae(i){return i.slice()}function Js(i){return!i||i.length<8?!1:i[0]===35&&i[1]===98}function xe(i){if(!Js(i))return null;let e=new DataView(i.buffer,i.byteOffset,i.byteLength),t=e.getUint32(8,!1),s=e.getUint32(12,!1);return t+s/ie}var wt={totalPages:1280,ringBufferReserved:3145728,bufferPoolOffset:19922944,bufferPoolSize:63963136,get totalMemory(){return this.bufferPoolOffset+this.bufferPoolSize},get wasmHeapSize(){return this.bufferPoolOffset-this.ringBufferReserved}};var Mt={numBuffers:1024,maxNodes:1024,maxGraphDefs:1024,maxWireBufs:64,numAudioBusChannels:128,numInputBusChannels:2,numOutputBusChannels:2,numControlBusChannels:4096,bufLength:128,realTimeMemorySize:8192,numRGens:64,realTime:!1,memoryLocking:!1,loadGraphDefs:0,preferredSampleRate:0,verbosity:0};var ir=new Set(["/b_alloc","/b_allocRead","/b_allocReadChannel","/b_allocFile"]),T=[];for(let i=0;i<256;i++)T[i]=i.toString(16).padStart(2,"0");function Rt(i){return T[i[0]]+T[i[1]]+T[i[2]]+T[i[3]]+"-"+T[i[4]]+T[i[5]]+"-"+T[i[6]]+T[i[7]]+"-"+T[i[8]]+T[i[9]]+"-"+T[i[10]]+T[i[11]]+T[i[12]]+T[i[13]]+T[i[14]]+T[i[15]]}function Ct(i,e){if(i&&i.type==="uuid"&&i.value)return Rt(i.value);if(i instanceof Uint8Array||i instanceof ArrayBuffer)return`<${i.byteLength||i.length} bytes>`;let t=JSON.stringify(i);return e&&t.length>e?t.slice(0,e)+"...":t}function G(i){return String(i).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Ot(i,e,t){if(i&&i.type==="uuid"&&i.value)return`<span class="supersonic-scsynth-string">${Rt(i.value)}</span>`;let s=i,r=null;if(typeof i=="object"&&i!==null&&i.value!==void 0&&(s=i.value,r=i.type),r==="b"||s instanceof Uint8Array||s instanceof ArrayBuffer)return`<span class="supersonic-scsynth-binary"><${s.byteLength??s.length??"?"} bytes></span>`;let n=r==="f"||r===null&&typeof s=="number"&&!Number.isInteger(s),o=r==="i"||r===null&&Number.isInteger(s),c=e==="/s_new"&&t>=4&&(t-4)%2===0&&typeof s=="string";return n?`<span class="supersonic-scsynth-float">${parseFloat(s.toFixed(3))}</span>`:o?`<span class="supersonic-scsynth-int">${s}</span>`:c?`<span class="supersonic-scsynth-param">${G(s)}</span>`:typeof s=="string"?`<span class="supersonic-scsynth-string">${G(JSON.stringify(s))}</span>`:`<span class="supersonic-scsynth-string">${G(s)}</span>`}function ve(i,e,t,s,r){let n=i[0],o=i.slice(1),a=s&&t?(t-s).toFixed(2):"",c=`<span class="supersonic-scsynth-seq">[${e}]</span>`;if(a&&(c+=` <span class="supersonic-scsynth-time">${a}</span>`),r!==void 0&&(c+=` <span class="supersonic-scsynth-source">ch${r}</span>`),c+=` <span class="supersonic-scsynth-address">${G(n)}</span>`,o.length>0){let u=o.map((l,f)=>Ot(l,n,f)).join(", ");c+=" "+u}return c}function nr(i,e,t,s,r){if(!i.packets)return ve(i,e,t,s,r);if(i.packets.length===1)return ve(i.packets[0],e,t,s,r);let n=s&&t?(t-s).toFixed(2):"",o=`<span class="supersonic-scsynth-seq">[${e}]</span>`;n&&(o+=` <span class="supersonic-scsynth-time">${n}</span>`),r!==void 0&&(o+=` <span class="supersonic-scsynth-source">ch${r}</span>`),o+=` <span class="supersonic-scsynth-bundle">Bundle (${i.packets.length})</span>`;for(let a of i.packets){let c=a[0],u=a.slice(1);o+=`<br><span class="supersonic-scsynth-address">${G(c)}</span>`,u.length>0&&(o+=" "+u.map((l,f)=>Ot(l,c,f)).join(", "))}return o}var He=class i{static osc={encodeMessage:(e,t)=>ae(bt(e,t)),encodeBundle:(e,t)=>ae(Tt(e,t)),decode:e=>Y(e),encodeSingleBundle:(e,t,s)=>ae(At(e,t,s)),readTimetag:e=>fe(e),ntpNow:()=>A(),NTP_EPOCH_OFFSET:ke};static#i=null;static getMetricsSchema(){return this.#i??={metrics:{scsynthProcessCount:{offset:0,type:"counter",unit:"count",description:"Audio process() calls"},scsynthMessagesProcessed:{offset:1,type:"counter",unit:"count",description:"OSC messages processed by scsynth"},scsynthMessagesDropped:{offset:2,type:"counter",unit:"count",description:"Messages dropped (ring buffer full)"},scsynthSchedulerDepth:{offset:3,type:"gauge",unit:"count",description:"Current scheduler queue depth"},scsynthSchedulerPeakDepth:{offset:4,type:"gauge",unit:"count",description:"Peak scheduler queue depth (high water mark)"},scsynthSchedulerDropped:{offset:5,type:"counter",unit:"count",description:"Scheduled events dropped"},scsynthSequenceGaps:{offset:6,type:"counter",unit:"count",description:"Messages lost in transit from JS to scsynth"},scsynthWasmErrors:{offset:7,type:"counter",unit:"count",description:"WASM execution errors in audio worklet"},scsynthSchedulerLates:{offset:8,type:"counter",unit:"count",description:"Bundles executed after their scheduled time"},preschedulerPending:{offset:9,type:"gauge",unit:"count",description:"Events waiting to be scheduled"},preschedulerPendingPeak:{offset:10,type:"gauge",unit:"count",description:"Peak pending events"},preschedulerBundlesScheduled:{offset:11,type:"counter",unit:"count",description:"Bundles scheduled"},preschedulerDispatched:{offset:12,type:"counter",unit:"count",description:"Events sent to worklet"},preschedulerEventsCancelled:{offset:13,type:"counter",unit:"count",description:"Events cancelled"},preschedulerMinHeadroomMs:{offset:14,type:"gauge",unit:"ms",description:"Smallest time gap between JS prescheduler dispatch and scsynth scheduler execution"},preschedulerLates:{offset:15,type:"counter",unit:"count",description:"Bundles dispatched after their scheduled execution time"},preschedulerRetriesSucceeded:{offset:16,type:"counter",unit:"count",description:"Retries that succeeded"},preschedulerRetriesFailed:{offset:17,type:"counter",unit:"count",description:"Retries that failed"},preschedulerRetryQueueSize:{offset:18,type:"gauge",unit:"count",description:"Current retry queue size"},preschedulerRetryQueuePeak:{offset:19,type:"gauge",unit:"count",description:"Peak retry queue size"},preschedulerMessagesRetried:{offset:20,type:"counter",unit:"count",description:"Messages that needed retry"},preschedulerTotalDispatches:{offset:21,type:"counter",unit:"count",description:"Total dispatch attempts"},preschedulerBypassed:{offset:22,type:"counter",unit:"count",description:"Messages sent directly from JS to scsynth, bypassing prescheduler (aggregate)"},preschedulerMaxLateMs:{offset:23,type:"gauge",unit:"ms",description:"Maximum lateness at prescheduler (ms)"},oscOutMessagesSent:{offset:24,type:"counter",unit:"count",description:"OSC messages sent from JS to scsynth"},oscOutBytesSent:{offset:25,type:"counter",unit:"bytes",description:"Total bytes sent from JS to scsynth"},oscInMessagesReceived:{offset:26,type:"counter",unit:"count",description:"OSC replies received from scsynth to JS"},oscInBytesReceived:{offset:27,type:"counter",unit:"bytes",description:"Total bytes received from scsynth to JS"},oscInMessagesDropped:{offset:28,type:"counter",unit:"count",description:"Replies lost in transit from scsynth to JS"},oscInCorrupted:{offset:29,type:"counter",unit:"count",description:"Corrupted messages detected from scsynth to JS"},debugMessagesReceived:{offset:30,type:"counter",unit:"count",description:"Debug messages from scsynth"},debugBytesReceived:{offset:31,type:"counter",unit:"bytes",description:"Debug bytes received"},inBufferUsedBytes:{offset:32,type:"gauge",unit:"bytes",description:"Bytes used in IN ring buffer"},outBufferUsedBytes:{offset:33,type:"gauge",unit:"bytes",description:"Bytes used in OUT ring buffer"},debugBufferUsedBytes:{offset:34,type:"gauge",unit:"bytes",description:"Bytes used in DEBUG ring buffer"},inBufferPeakBytes:{offset:35,type:"gauge",unit:"bytes",description:"Peak bytes used in IN ring buffer"},outBufferPeakBytes:{offset:36,type:"gauge",unit:"bytes",description:"Peak bytes used in OUT ring buffer"},debugBufferPeakBytes:{offset:37,type:"gauge",unit:"bytes",description:"Peak bytes used in DEBUG ring buffer"},bypassNonBundle:{offset:38,type:"counter",unit:"count",description:"Plain OSC messages (not bundles) that bypassed prescheduler"},bypassImmediate:{offset:39,type:"counter",unit:"count",description:"Bundles with timetag 0 or 1 that bypassed prescheduler"},bypassNearFuture:{offset:40,type:"counter",unit:"count",description:"Bundles within bypass lookahead threshold that bypassed prescheduler"},bypassLate:{offset:41,type:"counter",unit:"count",description:"Timestamped OSC bundles arriving late into SuperSonic bypassing prescheduler"},scsynthSchedulerMaxLateMs:{offset:42,type:"gauge",unit:"ms",description:"Maximum lateness observed in scsynth scheduler (ms)"},scsynthSchedulerLastLateMs:{offset:43,type:"gauge",unit:"ms",description:"Most recent late magnitude in scsynth scheduler (ms)"},scsynthSchedulerLastLateTick:{offset:44,type:"gauge",unit:"count",description:"Process count when last scsynth late occurred"},ringBufferDirectWriteFails:{offset:45,type:"counter",unit:"count",description:"SAB mode only: optimistic direct writes attempted but failed due to ring buffer lock not being available (delivered via prescheduler instead)"},driftOffsetMs:{offset:46,type:"gauge",unit:"ms",signed:!0,description:"Clock drift between AudioContext and wall clock"},clockOffsetMs:{offset:47,type:"gauge",unit:"ms",signed:!0,description:"Clock offset for multi-system sync"},audioContextState:{offset:48,type:"enum",values:["unknown","running","suspended","closed","interrupted"],description:"AudioContext state"},bufferPoolUsedBytes:{offset:49,type:"gauge",unit:"bytes",description:"Buffer pool bytes used"},bufferPoolAvailableBytes:{offset:50,type:"gauge",unit:"bytes",description:"Buffer pool bytes available"},bufferPoolAllocations:{offset:51,type:"counter",unit:"count",description:"Total buffer allocations"},loadedSynthDefs:{offset:52,type:"gauge",unit:"count",description:"Number of loaded synthdefs"},scsynthSchedulerCapacity:{offset:53,type:"constant",unit:"count",description:"Maximum scheduler queue size"},preschedulerCapacity:{offset:54,type:"constant",unit:"count",description:"Maximum pending events in prescheduler"},inBufferCapacity:{offset:55,type:"constant",unit:"bytes",description:"IN ring buffer capacity"},outBufferCapacity:{offset:56,type:"constant",unit:"bytes",description:"OUT ring buffer capacity"},debugBufferCapacity:{offset:57,type:"constant",unit:"bytes",description:"DEBUG ring buffer capacity"},mode:{offset:58,type:"enum",values:["sab","postMessage"],description:"Transport mode"}},layout:{panels:[{title:"OSC Out",rows:[{label:"sent",cells:[{key:"oscOutMessagesSent"}]},{label:"bytes",cells:[{key:"oscOutBytesSent",kind:"muted",format:"bytes"}]},{label:"bypass",cells:[{key:"preschedulerBypassed",kind:"green"}]},{label:"lost",cells:[{key:"scsynthSequenceGaps",kind:"error"}]}]},{title:"Bypass",rows:[{label:"msg",cells:[{key:"bypassNonBundle",kind:"muted"}]},{label:"imm",cells:[{key:"bypassImmediate",kind:"muted"}]},{label:"near",cells:[{key:"bypassNearFuture",kind:"muted"}]},{label:"late",cells:[{key:"bypassLate",kind:"muted"}]}]},{title:"OSC In",rows:[{label:"received",cells:[{key:"oscInMessagesReceived"}]},{label:"bytes",cells:[{key:"oscInBytesReceived",kind:"muted",format:"bytes"}]},{label:"dropped",cells:[{key:"oscInMessagesDropped",kind:"error"}]},{label:"corrupted",cells:[{key:"oscInCorrupted",kind:"error"}]}]},{title:"Presched Flow",rows:[{label:"pending",cells:[{key:"preschedulerPending"},{sep:" | "},{key:"preschedulerPendingPeak",kind:"muted"}]},{label:"scheduled",cells:[{key:"preschedulerBundlesScheduled"}]},{label:"dispatched",cells:[{key:"preschedulerDispatched",kind:"dim"}]},{label:"min slack",cells:[{key:"preschedulerMinHeadroomMs",kind:"dim",format:"headroom"},{text:" ms",kind:"muted"}]}]},{title:"Presched Health",rows:[{label:"lates",cells:[{key:"preschedulerLates",kind:"error"},{sep:" ("},{key:"preschedulerMaxLateMs",kind:"dim"},{text:"ms max)",kind:"muted"}]},{label:"cancelled",cells:[{key:"preschedulerEventsCancelled",kind:"error"}]},{label:"retried",cells:[{key:"preschedulerMessagesRetried",kind:"dim"},{sep:" | "},{key:"preschedulerRetriesSucceeded",kind:"green"},{sep:" | "},{key:"preschedulerRetriesFailed",kind:"error"}]},{label:"retry queue",cells:[{key:"preschedulerRetryQueueSize"},{sep:" | "},{key:"preschedulerRetryQueuePeak",kind:"muted"}]}]},{title:"scsynth Scheduler",rows:[{label:"queue",cells:[{key:"scsynthSchedulerDepth"},{sep:" | "},{key:"scsynthSchedulerPeakDepth",kind:"muted"}]},{label:"dropped",cells:[{key:"scsynthSchedulerDropped",kind:"error"}]},{label:"lates",cells:[{key:"scsynthSchedulerLates",kind:"error"}]},{label:"max | last",cells:[{key:"scsynthSchedulerMaxLateMs",kind:"error"},{sep:" | "},{key:"scsynthSchedulerLastLateMs",kind:"dim"},{text:" ms",kind:"muted"}]}]},{title:"scsynth",rows:[{label:"processed",cells:[{key:"scsynthMessagesProcessed"}]},{label:"dropped",cells:[{key:"scsynthMessagesDropped",kind:"error"}]},{label:"synthdefs",cells:[{key:"loadedSynthDefs"}]},{label:"clock drift",cells:[{key:"driftOffsetMs",format:"signed"},{text:"ms",kind:"muted"}]}]},{title:"Ring Buffer Level",class:"wide",rows:[{type:"bar",label:"in",usedKey:"inBufferUsedBytes",peakKey:"inBufferPeakBytes",capacityKey:"inBufferCapacity",color:"blue"},{type:"bar",label:"out",usedKey:"outBufferUsedBytes",peakKey:"outBufferPeakBytes",capacityKey:"outBufferCapacity",color:"green"},{type:"bar",label:"dbg",usedKey:"debugBufferUsedBytes",peakKey:"debugBufferPeakBytes",capacityKey:"debugBufferCapacity",color:"purple"},{label:"direct write fails",cells:[{key:"ringBufferDirectWriteFails",kind:"error"}]}]},{title:"AudioWorklet",rows:[{label:"audio",cells:[{key:"audioContextState",kind:"green",format:"enum"}]},{label:"ticks",cells:[{key:"scsynthProcessCount",kind:"dim"}]},{label:"WASM errors",cells:[{key:"scsynthWasmErrors",kind:"error"}]},{label:"debug",cells:[{key:"debugMessagesReceived",kind:"muted"},{text:" ("},{key:"debugBytesReceived",kind:"muted",format:"bytes"},{text:")"}]}]},{title:"Audio Buffers",rows:[{label:"used",cells:[{key:"bufferPoolUsedBytes",format:"bytes"}]},{label:"free",cells:[{key:"bufferPoolAvailableBytes",kind:"green",format:"bytes"}]},{label:"allocs",cells:[{key:"bufferPoolAllocations",kind:"dim"}]}]}]},sentinels:{HEADROOM_UNSET:4294967295}}}static getTreeSchema(){return{nodeCount:{type:"number",description:"Total nodes in tree"},version:{type:"number",description:"Increments on any tree change, useful for detecting updates"},droppedCount:{type:"number",description:"Nodes that exceeded mirror capacity (tree may be incomplete)"},root:{type:"object",description:"Root node of the tree (always a group with id 0)",schema:{id:{type:"number",description:"Unique node ID"},type:{type:"string",values:["group","synth"],description:"Node type"},defName:{type:"string",description:"Synthdef name (synths only, empty for groups)"},children:{type:"array",description:"Child nodes (recursive)",itemSchema:"(self)"}}}}}static getRawTreeSchema(){return{nodeCount:{type:"number",description:"Total nodes in tree"},version:{type:"number",description:"Increments on any tree change, useful for detecting updates"},droppedCount:{type:"number",description:"Nodes that exceeded mirror capacity (tree may be incomplete)"},nodes:{type:"array",description:"Flat array of all nodes with internal linkage pointers",itemSchema:{id:{type:"number",description:"Unique node ID"},parentId:{type:"number",description:"Parent node ID (-1 for root)"},isGroup:{type:"boolean",description:"True if group, false if synth"},prevId:{type:"number",description:"Previous sibling node ID (-1 if none)"},nextId:{type:"number",description:"Next sibling node ID (-1 if none)"},headId:{type:"number",description:"First child node ID (groups only, -1 if empty)"},defName:{type:"string",description:"Synthdef name (synths only, empty for groups)"}}}}}#e;#t;#p=null;#n;#r;#u;#c;#a;#l;#f;#m;#_;#h;#y;#d;#b;#g;#s;#o;#S;#E;#A;#w;#B=1e3;#M=null;#R=null;#I=0;#O=[];#C=null;#U=Promise.resolve();#$(e){let t=(s,r,{min:n,max:o,allowZero:a=!0}={})=>{if(typeof r!="number"||!Number.isFinite(r))throw new Error(`scsynthOptions.${s} must be a finite number, got: ${r}`);if(!a&&r===0)throw new Error(`scsynthOptions.${s} must be non-zero, got: ${r}`);if(n!==void 0&&r<n)throw new Error(`scsynthOptions.${s} must be >= ${n}, got: ${r}`);if(o!==void 0&&r>o)throw new Error(`scsynthOptions.${s} must be <= ${o}, got: ${r}`)};if(t("numBuffers",e.numBuffers,{min:1,max:65535}),t("maxNodes",e.maxNodes,{min:1}),t("maxGraphDefs",e.maxGraphDefs,{min:1}),t("maxWireBufs",e.maxWireBufs,{min:1}),t("numAudioBusChannels",e.numAudioBusChannels,{min:1}),t("numInputBusChannels",e.numInputBusChannels,{min:0}),t("numOutputBusChannels",e.numOutputBusChannels,{min:1,max:128}),t("numControlBusChannels",e.numControlBusChannels,{min:1}),e.bufLength!==128)throw new Error(`scsynthOptions.bufLength must be 128 (WebAudio API constraint), got: ${e.bufLength}`);if(t("realTimeMemorySize",e.realTimeMemorySize,{min:1}),t("numRGens",e.numRGens,{min:1}),typeof e.realTime!="boolean")throw new Error(`scsynthOptions.realTime must be a boolean, got: ${typeof e.realTime}`);if(typeof e.memoryLocking!="boolean")throw new Error(`scsynthOptions.memoryLocking must be a boolean, got: ${typeof e.memoryLocking}`);if(e.loadGraphDefs!==0&&e.loadGraphDefs!==1)throw new Error(`scsynthOptions.loadGraphDefs must be 0 or 1, got: ${e.loadGraphDefs}`);if(t("preferredSampleRate",e.preferredSampleRate,{min:0,max:384e3}),e.preferredSampleRate!==0&&e.preferredSampleRate<8e3)throw new Error(`scsynthOptions.preferredSampleRate must be 0 (auto) or >= 8000, got: ${e.preferredSampleRate}`);t("verbosity",e.verbosity,{min:0,max:4})}constructor(e={}){this.#h=!1,this.#y=!1,this.#d=null,this.#b={},this.#g=null,this.#o=new j,this.#S=new Q({mode:e.mode||"postMessage"}),this.#A=new te({}),this.#e=null,this.#t=null,this.#n=null,this.#u=null,this.loadedSynthDefs=new Map;let t=e.baseURL||null,s=e.coreBaseURL||t,r=e.workerBaseURL||(t?`${t}workers/`:null),n=e.wasmBaseURL||(s?`${s}wasm/`:null);if(!r||!n)throw new Error(`SuperSonic requires explicit URL configuration.
|
|
5
|
+
Or install: npm install supersonic-scsynth-samples`);return this.#e+e}#s(e){if(!Number.isInteger(e)||e<0||e>=this.MAX_BUFFERS)throw new Error(`Invalid buffer number ${e} (must be 0-${this.MAX_BUFFERS-1})`)}async#o(e,t,s){let r=null,n=null,o=!1,a=await this.#M(e),c=!1;try{await this.#I(e);let{ptr:u,sizeBytes:l,numFrames:f,numChannels:h,sampleRate:E,source:p,...g}=await s();r=u;let{uuid:m,allocationComplete:S}=this.#B(e,t);n=m,this.#R(e,r,l,m,S,{numFrames:f,numChannels:h,sampleRate:E,source:p}),o=!0;let _=this.#O(e,m,S);return a(),c=!0,{ptr:r,uuid:m,allocationComplete:_,numFrames:f,numChannels:h,sampleRate:E,...g}}catch(u){throw o&&n?this.#C(e,n,!1):r&&this.#r.free(r),u}finally{c||a()}}async prepareFromBlob(e){let{bufnum:t,blob:s,startFrame:r=0,numFrames:n=0,channels:o=null}=e;if(this.#s(t),!s||!(s instanceof ArrayBuffer||ArrayBuffer.isView(s)))throw new Error("/b_allocFile requires audio data as ArrayBuffer or typed array");let a=await this.#h({source:s,startFrame:r,numFrames:n,channels:o});return this.#d(t,3e4,a,null)}async prepareFromFile(e){let{bufnum:t,path:s,startFrame:r=0,numFrames:n=0,channels:o=null}=e;this.#s(t);let a=await this.#h({source:s,startFrame:r,numFrames:n,channels:o});return this.#d(t,6e4,a,a.sourceInfo)}async prepareEmpty(e){let{bufnum:t,numFrames:s,numChannels:r=1,sampleRate:n=null}=e;if(this.#s(t),!Number.isFinite(s)||s<=0)throw new Error(`/b_alloc requires a positive number of frames (got ${s})`);if(!Number.isFinite(r)||r<=0)throw new Error(`/b_alloc requires a positive channel count (got ${r})`);let o=Math.floor(s),a=Math.floor(r),c=o*a+(this.GUARD_BEFORE+this.GUARD_AFTER)*a,l={interleaved:new Float32Array(c),numFrames:o,numChannels:a,sampleRate:n||this.#p.sampleRate};return this.#d(t,5e3,l,null)}#S(e,t){return!e||e.length===0?Array.from({length:t},(s,r)=>r):(e.forEach(s=>{if(!Number.isInteger(s)||s<0||s>=t)throw new Error(`Channel ${s} is out of range (file has ${t} channels)`)}),e)}#E(e){let t=e*4,s=this.#r.malloc(t);if(s===0){let r=this.#r.stats(),n=((r.available||0)/(1024*1024)).toFixed(2),o=((r.total||0)/(1024*1024)).toFixed(2),a=(t/(1024*1024)).toFixed(2);throw new Error(`Buffer pool allocation failed: requested ${a}MB, available ${n}MB of ${o}MB total`)}return s}async#A(e,t){if(this.#i==="sab")new Float32Array(this.#n,e,t.length).set(t);else{let s=crypto.randomUUID(),r=new Promise((o,a)=>{let c=setTimeout(()=>{a(new Error("Buffer copy to WASM memory timed out"))},1e4),u=l=>{let f=l.data;f.type==="bufferCopied"&&f.copyId===s&&(this.#m.removeEventListener("message",u),clearTimeout(c),f.success?o():a(new Error(f.error||"Buffer copy failed")))};this.#m.addEventListener("message",u)}),n=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength);this.#m.postMessage({type:"copyBufferData",copyId:s,ptr:e,data:n},[n]),await r}}#w(e,t,s){return new Promise((r,n)=>{let o=setTimeout(()=>{this.#l.delete(e),n(new Error(`Buffer ${t} allocation timeout (${s}ms)`))},s);this.#l.set(e,{resolve:r,reject:n,timeout:o})})}#B(e,t){let s=crypto.randomUUID(),r=this.#w(s,e,t);return{uuid:s,allocationComplete:r}}async#M(e){let t=this.#f.get(e)||Promise.resolve(),s,r=new Promise(n=>{s=n});return this.#f.set(e,t.then(()=>r)),await t,()=>{s&&(s(),s=null),this.#f.get(e)===r&&this.#f.delete(e)}}#R(e,t,s,r,n,o={}){let a=this.#a.get(e),c={ptr:t,size:s,numFrames:o.numFrames||0,numChannels:o.numChannels||1,sampleRate:o.sampleRate||48e3,pendingToken:r,pendingPromise:n,previousAllocation:a?{ptr:a.ptr,size:a.size}:null,source:o.source||null};return this.#a.set(e,c),c}async#I(e){let t=this.#a.get(e);if(t&&t.pendingToken&&t.pendingPromise)try{await t.pendingPromise}catch{}}#O(e,t,s){return!s||typeof s.then!="function"?(this.#C(e,t,!0),Promise.resolve()):s.then(r=>(this.#C(e,t,!0),r)).catch(r=>{throw this.#C(e,t,!1),r})}#C(e,t,s){let r=this.#a.get(e);if(!r||r.pendingToken!==t)return;let n=r.previousAllocation;if(s){r.pendingToken=null,r.pendingPromise=null,r.previousAllocation=null,n?.ptr&&this.#r.free(n.ptr);return}r.ptr&&this.#r.free(r.ptr),r.pendingPromise=null,n?.ptr?this.#a.set(e,{ptr:n.ptr,size:n.size,pendingToken:null,previousAllocation:null}):this.#a.delete(e)}handleBufferFreed(e){let t=typeof e[0]=="bigint"?Number(e[0]):e[0],s=typeof e[1]=="bigint"?Number(e[1]):e[1],r=this.#a.get(t);if(!r){typeof s=="number"&&s!==0&&this.#r.free(s);return}if(typeof s=="number"&&s===r.ptr){this.#r.free(r.ptr),this.#a.delete(t);return}if(typeof s=="number"&&r.previousAllocation&&r.previousAllocation.ptr===s){this.#r.free(s),r.previousAllocation=null;return}this.#r.free(r.ptr),this.#a.delete(t)}handleBufferAllocated(e){let t=e[0],s=e[1],r=this.#l.get(t);r&&(clearTimeout(r.timeout),r.resolve({bufnum:s}),this.#l.delete(t))}allocate(e){let t=e*4,s=this.#r.malloc(t);if(s===0){let r=this.#r.stats(),n=((r.available||0)/(1024*1024)).toFixed(2),o=((r.total||0)/(1024*1024)).toFixed(2),a=(t/(1024*1024)).toFixed(2);console.error(`[BufferManager] Allocation failed: requested ${a}MB, available ${n}MB of ${o}MB total`)}return s}free(e){return this.#r.free(e)}getView(e,t){return new Float32Array(this.#n,e,t)}getStats(){return this.#r?this.#r.stats():{total:0,available:0,used:0,allocations:0}}async sampleInfo({source:e,startFrame:t=0,numFrames:s=0,channels:r=null}){let n=await this.#h({source:e,startFrame:t,numFrames:s,channels:r});return{hash:await this.#_(n.interleaved),source:n.sourceInfo?.path||null,numFrames:n.numFrames,numChannels:n.numChannels,sampleRate:n.sampleRate,duration:n.sampleRate>0?n.numFrames/n.sampleRate:0}}getAllocatedBuffers(){let e=[];for(let[t,s]of this.#a.entries())!s||!s.ptr||e.push({bufnum:t,ptr:s.ptr,numFrames:s.numFrames,numChannels:s.numChannels,sampleRate:s.sampleRate,source:s.source||null,hash:s.hash||null});return e}updateAudioContext(e){if(!e)throw new Error("BufferManager.updateAudioContext requires audioContext");this.#p=e}getDiagnostics(){let e=this.#r.stats(),t=0,s=0;for(let r of this.#a.values())r&&(t+=r.size||0,r.pendingToken&&s++);return{active:this.#a.size,pending:s,bytesActive:t,pool:{total:this.#u,available:e.available||0,freeBytes:e.free?.size||0,freeBlocks:e.free?.count||0,usedBytes:e.used?.size||0,usedBlocks:e.used?.count||0}}}destroy(){for(let[e,t]of this.#l.entries())clearTimeout(t.timeout),t.reject(new Error("BufferManager destroyed"));this.#l.clear();for(let[e,t]of this.#a.entries())t.ptr&&this.#r.free(t.ptr);this.#a.clear(),this.#f.clear()}};var X=class{#i;#e;#t;#p;constructor(e={}){let{onLoadingEvent:t=null,maxRetries:s=3,baseDelay:r=1e3,skipHeadRequests:n=!1}=e;this.#i=t,this.#e=s,this.#t=r,this.#p=n}async fetch(e,{type:t,name:s}){let r=this.#r(e);if(this.#p)this.#i?.("loading:start",{type:t,name:s});else{let a=await this.#n(e);this.#i?.("loading:start",{type:t,name:s,...a!=null&&{size:a}})}let o=await(await r).arrayBuffer();return this.#i?.("loading:complete",{type:t,name:s,size:o.byteLength}),o}async#n(e){try{let t=await fetch(e,{method:"HEAD"});if(t.ok){let s=t.headers.get("Content-Length");return s?parseInt(s,10):null}return null}catch{return null}}async#r(e){let t;for(let s=0;s<=this.#e;s++)try{let r=await fetch(e);if(r.status>=400&&r.status<500)throw new Error(`Failed to fetch ${e}: ${r.status} ${r.statusText}`);if(!r.ok)throw new Error(`Server error fetching ${e}: ${r.status} ${r.statusText}`);return r}catch(r){if(t=r,r.message.includes("Failed to fetch")&&r.message.includes("4"))throw r;if(s<this.#e){let n=this.#t*Math.pow(2,s);await this.#u(n)}}throw t}#u(e){return new Promise(t=>setTimeout(t,e))}};var K=class{#i;#e;constructor({bufferManager:e,getDefaultSampleRate:t}){if(!e)throw new Error("OSCRewriter requires bufferManager");if(typeof t!="function")throw new Error("OSCRewriter requires getDefaultSampleRate callback");this.#i=e,this.#e=t}async rewritePacket(e){if(Array.isArray(e)){let{message:t,changed:s}=await this.#t(e);return{packet:t,changed:s}}if(this.#a(e)){let t=await Promise.all(e.packets.map(n=>this.rewritePacket(n)));if(!t.some(n=>n.changed))return{packet:e,changed:!1};let r=t.map(n=>n.packet);return{packet:{timeTag:e.timeTag,packets:r},changed:!0}}return{packet:e,changed:!1}}async#t(e){let t=e[0],s=e.slice(1);switch(t){case"/b_alloc":return{message:await this.#p(s),changed:!0};case"/b_allocRead":return{message:await this.#n(s),changed:!0};case"/b_allocReadChannel":return{message:await this.#r(s),changed:!0};case"/b_allocFile":return{message:await this.#u(s),changed:!0};default:return{message:e,changed:!1}}}async#p(e){let t=this.#m(e,0,"/b_alloc requires a buffer number"),s=this.#m(e,1,"/b_alloc requires a frame count"),r=2,n=1,o=this.#e();this.#d(this.#l(e,r))&&(n=Math.max(1,this.#_(e,r,1)),r++),this.#l(e,r)?.type==="b"&&r++,this.#d(this.#l(e,r))&&(o=this.#f(this.#l(e,r)));let a=await this.#i.prepareEmpty({bufnum:t,numFrames:s,numChannels:n,sampleRate:o});return this.#b(a.allocationComplete,`/b_alloc ${t}`),this.#c(t,a)}async#n(e){let t=this.#m(e,0,"/b_allocRead requires a buffer number"),s=this.#h(e,1,"/b_allocRead requires a file path"),r=this.#_(e,2,0),n=this.#_(e,3,0),o=await this.#i.prepareFromFile({bufnum:t,path:s,startFrame:r,numFrames:n});return this.#b(o.allocationComplete,`/b_allocRead ${t}`),this.#c(t,o)}async#r(e){let t=this.#m(e,0,"/b_allocReadChannel requires a buffer number"),s=this.#h(e,1,"/b_allocReadChannel requires a file path"),r=this.#_(e,2,0),n=this.#_(e,3,0),o=[];for(let c=4;c<(e?.length||0)&&this.#d(e[c]);c++)o.push(Math.floor(this.#f(e[c])));let a=await this.#i.prepareFromFile({bufnum:t,path:s,startFrame:r,numFrames:n,channels:o.length>0?o:null});return this.#b(a.allocationComplete,`/b_allocReadChannel ${t}`),this.#c(t,a)}async#u(e){let t=this.#m(e,0,"/b_allocFile requires a buffer number"),s=this.#y(e,1,"/b_allocFile requires audio file data as blob"),r=await this.#i.prepareFromBlob({bufnum:t,blob:s});return this.#b(r.allocationComplete,`/b_allocFile ${t}`),this.#c(t,r)}#c(e,t){return["/b_allocPtr",Math.floor(e),Math.floor(t.ptr),Math.floor(t.numFrames),Math.floor(t.numChannels),t.sampleRate,String(t.uuid)]}#a(e){return e&&e.timeTag!==void 0&&Array.isArray(e.packets)}#l(e,t){if(Array.isArray(e))return e[t]}#f(e){if(e!=null)return typeof e=="object"&&Object.prototype.hasOwnProperty.call(e,"value")?e.value:e}#m(e,t,s){let r=this.#f(this.#l(e,t));if(!Number.isFinite(r))throw new Error(s);return Math.floor(r)}#_(e,t,s=0){let r=this.#f(this.#l(e,t));return Number.isFinite(r)?Math.floor(r):s}#h(e,t,s){let r=this.#f(this.#l(e,t));if(typeof r!="string")throw new Error(s);return r}#y(e,t,s){let r=this.#f(this.#l(e,t));if(!(r instanceof Uint8Array||r instanceof ArrayBuffer))throw new Error(s);return r}#d(e){if(!e)return!1;let t=this.#f(e);return Number.isFinite(t)}#b(e,t){!e||typeof e.catch!="function"||e.catch(s=>{console.error(`[OSCRewriter] ${t} allocation failed:`,s)})}};function N(i){if(!i)return null;if(typeof i=="string")return(i.split("/").filter(Boolean).pop()||i).replace(/\.scsyndef$/i,"");let e=i instanceof ArrayBuffer?new Uint8Array(i):i;if(!(e instanceof Uint8Array)||e.length<11||e[0]!==83||e[1]!==67||e[2]!==103||e[3]!==102)return null;let s=(e[4]<<24|e[5]<<16|e[6]<<8|e[7])>=3?14:10;if(s>=e.length)return null;let r=e[s];if(r===0||s+1+r>e.length)return null;try{return new TextDecoder().decode(e.slice(s+1,s+1+r))}catch{return null}}var j=class{#i=new Map;on(e,t){if(typeof t!="function")throw new Error("Callback must be a function");return this.#i.has(e)||this.#i.set(e,new Set),this.#i.get(e).add(t),()=>this.off(e,t)}off(e,t){let s=this.#i.get(e);return s&&s.delete(t),this}once(e,t){let s=(...r)=>{this.off(e,s),t(...r)};return this.on(e,s)}removeAllListeners(e){return e===void 0?this.#i.clear():this.#i.delete(e),this}hasListeners(e){let t=this.#i.get(e);return t?t.size>0:!1}emit(e,...t){let s=this.#i.get(e);if(s)for(let r of s)try{r(...t)}catch(n){console.error(`[EventEmitter] Error in ${e} listener:`,n)}}async emitAsync(e,...t){let s=this.#i.get(e);if(s)for(let r of s)try{await r(...t)}catch(n){console.error(`[EventEmitter] Error in ${e} listener:`,n)}}clearAllListeners(){this.#i.clear()}};var Q=class{#i;#e;#t;#p;#n;#r;#u;#c=null;#a=new Uint32Array(64);#l=new DataView(this.#a.buffer);constructor(e={}){this.#p=e.mode||"sab",this.#i=e.sharedBuffer||null,this.#e=e.ringBufferBase||0,this.#t=e.bufferConstants||null}initSharedViews(e,t,s){if(this.#i=e,this.#e=t,this.#t=s,this.#p==="sab"&&e&&s){this.#n=new Int32Array(e),this.#u=Ze(t,s.CONTROL_START);let r=t+s.METRICS_START;this.#r=new Uint32Array(e,r,s.METRICS_SIZE/4)}}updateSnapshot(e){this.#c=e}getSnapshotBuffer(){return this.#c}getMetricsView(){return this.#r}addMetric(e,t=1){if(!this.#r)return;let r={oscOutMessagesSent:24,oscOutBytesSent:25,preschedulerBypassed:22,bypassNonBundle:38,bypassImmediate:39,bypassNearFuture:40,bypassLate:41}[e];r!==void 0&&Atomics.add(this.#r,r,t)}parseMetricsBuffer(e){return{scsynthProcessCount:e[0],scsynthMessagesProcessed:e[1],scsynthMessagesDropped:e[2],scsynthSchedulerDepth:e[3],scsynthSchedulerPeakDepth:e[4],scsynthSchedulerDropped:e[5],scsynthSequenceGaps:e[6],scsynthSchedulerLates:e[8],scsynthSchedulerMaxLateMs:e[42],scsynthSchedulerLastLateMs:e[43],scsynthSchedulerLastLateTick:e[44],preschedulerPending:e[9],preschedulerPendingPeak:e[10],preschedulerDispatched:e[12],preschedulerRetriesSucceeded:e[16],preschedulerRetriesFailed:e[17],preschedulerBundlesScheduled:e[11],preschedulerEventsCancelled:e[13],preschedulerTotalDispatches:e[21],preschedulerMessagesRetried:e[20],preschedulerRetryQueueSize:e[18],preschedulerRetryQueuePeak:e[19],preschedulerBypassed:e[22],oscInMessagesReceived:e[26],oscInMessagesDropped:e[28],oscInBytesReceived:e[27],debugMessagesReceived:e[30],debugBytesReceived:e[31],oscOutMessagesSent:e[24],oscOutBytesSent:e[25],preschedulerMinHeadroomMs:e[14],preschedulerLates:e[15],preschedulerMaxLateMs:e[23],scsynthWasmErrors:e[7],oscInCorrupted:e[29],ringBufferDirectWriteFails:e[45],inBufferUsedBytes:e[32],outBufferUsedBytes:e[33],debugBufferUsedBytes:e[34],inBufferPeakBytes:e[35],outBufferPeakBytes:e[36],debugBufferPeakBytes:e[37],bypassNonBundle:e[38],bypassImmediate:e[39],bypassNearFuture:e[40],bypassLate:e[41]}}getSABMetrics(){return this.#r?this.parseMetricsBuffer(this.#r):null}getBufferUsage(){if(!this.#n||!this.#t||!this.#u)return null;let e=this.#t,t=this.#u,s=this.#n,r=Atomics.load(s,t.IN_HEAD),n=Atomics.load(s,t.IN_TAIL),o=Atomics.load(s,t.OUT_HEAD),a=Atomics.load(s,t.OUT_TAIL),c=Atomics.load(s,t.DEBUG_HEAD),u=Atomics.load(s,t.DEBUG_TAIL),l=(r-n+e.IN_BUFFER_SIZE)%e.IN_BUFFER_SIZE,f=(o-a+e.OUT_BUFFER_SIZE)%e.OUT_BUFFER_SIZE,h=(c-u+e.DEBUG_BUFFER_SIZE)%e.DEBUG_BUFFER_SIZE;return{inBufferUsed:{bytes:l,percentage:l/e.IN_BUFFER_SIZE*100,capacity:e.IN_BUFFER_SIZE},outBufferUsed:{bytes:f,percentage:f/e.OUT_BUFFER_SIZE*100,capacity:e.OUT_BUFFER_SIZE},debugBufferUsed:{bytes:h,percentage:h/e.DEBUG_BUFFER_SIZE*100,capacity:e.DEBUG_BUFFER_SIZE}}}overlayPreschedulerMetrics(e){if(!this.#c||!e)return;let t=new Uint32Array(this.#c,0,46),s=9,r=13;t.set(e.subarray(s,s+r),s),t[23]=e[23]}gatherMetrics(e={}){let t;if(this.#p==="postMessage")if(e.preschedulerMetrics&&this.overlayPreschedulerMetrics(e.preschedulerMetrics),this.#c){let s=new Uint32Array(this.#c,0,46);t=this.parseMetricsBuffer(s)}else t={};else t=this.getSABMetrics()||{};if(t.inBufferUsedBytes!==void 0&&this.#t){let s=this.#t;t.inBufferUsed={bytes:t.inBufferUsedBytes,percentage:t.inBufferUsedBytes/s.IN_BUFFER_SIZE*100,peakBytes:t.inBufferPeakBytes,peakPercentage:t.inBufferPeakBytes/s.IN_BUFFER_SIZE*100,capacity:s.IN_BUFFER_SIZE},t.outBufferUsed={bytes:t.outBufferUsedBytes,percentage:t.outBufferUsedBytes/s.OUT_BUFFER_SIZE*100,peakBytes:t.outBufferPeakBytes,peakPercentage:t.outBufferPeakBytes/s.OUT_BUFFER_SIZE*100,capacity:s.OUT_BUFFER_SIZE},t.debugBufferUsed={bytes:t.debugBufferUsedBytes,percentage:t.debugBufferUsedBytes/s.DEBUG_BUFFER_SIZE*100,peakBytes:t.debugBufferPeakBytes,peakPercentage:t.debugBufferPeakBytes/s.DEBUG_BUFFER_SIZE*100,capacity:s.DEBUG_BUFFER_SIZE},delete t.inBufferUsedBytes,delete t.outBufferUsedBytes,delete t.debugBufferUsedBytes,delete t.inBufferPeakBytes,delete t.outBufferPeakBytes,delete t.debugBufferPeakBytes}return t.mode=this.#p,this.#t?.scheduler_slot_count!==void 0&&(t.scsynthSchedulerCapacity=this.#t.scheduler_slot_count),e.driftOffsetMs!==void 0&&(t.driftOffsetMs=e.driftOffsetMs),e.ntpStartTime!==void 0&&(t.ntpStartTime=e.ntpStartTime),e.clockOffsetMs!==void 0&&(t.clockOffsetMs=e.clockOffsetMs),e.audioContextState&&(t.audioContextState=e.audioContextState),e.bufferPoolStats&&(t.bufferPoolUsedBytes=e.bufferPoolStats.used.size,t.bufferPoolAvailableBytes=e.bufferPoolStats.available,t.bufferPoolAllocations=e.bufferPoolStats.used.count),e.loadedSynthDefsCount!==void 0&&(t.loadedSynthDefs=e.loadedSynthDefsCount),e.preschedulerCapacity!==void 0&&(t.preschedulerCapacity=e.preschedulerCapacity),this.#p==="postMessage"&&e.transportMetrics&&Object.assign(t,e.transportMetrics),t}updateMergedArray(e={}){let t=this.#a;if(this.#p==="postMessage"){if(e.preschedulerMetrics&&this.overlayPreschedulerMetrics(e.preschedulerMetrics),this.#c){let a=new Uint32Array(this.#c,0,46);t.set(a)}e.transportMetrics&&(e.transportMetrics.oscOutMessagesSent!==void 0&&(t[24]=e.transportMetrics.oscOutMessagesSent),e.transportMetrics.oscOutBytesSent!==void 0&&(t[25]=e.transportMetrics.oscOutBytesSent),e.transportMetrics.preschedulerBypassed!==void 0&&(t[22]=e.transportMetrics.preschedulerBypassed),e.transportMetrics.bypassNonBundle!==void 0&&(t[38]=e.transportMetrics.bypassNonBundle),e.transportMetrics.bypassImmediate!==void 0&&(t[39]=e.transportMetrics.bypassImmediate),e.transportMetrics.bypassNearFuture!==void 0&&(t[40]=e.transportMetrics.bypassNearFuture),e.transportMetrics.bypassLate!==void 0&&(t[41]=e.transportMetrics.bypassLate))}else this.#r&&t.set(this.#r);let s=this.#l;s.setInt32(46*4,e.driftOffsetMs??0,!0),s.setInt32(47*4,e.clockOffsetMs??0,!0);let r=e.audioContextState||"unknown",n={unknown:0,running:1,suspended:2,closed:3,interrupted:4};t[48]=n[r]??0,e.bufferPoolStats&&(t[49]=e.bufferPoolStats.used?.size??0,t[50]=e.bufferPoolStats.available??0,t[51]=e.bufferPoolStats.used?.count??0),t[52]=e.loadedSynthDefsCount??0;let o=this.#t;t[53]=o?.scheduler_slot_count??0,t[54]=e.preschedulerCapacity??0,t[55]=o?.IN_BUFFER_SIZE??0,t[56]=o?.OUT_BUFFER_SIZE??0,t[57]=o?.DEBUG_BUFFER_SIZE??0,t[58]=this.#p==="sab"?0:1}getMergedArray(){return this.#a}get bufferConstants(){return this.#t}get ringBufferBase(){return this.#e}get sharedBuffer(){return this.#i}};function J(i){return i/1e3+2208988800}function Te(i,e){return i-e}function ht(i,e){let t=i-e;return Math.round(t*1e3)}var ee=class{#i;#e;#t;#p;#n;#r;#u;#c;#a;#l=0;#f=0;#m=null;constructor(e={}){this.#i=e.mode||"sab",this.#e=e.audioContext,this.#t=e.workletPort||null}initSharedViews(e,t,s){this.#n=t,this.#p=s,this.#i==="sab"&&e&&s&&(this.#r=new Float64Array(e,t+s.NTP_START_TIME_START,1),this.#u=new Int32Array(e,t+s.DRIFT_OFFSET_START,1),this.#c=new Int32Array(e,t+s.GLOBAL_OFFSET_START,1))}setWorkletPort(e){this.#t=e}updateAudioContext(e){this.#e=e}async initialize(){if(!this.#e)return;let e;for(;e=this.#e.getOutputTimestamp(),!(e.contextTime>0);)await new Promise(o=>setTimeout(o,50));e=this.#e.getOutputTimestamp();let t=performance.timeOrigin+e.performanceTime,s=J(t),r=e.contextTime,n=Te(s,r);this.#i==="sab"&&this.#r?this.#r[0]=n:this.#t&&this.#t.postMessage({type:"setNTPStartTime",ntpStartTime:n}),this.#a=n,await new Promise(o=>setTimeout(o,500)),this.updateDriftOffset()}updateDriftOffset(){if(!this.#e||this.#a===void 0)return;let e=this.#e.getOutputTimestamp(),t=performance.timeOrigin+e.performanceTime,r=J(t)-this.#a,n=ht(r,e.contextTime);this.#l=n,this.#i==="sab"&&this.#u?Atomics.store(this.#u,0,n):this.#t&&this.#t.postMessage({type:"setDriftOffset",driftOffsetMs:n})}resync(){if(!this.#e)return;let e=this.#e.getOutputTimestamp();if(!e||e.contextTime<=0)return;let t=performance.timeOrigin+e.performanceTime,s=J(t),r=Te(s,e.contextTime);this.#i==="sab"&&this.#r?this.#r[0]=r:this.#t&&this.#t.postMessage({type:"setNTPStartTime",ntpStartTime:r}),this.#a=r,this.updateDriftOffset()}startDriftTimer(){this.stopDriftTimer(),this.#m=setInterval(()=>{this.updateDriftOffset()},1e3)}stopDriftTimer(){this.#m&&(clearInterval(this.#m),this.#m=null)}getDriftOffset(){return this.#u?Atomics.load(this.#u,0):this.#l}getNTPStartTime(){return this.#r?this.#r[0]:this.#a??0}getClockOffset(){return this.#c?Atomics.load(this.#c,0):this.#f}setClockOffset(e){let t=Math.round(e*1e3);this.#f=t,this.#i==="sab"&&this.#c?Atomics.store(this.#c,0,t):this.#t&&this.#t.postMessage({type:"setClockOffset",clockOffsetMs:t})}calculateBundleWait(e){if(e.length<16||String.fromCharCode.apply(null,e.slice(0,8))!=="#bundle\0")return null;let s=this.getNTPStartTime();if(s===0)return console.warn("[NTPTiming] NTP start time not yet initialized"),null;let n=this.getDriftOffset()/1e3,a=this.getClockOffset()/1e3,c=s+n+a,u=new DataView(e.buffer,e.byteOffset),l=u.getUint32(8,!1),f=u.getUint32(12,!1);if(l===0&&(f===0||f===1))return null;let E=l+f/4294967296-c,p=this.#e?.currentTime??0;return{audioTimeS:E,currentTimeS:p}}reset(){this.stopDriftTimer(),this.#a=void 0,this.#l=0,this.#f=0,this.#r=null,this.#u=null,this.#c=null}};var te=class{#i;#e;#t;constructor(e={}){this.#i=e.sharedBuffer||null,this.#e=e.bufferConstants||null,this.#t=e.ringBufferBase||0}update(e,t,s){this.#i=e,this.#t=t,this.#e=s}isAvailable(){return!!(this.#i&&this.#e)}start(){if(!this.isAvailable())throw new Error("AudioCapture not initialized");let e=this.#e,t=this.#t+e.AUDIO_CAPTURE_START,s=new Uint32Array(this.#i,t,4);Atomics.store(s,1,0),Atomics.store(s,0,1)}stop(){if(!this.isAvailable())throw new Error("AudioCapture not initialized");let e=this.#e,t=this.#t+e.AUDIO_CAPTURE_START,s=new Uint32Array(this.#i,t,4);Atomics.store(s,0,0);let r=Atomics.load(s,1),n=s[2],o=s[3],a=t+e.AUDIO_CAPTURE_HEADER_SIZE,c=new Float32Array(this.#i,a,r*o),u=new Float32Array(r),l=o>1?new Float32Array(r):null;for(let f=0;f<r;f++)u[f]=c[f*o],l&&(l[f]=c[f*o+1]);return{sampleRate:n,channels:o,frames:r,left:u,right:l}}isEnabled(){if(!this.isAvailable())return!1;let e=this.#e,t=this.#t+e.AUDIO_CAPTURE_START,s=new Uint32Array(this.#i,t,1);return Atomics.load(s,0)===1}getFrameCount(){if(!this.isAvailable())return 0;let e=this.#e,t=this.#t+e.AUDIO_CAPTURE_START,s=new Uint32Array(this.#i,t,2);return Atomics.load(s,1)}getMaxDuration(){if(!this.#e)return 0;let e=this.#e;return e.AUDIO_CAPTURE_FRAMES/(e.AUDIO_CAPTURE_SAMPLE_RATE||48e3)}};function dt(i,e,t){let s=t,r=new Uint32Array(i,e,3),n=r[0],o=r[1],a=r[2],c=e+s.NODE_TREE_HEADER_SIZE,u=s.NODE_TREE_MIRROR_MAX_NODES,l=s.NODE_TREE_ENTRY_SIZE,f=s.NODE_TREE_DEF_NAME_SIZE,h=new DataView(i,c,u*l),E=new TextDecoder("utf-8"),p=[],g=0;for(let m=0;m<u&&g<n;m++){let S=m*l,_=h.getInt32(S,!0);if(_===-1)continue;g++;let d=c+S+24,M=new Uint8Array(i,d,f),ce=new Uint8Array(f);ce.set(M);let le=ce.indexOf(0);le===-1&&(le=f);let Ut=E.decode(ce.subarray(0,le));p.push({id:_,parentId:h.getInt32(S+4,!0),isGroup:h.getInt32(S+8,!0)===1,prevId:h.getInt32(S+12,!0),nextId:h.getInt32(S+16,!0),headId:h.getInt32(S+20,!0),defName:Ut})}return{nodeCount:n,version:o,droppedCount:a,nodes:p}}var De=new Uint8Array(2097152),pt=new DataView(De.buffer),y=De,b=pt,Ae=new Map,Zs=1e3,Xs=new TextDecoder,Ks=new TextEncoder,ke=2208988800,ie=4294967296,Le=new Uint8Array([35,98,117,110,100,108,101,0]),mt=44,we=105,Me=102,Ce=115,Re=98,Oe=84,Ue=70,yt=104,St=100,Et=116,gt=117;function se(i,e){let t=i.length+4;t+=e.length+4;for(let s of e)if(s instanceof Uint8Array)t+=4+s.length+3;else if(s instanceof ArrayBuffer)t+=4+s.byteLength+3;else if(typeof s=="string")t+=s.length*3+4;else if(s&&s.type==="string")t+=s.value.length*3+4;else if(s&&s.type==="blob"){let r=s.value,n=r instanceof Uint8Array?r.length:r.byteLength;t+=4+n+3}else s&&s.type==="uuid"?t+=16:t+=8;return t}function _t(i){let e=16;for(let t of i)e+=4,Array.isArray(t)?e+=se(t[0],t.slice(1)):t.packets!==void 0?e+=_t(t.packets):e+=se(t.address,t.args||[]);return e}function Pe(i){if(i<=2097152){y=De,b=pt;return}y=new Uint8Array(i),b=new DataView(y.buffer)}function bt(i,e=[]){let t=se(i,e);Pe(t);let s=0;s=Fe(i,s),s=Ne(e,s);for(let r=0;r<e.length;r++)s=ne(e[r],s);return y.subarray(0,s)}function Tt(i,e){let t=_t(e);Pe(t);let s=0;y.set(Le,s),s+=8,s=oe(i,s);for(let r=0;r<e.length;r++){let n=e[r],o=s;s+=4;let a=s;Array.isArray(n)?s=re(n[0],n.slice(1),s):n.packets!==void 0?s=Bt(n.timeTag,n.packets,s):s=re(n.address,n.args||[],s);let c=s-a;b.setUint32(o,c,!1)}return y.subarray(0,s)}function At(i,e,t=[]){let s=20+se(e,t);Pe(s);let r=0;y.set(Le,r),r+=8,r=oe(i,r);let n=r;r+=4;let o=r;r=Fe(e,r),r=Ne(t,r);for(let a=0;a<t.length;a++)r=ne(t[a],r);return b.setUint32(n,r-o,!1),y.subarray(0,r)}function re(i,e,t){t=Fe(i,t),t=Ne(e,t);for(let s=0;s<e.length;s++)t=ne(e[s],t);return t}function Bt(i,e,t){y.set(Le,t),t+=8,t=oe(i,t);for(let s=0;s<e.length;s++){let r=e[s],n=t;t+=4;let o=t;Array.isArray(r)?t=re(r[0],r.slice(1),t):r.packets!==void 0?t=Bt(r.timeTag,r.packets,t):t=re(r.address,r.args||[],t),b.setUint32(n,t-o,!1)}return t}function Fe(i,e){let t=Ae.get(i);if(t)return y.set(t,e),e+t.length;let s=e;if(e=Ie(i,e),Ae.size<Zs){let r=y.slice(s,e);Ae.set(i,r)}return e}function Ie(i,e){let t=!1;for(let s=0;s<i.length;s++)if(i.charCodeAt(s)>=128){t=!0;break}if(t){let s=Ks.encodeInto(i,y.subarray(e));e+=s.written}else for(let s=0;s<i.length;s++)y[e++]=i.charCodeAt(s);for(y[e++]=0;e&3;)y[e++]=0;return e}function Ne(i,e){y[e++]=mt;for(let t=0;t<i.length;t++){let s=i[t],r=typeof s;if(r==="number")y[e++]=Number.isInteger(s)?we:Me;else if(r==="string")y[e++]=Ce;else if(r==="boolean")y[e++]=s?Oe:Ue;else if(s instanceof Uint8Array||s instanceof ArrayBuffer)y[e++]=Re;else if(s&&s.type==="int")y[e++]=we;else if(s&&s.type==="float")y[e++]=Me;else if(s&&s.type==="string")y[e++]=Ce;else if(s&&s.type==="blob")y[e++]=Re;else if(s&&s.type==="bool")y[e++]=s.value?Oe:Ue;else if(s&&s.type==="int64")y[e++]=yt;else if(s&&s.type==="double")y[e++]=St;else if(s&&s.type==="timetag")y[e++]=Et;else if(s&&s.type==="uuid")y[e++]=gt;else throw s==null?new Error(`OSC argument at index ${t} is ${s}`):new Error(`Unknown OSC argument type at index ${t}: ${r}`)}for(y[e++]=0;e&3;)y[e++]=0;return e}function ne(i,e){let t=typeof i;if(t==="number")return Number.isInteger(i)?(b.setInt32(e,i,!1),e+4):(b.setFloat32(e,i,!1),e+4);if(t==="string")return Ie(i,e);if(t==="boolean")return e;if(i instanceof Uint8Array){let s=i.length;for(b.setUint32(e,s,!1),e+=4,y.set(i,e),e+=s;e&3;)y[e++]=0;return e}if(i instanceof ArrayBuffer)return ne(new Uint8Array(i),e);if(i&&i.type==="int")return b.setInt32(e,i.value,!1),e+4;if(i&&i.type==="float")return b.setFloat32(e,i.value,!1),e+4;if(i&&i.type==="string")return Ie(i.value,e);if(i&&i.type==="blob"){let s=i.value instanceof Uint8Array?i.value:new Uint8Array(i.value),r=s.length;for(b.setUint32(e,r,!1),e+=4,y.set(s,e),e+=r;e&3;)y[e++]=0;return e}return i&&i.type==="bool"?e:i&&i.type==="int64"?(b.setBigInt64(e,BigInt(i.value),!1),e+8):i&&i.type==="double"?(b.setFloat64(e,i.value,!1),e+8):i&&i.type==="timetag"?oe(i.value,e):i&&i.type==="uuid"?(y.set(i.value,e),e+16):e}function oe(i,e){if(i===1||i===null||i===void 0)return b.setUint32(e,0,!1),b.setUint32(e+4,1,!1),e+8;if(Array.isArray(i)){if(i.length!==2)throw new Error(`TimeTag array must have exactly 2 elements [seconds, fraction], got ${i.length}`);return b.setUint32(e,i[0]>>>0,!1),b.setUint32(e+4,i[1]>>>0,!1),e+8}if(typeof i!="number")throw new TypeError(`TimeTag must be a number, array, null, or undefined, got ${typeof i}`);i>1&&i<ke&&console.warn(`TimeTag ${i} looks like a Unix timestamp (< NTP_EPOCH_OFFSET). Did you mean to add NTP_EPOCH_OFFSET (2208988800)?`);let t=i>>>0,s=(i-Math.floor(i))*ie>>>0;return b.setUint32(e,t,!1),b.setUint32(e+4,s,!1),e+8}function Y(i){return i instanceof Uint8Array||(i=new Uint8Array(i)),i[0]===35&&i[1]===98?Qs(i):js(i)}function js(i){i instanceof Uint8Array||(i=new Uint8Array(i));let e=new DataView(i.buffer,i.byteOffset,i.byteLength),t=0,[s,r]=Be(i,t);if(t=r,t>=i.length||i[t]!==mt)return[s];let[n,o]=Be(i,t);t=o;let a=[s];for(let c=1;c<n.length;c++)switch(n.charCodeAt(c)){case we:a.push(e.getInt32(t,!1)),t+=4;break;case Me:a.push(e.getFloat32(t,!1)),t+=4;break;case Ce:let[l,f]=Be(i,t);a.push(l),t=f;break;case Re:let h=e.getUint32(t,!1);t+=4,a.push(i.slice(t,t+h)),t+=h,t=t+3&-4;break;case yt:a.push(e.getBigInt64(t,!1)),t+=8;break;case St:a.push(e.getFloat64(t,!1)),t+=8;break;case Oe:a.push(!0);break;case Ue:a.push(!1);break;case Et:let E=e.getUint32(t,!1),p=e.getUint32(t+4,!1);a.push(E+p/ie),t+=8;break;case gt:a.push({type:"uuid",value:i.slice(t,t+16)}),t+=16;break}return a}function Qs(i){i instanceof Uint8Array||(i=new Uint8Array(i));let e=new DataView(i.buffer,i.byteOffset,i.byteLength),t=8,s=e.getUint32(t,!1),r=e.getUint32(t+4,!1),n=s+r/ie;t+=8;let o=[];for(;t<i.length;){let a=e.getUint32(t,!1);if(t+=4,a>0&&t+a<=i.length){let c=i.subarray(t,t+a);o.push(Y(c))}t+=a}return{timeTag:n,packets:o}}function Be(i,e){let t=e;for(;t<i.length&&i[t]!==0;)t++;let s=Xs.decode(i.subarray(e,t));return t++,t=t+3&-4,[s,t]}function ae(i){return i.slice()}function Js(i){return!i||i.length<8?!1:i[0]===35&&i[1]===98}function xe(i){if(!Js(i))return null;let e=new DataView(i.buffer,i.byteOffset,i.byteLength),t=e.getUint32(8,!1),s=e.getUint32(12,!1);return t+s/ie}var wt={totalPages:1280,ringBufferReserved:3145728,bufferPoolOffset:19922944,bufferPoolSize:63963136,get totalMemory(){return this.bufferPoolOffset+this.bufferPoolSize},get wasmHeapSize(){return this.bufferPoolOffset-this.ringBufferReserved}};var Mt={numBuffers:1024,maxNodes:1024,maxGraphDefs:1024,maxWireBufs:64,numAudioBusChannels:128,numInputBusChannels:2,numOutputBusChannels:2,numControlBusChannels:4096,bufLength:128,realTimeMemorySize:8192,numRGens:64,realTime:!1,memoryLocking:!1,loadGraphDefs:0,preferredSampleRate:0,verbosity:0};var ir=new Set(["/b_alloc","/b_allocRead","/b_allocReadChannel","/b_allocFile"]),T=[];for(let i=0;i<256;i++)T[i]=i.toString(16).padStart(2,"0");function Rt(i){return T[i[0]]+T[i[1]]+T[i[2]]+T[i[3]]+"-"+T[i[4]]+T[i[5]]+"-"+T[i[6]]+T[i[7]]+"-"+T[i[8]]+T[i[9]]+"-"+T[i[10]]+T[i[11]]+T[i[12]]+T[i[13]]+T[i[14]]+T[i[15]]}function Ct(i,e){if(i&&i.type==="uuid"&&i.value)return Rt(i.value);if(i instanceof Uint8Array||i instanceof ArrayBuffer)return`<${i.byteLength||i.length} bytes>`;let t=JSON.stringify(i);return e&&t.length>e?t.slice(0,e)+"...":t}function G(i){return String(i).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Ot(i,e,t){if(i&&i.type==="uuid"&&i.value)return`<span class="supersonic-scsynth-string">${Rt(i.value)}</span>`;let s=i,r=null;if(typeof i=="object"&&i!==null&&i.value!==void 0&&(s=i.value,r=i.type),r==="b"||s instanceof Uint8Array||s instanceof ArrayBuffer)return`<span class="supersonic-scsynth-binary"><${s.byteLength??s.length??"?"} bytes></span>`;let n=r==="f"||r===null&&typeof s=="number"&&!Number.isInteger(s),o=r==="i"||r===null&&Number.isInteger(s),c=e==="/s_new"&&t>=4&&(t-4)%2===0&&typeof s=="string";return n?`<span class="supersonic-scsynth-float">${parseFloat(s.toFixed(3))}</span>`:o?`<span class="supersonic-scsynth-int">${s}</span>`:c?`<span class="supersonic-scsynth-param">${G(s)}</span>`:typeof s=="string"?`<span class="supersonic-scsynth-string">${G(JSON.stringify(s))}</span>`:`<span class="supersonic-scsynth-string">${G(s)}</span>`}function ve(i,e,t,s,r){let n=i[0],o=i.slice(1),a=s&&t?(t-s).toFixed(2):"",c=`<span class="supersonic-scsynth-seq">[${e}]</span>`;if(a&&(c+=` <span class="supersonic-scsynth-time">${a}</span>`),r!==void 0&&(c+=` <span class="supersonic-scsynth-source">ch${r}</span>`),c+=` <span class="supersonic-scsynth-address">${G(n)}</span>`,o.length>0){let u=o.map((l,f)=>Ot(l,n,f)).join(", ");c+=" "+u}return c}function nr(i,e,t,s,r){if(!i.packets)return ve(i,e,t,s,r);if(i.packets.length===1)return ve(i.packets[0],e,t,s,r);let n=s&&t?(t-s).toFixed(2):"",o=`<span class="supersonic-scsynth-seq">[${e}]</span>`;n&&(o+=` <span class="supersonic-scsynth-time">${n}</span>`),r!==void 0&&(o+=` <span class="supersonic-scsynth-source">ch${r}</span>`),o+=` <span class="supersonic-scsynth-bundle">Bundle (${i.packets.length})</span>`;for(let a of i.packets){let c=a[0],u=a.slice(1);o+=`<br><span class="supersonic-scsynth-address">${G(c)}</span>`,u.length>0&&(o+=" "+u.map((l,f)=>Ot(l,c,f)).join(", "))}return o}var He=class i{static osc={encodeMessage:(e,t)=>ae(bt(e,t)),encodeBundle:(e,t)=>ae(Tt(e,t)),decode:e=>Y(e),encodeSingleBundle:(e,t,s)=>ae(At(e,t,s)),readTimetag:e=>fe(e),ntpNow:()=>A(),NTP_EPOCH_OFFSET:ke};static#i=null;static getMetricsSchema(){return this.#i??={metrics:{scsynthProcessCount:{offset:0,type:"counter",unit:"count",description:"Audio process() calls"},scsynthMessagesProcessed:{offset:1,type:"counter",unit:"count",description:"OSC messages processed by scsynth"},scsynthMessagesDropped:{offset:2,type:"counter",unit:"count",description:"Messages dropped (ring buffer full)"},scsynthSchedulerDepth:{offset:3,type:"gauge",unit:"count",description:"Current scheduler queue depth"},scsynthSchedulerPeakDepth:{offset:4,type:"gauge",unit:"count",description:"Peak scheduler queue depth (high water mark)"},scsynthSchedulerDropped:{offset:5,type:"counter",unit:"count",description:"Scheduled events dropped"},scsynthSequenceGaps:{offset:6,type:"counter",unit:"count",description:"Messages lost in transit from JS to scsynth"},scsynthWasmErrors:{offset:7,type:"counter",unit:"count",description:"WASM execution errors in audio worklet"},scsynthSchedulerLates:{offset:8,type:"counter",unit:"count",description:"Bundles executed after their scheduled time"},preschedulerPending:{offset:9,type:"gauge",unit:"count",description:"Events waiting to be scheduled"},preschedulerPendingPeak:{offset:10,type:"gauge",unit:"count",description:"Peak pending events"},preschedulerBundlesScheduled:{offset:11,type:"counter",unit:"count",description:"Bundles scheduled"},preschedulerDispatched:{offset:12,type:"counter",unit:"count",description:"Events sent to worklet"},preschedulerEventsCancelled:{offset:13,type:"counter",unit:"count",description:"Events cancelled"},preschedulerMinHeadroomMs:{offset:14,type:"gauge",unit:"ms",description:"Smallest time gap between JS prescheduler dispatch and scsynth scheduler execution"},preschedulerLates:{offset:15,type:"counter",unit:"count",description:"Bundles dispatched after their scheduled execution time"},preschedulerRetriesSucceeded:{offset:16,type:"counter",unit:"count",description:"Retries that succeeded"},preschedulerRetriesFailed:{offset:17,type:"counter",unit:"count",description:"Retries that failed"},preschedulerRetryQueueSize:{offset:18,type:"gauge",unit:"count",description:"Current retry queue size"},preschedulerRetryQueuePeak:{offset:19,type:"gauge",unit:"count",description:"Peak retry queue size"},preschedulerMessagesRetried:{offset:20,type:"counter",unit:"count",description:"Messages that needed retry"},preschedulerTotalDispatches:{offset:21,type:"counter",unit:"count",description:"Total dispatch attempts"},preschedulerBypassed:{offset:22,type:"counter",unit:"count",description:"Messages sent directly from JS to scsynth, bypassing prescheduler (aggregate)"},preschedulerMaxLateMs:{offset:23,type:"gauge",unit:"ms",description:"Maximum lateness at prescheduler (ms)"},oscOutMessagesSent:{offset:24,type:"counter",unit:"count",description:"OSC messages sent from JS to scsynth"},oscOutBytesSent:{offset:25,type:"counter",unit:"bytes",description:"Total bytes sent from JS to scsynth"},oscInMessagesReceived:{offset:26,type:"counter",unit:"count",description:"OSC replies received from scsynth to JS"},oscInBytesReceived:{offset:27,type:"counter",unit:"bytes",description:"Total bytes received from scsynth to JS"},oscInMessagesDropped:{offset:28,type:"counter",unit:"count",description:"Replies lost in transit from scsynth to JS"},oscInCorrupted:{offset:29,type:"counter",unit:"count",description:"Corrupted messages detected from scsynth to JS"},debugMessagesReceived:{offset:30,type:"counter",unit:"count",description:"Debug messages from scsynth"},debugBytesReceived:{offset:31,type:"counter",unit:"bytes",description:"Debug bytes received"},inBufferUsedBytes:{offset:32,type:"gauge",unit:"bytes",description:"Bytes used in IN ring buffer"},outBufferUsedBytes:{offset:33,type:"gauge",unit:"bytes",description:"Bytes used in OUT ring buffer"},debugBufferUsedBytes:{offset:34,type:"gauge",unit:"bytes",description:"Bytes used in DEBUG ring buffer"},inBufferPeakBytes:{offset:35,type:"gauge",unit:"bytes",description:"Peak bytes used in IN ring buffer"},outBufferPeakBytes:{offset:36,type:"gauge",unit:"bytes",description:"Peak bytes used in OUT ring buffer"},debugBufferPeakBytes:{offset:37,type:"gauge",unit:"bytes",description:"Peak bytes used in DEBUG ring buffer"},bypassNonBundle:{offset:38,type:"counter",unit:"count",description:"Plain OSC messages (not bundles) that bypassed prescheduler"},bypassImmediate:{offset:39,type:"counter",unit:"count",description:"Bundles with timetag 0 or 1 that bypassed prescheduler"},bypassNearFuture:{offset:40,type:"counter",unit:"count",description:"Bundles within bypass lookahead threshold that bypassed prescheduler"},bypassLate:{offset:41,type:"counter",unit:"count",description:"Timestamped OSC bundles arriving late into SuperSonic bypassing prescheduler"},scsynthSchedulerMaxLateMs:{offset:42,type:"gauge",unit:"ms",description:"Maximum lateness observed in scsynth scheduler (ms)"},scsynthSchedulerLastLateMs:{offset:43,type:"gauge",unit:"ms",description:"Most recent late magnitude in scsynth scheduler (ms)"},scsynthSchedulerLastLateTick:{offset:44,type:"gauge",unit:"count",description:"Process count when last scsynth late occurred"},ringBufferDirectWriteFails:{offset:45,type:"counter",unit:"count",description:"SAB mode only: optimistic direct writes attempted but failed due to ring buffer lock not being available (delivered via prescheduler instead)"},driftOffsetMs:{offset:46,type:"gauge",unit:"ms",signed:!0,description:"Clock drift between AudioContext and wall clock"},clockOffsetMs:{offset:47,type:"gauge",unit:"ms",signed:!0,description:"Clock offset for multi-system sync"},audioContextState:{offset:48,type:"enum",values:["unknown","running","suspended","closed","interrupted"],description:"AudioContext state"},bufferPoolUsedBytes:{offset:49,type:"gauge",unit:"bytes",description:"Buffer pool bytes used"},bufferPoolAvailableBytes:{offset:50,type:"gauge",unit:"bytes",description:"Buffer pool bytes available"},bufferPoolAllocations:{offset:51,type:"counter",unit:"count",description:"Total buffer allocations"},loadedSynthDefs:{offset:52,type:"gauge",unit:"count",description:"Number of loaded synthdefs"},scsynthSchedulerCapacity:{offset:53,type:"constant",unit:"count",description:"Maximum scheduler queue size"},preschedulerCapacity:{offset:54,type:"constant",unit:"count",description:"Maximum pending events in prescheduler"},inBufferCapacity:{offset:55,type:"constant",unit:"bytes",description:"IN ring buffer capacity"},outBufferCapacity:{offset:56,type:"constant",unit:"bytes",description:"OUT ring buffer capacity"},debugBufferCapacity:{offset:57,type:"constant",unit:"bytes",description:"DEBUG ring buffer capacity"},mode:{offset:58,type:"enum",values:["sab","postMessage"],description:"Transport mode"}},layout:{panels:[{title:"OSC Out",rows:[{label:"sent",cells:[{key:"oscOutMessagesSent"}]},{label:"bytes",cells:[{key:"oscOutBytesSent",kind:"muted",format:"bytes"}]},{label:"bypass",cells:[{key:"preschedulerBypassed",kind:"green"}]},{label:"lost",cells:[{key:"scsynthSequenceGaps",kind:"error"}]}]},{title:"Bypass",rows:[{label:"msg",cells:[{key:"bypassNonBundle",kind:"muted"}]},{label:"imm",cells:[{key:"bypassImmediate",kind:"muted"}]},{label:"near",cells:[{key:"bypassNearFuture",kind:"muted"}]},{label:"late",cells:[{key:"bypassLate",kind:"muted"}]}]},{title:"OSC In",rows:[{label:"received",cells:[{key:"oscInMessagesReceived"}]},{label:"bytes",cells:[{key:"oscInBytesReceived",kind:"muted",format:"bytes"}]},{label:"dropped",cells:[{key:"oscInMessagesDropped",kind:"error"}]},{label:"corrupted",cells:[{key:"oscInCorrupted",kind:"error"}]}]},{title:"Presched Flow",rows:[{label:"pending",cells:[{key:"preschedulerPending"},{sep:" | "},{key:"preschedulerPendingPeak",kind:"muted"}]},{label:"scheduled",cells:[{key:"preschedulerBundlesScheduled"}]},{label:"dispatched",cells:[{key:"preschedulerDispatched",kind:"dim"}]},{label:"min slack",cells:[{key:"preschedulerMinHeadroomMs",kind:"dim",format:"headroom"},{text:" ms",kind:"muted"}]}]},{title:"Presched Health",rows:[{label:"lates",cells:[{key:"preschedulerLates",kind:"error"},{sep:" ("},{key:"preschedulerMaxLateMs",kind:"dim"},{text:"ms max)",kind:"muted"}]},{label:"cancelled",cells:[{key:"preschedulerEventsCancelled",kind:"error"}]},{label:"retried",cells:[{key:"preschedulerMessagesRetried",kind:"dim"},{sep:" | "},{key:"preschedulerRetriesSucceeded",kind:"green"},{sep:" | "},{key:"preschedulerRetriesFailed",kind:"error"}]},{label:"retry queue",cells:[{key:"preschedulerRetryQueueSize"},{sep:" | "},{key:"preschedulerRetryQueuePeak",kind:"muted"}]}]},{title:"scsynth Scheduler",rows:[{label:"queue",cells:[{key:"scsynthSchedulerDepth"},{sep:" | "},{key:"scsynthSchedulerPeakDepth",kind:"muted"}]},{label:"dropped",cells:[{key:"scsynthSchedulerDropped",kind:"error"}]},{label:"lates",cells:[{key:"scsynthSchedulerLates",kind:"error"}]},{label:"max | last",cells:[{key:"scsynthSchedulerMaxLateMs",kind:"error"},{sep:" | "},{key:"scsynthSchedulerLastLateMs",kind:"dim"},{text:" ms",kind:"muted"}]}]},{title:"scsynth",rows:[{label:"processed",cells:[{key:"scsynthMessagesProcessed"}]},{label:"dropped",cells:[{key:"scsynthMessagesDropped",kind:"error"}]},{label:"synthdefs",cells:[{key:"loadedSynthDefs"}]},{label:"clock drift",cells:[{key:"driftOffsetMs",format:"signed"},{text:"ms",kind:"muted"}]}]},{title:"Ring Buffer Level",class:"wide",rows:[{type:"bar",label:"in",usedKey:"inBufferUsedBytes",peakKey:"inBufferPeakBytes",capacityKey:"inBufferCapacity",color:"blue"},{type:"bar",label:"out",usedKey:"outBufferUsedBytes",peakKey:"outBufferPeakBytes",capacityKey:"outBufferCapacity",color:"green"},{type:"bar",label:"dbg",usedKey:"debugBufferUsedBytes",peakKey:"debugBufferPeakBytes",capacityKey:"debugBufferCapacity",color:"purple"},{label:"direct write fails",cells:[{key:"ringBufferDirectWriteFails",kind:"error"}]}]},{title:"AudioWorklet",rows:[{label:"audio",cells:[{key:"audioContextState",kind:"green",format:"enum"}]},{label:"ticks",cells:[{key:"scsynthProcessCount",kind:"dim"}]},{label:"WASM errors",cells:[{key:"scsynthWasmErrors",kind:"error"}]},{label:"debug",cells:[{key:"debugMessagesReceived",kind:"muted"},{text:" ("},{key:"debugBytesReceived",kind:"muted",format:"bytes"},{text:")"}]}]},{title:"Audio Buffers",rows:[{label:"used",cells:[{key:"bufferPoolUsedBytes",format:"bytes"}]},{label:"free",cells:[{key:"bufferPoolAvailableBytes",kind:"green",format:"bytes"}]},{label:"allocs",cells:[{key:"bufferPoolAllocations",kind:"dim"}]}]}]},sentinels:{HEADROOM_UNSET:4294967295}}}static getTreeSchema(){return{nodeCount:{type:"number",description:"Total nodes in tree"},version:{type:"number",description:"Increments on any tree change, useful for detecting updates"},droppedCount:{type:"number",description:"Nodes that exceeded mirror capacity (tree may be incomplete)"},root:{type:"object",description:"Root node of the tree (always a group with id 0)",schema:{id:{type:"number",description:"Unique node ID"},type:{type:"string",values:["group","synth"],description:"Node type"},defName:{type:"string",description:"Synthdef name (synths only, empty for groups)"},children:{type:"array",description:"Child nodes (recursive)",itemSchema:"(self)"}}}}}static getRawTreeSchema(){return{nodeCount:{type:"number",description:"Total nodes in tree"},version:{type:"number",description:"Increments on any tree change, useful for detecting updates"},droppedCount:{type:"number",description:"Nodes that exceeded mirror capacity (tree may be incomplete)"},nodes:{type:"array",description:"Flat array of all nodes with internal linkage pointers",itemSchema:{id:{type:"number",description:"Unique node ID"},parentId:{type:"number",description:"Parent node ID (-1 for root)"},isGroup:{type:"boolean",description:"True if group, false if synth"},prevId:{type:"number",description:"Previous sibling node ID (-1 if none)"},nextId:{type:"number",description:"Next sibling node ID (-1 if none)"},headId:{type:"number",description:"First child node ID (groups only, -1 if empty)"},defName:{type:"string",description:"Synthdef name (synths only, empty for groups)"}}}}}#e;#t;#p=null;#n;#r;#u;#c;#a;#l;#f;#m;#_;#h;#y;#d;#b;#g;#s;#o;#S;#E;#A;#w;#B=1e3;#M=null;#R=null;#I=0;#O=[];#C=null;#U=Promise.resolve();#$(e){let t=(s,r,{min:n,max:o,allowZero:a=!0}={})=>{if(typeof r!="number"||!Number.isFinite(r))throw new Error(`scsynthOptions.${s} must be a finite number, got: ${r}`);if(!a&&r===0)throw new Error(`scsynthOptions.${s} must be non-zero, got: ${r}`);if(n!==void 0&&r<n)throw new Error(`scsynthOptions.${s} must be >= ${n}, got: ${r}`);if(o!==void 0&&r>o)throw new Error(`scsynthOptions.${s} must be <= ${o}, got: ${r}`)};if(t("numBuffers",e.numBuffers,{min:1,max:65535}),t("maxNodes",e.maxNodes,{min:1}),t("maxGraphDefs",e.maxGraphDefs,{min:1}),t("maxWireBufs",e.maxWireBufs,{min:1}),t("numAudioBusChannels",e.numAudioBusChannels,{min:1}),t("numInputBusChannels",e.numInputBusChannels,{min:0}),t("numOutputBusChannels",e.numOutputBusChannels,{min:1,max:128}),t("numControlBusChannels",e.numControlBusChannels,{min:1}),e.bufLength!==128)throw new Error(`scsynthOptions.bufLength must be 128 (WebAudio API constraint), got: ${e.bufLength}`);if(t("realTimeMemorySize",e.realTimeMemorySize,{min:1}),t("numRGens",e.numRGens,{min:1}),typeof e.realTime!="boolean")throw new Error(`scsynthOptions.realTime must be a boolean, got: ${typeof e.realTime}`);if(typeof e.memoryLocking!="boolean")throw new Error(`scsynthOptions.memoryLocking must be a boolean, got: ${typeof e.memoryLocking}`);if(e.loadGraphDefs!==0&&e.loadGraphDefs!==1)throw new Error(`scsynthOptions.loadGraphDefs must be 0 or 1, got: ${e.loadGraphDefs}`);if(t("preferredSampleRate",e.preferredSampleRate,{min:0,max:384e3}),e.preferredSampleRate!==0&&e.preferredSampleRate<8e3)throw new Error(`scsynthOptions.preferredSampleRate must be 0 (auto) or >= 8000, got: ${e.preferredSampleRate}`);t("verbosity",e.verbosity,{min:0,max:4})}constructor(e={}){this.#h=!1,this.#y=!1,this.#d=null,this.#b={},this.#g=null,this.#o=new j,this.#S=new Q({mode:e.mode||"postMessage"}),this.#A=new te({}),this.#e=null,this.#t=null,this.#n=null,this.#u=null,this.loadedSynthDefs=new Map;let t=e.baseURL||null,s=e.coreBaseURL||t,r=e.workerBaseURL||(t?`${t}workers/`:null),n=e.wasmBaseURL||(s?`${s}wasm/`:null);if(!r||!n)throw new Error(`SuperSonic requires explicit URL configuration.
|
|
6
6
|
|
|
7
7
|
For CDN usage:
|
|
8
8
|
import { SuperSonic } from 'https://unpkg.com/supersonic-scsynth@VERSION/dist/supersonic.js';
|
package/package.json
CHANGED