Hydra has four independent output buffers (o0–o3) that render separately and can be cross-mixed
Hydra maintains four independent virtual output framebuffers named o0, o1, o2, o3, each backed by a GPU frame buffer and able to render a different visual. A chain routes to a buffer by naming it inside .out() — .out() with no argument defaults to o0. A chain in one buffer does not disturb the others. For monitoring, render() with no argument tiles all four in a grid, while render(o2) shows one buffer full-screen; by default only o0 is displayed. The real power is cross-mixing: any buffer can be read back as a texture with src(o1) and used as a source, blend target, or modulate target in another chain — enabling feedback, layering, and inter-patch compositing entirely in the browser. Two fundamental operations connect buffers: blend() does arithmetic on pixel colors, and modulate() uses one buffer’s colors to warp another’s coordinates. This framebuffer model is directly inspired by analog video patch bays, and it is a core live-performance tool: build a visual on a hidden buffer while another is live, then switch which buffer is shown to stage a transition.
Examples
osc(10).out(o0)
noise().out(o1)
render() // all four quadrants
render(o1) // o1 full screen
osc(20,0.1,0.8).out(o0)
osc(10,0.2,0.8).diff(o0).out(o1) // composite o0 into o1
render(o1)
src(o0).add(src(o1)).out(o2) — combine a camera feed and an oscillator. Prepare o1 while o0 is live, then render(o1) to cut to it.
Assessment
Explain what render() with no arguments does vs render(o2). Route two different oscillators to o0 and o1, composite them with diff() into a third buffer, and show the result on screen. Distinguish blend from modulate in terms of which property of the input signal each uses, and describe how a performer uses multiple buffers to stage a visual transition.