Pictures, landscapes, creatures, fonts and a small spiking brain - all generated by Faust programs. The idea: one sample does not have to be an audio sample. It can be a pixel, a grid cell, a ray step or a water drop, so the same language that makes sound can make pictures - and a picture and its sound can be one program.
A selection from a larger project: one or two examples per kind. Each .dsp starts
with a comment saying what it is and how to build it.
faust on your PATH (or FAUST=/path/to/faust), SDL2 (pkg-config sdl2), a C
compiler. Optional: ffmpeg (video input), Blender 4.x (the Blender examples).
| kind | files | build |
|---|---|---|
| quick start | examples/quick/plasma.dsp (picture), pluck.dsp (sound) |
tools/mkfield.sh examples/quick/plasma.dsp 160 120 1 3, tools/mkplay.sh examples/quick/pluck.dsp |
| video effects, each with a sound twin | model/kaleido.dsp, model/tunnel.dsp (+ model/audio/) |
tools/mkmodel.sh model/kaleido.dsp |
| fonts | assets/font.dsp - a stroke font drawn by distance to its strokes, 10 styles |
tools/mkfield.sh assets/font.dsp 480 160 1 3 |
| terrain | terrain/mapgen.dsp (map), terrain/erosion.dsp (rain carving the land live, one sample = one drop step) |
tools/mkfield.sh terrain/mapgen.dsp 320 240 1 3 |
| sound and picture | sonify/spectext.dsp (text written into the spectrum), sonify/oscmusic.dsp (XY oscilloscope drawings) |
tools/mkplay.sh sonify/spectext.dsp |
| creatures | characters/creaturegrid.dsp + characters/types.csv: Faust builds a 3D distance grid, the GPU draws it |
tools/mkcreatures.sh, then characters/creatures |
| a spiking brain | brains/spikes.dsp - 48 leaky integrate-and-fire neurons you can hear |
tools/mkplay.sh brains/spikes.dsp |
| Blender | blender/landscape.py, blender/blocky.py - Faust makes the land / the creature, Blender renders |
tools/blenderassets.sh, then run the script in Blender |
| a plugin | plugins/src/echoscope.dsp + gui/: a CLAP echo whose whole interface is also Faust |
tools/mkclapgui.sh echoscope (needs the CLAP headers) |
| FPGA | fpga/xorplasma.dsp - a pattern for Faust's VHDL backend |
faust -lang vhdl fpga/xorplasma.dsp |
| meters and scopes | scopes/scopedraw.dsp draws every pixel of an audio dashboard - oscilloscope, spectrum, spectrogram, goniometer, analog VU meters, a tuner, LUFS loudness; scopes/scopesrc.dsp makes the sound and the measurements |
tools/mkscope.sh, then pc/scopes (L switches layouts) |
All rendered headless from the programs in this repo.
| library | what it gives | pros | cons |
|---|---|---|---|
lib/daw.lib |
dw_scan(N) (which pixel/cell), dw_frames(N, period) (which frame), plus sequencer helpers |
counters that wrap cleanly (ba.time % N overflows after minutes at video rates); one idiom in every picture program |
the frame count wraps at period; raster and sequencer helpers share one file |
lib/terrain.lib |
Parberry's designer value noise: 5 height distributions, incl. real USGS Utah data | the distribution shapes the land (plains, plateaus, peaks); exact integer hash, same land on every target | its table cannot be read inside another table's init (a Faust bug: zeros) - use the _direct variants there, which compile slower; up to 8 octaves unrolled |
lib/strokefont.lib |
56 glyphs as line segments, sf_dist = distance to the nearest stroke |
resolution-free; weight, outline, glow, shadow, 3D all come from one distance; tiny | capitals, digits and punctuation only; monospaced; up to 11 segments per glyph per distance call; generated by tools/fontdata.py |
lib/streamaudio.lib |
the chain around an effect's sound: gain, bass, treble, drive, compressor, width, mix, output | the same fader names in every effect, so a picture and its sound follow one control | fixed order; a simple stereo-linked compressor |
lib/streamvideo.lib |
the same faders on the picture (bass = glow, treble = sharpen, width = saturation ...) | see what you hear; imports the audio faders, so the labels cannot drift | the mappings are analogies, not physics; the 9x9 blur shifts the picture by 4 pixels |
lib/creatures.lib (+ characters/types.csv) |
creatures as distance functions: body, horns, spikes, arms/wings, legs, head, tail, a painted face | a new creature type is one CSV row; the GPU draws them at full speed | every part is computed for every type (cost grows with kinds of part); faces are painted, so low grid sizes blur them; per-pixel CPU ray marching does not compile with many types - build a grid instead |
- Terrain noise: Ian Parberry, Designer Worlds: Procedural Generation of Infinite Terrain from USGS Elevation Data (2013) - the Utah height table is from its Table II.
- Erosion: Nick McDonald, Simple Particle-Based Hydraulic Erosion (2020).
- Map pipeline: blog.bluepulsar.cz, map generator post.
- The viewers' text font is DejaVu Sans Mono (
pc/assets/FONT-LICENSE.txt).















