[HN Gopher] Let's Write a Reverb (2021)
___________________________________________________________________
Let's Write a Reverb (2021)
Author : notagoodidea
Score : 353 points
Date : 2024-08-15 07:37 UTC (5 days ago)
(HTM) web link (signalsmith-audio.co.uk)
(TXT) w3m dump (signalsmith-audio.co.uk)
| prashp wrote:
| Is it possible to model reverb using a neural network (e.g.
| wavenet or LSTMs) for real-time use? Is this what something like
| Neural DSP is doing under the hood?
| landonxjames wrote:
| Not sure about Neural DSP or reverbs in general, but real-time
| neural network based DSP seems very possible. The open source
| Neural amp modeler[1] would be a good place to start diving in.
|
| [1] https://www.neuralampmodeler.com/the-code
| prashp wrote:
| I have tried NAM but with limited success in modeling some
| time-based effects (e.g. octave shifting). However, I have
| not tried to model reverb effects.
| intalentive wrote:
| To handle time-based effects you need a custom
| architecture.
|
| https://www.research.ed.ac.uk/en/publications/neural-
| modelli...
|
| Don't use NAM. Learn PyTorch.
| prashp wrote:
| NAM uses pytorch for its NN implementation?
| intalentive wrote:
| It is 100% possible and there are a slew of tricks you can
| use to get big performance boosts with negligible cost to
| accuracy.
| prashp wrote:
| Do you know what the tricks are?
| intalentive wrote:
| 1. Don't use LSTMs (4 vector-matrix multiplies) or GRUs
| (3 multiplies). Use a fixed Hippo matrix to update state.
| Just 1 multiply and since it's fixed you can unroll
| during training, much faster than backprop through time.
|
| 2. Write SIMD intrinsics by hand. None of the libraries
| are as fast.
|
| 3. Don't use sigmoid or tanh functions as your nonlinear
| activation. Instead approximate them with the softsign
| function which is much cheaper.
|
| Depends on exact architecture, but these optimizations
| have yielded 10-30x improvement for single threaded CPU
| real time audio applications.
|
| When GPU audio matures all this may be unnecessary.
| duped wrote:
| The trick is not to use NNs for DSP but to discover the
| parameters for the DSP. In other words you hardcode the signal
| flow architecture using a common technique like an FDN but then
| train a NN to find "good" sounding parameters, like comparing
| to a convolution reverb or recordings.
|
| The thing about reverb is they require a lot of state and
| nonlinearity is undesirable.
| squeaky-clean wrote:
| For reverb I don't see much practical use, mainly because you
| can capture a pretty-much-perfect recreation of a real space
| with an impulse response. No need for thousands or millions of
| rounds of training a network. For unrealistic reverbs, you have
| the problem that to get training data you'd have to invent
| several unrealistic reverb effects to apply to sounds. And once
| you've made those effects, there's not really any reason to
| neural-netify them.
|
| For NeuralDSP it's a bit different because they use NN's to
| simulate a guitar amp circuit which is a nonlinear system and
| so there's no simple way to "capture" the effect the way that
| you can for reverb sims or speaker sims. And while you can make
| a very accurate model using something like SPICE, that won't
| run in realtime. With traditional amp modeling you basically
| take the SPICE version and try to optimize and cheat as much as
| you can so it can run in realtime, at the cost of accuracy.
|
| So that's what NeuralDSP's goal is, a system that approximates
| the amplifier but can also be computed in real-time, except
| done using a trained NN instead of a human-optimized variant of
| the SPICE circuit.
|
| They have a couple whitepapers on their website, though none of
| them go deep enough to really give away their secret sauce. But
| basically according to them, making a NN model of an amplifier
| at a fixed setting is fairly simple. Where they had to get
| novel with it is adjustable settings/parameters. E.g. turning
| the drive up, or turning the treble down. Just capturing a few
| hundred or thousand models based on adjusting parameters and
| cross-fading between them doesn't sound realistic. So they had
| to come up with a larger model architecture that can "learn"
| those parameter changes.
|
| https://arxiv.org/pdf/2403.08559
| intalentive wrote:
| It's not that hard, you just collect a lot of data. Much
| easier with a robot turning the knobs. Predict the next
| sample based on input and knob settings.
| pierrec wrote:
| Easily the most approachable yet complete writeup I've seen on
| the topic. I've always noticed an aura of esoteric dark magic
| around writing good algorithmic reverbs, this makes it seems less
| daunting.
|
| Since the author does a quick comparison between convolution and
| algorithmic reverbs, I'll mention how I often _combine_ them: a
| small /medium convolution reverb, plus a long algorithmic reverb.
| The convolution can perfectly diffuse the signal and it can also
| give a precise character to the sound, depending on the impulse
| response. It's great for adding a "body" to a raw sound
| generator. The algorithmic layer then adds a subtle ambience that
| can be extra long if desired.
| joshka wrote:
| Take a look at the articles on Valhalla's site. They're another
| goldmine https://valhalladsp.com/learn/
| cyco130 wrote:
| Came to write this. The guy not only makes _the_ best
| algorithmic reverb plugins out there and sells them very
| cheap, he also shares his obsessively deep and broad
| knowledge on the subject. Big fan.
| fuhsnn wrote:
| >throw a random-number generator at all the delay times
|
| Reverb algorithms are indeed random enough, a leading audio
| plugin brand once came up with a randomizing reverb freeware[0]
| embedded with a "submit when it sounds cool" button.
|
| https://www.kvraudio.com/forum/viewtopic.php?t=453229
| NikkiA wrote:
| u-he weren't the only ones either:
|
| https://bedroomproducersblog.com/2021/11/17/baby-audio-magic...
|
| And while it's not a one-button random reverb, MCharmVerb also
| heavily relies on randomizing:
|
| https://www.meldaproduction.com/MCharmVerb
| peterburkimsher wrote:
| On my personal laptop (Mac), I used AU Lab to apply effects to
| the music I listened to, and discovered that I like the ambience
| provided by adding a little reverb.
|
| I'm interested in doing the same at work, but the office PCs run
| Windows and I'm somewhat limited in what I can install.
|
| The Arduino Audio Tools library seemed like it would work, but it
| only applies effects on one channel.
|
| https://github.com/pschatzmann/arduino-audio-tools/wiki/Audi...
|
| I discovered the Wishing Well stereo reverb pedal, and am
| wondering whether building one will allow me to apply the effect
| to music from an iPod, rather than a guitar.
|
| https://scientificguitarist.wixsite.com/home/wishing-well
|
| If anybody would like to group-buy the Wishing Well, please let
| me know - if I order PCBs and parts, I'll have spares.
| parentheses wrote:
| I came expecting DSP code but was pleasantly surprised by this!
|
| If anyone has any other interesting ones to share about how audio
| hardware and software are built, I'd love to see them!
| Slow_Hand wrote:
| Sean Costello of Valhalla DSP is doing excellent work with his
| designs. He's got a series of blog posts that delve into
| various approaches for designing reverb algorithms:
|
| https://valhalladsp.com/2021/09/20/getting-started-with-reve...
|
| https://valhalladsp.com/2021/09/22/getting-started-with-reve...
| djmips wrote:
| Here's a video that just dropped that's starting at very
| approachable first principles, coding as they go. It's is also
| entertaining and they promise to continue with the series which
| I look forward too. The code will be shared as well.
|
| https://youtube.com/watch?v=iA6wRgwl7k0
| squeaky-clean wrote:
| Fantastic article from start to finish. Great explanation, great
| audio samples, and from a first skim the C++ example looks very
| readable.
|
| > I haven't found any good resources on this particular diffuser
| design. I found a couple of forum posts and a paragraph from a
| book
|
| When I read this my first thought was "this is a link to a
| comment by mystran on KVR, isn't it?" And yep. If you're looking
| for some obscure DSP knowledge, all Google searches eventually
| lead to a comment by mystran.
| signalsmith wrote:
| Haha, yeah - although their comment was only considering the 2D
| case, same as the book.
|
| You can make a (very efficient!) diffuser from 2-channel
| rotations, but you have to tune it a bit to get it smooth
| without having a slow attack. With more channels, it's much
| easier to get right.
| Optimal_Persona wrote:
| I hang around the KVR DSP forums and indeed, it's always
| impressive to see mystran answer questions posed by world-class
| commercial plugin devs who are stumped or stuck somewhere.
| mystran appears to have one of the best understanding of both
| DSP theory and the tricks required to implement efficient C++
| algorithms.
| chilling wrote:
| Very nice tutorial, and extremally nicely done!
|
| It's worth knowing that some of those effects can also be achived
| (of course much much more simplified) in all modern browsers
| using the Web Audio API. I created mobbler[0] using that, and I
| also wrote a small tutorial on how some of the effects can be
| achieved using simple modules (it might seem too complex at first
| glance, but you can just look at the pictures)[1].
|
| [0]: https://github.com/Megaemce/mobbler
|
| [1]: https://github.com/Megaemce/mobbler/wiki/Tutorials
| signalsmith wrote:
| Given the number of connections/nodes in my design, I'd be
| interested to know what the performance is.
|
| For Web Audio, there's an increasing trend of compiling WASM
| and running it in an AudioWorkletProcessor, which is maybe 2-3x
| slower than native. It's actually how I do a lot of my
| prototyping now, because the Emscripten build times are faster
| than a full plugin, and I can send it to people without them
| having to install anything.
| chaosprint wrote:
| Signalsmith Audio always has great posts. Their article on pitch
| shift is also worth a look! I have also posted before:
|
| https://news.ycombinator.com/item?id=36706588
|
| Speaking of reverb, I implemented a Dattorro reverb
| (https://ccrma.stanford.edu/~dattorro/EffectDesignPart1.pdf) in
| Rust before.
|
| https://github.com/chaosprint/dattorro-vst-rs
|
| It's based on Glicol source code here:
|
| https://github.com/chaosprint/glicol/blob/main/rs/synth/src/...
|
| You can play with it here:
|
| https://glicol.org/demo#handmadedattorroreverb
|
| Also you don't want to miss the Tom Erbe's reverb patches in Pure
| Data. Patches demonstrating several types of reverb (Schroeder,
| Moorer, Moore, Gerzon, Dattorro):
|
| https://tre.ucsd.edu/wordpress/?p=625
| signalsmith wrote:
| Whoah - the author (Signalsmith) here! This was a fun way to wake
| up, and I'm happy to answer any questions.
| 127 wrote:
| Nothing to ask, really. Just saying thanks for a fantastic
| intro to reverb, that I used as one of the sources to implement
| my own. Hope to see more audio processing educational material.
| 22c wrote:
| Thanks for the enjoyable article!
|
| Possibly off-topic, but I am coder with hobbyist interest in
| the DSP space. I have never really had a "penny drop" moment
| when it comes to starting from nothing and generating sound.
|
| Even generating simple sine wave seems like either a big chore
| or a completely abstract concept (depending on the
| tools/libraries/environment), I have not been able to find a
| middle-ground where I feel like I am learning but not getting
| completely lost in trigonometry or calculus. I am not sure if
| I'm not using the right tools or if I need to start even
| simpler and build up. GNU Radio comes close to scratching an
| itch for me of generating signal processing pipelines and a bit
| of intuition, but ultimately it becomes pretty easy to get lost
| in that as well (and it seems mostly focused on actual radio
| use-cases).
|
| Do you have any advice for someone looking to build more
| familiarity or intuition on this front?
| signalsmith wrote:
| First, join a good community! If you're on Discord, TAP is
| great: https://discord.gg/aBghGGcfYs - it's beginner-friendly
| while also having some heavy-hitters in there, and it's
| generally wholesome. You're not the only hobbyist learner,
| and it's important to have a place you can ask questions
| without feeling awkward.
|
| If you swap language/environment later, you'll carry your
| understanding/intuition with you, so you don't have to start
| with C++ if that's not your bag (even though it's still the
| industry standard). There are audio-specific languages with
| JIT runtimes (which can be used in
| Logic/Reaper/GarageBand/etc.), Rust/JS frameworks, etc. so
| find the one that feels good to tinker with, and keep that
| momentum/motivation going. :)
| 22c wrote:
| Thank you for the advice!
| codedokode wrote:
| You could start with making sounds using a software synth or
| PureData. There will be no issues with generating sine waves.
| And there are lot of tutorials for this.
|
| If you aim for performance, you will have to use SIMD and
| language that supports it (for example, C, Rust).
| pixelpoet wrote:
| Not a question but, really cool articles on your page, cheers
| :)
| chaosprint wrote:
| Thanks for writing so many blogs. The adc talk was also great.
| Have you considered doing some demos with wasm on the web?
| Also, have you considered porting these packages to rust?
| signalsmith wrote:
| I haven't done anything with Rust yet, but it's on my free-
| time wishlist.
|
| I'm working on WASM demos! I've been playing with WASM builds
| of my plugins, and it's great for prototyping/sharing, but it
| could definitely be set up better for demos/teaching:
| https://signalsmith-audio.co.uk/tmp/web-
| audio/?url=/tmp/basi...
| cp3io wrote:
| FWIW, this is my implementation of this reverb in Rust:
| https://github.com/cornedriesprong/cp3-dsp-
| rs/blob/main/src/...
| chr15m wrote:
| Thanks so much for taking the time to write this up clearly. I
| now have a much better understanding of how recent work than I
| did before. Really appreciate it!
| bambax wrote:
| Brillant article! Thanks!
|
| Are you also "Geraint"? (The home page https://signalsmith-
| audio.co.uk/ says "we" but the Geraint page
| https://geraintluff.github.io/jsfx/ says "I"...?)
|
| Geraint's plugins are a great collection of excellent (and
| free) effects for Reaper, with a superb GUI (which isn't easy
| to do in Reaper/JSFX). So thanks also for this! ;-)
| signalsmith wrote:
| Yes, I'm Geraint. :D I'm the tech side of Signalsmith Audio,
| and my partner is the Business Brain. The JSFX plugins are
| mostly from before we made a proper company (back when
| Signalsmith was just my username) - I'm glad you're enjoying
| them!
| bambax wrote:
| Ah, excellent! Congrats again!
| nkozyra wrote:
| Do you do anything with hardware/microcontrollers? I dabble
| in the daisy/rasbpi world for synthesis and effects, but
| have always just used off-the-shelf reverb in the chain and
| things like teensy audio are fine but not especially great
| (specifically things like shimmer reverb)
| signalsmith wrote:
| I'm not really a hardware person, although at this point
| I've done a couple of guitar-pedal projects. My favourite
| is to write OS-independent C++ DSP classes, and work with
| a team/client who handles the gnarly
| build/signatures/UI/embedded stuff.
| nkozyra wrote:
| That makes sense.
|
| > I'm not really a hardware person
|
| Neither am I, most of the fun is in the software anyway.
| The rest is just some amateurish solder work and
| compiling an array of components I may or may not use.
| copperx wrote:
| Do you happen to know the basis of state of the art reverb
| algorithms such as the one used for the Bricasti? Are there any
| clues as to how they work, or are they completely proprietary
| black magic?
| signalsmith wrote:
| I don't know anything about proprietary reverbs, I'm afraid -
| particularly hardware units! Sometimes you can tell things
| about a reverb's internals by looking at impulse responses,
| but I've always had more fun designing something from
| scratch.
| Optimal_Persona wrote:
| One of my favorite things I've ever found on the internet
| is the "Reverb Subculture" thread on GearSpace.
| https://gearspace.com/board/geekzone/380233-reverb-
| subcultur...
|
| It's a discussion of some of the finer (and coarser) parts
| of reverb design and includes comments from Casey Dowdell
| (Bricasti), Sean Costello (Valhalla DSP), Matt from
| LiquidSonics, Urs Heckmann (u-he), Chris from Airwindows,
| Stian (Acon Digital) and other top-notch audio DSP gurus.
| They're not giving away trade secrets but there are
| fascinating discussions around reverb design, topology,
| theory, and of course perception.
| Souk wrote:
| Thanks for this! Your reaper plugins were a great inspiration
| for me to learn JSFX and make my own effects. I was pleasantly
| surprise to see you're still sharing things with the community
| when I stumbled onto your talk about pitch-shifting at ADC :)
| Glad to have found a whole blog to explore! Thanks again :)
| mr_sturd wrote:
| Thanks for this, Geraint! I've been trying to get a better
| understanding in programming for DSP, and blog posts like this
| are a big help with that.
|
| I have subscribed to your blog.
| phkahler wrote:
| Care to offer feedback on my 8-band EQ implementation for OBS?
|
| https://github.com/phkahler/obs-studio/tree/eq8
|
| It got rejected but only because they don't want the feature.
| My implementation does seem different to most which I think use
| band-pass filters instead.
| codedokode wrote:
| Interesting article, however in drums demo the reverb sound
| increases after the drum is hit, and this doesn't seem natural. I
| would expect the reverb to have only decay phase, but here the
| reverb has a slow attack as well.
| signalsmith wrote:
| *EDIT*: I just realised that the demo you're talking about
| doesn't include the "early reflections"! So that demo only
| includes echoes which have gone through the main feedback
| delays at least once.
|
| If you mix in some of the diffused signal directly, it bridges
| the gap between the initial sound and the feedback echoes:
| https://signalsmith-audio.co.uk/writing/2021/lets-write-a-re...
|
| ---
|
| You can tune the diffuser to have an almost-instant onset. I
| can't remember what I did last time, but at a guess, having the
| largest diffuser stage increase by a factor of N (number of
| channels) instead of 2 might do it.
|
| But also, if you're playing acoustic drums in a big space like
| a concert hall (instead of a long one like a staircase), the
| first echoes coming back from the walls _are_ actually a bit
| delayed (1 foot ~= 1ms, at the speed of sound). So if your
| nearest wall is 10ft away, the first wall-echoes will come
| 10-20ms after the initial direct sound.
| codedokode wrote:
| I wonder where do you find information like this? E.g. how a
| reverd is made, how those electronic drum sounds from classic
| drum machines are made and so on? Is there something like a big
| catalogue of different tricks and algorithms?
| signalsmith wrote:
| Some stuff is around the web, some is from other people.
| Particularly for classic kit, someone's usually analysed it
| before, but it's not always in a good tutorial kind of form.
| Personally, I did a _lot_ of messing around with audio
| /programming from my early teens onwards, and built my
| intuition about how the maths and sound link up from years of
| tinkering without many reference resources.
|
| A lot of this stuff can be made from relatively simple
| building-blocks though, and you don't have to copy a previous
| configuration. My thought process was pretty much exactly as
| written in the blog-post! I just wanted to make something which
| didn't require any special tuning skills.
| ovi256 wrote:
| This one, making reverbs, at least is taught in signal
| processing classes in EE courses
| bravura wrote:
| Is there a way to get "realistic" reverb using GPU computation?
| thinkingtoilet wrote:
| I think a GPU is overkill. In the guitar world, there are
| dozens of insanely high quality reverb pedals and they all only
| have some basic chips in them, no GPU necessary.
| Underphil wrote:
| No, but the question bears discussion. Many of us have high
| powered GPUs in our machines that sit idle during audio
| production. Could they be leveraged? Not just for reverb.
| hatthew wrote:
| My understanding is that latency is usually a much bigger
| concern than raw computing power when doing audio processing.
| GPUs are great at doing large batches of computation, but
| aren't as good at doing lots of small batches with low latency,
| which is what audio processing tends to be.
| beardyw wrote:
| Using convolution I found that applying some random variation
| between the stereo channels made a much more satisfying stereo
| result, though only on later reflections, earlier it makes for
| unhelpful stereo effects. Is that something you have tried?
| DoesntMatter22 wrote:
| I wrote a synthesizer last year. It was a lot of fun. Just
| through trial and error I learned how sound waves work. It's
| really enjoyable to build things that aren't websites
| Someone wrote:
| FTA: There are some interesting designs here - and they work, but
| they often require careful tuning. As well as finding a good
| compromise for the delay time, using too much inter-channel
| mixing can lock the delays together so they act like a cohesive
| unit, which isn't great for longer tails.
|
| Made me wonder whether there's a connection with linear feedback
| shift registers (https://en.wikipedia.org/wiki/Linear-
| feedback_shift_register)
|
| If you have a LFSR that produces a decent but not too good
| pseudo-random signal, can you use its parameters to create a
| decent reverb?
___________________________________________________________________
(page generated 2024-08-20 23:01 UTC)