Elliptical Equalizer (mono crossfeed filter)

Hi everybody,

so this is my firtst contribution here. One of my plugins I already use quite a long time and I believe could be useful for others too.

This is a spectral processing filter doing basically a frequency selective crossfeed, mixing signals from a stereo channel below the selected frequency to mono.
This is useful to bring the bass drum (or beat in electronic music) to the center.
Or to remove unwanted rumble from vinyl turntable recordings, these are typically low frequency signals of mutual polarity.

The plug-in is a close adaption to the Elliptic EQ function on a vinyl mastering console, especially the Neumann ones. The filter is a first order highpass in the side-channel (L-R difference). Higher orders can introduce strange artefacts at the crossover range that’s why I avoided higher orders. The Neumann EE70 module is first order (using an inductance) only as well and sounds good.
I added some more features missing in the hardware versions. You can choose how much the filter mixes the low frequency contents together with the Mono amount slider. And there is a bass compensation shelf eq integrated. this is useful because if you have out of phase low frequencies you will loose some of the bass which you compensate for. normally 0.5dB to a maximum of 2dB will be sufficient, of course this depends on the material.

I updated the header and added some error checking, so I hope this one conforms more or less to the standards here. It won’t check all typing entry abuse…

Create better masters and enjoy it,
Jvo

Edit: updated download. get it here.

Very nice plug-in vinylivo, I’m sure it will be useful to others.
I hope you don’t mind if I make a few comments.

In XLisp (hence in Nyquist) if you multiply an integer by a float it returns a float, so in the line

(setf factl (* (float level) -0.005))

the (float) function is not required. This will do exactly the same:

(setf factl (* level -0.005))

Where it is sometimes required to force float values is with division, for example:

(/ 1 2)

will divide 1 by 2 using integers, and the result is (int) zero,
whereas

(/ 1 (float 2))
;or
(/ 1 2.0)

will divide 1 by float value 2, and the result will be 0.5

“s” is a global variable (the track sound), but you have also used it as a local variable in the function (eefilt). In this case it does not cause a problem, but if you specifically want it to be local you should use a different name for the variable. I usually use “s-in” within functions when I want the sound to be local, but you can use just about anything. In this case you don’t have to use a local variable at all as “s” is global and unchanged by the code. I’m not sure if proper programmers would frown on using global variables within functions (I’m not a trained programmer), but care should certainly be taken if doing so to avoid unexpected values to being used within the function.

For public release plug-ins it is best to make them as bullet proof as possible.
In this case, an unwary user could enter any values into the controls by typing into the text box of the controls. For this plug-in that is mostly harmless, except for the frequency value. Entering a frequency that is higher than the Nyquist frequency (half the sample rate) will cause data corruption. Due to a bug in some older versions of Audacity this can require restarting Audacity to clear the corruption, though this has been fixed in the current 1.3 version and the effect can be “Undone”. It is still probably better to disallow high frequency values and either throw an error message, or force the value to within the slider range. For example:

(setq eeqfc(max(min eeqfc 500)10))

If you don’t mind adding some sort of error check to the frequency value, I’d like to recommend this plug-in for inclusion on the Audacity wiki. Would that be OK with you?

Thanks Steve for your suggestions.

Therefore I updated the EEQ plug-in, including errochecking of the inputs. and I changed the local variable name for the defined functions. I don’t like your s-in too much because it looks like behaviours and I normally never use dashes ( ‘-’ ) in variable names when programming. perhaps underscores.
See post #1 for download.

Some more comments about the usage of this effect. It is especially useful for electronic music that’s intended to be played in dance clubs. there it is important that the bass signals are more or less mono because this gives more punch on the dancefloor. for single channel or out of phase bassdrums, this will be very irritating and if mono subwoofers are used (which many clubs do) your bass will be gone. useful range for this will be between 150 Hz to perhaps 400 Hz.

There can be some bad side effects when using this plug-in. It will affect reverberation or the stereo ambiance of your track. So use with caution and let your ears judge the results.

and an OT question. what is common practice for download links? should I have left the original download link in post 1 and repost a new dl-link here or like I did now?

Thanks for the update.

That’s OK, I don’t like using underscores [grin] and I don’t like using function names for variables {there is a Nyquist function (sound) }
but it’s perfectly legal so I have no objections.

I also don’t particularly like to use single characters for variables - especially lower case “L”, though I will sometimes use an “i” or “j” as a loop counter.
I don’t think there’s any mention of variable naming in the Conventions for Nyquist Plug-ins topic, but as Edgar-rtf recently posted,

Nyquist can only read ASCII characters from ASCII 0 to 127 (as documented in the XLISP appendix of the Nyquist manual), everything else causes problems.

so perhaps there should perhaps be some mention in the “Conventions” topic.

Thanks also for the additional “user notes”. I’m not yet sure how user notes will be handled on the wiki, but I’ll check that out.

There isn’t really a “common practice” yet. I tend to delete old versions of my plug-ins so that people will download the correct version. Sometimes it would be useful to be able to look back over old versions, but I don’t see any convenient way to do that with the forum software without incurring the likelihood of other forum users downloading the wrong version.

Re. the code.
There’s still a slight chink in the armour against misuse which is if the audio track has a low sample rate (for example 8000 Hz).
I think there is a good case for limiting the input values to the slider range, as these are well chosen “sensible” values for the purpose of the plug-in. However, if you particularly want to allow room for experimental “effect”, the range could be limited to a proportion of the sample rate, for example:

(setq eeqfc (max (min eeqfc (/ *sound-srate* 2.0)) 1))

For “experimental effects” the other controls could perhaps be left unrestricted ? Extreme values may not provide particularly useful output, but I don’t think they cause any problems in any version of Audacity. The only input value that I think really needs to be limited is the frequency (for the reasons discussed previously), though I think it would be equally valid to restrict values to sensible ranges (same as the slider values?)

Hi Steve,

here the updated version of the eeq.
I changed the frequency check to your suggestion, I agree this makes sense.
and I removed all other restrictions, the plug-in should not produce any errors even if extreme values are entered. thou some values could produce strange outputs, but then it’s the will of the user.

here it is:
ellipticeq.ny (1.18 KB)

Looks good.

On the interface, should it say “Monomix Amount” or “Mono Mix Amount” (or another alternative)?

Actually I’m not shure about this, english is not my mother language. And it could be one of those typical errors when translating stuff from german to english. In german it’s normal behaviour to connect words together.
Here it should mean how much the filter is mixing the channels to mono. 100% means that at low frequencies the signal will be mono, 0% there’s no effect at all.

Here is what happens if Germans try to use English language:

Preface: Somewhere in the early 2000s the German commercials department of a famous fashion manufacturer (no names here) came in a fit of “everything today sells much better with an english name” to the not really well-thought idea to offer sporty-looking backpacks in Germany as “body bags”.

Here are the real-life results what happened since then:

Eventough English is the primary foreign language learned in German schools today, nearly nobody in Germany seems have realized the difference.

Many more examples can be found on http://humanlanguages.com/rlerfeng.htm

@Jvo: I’m also often not sure what the best english words could be (in the meaning of: everything should be self-explanatory but also not sound too stupid for a native english speaker). My favourite strategy is to let Steve or Gale choose the best words, both are native english speakers and have lots of experience in writing Audacity documentation.

Not meant as a criticism but probably an oversight: there had been a very similar plugin of Kurt Ziewadek in the German Audacity forum:

I myself would prefer to include Jvo’s plugin (which has better options than Kurt’s FSP plugin) into the “Audacity Plugin Collection”.

Another question: what exactly is “ellyptical” in this filter? Here is what an electrical engineer understands of an “ellyptical” filter:

Is this a misnomer of maybe I haven’t fully understood something (what also is a realistic possibility)?

However, thanks for the plugin!

  • edgar

Hello Edgar,

thanks for all your explanations and hints. I will have a look at the other code later…

The name for this effect was created by Neumann and was/is used in vinyl mastering.

Imagine you display a stereo signal on an oscilloscope in x-y mode. if there is just one signal in one channel the display shows a simple line (x or y). now if you insert the elliptical equalizer into the signal path the picture changes to an ellipse due to the phase shifts introduced. btw, I looked up ellipse in a dictionary, there is no ‘y’ in the english word :wink:

Jvo: > Imagine you display a stereo signal on an oscilloscope in x-y mode … if there is just one signal in one channel the display shows a simple line … if you insert the elliptical equalizer into the signal path the picture changes to an ellipse due to the phase shifts introduced.

Thanks, that’s a really good explanation.

Jvo: > there is no ‘y’ in the english word

And also not in the German Ellipse, but this is what happens if Germans try to use Greek language.

EBS says that the elliptical equalizer (he calls it the “Neumann EE” filter) is not a static filter, but has a builtin level-detector that controls the amount of “centering” in the bass signal. But I don’t think that this is really important if you equalize for a mono subwoofer system, it’s probably more important that the change in the stereo sound caused by phase cancellation with the mono signal remains constant and doesn’t get changed by any automatic control.

I usually use another trick. Everybody knows (should know) that cardioid microphones (microphoes that mainly record in one direction) produce a not really good bass volume level, whereas omidirectional microphones (microphones that record in all directions with the same volume level) have a much better overall frequency response, but are difficult to use for a good stereo image, at least if placed in a small distance. So in a stereo microphone recording I usually use two cardioids for the stereo image and mix a third omidirectional mono microphone with a lowpass filter of approx 300Hz to signal of the stereo cardioids. I think this is very similar to the effect of the elliptical equalizer plugin.

this is not true.

there are two versions of the elliptic equalizer module in the neumann mastering consoles. the EE70 which uses discrete transistor technology with an inductor and the EE77 with opamps and capacitors. both of these are fully static, there is just a relay remote that allows to switch the crossover frequency between 150Hz and 300Hz.

but there was another EE-type module called VAB or Vertikal Amplituden Begrenzer (limiter). this is used especially on DMM (direct metal mastering) vinyl cutting. because of the limited vertical cutting range on the copper blanks this is an almost essential tool there. this one does dynamically change the crossover frequency and therefore only comes into action if the vertical amplitude (or out of phase signal L-R) is too high.

If there is some confusion over the term “Elliptical”, perhaps a solution would be to avoid that word in the name of the plug-in.

A couple of thoughts that come to mind:
If the aim of the plug-in is to simulate an EE70 filter, then perhaps it could be called “EE70 Filter” (or something similar). I don’t think that “Neumann” could be used in the name as it is a Trademark.
One drawback to calling it an EE70 filter is that relatively few users would have any idea what an EE70 Filter is, so it may be better if the name described the function, for example “Bass Centering Filter” (or something similar).

I’d like to get this plug-in uploaded to the wiki, but I have one reservation which is that I doubt that many users will have any idea what an “Elliptical Equalizer” is.
For the benefit of the many users that are likely to find this plug-in useful (if they find it), I propose to change the name to “Bass to Center”.
Would you be agreeable with this change Jvo?

Thanks for this, Jvo. I too would prefer a less esoteric title for the plug-in, especially given the potential nomenclature confusion.

I don’t really like a percentage being an “amount” so I played with alternatives like “Bass to be mixed”, “Mono mix proportion”, “Crossfeed proportion” before ending up with “Bass Feed Proportion” as below. I don’t want to make a big point of that except that it should be “Mono Mix Amount” if we go for that, not “Monomix Amount”.

I compensated for removing “Elliptical Equalizer” from the interface by referring to it in the comments.

So my suggestion:

;nyquist plug-in
;version 1
;type process
;categories "http://lv2plug.in/ns/lv2core#SpectralPlugin"
;name "Bass to Center..."
;action "Mixing bass to center..."
;info " By Jvo Studer <jvo@gmx.ch>. Released under GPL v2.nn Frequency-selective filter to crossfeed (mix) bass frequencies to center (mono).n Works only with stereo tracks."

;control eeqfc "Crossover Frequency" int "Hz" 150 10 500
;control level "Bass Feed Proportion" int "%" 95 20 100
;control gcomp "Bass Loss Compensation" real "dB" 0.5 0 5.7

;; basstocenter.ny by Jvo Studer, V1.1 March 2011
;; Released under terms of the GNU General Public License version 2
;; http://www.gnu.org/licenses/gpl-2.0.html
;; Simulates the "Elliptic EQ" filter found on vinyl mastering 
;; consoles by means of a first order highpass filter in the 
;; side-channel (L-R difference).

Gale

One other little query; just wondering why the “Bass Loss Compensation” range is from 0 to 5.7 dB. “5.7” (rather than “6 dB”) sound like a bit of an odd-ball amount.

Plug-in now available on the Audacity wiki: http://wiki.audacityteam.org/wiki/Nyquist_Effect_Plug-ins#Bass_to_Center