Dragonfly Hall Reverb

All your LV2 and LADSPA goodness and more.

Moderators: MattKingUSA, khz

Post Reply
User avatar
Michael Willis
Established Member
Posts: 1451
Joined: Mon Oct 03, 2016 3:27 pm
Location: Rocky Mountains, North America
Has thanked: 69 times
Been thanked: 164 times
Contact:

Dragonfly Hall Reverb

Post by Michael Willis »

After a week of working on it, I have a working prototype of my reverb plugin.

https://github.com/michaelwillis/dragonfly-reverb

As I mentioned elsewhere, this is essentially just a port of Hibiki Reverb from freeverb3-vst, I can't take credit for the algorithms. This is the first real C++ project I've worked on for more than a decade, so it's very likely that I've done some rather insane things with the code.

I haven't uploaded any binary releases yet, so you'll have to build it for yourself. I wrote it with FalkTX's excellent Distrho Plugin Framework. Like other projects that use DFP, building it should just be a matter of running `make` from the project root dir, and then copy the binaries from under the bin dir to some place where your DAW (or other plugin host) will find it.

There's no custom graphical interface yet, but I was able to load it in Ardour and it gave me a reasonable interface of sliders and a preset selector.

It is primarily intended for use as a concert hall reverb, but it also has smaller presets like room, studio, and chamber. Also there is the obligatory enormous cathedral preset. I adapted the presets almost directly from Hibiki Reverb, which has much more variety in presets, like "Dark Room", "Small Narrow Hall", "Small Wide Hall", "Large Vocal Hall", etc. If anybody would find things like this useful, I can certainly add more. If you find some settings that you really like, let me know about them!

I know it has a lot of parameters; I actually did narrow them down from what was available in the freeverb3 algorithms (which had all kinds of LFO related stuff and other things that I trimmed down and left at reasonable defaults). There still remain two parameters that I honestly don't understand: spin and wander. Spin is the freq of some kind of LFO that modulates something, and wander seems to be a number of milliseconds that the spin is active. Please speak up if you can give me a better clue about what these do.

It would be stunning if I could get some feedback from the community about the code, bugs, the presets, the parameters, and/or how well you like the sounds you are able to get from it.

Cheers!

Edit: I forgot to mention, it builds both VST and LV2; for some reason the VST doesn't work for me, but the LV2 does.
User avatar
sadko4u
Established Member
Posts: 986
Joined: Mon Sep 28, 2015 9:03 pm
Has thanked: 2 times
Been thanked: 359 times

Re: Dragonfly Hall Reverb

Post by sadko4u »

A bit code-review.

This is bad:

Code: Select all

    switch(index) {
      case  0:     dry_level    = (value / 100.0); break;
      case  1:   early_level    = (value / 100.0); break;
      case  2: early.setRSFactor  (value / 7.0);   break;
      case 3: early.setwidth (value / 100.0); break;
Please AVOID magic numbers.
LSP (Linux Studio Plugins) Developer and Maintainer.
User avatar
Michael Willis
Established Member
Posts: 1451
Joined: Mon Oct 03, 2016 3:27 pm
Location: Rocky Mountains, North America
Has thanked: 69 times
Been thanked: 164 times
Contact:

Re: Dragonfly Hall Reverb

Post by Michael Willis »

falkTX wrote:the "magic" numbers I guess are because of the base dsp implementation of the reverb, which uses normalized values.
Yes. I think sadko4u is saying that the code should explain what it is doing, like this:

Code: Select all

    switch(index) {
      case  DRY_LEVEL:     dry_level      = NORMALIZE_PERCENTAGE(value); break;
      case  EARLY_LEVEL:   early_level    = NORMALIZE_PERCENTAGE(value); break;
      case  EARLY_SIZE:    early.setRSFactor(value / params[EARLY_SIZE].range_max);   break;
User avatar
Michael Willis
Established Member
Posts: 1451
Joined: Mon Oct 03, 2016 3:27 pm
Location: Rocky Mountains, North America
Has thanked: 69 times
Been thanked: 164 times
Contact:

Re: Dragonfly Hall Reverb

Post by Michael Willis »

I was wondering about the percentages, at first I thought it was better to express them as values from 0.0% to 100.0% (or 200.0% for values that can be doubled), but now I'm wondering if it would be just as well to express them as multiples, from 0.0x to 1.0x (or 2.0x). The latter way would eliminate the need to normalize the percentage value.
User avatar
sadko4u
Established Member
Posts: 986
Joined: Mon Sep 28, 2015 9:03 pm
Has thanked: 2 times
Been thanked: 359 times

Re: Dragonfly Hall Reverb

Post by sadko4u »

I was talking mostly about port identifiers. Percentages are intuitive understandable "magic" numbers;
LSP (Linux Studio Plugins) Developer and Maintainer.
User avatar
Michael Willis
Established Member
Posts: 1451
Joined: Mon Oct 03, 2016 3:27 pm
Location: Rocky Mountains, North America
Has thanked: 69 times
Been thanked: 164 times
Contact:

Re: Dragonfly Hall Reverb

Post by Michael Willis »

sadko4u wrote:I was talking mostly about port identifiers. Percentages are intuitive understandable "magic" numbers;
Ok, understood. So if I make an enum of each parameter id, it will avoid possible problems if I ever add/remove/rearrange parameters.
ssj71
Established Member
Posts: 1294
Joined: Tue Sep 25, 2012 6:36 pm
Has thanked: 1 time

Re: Dragonfly Hall Reverb

Post by ssj71 »

hey this is moving quickly! great work!

and +1 for the enum thing. :)
_ssj71

music: https://soundcloud.com/ssj71
My plugins are Infamous! http://ssj71.github.io/infamousPlugins
I just want to get back to making music!
finotti
Established Member
Posts: 528
Joined: Thu Sep 01, 2011 9:07 pm
Has thanked: 86 times
Been thanked: 23 times

Re: Dragonfly Hall Reverb

Post by finotti »

Thanks for doing this! I can't wait to try it out!
User avatar
Michael Willis
Established Member
Posts: 1451
Joined: Mon Oct 03, 2016 3:27 pm
Location: Rocky Mountains, North America
Has thanked: 69 times
Been thanked: 164 times
Contact:

Re: Dragonfly Hall Reverb

Post by Michael Willis »

Hey FalkTX, every plugin I look at that is build on DPF encodes all raster image data in a cpp file, like this:

https://raw.githubusercontent.com/DISTR ... kMVerb.cpp

It looks like the image arrays are in the format:

Code: Select all

{R1, G1, B1, A1, R2, G2, B2, A2, ... }
Is that correct?

Do you have some utility that converts an image file into a cpp array literal? If not, I could probably hack together a Python script to do it.

EDIT: Ha, just found it here... nevermind...
User avatar
Michael Willis
Established Member
Posts: 1451
Joined: Mon Oct 03, 2016 3:27 pm
Location: Rocky Mountains, North America
Has thanked: 69 times
Been thanked: 164 times
Contact:

Re: Dragonfly Hall Reverb

Post by Michael Willis »

ssj71 wrote:hey this is moving quickly! great work!
finotti wrote:Thanks for doing this! I can't wait to try it out!
Thanks for the encouragement everybody.

I also forgot to mention that I'm primarily using a Mac laptop for development. I just tried building on Linux this morning and it didn't work :oops:

Once I get the build working on Linux, I'll put a beta releases for Linux and Mac on github for people to try.
glowrak guy
Established Member
Posts: 2315
Joined: Sat Jun 21, 2014 8:37 pm
Been thanked: 251 times

Re: Dragonfly Hall Reverb

Post by glowrak guy »

https://build.opensuse.org/

I'm not a coder/builder, but maybe these folks could extend the range of your project?
Cheers
User avatar
Michael Willis
Established Member
Posts: 1451
Joined: Mon Oct 03, 2016 3:27 pm
Location: Rocky Mountains, North America
Has thanked: 69 times
Been thanked: 164 times
Contact:

Re: Dragonfly Hall Reverb

Post by Michael Willis »

glowrak guy wrote:https://build.opensuse.org/

I'm not a coder/builder, but maybe these folks could extend the range of your project?
Cheers
Thanks. For now I'm just working on making a release that I'm happy with, then if it seems like people find it useful I can figure out a good way to distribute it.
User avatar
Michael Willis
Established Member
Posts: 1451
Joined: Mon Oct 03, 2016 3:27 pm
Location: Rocky Mountains, North America
Has thanked: 69 times
Been thanked: 164 times
Contact:

Re: Dragonfly Hall Reverb

Post by Michael Willis »

Ok, I fixed the Linux build, and released the first alpha version on github:

https://github.com/michaelwillis/dragon ... .0.1-alpha

Right now it's only the LV2 version for 64-bit Linux. Download the DragonflyReverb-LV2-linux-64-bit-v0.0.1.tgz file and unpack it somewhere that your DAW or plugin host will find it.

I tested it in Carla and it seemed to work ok.

Brief description of the parameters:

Dry Level, Early Level, Late Level - Percentage of each of these to combine into the output signal.
Early Size and Early Width make the shape of the early reflections. Think of size as being the distance from sound source to the listener, in meters. Width is a percentage of that size.
Early Low Pass - mostly self explanatory, a low pass filter on early reflections, measured in Hz.
Early Send - percentage of early reflections to feed into the late reverb algorithm.
Late Predelay - millisecond delay before late reverb starts
Late Decay Time - how many seconds the late reverb lasts
Late Size - depth of room or hall, in meters
Late Width - width of room or hall, as a percentage of Late Size param. Set to more than 100% for a very wide space
Late Low Pass - low pass filter on late reverb, in Hz.
Diffuse - percentage diffusion applied to late reverb.
Low Crossover, Low Decay Mult, High Crossover, High Decay Mult - The crossover parameters set thresholds in Hz that divide the late reverb into low, mid, and high frequencies. The decay multipliers are applied to the Late Decay Time. For example, consider the following settings: 2.0 Second Late Decay Time, 500Hz Low crossover, 2.5 X Low decay mult, 4000Hz High crossover, and 0.5 X High decay mult. Late reverb frequencies under 500Hz will last for 5.0 seconds. Those from 500Hz - 4000Hz will last for 2.0 seconds, and high frequencies above 4000Hz will last for 1.0 seconds.
Spin and Wander - I still don't really understand what these do, but the presets in Hibiki had very different settings for them, so they must be important :?

Please give it a try and report any feedback.

Edit: Another thing I forgot to mention, there are no library dependencies, I compiled everything into the binary, so you only need something that can host the LV2 plugin.
User avatar
sysrqer
Established Member
Posts: 2519
Joined: Thu Nov 14, 2013 11:47 pm
Has thanked: 319 times
Been thanked: 148 times
Contact:

Re: Dragonfly Hall Reverb

Post by sysrqer »

Regarding presets, the more the better. I don't know about anyone else but I find creating reverbs to be very tedious, when presets usually work well enough.
User avatar
Michael Willis
Established Member
Posts: 1451
Joined: Mon Oct 03, 2016 3:27 pm
Location: Rocky Mountains, North America
Has thanked: 69 times
Been thanked: 164 times
Contact:

Re: Dragonfly Hall Reverb

Post by Michael Willis »

sysrqer wrote:Regarding presets, the more the better. I don't know about anyone else but I find creating reverbs to be very tedious, when presets usually work well enough.
That's good feedback. I've been thinking about how I want to use a concert hall reverb, and I always go back to this article: Orchestral Positioning: Reverb in practice, specifically the part where Mattias discusses having multiple reverb busses, with the strings sections in the front, woodwinds in the middle, and brass/percussion in the back.

So if I'm setting out to create the ideal reverb plugin for my own use, I think I would like presets like the following:

Code: Select all

Small Hall, Front Row
Small Hall, Back Row
Medium Hall, Front Row
Medium Hall, Middle Row
Medium Hall, Back Row
Large Hall, 1st Row
Large Hall, 2nd Row
Large Hall, 3rd Row
Large Hall, 4th Row
The three medium hall presets would more or less match the suggestions in the article linked above. I could imagine using the large hall settings to create a piece with the usual orchestra layout plus a choir in the far back.

Smaller areas probably don't need so many different reverbs for stage depth, so let's imagine that I have 16 combinations of room size and stage depth. Now multiply that by some variations on each room, like default, clear, bright, and dark. That's 16 x 4 = 64 presets! Is that too many? I don't have a problem doing the math to make all of those presets, but it seems like a lot to present to somebody using the plugin, which might be an overwhelming user experience.That's not even introducing some of the variations that Hibiki has, like wide/deep.

So that leads me to think that instead of making all of these combinations in the presets, what if I were to present an interface with presets for room size, and then sliders for all of the variations? Something like this:

Code: Select all

Room shape:     wide <-------------> deep
Stage presence: near <-------------> far
Freq response:  dark <-------------> bright
Absorption:    muted <-------------> clear
I find that when I'm adjusting all of the parameters available, I'm mostly thinking in terms of these room characteristics, so I've considered simplifying the interface this way, but then I'm afraid that it would take power away from the user... So I decided that for the initial version to just give the user control over the raw parameters because that was the easiest implementation.
Post Reply