Spectral "Compensation"?

A shorter FFT size than window size? This shouldn’t be possible :grimacing:

Ah right, should my @numframes always equal my FFT size? (so @numframes 512 @fftsettings 512 64 in this case)

Oh, right, your @numframes, not your window size – that’s a relief for me, at least.

@numframes can be whatever you want. I think if it’s shorter than your analysis window size, the anlaysis will be zero padded (which may well not be useful in some situations). I should probably verify that this is true, and the remainder of the frame isn’t just garbage…

The fftsettings you quote are a window size of 512 and a hop of 64, leaving the FFT size to its default (which is equal to the window size). If you’ve not been experimenting with using a longer FFT than the window, then this may be a useful avenue to explore in addition to what you’ve already tried, e.g. @fftsettings 512 64 1024.

This will zero pad the window and run a longer FFT, which gives you some interpolation in the spectral domain, which in turn might provide a workable trade off between immediacy with short windows and hops, and useful analysis.

Phew!

I’ve been wrestling with a patch for the “hybrid” stuff which I’ll post as soon as I have it working. It’s just tricky getting the cocktail of @numframes and @fftsettings for each analysis window, while still keeping latency of that step down AND the fun job of having to keep manually resizing buffer~s each time I decide on a new @blocking 2-worthy setting.

I think for what I want, the zero padding won’t be helpful as I’m trying to eek out as much time as I can while getting “good enough” results.

To be clear(er), a bigger FFT (rather than window) won’t affect the latency per se, but will add some processing load.

But, you should be aware that resizing buffers on the fly is going to screw up the temporal sleekness you’re trying to engineer. Buffer resizing, because it involves memory allocation, is always deferred by Max. So, at the very least you could end up getting unpredictable results if you try and process from the scheduler before a resize has completed.

Presumably there’s a pretty finite set of possible sizes you need? I would suggest that you have a pool of pre-sized buffers that encompasses this set and switch between these: that way you can stay safely in scheduler-thread-land where you want to be.

Sorry, yeah, that’s what I’m after. It’s the processing time I’m chasing down. For the 64 sample window, looking at around 0.2ms, the 256 jumps up to 0.8-1.0ms, and 768 is like 3-4ms (of processing time).

I have noticed some funny business where sometimes I switch to @blocking 1 and things speed up, but I haven’t been able to isolate/narrow down when/why that’s happening.

It’s just a tricky as there are so many objects and related buffers that changing all the @source / @features for each fluid.buf..~ objects takes some time, as does changing the buffer~ sizes based on the amount of analysis frames that get returned.

Don’t know if this is a viable option at all, but it would be amazing if an object set to @blocking 2, if it is presented with a buffer~ that is the wrong size, or has no size, that it resizes the buffer, once. So basically whatever loop throws up the “buffer is wrong size” error just resizes the buffer instead (internally in @blocking 1 I guess) and then carries on in @blocking 2.

edit: made this a feature request here to not “cross streams”.

OR if there’s a better/faster way to just the list of values that a buffer~ will require than checking the attrui for samps (which never seems to line up with the “actual” size in ms) and then checking an info~ for amount of channels.

I’m afriad not, but thanks for filing the request separately, and I’ll give an actual explanation there.

Perhaps? It seems like the kind of thing that should be abstractable-away in advance, without needing to interrogate buffers directly. How do the samps and ms fail to line up?

I don’t know why this is the case, but having a buffer~ 256_loudness -1 2 @samps 7 gives me a size of 7samps, but somehow it’s 10.15873ms…

Screen Shot 2020-05-15 at 11.41.40 am

What’s stranger is that it seems to actually write the full length of the buffer.

This is what I see when I view the contents of buffer~ 256_spectral_shape_stats -1 7 @samps 14

There are 14 “samples” of information there, but it seems to cover around 20ms of “time”.

I don’t know if this is partly why I’m seeing strange results in processing time when changing @blocking modes.

Possibly this is because the marked sample rates of ‘feature’ buffers (like loudness etc) are changed to take into account the hop size (and it’s possible there’s a mistake in the calculation).

If you run a spectral analysis on a buffer with a hop size of 512, then the duration of each sample of the feature is the same as 512 samples of the orginal audio, so for 44.1k audio, the sample rate of the feature is 44.1k/512 -> 86Hz plus change. So the reported duration of the feature buffer should match the duration of the chunk you analysed, more or less. If it doesn’t, then there’s probably a booboo.

1 Like

Hmm. Wouldn’t that be impossible with @blocking 2? Or I think I’m just not understanding how buffer~s work (where it can be 7 samples and 10ms long).

It’s a bit messy, but here’s the bit of patch that generated that stuff:


----------begin_max5_patcher----------
4747.3oc4cs9iiajb+yy9WgfP93tB86G2m1y4Rb.h8EiXGXbvWv.NRTyPuTj
BjTytqOb9u8zOHoHoHoZJ0TZLx.rZo3qtpeU0UUcUc25e7tGV9T5WByWt3Os
3WV7vC+i28vClSoOwCke+gk6B9x53fbyssbWXddvygKeu8ZEgeovbdvJFGyj
7pKDGkDtN8Ph4pnxStOnX8KQIO+XV35BaqBIDzJv6WPIBy+Azehoq.K9eKen
zCEwgEEecen8IVtr9RQaLsc5S+5GHzpVN4vtnD0Sj2rkUmz9dLmEpO4+7cuS
+w6cjwSB+rpcNguKV7zxw3NoggH.zJVi+3Dz6WfLLt9yg40mBRdte9EzK+Bm
a9c+h06OTDsKLq5RaSSJxi9MCEC0rzHnADaPChT+eL544+swoAEGA.cakDry
b0k+4rnf3k8.M3onJzjbULkEPJQDUCFEG9ZXVdTZRi69gkA6223zOz3Qzv3u
lZdQh2WepnD6of0mJK70npmGWe1fLEnUnPrCYVl7KLxxiulzMgYIGhpkoFAZ
IIYDcZvIeevZ6CqkvUW9nXfhL.OTXz+fRtQLf4GkCJcimiSW+oPCnBpNY59v
jnj8Yg4gIEAEkDe8k2DtM3PbwisTHfqnRJTvjU+02cusjf68U0q79gkOmEsI
MQSRsDL5SW03JMNKmRaxZl6HIXeOOrR6QgRCbwbEKeH+ofLsb6o3vF5Tp9Go
owsuT8yEGtsn7x6iRR5foEo6G9hYQO+xHO6SopKtar2s4J4OdHwd0GUpHEOl
G7ZaztHHNtr6d6W+WBRh1ETDp6uaXWP8ECSBTL5K4qyRiiawu1q7ZOWYiRke
c3mi1T7hogV0Pdqt8n8UpTKqkxahdNLun84JBdNu8YxK9pEzabpCOU1k9whv
c6iUbQ6ankmul8eaZXr046XfzZDotyY+l7vDiBH2X2y1uC0TarioKXyWWeF1
6wBFnwUVmtaWn0m6xnjhvrWChWDkrXW9hn7EYg6SyJB2rPgJgMaonjMgeogQ
kRmEk1WtP7okCj1NQdZQKF0ICFC4SAXLewMQOfrlxfc.3w8pNtiktRHzEHgt
Qnpxw7ZsUaOCsPfQGlxbCaa6wdZfK9sK39Ak4JeArkFEHFiBXzJ5biqjAwUz
8FW8no.6HHtYVBn++GKADtVG8FZHfcmwVS6szIyiD9Ht1cPeqAWyGjqACy0C
38W2PKxUQWluPE8lhxWDjroLB.Uv.kwFzaP.naLPZ625QbT3ebLPiZk.4nfW
eZgGG6gNqHCDzoAXzWueTMO8P15JtujIWzFjTAQWDkTOtreo1Lk99bRlNUZf
6HMflQZf4HMn7At.NSz.0QZfMi3.wQZ.Niz.dBxh4hFPNRC3AogxSVkYkk5w
Ku4QatAdLnnHK5oCE1twMSUzjFCqa4H443zmBhKGGasiydFH76NxBSLMeMMP
2qWND030GaLOiAUedAorDK6MubfQyKWSaw045qkmpIxvCk.a4Hf.hAsIrDbL
G0im2x9A.w8IG0+V7h3vjw3OtQFyfvih5yveueHdDMAd7Rje5NfGhFgYDHwJ
HnweHrxxOFZFlk.sR13OgfcQRRDezruqoQazC5nvUj2RuIhGR88CfURAjCmb
8Wv1vuvR4UU+EDdl0sqLDzkwe5v1sgY+tJlQ1i6iT72hO.WfV7w7fcpXewiY
ZCVVGBhQ6GIsibrowslJ1vITvEfGkrnQsNKrkMyVKkK1xDZtqdlxiYQZxnBC
lYbkDqKFDo5yKvQCpAjko7ZpBW+QaVo63u4FV2rnjsoMTRGEI3FgIQ.soeC6
ZYxT1jiixM+e8Ib4.8+hRJ5EKg3In1K8GdU0s9K0P1i5BvjW0wFRFCBAHC1Q
kvU5pRKAbIhnFvNWp6fym.fNnRFcB3BZNwkV16fTWfEF5TXAZc.bsvB+9.K6
CC+js6U9dE+lED+X9KA6CKUZnS0sHwjUVrNMhBAR8GjQgbAPEt.zFL339H6T
25l4hs+nfwyeDBPDjtByfXjXpvASZsMytt4nwcJ92lgHzq5gpGD2ICKbqeVF
2nBfrVnu1tLX180TxovRa.g5.ffswNQ7hMD7baacvIwzHbJggqT60wJZFMwE
LDPx8ZZJwWvFchJwWQaNxHf1SoR3xPbNBPLtIfPS4pNqDVGKwHgTfA2G8cMF
LlDFqzduUX.R7VzO4TcKP0EurKhgY.kWFhBoJcZpCtfdU9LQrY1m4EpwzO+q
BxB1QiAZGl10oxPt+tIlZf3ktGnpgV2Sb3dw6IB7FAVbNuCUfhJnpSiBWv7B
n.u+fRb5gMIJGsWf5hJNUnjSjHU.3.U.3XnFRH9.Yfx2NHSKMF94wkxLBf.d
IJKH4NEkkoZpa0IlYw+hRvZHvIFYhjYlPBP7EluKHXlCCq0jCr2TtCMczYxg
pqRyTMLESb.WJbheKtvyYoG1uXrBn.UiYT1Lm7RkfmAric.dMkafOykaX.td
aQ5tiyHr9XYotXJmDafRpSXBfRrCjBDj.3pt0zKUKldeVC.EKnSkwQJljyAT
NmxXRFAiIts.HFLujr6z5enN.5FwBMYzfiNEMfH4jWODMmxTn6SLxaiODsYk
x8lAI9ck6LSE4aDWzGsA.bR7iJRZSXVzqpfBLeY8KAIliMNHzeaAXwGqJg1h
wpCh.ZxWGjKWgobHAILex4Lk8EWBbv5DpYNw6MrpoD7.dFvXC9cDi+vG9PZR
dnFL2tsPcPgBVLHstxPpSFFnWHI4MEFJhz360daeLH94zrnhW1oiDwIrlyDm
pQKnZ7mQY9Bpo7YFpGpdhJT4umTGg1tvfjFe0nu92SrP4tvMQ5qtV8ZxRi1T
dy0es7l2FGTz3cU+0xKqWkDoa2tPQbG+h4Z8NZb3HquJJDbZnRTLQKZrqCMH
A1eHFrYt3lms9e5puxLEqurx7DgtnzWcs.gh6Xs.GRGqTLOV.SB4JJGygBDC
p9jxDCjKpSKZstYVmFaWvY+hYY1z3iAT.fnYVC3FU3FSll5KkL9tNNP38weq
eyfGSORpaPF7j2ofSNaX58quvoqDc.fKNJcx8IP0yy5b.3TaLJ6JqpBeR+IV
m6kKl2QKuOFXqbxNV19kJlxEKrTnmrvNo5d.7HZTEQxHnASPVwZNw3fZzPHV
g3BHo1BAxivwjBl914wgMUSnXcPucUj5sH.WqCG7auQ30otwMFpWuf6GeI54
WTwh1YvemNtC229H5I6fPAukMLBQOWNNV+1qcrID3cdXfUXqAZ6e3fMG4WWg
T2wJxHmLrPeKQv7VCL23PE3OAB5NMXQypCpHcQPRP7W+svEUCTbxfl.e5ner
yAI6zxBiGXVodergdtBiBQDQO9SXLk2UFfgIRNmwEToWJlN8tWL8105Zx.CF
nFEGVRjBj.hn.fNuUPJ5ZxGHE91yaQcdTZ3mnaYBGLQf9xiQ+pl.5JHTPjTH
VfkHqpIi6KKT2aOFUnbuNK9bTxlzOqWNRVi+ujt27kd7KzxuxQwouEGZ+EZe
1BpuD.hYV.b10QUetEsK7.WVTUCVFjApCh6Kppy4B6ppY3YWrN5jIexh0gR8
4Z0A580pioUZuVdsfQ20pXIjbxZTT1bMJd90L6Iftqsivg1A15dNyv3tJpgg
bgbndfuotv3zQ3bHFhIDAD.UZgPjFBTZfL034H.UrYTBzfJHLydBgR6T5CLx
P4PGo7qqk3tnDJuYZGcDGCrncaSzoYaraYav4uo0KvsFRl5lFbUMMwESADQ+
MMb9a5g.7qjqwtv0ziqX+KukbwlC41YCj3jVNnePGM+MMRLGcvbqoIyhpFvE
E.rOT0lP2oqpgvRWYoqtkbwGAELGpLN0zXzbnxfcQRBA9.ecw5DV3AkSrScC
j9fm.NDACzGQvfboe.jcyrsibJbanO5XhDNAxdoolRbhWWKwtUVPQDGfOouZ
nyBdLezRNM3JunPbqjRPm793kVxEMOlOFQNjdyPOsrVbNUOeDiMzI3yKNLqM
ocCvOWhYk3iFxEWyh4HPGmZY5rLjamZZBZNFGjKx0NIPx8nFroFrytCulR5r
qv2YGg+zcC9g2I36tKva1mxraA1cRG4wsZyCahR+Qy9W9ieeXxAaJNq1k0ai
WO871n33ZNt4NbVUlVKwi5Md9lnCRRf5L3CVggXNhYNRc.k1via4y.qdHBkH
AlrrQXHttZ8piDHLEaf4NOF5XaAfRaK.jB.wdj5TvVy5DEVl7b490NuwlN99
rT8tgY01X+Jb89tVvghzmyB1DUljbPq8Ws2WptkotZ2cd7k6T.ZT0yzT8rVX
7cGVGLl.nEbR3TH1fGHIVHsGQg.lr8DqIOLVopnXkVOMGotQiv.x3HKXJ..H
o8CWO+cdLJQq2FVCvXIBxrsYkDBwEDba.1IclZ7b.0FGEksUbD0pKBNfJD1i
Ng.6p3vn.KrX+w3vdj8MMK5M87qWgxPy+09vjE+ntTm+X3tnmRi2br9EAq0S
ZqVPDVKCL3Boh708qHczDTJB659nbghKsvD.JD1iTuEDpqbr0iIADH2zjJMO
BmaeLjz9pnrJKeWYGhuOnnXrNDM2qD0ahMMH3l+3Q7KGCj4JIne3OW7n4w.N
2OUR0F9rvBgCLZxZEYbGoy53Pkg8iOIz5IQpPWpUiToHywsenN..xkttCNE7
9iVeUmer4sypc2pdr9mtYT4z9XVfquiZDbwUpQ+y+z+typxPseaaObs9qwnO
uxC9vZkhFWpNTr15M5HBLNgz6DQLqsLsH0Ves6uFpaVXu6QgzuB5+wW2jk9b
XxOYfnQzSo.NyPj.FECM5o544NxA+HDFDBrQmIQLhgooRnp63n53Pld0DXZH
NgIkkGAj9TE2LoChV6djUkVm66ngUykWks296WbUlp6IT7iVbwRt0dIVV5cR
eJJ1O5ysXBQcnhmdzE0KXTk8uMLI70fQUycU91QW8bXlO0U+lFKJtypwVFof
nV5.JOx6j0eo92kg2PD02FDk76N24FW645zi7Ook+4iaom8SbmneBK6qe7iY
glPuoHp+y73nMU+vA5ltUGpYzQ65ZO9d8rcYVKFJWP9Au9tvMSqeXeNQ5iaY
yJYqFOWVzWVWjEeETuWIH8p9cTiGdTk3lZ54ultIL2YqhN5idjPdtHbxqL7j
LgL2cP+qG18z3DSeVpN0o4LPZ+Pz5hyiU2c44On+wDs3MWzF+35z8gtGtwwr
VKw5+5MV96GH+SAO48gE0mlyYsu3UlRM5qmlb.z8GOQOCeXdMb7SoOqGEj2B
mcDgBlqWH61mffglgyQJKqhOYo+mcmovR2v.M+4fWC2lls628NBO8HOAqndh
41Dj8oOjn+IA9ClDILFy0elFH0cK40kyotvNBCA6grvAOipm2y8f2y.W6bOb
xxa2wTR2mYkyVm.uno7qk+jQA.kq6Le7pFcrjcqqwnISELRrlzyjrriYY+jC
7Whybi1+Cgxa2xX7TbnxkosrieSZ5mV5MUtnjO4r4Vlh+.hZWrXFP08Y7Jk0
rvDlaG27nyai1glbHMt225SOjgV2ooanIUOWdhSrZ5f.nuppc9mp2Lbb9Gqa
heOmQcuzM4S1wj8y5o1y8NXoXcnDmOD5dg25nFn01EqTMGK2H.IobNrHkXAu
7Htvqd+1E7EldYoNBOM8R2zipon8Hc3kcuFj+6HH8WfgZFtw5O1kQ4gvTjrs
eMs5Oz2xgV6Az9RV3gPSE00n+ziFwXJWnmUZuu2itgt3ul4oV6dGtIEataV6
ZR2ZLm97d7s1c6fuI9PX0FqfiU3POqD4k0h9nMLYSKW9j.yR+bxjovyZa0iT
3+5WClNABPRps1+bNFir8cPPU3Y9m.+1rvvKfBMnWcp3fLsyc+SbeuxxVRQv
jIOAAvX1jDx.PlwOBmIgRp+ow+6vMSl930gVBqG+Cnziguou+VXbb5mGmDOc
9uQk.fXTeyHpcpsvEPgcw5SUZszYiAP+QjALku3aSiu.Uj5rWPUw+PsStGuO
s01eHae7kE7.ud1zQfTlvlKZsY.5YhPk.rAFgn.lzzI.InLjvm7UV35vnWGu
xc8oSTOvji7Dn4TLzODmcHJZ0B2GOOQYPSV5HfWNSgUZqR7nn8sQKJOLYS9a
MOHGA4w660Yxhxg.tsNSDFPVNgr4P5YGrxsApKB1eN6fMRF02ETjt36ziBco
2Z+7hvsGhiKlVAVzKZEtAcX0wpqyfv4lXiBJ0t6vfXXN1tRIXptjL+BpVlZl
3ION9djfKrA1fq65fQRrzqVOKByeasdA9rNaNecpSC.EcoEPlwPhKkKp9okE
HX34ig9Gg0yOGTcb1n2eJOgRIvFVpRWlTVqcF.fgsmo1c5O+WhxJ95h+smSu
nty1kNmoBd52Y99R4jYKF6c+y28+A24Zi8.
-----------end_max5_patcher-----------

The sr for max buffers is just a flag which then gets used (by Max) to convert the number of frames into a ms duration. Changing it doesn’t actually alter the size or content of the buffer at all.

OMG, everything I thought I knew about you is in tatters. Only one coloured patch cable, and objects that aren’t aligned. I think I need a lie down. More seriously, I don’t see yet which bit of this is hinging on an ms duration of the buffer, but I’ll take a closer look later.

3 Likes

Hehe, it will get there in the end. I’m just copy/paste-ing bits of code around and tweaking things, so there’s not much to tidy yet.

I’ll spare you the horror that is the duct-tape and spit version of the Kaizo Snare patch I went onto stage with cuz of all the last minute bugs and weirdness.

Nothing there hinges on size, but all the buffers there have diff samples vs ms, but I guess it’s what you’ve described where the sample rate is not 44.1k.

I’m just wrestling and tweaking settings to see how low I can get the processing time while still getting the data out that I (think I) want.

Ok, a bit of a (short) breakthrough, followed by some sadness and disappointment.

After inquiring over on the cycling forum about a way to create filters quickly and on-the-fly and someone suggested (quite helpfully) to try out fffb~, and on the surface this seems like a perfect solution. In the patch, the way things work at the moment is that the fluid.part~ of the patch generates a list of frequencies and decibels, and then the hiss.part~ of the patch creates an IR from that.

So if I just convert the dB output from the analysis/stats part of the process into linear amplitude I should be able to feed that right into fffb~ right!?..

Well, when I did that, it didn’t sound right at all. Because I had things like this:

Those dB values don’t correspond with the filter I’m seeing at all.

So after tracing the patch I realized that a part of the old patch that is pretty important is the maxgain message to irstats~. This takes the filter output from fluid.bufmelbands~ -> fluid.bufstats~ and scales it so I have more-or-less unity gain from the resultant filter.

Bypassing irstats~ ends up giving me filters that are waay too quiet for the most part.

I tried taking the normalization bit from @jamesbradbury’s automatic spectral compensation patch and that gives me better results, but I don’t know/think that’s the way to go about that.

Now, bypassing hiss.stuff~ means I don’t have the smoothing and other nice bells and whistles of that approach, but I was hoping to at least be able to implement a rough EQ quickly, but I’m not sure how to go about approximating the maxgain of an EQ curve.

The helpfile for irstats~ has this to say about maxgain:

Estimated maximum gain within any octave of the IR in dB

Is there a specific formula for this, and is it possible to calculate it using a list of frequencies and gain settings?

Here’s an example of one of the curves:

221.833218 -33.454389 362.220601 -36.311383 523.987791 -38.297038 710.390753 -39.677351 925.181305 -41.060575 1172.682637 -43.307582 1457.876324 -45.938757 1786.50259 -42.903525 2165.17585 -45.6 2601.517837 -47.113147 3104.311008 -47.386607 3683.675316 -45.473278 4351.271895 -49.073143 5120.537773 -47.560681 6006.95632 -51.866266 7028.368896 -49.935765 8205.333946 -47.85 9561.540794 -50.37641 11124.286444 -48.3 12925.025005 -48.543471

Also, and I guess this is something I can try to test out, but if I’m using fffb~ would I then need to specify the “outer” frequencies and give them a gain of 1 so the overall filter is shaped correctly? (as in 20 Hz @ 1.0 and 20k Hz @ 1.0, which it seems like iruser~ is doing something along those lines)

Ok, based on some great input from @tremblap the other day, I played with this further, and rather than normalizing the filter I just bumped it up in gain relative to the highest point.

It sounds a touch better, but it still wasn’t right.

So I decided to measure the output of fffb~ using irmeasure~ and the results were…

This is the dark sound:
Screenshot 2020-06-06 at 4.51.01 pm

(red is HIRT, green is fffb~)

I mean, it’s not great, but it’s crudely in the ballpark.

Next up the kind of peak filter sound:
Screenshot 2020-06-06 at 4.51.28 pm

If you squint you can see that there is a bit of a bump in the middle there. It’s very very subtle…

And finally the bright one:
Screenshot 2020-06-06 at 4.51.59 pm

Again, a bit of a bump towards the top end, but all of them have a really shit rolloff in the top end and are super approximate. Like super super approximate.

So I thought maybe the Q needs to be adjusted, and reran everything, but with each filter of fffb~ having a Q of 10.

Dark:
Screenshot 2020-06-06 at 6.00.58 pm

I mean, it’s closer. Tons of ripple in the mids, the lows are all gone, as are the highs.

Middle one:
Screenshot 2020-06-06 at 6.01.25 pm

Again, closer. With loads of ripple and clamped extremities.

Finally the high one:
Screenshot 2020-06-06 at 6.01.48 pm

The best match so far, again barring the high end.

This sounds more correct, but still sounds like shit.

It occurs to me that iruser~ and fffb~ may be treating what happens “past” the lowest and highest frequencies different. For iruser~ the lowest given frequency is 221 Hz and the highest one is 12925 Hz. It could be that fffb~ takes whatever is past that point as being -inf dB. This would perhaps explain the high frequency rolloff, but the lows tend to kind of be there, or at least don’t take a hit as bad as the high end does.

Here’s a patch to compare with:


----------begin_max5_patcher----------
7707.3oc6cs9ajibb+y69WAifARhsVh98i7IaGmbmQtywv2EXDbvPfZFJsz6
LCmvgi1cOCq+1S0r4PQxgjSymRZ8JbmDW9n6pptppqt5G+9au8MWca7mBObk
2+l2O48l272d6adS1sL23M4+62b01fOsZSvgrW6pUwa2FtK8pqsOKM7SoY2+
eg46cXezGB8t6t6t8QuzXuCgg+qmdu8IgGfOKHMJd2Mah1EtJ93trujj+F6N
tM9X5lvzr5Ake2n0Ykd7s+02wnmJr6h2kdWvpPyivkt2gneN6dDj+oueeP5p
2Gs69aRBWkZ4SLlR70RBSPjRJSfnZ50dTrF9H3SUY+Q3i79KOQYQ6NQXkquc
Aaypuq91vMODlFsJ3JyC+6u8slec8HknTPfBBo0G71XDqqiig+6za0nHrcgL
0YgLYZDxZhxWQHJBiIUXllgYW6w4ReAEiDbsfIzJolbsGllI3Yu.j32GDs6v
UNKpvW0N+K4DejrF+yvXep.T+jZ6ObEn3Is5csx9SHCdWR3+2wvcqhB6Aah5
fM4JWYSId5YysG2jFcXSz5vjlYGx4rCsTqVBnMkFlbS3tfa2DVl+WEraMnbs
KTY4SfrIRFGeMbEvpHt1bEGg0B3d3RL0SlG0KJwohRRM+XJ.DkSzLyURkhP4
0JpLNaU7l3jSephCuW1GvIXtHiJPbjVU8KshfzOuOz9gWc00v++TAChmzOuo
ho8g8Aqf11xRsBJmbp5wLacg7IfWSBwbEkKTBZ05u3KYm9RF75Xg48EfLCkU
FHPNppQ4.oAJEPqr8CIHiWFvGABUVyoIMQlzmellHU3qwDAACt2IZpVBj.lk
UlbdSDrrPRKULZV6MA9KUdcI1uFAeRNW3NLL3CUZ0XZEHtttwqpH1.ObqCRC
J2tznqvauuT4mYXU4WmyVzSjBQazYyH.LVJ3Y5d.6QDs7k7SeI2HOxT8TOYJ
XjLmZ6WJCX5qYCXpQkOytAUXGPafJ9hwBFUWmroNKAi6mCa2uZnN1.JH9dqd
evt6CMw6mE3+.CP04QAPXSS.p1vtX5r+fsQ8+RHFTruWZRz82Gl3cWzFv4l6
QpQlnX2IhLiLSD7TvXTy4fGJhhYrd3rkd3Q6B+HvbmIm9mdmGtYIC9bIi9p1
bqFYT+5v0jf6CldBDA50PHPXgRoDXEC7oPzlGQHsIJHCfYOB5DGalsnmyVJW
5IrQV955cnzJqy4fZfjJUBE3sGDDLnOC3QntX8hlfzvs4YW3pu82+m9QScds
4WVWESpqnsffwUKEYGCogPn1PNY9z5p+D0xMVsaAu.uOcByehnKlFKMM1Xs5
bllpWNldcPxGbtUj1YqXVervnNOmeHSO+b6wzz3cN6OhMHC2aCLQ28W5pUjX
ZEYH84i+lXcbylRttEWy+xGcVPfQnVcMeH59cAa5jgUb84ANJ.+RDN3mhPjT
LWCA9OONqC+40AqdzY0ULpqDF0LqHTmyJrLmuL9TxJs1R1mNY4iooDKyB5Pv
.2tBEDvOL3DNzkCFB8lh5t6lIjiS8t06VmGKplcUmFqW6fQKFqT9r5oiFFrR
l+K1E5ncHC5N7vgf6COi0O7wvv8feQn5PbDDSL7iW1EvuexN8x5AzVEJWPPP
aPPPYPetbJUKzLDAFFCwLLFaX6KhFAXCXxwlyruTM4dz3B844Mmsbh.6L5PZ
QEfzT.VxKIDt9U8U8uIDBvByQLEFCt337raRvpt6UZRMuCS8xMwcVWlqGloL
Cw8YXIv+DD0XLq0sLRBIcwzhu83c2El7XtP.2VOaM3lm2tI8cahCRcyOOAK7
IBEWpwJNlInTgIkC5FxxEZFb62hTAHvvnGByEKtG31ksv6VX.95wTMXRfnfs
AzYuzLRCXX10EFZxhIKfQXstSAQSQ0I6ZbUMNMnMFiiBsb8zeeXZTReavErg
1sN2jHWMBXaAgBgxxZokVNGg4cb6sfQuyl5XQiIQCc4dyrdBJn7swqCKWGkS
+Flz85SPPaHfPVCdO0mmGFffxH3hZnpHrozy8aRh.VX5LihR1FFb3XR3iNmI
KLi0q.FbHp5lBlrQusB8h4fYu2t3jsAahND5rgGYfgSCi5+7olmpH4oEwo72
kUrgI4LZNmBZOQaBeHL4PT7tRu8atJX+9R29Mk9Di34uZmGD00E2JZm8V3ha
kD9PzoumUb2fDf4RANCzoxjKepvYTtkVxtiQEsUYMT4jTVShQS2L6X1O1zxc
5wkTXnb6b.fy9CDoc1evklqEyz4rId0GBWWxk.zrrObWztxInqxiWGdWvwMo
2zrCfpOul6lpOrl85oW49jn0w6LDQICb6sOUc+jW1XEjkYkrmuKXeCeJn0Ah
kpOrnM9.vhGObaPhogJOiUEeYZb7lpOpfS1DdWZ9i2GsaWMYXZ791eXVhPa+
w2FCObaWkc1SNbywc1mdCnSjdygfGpRgoAa1ja2Vs3+TvtnsAoPmlaym8jhG
ZyZ26OrJIdylJxI6SdngmrFzwWE9wn0ouuhmZySfWOZ+IUnqJZiWGce3gzp2
KM39CUuSwLBW5VGuM2F9lzvs62.bQ1K7MPq+M+nUvT7xfkRzgzCuO9iGx+nS
pbkEFOsbAKaeW1gXk62YHI0VvaP2dbFUoK+zF8O11DgbA2jsl2TaJ0HzLa9y
mbiVBE4Mm5WH2ky.EIU5q3rI4B42aognSoQ03TZs2C671KsxhyRd57JQ5RI4
cCWKgONsjbgQ9eNOpgmMsD38h1dbampJjlEILGTUtt5rjdAMFJs47V9rIcR8
13so2BFR25JW6f9hcdyxyToCVP3kQd7P3m1m38KtC68qfeS790GVErIHwDEU
QJQb2lhg6gQUKg.0o7K2oLLLaGznpUWMLBmIR9lUm8VXgIiyCjUhju5L3m9c
6xixB3Sy3Z4vCxHucqC+zTq9YYs1kOnVjOUbG0tJgR5pD.OVIvSALalz8VB8
IiRMOuYQyg3iIqN0Hm2AsWUhFh7KMZWwfG9ohvZ7vUdu3j01gigbp0ZtHLiU
eaTFdVnrrZzERynC4kuH2ldpvQh3b43bKdbjv3KsFEoOZTyUyF4LttEhXFoA
rqRBRqDQ9MOkbiqLifc8M1QqeSPZZRzsGSs9nJmsldMpx62DeavlZC+qoAc9
1mHtIJ2XIg6C2s1yrIb7be1lI7IL8XMleP0xkev02lFG3LqSISIqaWfPzELY
n4M3lMkTOZvoxgw0MNsrM2fKWLYvOuwac3FSV+bdtH6HcvWODQ.0tdG4hoex
WZa9mLKNOEkRvJu2wH9bERqEdTAwmPPBDFtK1GgD.E5wAxSqjRMbWXn.Dhhh
ndRLxmpQRN06cDkulH4dZHTPrBSQb3dbeIVyIdXrj3KTDAUB2E6y3HNEtMiK
8URAkvfaS7kDJAJVrTI74HBWm8xTEkyYdDr.JYIWwsEAnqP4lUIM1mCeQVIy
fWVxPDOpYxaoXLBorkAgPg2fJTTeAPuXgsPDDJW5wnbrOQhUZnrwZenlkvGx
wDjOmJkRf+vJeIWH3BHxejvWyApN6kQLgmDArOT3JP.9NrvG9PfP8TDD2mRo
ZV9swPIn.KeAPyLjDDrPjR9ZJCJRPHgAFfnDLl49TPLhnP8gIFYJHNPFYJ79
RLHOXMtD+oNOQhCbdDoD6.AA434KKcLiYWN+Ks5aQ1npn9BJpTyLPQqp9p7I
PyKUUQ8E73Jf1YNthBrw.Pf3fZcEMXF0mZZfqoAy3PSoRBJTk0fASKsYCJwq
nACuqnpxKSB5GTLSVU4EtMUIDnZJuv2yjThTUU40H5kPgPqp7Z1UdBjPgqn7
BeGTxDQM8WnLzfUgfWU+EJCfvqn6xA4mTvv0TcYPYUSqEtEz9vj3Qp0Nvdcx
2KEf20yUZInmIkVnIjpPbPyohRqoETR05pJsfPWV0eKHugVMsphBKV5CeLvi
UUXA2TZPmmT2kK2nZB1MUc4pA5RSAkuxJrlD.AhLv.ohVqwZBbaC1XUzZgaq
wlhtpVKbajfpIzpZsTfpQDstlVKTkLhFznJqzR4lqHBYUkVyFIxrzD0UUZga
y4XNHXqn3BzAbaloulpZtlc.mFTTqo9BECvsfbXbpuD7.Uey2eTPyXCNcsSi
7zp+1uc.CAMqaAl7EkLzTaWax8eWurKNat9y21KODcqY7Y+koK.xeUOVf13g
uMnxEDMty9mikVeKb68Aogdjdrx8vpgGs7Id15AGizK1JUbuWlhx2Fk1i0sj
CqelKuARx6sxxqhutJQpuJQ3Zqt.y5OvpfnPutViH3lWiHX6zax6dUhfmiUI
B9qqRjWhqRjEckgzwTVBTzmez5SbhmH2V7M15XPQY6RR6Z00kU.vBMmtmVZ6
YhH6ueW.1OH5tdKuvtsh.bTbk2Ch0qIi7hQfk5AdnRRK1pWtKe3cKfxJVmEP
v.UxTnrmxMrEVgZXShsfNxkQikms8cRK98WNyhs3RyhM2xz17t5hD.+ZSBvu
xIcf4RDPVrIxm557tNmSuIG637aZZWlWpXbSv4xMcyB1+nNKqd+9+z9j3UgP
DclMnrqoNfHtZ3GKAh1SdvEmb0+waLlJ6962NFSIka2NB7uNFyuNFyuNFyYa
LlmFBUTh+gswwouObco8Hr6iOPilvAPwrmhML6RcDSwu3FwYTxfjRUW89iVJ
w8UblYBYDblRaN17XbtOgQjHEGwvPmMlCcQWVCwSo7q5obTUA3uKd2+bp2G1
E+QOPk2a6wUu2K9Nuz2GcvaUvNuaC8h1B8TCAe3Em3kDt0bY4hpxLAw5aL5z
J6RjFNv3N+Piie4Urs8fMD5nWPUBIVIylY.6cQBWCvuiCOtkH0.25MfzlP5d
XwmNNXba22vyM6kkkib4xp810tvAhuZymsKUueQ+2z.3hYSe520.p7SSbcYQ
mh7RZyCzgxW4E.XejmpYSdZUEAQYY4IykNhdIHOG1FnCi08cKzMHgJzGUIgJ
k3vtrawDpcY8ah79fIRIXvvPObq8fuz3Kn+4RjOy5slsJRIQLlpek3HHJISH
+3.1iQcG.5lnCSgpKgUoqIzqD+Akhx+jta+CdEioSXzq1Nr3HUEEU7Km4JIJ
wHpLGbECPa7Ba4sykPCxJupiT4KJswtbjZDp1Md40lS84sowk0LKOTz36ty6
cRjm4r3a.sB3wMmM4hYPjVNtdsZY2jucIIyyoYEYFL1znj9KrlBQUsg.gohW
L6G5njfGBS.43id+ZqnJXqYTjlyH+9evKf5o4c6RLnOjxRLEZYc.Zxr+wn9e
lBHF4rgBCYlet9Re6P0P81PyJ0h9RXCOylJ8Ctx2NqAJIq.5j9Bb1iwjKM4o
4xCPEI6nsxrt+MGUqlyCrEYxjmkYR03Hws82KdNmJ0SyP5kICBZNmKUm2g3n
YcKq551JFOqTA041D9rSGXmTQkyJc3tohdNoiSktCzgZVoCky5GzYkNjNKOl
W5v4EAwrZtfc9Da.OmqHD738j9TGdYyqYK838zHHOtNJ9Gxlb5a99m1LKklF
8lI8au+tnMaJvKp2b1a.AwmG5zU1255ROpBNVQzLvrHCauxgLJ3J3BNulGr7
uCW..VblFkAJXlCNSVFpSwL.alEsyZ3SImCXUTjVgXsfrY4wqt697IrWhJOF
eCPmDuONoX0K3S0U9tiow2mDrNJOpkhCshmZudZIWX2UPvad9zQaBVyf8bkK
ilz1JZT+tiqBbsgLX0JnRqB6aDPvlIQJveMSyASelr4pvMgaq+4RkPHyZLTH
rRYuBJIC9sU+6qBnYRNll85DMUosWwwHQCU7AnlWYD7UqZB7xYDLVHIV0.EB
Y1430K.yPLy91ah1YV8MgEpFEPGGoP+hjiQa0Kj9XETnIzggPOTJqZJnJL.T
4nb2S.KGtaSAwo1Xg4Go8JaosHVBUDmUjGZDCKyTDAkAlTZUjHZqxEWbVp3N
Y..dI+u2Gty6GB1cv6GB2Fca7l0WU1c4LXz88vvZc0nq7LX+S0BSqbNEMK9T
ezLS3+weS5MYECZD9LbWKppNu1.IkXa6IShxz9QmChg4KJsvfj5PTHTDfpA2
V2fxuj1Ca8ru+zup+U0ZHHeAZ62qOcoM9sLeSW0TKUIaeaVwmYql+7O9eNBy
ENRJxZiQBNEaw7SLASbrKVl.iQ13czDAKSugqwPS2EL2vlHrrtOM1XYctIOE
qU25+pZOtH11p5w4X2ITUEX97SvHq9koEj6A77hKNx1MfvBpfY0rjLgVmeER
eQ6mu8yqShuOb2OlI7mWynrTPFsZDlRNBCtMDtYO9vonGDsSFPcVfSvntdpa
CpVZc3S04cAatEmNsJ8UQD9hXqO+pQYt3jEg6bbcKhuIbW3CAKjsvusL7LdQ
KhyiGRUz7fxuBO6wPlS5+tRqw9WUD92DDs6wAP4HyYSSd+nme0xQ9G9XD3LY
vdQaBruWP5l7piv+uNrIxbTj5Hc2XLbCqeq1wk8NxKRepqZNMOu+nkP99ckW
838W1J5pSzyc7r3r22GjlD8oUoIiva4xSzlCrnGWJU9ZpguHby9GhWW9PcXw
r46UfSME04hHb5mKwW.NY9CYvslqDbSdVOOvkEj7+iQqRWftgVDVwrOPSeUF
43OrJde3vBc7oYsRSM+z5f9d40f8iA2NFkt93N6EHyG9oza60fzZHsEn9Dhx
yPDt+X78lgeOhFYyYdpDa6nlQwYoIfc1Ly9BbzT+Oa6wDg+Bno5OG7P3cUWw
6S4.XG0nKP97YVHrNH4CuamYut+trLpMBax9LYTEYDb.ykRKo9iU3KTVLwyE
SAsJiNlg7miuf85rkLvYK24K0xr3ulu0+QnRqE84n3cN+H0mgzNmZCzEF2.2
AU1ml12ytX9xbs67zqKk0NlQya2DBgaXWPC+133OL2oh9utOZ2GFyxA.jLHU
QHNTAB7D5fSTG+tFy4iae5f9lyLqdZdTy9DZ4qbqSSGq51L6ttxumg4Ipez4
yPeIK6rodwd2mUywOXGm+e1bbN8ZHvzMlvw52PjZzjtH5Gdg+8SZVWJegHy4
+tcsDZPah7qjpEYfhaC9jnz4k0.bfppN3XYt8vzLuzUjU0TNl+.1MBmZ6Pq9
jzDBkSzU6y2XZhWp10y1XmcS7CsEZRCsWUrn7N+pK3SVpLqn5qa7pmoPllx0
X84Vp8Win9lmquI9tz5XewRkkcO29a2bLr7dHt+KUbrLeQF8juZcYOzKASjD
+wcihKtX+LK.W7u+4fwwDHhlaWIfFnsgXswIXHR0kiI9ljvvQxEYsBEoCGKL
AdsbLv2Cd12kFLJVPwPBgMY9BDv.YMIBMVyWN93OEtdT7frHpcbwXrQ487tT
7v+a3lMwebbMEDtcw0JUXU1vQPbvJg6xh8lqMPzzBxnjujYzroZ8ah2LR0xh
zxxgHi41U2Z4PJlUlX+wj8aFefexh0yNCyA+aYNpMt43NLpFC1cYSLLRnyLP
IJtfnVB9OIbUXzCtuBHZROsXvyOw6nx6Sj4kArCi1nFNnn0DLvwtNuiUY9FR
BrxzzK1x87p4dHb25CuF6U9oFr40uQqaOIjDij1onmIP57sflDuH5qoA66yN
JqTBi+tfzXuuyjElqlcZ7PZ3cG2rIsWSXbUoLCikYMOhhwLZR6XSamk56xAE
misSUlfJo18so.boHVlFHKymN5IKuOo5ZpjcDkTYCTkVXZSM3J8hzaRp4n49
039k7ilrv94wrrw.ZzznkkKEZdaE3jJe1mcNGe8XOWVUHQENMKCXsFYG9BXO
wxWeUBDhhOeubUy+yuKJI8yd+G2GOIte9RGkKxvcy9.fhhIA.EywLxS.nH4q
faQd88U.T7qfawIy9uBtEKM3VXNS6mbnt6zQZ+.P5N6gd3KhS21eY+OTaYJW
vTxKdrFZOhGsGk5RWN6uWniRUSnHdRT+OlYYhIAY.wrrNG3jWLGYplv3dr2l
OTwTB8nmDNZKj4wdwHbxhzp+FQW.AX5kQTtPgw9B.+L6ixvWwPyuhglu5wPS
kqGijr47Tj7qH44.PxSlXFoBlZ7X44DPEtdR7RmSYAUzGaD7Wx3ZZ3OuNX0i
MmVGTC.WJ5TbFcjtFg1rJbUZhVSHbERh0FDjKKlBdaIugL.h+vdnpSNtccRv
GezYvWUcpqfqZH8EcDmcKXoQiPnGh6yvRlTQPTyoJt4vMRfH9LlHaEWnTBrx
rrjXH6AVOm0lfgUp1a.VM5oHq5HUJgAQgoMghKWVZJaOQeclZOJhXO20U9JI
UpDfdBBDQlyccMt6D8QltTalkK2Uw6dHdyCgOZ.eQueNLI1c1Gco7b5P9MaT
y.agp1NR24zIELIzXiy41Eiu.5Ee8EZ6yQvXhxtndY5omQaSOeavGBMHYhBq
IvHbvEiK+xM0Z0vzzy417HKwX9hobuOIbe3t0dIgG1Gu6PnyrJQOPiZcEVEs
bZvQIGOXPhpe892GbHzaaA5o4P6JYzXwMzamssU3NCm8FUi72x+0ilIWJbVT
LxJQz01oANpxwa+UwIqsyLRyx9ostkhlqaz3paoC0srznaFWMgWrZhrX0Dcw
pI1hUS7EqlDKVMIWrZRsX0jd4rbWPmDKmWB7x4l.ub9IvKmiB7x4o.ubtJvK
muB7x4r.uHdKvLlKgTHmhpRziZZZiahvWJljJWpZR77INoDGpZJcNh9lScop
wyQU6l96rLlC2GtCdpaq0NT0Z9S4JdV4Q8bHb0NUyUU42FsdebztzCmFKrNa
FzXxrAAW5eMRghl6TK+7HWbutmdsNW5Uhqm.2nY0zkBgEKXc07iIbhuVRLmY
fRyVQfZ1zIbKDwioLhuPykBp.KUZL0bpAz4CoJrOCSDD3epMq4ayZHGiEB3t
ZjfA0CkPHrFeywJObwAaQTCiqpboaDf4lhHpbw2shOK4r44qaiZkZGNumjfQ
t3.AEKVXOyh3jq6gRzBDkyrDaGm5PKYY3ubv0jKt3ESgJiSgqRlEiehtGwVL
tZxIUlIolvtz2LcVDmtT0XrXNr9It3LEOEgjfcQoAOIi9WsT1fXkSgYME0jS
SRxzDACV9rYJ3TUOSlB0CGdVEwKVjEV58RoXVylrp5xlCjIotd9zQYOi5nDg
qdQGalKvNkYnZoYnkLHjutAJ8ulDh6hAzMI8agbpKRz7jctdT4WHcE1kmPs8
FoodqsmHqseHOeuP199fr9dfLasTVCTvs7+E.C7Z6u4boSCmPcmVElMezhND
P+df.98.OVQa9Pnq8CftVN74NsRQu9ssuSmqtKmKqL1.Hd2bCvfAt6w.Z2CB
vtGEXcOZf51IM05mghC6jLbf.y6v.j6ISasPLMHv21Yf2dzFDOAv1MaPzxgD
QqGPDilfpCb1Nam5VK7f.J6AAR18+PJsCvw9Um8lye1bav4DfW2EXWOZM5BP
s1YUY2.x5w.h0CB.q6.7pGGvU+7oc6HHU+bG6SyJ2tAF0N.D0iVEuBfS6rZt
i.22f.X5Q68UeQk6VKnAFEeeAQ5gpTNHPCyYU4N0Xciy5DnnmJc0x.BcyZr8
BQ7lJx5Ivd9EDQUBHmuHU4HbiMYjVYPZ1QOOsgbCSLMQdQQTU.W4looQ.tpt
AlxiCHkcCDkmJ4UAXI6trpM.R1EbFdpH65ffrqdQlOBpD.GO8pcCAPimJNqD
vEOq1SN2IcafT7jwvW1ExBZfVFngalX5M3BOUjVcPDdBUOlTxrD.A+BJZixf
+qCZYWFveGDX+NUbSAn95tRfql6OiLUMv504g7gbsKxYLRnxfvq6MJWF3ceF
iBtD355lg7LJdqAbtSw.FFbziE3t0nYtlADWm06cMQyCE.bGO32Nhbv0G.Jb
RRZwjm+sobJFOC.amhhpywRNT.pscvocD.S6ny9ki.Q6KZEoVlUgV.b1IPkq
.XYce5xtHDjNDfjcffH6U898GJ3wNXfis+fF6XWMGN.RrKm+24clLbBHXGsY
x4.95yWvRmAlq8HMStgpECB7VGMeUA5Gc1YzkAl0ALeNNAHqSBCW5Xf0kAr5
.XqNIjUkCTplIrgHUGcXhtBbpCDzTm4t3Gy5Tqp0gashkO8XcMoac.9oiVy5
bPN08kRmK.a5TQfkAvzdrHhb.zRmHJrL3j5dBTbAPRmHBrBvi1uT7zArlMQD
WMPE08tZbAHQmHZrDfg5L84DHgNQzWUv.0cQnK3hY2Xh4zx.jWiLvYf2o6pH
t.6gil.KCLm8L3AGAiyAADmilupB3ltqy3BHaNdhqNXZ5PO9NBflCB7LGMCU
BjLe4zCx4.f4zY603xL1E.ubzbUAvV19J4tKvrbBp+F.sRGzecDrEGDHUNYL
U5flzHWGp9THObB3IGu7n.fIegreAJCbjtuL.bFrHGKPQ1AHQNN.h7RfCY+D
r1sNWKX32a+6u8+mifcqw
-----------end_max5_patcher-----------

Ok, so I played with this some more.

After realizing that fffb~ sounds like butts, I figured I’d try something “a bit nicer”. The classic cascade~. I figured since the frequencies are fixed, I can probably set the gains (quickly) and not blow things up.

After playing around I got something kind of working, but it still sounds a bit shit.

I think the issue I’m running into has to do with the Q of each individual filter. I guess with something like iruser~ you create points where the filter just “connects the dots” between those frequency/dB pairs, and something like “Q” doesn’t exist in that paradigm(?), whereas manually trying to create a filter, I have to specify Qs.

The code below has the lowshelf and highshelf with a Q of 1.0 and everything else with 2.5 (which I believe is the default). This works in places (looks ok for the “dark” one) but in other places it creates insane spikes (the “middle” one).

Is there some kind of formula or tapered distribution that I should apply to the mel-band distribution to create something that sounds alright?

If I set all the Qs to 1.0, the whole filter gets thrown out of whack because the Qs overlap and it overly sucks out the middle, leaving the ends to hyped up. If I set them too narrow, I get spikes everywhere all the time.

Here’s the dark:
Screenshot 2020-06-11 at 3.03.19 pm

The middle:
Screenshot 2020-06-11 at 3.03.23 pm

The high:
Screenshot 2020-06-11 at 3.03.28 pm

Even as it stands, the cascade~ version sounds better than the fffb~ version, but it still sounds way too artificial, mainly because the Q overlap overhypes the highs/lows for each filter.


----------begin_max5_patcher----------
4232.3oc4c01ibaaD9ym+UrXQ9TwkE78W52RZZcApSaPSJBJBJNncWcmUrVo
ERZOamf3e6cHojVQsRZ4dmtyWZMbtSlRb37xyLb3PJke8UWsbc9GhKWt3Ot3
mVb0U+5qt5JaSlFtp9ee0xcQeXSZTo8wVlE+970+7xqc2pJ9CU1lqVrdQZSq
4GpRiqp939XGkWtNJ6tkWuX4xE+m5GYeT0l2ljc2MEwapbOkhtBc8BhBY+kd
EG9IYEpsKYG1kjAz0xG35FS1ZGdfk9RFe4wmzwB1GkXZ72d0qL+35YPJWfNu
bB+WRVU.hKVoL+h4D5KRbYCKtz4Sb+47jrQk0IENgzHOTgvJb7oskjADN5vB
Gd9DtM4GxphKFU9L1uZSYHlSLgYjRJAY9k.Os8jOfHSFVjYymH+KoKR.QdAY
biZfNoTs0vJmVJGxvhmOmzaSRAo4thn8u8SMT817rpxjewJOpUZsRiZ7c1td
aR49znOZtGZLMPZRo0teaZdz4tn4Y8vFFs8l7z7BGAQqzDLWnu1bEVJXR6UT
ye.2+Npt2t4Pw8wdcUA8TILcPwUJBybEkoQD+dtMeWD3oZ6DoNRBhi57DCPZ
DUSHVRqMWa4JDbIym1quyqaDMCiUV9.SkDKuQgK3b+tMZLAFm6Byai6g8.OE
P3y3lQBgvH2eXRlFzZXQWbly36vNMFyzjrcQEuqtYKQftgQD6PhEbpbEukDF
nxsQah6BG7fupqa.cFZ5oFnFCI1J7JFEaML8Tbo42cJyvQM+pq0oi+AUNr+g
rUuVDsKFj7ahyhVm5w7kwUNsRcDIvlZTa.uY+KlnMJBBmpQBB2vx.dDAMqIF
3kRZEfqcb5n+vX84cIK1D5inDXJQgqoqBivBsVvQDkD.IjU7yRWoOc0bHHJm
ADh2vsLBmH0Z.NPkLVXTU3SUE3X..VpFLaRGUAsACqAk.iYbSCgnbehJAobE
E7T4DZKYYZMCrybIvpZUXzk4SWABIVA5ANinEpZ5RfFIFmClliCjeo9zkiMy
RALpVJZUtZIRqAbIDshSCirDexxnb7JhDnD4HYgqrNxXkVpvgQWrOcAMKckP
xA7aqZfvAqFQq3XDmarGgPWTO5B5PHLFFA7cC+R.lUo.SmjgCDho8oJAj2Ub
rTQHGUCDDv9fZPvDfYKLzPO+LBnJAGVtrwIivjHLELXBJCwBil87w.tTrB7Q
4.INBEnTglB5VA3oIwg481yMCy3xUfmOkQjxVeBB7aP9AEfhozgYz38i1HIq
DJh.Kw0PAJnYvPXAjDtRGFzsmilIvHDyhR4fuJogvLPiKA8.L8HnNBic64oI
w.+AbFXpjHZsgiYDetVi0bFP6fnaOWMHPyJsRJ63Q.rJDW.ZTYR3HPOs9NZj
UPlCBLFH1QvK3QKfDCvF8BNvXCNHApE7RvqTfVjfgfDblimsS1X+A0wMPPYd
MErCMV39WFUO2Le4CHIwcwkkQPVE8yEtgivJyvQoP5UsxOBaZiAJBwQMssMI
zJu0pxo1HbT.K1Bgfaa.5BDzVKXkJsYJv0X9QWCBy5qQgtezQTaePHqURqCu
haaCt3XrEKAIPLkiAwPFAgpMY4zFwjBBfcfo51nyfimACpEBhtcl.vI0nmAD
DC2NsCkXZCoameSoEV3.AzUsSjxbsQITUyb1HolYydEFsi4GvXLvZeLMDjUU
AhhV2tZOHCtX6By5tHoKaomDPefj.KxXPnRFjupILNyBk3JaNnRwErhEJY9V
JZXfQVsMrKXTIP.1vCLBBJjKmOXjIkF0ZGvnQi6ACg7QvTVeXnIpm1GFBfAH
bnOLDxWGRRpGNDoYL.C6iDQJClxGHhzBvqvGHZdbLsGPDiERJ0GHhIThnOVD
a5LuGXzjvuR1CLhzPnGhOZz3PCKkk1GSBIBAJqmZLIDj8AiIwOqXR.C4gFcS
H3iFsS+f6gFMSzI7CMZmTk1OznYJbUOLoMaAduPilTSn9XRWdP8iMZS3pGlz
lbmtGnzlIIsOpzl1ZeToME49nRS538Qk1b+6iJMqyfzCUZWRipOpzt7IYeTo
cwZO4nRwCOPI5oGTFuMo5F2hbW7EPdK1+czt8K9B5ioPkLj1s9qKufVjYTpi
+ksQaZKk0.bKCaSWBBKWWW05eFL2JFlYQO.lc8gpp7roKE9TZ9ZYAB+Z04rl
eFdAvGQwOUkRluZoteQVdRY7eMoZTUPYxcYQolBDFpxfwrJCHV6kta.hQrrj
tioqxPW0JnWYJgZ78wEkI4YcH7UKi1uuSyW0oKFsyO6JDVc8wLMkj4ZB21TQ
78IM8m01ZTAH4UfXenvpkV9AQiYzPl7swEYGRZ8er1oZVxZQx.SZ495h1YMb
M29ntj67kQVDkvsyJLUm5sYJpYZ9l2EusS0y.6293rjr8EwkwYUQU07d6s2F
eazgTH5SmJLiMFpAteuxJ5eSiLXY+upHIJsU.tqHYadlgI7rDllaFteBxYvU
+otBi8Ixh1OPmAjAnVF4lkfPdnbcTgwPU6fPZtYUddp+sZ6WZ7sU02deRVVO
sXU99wuYQxcuch9tNGt4tons8Nk2bHyc2a.LQ0MkQ26qsqhRSqca8I+GhxR1
EUEWk3LAvj2M2zEj3skaJxSS8jW2ctef6rEv3aheex1p2ZGntfA3wS12.hV1
Zk2lbWbYkeaUQ2U52RY0GcJ8NMcXcsO7MUw61mBRg+C.dGIkUkuM+8k0OXCP
qqB33l810mtaLPu1mJV3oaM55t2YzMG0KX3namFhZV1O1UubMt+NHNZPw9AF
43k98n+lNcUyTB0galeUye3SSpWpml3bZDtqNPL6DERx4UHjgUHL03JD7LpP
7SgyWiXp3DjyLZR8RvXDW1P7SlzLbUh34QkLAFwjNePvjK0AxkdEk8fUNTwm
cGHalVynSTsRgEfRYjnJJ8yChwxHmOpZffAWtPz1eNtXiFVraKJx34c6xUKe
2t3L+o4rjJaa7GlacjiGVFhgmRngpAFwv2Ic0SWE0KZMPMFXFTA7YRELTzii
o0ZhHNRxJVoyb+g0Mk4GJ1z3ez3stvWPgDzpRxZyx+mNN23h58Y3r1lKkKLN
OAwElTVdx3BKwwAvEFy7SKWDjEQ7DxEMl6yqKXOkbgHPtf9TpKnhKwGAOHWT
2XyZ1WZVX11abKB8lnpphj0GpbN0cKBwEsXIXk6qiR6sBmgVK0qNxbyzAFLp
bSz117PNaNHSUmGWBHBzEWtw.J7ukV9gOcRceHQsreJfrKRXLOhNXwSTuAOP
3.FIFeNFId2ndiMRziH6G2HcVYhLGxDIjQhNGiDMfQxTH7G8HEBfP3YJyK15
JqI5YYfQmNv3G0.KDALx3YP01XelbfLG+vG8H0PjmbQhFhHwXywHge1FIxy0
HYIBIjHUj4XjNazW7bISmU6cx.4lxr2ldXFida1QuM53zM4X7M3n+laXSRxU
n2dSSeb+ANrMI+6sUo+luMN6fap+l8RvWSr9taSRSaOixcSupICkkt61teJA
ertOtlLaevMchwcGEc3JAQxpOaaDp4Hh4scK1tQNNVHr1MB0m2byUPSXuCPM
nKytqdWIjcJs99h784EsaOyJpt84OTkeWQz1j5Uch7RA75ZfTAb290We4NPg
lzzmt.uViwaNrIZJCPzlM.g8Oj3DPA4Nx9bj1ockt15dPwiSi20uqRkP3NVe
JDVobWATgz6j+2c+j.z8+Xeb1huOJqbw2GuKYcd51kicP90HFVpcm+eNSJci
.QWeXBEGe0A51KljiotyxolZOBmlCPAFI5ISkfPswXi7kJB7fJ2wBVRbnDEB
g6cx4aeCJtIIy3P19JAPLGSIgaLafdDo4.32+cV37NCs.kQ7GBDi56QnZ8CT
RDWobWcBC12iPz.ODl+HcW4nzKWGhuEVP2TNDc2mTS0m5gZa1hze5XF2ORF5
69pparcCcArU20dMfKbXVl9tgtM1cbOOGNZnq5RT+NwMgnctlLIxBMQ0u3Nd
cJMNp6qpR8KzgF7v4NAAPlRZfNb9GV3eG6gEb2dQ4h8i+ve4BfxpogxbjTvb
msZNEagxXLASBX1Hl.iQto20DAyZ03ZLn.mzM3u9wsE42Em8CVDwHdCXAs9c
hCKYBst9JjdBmArIGE27T1WiM6gTerWBM2AkqKxyjhC08tzz7l4QMfBKcze9
w3gk2v+ajVkspaIaBGlqmFkyZeYFO8pIfpuNNK99nQAoJpV5hYP00ggMMwoS
.RCkSt7fuCCqeTwpGXoA3KS3evvw9J55L7N8pGDH9I.q90cN3iCiXOc9WUq1
.UeE936yx7vVeS6gI6EDS85njrOEHWYdQUZhle5UyOqU99DvO5hVS2w2XIbq
W1S.OQdQwT+sxzjsMenDFlmFLog.i+0KT6ngwNiDO4BOOKuLm5q2Du8R0UhP
E5dO0bx1v54JR9vlphKLJxSGCYN71e5YB18rF54umuMt7gkxyiQjurYZmUA9
7gPNSPfYkaNra8zLyPQQNcRym.V66R1T8DEtcVYSygju5EW1Fe+l78weZ5xj
+38bNVr6luhKOMXgeHZ8kBBBL84ke9PN+.rZm0mMA5AVX2CMufYk4yuyrpiK
znLx2JFzX1im0oh9W6NyFK8Lpd+wn6iuMuX2LtfgGbVgHyGJnYQ31FU7tuLy
7hu7k1Eteg39PK76Ie1oBrjmiTMAVa7CY6NsztmKtuXTyPgxvg+8TZdpuvrW
jr4r9B+b8oZCgpOkWyAoHWRdl7Q2Qi0owPLa2dK9044ua4n63vj0uDcVf2wc
b4jKluRZEFG9+EPtjr2cgQjD.uiTsSGa9TmnXmIXT.8Yv0Ee9t0uRsAF06RG
lSQ4G2DB6iS6d04m6IfgbL+iq894LTo2v4omwv1un1kh24VS1OZNZOetSVJ0
jJw4SgdP2o1Yv4sQ6ZLgSUaDjlUeTOzZpRVekTMqKPXWzGDsuP2AGLR4uXG4
49BV1yrf5Lk2ErQLyl.2486JfzcYDJmn8msxDtCO2rk26t4vL1y4YFnyt+2b
JLN8pIB5HUlSk10Cd0y3D2OlPU9dGgYE69ZgEZQ25bl9l8R.3duJ95zCwMuF
CgeT5Z+x4dLFltajq4jAKxee1EygmM15Lxg+oOFc4LHhn4titgTRoDmuCAiw
z4mAecQb7CfCsZu1ZpgElj4lel6agHaYUQWL6oXHgvUsOABXNqpTX9JNN+73
+Ld6Eyex1TvvsqpAUOiwbye+63zz72OMKd5IsiqMeGtl3zanHb2ISRpvJadk
Pe3L9Sl.P98n.X29hWmm9.fHskPha9Hg5N1UcmRaVXv8GJ1OcYROIASFxkWi
4iwl1hgIJtfnB7nxHaOHkriewzMQOlUEeQ7l3j6mdm6FBSztPziLGp6gHcdX
N2RTLvhKPyeV.wfKWlAwA00yeHqO53.HWOqyjTFmss7k1LHGUxyuu2fG6WjD
ip++X.LARWeJ8k3YE6TEs+bwA6TKv2DUku3MlUgtb1F+xp3aOjlVc1MXo+oG
Uw4XW0oETI08tAH.uqo1vKy65hz9nh1T7Mk9n83rNqBU0CZSidfKUmnjJWNJ
zVu.JQS0pO+5Cyqx8Ko2Wf2aplyGCmknhwO+neSRQ0GW7muKe4Yp6Gxnpce1
xq0vPjg5s3Ino5B7MRX3hGh0ZjKwUvEgUua7BDhhqO5yWth08pyMxGmuW8au
5+VFc8OJ
-----------end_max5_patcher-----------

what you would need is some sort of LPC algorithm to guestimate your filters… I’m sure @a.harker has ideas about this as we discussed in another thread.

1 Like

Interesting.

Had a search on the forum but only came up with this (from what feels like forever ago, in terms of real-world time…)

The initial issue raised there, of not knowing the envelope of an incoming sound is solved by onset descriptors thing, but pointing fluid.bufmelbands~ at it. So I’ve got the frequencies/dBs, it’s now just a matter of turning that into some kind of useful filter (while avoiding HIRT stuff).

I’ve just skimmed the whole of this very long thread, and it seems like we’re almost back where we started :laughing: FWIW, I think the problem with using fffb~ is that these are resonant filters deliberately designed to put their character on a sound, but you want something more subtle. If you’re happy enough with envelope estimation via melbands, have you considered mc.cross? You could set this up with appropriate band centres and bandwidths for your mel bank, and then vary the gain of the outputs before mixing down again.

2 Likes

Hehe yeah. Covered loads of ground here!

Took a bit to get something working practically (much thanks to @jamesbradbury).

Hmm, I hadn’t messed with it. Will take a look.

Are there appropriate bandwidths that relate to the mel-bands?

There’s a maths-y part of the patch that converts the mel-bands @attributes into center frequencies, but I don’t know what this means in terms of bandwidths.


----------begin_max5_patcher----------
2764.3oc0bs0jaaaE94c+UvnIOD2rdMteouY2z3NSsS8T6Nd5joiGtRPJzlh
TghZu3Lw+1KtPRIJQwKRPxq2G3BAQPb9N2wAf5Ot7hQ2jduZ4nf+ZvuFbwE+
wkWbgsKSGWT74KFMO79wwgKs21n4pkKCmoFck66xU2ma6m.J6JcUdrJO+gEJ
2ycznf+WwWsHLe7uEkL6CYpw4tukCtFbU.hhr+SdMUeU2tZHIqlGkned1YGU
zYzD6bldyGeJaz5azMy16DZ57Ou7RykqNRng.5+NLzQHPKtfVTRbfbHvibNf
2ggMDGuA1N.QG1eXKQcm9ItCzxBFGFO9myT+9gAQLiXvlSGk0gzCrKBE9Cg2
rJOOMYuv3lvjYsKsf70PAQJu1LTf6BE9npmcV3bUtJ6CpjvahUaB8Slf71.8
cM8vkiRoAvPl0Zzcc+BxFPODfFcFvXTxgiQDiZr.gLlAcTwAfQ3Y.i5GsVWc
xxCCjPDzIHsfjSFLHEmdmN4ASCltW3MMNMLezUkMZUhpCdnknXtUVBgz18v1
.ZoMCVzA.V2vG0hnASLzGiaM0vfxq82Cyd7VV5bYb574pDGOt7NiRlnt2yxu
eL.tWoWTR6hLnTXXBkg8GdLQ3o2F7ywAyxRWsX+VfW0kUXgn1ERghGbVMROp
XtGTpteQVvO78SgA+kfueJ5IA+n9e3CzqCwZARKLDQf1ALdW.iPhSuuUGj0W
sv9YZOFHs.BBHhmD7z.30AOQyK3.v0GHWnPpSXN3yFryWDRdx4Bq9bT.rEKX
ahRWs9+cZQ6h3PwVYOgMXccwdvL1mQbhBhZ0mU+AZQzFIavAaDhStQ828rfV
zd6NhZg6YJfzmD5aPXhvfStF728ziCjEoMTDCRLbPJN845ZcUU4eRJzNlhSm
8CFGWOy3gR6tFd8SNv0bCnaVRA3vy1W.9llA.EvijAzijPrOqQwQIaW9HKAY
5uNSYY5prwkjeYN.AqIoIpk4QIg4Q5E4t9lrQLL2Uib99NUFWv5fBsOUkzyw
OSnNAkvGSknG7OgzWyTWrOShqG+Lg6Cl7B2C0GsOi2dCxOtoBzGPgpwimGMY
QpNhcgsEAZS8hfrIbigDW0D4WezrgdPZbOvt48gETW3mlMQks+7G74LaqtSS
SM3LL0vlmZ3QM0rykcDsu51f8oain13SDfaYja7IOPZvd4JFsOZCS317EYEY
THp9zQRaj9v1.dP9zGGp9vysyUInWr6i0gZURAs61xGp2UgpO8oN.g8NhzQO
U.z4R+aa+amNMv9LOz1bDAk.a4Vc64SgiH6mpQYtDeCWr3VU1xhGuknz48+w
TquawU1OFk39nMA6QYpaiJuehsmvLcl645z1WkYAxn6Yts6az7TcTfjUQEAB
zrC8TtL+g3sS1NIbtanOe0jnz2lGluZ4GdsJYkKAdMaXZ3p375rtalMMJNdb
Zri7tn5azqOoXIFibe6UEcWcu+pdooHIABEZF40XHliX1V5FT5F9aKFCrbPD
JQBPlakvPbB01RfvTroEXqggVOW.nzMC.o.PbszcA0y0lCKLYlaqnP1c3pn2
EYoKRyJUBzCUVc+qxSmkENIpnhx1H8NQric61oK82ZY6aTz4Qy0LznxwrolZ
kv3UqFG1l.XoJVK00TUM9JGAXRKeEx3HGeQ..PRMnZWBocbeHJwnBpp3UXIB
Z4UnJlMhKH357pQSSSxKIUscw+ZgJI3sgIKCdqZdzMowSVu3x9noTwE2ixRO
Ef0UWDUJIBNfJDtV6fksUWXTfiCxL+wcsbOoSh1REapFlk.BjKsjrjR3VxPP
PRtEPTVE6Mb7X8Cr1XwFYmkIQJwhwzxz2lxvZigvoPr8YijX8T5TAfZso5CR
q0Me64iKz7IGiF.EBWK8TiPEi0KFDuNLOuMCBiJ4zvR24vZppKi9bY+.uQPu
444evNLPaj03Xk1G8Z1kMhfV9pkoTmZlV6ji6o8ocrkWZwf74YQgwe6ZC16g
cpMBc.roVax7avFredQpyikTSXQm8MgCrbaCyFK2UVugFMxaZzu+c+bWVXan
i8OdXRV5LUx6rZP0pknIUq5pOlv71vQPDjxbdmLRVaDF4WeE094y7qdpEMqm
BY5TLs5XPNgIkEs.xNUSo.NyR0.FECcOBsDB0VnBnIiMWXHitoUBxKycqiPE
DFDBbItIQLhk0QkPsscqp3BuohaKpdz31TyOZmuuTkntMrKSh89zNvTqW6yE
K4NOlXYg+DSWTreTkqABQU9h615fL.ZUOueHqI8bRgazlZs+bh54fpqrJ8st
5K13T6smbL1I8BQkzDTzB5ax5mLYX7XindYXTxW5IUoU2p7esaK+SZKuKR6G
nMhaGEWXgug0WNIzD5QEQ8OWFGYJf8fW7aesW2xqxdcD2AlaKLWWThO4WuRM
YX1gMg0lPAama1mjsd8bYQ2ONOK9HnduRPlCj7WZunWCy8wiEMjeIchZYu8J
1yX5GFrNOgL+ktcgzgK.uRMqleyv8msaPyS.o8lnw4cyq9pq.+lL0RU9itrM
d63zEpg3w3vRCspXHRr4uSktv6Buo2FL8EHMo4zo+EuBJ8h4toyDnaXECGZV
Adk3SmYV0j2RmsEgBlyHbnaDDLzt7ORw1p3SH8el2wFKcFYuuO7V0zzr4ewu
oZBtl1rg74Y4FSBy9zSShl8a4O0V3g1.WyUlfTYVxq1CnpcCRXQoGJXGrCUO
uWqBuWrt50pnprQCrH1M47oyJA6EMkOZE+pLP4KskOdTngrYHsV2UPKauwMw
JsKc2VN9hzzO0Uw1VWN9cZ3uBu0Or7Mgx714mS8lJWTxmFlFx5xMy.FqmMas
oYTyNpYZVBPTEKGaGY8AtOMlqpc0CUns+zzYzE4ocmI5qOvcbd1C4VS65V2i
Zn2eiEFokg4EyjO4VS16MGsmu1IKEaRkn6Tn2t1H.Io3TDHkXAunEWziEHvp
R1fV49rzBve3Zd38LyqcgW2InZbgsDIalWXC5th5qHhWX15W.aeiM5+p7PXJ
RVONlwd16xgZ+rR3OYwQmZpnZy62sUKNe4ByoR6pFacFCoeLmSs5VG8SJt4q
2ceK51FmoOumeq60l5EwqTkuLR8d0+XHuXG0W6LR5cWPEDXV5cIClBOONIcT
3e6gvgSf.jj51feNGiQNaGDTmNm+IvWloTG.EZ4dU0TCxLYq3eh60ZOaI4gC
l7DD.i4p1GCnINKqjIgRp+ow+sZxfoOdUpnvp06.JhX3a56+phiSua3rPD0c
nV3Bnvl+Lfp0JoccdpnR.PbJ..5aQ.X29hWlFe.pHUUufpyqg5NeQaFRyKD3
hUYKhOrjG3UmqOBjps+sNoLtAnstkwX.A3RLBQALo0H.InLjvm3JSMVEca66
bWS5LUqzZMl.ad1C8Cw4VhhQsX.KKnSEhFWkFQ6GTVD+fWbVn0FARuFIYop5
WTnGOQPVyj8usWiGAU.GB3t8Zhv.xhicNG5Ucm7vEC3bl9pv7zfWYVE5HuM+
KyUSWEGm24Frr8IsTPoPWEwYXN18lRvzVWr1XpDnNcRaxjUo3apf.W3WlpCT
CFSHAW3xy.WoIiQRrTbLX5q956yUKeb89BbmoZNOL78ZBX3z10PhKXvZi6hM
HnWuz.87rnukY2OEkk+PveeVZW0VGJk.W1oZ6.RwVty..Lr9Y6tNiEyNLFq6
UmytCdFhc4hBQn8mPiK+yK++.6kHzJ.
-----------end_max5_patcher-----------

Oh wait.

I think I initially misunderstood.

You mean the equivalent of having a ton of daisy-chained cross~ objects breaking off at the individual frequencies that are needed, and then compensate the gain for each “fork” of that as required?