Skip to main content

Notice

Please note that most of the software linked on this forum is likely to be safe to use. If you are unsure, feel free to ask in the relevant topics, or send a private message to an administrator or moderator. To help curb the problems of false positives, or in the event that you do find actual malware, you can contribute through the article linked here.
Topic: Dynamic Loudness Control (Read 13889 times) previous topic - next topic
0 Members and 1 Guest are viewing this topic.

Re: Dynamic Loudness Control

Reply #50
I ddn't mean that red (iir PEQ from foo_dsp_effect) is ideal. It cannot be ideal, because granularity is settings is limited to whole dB, not fractions of dB. Also i didn't mean QRange is bad. I just meant that pre-made impulses from https://github.com/jaakkopasanen/AutoEq/tree/master/results are definitely off-pair with results from parametric EQs.
To me it seems visually that curve from ffmpeg is closest to reference curve that can bee seen in pdf from Oratory, so i would use ffmpeg. Also, there is PEQ in SoX, but i didn't try it yet.
Would you like me to generate an impulse response with IIEQPro and send it to you, so you could check it against the "theoretic ideal" ?
If you will do this for m50(x).

 

Re: Dynamic Loudness Control

Reply #51
I misread your post !  :o

You wrote this :
Curve from Oratory.
Red - iir filter from foo_dsp_effect,
orange - ffmpeg parametric eq,
yellow - QRange,
green - impulse from https://github.com/jaakkopasanen/AutoEq/tree/master/results

But I understood this :
Curve from Oratory. Red
- iir filter from foo_dsp_effect, orange
- ffmpeg parametric eq, yellow
- QRange, green
- impulse from https://github.com/jaakkopasanen/AutoEq/tree/master/results

I know, it makes no sense, but that's what I understood. In my country, dashes are separators.  :D Now I see what you mean !
So ffmpeg and QRange are quite close and probably hard do distinguish by ear.

Here are 3 impulse responses for you. They are from Oratory's M50x preset (this one : https://www.dropbox.com/s/r7wa83eb53da6fh/Audio%20Technica%20ATH-M50x.pdf?dl=0 ).
All were made with a 4096 samples basic pulse @ sample #2048.
  • First one : QRange with these settings : "Low Distorsion" and "Minimum Phase".
    I have been told in another forum by a QRange user that "Low Distorsion" and "Minimum Phase" should be better for Hi-Fi. Now we can see if that's true.
  • Second one : QRange with very different settings : "Good Frequency Response" and "Insane (Linear Phase)".
  • Third one : IIEQ Pro (no settings available)
    IIEQ Pro offers Low Shelf, High Shelf, plus 17 other filters (see here : https://fr.scribd.com/document/355586010/IIEQ-Pro-Manual ). I chose Ana Peak for all the Peak filters (bands 2 to 9) as it really seems to be the one to choose.

Let's see what your graph says !  ;)

Re: Dynamic Loudness Control

Reply #52
Red - ffmpeg, orange - IIEQ Pro Ana Peaks, yellow -  QRange Good FR Insane (Linear Phase), green - QRange Low Distorsion Minimum Phase. As you can see there are no differences between yellow and green. But actually minimum phase is preferred, because with minimum phase there is no pre-echo and human hearing is more sensitive to pre-echo than post-echo.

Re: Dynamic Loudness Control

Reply #53
Thanks ! It's good to see that everything is really close until 7 KHz. Even beyond, they all stay within 1dB of each other. So differences will probably be hard to hear, unless there are phase shifts and other weird stuff.
In that context, I would hesitate between IIEQ Pro (orange) and QRange Minimum Phase (green). Here are the pro/cons :

IIEQ Pro :
  • Pro : like the manual says, Ana Peaks are adjusted to prevent treble warping, the peaking curve remains symmetrical up to the Nyquist frequency (which is analogue behaviour, hence their name)
    Nyquist frequency is half the sampling frequency, so 22.05 KHz for 44.1 KHz, so if IIEQ Pro prevents treble warping until that frequency, I guess it's a really good thing.
  • Pro : seems closer to ffmpeg, which as you said is closer to the "ideal EQ".
  • Con : there is no phase setting, so how could I know what happens with the phase ?

QRange :
  • Pro : I can set phase to minimum
  • Con : if their peak filters are classic digital ones, there is a risk of treble warping indeed.
  • Con : not as close to ffmpeg as IIEQ Pro

Maybe QRange (green) is the best choice since at least I can set phase to minimum (I'm just unsure about this setting : "Low Distortion", "Medium Distortion and OK Frequency Response" or "Good Frequency Response").
And maybe IIEQ Pro (orange) is the best choice, since it seems closer to ffmpeg and it prevents treble warping.

PS : in case it matters, both QRange and IIEQ Pro are IIR-based, not FIR.


Re: Dynamic Loudness Control

Reply #55
Interesting, thank you :) Then IIEQ Pro is indeed the best choice : minimum phase + closest to ffmpeg over 7 KHz. I hope I'm not missing anything.

Re: Dynamic Loudness Control

Reply #56
Notice about preamp gain. In some extreme cases, like processing Merzbow's "music" for example, volume should be lowered much more than normally calculated gain. For example, Oratory states pre-amp gain for m50x as -2.9 dB, but when processing Ananga-Ranga from Merzbow's Venerology gain should be ~ -5.27 dB to avoid clipping (if ReplayGain is not used).

Re: Dynamic Loudness Control

Reply #57
If somebody has already done this, I'd be interested in the script and relevant DSP presets.
Yes. Somebody has done this already. Here is script for JScript Panel - https://translate.google.ru/translate?sl=ru&tl=en&u=https%3A%2F%2Ffoobar2000.ru%2Fforum%2Fviewtopic.php%3Fp%3D77623%23p77623 It switch DSP preset for every 5 dB step in volume and can use up to 20 presets. It can be modified  to change step, use more or less presets, use other presets names. But you should create DSP presets yourself.
Code: [Select]
var dsp_active_name = "";
var dsp_str = fb.GetDSPPresets();
var dsp_arr = JSON.parse(dsp_str);
var dsp_count = dsp_arr.length;

function get_dsp() {
   dsp_active_name = "";
   dsp_str = fb.GetDSPPresets();
   dsp_arr = JSON.parse(dsp_str);
   dsp_count = dsp_arr.length;
   for (var i = 0; i < dsp_arr.length; i++) {

      //tt(">>> dsp presets name # " + i + ": " + dsp_arr[i].name);

      if (dsp_arr[i].active) {
         dsp_active_name = dsp_arr[i].name;
      }

   }
   tt('>>> dsp presets count = ' + dsp_count);
   tt(">>> dsp active name = " + dsp_active_name);
};
//get_dsp();

function get_dsp_idx(dsp_name) {

   for (var i = 0; i < dsp_arr.length; i++) {

      if (dsp_arr[i].name == dsp_name) {

         return i
      }

   }

};

function on_dsp_preset_changed() {
   get_dsp();
};

var vol_lvl = Math.ceil(fb.Volume);
function on_volume_change(val) {
   //---
   // 0 is max
   // -100 is min

   vol_lvl = Math.ceil(val);
   if (isNaN(vol_lvl))
      vol_lvl = Math.ceil(fb.Volume);

   if (vol_lvl == 0) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp 0")); // set dsp preset 0
   };
   if (vol_lvl == -5) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -5")); // set dsp preset -5
   };
   if (vol_lvl == -10) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -10")); // set dsp preset -10
   };
   if (vol_lvl == -15) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -15")); // set dsp preset -15
   };
   if (vol_lvl == -20) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -20")); // set dsp preset -20
   };
   if (vol_lvl == -25) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -25")); // set dsp preset -25
   };
   if (vol_lvl == -30) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -30")); // set dsp preset -30
   };
   if (vol_lvl == -35) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -35")); // set dsp preset -35
   };
   if (vol_lvl == -40) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -40")); // set dsp preset -40
   };
   if (vol_lvl == -45) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -45")); // set dsp preset -45
   };
   if (vol_lvl == -50) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -50")); // set dsp preset -50
   };
   if (vol_lvl == -55) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -55")); // set dsp preset -55
   };
   if (vol_lvl == -60) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -60")); // set dsp preset -60
   };
   if (vol_lvl == -65) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -65")); // set dsp preset -65
   };
   if (vol_lvl == -70) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -70")); // set dsp preset -70
   };
   if (vol_lvl == -75) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -75")); // set dsp preset -75
   };
   if (vol_lvl == -80) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -80")); // set dsp preset -80
   };
   if (vol_lvl == -85) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -85")); // set dsp preset -85
   };
   if (vol_lvl == -90) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -90")); // set dsp preset -90
   };
   if (vol_lvl == -95) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -95")); // set dsp preset -95
   };
   if (vol_lvl == -100) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -100")); // set dsp preset -100
   };

};
on_volume_change();

function tt(t) {
   console.log(t);
};

or
Code: [Select]
var dsp_active_name = "";
var dsp_str = fb.GetDSPPresets();
var dsp_arr = JSON.parse(dsp_str);
var dsp_count = dsp_arr.length;

function get_dsp() {
   dsp_active_name = "";
   dsp_str = fb.GetDSPPresets();
   dsp_arr = JSON.parse(dsp_str);
   dsp_count = dsp_arr.length;
   for (var i = 0; i < dsp_arr.length; i++) {

      //tt(">>> dsp presets name # " + i + ": " + dsp_arr[i].name);

      if (dsp_arr[i].active) {
         dsp_active_name = dsp_arr[i].name;
      }

   }
   tt('>>> dsp presets count = ' + dsp_count);
   tt(">>> dsp active name = " + dsp_active_name);
};
//get_dsp();

function get_dsp_idx(dsp_name) {

   for (var i = 0; i < dsp_arr.length; i++) {

      if (dsp_arr[i].name == dsp_name) {

         return i
      }

   }

};

function on_dsp_preset_changed() {
   get_dsp();
};

var vol_lvl = Math.ceil(fb.Volume);
function on_volume_change(val) {
   //---
   // 0 is max
   // -100 is min

   vol_lvl = Math.ceil(val);
   if (isNaN(vol_lvl))
      vol_lvl = Math.ceil(fb.Volume);

   if (vol_lvl == 0) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp 0")); // set dsp preset 0
   };
   if (vol_lvl == -1) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp 0")); // set dsp preset 0
   };
   if (vol_lvl == -2) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp 0")); // set dsp preset 0
   };
   if (vol_lvl == -3) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp 0")); // set dsp preset 0
   };
   if (vol_lvl == -4) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp 0")); // set dsp preset 0
   };
   if (vol_lvl == -5) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -5")); // set dsp preset -5
   };
   if (vol_lvl == -10) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -10")); // set dsp preset -10
   };
   if (vol_lvl == -15) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -15")); // set dsp preset -15
   };
   if (vol_lvl == -20) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -20")); // set dsp preset -20
   };
   if (vol_lvl == -25) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -25")); // set dsp preset -25
   };
   if (vol_lvl == -30) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -30")); // set dsp preset -30
   };
   if (vol_lvl == -35) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -35")); // set dsp preset -35
   };
   if (vol_lvl == -40) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -40")); // set dsp preset -40
   };
   if (vol_lvl == -45) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -45")); // set dsp preset -45
   };
   if (vol_lvl == -50) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -50")); // set dsp preset -50
   };
   if (vol_lvl == -55) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -55")); // set dsp preset -55
   };
   if (vol_lvl == -60) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -60")); // set dsp preset -60
   };
   if (vol_lvl == -65) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -65")); // set dsp preset -65
   };
   if (vol_lvl == -70) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -70")); // set dsp preset -70
   };
   if (vol_lvl == -75) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -75")); // set dsp preset -75
   };
   if (vol_lvl == -80) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -80")); // set dsp preset -80
   };
   if (vol_lvl == -85) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -85")); // set dsp preset -85
   };
   if (vol_lvl == -90) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -90")); // set dsp preset -90
   };
   if (vol_lvl == -95) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -95")); // set dsp preset -95
   };
   if (vol_lvl == -100) {
      tt(">>> vol = " + vol_lvl);
      fb.SetDSPPreset(get_dsp_idx("dsp -100")); // set dsp preset -100
   };

};
on_volume_change();

function tt(t) {
   console.log(t);
};
Hi
i was looking for a vst or plugin to emulate the amp loudness control and i have found this script
should i create a new preset and edit with notepad++ ,copy and paste?
do you think could be create shortcuts to increase and decrease volume?
thanks

about Amplifier DSP foobar2000 component (can't find the topic) does it work like an amp loudness knob or button?
Quote
A simple volume adjustment DSP allowing the signal amplitude to be both boosted and lowered.
thanks

Re: Dynamic Loudness Control

Reply #58
about Amplifier DSP foobar2000 component (can't find the topic) does it work like an amp loudness knob or button?
Quote
A simple volume adjustment DSP allowing the signal amplitude to be both boosted and lowered.
Like your quoted description says, it's just a simple volume adjustment tool. Changes signal amplitude. Only thing differentiating it from the built-in volume control is that it can also amplify the signal.

Re: Dynamic Loudness Control

Reply #59
about Amplifier DSP foobar2000 component (can't find the topic) does it work like an amp loudness knob or button?
Quote
A simple volume adjustment DSP allowing the signal amplitude to be both boosted and lowered.
Like your quoted description says, it's just a simple volume adjustment tool. Changes signal amplitude. Only thing differentiating it from the built-in volume control is that it can also amplify the signal.
hi
I'm looking for a loudness controll ,and i have found this topic, it does start with  JRiver Loudness
there are some amp very loud and it's very hard set the correct volume ,for example the Yamaha A-S501  has a loudness knob
for foobar2000  there is only the buld in volume,isn't it?
thanks

@Rollin
hi
i did not understand your script should I install some component for your script
thanks


Re: Dynamic Loudness Control

Reply #61
@francesco:  the easy way, and yes it is 64 or 32 bits:

https://foobar.hyv.fi/foo_dsp_amp.fb2k-component


Hi
do you know very well known amps they used to have a loudness knob or button ?
does this plugin work like a loudness knob ? According @Case
it can only
Quote
Only thing differentiating it from the built-in volume control is that it can also amplify the signal.
in short between volume control and the plugin , the plugin can increase the signal
loudness knob or button  should let you to listen low volume music
thanks

Re: Dynamic Loudness Control

Reply #62
Why don't you TRY it, and find out for yourself how it sounds?

Re: Dynamic Loudness Control

Reply #63
Why don't you TRY it, and find out for yourself how it sounds?
hi
yes i did ,but nothing
i guess the only software free that can do it ,it's aimp
maybe a nice new plugins could do it
thanks

Re: Dynamic Loudness Control

Reply #64
Why don't you TRY it, and find out for yourself how it sounds?
hi
yes i did ,but nothing
If you could hear no difference at all using this you must not be implementing it properly.  As a DSP, it needs to be put into an active DSP chain first, then adjusted according to taste.  It DOES amplify the signal, no mistake about it!  Use carefully to avoid clipping.




Re: Dynamic Loudness Control

Reply #65
Why don't you TRY it, and find out for yourself how it sounds?
hi
yes i did ,but nothing
If you could hear no difference at all using this you must not be implementing it properly.  As a DSP, it needs to be put into an active DSP chain first, then adjusted according to taste.  It DOES amplify the signal, no mistake about it!  Use carefully to avoid clipping.


hi
i can hear the difference but only about the volume, but it does not work as a loudness control , i used to have on the top of list
may i ask you a question?
1)
you have the resampler on the top , i guess you are listening hires audio above 44.100 right?
i mean it's the reason you have on the top
2) you have a vst loudness maximizer , it should play loud ,compact without clipping right?
3) the last is another vst wider is Polyverse Wider right? i would to try it but they want my email for the link , i have to fight with spam every day  :-X

i'm asking because i have never take in consideration the order of the dsp list
thanks

Re: Dynamic Loudness Control

Reply #66
1)  I only have a resampler in the chain so that in the rare occasion I'm listening to something whose native sample rate is incompatible with my audio device, I can actually hear it (like some odd radio streams with 22050, 32000, 88200 kHz).  It's set so ONLY the incompatible rates get resampled, all else passed through as-is.  I use Wasapi Exclusive as otherwise I don't want the original sampling rate messed with.  No I do not have a DAC.  BTW the order of the DSP list is important, it is the order in which the effects are applied to the audio.

2)  That's the idea anyway, haha..  Actually it applies an adjustable blend of compression and limiting.  "Loudness" is not the primary goal.

3)  Since Polyverse came out with Wider 2.0, the previous 64-bit version (1.1.3) has been archived and can be downloaded directly here:
https://polyversemusic.com/downloads/legacy/InfectedMushroom-Wider-V1.1.3.zip
The last 32-bit version was 1.0 and can be downloaded here:
https://polyversemusic.com/downloads/legacy/InfectedMushroom-WiderV1.0.zip

Re: Dynamic Loudness Control

Reply #67
1)  I only have a resampler in the chain so that in the rare occasion I'm listening to something whose native sample rate is incompatible with my audio device, I can actually hear it (like some odd radio streams with 22050, 32000, 88200 kHz).  It's set so ONLY the incompatible rates get resampled, all else passed through as-is.  I use Wasapi Exclusive as otherwise I don't want the original sampling rate messed with.  No I do not have a DAC.  BTW the order of the DSP list is important, it is the order in which the effects are applied to the audio.

2)  That's the idea anyway, haha..  Actually it applies an adjustable blend of compression and limiting.  "Loudness" is not the primary goal.

3)  Since Polyverse came out with Wider 2.0, the previous 64-bit version (1.1.3) has been archived and can be downloaded directly here:
https://polyversemusic.com/downloads/legacy/InfectedMushroom-Wider-V1.1.3.zip
The last 32-bit version was 1.0 and can be downloaded here:
https://polyversemusic.com/downloads/legacy/InfectedMushroom-WiderV1.0.zip
hi Sveakul
about
Quote
BTW the order of the DSP list is important, it is the order in which the effects are applied to the audio.
thanks I will try settings like yours , and i will test as soon as i can
about the eq , i used to put at the top , but it's not very reactive ,it needs some time to change the audio when i increase /decrease sliders , and i don't think it's the buffer
about
Quote
I'm listening to something whose native sample rate is incompatible with my audio device, I can actually hear it (like some odd radio streams with 22050, 32000, 88200 kHz)
i use too but sox mod 2 ,just because I can set resample only frequencies , would nice to have wildcars a mod 3 20??? to 43???
do you use Wider only for radio?
well thanks Sveakul , appreciate your help