Preset configurations for each effect — copy the command, pipe to ffplay, and hear it. All presets use pot values from the default pot_descr ranges in the source headers.
You need the project built and input.raw ready:
git clone https://github.com/dogxhood/audionoise.git && cd audionoise
make # builds convert + lookup tables
make input.raw # decodes BassForLinus.mp3 → s32le 48kHz mono
The playback command is always the same — only the effect name changes:
./convert <effect> input.raw | ffplay -v fatal -nodisp -autoexit \
-f s32le -ar 48000 -ch_layout mono -i pipe:0
Sweeps four allpass filter stages with a triangle LFO. The notches in the frequency response move together, creating the classic whooshing sound. Feedback adds resonance at the sweep peaks.
Short delay line with LFO modulation creates a comb filter that sweeps through the frequency spectrum — the classic jet-plane sound. The 1024-sample buffer (≈21 ms) limits max delay to 4 ms. Output is (dry + wet) / 2 — no mix pot.
limit_value() catches it but it clips hard.
Simple echo with smoothed delay target to avoid clicking when the delay pot moves. Feedback controls trail length — with high feedback the echo decays slowly; below ~0.95 it will always converge to silence eventually.
linear(0.001, delay, target_delay) — blending 0.1% toward
the target per sample. At 48 kHz, a 100-sample delay change takes
about 46 ms to fully reach. This prevents zipper noise when you move the pot.
High gain stage with tone shaping and a wavefolding clipper instead of hard saturation. The wavefolder bounces the signal off the output level ceiling and floor — gives a different harmonic character than simple clipping.
fold() loop runs
until the signal is within bounds; with extreme settings it iterates multiple times
per sample.
Tracks signal level with an attack/release envelope follower.
The compression ratio is applied above the threshold using
(level/env)^(1−1/ratio), and the gain change is smoothed
at 1% per sample to avoid pumping artifacts.
convert processes one effect at a time, but you can chain them
via pipe. The signal stays in s32le format between stages.
# Compressor → Boost → Phaser
./convert compressor input.raw \
| ./convert boost /dev/stdin \
| ./convert phaser /dev/stdin \
| ffplay -f s32le -ar 48000 -ch_layout mono -i pipe:0
# Or write intermediate files if you want to visualise each stage
./convert compressor input.raw > stage1.raw
./convert boost stage1.raw > stage2.raw
./convert phaser stage2.raw > stage3.raw
./visualize.py input.raw stage1.raw stage2.raw stage3.raw
Chaining is not how the hardware works — on the RP2354 effects run in a single per-sample loop in priority order — but it is useful for simulation and debugging.