<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Infinite]]></title><description><![CDATA[Infinite]]></description><link>https://infinitedevices.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Wed, 28 Oct 2026 23:42:48 GMT</lastBuildDate><atom:link href="https://infinitedevices.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[designing a domain-inferred kernel language for shaders, javascript sketches, and audio dsp
]]></title><description><![CDATA[how infinite compiles math kernels into glsl shaders, p5-style javascript sketches, or sample-level dsp on an infinite node canvas. free]]></description><link>https://infinitedevices.hashnode.dev/designing-a-domain-inferred-kernel-language-for-shaders-javascript-sketches-and-audio-dsp</link><guid isPermaLink="true">https://infinitedevices.hashnode.dev/designing-a-domain-inferred-kernel-language-for-shaders-javascript-sketches-and-audio-dsp</guid><category><![CDATA[compilers]]></category><category><![CDATA[creative coding]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[naman]]></dc:creator><pubDate>Sat, 17 Oct 2026 07:43:50 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>how infinite infers execution backends (glsl, javascript 2d sketches, or sample-level dsp) from context.</p>
</blockquote>
<img src="https://raw.githubusercontent.com/n1m21n/infinite/main/website/assets/field_pixel_editor.png" alt="Field Live Code Editor in Infinite" style="display:block;margin:0 auto" />

<p>most nodes in a modular workstation do one fixed thing: a blur node blurs, a delay node delays. but creative coding requires flexibility. instead of forcing artists to write separate code in glsl for shaders, c++ for audio dsp, and compute shaders for mesh deformers, we built <strong>field</strong>, an embedded domain-inferred kernel language inside <a href="https://infinitedevices.org">infinite</a>, alongside native <strong>javascript sketches</strong>.</p>
<h3>1. the core concept: write the kernel, infer the domain</h3>
<p>in field, you write a short kernel that runs once per element of a domain forever. you never explicitly declare where it runs:</p>
<pre><code class="language-glsl">// once per pixel, on the gpu: a shader
p = (uv - 0.5) * aspect;
col = vec3(sin(p.x * 12.0 + t), cos(p.y * 8.0 - t), sin(t * 0.5));

// once per point in a 3d mesh: a geometry deformer
p.y += sin(p.x * 4.0 + t) * 0.2;

// once per audio sample: a dsp effect
out = in * gain;
</code></pre>
<p>from the variables your code accesses, field infers whether to compile the kernel straight into glsl for the gpu pipeline or into a high-performance vector loop for sample-level audio processing.</p>
<h3>2. javascript sketches: p5-style algorithmic art</h3>
<p>for developers who prefer procedural 2d algorithmic art, strange attractors, and cellular automata, infinite includes a native <strong>sketch</strong> node running embedded javascript:</p>
<img src="https://raw.githubusercontent.com/n1m21n/infinite/main/art/sketch_showcase_preview.png" alt="JavaScript Sketch Showcase in Infinite" style="display:block;margin:0 auto" />

<pre><code class="language-javascript">param("points", 9000, 1000, 30000);
param("drift", 0.15, 0, 1);
param("size", 1.6, 0.5, 4);

function draw(t) {
  background(0.03, 0.03, 0.06);
  const a = -1.4 + 0.25 * sin(t * drift), b = 1.6 + 0.2 * cos(t * drift * 0.8);
  const c = 1.0 + 0.2 * sin(t * drift * 0.6), d = 0.7;
  let x = 0.1, y = 0.1;
  const k = min(width, height) * 0.2;
  noStroke();
  for (let i = 0; i &lt; points; i++) {
    const nx = sin(a * y) + c * cos(a * x), ny = sin(b * x) + d * cos(b * y);
    x = nx; y = ny;
    if (i &gt; 20) {
      fill(hsl(0.55 + 0.25 * (i / points), 0.7, 0.62, 0.35));
      circle(width / 2 + x * k, height / 2 + y * k, size);
    }
  }
}
</code></pre>
<h3>3. dynamic pins without c++ recompilation</h3>
<p>field nodes can declare dynamic input and output pins directly in code:</p>
<pre><code class="language-plaintext">param float size = 0.3 [0.05, 0.6];
param float feedback = 0.7 [0.0, 1.0];
</code></pre>
<p>infinite parses these declarations and immediately exposes real, cable-wireable pins on the node canvas that can connect to any lfo, midi controller, or hosted vst3 plugin slider.</p>
<ul>
<li><p>read the manual and try it: <a href="https://infinitedevices.org">https://infinitedevices.org</a></p>
</li>
<li><p>full repository: <a href="https://github.com/n1m21n/infinite">https://github.com/n1m21n/infinite</a></p>
</li>
</ul>
]]></content:encoded></item></channel></rss>