Airwindows CONSOLE8: Mac/Windows/Linux/Pi AU/VST
-
- KVRian
- Topic Starter
- 1479 posts since 7 Apr, 2007 from Bellows Falls, VT
But if you use a real mastering engineer and send 'em 24 bit files it does exactly that, just the way you suggest
I never, ever said that you should put a mastering chain in between BussIn and BussOut, did I? I don't think you should. I wasn't, anytime I demonstrated it. 
-
- KVRist
- 344 posts since 9 Jun, 2012
Probably not but this:
plus the fact that it reduces the bit depth to 24 Bit and adds dithering made me believe that it is supposed to be the final plugin including the mastering chain. I mean, why add dither and reduce the bith depth to 24 Bit when the mastering chain is supposed to be added afterwards ? Sure the effect will be extremely subtle if audible at all but the concept is just wrong to me.Don't use any added processing between BussOut and the file or converter
-
- KVRian
- Topic Starter
- 1479 posts since 7 Apr, 2007 from Bellows Falls, VT
Mastering is for another person to do, very possibly from a 24 bit file 
From my POV, the idea of always putting in limiting and stuff and little tweaks and corrections when you're operating from the same situation, same monitoring, same ears is what I am choosing to not go along with. Some folks will consider it very important to not send any limiting, compressing or clipping to their mastering engineer. I wouldn't go nearly that far, some of that stuff legitimately belongs to the mixer, but there's a stage where it's far more important that it be another (qualified) set of ears.
One of the most important things mastering can do is decide when NOTHING needs to be done.
If it's loudenating you're looking to from mastering (some genres do thrive on this), it's commonly punished by streaming services which will be turning you down anyway, and native Console8 will help you get into a zone that naturally sits well in playback on streaming services (NOT entirely through slamming the Console8BussOut, either: I think almost nobody will ever need to turn that up any significant amount beyond 0.5)
You can not trust me, even when I say trust me, and it's okay. You just don't get to unmake all of my decisions around how this stuff works. It's not by accident and I don't mind if there are people for whom it seems wrong. Trust me. Ditch the mastering chain
From my POV, the idea of always putting in limiting and stuff and little tweaks and corrections when you're operating from the same situation, same monitoring, same ears is what I am choosing to not go along with. Some folks will consider it very important to not send any limiting, compressing or clipping to their mastering engineer. I wouldn't go nearly that far, some of that stuff legitimately belongs to the mixer, but there's a stage where it's far more important that it be another (qualified) set of ears.
One of the most important things mastering can do is decide when NOTHING needs to be done.
If it's loudenating you're looking to from mastering (some genres do thrive on this), it's commonly punished by streaming services which will be turning you down anyway, and native Console8 will help you get into a zone that naturally sits well in playback on streaming services (NOT entirely through slamming the Console8BussOut, either: I think almost nobody will ever need to turn that up any significant amount beyond 0.5)
You can not trust me, even when I say trust me, and it's okay. You just don't get to unmake all of my decisions around how this stuff works. It's not by accident and I don't mind if there are people for whom it seems wrong. Trust me. Ditch the mastering chain
- Beware the Quoth
- 35500 posts since 4 Sep, 2001 from R'lyeh Oceanic Amusement Park and Funfair
I know its a wee bit late, but it seems fine here, fwiw; no longer downloading the .gz file, it all looks much as it was, I think.
An idiot on Set Theory:
"In some cases there is an object called red that contains everything that is red. In much the same way a pot is a plate."
"In some cases there is an object called red that contains everything that is red. In much the same way a pot is a plate."
- KVRist
- 37 posts since 21 Jun, 2022
Hey Chris, what do you think about my idea to build a virtual summing mixer (think 5059 satellite, Dangerous Music 2Bus) ? This would keep the Airwindows console setup pretty simple, too, when complex routings are involved.
How could it look like ? First of all you would mix like you normally do. Channels, sub groups, sends, various routings, splits, whatever. No console plugins there. All channels and sub groups you would normally send to the 2bus would be send to the virtual summing mixer.
The virtual summing mixer would look like this: 24 (or more / whatever) groups just for the "summing". For example: 16 groups with nothing in it except console8 channel ins and console8 channel outs. Those 16 groups then get send to other groups with just console8 sub ins and console 8 sub outs. Which then go out to the 2bus with console8 bus in and console 8 bus out.
How could it look like ? First of all you would mix like you normally do. Channels, sub groups, sends, various routings, splits, whatever. No console plugins there. All channels and sub groups you would normally send to the 2bus would be send to the virtual summing mixer.
The virtual summing mixer would look like this: 24 (or more / whatever) groups just for the "summing". For example: 16 groups with nothing in it except console8 channel ins and console8 channel outs. Those 16 groups then get send to other groups with just console8 sub ins and console 8 sub outs. Which then go out to the 2bus with console8 bus in and console 8 bus out.
-
Scrubbing Monkeys Scrubbing Monkeys https://www.kvraudio.com/forum/memberlist.php?mode=viewprofile&u=397259
- KVRAF
- 1839 posts since 21 Apr, 2017 from Bahia, Brazil
A great tool to use for this is console8 inside Mulab. The app or use the Vst plugin in the daw of your choice. You can basically build what you describe.Wrong Eq wrote: Tue Jun 28, 2022 2:18 pm Hey Chris, what do you think about my idea to build a virtual summing mixer (think 5059 satellite, Dangerous Music 2Bus) ? This would keep the Airwindows console setup pretty simple, too, when complex routings are involved.
How could it look like ? First of all you would mix like you normally do. Channels, sub groups, sends, various routings, splits, whatever. No console plugins there. All channels and sub groups you would normally send to the 2bus would be send to the virtual summing mixer.
The virtual summing mixer would look like this: 24 (or more / whatever) groups just for the "summing". For example: 16 groups with nothing in it except console8 channel ins and console8 channel outs. Those 16 groups then get send to other groups with just console8 sub ins and console 8 sub outs. Which then go out to the 2bus with console8 bus in and console 8 bus out.
We jumped the fence because it was a fence not be cause the grass was greener.
https://scrubbingmonkeys.bandcamp.com/
https://sites.google.com/view/scrubbing-monkeys
https://scrubbingmonkeys.bandcamp.com/
https://sites.google.com/view/scrubbing-monkeys
-
- KVRian
- Topic Starter
- 1479 posts since 7 Apr, 2007 from Bellows Falls, VT
Sounds do-able. Isn't that just routing? You absolutely can do that if you like 
-
- KVRian
- Topic Starter
- 1479 posts since 7 Apr, 2007 from Bellows Falls, VT
As requested/suggested, if you re-download Console8 you'll find that the dithering is now left off the final plugin. Monitoring3 is out and has what was in Console8 (everything else is the same across Monitorings, 1 is NJAD, 2 is Dark, three is the Ten Nines/Dark hybrid from Console8)Dip200 wrote: Mon Jun 27, 2022 9:56 pm Probably not but this:
plus the fact that it reduces the bit depth to 24 Bit and adds dithering made me believe that it is supposed to be the final plugin including the mastering chain. I mean, why add dither and reduce the bith depth to 24 Bit when the mastering chain is supposed to be added afterwards ? Sure the effect will be extremely subtle if audible at all but the concept is just wrong to me.Don't use any added processing between BussOut and the file or converter
You can drop the new version into your plugins folders and existing mixes and nothing else will change: given that it's a 24th bit change (or for folks on double precision buss, now its passing through the full 64 bit buss untouched) I'm comfortable with doing an update in place.
- KVRer
- 20 posts since 26 Aug, 2022
Hi Chris,
I've just read the code to Console8 and noticed what I believe is a mistake.
You have claimed in an earlier post on this thread that the 6 ultrasonic filters of each Console8 plugin, once cascaded, form a Butterworth Lopass.
The Q values are
ChannelOut: 3.51333709
SubOut: 1.20361562
ChannelIn: .76352112
SubIn: .59435114
BussOut: .52110856
So far, these are the coefficients to an 11th order Butterworth Lopass filter; and the remaining stage should be a one-pole filter (exponential moving average) — but instead it (BussIn) is a biquad with a Q of .5.
So I've put all 6 plugins in series inside a Bertom EQ Curve Analyzer sandwich (in Reaper) and the response is indeed not a Butterworth one (cutoff at 6.1 instead of 3.01).
This results in a treble softening effect, and I've noticed that you like those, so maybe it's on purpose — if so, never mind me!
If not however, here are the Q values to 6 biquads cascaded into a 12th order Butterworth filter:
.504314480290076
.5411961001461972
.6302362070051318
.8213398158522921
1.306562964876376
3.830648787770188
(Read them bottom to top to preserve the equivalence with my previous enumeration).
Best regards,
Antoine.
I've just read the code to Console8 and noticed what I believe is a mistake.
You have claimed in an earlier post on this thread that the 6 ultrasonic filters of each Console8 plugin, once cascaded, form a Butterworth Lopass.
The Q values are
ChannelOut: 3.51333709
SubOut: 1.20361562
ChannelIn: .76352112
SubIn: .59435114
BussOut: .52110856
So far, these are the coefficients to an 11th order Butterworth Lopass filter; and the remaining stage should be a one-pole filter (exponential moving average) — but instead it (BussIn) is a biquad with a Q of .5.
So I've put all 6 plugins in series inside a Bertom EQ Curve Analyzer sandwich (in Reaper) and the response is indeed not a Butterworth one (cutoff at 6.1 instead of 3.01).
This results in a treble softening effect, and I've noticed that you like those, so maybe it's on purpose — if so, never mind me!
If not however, here are the Q values to 6 biquads cascaded into a 12th order Butterworth filter:
.504314480290076
.5411961001461972
.6302362070051318
.8213398158522921
1.306562964876376
3.830648787770188
(Read them bottom to top to preserve the equivalence with my previous enumeration).
Best regards,
Antoine.
Working-class filter design (GitHub)
Monetize THIS (Bandcamp)
"Man vergilt einem Lehrer schlecht, wenn man immer nur der Schüler bleibt." — Friedrich Nietzsche (Ecce homo)
Monetize THIS (Bandcamp)
"Man vergilt einem Lehrer schlecht, wenn man immer nur der Schüler bleibt." — Friedrich Nietzsche (Ecce homo)
-
- KVRian
- Topic Starter
- 1479 posts since 7 Apr, 2007 from Bellows Falls, VT
I have no reason to doubt you, and thank you for the attentivenessantoineportes wrote: Mon Feb 20, 2023 7:38 am If not however, here are the Q values to 6 biquads cascaded into a 12th order Butterworth filter:
.504314480290076
.5411961001461972
.6302362070051318
.8213398158522921
1.306562964876376
3.830648787770188
(Read them bottom to top to preserve the equivalence with my previous enumeration).
Best regards,
Antoine.
Are you working this out with your own math, or have you found a better source for me as far as looking up filter coefficients? It's also possible that I got mixed up and had looked up coefficients for Bessel or something
- KVRer
- 20 posts since 26 Aug, 2022
I use your plugins every day... of course you have my permission!
I've sent an email to chrisj [at] airwidnows [dot] com.
EDIT: ... and just received an "Undelivered Mail Returned to Sender" report.
So here's the mail:
"
Hello again,
In the txt file attached to this mail, you'll find the sources upon which I based my calculations and the Q values to Butterworth cascaded biquads up to a 20th order filter (for both odd and even orders).
This is part of the documentation to my yet unreleased JSFX collection (you're mentioned at some point). I wrote it myself, there is no risk of copyright infringement, and please feel free to use it!
Antoine.
"
And here's the attachment txt file:
"
//sources: https://www.earlevel.com/main/2016/09/2 ... g-filters/
// https://www.numberempire.com/expressioncalculator.php
N=2, 1 biquad
1. Q = 1/(2*cos($pi/4)) = 0.7071067811865468
N=3, 1 single-pole & 1 biquad
0. E.M.A.
1. Q = 1/(2*cos($pi/3)) = 1
N=4, 2 biquads
1. Q = 1/(2*cos($pi/8)) = 0.5411961001461972
2. Q = 1/(2*cos(3*$pi/8)) = 1.306562964876376
N=5, 1 single-pole & 2 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/5)) = 0.6180339887498941 ~= $phi-1
2. Q = 1/(2*cos(2*$pi/5)) = 1.618033988749897 ~= $phi
N=6, 3 biquads
1. Q = 1/(2*cos($pi/12)) = 0.5176380902050423
2. Q = 1/(2*cos($pi/4)) = 0.7071067811865468
3. Q = 1/(2*cos(5*$pi/12)) = 1.931851652578134
N=7, 1 single-pole & 3 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/7)) = 0.554958132087372
2. Q = 1/(2*cos(2*$pi/7)) = 0.8019377358048384
3. Q = 1/(2*cos(3*$pi/7)) = 2.246979603717467
N=8, 4 biquads
1. Q = 1/(2*cos($pi/16)) = 0.5097955791041596
2. Q = 1/(2*cos(3*$pi/16)) = 0.6013448869350453
3. Q = 1/(2*cos(5*$pi/16)) = 0.8999762231364165
4. Q = 1/(2*cos(7*$pi/16)) = 2.562915447741506
N=9, 1 single-pole & 4 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/9)) = 0.5320888862379565
2. Q = 1/(2*cos(2*$pi/9)) = 0.6527036446661392
3. Q = 1/(2*cos(3*$pi/9)) = 1
4. Q = 1/(2*cos(4*$pi/9)) = 2.879385241571816
N=10, 5 biquads
1. Q = 1/(2*cos($pi/20)) = 0.5062325628940023
2. Q = 1/(2*cos(3*$pi/20)) = 0.5611631188171797
3. Q = 1/(2*cos($pi/4)) = 0.7071067811865468
4. Q = 1/(2*cos(7*$pi/20)) = 1.101344632292633
5. Q = 1/(2*cos(9*$pi/20)) = 3.196226610749832
N=11, 1 single-pole & 5 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/11)) = 0.5211085581132033
2. Q = 1/(2*cos(2*$pi/11)) = 0.5943511444371408
3. Q = 1/(2*cos(3*$pi/11)) = 0.7635211184333675
4. Q = 1/(2*cos(4*$pi/11)) = 1.203615623775565
5. Q = 1/(2*cos(5*$pi/11)) = 3.513337091666132
N=12, 6 biquads
1. Q = 1/(2*cos($pi/24)) = 0.504314480290076
2. Q = 1/(2*cos($pi/8)) = 0.5411961001461972
3. Q = 1/(2*cos(5*$pi/24)) = 0.6302362070051318
4. Q = 1/(2*cos(7*$pi/24)) = 0.8213398158522921
5. Q = 1/(2*cos(3*$pi/8)) = 1.306562964876376
6. Q = 1/(2*cos(11*$pi/24)) = 3.830648787770188
N=13, 1 single-pole & 6 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/13)) = 0.5149639154748634
2. Q = 1/(2*cos(2*$pi/13)) = 0.564680780879147
3. Q = 1/(2*cos(3*$pi/13)) = 0.6679930798878865
4. Q = 1/(2*cos(4*$pi/13)) = 0.8801813576307551
5. Q = 1/(2*cos(5*$pi/13)) = 1.41002004842653
6. Q = 1/(2*cos(6*$pi/13)) = 4.14811490527938
N=14, 7 biquads
1. Q = 1/(2*cos($pi/28)) = 0.5031637882900888
2. Q = 1/(2*cos(3*$pi/28)) = 0.5297264862561447
3. Q = 1/(2*cos(5*$pi/28)) = 0.5905110547870328
4. Q = 1/(2*cos($pi/4)) = 0.7071067811865468
5. Q = 1/(2*cos(9*$pi/28)) = 0.9397929599938086
6. Q = 1/(2*cos(11*$pi/28)) = 1.513871321542847
7. Q = 1/(2*cos(13*$pi/28)) = 4.465702135190253
// Seems like I've accidently found the recipe for Airwindows Hypersonic!
// check: https://github.com/airwindows/airwindow ... icProc.cpp
// lines 22 to 28 should look familiar.
N=15, 1 single-pole & 7 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/15)) = 0.5111702974325153
2. Q = 1/(2*cos(2*$pi/15)) = 0.5473181392530235
3. Q = 1/(2*cos($pi/5)) = 0.6180339887498941 ~= $phi-1
4. Q = 1/(2*cos(4*$pi/15)) = 0.7472382749323057
5. Q = 1/(2*cos($pi/3)) = 1
6. Q = 1/(2*cos(2*$pi/5)) = 1.618033988749897 ~= $phi
7. Q = 1/(2*cos(7*$pi/15)) = 4.783386116752817
N=16, 8 biquads
1. Q = 1/(2*cos($pi/32)) = 0.5024192861881563
2. Q = 1/(2*cos(3*$pi/32)) = 0.522498614939689
3. Q = 1/(2*cos(5*$pi/32)) = 0.5669440348163586
4. Q = 1/(2*cos(7*$pi/32)) = 0.6468217833599913
5. Q = 1/(2*cos(9*$pi/32)) = 0.7881546234512491
6. Q = 1/(2*cos(11*$pi/32)) = 1.060677685990347
7. Q = 1/(2*cos(13*$pi/32)) = 1.722447098238334
8. Q = 1/(2*cos(15*$pi/32)) = 5.101148618689149
N=17, 1 single-pole & 8 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/17)) = 0.5086609187583941
2. Q = 1/(2*cos(2*$pi/17)) = 0.5362089982233461
3. Q = 1/(2*cos(3*$pi/17)) = 0.5880850655531958
4. Q = 1/(2*cos(4*$pi/17)) = 0.6765818224229968
5. Q = 1/(2*cos(5*$pi/17)) = 0.8296901137380606
6. Q = 1/(2*cos(6*$pi/17)) = 1.121734294391001
7. Q = 1/(2*cos(7*$pi/17)) = 1.827064740717401
8. Q = 1/(2*cos(8*$pi/17)) = 5.418975723729716
N=18, 9 biquads
1. Q = 1/(2*cos($pi/36)) = 0.5019099187716733
2. Q = 1/(2*cos($pi/12)) = 0.5176380902050423
3. Q = 1/(2*cos(5*$pi/36)) = 0.5516889594812459
4. Q = 1/(2*cos(7*$pi/36)) = 0.6103872943807273
5. Q = 1/(2*cos($pi/4)) = 0.7071067811865468
6. Q = 1/(2*cos(11*$pi/36)) = 0.8717233978105502
7. Q = 1/(2*cos(13*$pi/36)) = 1.18310079157625
8. Q = 1/(2*cos(5*$pi/12)) = 1.931851652578134
9. Q = 1/(2*cos(17*$pi/36)) = 5.736856622834924
N=19, 1 single-pole & 9 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/19)) = 0.5069136413554682
2. Q = 1/(2*cos(2*$pi/19)) = 0.5286433551380074
3. Q = 1/(2*cos(3*$pi/19)) = 0.568521799899184
4. Q = 1/(2*cos(4*$pi/19)) = 0.6336007264187286
5. Q = 1/(2*cos(5*$pi/19)) = 0.7382453929756331
6. Q = 1/(2*cos(6*$pi/19)) = 0.9141634222088053
7. Q = 1/(2*cos(7*$pi/19)) = 1.244724159932757
8. Q = 1/(2*cos(8*$pi/19)) = 2.036780283118011
9. Q = 1/(2*cos(9*$pi/19)) = 6.054782792720508
N=20, 10 biquads
1. Q = 1/(2*cos($pi/40)) = 0.5015460992414137
2. Q = 1/(2*cos(3*$pi/40)) = 0.5142075968326045
3. Q = 1/(2*cos($pi/8)) = 0.5411961001461972
4. Q = 1/(2*cos(7*$pi/40)) = 0.5864138483070047
5. Q = 1/(2*cos(9*$pi/40)) = 0.657543499945393
6. Q = 1/(2*cos(11*$pi/40)) = 0.7698845216111823
7. Q = 1/(2*cos(13*$pi/40)) = 0.956940427715471
8. Q = 1/(2*cos(3*$pi/8)) = 1.306562964876376
9. Q = 1/(2*cos(17*$pi/40)) = 2.14182878486559
9. Q = 1/(2*cos(19*$pi/40)) = 6.372747421591193
//if 120 dB/oct isn't brickwall enough, feel free to continue!
E.M.A. = Exponential Moving Average
//sources: https://tttapa.github.io/Pages/Mathemat ... erage.html
// https://www.earlevel.com/main/2012/12/1 ... le-filter/
// https://en.wikipedia.org/wiki/Low-pass_ ... nse_filter
// 3 distinct formulas, first one is more accurate, last one is more CPU-friendly -- I haven't tried the middle one yet.
// The first one sounds punchier to my hears but that might just be a cognitive bias induced by neat math!
// There is also a good chance that what I hear as punch is in fact low-end instability due to inaccurate approximation.
// What is for certain is that they sound different: null tests don't have cognitive biases.
//
//BONUS TIP: Cascade two equal Butterworth filters of order N, and you get a Linkwitz–Riley filter of order 2N.
"
I've sent an email to chrisj [at] airwidnows [dot] com.
EDIT: ... and just received an "Undelivered Mail Returned to Sender" report.
So here's the mail:
"
Hello again,
In the txt file attached to this mail, you'll find the sources upon which I based my calculations and the Q values to Butterworth cascaded biquads up to a 20th order filter (for both odd and even orders).
This is part of the documentation to my yet unreleased JSFX collection (you're mentioned at some point). I wrote it myself, there is no risk of copyright infringement, and please feel free to use it!
Antoine.
"
And here's the attachment txt file:
"
//sources: https://www.earlevel.com/main/2016/09/2 ... g-filters/
// https://www.numberempire.com/expressioncalculator.php
N=2, 1 biquad
1. Q = 1/(2*cos($pi/4)) = 0.7071067811865468
N=3, 1 single-pole & 1 biquad
0. E.M.A.
1. Q = 1/(2*cos($pi/3)) = 1
N=4, 2 biquads
1. Q = 1/(2*cos($pi/8)) = 0.5411961001461972
2. Q = 1/(2*cos(3*$pi/8)) = 1.306562964876376
N=5, 1 single-pole & 2 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/5)) = 0.6180339887498941 ~= $phi-1
2. Q = 1/(2*cos(2*$pi/5)) = 1.618033988749897 ~= $phi
N=6, 3 biquads
1. Q = 1/(2*cos($pi/12)) = 0.5176380902050423
2. Q = 1/(2*cos($pi/4)) = 0.7071067811865468
3. Q = 1/(2*cos(5*$pi/12)) = 1.931851652578134
N=7, 1 single-pole & 3 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/7)) = 0.554958132087372
2. Q = 1/(2*cos(2*$pi/7)) = 0.8019377358048384
3. Q = 1/(2*cos(3*$pi/7)) = 2.246979603717467
N=8, 4 biquads
1. Q = 1/(2*cos($pi/16)) = 0.5097955791041596
2. Q = 1/(2*cos(3*$pi/16)) = 0.6013448869350453
3. Q = 1/(2*cos(5*$pi/16)) = 0.8999762231364165
4. Q = 1/(2*cos(7*$pi/16)) = 2.562915447741506
N=9, 1 single-pole & 4 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/9)) = 0.5320888862379565
2. Q = 1/(2*cos(2*$pi/9)) = 0.6527036446661392
3. Q = 1/(2*cos(3*$pi/9)) = 1
4. Q = 1/(2*cos(4*$pi/9)) = 2.879385241571816
N=10, 5 biquads
1. Q = 1/(2*cos($pi/20)) = 0.5062325628940023
2. Q = 1/(2*cos(3*$pi/20)) = 0.5611631188171797
3. Q = 1/(2*cos($pi/4)) = 0.7071067811865468
4. Q = 1/(2*cos(7*$pi/20)) = 1.101344632292633
5. Q = 1/(2*cos(9*$pi/20)) = 3.196226610749832
N=11, 1 single-pole & 5 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/11)) = 0.5211085581132033
2. Q = 1/(2*cos(2*$pi/11)) = 0.5943511444371408
3. Q = 1/(2*cos(3*$pi/11)) = 0.7635211184333675
4. Q = 1/(2*cos(4*$pi/11)) = 1.203615623775565
5. Q = 1/(2*cos(5*$pi/11)) = 3.513337091666132
N=12, 6 biquads
1. Q = 1/(2*cos($pi/24)) = 0.504314480290076
2. Q = 1/(2*cos($pi/8)) = 0.5411961001461972
3. Q = 1/(2*cos(5*$pi/24)) = 0.6302362070051318
4. Q = 1/(2*cos(7*$pi/24)) = 0.8213398158522921
5. Q = 1/(2*cos(3*$pi/8)) = 1.306562964876376
6. Q = 1/(2*cos(11*$pi/24)) = 3.830648787770188
N=13, 1 single-pole & 6 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/13)) = 0.5149639154748634
2. Q = 1/(2*cos(2*$pi/13)) = 0.564680780879147
3. Q = 1/(2*cos(3*$pi/13)) = 0.6679930798878865
4. Q = 1/(2*cos(4*$pi/13)) = 0.8801813576307551
5. Q = 1/(2*cos(5*$pi/13)) = 1.41002004842653
6. Q = 1/(2*cos(6*$pi/13)) = 4.14811490527938
N=14, 7 biquads
1. Q = 1/(2*cos($pi/28)) = 0.5031637882900888
2. Q = 1/(2*cos(3*$pi/28)) = 0.5297264862561447
3. Q = 1/(2*cos(5*$pi/28)) = 0.5905110547870328
4. Q = 1/(2*cos($pi/4)) = 0.7071067811865468
5. Q = 1/(2*cos(9*$pi/28)) = 0.9397929599938086
6. Q = 1/(2*cos(11*$pi/28)) = 1.513871321542847
7. Q = 1/(2*cos(13*$pi/28)) = 4.465702135190253
// Seems like I've accidently found the recipe for Airwindows Hypersonic!
// check: https://github.com/airwindows/airwindow ... icProc.cpp
// lines 22 to 28 should look familiar.
N=15, 1 single-pole & 7 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/15)) = 0.5111702974325153
2. Q = 1/(2*cos(2*$pi/15)) = 0.5473181392530235
3. Q = 1/(2*cos($pi/5)) = 0.6180339887498941 ~= $phi-1
4. Q = 1/(2*cos(4*$pi/15)) = 0.7472382749323057
5. Q = 1/(2*cos($pi/3)) = 1
6. Q = 1/(2*cos(2*$pi/5)) = 1.618033988749897 ~= $phi
7. Q = 1/(2*cos(7*$pi/15)) = 4.783386116752817
N=16, 8 biquads
1. Q = 1/(2*cos($pi/32)) = 0.5024192861881563
2. Q = 1/(2*cos(3*$pi/32)) = 0.522498614939689
3. Q = 1/(2*cos(5*$pi/32)) = 0.5669440348163586
4. Q = 1/(2*cos(7*$pi/32)) = 0.6468217833599913
5. Q = 1/(2*cos(9*$pi/32)) = 0.7881546234512491
6. Q = 1/(2*cos(11*$pi/32)) = 1.060677685990347
7. Q = 1/(2*cos(13*$pi/32)) = 1.722447098238334
8. Q = 1/(2*cos(15*$pi/32)) = 5.101148618689149
N=17, 1 single-pole & 8 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/17)) = 0.5086609187583941
2. Q = 1/(2*cos(2*$pi/17)) = 0.5362089982233461
3. Q = 1/(2*cos(3*$pi/17)) = 0.5880850655531958
4. Q = 1/(2*cos(4*$pi/17)) = 0.6765818224229968
5. Q = 1/(2*cos(5*$pi/17)) = 0.8296901137380606
6. Q = 1/(2*cos(6*$pi/17)) = 1.121734294391001
7. Q = 1/(2*cos(7*$pi/17)) = 1.827064740717401
8. Q = 1/(2*cos(8*$pi/17)) = 5.418975723729716
N=18, 9 biquads
1. Q = 1/(2*cos($pi/36)) = 0.5019099187716733
2. Q = 1/(2*cos($pi/12)) = 0.5176380902050423
3. Q = 1/(2*cos(5*$pi/36)) = 0.5516889594812459
4. Q = 1/(2*cos(7*$pi/36)) = 0.6103872943807273
5. Q = 1/(2*cos($pi/4)) = 0.7071067811865468
6. Q = 1/(2*cos(11*$pi/36)) = 0.8717233978105502
7. Q = 1/(2*cos(13*$pi/36)) = 1.18310079157625
8. Q = 1/(2*cos(5*$pi/12)) = 1.931851652578134
9. Q = 1/(2*cos(17*$pi/36)) = 5.736856622834924
N=19, 1 single-pole & 9 biquads
0. E.M.A.
1. Q = 1/(2*cos($pi/19)) = 0.5069136413554682
2. Q = 1/(2*cos(2*$pi/19)) = 0.5286433551380074
3. Q = 1/(2*cos(3*$pi/19)) = 0.568521799899184
4. Q = 1/(2*cos(4*$pi/19)) = 0.6336007264187286
5. Q = 1/(2*cos(5*$pi/19)) = 0.7382453929756331
6. Q = 1/(2*cos(6*$pi/19)) = 0.9141634222088053
7. Q = 1/(2*cos(7*$pi/19)) = 1.244724159932757
8. Q = 1/(2*cos(8*$pi/19)) = 2.036780283118011
9. Q = 1/(2*cos(9*$pi/19)) = 6.054782792720508
N=20, 10 biquads
1. Q = 1/(2*cos($pi/40)) = 0.5015460992414137
2. Q = 1/(2*cos(3*$pi/40)) = 0.5142075968326045
3. Q = 1/(2*cos($pi/8)) = 0.5411961001461972
4. Q = 1/(2*cos(7*$pi/40)) = 0.5864138483070047
5. Q = 1/(2*cos(9*$pi/40)) = 0.657543499945393
6. Q = 1/(2*cos(11*$pi/40)) = 0.7698845216111823
7. Q = 1/(2*cos(13*$pi/40)) = 0.956940427715471
8. Q = 1/(2*cos(3*$pi/8)) = 1.306562964876376
9. Q = 1/(2*cos(17*$pi/40)) = 2.14182878486559
9. Q = 1/(2*cos(19*$pi/40)) = 6.372747421591193
//if 120 dB/oct isn't brickwall enough, feel free to continue!
E.M.A. = Exponential Moving Average
//sources: https://tttapa.github.io/Pages/Mathemat ... erage.html
// https://www.earlevel.com/main/2012/12/1 ... le-filter/
// https://en.wikipedia.org/wiki/Low-pass_ ... nse_filter
// 3 distinct formulas, first one is more accurate, last one is more CPU-friendly -- I haven't tried the middle one yet.
// The first one sounds punchier to my hears but that might just be a cognitive bias induced by neat math!
// There is also a good chance that what I hear as punch is in fact low-end instability due to inaccurate approximation.
// What is for certain is that they sound different: null tests don't have cognitive biases.
//
//BONUS TIP: Cascade two equal Butterworth filters of order N, and you get a Linkwitz–Riley filter of order 2N.
"
Working-class filter design (GitHub)
Monetize THIS (Bandcamp)
"Man vergilt einem Lehrer schlecht, wenn man immer nur der Schüler bleibt." — Friedrich Nietzsche (Ecce homo)
Monetize THIS (Bandcamp)
"Man vergilt einem Lehrer schlecht, wenn man immer nur der Schüler bleibt." — Friedrich Nietzsche (Ecce homo)
- KVRer
- 20 posts since 26 Aug, 2022
This might save some time as well if you (or anyone) plan(s) on experimenting with odd orders, here is a JSFX that compares the three exponential moving average algorithms (in mono):
Again, my code, no copyright.
Code: Select all
desc:0im's filtering: 2 modes 1 pole
desc:exponential moving average filter
slider1:HP=0<0,1,1{Lo-pass,Hi-pass}>Mode
slider2:freqHz=20000<20,20000,.1:log>Cutoff (Hz)
slider3:algo=0<0,2,1{neat,decent,cheap}>Algorithm
@init
Ts=1/srate;
nyquist.safe=srate*.49;
@slider
HP=max(0,min((HP|0),1));
freqHz=max(20,min(freqHz,nyquist.safe));
algo=max(0,min((algo|0),2));
w0=freqHz*2*$pi*Ts;
//ALGORITHM 0 "neat"
algo==0?(
//source: https://tttapa.github.io/Pages/Mathematics/Systems-and-Control-Theory/Digital-filters/Exponential%20Moving%20Average/Exponential-Moving-Average.html
calb0=cos(w0)-2; //thanks Tale!
b0=sqrt(sqr(calb0)-1)+calb0+1;
a1=1-b0;
);
//ALGORITHM 1 "decent"
algo==1?(
//source: https://www.earlevel.com/main/2012/12/15/a-one-pole-filter/
////a & b are at each other's place in the original
a1=exp(-w0);
b0=1-a1;
);
//ALGORITHM 2 "cheap"
algo==2?(
//source: https://en.wikipedia.org/wiki/Low-pass_filter#Simple_infinite_impulse_response_filter)
b0=w0/(w0+1);
a1=1-b0;
);
@sample
yn=b0*spl0+a1*yn;
!HP?(
spl0=yn;
):(
spl0-=yn;
);
spl1=spl0;
Working-class filter design (GitHub)
Monetize THIS (Bandcamp)
"Man vergilt einem Lehrer schlecht, wenn man immer nur der Schüler bleibt." — Friedrich Nietzsche (Ecce homo)
Monetize THIS (Bandcamp)
"Man vergilt einem Lehrer schlecht, wenn man immer nur der Schüler bleibt." — Friedrich Nietzsche (Ecce homo)
-
- KVRian
- 1119 posts since 4 Jan, 2007
https://www.earlevel.com/main/2016/09/2 ... g-filters/
For the Q's there is a class here (on line 29 there is the loop)
https://github.com/RafaGago/artv-audio/ ... rworth.hpp
For the Q's there is a class here (on line 29 there is the loop)
https://github.com/RafaGago/artv-audio/ ... rworth.hpp
- KVRer
- 20 posts since 26 Aug, 2022
Sorry for the silly typo and for disappearing, life had me moving to a new place and I just got internet back.
In the meantime rafa1981 provided a link to earlevel — it's the sole source of my math (not really mine from that perspective), the same link was in my comment but might have been censored by auto-admin because of the 5-post rule.
While experimenting with cascaded Butterworth, I've found how Pro Q 3 and Kirchhoff EQ deal with resonance (i.e. steeper peak as order grows but constant level).
I can send you some EEL2 code if you're interested in that (or I could just explain the process, it's actually quite simple).
antoine.portes@yandex.com
In the meantime rafa1981 provided a link to earlevel — it's the sole source of my math (not really mine from that perspective), the same link was in my comment but might have been censored by auto-admin because of the 5-post rule.
While experimenting with cascaded Butterworth, I've found how Pro Q 3 and Kirchhoff EQ deal with resonance (i.e. steeper peak as order grows but constant level).
I can send you some EEL2 code if you're interested in that (or I could just explain the process, it's actually quite simple).
antoine.portes@yandex.com
Working-class filter design (GitHub)
Monetize THIS (Bandcamp)
"Man vergilt einem Lehrer schlecht, wenn man immer nur der Schüler bleibt." — Friedrich Nietzsche (Ecce homo)
Monetize THIS (Bandcamp)
"Man vergilt einem Lehrer schlecht, wenn man immer nur der Schüler bleibt." — Friedrich Nietzsche (Ecce homo)
