Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve our brickwall limiter #15

Open
sergree opened this issue Feb 13, 2020 · 15 comments
Open

Improve our brickwall limiter #15

sergree opened this issue Feb 13, 2020 · 15 comments
Labels
help wanted Extra attention is needed

Comments

@sergree
Copy link
Owner

sergree commented Feb 13, 2020

While our EQ matching is a strong point of Matchering, our blackwall limiter remains to be a bottlneck.

Received this feedback recently:
YT Review

I completely agree with our user, I also sometimes got similar results when the reference was very, very loud.

Here is our limiter code.

Here are its tests.

It already shows good results, which are very close to the proprietary quality, but, apparently, something is missing.
The community would be very grateful if there was a contributor who can bring the quality of our brickwall limiter even higher.

Thanks!

@sergree sergree added the help wanted Extra attention is needed label Feb 13, 2020
@sergree sergree changed the title Improve our Brickwall limiter Improve our brickwall limiter Feb 13, 2020
@sergree sergree pinned this issue Feb 13, 2020
@tmrock
Copy link

tmrock commented Feb 18, 2020

I had the feeling that the limiter add some "pump" if I use a very loud reference track. some peaks are not processed right. And a second request: would be possible to download the processed file after intermediate steps, e.g. download afer EQ but before final limiting, etc?

@sergree
Copy link
Owner Author

sergree commented Feb 18, 2020

@tmrock Thank you for your feedback!

And a second request: would be possible to download the processed file after intermediate steps, e.g. download afer EQ but before final limiting, etc?

matchering-web app doesn't support it, but it can be done via console application https://github.com/sergree/matchering-cli with --no_limiter key.
Or you can also export WAV 32 float using this cli app like

python3 mg_cli.py target.wav reference.wav result_32bit.wav -b32 --no_limiter --dont_normalize

The result will not include the final limiter and may exceed 0dB without clipping. just add this file to the DAW and put the final proprietary bw limiter on it.

@tmrock
Copy link

tmrock commented Feb 18, 2020

Thanks!

@geraldoramos
Copy link

I did a blind test using this LoudMax brick wall limiter instead of the built-in limiter. The people I've sent the test reported better results with the LoudMax version.

@sergree This "Loudmax" limiter is freeware but the license does not allow it to be modified. With that said, I'm wondering if reaching out to the creator (Thomas - loudmax@yahoo.de), might be a good idea. Maybe he is willing to help here.

Here is the test:
Original mix: https://www.dropbox.com/s/08o97xhtv3ynxzw/original.wav?dl=0
Matchering with built-in limiter: https://www.dropbox.com/s/mi3lxx0t8zibjju/master2.wav?dl=0
Matchering with Loudmax: https://www.dropbox.com/home/teste_cego?preview=master6.wav
Landr master: https://www.dropbox.com/s/7k0x23z9rz76ewa/master5.wav?dl=0

PS: The people I run the blind test are not mastering specialists.

Anyway, just something I wanted to share.

@sergree
Copy link
Owner Author

sergree commented May 14, 2020

Thank you, @geraldoramos.

The current Matchering limiter is "Python Native". This means that it only uses pip dependencies (numpy, scipy) without explicit C++ calls. The problem here is that all VST limiters work with an audio buffer, and in Matchering we don't have a buffer, just a whole array of audio points (samples). So, personally, I still haven't figured out how to transfer the "VST way" to the "NumPy way" (to make it fast / optimized / vectorizable). Maybe I just don't have a good experience with this.

In the legacy MATLAB Matchering we didn't have a limiter. After leveling and equalizing the audio was transmitted to the external command line VST host (MrsWatson), any VST limiter could be used inside this host. Perhaps this idea will be useful to you.

Anyway, thanks for the tip. If you go to KVR, there are a lot of free / open source С++ VST limiters, but it's almost impossible to find an python native numpy / scipy audio limiter. I haven't figured out how to solve this issue yet.

@geraldoramos
Copy link

Hi Sergree, I was playing with MrsWatson to use a VST plugin for limiting, but It would be great to avoid another separate task in the workflow. Not sure if I will end up going in that direction, but thanks for the suggestion.

I will keep an eye here on this thread and see how this issue will evolve.

Thank you so much!

Geraldo

@tmrock
Copy link

tmrock commented Jun 24, 2020

Hi, just try to run the cmd line interface whiteout involving the limiter but this don't works.

with or whiteout the --no_limiter parameter, the log and result is the same:

LOG:
.................................................
2020-06-24 14:05:34,207: INFO: Correcting levels
2020-06-24 14:05:34,208: DEBUG: Applying RMS correction #1...
2020-06-24 14:05:34,392: DEBUG: Calculating RMSes of the RESULT pieces...
2020-06-24 14:05:34,397: DEBUG: The current average RMS value in the loudest pieces is -9.0770 dB
2020-06-24 14:05:34,397: DEBUG: The RMS coefficient is: -0.0675 dB
2020-06-24 14:05:34,400: DEBUG: Modifying the amplitudes of the RESULT audio...
2020-06-24 14:05:34,533: DEBUG: Applying RMS correction #2...
2020-06-24 14:05:34,731: DEBUG: Calculating RMSes of the RESULT pieces...
2020-06-24 14:05:34,737: DEBUG: The current average RMS value in the loudest pieces is -9.1375 dB
2020-06-24 14:05:34,737: DEBUG: The RMS coefficient is: -0.0070 dB
2020-06-24 14:05:34,738: DEBUG: Modifying the amplitudes of the RESULT audio...
2020-06-24 14:05:34,888: DEBUG: Applying RMS correction #3...
2020-06-24 14:05:35,084: DEBUG: Calculating RMSes of the RESULT pieces...
2020-06-24 14:05:35,090: DEBUG: The current average RMS value in the loudest pieces is -9.1438 dB
2020-06-24 14:05:35,091: DEBUG: The RMS coefficient is: -0.0007 dB
2020-06-24 14:05:35,091: DEBUG: Modifying the amplitudes of the RESULT audio...
2020-06-24 14:05:35,257: DEBUG: Applying RMS correction #4...
2020-06-24 14:05:35,452: DEBUG: Calculating RMSes of the RESULT pieces...
2020-06-24 14:05:35,458: DEBUG: The current average RMS value in the loudest pieces is -9.1444 dB
2020-06-24 14:05:35,458: DEBUG: The RMS coefficient is: -0.0001 dB
2020-06-24 14:05:35,459: DEBUG: Modifying the amplitudes of the RESULT audio...
2020-06-24 14:05:35,668: DEBUG: ----------------------------------------
2020-06-24 14:05:35,668: INFO: Final processing and saving
2020-06-24 14:05:35,700: DEBUG: ----------------------------------------

@tmrock
Copy link

tmrock commented Jun 24, 2020

used parameters: --no_limiter --dont_normalize

@sergree
Copy link
Owner Author

sergree commented Jun 25, 2020

@tmrock It looks like I can't reproduce this error. Works for me.
Could you provide audio files (target, reference, results) please? And all the log files.

@rcrath
Copy link

rcrath commented Dec 23, 2020

Calf Plugins have open source C++ limiter code. I use their stuff on Linux occasionally and their general quality is good for what I do use, but I have other limiters that I use and do my mastering on windows, so have not tried theirs.

AIrwindows has limiters that will work for mastering. Open source, I believe C++. Chris's stuff is awesome and used by pros a lot I think. Here are five that are useful for mastering. If you see one you like you can get the deeper description from the Airwindows site:

 5

ADClip7 :  Mastering Limiter
The ultimate Airwindows loudness maximizer.

BlockParty
Mastering Limiter
BlockParty is like a moderately saturated analog limiter.
 The threshold’s determining compression, which means 
BlockParty doesn’t have a stable compression threshold. 
It is interactive with the audio you give it.

NC-17
Mastering Limiter
Loudness limiter keeps drums on top

OneCornerClip
Mastering Limiter
An ultimate full-bandwidth clipper.

Righteous4
Mastering Limiter
Final output stage for targeting dynamic range
 For the 2buss

@rcrath
Copy link

rcrath commented Dec 23, 2020

https://github.com/airwindows -- Chris's GitHub

@sergree
Copy link
Owner Author

sergree commented Dec 23, 2020

@rcrath Thank you very much for these links!
I'll try to research them asap.
However, it will not be easy for me, because I don't know C++. I only work with Python / Rust / JS. 😁

@rcrath
Copy link

rcrath commented Dec 23, 2020

Oops my bad. I misrembered you writing that C++ was your main gig when you probably said the opposite!

@isaacmuxic
Copy link

I have made a work around like the Matlab solution in my fork. board = Pedalboard([Limiter(threshold_db=-0.2, release_ms=75)]) if need_default: result = board(result_no_limiter, config.internal_sample_rate))
The pedalboard from spotify has a compressor like limiter, and you can call VST/AU plugin with custom parameter or preset file.

In the legacy MATLAB Matchering we didn't have a limiter. After leveling and equalizing the audio was transmitted to the external command line VST host (MrsWatson), any VST limiter could be used inside this host. Perhaps this idea will be useful to you.

@sergree
Copy link
Owner Author

sergree commented Sep 6, 2022

Nice work, @isaacmuxic! Pedalboard looks promising 🤩
However, I am not sure that their limiter is brickwall.
But in any case, it would be interesting to hear the results.
And the ability to use VST without leaving Python code is very tempting. 🙏

@sergree sergree unpinned this issue Dec 30, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

5 participants