βambi

contribute

the shared system

What every plugin shares, and the two things each one owns.

bambi is several plugins built as one program. A slider, a matrix and an undo stack are written once and used by every plugin; a plugin that redrew them would be three codebases wearing a family name. The boundary between shared and owned is not what looks similar, but what would have to change in two places if it changed at all.

what each plugin owns

Exactly two things: its engine and its parameter set.

plugin takes gives engine
encoder a mono or stereo track an ambisonic field places a source on the sphere along a path, moved by the input’s own features
echo an ambisonic field an ambisonic field four loops fed by one send region, each turned, slid and blurred a little further every pass
reverb an ambisonic field an ambisonic field one room: early reflections read from the direction each part of the field arrives from, and a tail

what is shared

The core. Spherical harmonics, trajectories, features, modulation, regions, state, undo, parameters, the link bus and the scene’s geometry. Every plugin’s musical behaviour is here, tested without a host.

The infrastructure.

The window. One component library, with one file for the look. The layout is the same in every plugin: the scene top left, the matrix under it, the plugin’s tabs on the right, the levels at the far right. The header, the settings page, the scene, the probe and the region editor are each one component. See the look.

The modulation matrix. The component and the workflow are shared; the targets each plugin offers are its own. The generators, three LFOs and three envelopes, are in every plugin. See modulation.

repeating patterns are one component

If the same interaction appears in two places, it is one component or it is a defect. The choice between free and synced timing appears in the LFOs, in Echo’s tap period and in its offset: it is one control, drawn one way, with one behaviour. A new plugin that needs something close to an existing component extends that component.

chaining instead of modules

The plugins do not contain each other. An echo of a room is a Reverb followed by an Echo on the same track; a hole in the field, a spotlight or a tremolo by direction is a region, applied wherever it is wanted. A dry path is the host’s. Keeping each plugin to one engine is what keeps each one small enough to understand.