Skip to content

About

Pictures, terrain, creatures, fonts and a spiking brain - generated by Faust programs. One sample is not always audio.

Resources

Stars

1 star

Watchers

1 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

Repository files navigation

faust beyond audio

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.

A Faust landscape rendered in Blender

Needs

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).

The 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)

A blocky Faust creature rendered in Blender

What they look like

All rendered headless from the programs in this repo.

plasma examples/quick/plasma.dsp map terrain/mapgen.dsp
erosion terrain/erosion.dsp after 1200 frames: rivers (blue) and lakes font assets/font.dsp, 3D style
kaleido model/kaleido.dsp tunnel model/tunnel.dsp
spectext sonify/spectext.dsp - its sound, seen as a spectrogram oscmusic sonify/oscmusic.dsp - its left/right channels drawn as XY
creatures creatures on the GPU: dragon, jelly, glimmet, mushroom echoscope the Echoscope plugin's panel, drawn by Faust
dashboard the scope dashboard vu analog VU meters
lab the lab layout: tuner, LUFS, history fpga fpga/xorplasma.dsp, the frame the hardware should draw (C render)

The libraries - pros and cons

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

Credits

  • 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).

About

Pictures, terrain, creatures, fonts and a spiking brain - generated by Faust programs. One sample is not always audio.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages