textmode.synth.js 1.0.0-beta.3 → 1.0.0-beta.5

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.
@@ -1,7 +1,7 @@
1
- (function(g,T){typeof exports=="object"&&typeof module<"u"?T(exports):typeof define=="function"&&define.amd?define(["exports"],T):T((g=typeof globalThis<"u"?globalThis:g||self).TextmodeSynth={})})(this,function(g){"use strict";const T={src:{returnType:"vec4",args:[{type:"vec2",name:"_st"}]},coord:{returnType:"vec2",args:[{type:"vec2",name:"_st"}]},color:{returnType:"vec4",args:[{type:"vec4",name:"_c0"}]},combine:{returnType:"vec4",args:[{type:"vec4",name:"_c0"},{type:"vec4",name:"_c1"}]},combineCoord:{returnType:"vec2",args:[{type:"vec2",name:"_st"},{type:"vec4",name:"_c0"}]}},L=new class{_transforms=new Map;_processedCache=new Map;register(t){this._transforms.has(t.name)&&console.warn(`[TransformRegistry] Overwriting existing transform: ${t.name}`),this._transforms.set(t.name,t),this._processedCache.delete(t.name)}registerMany(t){for(const e of t)this.register(e)}get(t){return this._transforms.get(t)}getProcessed(t){let e=this._processedCache.get(t);if(!e){const r=this._transforms.get(t);r&&(e=(function(a){const n=T[a.type],o=[...n.args,...a.inputs.map(s=>({type:s.type,name:s.name}))].map(s=>`${s.type} ${s.name}`).join(", "),c=`
1
+ (function(g,L){typeof exports=="object"&&typeof module<"u"?L(exports):typeof define=="function"&&define.amd?define(["exports"],L):L((g=typeof globalThis<"u"?globalThis:g||self).TextmodeSynth={})})(this,function(g){"use strict";const L={src:{returnType:"vec4",args:[{type:"vec2",name:"_st"}]},coord:{returnType:"vec2",args:[{type:"vec2",name:"_st"}]},color:{returnType:"vec4",args:[{type:"vec4",name:"_c0"}]},combine:{returnType:"vec4",args:[{type:"vec4",name:"_c0"},{type:"vec4",name:"_c1"}]},combineCoord:{returnType:"vec2",args:[{type:"vec2",name:"_st"},{type:"vec4",name:"_c0"}]}},A=new class{_transforms=new Map;_processedCache=new Map;register(e){this._transforms.has(e.name)&&console.warn(`[TransformRegistry] Overwriting existing transform: ${e.name}`),this._transforms.set(e.name,e),this._processedCache.delete(e.name)}registerMany(e){for(const t of e)this.register(t)}get(e){return this._transforms.get(e)}getProcessed(e){let t=this._processedCache.get(e);if(!t){const r=this._transforms.get(e);r&&(t=(function(a){const n=L[a.type],o=[...n.args,...a.inputs.map(c=>({type:c.type,name:c.name}))].map(c=>`${c.type} ${c.name}`).join(", "),s=`
2
2
  ${n.returnType} ${a.name}(${o}) {
3
3
  ${a.glsl}
4
- }`;return{...a,glslFunction:c}})(r),this._processedCache.set(t,e))}return e}has(t){return this._transforms.has(t)}getByType(t){return Array.from(this._transforms.values()).filter(e=>e.type===t)}getNames(){return Array.from(this._transforms.keys())}getAll(){return Array.from(this._transforms.values())}getSourceTransforms(){return this.getByType("src")}remove(t){return this._processedCache.delete(t),this._transforms.delete(t)}clear(){this._transforms.clear(),this._processedCache.clear()}get size(){return this._transforms.size}},Y=new Set(["src"]),B=new class{_generatedFunctions={};_synthSourceClass=null;setSynthSourceClass(t){this._synthSourceClass=t}injectMethods(t){const e=L.getAll();for(const r of e)this._injectMethod(t,r)}_injectMethod(t,e){const{name:r,inputs:a,type:n}=e;t[r]=n==="combine"||n==="combineCoord"?function(o,...c){const s=a.map((l,f)=>c[f]??l.default);return this.addCombineTransform(r,o,s)}:function(...o){const c=a.map((s,l)=>o[l]??s.default);return this.addTransform(r,c)}}generateStandaloneFunctions(){if(!this._synthSourceClass)throw new Error("[TransformFactory] SynthSource class not set. Call setSynthSourceClass first.");const t={},e=L.getAll(),r=this._synthSourceClass;for(const a of e)if(Y.has(a.type)){const{name:n,inputs:o}=a;t[n]=(...c)=>{const s=new r,l=o.map((f,m)=>c[m]??f.default);return s.addTransform(n,l)}}return this._generatedFunctions=t,t}getGeneratedFunctions(){return this._generatedFunctions}addTransform(t,e){if(L.register(t),e&&this._injectMethod(e,t),Y.has(t.type)&&this._synthSourceClass){const r=this._synthSourceClass,{name:a,inputs:n}=t;this._generatedFunctions[a]=(...o)=>{const c=new r,s=n.map((l,f)=>o[f]??l.default);return c.addTransform(a,s)}}}},E=[{name:"osc",type:"src",inputs:[{name:"frequency",type:"float",default:60},{name:"sync",type:"float",default:.1},{name:"offset",type:"float",default:0}],glsl:`
4
+ }`;return{...a,glslFunction:s}})(r),this._processedCache.set(e,t))}return t}has(e){return this._transforms.has(e)}getByType(e){return Array.from(this._transforms.values()).filter(t=>t.type===e)}getNames(){return Array.from(this._transforms.keys())}getAll(){return Array.from(this._transforms.values())}getSourceTransforms(){return this.getByType("src")}remove(e){return this._processedCache.delete(e),this._transforms.delete(e)}clear(){this._transforms.clear(),this._processedCache.clear()}get size(){return this._transforms.size}},Y=new Set(["src"]),R=new class{_generatedFunctions={};_synthSourceClass=null;setSynthSourceClass(e){this._synthSourceClass=e}injectMethods(e){const t=A.getAll();for(const r of t)this._injectMethod(e,r)}_injectMethod(e,t){const{name:r,inputs:a,type:n}=t;e[r]=n==="combine"||n==="combineCoord"?function(o,...s){const c=a.map((l,f)=>s[f]??l.default);return this.addCombineTransform(r,o,c)}:function(...o){const s=a.map((c,l)=>o[l]??c.default);return this.addTransform(r,s)}}generateStandaloneFunctions(){if(!this._synthSourceClass)throw new Error("[TransformFactory] SynthSource class not set. Call setSynthSourceClass first.");const e={},t=A.getAll(),r=this._synthSourceClass;for(const a of t)if(Y.has(a.type)){const{name:n,inputs:o}=a;e[n]=(...s)=>{const c=new r,l=o.map((f,h)=>s[h]??f.default);return c.addTransform(n,l)}}return this._generatedFunctions=e,e}getGeneratedFunctions(){return this._generatedFunctions}addTransform(e,t){if(A.register(e),t&&this._injectMethod(t,e),Y.has(e.type)&&this._synthSourceClass){const r=this._synthSourceClass,{name:a,inputs:n}=e;this._generatedFunctions[a]=(...o)=>{const s=new r,c=n.map((l,f)=>o[f]??l.default);return s.addTransform(a,c)}}}},G=[{name:"osc",type:"src",inputs:[{name:"frequency",type:"float",default:60},{name:"sync",type:"float",default:.1},{name:"offset",type:"float",default:0}],glsl:`
5
5
  vec2 st = _st;
6
6
  float r = sin((st.x - offset/frequency + time*sync) * frequency) * 0.5 + 0.5;
7
7
  float g = sin((st.x + time*sync) * frequency) * 0.5 + 0.5;
@@ -215,29 +215,29 @@ ${a.glsl}
215
215
  return fract(st);
216
216
  `,description:"Modulate Y repeat with another source"},{name:"modulateHue",type:"combineCoord",inputs:[{name:"amount",type:"float",default:1}],glsl:`
217
217
  return _st + (vec2(_c0.g - _c0.r, _c0.b - _c0.g) * amount * 1.0 / resolution);
218
- `,description:"Modulate coordinates based on hue differences"}];class k{_transforms;constructor(e){this._transforms=e}static empty(){return new k([])}static from(e){return new k([...e])}get transforms(){return this._transforms}push(e){this._transforms.push(e)}get length(){return this._transforms.length}get isEmpty(){return this._transforms.length===0}append(e){return new k([...this._transforms,e])}get(e){return this._transforms[e]}[Symbol.iterator](){return this._transforms[Symbol.iterator]()}}class S{_chain;_charMapping;_nestedSources;_externalLayerRefs;_colorSource;_cellColorSource;_charSource;_charCount;constructor(e){this._chain=e?.chain??k.empty(),this._charMapping=e?.charMapping,this._colorSource=e?.colorSource,this._cellColorSource=e?.cellColorSource,this._charSource=e?.charSource,this._charCount=e?.charCount,this._nestedSources=e?.nestedSources??new Map,this._externalLayerRefs=e?.externalLayerRefs??new Map}addTransform(e,r){const a={name:e,userArgs:r};return this._chain.push(a),this}addCombineTransform(e,r,a){const n=this._chain.length;return this._nestedSources.set(n,r),this.addTransform(e,a)}addExternalLayerRef(e){const r=this._chain.length;return this._externalLayerRefs.set(r,e),this.addTransform("src",[])}charMap(e){const r=Array.from(e),a=[];for(const n of r)a.push(n.codePointAt(0)??32);return this._charMapping={chars:e,indices:a},this}charColor(e){return this._colorSource=e,this}char(e,r){return this._charSource=e,this._charCount=r,this}cellColor(e){return this._cellColorSource=e,this}paint(e){return this._colorSource=e,this._cellColorSource=e,this}clone(){const e=new Map;for(const[a,n]of this._nestedSources)e.set(a,n.clone());const r=new Map;for(const[a,n]of this._externalLayerRefs)r.set(a,{...n});return new S({chain:k.from(this._chain.transforms),charMapping:this._charMapping,colorSource:this._colorSource?.clone(),cellColorSource:this._cellColorSource?.clone(),charSource:this._charSource?.clone(),charCount:this._charCount,nestedSources:e,externalLayerRefs:r})}get transforms(){return this._chain.transforms}get charMapping(){return this._charMapping}get colorSource(){return this._colorSource}get cellColorSource(){return this._cellColorSource}get charSource(){return this._charSource}get charCount(){return this._charCount}get nestedSources(){return this._nestedSources}get externalLayerRefs(){return this._externalLayerRefs}}const R={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>t*(2-t),easeInOutQuad:t=>t<.5?2*t*t:(4-2*t)*t-1,easeInCubic:t=>t*t*t,easeOutCubic:t=>--t*t*t+1,easeInOutCubic:t=>t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1,easeInQuart:t=>t*t*t*t,easeOutQuart:t=>1- --t*t*t*t,easeInOutQuart:t=>t<.5?8*t*t*t*t:1-8*--t*t*t*t,easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>1+--t*t*t*t*t,easeInOutQuint:t=>t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t,sin:t=>(1+Math.sin(Math.PI*t-Math.PI/2))/2};function U(t,e){return(t%e+e)%e}"fast"in Array.prototype||(Array.prototype.fast=function(t=1){return this._speed=t,this},Array.prototype.smooth=function(t=1){return this._smooth=t,this},Array.prototype.ease=function(t="linear"){return typeof t=="function"?(this._smooth=1,this._ease=t):R[t]&&(this._smooth=1,this._ease=R[t]),this},Array.prototype.offset=function(t=.5){return this._offset=t%1,this},Array.prototype.fit=function(t=0,e=1){const r=Math.min(...this),a=Math.max(...this),n=this.map(o=>(function(c,s,l,f,m){return(c-s)*(m-f)/(l-s)+f})(o,r,a,t,e));return n._speed=this._speed,n._smooth=this._smooth,n._ease=this._ease,n._offset=this._offset,n}),L.registerMany(E),B.setSynthSourceClass(S),B.injectMethods(S.prototype);const F=B.generateStandaloneFunctions(),w="textmode.synth.js";class q{_usesFeedback=!1;_usesCharFeedback=!1;_usesCellColorFeedback=!1;trackUsage(e){switch(e){case"char":this._usesCharFeedback=!0;break;case"cellColor":this._usesCellColorFeedback=!0;break;default:this._usesFeedback=!0}}reset(){this._usesFeedback=!1,this._usesCharFeedback=!1,this._usesCellColorFeedback=!1}getUsage(){return{usesCharColorFeedback:this._usesFeedback,usesCharFeedback:this._usesCharFeedback,usesCellColorFeedback:this._usesCellColorFeedback}}get usesAnyFeedback(){return this._usesFeedback||this._usesCharFeedback||this._usesCellColorFeedback}get usesCharColorFeedback(){return this._usesFeedback}get usesCharFeedback(){return this._usesCharFeedback}get usesCellColorFeedback(){return this._usesCellColorFeedback}}class G{_externalLayers=new Map;_counter=0;_layerIdToPrefix=new Map;getPrefix(e){let r=this._layerIdToPrefix.get(e);return r||(r="extLayer"+this._counter++,this._layerIdToPrefix.set(e,r)),r}trackUsage(e,r){const a=this.getPrefix(e.layerId);let n=this._externalLayers.get(e.layerId);switch(n||(n={layerId:e.layerId,uniformPrefix:a,usesChar:!1,usesCharColor:!1,usesCellColor:!1},this._externalLayers.set(e.layerId,n)),r){case"char":n.usesChar=!0;break;case"cellColor":n.usesCellColor=!0;break;default:n.usesCharColor=!0}}hasLayer(e){return this._externalLayers.has(e)}getLayerInfo(e){return this._externalLayers.get(e)}getExternalLayers(){return new Map(this._externalLayers)}get hasExternalLayers(){return this._externalLayers.size>0}get count(){return this._externalLayers.size}reset(){this._externalLayers.clear(),this._counter=0,this._layerIdToPrefix.clear()}}const K={char:"prevCharBuffer",charColor:"prevCharColorBuffer",cellColor:"prevCellColorBuffer",main:"prevCharColorBuffer"};class Q{getContextAwareGlslFunction(e,r,a,n,o){return r!=="src"?e.glslFunction:n&&o?this._generateExternalSrcFunction(n,a,o):this._generateSelfFeedbackSrcFunction(a)}getFunctionName(e,r,a,n){return e.name!=="src"?e.name:a&&n?`src_ext_${n(a.layerId)}_${r}`:`src_${r}`}generateTransformCode(e,r,a,n,o,c,s,l,f,m,h,v,x){const d=this.getFunctionName(r,m,v,x),y=(...u)=>[...u,...f].join(", ");let i=o,p=c,_=s,M=l;switch(r.type){case"src":{const u=`c${a}`;e.push(` vec4 ${u} = ${d}(${y(n)});`),i=u;break}case"coord":{const u=`st${a}`;e.push(` vec2 ${u} = ${d}(${y(n)});`),e.push(` ${n} = ${u};`);break}case"color":{const u=`c${a}`;e.push(` vec4 ${u} = ${d}(${y(o)});`),i=u;break}case"combine":{const u=`c${a}`;e.push(` vec4 ${u} = ${d}(${y(o,h??"vec4(0.0)")});`),i=u;break}case"combineCoord":{const u=`st${a}`;e.push(` vec2 ${u} = ${d}(${y(n,h??"vec4(0.0)")});`),e.push(` ${n} = ${u};`);break}}return{colorVar:i,charVar:p,flagsVar:_,rotationVar:M}}_generateExternalSrcFunction(e,r,a){const n=a(e.layerId);return`
218
+ `,description:"Modulate coordinates based on hue differences"}];class T{_transforms;constructor(t){this._transforms=t}static empty(){return new T([])}static from(t){return new T([...t])}get transforms(){return this._transforms}push(t){this._transforms.push(t)}get length(){return this._transforms.length}get isEmpty(){return this._transforms.length===0}append(t){return new T([...this._transforms,t])}get(t){return this._transforms[t]}[Symbol.iterator](){return this._transforms[Symbol.iterator]()}}class S{_chain;_charMapping;_nestedSources;_externalLayerRefs;_colorSource;_cellColorSource;_charSource;constructor(t){this._chain=t?.chain??T.empty(),this._charMapping=t?.charMapping,this._colorSource=t?.colorSource,this._cellColorSource=t?.cellColorSource,this._charSource=t?.charSource,this._nestedSources=t?.nestedSources??new Map,this._externalLayerRefs=t?.externalLayerRefs??new Map}addTransform(t,r){const a={name:t,userArgs:r};return this._chain.push(a),this}addCombineTransform(t,r,a){const n=this._chain.length;return this._nestedSources.set(n,r),this.addTransform(t,a)}addExternalLayerRef(t){const r=this._chain.length;return this._externalLayerRefs.set(r,t),this.addTransform("src",[])}charMap(t){const r=Array.from(t),a=[];for(const n of r)a.push(n.codePointAt(0)??32);return this._charMapping={chars:t,indices:a},this}charColor(t){return this._colorSource=t,this}char(t){return this._charSource=t,this}cellColor(t){return this._cellColorSource=t,this}paint(t){return this._colorSource=t,this._cellColorSource=t,this}clone(){const t=new Map;for(const[a,n]of this._nestedSources)t.set(a,n.clone());const r=new Map;for(const[a,n]of this._externalLayerRefs)r.set(a,{...n});return new S({chain:T.from(this._chain.transforms),charMapping:this._charMapping,colorSource:this._colorSource?.clone(),cellColorSource:this._cellColorSource?.clone(),charSource:this._charSource?.clone(),nestedSources:t,externalLayerRefs:r})}get transforms(){return this._chain.transforms}get charMapping(){return this._charMapping}get colorSource(){return this._colorSource}get cellColorSource(){return this._cellColorSource}get charSource(){return this._charSource}get nestedSources(){return this._nestedSources}get externalLayerRefs(){return this._externalLayerRefs}}const j={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>e*(2-e),easeInOutQuad:e=>e<.5?2*e*e:(4-2*e)*e-1,easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>e<.5?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1,easeInQuart:e=>e*e*e*e,easeOutQuart:e=>1- --e*e*e*e,easeInOutQuart:e=>e<.5?8*e*e*e*e:1-8*--e*e*e*e,easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>1+--e*e*e*e*e,easeInOutQuint:e=>e<.5?16*e*e*e*e*e:1+16*--e*e*e*e*e,sin:e=>(1+Math.sin(Math.PI*e-Math.PI/2))/2};function U(e,t){return(e%t+t)%t}"fast"in Array.prototype||(Array.prototype.fast=function(e=1){return this._speed=e,this},Array.prototype.smooth=function(e=1){return this._smooth=e,this},Array.prototype.ease=function(e="linear"){return typeof e=="function"?(this._smooth=1,this._ease=e):j[e]&&(this._smooth=1,this._ease=j[e]),this},Array.prototype.offset=function(e=.5){return this._offset=e%1,this},Array.prototype.fit=function(e=0,t=1){const r=Math.min(...this),a=Math.max(...this),n=this.map(o=>(function(s,c,l,f,h){return(s-c)*(h-f)/(l-c)+f})(o,r,a,e,t));return n._speed=this._speed,n._smooth=this._smooth,n._ease=this._ease,n._offset=this._offset,n}),A.registerMany(G),R.setSynthSourceClass(S),R.injectMethods(S.prototype);const P=R.generateStandaloneFunctions(),w="textmode.synth.js";class K{_usesFeedback=!1;_usesCharFeedback=!1;_usesCellColorFeedback=!1;trackUsage(t){switch(t){case"char":this._usesCharFeedback=!0;break;case"cellColor":this._usesCellColorFeedback=!0;break;default:this._usesFeedback=!0}}reset(){this._usesFeedback=!1,this._usesCharFeedback=!1,this._usesCellColorFeedback=!1}getUsage(){return{usesCharColorFeedback:this._usesFeedback,usesCharFeedback:this._usesCharFeedback,usesCellColorFeedback:this._usesCellColorFeedback}}get usesAnyFeedback(){return this._usesFeedback||this._usesCharFeedback||this._usesCellColorFeedback}get usesCharColorFeedback(){return this._usesFeedback}get usesCharFeedback(){return this._usesCharFeedback}get usesCellColorFeedback(){return this._usesCellColorFeedback}}class Q{_externalLayers=new Map;_counter=0;_layerIdToPrefix=new Map;getPrefix(t){let r=this._layerIdToPrefix.get(t);return r||(r="extLayer"+this._counter++,this._layerIdToPrefix.set(t,r)),r}trackUsage(t,r){const a=this.getPrefix(t.layerId);let n=this._externalLayers.get(t.layerId);switch(n||(n={layerId:t.layerId,uniformPrefix:a,usesChar:!1,usesCharColor:!1,usesCellColor:!1},this._externalLayers.set(t.layerId,n)),r){case"char":n.usesChar=!0;break;case"cellColor":n.usesCellColor=!0;break;default:n.usesCharColor=!0}}hasLayer(t){return this._externalLayers.has(t)}getLayerInfo(t){return this._externalLayers.get(t)}getExternalLayers(){return new Map(this._externalLayers)}get hasExternalLayers(){return this._externalLayers.size>0}get count(){return this._externalLayers.size}reset(){this._externalLayers.clear(),this._counter=0,this._layerIdToPrefix.clear()}}const H={char:"prevCharBuffer",charColor:"prevCharColorBuffer",cellColor:"prevCellColorBuffer",main:"prevCharColorBuffer"};class W{getContextAwareGlslFunction(t,r,a,n,o){return r!=="src"?t.glslFunction:n&&o?this._generateExternalSrcFunction(n,a,o):this._generateSelfFeedbackSrcFunction(a)}getFunctionName(t,r,a,n){return t.name!=="src"?t.name:a&&n?`src_ext_${n(a.layerId)}_${r}`:`src_${r}`}generateTransformCode(t,r,a,n,o,s,c,l,f,h,y,v,C){const _=this.getFunctionName(r,h,v,C),p=(...d)=>[...d,...f].join(", ");let i=o,u=s,m=c,b=l;switch(r.type){case"src":{const d=`c${a}`;t.push(` vec4 ${d} = ${_}(${p(n)});`),i=d;break}case"coord":{const d=`st${a}`;t.push(` vec2 ${d} = ${_}(${p(n)});`),t.push(` ${n} = ${d};`);break}case"color":{const d=`c${a}`;t.push(` vec4 ${d} = ${_}(${p(o)});`),i=d;break}case"combine":{const d=`c${a}`;t.push(` vec4 ${d} = ${_}(${p(o,y??"vec4(0.0)")});`),i=d;break}case"combineCoord":{const d=`st${a}`;t.push(` vec2 ${d} = ${_}(${p(n,y??"vec4(0.0)")});`),t.push(` ${n} = ${d};`);break}}return{colorVar:i,charVar:u,flagsVar:m,rotationVar:b}}_generateExternalSrcFunction(t,r,a){const n=a(t.layerId);return`
219
219
  vec4 ${`src_ext_${n}_${r}`}(vec2 _st) {
220
220
  return texture(${{char:`${n}_char`,charColor:`${n}_primary`,cellColor:`${n}_cell`,main:`${n}_primary`}[r]}, fract(_st));
221
221
  }
222
- `}_generateSelfFeedbackSrcFunction(e){return`
223
- vec4 ${`src_${e}`}(vec2 _st) {
224
- return texture(${K[e]}, fract(_st));
222
+ `}_generateSelfFeedbackSrcFunction(t){return`
223
+ vec4 ${`src_${t}`}(vec2 _st) {
224
+ return texture(${H[t]}, fract(_st));
225
225
  }
226
- `}}class N{_uniforms=new Map;_dynamicUpdaters=new Map;processArgument(e,r,a){if((function(n){return Array.isArray(n)&&n.length>0&&typeof n[0]=="number"})(e)){const n=`${a}_${r.name}`,o={name:n,type:r.type,value:r.default??0,isDynamic:!0},c=s=>(function(l,f){const m=l._speed??1,h=l._smooth??0;let v=f.time*m*(f.bpm/60)+(l._offset??0);if(h!==0){const x=l._ease??R.linear,d=v-h/2,y=l[Math.floor(U(d,l.length))],i=l[Math.floor(U(d+1,l.length))];return x(Math.min(U(d,1)/h,1))*(i-y)+y}return l[Math.floor(U(v,l.length))]})(e,s);return this._uniforms.set(n,o),this._dynamicUpdaters.set(n,c),{glslValue:n,uniform:o,updater:c}}if(typeof e=="function"){const n=`${a}_${r.name}`,o={name:n,type:r.type,value:r.default??0,isDynamic:!0};return this._uniforms.set(n,o),this._dynamicUpdaters.set(n,e),{glslValue:n,uniform:o,updater:e}}if(typeof e=="number")return{glslValue:C(e)};if(Array.isArray(e)&&typeof e[0]=="number"){const n=e;if(n.length===2)return{glslValue:`vec2(${C(n[0])}, ${C(n[1])})`};if(n.length===3)return{glslValue:`vec3(${C(n[0])}, ${C(n[1])}, ${C(n[2])})`};if(n.length===4)return{glslValue:`vec4(${C(n[0])}, ${C(n[1])}, ${C(n[2])}, ${C(n[3])})`}}return this.processDefault(r)}processDefault(e){const r=e.default;return typeof r=="number"?{glslValue:C(r)}:Array.isArray(r)?{glslValue:`vec${r.length}(${r.map(C).join(", ")})`}:{glslValue:"0.0"}}getUniforms(){return new Map(this._uniforms)}getDynamicUpdaters(){return new Map(this._dynamicUpdaters)}clear(){this._uniforms.clear(),this._dynamicUpdaters.clear()}}function C(t){const e=t.toString();return e.includes(".")?e:e+".0"}function j(t){return new H().compile(t)}class H{_uniformManager=new N;_feedbackTracker=new q;_externalLayerManager=new G;_codeGenerator=new Q;_glslFunctions=new Set;_mainCode=[];_varCounter=0;_currentTarget="main";compile(e){this._reset();const r=this._compileChain(e,"main","vec4(1.0, 1.0, 1.0, 1.0)","v_uv","main");let a=r.charVar;e.charSource&&(a=this._compileCharSource(e));let n=r.colorVar;e.colorSource&&(n=this._compileChain(e.colorSource,"charColor","vec4(1.0, 1.0, 1.0, 1.0)","v_uv","charColor").colorVar);let o="vec4(0.0, 0.0, 0.0, 0.0)";e.cellColorSource&&(o=this._compileChain(e.cellColorSource,"cellColor","vec4(0.0, 0.0, 0.0, 0.0)","v_uv","cellColor").colorVar);const c=(function(f,m,h){return f?`
226
+ `}}class J{_uniforms=new Map;_dynamicUpdaters=new Map;processArgument(t,r,a){if((function(n){return Array.isArray(n)&&n.length>0&&typeof n[0]=="number"})(t)){const n=`${a}_${r.name}`,o={name:n,type:r.type,value:r.default??0,isDynamic:!0},s=c=>(function(l,f){const h=l._speed??1,y=l._smooth??0;let v=f.time*h*(f.bpm/60)+(l._offset??0);if(y!==0){const C=l._ease??j.linear,_=v-y/2,p=l[Math.floor(U(_,l.length))],i=l[Math.floor(U(_+1,l.length))];return C(Math.min(U(_,1)/y,1))*(i-p)+p}return l[Math.floor(U(v,l.length))]})(t,c);return this._uniforms.set(n,o),this._dynamicUpdaters.set(n,s),{glslValue:n,uniform:o,updater:s}}if(typeof t=="function"){const n=`${a}_${r.name}`,o={name:n,type:r.type,value:r.default??0,isDynamic:!0};return this._uniforms.set(n,o),this._dynamicUpdaters.set(n,t),{glslValue:n,uniform:o,updater:t}}if(typeof t=="number")return{glslValue:x(t)};if(Array.isArray(t)&&typeof t[0]=="number"){const n=t;if(n.length===2)return{glslValue:`vec2(${x(n[0])}, ${x(n[1])})`};if(n.length===3)return{glslValue:`vec3(${x(n[0])}, ${x(n[1])}, ${x(n[2])})`};if(n.length===4)return{glslValue:`vec4(${x(n[0])}, ${x(n[1])}, ${x(n[2])}, ${x(n[3])})`}}return this.processDefault(r)}processDefault(t){const r=t.default;return typeof r=="number"?{glslValue:x(r)}:Array.isArray(r)?{glslValue:`vec${r.length}(${r.map(x).join(", ")})`}:{glslValue:"0.0"}}getUniforms(){return new Map(this._uniforms)}getDynamicUpdaters(){return new Map(this._dynamicUpdaters)}clear(){this._uniforms.clear(),this._dynamicUpdaters.clear()}}function x(e){const t=e.toString();return t.includes(".")?t:t+".0"}function X(e){return new Z().compile(e)}class Z{_uniformManager=new J;_feedbackTracker=new K;_externalLayerManager=new Q;_codeGenerator=new W;_glslFunctions=new Set;_mainCode=[];_varCounter=0;_currentTarget="main";_usesCharSource=!1;compile(t){this._reset();const r=this._compileChain(t,"main","vec4(1.0, 1.0, 1.0, 1.0)","v_uv","main");let a=r.charVar;t.charSource&&(a=this._compileCharSource(t));let n=r.colorVar;t.colorSource&&(n=this._compileChain(t.colorSource,"charColor","vec4(1.0, 1.0, 1.0, 1.0)","v_uv","charColor").colorVar);let o="vec4(0.0, 0.0, 0.0, 0.0)";t.cellColorSource&&(o=this._compileChain(t.cellColorSource,"cellColor","vec4(0.0, 0.0, 0.0, 0.0)","v_uv","cellColor").colorVar);const s=(function(f,h,y){return f?`
227
227
  // Character output from generator
228
- vec4 charOutput = ${m};`:`
228
+ vec4 charOutput = ${h};`:`
229
229
  // Derive character from color luminance
230
- float lum = _luminance(${h}.rgb);
230
+ float lum = _luminance(${y}.rgb);
231
231
  int charIdx = int(lum * 255.0);
232
- vec4 charOutput = vec4(float(charIdx % 256) / 255.0, float(charIdx / 256) / 255.0, 0.0, 0.0);`})(!!a,a??"vec4(0.0)",r.colorVar),s=this._feedbackTracker.getUsage();return{fragmentSource:(function(f){const{uniforms:m,glslFunctions:h,mainCode:v,charOutputCode:x,primaryColorVar:d,cellColorVar:y,charMapping:i,usesFeedback:p,usesCharFeedback:_,usesCellColorFeedback:M,externalLayers:u}=f,X=Array.from(m.values()).map($=>`uniform ${$.type} ${$.name};`).join(`
233
- `);let I="",z="";i&&(I=`uniform int u_charMap[${i.indices.length}];
234
- uniform int u_charMapSize;`,z=`
232
+ vec4 charOutput = vec4(float(charIdx % 256) / 255.0, float(charIdx / 256) / 255.0, 0.0, 0.0);`})(!!a,a??"vec4(0.0)",r.colorVar),c=this._feedbackTracker.getUsage();return{fragmentSource:(function(f){const{uniforms:h,glslFunctions:y,mainCode:v,charOutputCode:C,primaryColorVar:_,cellColorVar:p,charMapping:i,usesFeedback:u,usesCharFeedback:m,usesCellColorFeedback:b,usesCharSource:d,externalLayers:M}=f,B=Array.from(h.values()).map(F=>`uniform ${F.type} ${F.name};`).join(`
233
+ `);let z="",$="";i&&(z=`uniform int u_charMap[${i.indices.length}];
234
+ uniform int u_charMapSize;`,$=`
235
235
  // Apply character mapping
236
236
  int rawCharIdx = int(charOutput.r * 255.0 + charOutput.g * 255.0 * 256.0);
237
237
  int mappedCharIdx = u_charMap[int(mod(float(rawCharIdx), float(u_charMapSize)))];
238
238
  charOutput.r = float(mappedCharIdx % 256) / 255.0;
239
- charOutput.g = float(mappedCharIdx / 256) / 255.0;`);const b=[];p&&b.push("uniform sampler2D prevCharColorBuffer;"),_&&b.push("uniform sampler2D prevCharBuffer;"),M&&b.push("uniform sampler2D prevCellColorBuffer;");const A=b.join(`
240
- `),V=[];if(u)for(const[,$]of u)$.usesChar&&V.push(`uniform sampler2D ${$.uniformPrefix}_char;`),$.usesCharColor&&V.push(`uniform sampler2D ${$.uniformPrefix}_primary;`),$.usesCellColor&&V.push(`uniform sampler2D ${$.uniformPrefix}_cell;`);return`#version 300 es
239
+ charOutput.g = float(mappedCharIdx / 256) / 255.0;`);const k=[];u&&k.push("uniform sampler2D prevCharColorBuffer;"),m&&k.push("uniform sampler2D prevCharBuffer;"),b&&k.push("uniform sampler2D prevCellColorBuffer;");const oe=k.join(`
240
+ `),se=d?"uniform float u_charSourceCount;":"",V=[];if(M)for(const[,F]of M)F.usesChar&&V.push(`uniform sampler2D ${F.uniformPrefix}_char;`),F.usesCharColor&&V.push(`uniform sampler2D ${F.uniformPrefix}_primary;`),F.usesCellColor&&V.push(`uniform sampler2D ${F.uniformPrefix}_cell;`);return`#version 300 es
241
241
  precision highp float;
242
242
 
243
243
  // Varyings
@@ -251,14 +251,15 @@ layout(location = 2) out vec4 o_secondaryColor;
251
251
  // Standard uniforms
252
252
  uniform float time;
253
253
  uniform vec2 resolution;
254
- ${A}
254
+ ${oe}
255
255
  ${V.length>0?`// External layer samplers
256
256
  ${V.join(`
257
257
  `)}`:""}
258
- ${I}
258
+ ${z}
259
+ ${se}
259
260
 
260
261
  // Dynamic uniforms
261
- ${X}
262
+ ${B}
262
263
 
263
264
 
264
265
  // Utility functions
@@ -359,7 +360,7 @@ float _noise(vec3 v) {
359
360
 
360
361
 
361
362
  // Transform functions
362
- ${Array.from(h).join(`
363
+ ${Array.from(y).join(`
363
364
  `)}
364
365
 
365
366
  void main() {
@@ -367,12 +368,12 @@ void main() {
367
368
  ${v.join(`
368
369
  `)}
369
370
 
370
- ${x}
371
- ${z}
371
+ ${C}
372
+ ${$}
372
373
 
373
374
  // Output to MRT
374
375
  o_character = charOutput;
375
- o_primaryColor = ${d};
376
- o_secondaryColor = ${y};
376
+ o_primaryColor = ${_};
377
+ o_secondaryColor = ${p};
377
378
  }
378
- `})({uniforms:this._uniformManager.getUniforms(),glslFunctions:this._glslFunctions,mainCode:this._mainCode,charOutputCode:c,primaryColorVar:n,cellColorVar:o,charMapping:e.charMapping,usesFeedback:s.usesCharColorFeedback,usesCharFeedback:s.usesCharFeedback,usesCellColorFeedback:s.usesCellColorFeedback,externalLayers:this._externalLayerManager.getExternalLayers()}),uniforms:this._uniformManager.getUniforms(),dynamicUpdaters:this._uniformManager.getDynamicUpdaters(),charMapping:e.charMapping,usesCharColorFeedback:s.usesCharColorFeedback,usesCharFeedback:s.usesCharFeedback,usesCellColorFeedback:s.usesCellColorFeedback,externalLayers:this._externalLayerManager.getExternalLayers()}}_reset(){this._varCounter=0,this._uniformManager.clear(),this._feedbackTracker.reset(),this._externalLayerManager.reset(),this._glslFunctions.clear(),this._mainCode.length=0,this._currentTarget="main"}_compileCharSource(e){const r=this._compileChain(e.charSource,"charSrc","vec4(1.0, 1.0, 1.0, 1.0)","v_uv","char"),a="charFromSource_"+this._varCounter++,n=e.charCount??256;return this._mainCode.push(" // Convert charSource color to character index"),this._mainCode.push(` float charLum_${a} = _luminance(${r.colorVar}.rgb);`),this._mainCode.push(` int charIdx_${a} = int(charLum_${a} * ${n.toFixed(1)});`),this._mainCode.push(` vec4 ${a} = vec4(float(charIdx_${a} % 256) / 255.0, float(charIdx_${a} / 256) / 255.0, 0.0, 0.0);`),a}_compileChain(e,r,a,n="v_uv",o="main"){const c=this._currentTarget;this._currentTarget=o;const s=`${r}_st`;let l,f,m,h=`${r}_c`;this._mainCode.push(` vec2 ${s} = ${n};`),this._mainCode.push(` vec4 ${h} = ${a};`);const v=e.transforms,x=v.map(i=>this._getProcessedTransform(i.name)),d=this._identifyCoordTransforms(x),y=i=>{const p=v[i],_=x[i];if(!_)return void console.warn(`[SynthCompiler] Unknown transform: ${p.name}`);const M=e.externalLayerRefs.get(i);p.name==="src"&&this._trackSrcUsage(M);const u=this._codeGenerator.getContextAwareGlslFunction(_,p.name,this._currentTarget,M,A=>this._externalLayerManager.getPrefix(A));this._glslFunctions.add(u);const X=this._processArguments(p.userArgs,_.inputs,`${r}_${i}_${p.name}`),I=e.nestedSources.get(i);let z;I&&(_.type==="combine"||_.type==="combineCoord")&&(z=this._compileChain(I,`${r}_nested_${i}`,a,s,o).colorVar);const b=this._codeGenerator.generateTransformCode(this._mainCode,_,this._varCounter++,s,h,l,f,m,X,this._currentTarget,z,M,A=>this._externalLayerManager.getPrefix(A));h=b.colorVar,b.charVar&&(l=b.charVar),b.flagsVar&&(f=b.flagsVar),b.rotationVar&&(m=b.rotationVar)};for(let i=d.length-1;i>=0;i--)y(d[i]);for(let i=0;i<v.length;i++){const p=x[i];(!p||p.type!=="coord"&&p.type!=="combineCoord")&&y(i)}return this._currentTarget=c,{coordVar:s,colorVar:h,charVar:l,flagsVar:f,rotationVar:m}}_identifyCoordTransforms(e){const r=[];for(let a=0;a<e.length;a++){const n=e[a];n&&(n.type!=="coord"&&n.type!=="combineCoord"||r.push(a))}return r}_trackSrcUsage(e){e?this._externalLayerManager.trackUsage(e,this._currentTarget):this._feedbackTracker.trackUsage(this._currentTarget)}_getProcessedTransform(e){return L.getProcessed(e)}_processArguments(e,r,a){const n=[];for(let o=0;o<r.length;o++){const c=r[o],s=e[o]??c.default,l=this._uniformManager.processArgument(s,c,a);n.push(l.glslValue)}return n}}class W{_resolvedIndices;_lastFontCharacterCount=0;_lastChars="";resolve(e,r){const a=r.characters.length;if(this._resolvedIndices&&this._lastFontCharacterCount===a&&this._lastChars===e)return this._resolvedIndices;const n=Array.from(e),o=new Int32Array(n.length),c=r.characterMap,s=r.characters;for(let l=0;l<n.length;l++){const f=n[l],m=c.get(f);if(m!==void 0)o[l]=s.indexOf(m);else{const h=c.get(" ");o[l]=h!==void 0?s.indexOf(h):0}}return this._resolvedIndices=o,this._lastFontCharacterCount=a,this._lastChars=e,o}invalidate(){this._resolvedIndices=void 0,this._lastFontCharacterCount=0,this._lastChars=""}}function O(t={}){return{source:t.source??new S,compiled:t.compiled,shader:t.shader,characterResolver:t.characterResolver??new W,needsCompile:t.needsCompile??!1,pingPongBuffers:t.pingPongBuffers,pingPongIndex:t.pingPongIndex??0,externalLayerMap:t.externalLayerMap,bpm:t.bpm}}let D=60;function J(t){t.bpm=function(e){return(function(r){D=r})(e),e}}function P(t){const e=new Map;for(const[,r]of t.externalLayerRefs)e.set(r.layerId,r.layer);for(const[,r]of t.nestedSources){const a=P(r);for(const[n,o]of a)e.set(n,o)}if(t.charSource){const r=P(t.charSource);for(const[a,n]of r)e.set(a,n)}if(t.colorSource){const r=P(t.colorSource);for(const[a,n]of r)e.set(a,n)}if(t.cellColorSource){const r=P(t.cellColorSource);for(const[a,n]of r)e.set(a,n)}return e}function Z(t){const e=t.getPluginState(w);e&&(e.shader?.dispose&&e.shader.dispose(),e.pingPongBuffers&&(e.pingPongBuffers[0].dispose?.(),e.pingPongBuffers[1].dispose?.()))}const ee={name:w,version:"1.0.0",install(t,e){J(t),(function(r){r.extendLayer("synth",function(a){const n=this.grid!==void 0&&this.drawFramebuffer!==void 0;let o=this.getPluginState(w);o?(o.source=a,o.needsCompile=!0,o.characterResolver.invalidate(),n&&(o.compiled=j(a))):o=O({source:a,compiled:n?j(a):void 0,needsCompile:!0}),this.setPluginState(w,o)})})(e),(function(r){r.extendLayer("bpm",function(a){let n=this.getPluginState(w);n?n.bpm=a:n=O({bpm:a}),this.setPluginState(w,n)})})(e),(function(r){r.extendLayer("clearSynth",function(){const a=this.getPluginState(w);a&&(a.shader?.dispose&&a.shader.dispose(),a.pingPongBuffers&&(a.pingPongBuffers[0].dispose?.(),a.pingPongBuffers[1].dispose?.()),this.setPluginState(w,void 0))})})(e),e.registerLayerPreRenderHook(r=>(async function(a,n){const o=a.getPluginState(w);if(!o)return;const c=a.grid,s=a.drawFramebuffer;if(!c||!s||(o.compiled||(o.compiled=j(o.source),o.externalLayerMap=P(o.source),o.needsCompile=!0),o.needsCompile&&o.compiled&&(o.shader?.dispose&&o.shader.dispose(),o.externalLayerMap=P(o.source),o.shader=await n.createFilterShader(o.compiled.fragmentSource),o.needsCompile=!1),!o.shader||!o.compiled))return;const l=o.compiled.usesCharColorFeedback,f=o.compiled.usesCharFeedback,m=o.compiled.usesCellColorFeedback,h=l||f||m;h&&!o.pingPongBuffers&&(o.pingPongBuffers=[n.createFramebuffer({width:c.cols,height:c.rows,attachments:3}),n.createFramebuffer({width:c.cols,height:c.rows,attachments:3})],o.pingPongIndex=0);const v={time:n.secs,frameCount:n.frameCount,width:c.width,height:c.height,cols:c.cols,rows:c.rows,bpm:o.bpm??D},x=d=>{n.setUniform("time",n.secs),n.setUniform("resolution",[v.cols,v.rows]);for(const[i,p]of o.compiled.dynamicUpdaters)n.setUniform(i,p(v));for(const[i,p]of o.compiled.uniforms)p.isDynamic||typeof p.value=="function"||n.setUniform(i,p.value);if(o.compiled.charMapping){const i=o.characterResolver.resolve(o.compiled.charMapping.chars,a.font);n.setUniform("u_charMap",i),n.setUniform("u_charMapSize",i.length)}d&&(l&&n.setUniform("prevCharColorBuffer",d.textures[1]),f&&n.setUniform("prevCharBuffer",d.textures[0]),m&&n.setUniform("prevCellColorBuffer",d.textures[2]));const y=o.compiled.externalLayers;if(y&&y.size>0&&o.externalLayerMap)for(const[i,p]of y){const _=o.externalLayerMap.get(i);if(!_){console.warn(`[textmode.synth.js] External layer not found: ${i}`);continue}const M=_.getPluginState(w);let u;M?.pingPongBuffers?u=M.pingPongBuffers[M.pingPongIndex].textures:_.drawFramebuffer&&(u=_.drawFramebuffer.textures),u&&(p.usesChar&&n.setUniform(`${p.uniformPrefix}_char`,u[0]),p.usesCharColor&&n.setUniform(`${p.uniformPrefix}_primary`,u[1]),p.usesCellColor&&n.setUniform(`${p.uniformPrefix}_cell`,u[2]))}};if(h&&o.pingPongBuffers){const d=o.pingPongBuffers[o.pingPongIndex],y=o.pingPongBuffers[1-o.pingPongIndex];y.begin(),n.clear(),n.shader(o.shader),x(d),n.rect(c.cols,c.rows),y.end(),s.begin(),n.clear(),n.shader(o.shader),x(d),n.rect(c.cols,c.rows),s.end(),o.pingPongIndex=1-o.pingPongIndex}else s.begin(),n.clear(),n.shader(o.shader),x(null),n.rect(c.cols,c.rows),s.end()})(r,t)),e.registerLayerDisposedHook(Z)},uninstall(t,e){const r=[e.layerManager.base,...e.layerManager.all];for(const a of r){const n=a.getPluginState(w);n&&(n.shader?.dispose&&n.shader.dispose(),n.pingPongBuffers&&(n.pingPongBuffers[0].dispose?.(),n.pingPongBuffers[1].dispose?.()))}delete t.bpm,e.removeLayerExtension("synth"),e.removeLayerExtension("bpm"),e.removeLayerExtension("clearSynth")}};g.SynthPlugin=ee,g.SynthSource=S,g.cellColor=t=>{const e=new S;return e._colorSource=t,e},g.char=(t,e)=>{const r=new S;return r._charSource=t,r._charCount=e,r},g.charColor=t=>{const e=new S;return e._colorSource=t,e},g.gradient=function(t){return F.gradient(t)},g.noise=function(t,e){return F.noise(t,e)},g.osc=function(t,e,r){return F.osc(t,e,r)},g.paint=t=>{const e=new S;return e._colorSource=t,e._cellColorSource=t,e},g.shape=function(t,e,r){return F.shape(t,e,r)},g.solid=function(t,e,r,a){return F.solid(t,e,r,a)},g.src=t=>{const e=F.src;if(!t)return e();const r=new S,a=t.id??`layer_${Date.now()}_${Math.random().toString(36).slice(2,9)}`;return r.addExternalLayerRef({layerId:a,layer:t}),r},g.voronoi=function(t,e,r){return F.voronoi(t,e,r)},Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})});
379
+ `})({uniforms:this._uniformManager.getUniforms(),glslFunctions:this._glslFunctions,mainCode:this._mainCode,charOutputCode:s,primaryColorVar:n,cellColorVar:o,charMapping:t.charMapping,usesFeedback:c.usesCharColorFeedback,usesCharFeedback:c.usesCharFeedback,usesCellColorFeedback:c.usesCellColorFeedback,usesCharSource:this._usesCharSource,externalLayers:this._externalLayerManager.getExternalLayers()}),uniforms:this._uniformManager.getUniforms(),dynamicUpdaters:this._uniformManager.getDynamicUpdaters(),charMapping:t.charMapping,usesCharColorFeedback:c.usesCharColorFeedback,usesCharFeedback:c.usesCharFeedback,usesCellColorFeedback:c.usesCellColorFeedback,usesCharSource:this._usesCharSource,externalLayers:this._externalLayerManager.getExternalLayers()}}_reset(){this._varCounter=0,this._uniformManager.clear(),this._feedbackTracker.reset(),this._externalLayerManager.reset(),this._glslFunctions.clear(),this._mainCode.length=0,this._currentTarget="main",this._usesCharSource=!1}_compileCharSource(t){this._usesCharSource=!0;const r=this._compileChain(t.charSource,"charSrc","vec4(1.0, 1.0, 1.0, 1.0)","v_uv","char"),a="charFromSource_"+this._varCounter++;return this._mainCode.push(" // Convert charSource color to character index"),this._mainCode.push(` float charLum_${a} = _luminance(${r.colorVar}.rgb);`),this._mainCode.push(` int charIdx_${a} = int(charLum_${a} * u_charSourceCount);`),this._mainCode.push(` vec4 ${a} = vec4(float(charIdx_${a} % 256) / 255.0, float(charIdx_${a} / 256) / 255.0, 0.0, 0.0);`),a}_compileChain(t,r,a,n="v_uv",o="main"){const s=this._currentTarget;this._currentTarget=o;const c=`${r}_st`;let l,f,h,y=`${r}_c`;this._mainCode.push(` vec2 ${c} = ${n};`),this._mainCode.push(` vec4 ${y} = ${a};`);const v=t.transforms,C=v.map(i=>this._getProcessedTransform(i.name)),_=this._identifyCoordTransforms(C),p=i=>{const u=v[i],m=C[i];if(!m)return void console.warn(`[SynthCompiler] Unknown transform: ${u.name}`);const b=t.externalLayerRefs.get(i);u.name==="src"&&this._trackSrcUsage(b);const d=this._codeGenerator.getContextAwareGlslFunction(m,u.name,this._currentTarget,b,k=>this._externalLayerManager.getPrefix(k));this._glslFunctions.add(d);const M=this._processArguments(u.userArgs,m.inputs,`${r}_${i}_${u.name}`),B=t.nestedSources.get(i);let z;B&&(m.type==="combine"||m.type==="combineCoord")&&(z=this._compileChain(B,`${r}_nested_${i}`,a,c,o).colorVar);const $=this._codeGenerator.generateTransformCode(this._mainCode,m,this._varCounter++,c,y,l,f,h,M,this._currentTarget,z,b,k=>this._externalLayerManager.getPrefix(k));y=$.colorVar,$.charVar&&(l=$.charVar),$.flagsVar&&(f=$.flagsVar),$.rotationVar&&(h=$.rotationVar)};for(let i=_.length-1;i>=0;i--)p(_[i]);for(let i=0;i<v.length;i++){const u=C[i];(!u||u.type!=="coord"&&u.type!=="combineCoord")&&p(i)}return this._currentTarget=s,{coordVar:c,colorVar:y,charVar:l,flagsVar:f,rotationVar:h}}_identifyCoordTransforms(t){const r=[];for(let a=0;a<t.length;a++){const n=t[a];n&&(n.type!=="coord"&&n.type!=="combineCoord"||r.push(a))}return r}_trackSrcUsage(t){t?this._externalLayerManager.trackUsage(t,this._currentTarget):this._feedbackTracker.trackUsage(this._currentTarget)}_getProcessedTransform(t){return A.getProcessed(t)}_processArguments(t,r,a){const n=[];for(let o=0;o<r.length;o++){const s=r[o],c=t[o]??s.default,l=this._uniformManager.processArgument(c,s,a);n.push(l.glslValue)}return n}}class ee{_resolvedIndices;_lastFontCharacterCount=0;_lastChars="";resolve(t,r){const a=r.characters.length;if(this._resolvedIndices&&this._lastFontCharacterCount===a&&this._lastChars===t)return this._resolvedIndices;const n=Array.from(t),o=new Int32Array(n.length),s=r.characterMap,c=r.characters;for(let l=0;l<n.length;l++){const f=n[l],h=s.get(f);if(h!==void 0)o[l]=c.indexOf(h);else{const y=s.get(" ");o[l]=y!==void 0?c.indexOf(y):0}}return this._resolvedIndices=o,this._lastFontCharacterCount=a,this._lastChars=t,o}invalidate(){this._resolvedIndices=void 0,this._lastFontCharacterCount=0,this._lastChars=""}}function E(e={}){return{source:e.source??new S,compiled:e.compiled,shader:e.shader,characterResolver:e.characterResolver??new ee,needsCompile:e.needsCompile??!1,pingPongBuffers:e.pingPongBuffers,pingPongIndex:e.pingPongIndex??0,externalLayerMap:e.externalLayerMap,bpm:e.bpm}}let D=60;function te(e){e.bpm=function(t){return(function(r){D=r})(t),t}}function I(e){const t=new Map;for(const[,r]of e.externalLayerRefs)t.set(r.layerId,r.layer);for(const[,r]of e.nestedSources){const a=I(r);for(const[n,o]of a)t.set(n,o)}if(e.charSource){const r=I(e.charSource);for(const[a,n]of r)t.set(a,n)}if(e.colorSource){const r=I(e.colorSource);for(const[a,n]of r)t.set(a,n)}if(e.cellColorSource){const r=I(e.cellColorSource);for(const[a,n]of r)t.set(a,n)}return t}let O=null;function q(e,t,r){const a=r??O;if(a)try{a(e,t)}catch{}}function ne(e,t,r,a={}){let n;try{n=e()}catch(o){return q(o,t,a.onError),r}return(function(o){return o==null?!1:typeof o=="number"?Number.isFinite(o):Array.isArray(o)?o.length>0&&o.every(s=>typeof s=="number"&&Number.isFinite(s)):!1})(n)?n:(q(new Error(`[textmode.synth.js] Invalid dynamic parameter value for "${t}": ${N(n)}`),t,a.onError),r)}function N(e){if(e===void 0)return"undefined";if(e===null)return"null";if(typeof e=="number"){if(Number.isNaN(e))return"NaN";if(!Number.isFinite(e))return e>0?"Infinity":"-Infinity"}if(Array.isArray(e)){const t=e.findIndex(r=>typeof r!="number"||!Number.isFinite(r));if(t>=0)return`array with invalid element at index ${t}: ${N(e[t])}`}return String(e)}function re(e){const t=e.getPluginState(w);t&&(t.shader?.dispose&&t.shader.dispose(),t.pingPongBuffers&&(t.pingPongBuffers[0].dispose?.(),t.pingPongBuffers[1].dispose?.()))}const ae={name:w,version:"1.0.0",install(e,t){te(e),(function(r){r.extendLayer("synth",function(a){const n=this.grid!==void 0&&this.drawFramebuffer!==void 0;let o=this.getPluginState(w);o?(o.source=a,o.needsCompile=!0,o.characterResolver.invalidate(),n&&(o.compiled=X(a))):o=E({source:a,compiled:n?X(a):void 0,needsCompile:!0}),this.setPluginState(w,o)})})(t),(function(r){r.extendLayer("bpm",function(a){let n=this.getPluginState(w);n?n.bpm=a:n=E({bpm:a}),this.setPluginState(w,n)})})(t),(function(r){r.extendLayer("clearSynth",function(){const a=this.getPluginState(w);a&&(a.shader?.dispose&&a.shader.dispose(),a.pingPongBuffers&&(a.pingPongBuffers[0].dispose?.(),a.pingPongBuffers[1].dispose?.()),this.setPluginState(w,void 0))})})(t),t.registerLayerPreRenderHook(r=>(async function(a,n){const o=a.getPluginState(w);if(!o)return;const s=a.grid,c=a.drawFramebuffer;if(!s||!c||(o.compiled||(o.compiled=X(o.source),o.externalLayerMap=I(o.source),o.needsCompile=!0),o.needsCompile&&o.compiled&&(o.shader?.dispose&&o.shader.dispose(),o.externalLayerMap=I(o.source),o.shader=await n.createFilterShader(o.compiled.fragmentSource),o.needsCompile=!1),!o.shader||!o.compiled))return;const l=o.compiled.usesCharColorFeedback,f=o.compiled.usesCharFeedback,h=o.compiled.usesCellColorFeedback,y=l||f||h;y&&!o.pingPongBuffers&&(o.pingPongBuffers=[n.createFramebuffer({width:s.cols,height:s.rows,attachments:3}),n.createFramebuffer({width:s.cols,height:s.rows,attachments:3})],o.pingPongIndex=0);const v={time:n.secs,frameCount:n.frameCount,width:s.width,height:s.height,cols:s.cols,rows:s.rows,bpm:o.bpm??D},C=new Map;for(const[p,i]of o.compiled.dynamicUpdaters){const u=o.compiled.uniforms.get(p),m=ne(()=>i(v),p,u?.value??0,{onError:o.onDynamicError});C.set(p,m)}const _=p=>{n.setUniform("time",n.secs),n.setUniform("resolution",[v.cols,v.rows]);for(const[u,m]of C)n.setUniform(u,m);for(const[u,m]of o.compiled.uniforms)m.isDynamic||typeof m.value=="function"||n.setUniform(u,m.value);if(o.compiled.charMapping){const u=o.characterResolver.resolve(o.compiled.charMapping.chars,a.font);n.setUniform("u_charMap",u),n.setUniform("u_charMapSize",u.length)}if(o.compiled.usesCharSource){const u=o.compiled.charMapping?o.compiled.charMapping.chars.length:a.font.characters.length;n.setUniform("u_charSourceCount",u)}p&&(l&&n.setUniform("prevCharColorBuffer",p.textures[1]),f&&n.setUniform("prevCharBuffer",p.textures[0]),h&&n.setUniform("prevCellColorBuffer",p.textures[2]));const i=o.compiled.externalLayers;if(i&&i.size>0&&o.externalLayerMap)for(const[u,m]of i){const b=o.externalLayerMap.get(u);if(!b){console.warn(`[textmode.synth.js] External layer not found: ${u}`);continue}const d=b.getPluginState(w);let M;d?.pingPongBuffers?M=d.pingPongBuffers[d.pingPongIndex].textures:b.drawFramebuffer&&(M=b.drawFramebuffer.textures),M&&(m.usesChar&&n.setUniform(`${m.uniformPrefix}_char`,M[0]),m.usesCharColor&&n.setUniform(`${m.uniformPrefix}_primary`,M[1]),m.usesCellColor&&n.setUniform(`${m.uniformPrefix}_cell`,M[2]))}};if(y&&o.pingPongBuffers){const p=o.pingPongBuffers[o.pingPongIndex],i=o.pingPongBuffers[1-o.pingPongIndex];i.begin(),n.clear(),n.shader(o.shader),_(p),n.rect(s.cols,s.rows),i.end(),c.begin(),n.clear(),n.shader(o.shader),_(p),n.rect(s.cols,s.rows),c.end(),o.pingPongIndex=1-o.pingPongIndex}else c.begin(),n.clear(),n.shader(o.shader),_(null),n.rect(s.cols,s.rows),c.end()})(r,e)),t.registerLayerDisposedHook(re)},uninstall(e,t){const r=[t.layerManager.base,...t.layerManager.all];for(const a of r){const n=a.getPluginState(w);n&&(n.shader?.dispose&&n.shader.dispose(),n.pingPongBuffers&&(n.pingPongBuffers[0].dispose?.(),n.pingPongBuffers[1].dispose?.()))}delete e.bpm,t.removeLayerExtension("synth"),t.removeLayerExtension("bpm"),t.removeLayerExtension("clearSynth")}};g.SynthPlugin=ae,g.SynthSource=S,g.cellColor=e=>{const t=new S;return t._colorSource=e,t},g.char=(e,t)=>{const r=new S;return r._charSource=e,r._charCount=t,r},g.charColor=e=>{const t=new S;return t._colorSource=e,t},g.gradient=function(e){return P.gradient(e)},g.noise=function(e,t){return P.noise(e,t)},g.osc=function(e,t,r){return P.osc(e,t,r)},g.paint=e=>{const t=new S;return t._colorSource=e,t._cellColorSource=e,t},g.setGlobalErrorCallback=function(e){O=e},g.shape=function(e,t,r){return P.shape(e,t,r)},g.solid=function(e,t,r,a){return P.solid(e,t,r,a)},g.src=e=>{const t=P.src;if(!e)return t();const r=new S,a=e.id??`layer_${Date.now()}_${Math.random().toString(36).slice(2,9)}`;return r.addExternalLayerRef({layerId:a,layer:e}),r},g.voronoi=function(e,t,r){return P.voronoi(e,t,r)},Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})});
@@ -30,6 +30,8 @@ export interface ShaderGenerationOptions {
30
30
  usesCharFeedback?: boolean;
31
31
  /** Whether cell color feedback (src) is used */
32
32
  usesCellColorFeedback?: boolean;
33
+ /** Whether char() function is used */
34
+ usesCharSource?: boolean;
33
35
  /** External layer references used in this shader */
34
36
  externalLayers?: Map<string, ExternalLayerInfo>;
35
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GLSLGenerator.d.ts","sourceRoot":"","sources":["../../../src/compiler/GLSLGenerator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC,2BAA2B;IAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,gCAAgC;IAChC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,mDAAmD;IACnD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gDAAgD;IAChD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,oDAAoD;IACpD,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAChD;AAuGD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAyG/E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAC1C,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACd,MAAM,CAaR"}
1
+ {"version":3,"file":"GLSLGenerator.d.ts","sourceRoot":"","sources":["../../../src/compiler/GLSLGenerator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC,2BAA2B;IAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,gCAAgC;IAChC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,mDAAmD;IACnD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gDAAgD;IAChD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sCAAsC;IACtC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oDAAoD;IACpD,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAChD;AAuGD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CA8G/E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAC1C,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACd,MAAM,CAaR"}
@@ -45,6 +45,8 @@ export interface CompiledSynthShader {
45
45
  usesCharFeedback: boolean;
46
46
  /** Whether this shader uses cell color feedback (src) - reads from prevCellColorBuffer */
47
47
  usesCellColorFeedback: boolean;
48
+ /** Whether this shader uses char() function for character indices */
49
+ usesCharSource: boolean;
48
50
  /** External layer references used in this shader, keyed by layer ID */
49
51
  externalLayers: Map<string, ExternalLayerInfo>;
50
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/compiler/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAElF;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IACjC,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,aAAa,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,aAAa,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,qDAAqD;IACrD,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACvE,4CAA4C;IAC5C,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,+FAA+F;IAC/F,qBAAqB,EAAE,OAAO,CAAC;IAC/B,oFAAoF;IACpF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,0FAA0F;IAC1F,qBAAqB,EAAE,OAAO,CAAC;IAC/B,uEAAuE;IACvE,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACtB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yBAAyB;IACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,+BAA+B;IAC/B,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CACvE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/compiler/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAElF;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IACjC,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,aAAa,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,aAAa,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,qDAAqD;IACrD,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACvE,4CAA4C;IAC5C,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,+FAA+F;IAC/F,qBAAqB,EAAE,OAAO,CAAC;IAC/B,oFAAoF;IACpF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,0FAA0F;IAC1F,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qEAAqE;IACrE,cAAc,EAAE,OAAO,CAAC;IACxB,uEAAuE;IACvE,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACtB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yBAAyB;IACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,+BAA+B;IAC/B,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CACvE"}
@@ -63,21 +63,22 @@ export interface ISynthSource {
63
63
  cellColor(source: ISynthSource): this;
64
64
  /**
65
65
  * Set the character indices using a character source chain.
66
+ * The number of characters is determined by `charMap()` if defined,
67
+ * otherwise falls back to the total characters in the layer's font.
66
68
  *
67
69
  * @param source A synth source producing character indices
68
- * @param charCount Number of different characters to use from the character mapping
69
70
  * @returns The SynthSource for chaining
70
71
  *
71
72
  * @example
72
73
  * ```ts
73
- * // Use noise to select characters
74
- * char(noise(10), 16)
74
+ * // Use noise to select characters from charMap
75
+ * char(noise(10)).charMap('@#%*+=-:. ')
75
76
  *
76
- * // Use oscillator to select characters
77
- * char(osc(5), 32)
77
+ * // Use oscillator with default font characters
78
+ * char(osc(5))
78
79
  * ```
79
80
  */
80
- char(source: ISynthSource, charCount: number): this;
81
+ char(source: ISynthSource): this;
81
82
  /**
82
83
  * Set both character foreground and cell background color using the same source chain.
83
84
  * This is a convenience method that combines `.charColor()` and `.cellColor()` in one call.
@@ -1 +1 @@
1
- {"version":3,"file":"ISynthSource.d.ts","sourceRoot":"","sources":["../../../src/core/ISynthSource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ISynthSource.d.ts","sourceRoot":"","sources":["../../../src/core/ISynthSource.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,6 @@ interface SynthSourceCreateOptions {
12
12
  colorSource?: SynthSource;
13
13
  cellColorSource?: SynthSource;
14
14
  charSource?: SynthSource;
15
- charCount?: number;
16
15
  nestedSources?: Map<number, SynthSource>;
17
16
  externalLayerRefs?: Map<number, ExternalLayerReference>;
18
17
  }
@@ -51,8 +50,6 @@ export declare class SynthSource {
51
50
  private _cellColorSource?;
52
51
  /** Reference to the character source chain (if any) - used by char() function */
53
52
  private _charSource?;
54
- /** Number of unique characters when using char() function */
55
- private _charCount?;
56
53
  /**
57
54
  * Create a new SynthSource.
58
55
  * @param options Optional initialization options
@@ -78,7 +75,7 @@ export declare class SynthSource {
78
75
  addExternalLayerRef(ref: ExternalLayerReference): this;
79
76
  charMap(chars: string): this;
80
77
  charColor(source: SynthSource): this;
81
- char(source: SynthSource, charCount: number): this;
78
+ char(source: SynthSource): this;
82
79
  cellColor(source: SynthSource): this;
83
80
  paint(source: SynthSource): this;
84
81
  clone(): SynthSource;
@@ -107,11 +104,6 @@ export declare class SynthSource {
107
104
  * @ignore
108
105
  */
109
106
  get charSource(): SynthSource | undefined;
110
- /**
111
- * Get the character count if defined (from char() function).
112
- * @ignore
113
- */
114
- get charCount(): number | undefined;
115
107
  /**
116
108
  * Get all nested sources for combine operations.
117
109
  * @ignore
@@ -1 +1 @@
1
- {"version":3,"file":"SynthSource.d.ts","sourceRoot":"","sources":["../../../src/core/SynthSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInD,MAAM,WAAW,WAAY,SAAQ,YAAY;CAAG;AAEpD;;GAEG;AACH,UAAU,wBAAwB;IACjC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACxD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,WAAW;IACvB,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IAEpC,8CAA8C;IAC9C,OAAO,CAAC,YAAY,CAAC,CAAmB;IAExC,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAE1D,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsC;IAEzE,mDAAmD;IACnD,OAAO,CAAC,YAAY,CAAC,CAAc;IAEnC,wDAAwD;IACxD,OAAO,CAAC,gBAAgB,CAAC,CAAc;IAEvC,iFAAiF;IACjF,OAAO,CAAC,WAAW,CAAC,CAAc;IAElC,6DAA6D;IAC7D,OAAO,CAAC,UAAU,CAAC,CAAS;IAE5B;;;;OAIG;gBACS,OAAO,CAAC,EAAE,wBAAwB;IAW9C;;;;OAIG;IACI,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,IAAI;IASxE;;;OAGG;IACI,mBAAmB,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,mBAAmB,EAAE,GAC7B,IAAI;IAMP;;;;OAIG;IACI,mBAAmB,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI;IAMtD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAa5B,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKpC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAMlD,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKpC,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMhC,KAAK,IAAI,WAAW;IAyB3B;;;OAGG;IACH,IAAW,UAAU,IAAI,SAAS,eAAe,EAAE,CAElD;IAED;;;OAGG;IACH,IAAW,WAAW,IAAI,gBAAgB,GAAG,SAAS,CAErD;IAED;;;OAGG;IACH,IAAW,WAAW,IAAI,WAAW,GAAG,SAAS,CAEhD;IAED;;;OAGG;IACH,IAAW,eAAe,IAAI,WAAW,GAAG,SAAS,CAEpD;IAED;;;OAGG;IACH,IAAW,UAAU,IAAI,WAAW,GAAG,SAAS,CAE/C;IAED;;;OAGG;IACH,IAAW,SAAS,IAAI,MAAM,GAAG,SAAS,CAEzC;IAED;;;OAGG;IACH,IAAW,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAEnD;IAED;;;OAGG;IACH,IAAW,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAElE;CACD"}
1
+ {"version":3,"file":"SynthSource.d.ts","sourceRoot":"","sources":["../../../src/core/SynthSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInD,MAAM,WAAW,WAAY,SAAQ,YAAY;CAAI;AAErD;;GAEG;AACH,UAAU,wBAAwB;IACjC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACxD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,WAAW;IACvB,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IAEpC,8CAA8C;IAC9C,OAAO,CAAC,YAAY,CAAC,CAAmB;IAExC,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAE1D,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsC;IAEzE,mDAAmD;IACnD,OAAO,CAAC,YAAY,CAAC,CAAc;IAEnC,wDAAwD;IACxD,OAAO,CAAC,gBAAgB,CAAC,CAAc;IAEvC,iFAAiF;IACjF,OAAO,CAAC,WAAW,CAAC,CAAc;IAElC;;;;OAIG;gBACS,OAAO,CAAC,EAAE,wBAAwB;IAU9C;;;;OAIG;IACI,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,IAAI;IASxE;;;OAGG;IACI,mBAAmB,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,mBAAmB,EAAE,GAC7B,IAAI;IAMP;;;;OAIG;IACI,mBAAmB,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI;IAMtD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAa5B,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKpC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAK/B,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKpC,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMhC,KAAK,IAAI,WAAW;IAwB3B;;;OAGG;IACH,IAAW,UAAU,IAAI,SAAS,eAAe,EAAE,CAElD;IAED;;;OAGG;IACH,IAAW,WAAW,IAAI,gBAAgB,GAAG,SAAS,CAErD;IAED;;;OAGG;IACH,IAAW,WAAW,IAAI,WAAW,GAAG,SAAS,CAEhD;IAED;;;OAGG;IACH,IAAW,eAAe,IAAI,WAAW,GAAG,SAAS,CAEpD;IAED;;;OAGG;IACH,IAAW,UAAU,IAAI,WAAW,GAAG,SAAS,CAE/C;IAID;;;OAGG;IACH,IAAW,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAEnD;IAED;;;OAGG;IACH,IAAW,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAElE;CACD"}
@@ -113,6 +113,14 @@ export interface LayerSynthState {
113
113
  * If set, this overrides the global BPM for this layer's array modulation.
114
114
  */
115
115
  bpm?: number;
116
+ /**
117
+ * Optional callback invoked when dynamic parameter evaluation fails.
118
+ * Live coding environments can use this to display errors without crashing.
119
+ *
120
+ * @param error - The error that was caught
121
+ * @param uniformName - Name of the uniform whose evaluation failed
122
+ */
123
+ onDynamicError?: (error: unknown, uniformName: string) => void;
116
124
  }
117
125
  /**
118
126
  * Character set mapping for charMap transform.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -39,4 +39,6 @@ export { SynthSource } from './core/SynthSource';
39
39
  export type { SynthParameterValue, SynthContext } from './core/types';
40
40
  export { cellColor, char, charColor, gradient, noise, osc, paint, shape, solid, src, voronoi, } from './api';
41
41
  export type { ModulatedArray, EasingFunction } from './utils/ArrayUtils';
42
+ export { setGlobalErrorCallback } from './utils/SafeEvaluator';
43
+ export type { DynamicErrorCallback } from './utils/SafeEvaluator';
42
44
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,aAAa,CAAC;AAGrB,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEtE,OAAO,EACN,SAAS,EACT,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,KAAK,EACL,GAAG,EACH,KAAK,EACL,KAAK,EACL,KAAK,EACL,GAAG,EACH,OAAO,GACP,MAAM,OAAO,CAAC;AAEf,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,aAAa,CAAC;AAGrB,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEtE,OAAO,EACN,SAAS,EACT,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,KAAK,EACL,GAAG,EACH,KAAK,EACL,KAAK,EACL,KAAK,EACL,GAAG,EACH,OAAO,GACP,MAAM,OAAO,CAAC;AAEf,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,11 +1,16 @@
1
1
  /**
2
2
  * Synth render lifecycle callback.
3
3
  *
4
- * Renders synth sources before the user draw callback.
4
+ * Handles rendering of synth sources with atomic parameter validation
5
+ * to prevent WebGL errors from incomplete uniform state.
5
6
  */
6
7
  import type { TextmodeLayer } from 'textmode.js/layering';
7
8
  /**
8
- * Render synth before user draw callback.
9
+ * Render synth source to layer framebuffers.
10
+ *
11
+ * Uses an atomic render pattern: all dynamic parameters are validated
12
+ * BEFORE any WebGL operations. If any parameter fails, the entire frame
13
+ * is skipped and the error propagates for the environment to handle.
9
14
  */
10
15
  export declare function synthRender(layer: TextmodeLayer, textmodifier: any): Promise<void>;
11
16
  //# sourceMappingURL=synthRender.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"synthRender.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/synthRender.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS1D;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,iBAyLxE"}
1
+ {"version":3,"file":"synthRender.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/synthRender.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS1D;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,iBA+LxE"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * DynamicEvaluator - Dynamic parameter evaluation for live coding environments.
3
+ *
4
+ * Provides graceful error handling for user-provided dynamic parameter functions.
5
+ * When evaluation fails, errors are reported via callback and a fallback value
6
+ * is returned, allowing rendering to continue with safe defaults.
7
+ */
8
+ import type { SynthContext } from '../core/types';
9
+ /**
10
+ * Callback signature for dynamic parameter evaluation errors.
11
+ * Live coding environments can use this to display errors without interrupting rendering.
12
+ */
13
+ export type DynamicErrorCallback = (error: unknown, uniformName: string) => void;
14
+ /**
15
+ * Options for dynamic parameter evaluation.
16
+ */
17
+ export interface EvalOptions {
18
+ /** Callback invoked when an error occurs (overrides global callback) */
19
+ onError?: DynamicErrorCallback;
20
+ }
21
+ /**
22
+ * Set a global error callback for dynamic parameter evaluation errors.
23
+ *
24
+ * Provides a centralized way for live coding environments to receive
25
+ * notifications whenever a dynamic parameter fails to evaluate.
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * import { setGlobalErrorCallback } from 'textmode.synth.js';
30
+ *
31
+ * setGlobalErrorCallback((error, uniformName) => {
32
+ * console.error(`[Synth] Parameter "${uniformName}" error:`, error);
33
+ * });
34
+ * ```
35
+ */
36
+ export declare function setGlobalErrorCallback(callback: DynamicErrorCallback | null): void;
37
+ /**
38
+ * Get the current global error callback.
39
+ */
40
+ export declare function getGlobalErrorCallback(): DynamicErrorCallback | null;
41
+ /**
42
+ * Evaluate a dynamic parameter with graceful error handling.
43
+ *
44
+ * When evaluation fails (exception or invalid value), the error is reported
45
+ * via callback and the fallback value is returned. This allows rendering to
46
+ * continue with safe defaults rather than aborting the frame.
47
+ *
48
+ * @param fn - The dynamic parameter function to evaluate
49
+ * @param uniformName - Name of the uniform (for error reporting)
50
+ * @param fallback - Value to return if evaluation fails
51
+ * @param options - Evaluation options including error callback
52
+ * @returns The evaluated value, or fallback on error
53
+ */
54
+ export declare function evaluateDynamic(fn: () => number | number[], uniformName: string, fallback: number | number[], options?: EvalOptions): number | number[];
55
+ /**
56
+ * Create a wrapped updater function with graceful error handling.
57
+ */
58
+ export declare function createDynamicUpdater(updater: (ctx: SynthContext) => number | number[], uniformName: string, fallback: number | number[], onError?: DynamicErrorCallback): (ctx: SynthContext) => number | number[];
59
+ //# sourceMappingURL=SafeEvaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SafeEvaluator.d.ts","sourceRoot":"","sources":["../../../src/utils/SafeEvaluator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;AAEjF;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,wEAAwE;IACxE,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAClC;AAOD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAElF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,oBAAoB,GAAG,IAAI,CAEpE;AAoBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC3B,EAAE,EAAE,MAAM,MAAM,GAAG,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,OAAO,GAAE,WAAgB,GAC1B,MAAM,GAAG,MAAM,EAAE,CAmBnB;AAqCD;;GAEG;AACH,wBAAgB,oBAAoB,CAChC,OAAO,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,GAAG,MAAM,EAAE,EACjD,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,OAAO,CAAC,EAAE,oBAAoB,GAC/B,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,GAAG,MAAM,EAAE,CAG1C"}
@@ -1,12 +1,8 @@
1
1
  /**
2
2
  * Utilities module exports.
3
- *
4
- * This module provides utility classes and functions used throughout
5
- * the synth engine.
6
- *
7
- * @module
8
3
  */
9
4
  export { EASING_FUNCTIONS, initArrayUtils, getArrayValue, isModulatedArray, type EasingFunction, type ModulatedArray, } from './ArrayUtils';
10
5
  export { CharacterResolver } from './CharacterResolver';
11
6
  export { collectExternalLayerRefs } from './collectExternalLayerRefs';
7
+ export { evaluateDynamic, createDynamicUpdater, setGlobalErrorCallback, getGlobalErrorCallback, type DynamicErrorCallback, type EvalOptions, } from './SafeEvaluator';
12
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACN,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,GACnB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACN,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,GACnB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,OAAO,EACN,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,oBAAoB,EACzB,KAAK,WAAW,GAChB,MAAM,iBAAiB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "textmode.synth.js",
3
- "version": "1.0.0-beta.3",
3
+ "version": "1.0.0-beta.5",
4
4
  "description": "Synth engine for textmode.js",
5
5
  "type": "module",
6
6
  "types": "./dist/types/index.d.ts",