FFT analysis programmatically?
-
Hi,
Wondering if there is an efficient way to perform FFT analysis on incoming signals from two stereo inputs (4 channels if you wish)... Unfortunately, FFT objects causing HISE crashes when I try to read their buffer from Script FX.
What I have tried from (https://docs.hise.dev/scripting/scripting-api/fft/index.html) and under the given link to the forum, either did not worked properly or caused immediate crash (certain cases even in case of copy & paste some functions couldn't be found - as HISE said) of HISE.
I wanted to achieve to do two distinct FFT analysis on input signals (1+2 = mono, 3 + 4 = mono) and "slice" the output into double array by certain amount of frequency ranges. Maybe 12 - 20 - 36 bands... I wanted to make these "magnitudes" to dB scale to spot the highest part and of course, the frequency (or freq range or mid freq of the given range). So these data would be in an array I could inspect.
Does anyone knows a good way to achieve this? What would be the most efficient way to avoid excessive CPU consumption?
Many thanks in advance for any constructive advices!
-
@ThomAce This might be because the buffer isn't locked for secure read access. A display buffer might be able to do what you need.
Use ananalyse.fft
node, add an external display buffer, and reference the source that you can then get and read withgetReadBuffer
(see doc and forum for examples)You can adjust to taste the properties of the external buffer like windowing, buffer size, etc...
Then it is your job to split the buffer into chunks of frequency ranges respecting the logarithmic scale (so don't expect to just split in equal length since an FFT spits out bins in a linear freq fashion).You can convert the 0-1 gain to dB if you want to with
getDecibelForGainFactor
-
@ustk Thanks mate. This is where I got stuck recently. HISE crashes always sending me back to starting laten unfortunately.
From the forum and what you suggested, I came into an almost perfectly working "solution".
-
@ThomAce Can you put together a minimal snippet?
-
@ThomAce please do share, I am looking for a way to process fft in a script node and I can’t find anything
-
@ustk A minimal one? Yeah, maybe, but it is not fancy enough and full of stupid things.
Please double check everything, becuase this version did not fully check if anything goes wrong. And of course, it is not perfect, yet.
Btw, I'm making this for my upcoming Dynamic EQ for detecting clashing / overlapping frequencies to avoid masking issues.
If you wish to see a snippet of the VST:
And there is a HISE Snippet for the code I'm working on to make the FFT processing and visualization working the way I wanted... @jdurnil @ustk
HiseSnippet 3385.3oc6ZrrbabbbAIWYCX6X6DUoxwoPkxFPhFD.TR9AsrIAIgEiIoPQfPoDIFUC1c.vXtXGjcGPPXUpJma4SHGyg7AjefjJeA4PtjqoxWPt5S1cOy9D.jhDxJ1RkosH2o6d5tmt6o6dlca3IrX99BOiLYaMd.yHyqa1brqr2l8nbWic1BfaVudqsX8EF0FOf56yrMxjYwOCQmI6RFpe9eeZMpC00hECxv3PA2hsKuOWFCsw5eN2woN0l0h2OA02X8crDtaJbDCAUYQyxFCnVGS6x1mhjsfoQlqrsMWJ7ZJoRluQlkpIrG2rmXjql9C4971NLbPEil.izfqKbrQMFgZrYOticivkruAvzFwFfE0FfqZtG2lGAO1P7VJDj3YjzdjYgzp2hoTuJIUuxITuYnRYRnRKoUo21rokGefLFCpOul4NtRlWGJX1SpJZZMV3udUyME.EtxR8oGyp6AChlQgaUt7xD3WEWKWNvz6KImP8H1s6PtMQEATpKStE2efCcbsgc5v7ZB9FXh407mT+9UxCSNwbSR7F.a.lMESJT9rmSsyZNURqjP73iZtyucaf7OnxGVMI+1ai6+nc2d+Oq0c.j25l2b0aAybkUHnAf3OziQj8XDOtaWRaEuIbeB0mzl2E+y.guxMkK8ZojOSd.LG8PvKLf4I4L+BONGgjWCcWlaWYu7eTBUXYD69C6CgPttLGe.YkbOAWKoW1emydXAa4wf.QBEMVDQ6ufYISXl5zQhNnsc6xcYkzzBDVHkuAHp1YPDJAPoUFyQbWawHhDhTyg7EWM2SACCdKn.UyA1M2m5dGpmG2GX.x6oIr1zDlTRhSXdNzAjBiXDag66JItLlcD3dLOVwHU3tZnEJWpbB4kFJx7e0PX4BKZ.gzWIl1b2cbsYmRjBBGfYwvMMjNdre+Plq0XxPeL9AI0m1efCyCLLHqnt1JnnI2m+krR43tNfsizYnqkjKbiXcKQcfaE31mVL2iyk0iIG54RvwjUhBuKRtVnwG1QzTIpC.QgNfmjaBu4iroRJ3sd7SVKGBa.idL5hKOoGcVDVaJBCVqPPXBR6SOcmstO.38g8bQF58ncc4xg1r5AqxBgK2B8oAwzKSDc5.zpVsIkZDEOn7Qk3no4tcZ.3v0nhPzjnTtr4x1Q3A1HX3pqQ3jOF9a0xkgGu90KlKKv3rIT6G.S7HfzIs3EWakU1iBY27DCcsKndriiP3UXJJKVbMxJqD41Q9GZnC4dR0+A7i.dG3vrECgzHsDMkXtlBSP2xjJJd2OzzA7F9edGb48IjUq.okgwYaC64Nds.j1md8quF7XDgeLIjNN452lTEIDRCvHIPm.+MKOEAUSQ.PdHEJIFvVEzmnr+OUyK5PtvVXEwSYjOeaLNmKnYVQ5LrzQQwnEsBrUZYhzaHCSGDkl3RGSC696FjkBVkDUjLjYT1SApGuaOFr0Bi5QZw.aYOtOFoeQ1DbY1sT8RrcILc.Zpq9++34peuGPe9Ffm8fsDwVPDhKTlDJcYQcg+43PF3wFPgVR7EPz.UFU6PWtVQGGXDm5vg0HLCjI3NEtGT1S2+heIch3.dUHr3wxjpgk8lMJjW2i8tfZDzpfbjHjmZ0YjFqXvXcSSLZnPwJii5wbQdnB4GJkP0MnUJPVXanIJk3wrDd1wME9.8iA8STHtclhKSNSTGs1YvwZOCbbppyTWpyXecONAap2Lb0GrviK8K6oLH9zNLsMpOS1SXmK6DsNh3N.nLnU1TlCba6DsBdNjWqnZaMnUCzmCHohEkqIN.pDoEjiAv.dQHD.s.1NiULPE9gTGEpFaEfHT+ALKdmwZl56.GiyGR1olfZ59pSB.AmCFJwn2ff5.6GzzjpUHnKVHETeHRAj7InNxTydD0UhQP1Bc19RAKmosMAguSis1js.sKsMyoBDLDdhGHa7lh9CDtvfB40nwiqLkSO3LU3NZkSOYPfxd6H.qEInqo74S.CZaCC+NJc11xprsAMKkLcKljpPhTNGAoFeuOrbQx67NjBIJ6EBGSj8XUZqNSgOIaTI7TDlckqUGTCaV6gcgTVcKUpjBLXT7ENLvTxAqgBT1YWhNUI9iJVjbcR967kj26SH4gGmchvjpFlBDmicMxI9p47bPZ0lVZ4Uho3ZWaE0CpeobYPB+WxVo3ednKFGFsRg.wRCF52aRwnnApzg+SUvSuO.6voPdI6TY9kUA15.8fSg.+YhMWMntm2lKM5z2EPMHAvVdTUT3cvqfwSQ08.lnIG4Qg7i31vgZSMyVUl7Lm3ME4cWUJM0YOi15VOrqwVhF7SYNEh.rL4dHmKRvcz31G0PrCBbyhdvsOSkDjAA9QcjGtaDSIAgRNhtEpBaaWIdXE7zjQygd5YLGr6jYNsvC.FgIhASRO48RoSH5BoD3j3ul1TnboAldv8qroaBUAZCm2Nt4VUFPryzRXXQofZK2NURRv5nIAaq.ymf4hQnwbuAB+.wPI3DiYd2hgdiokvsItCcbPmi1TD3B5hbSeqfEJe5MJeqJU298qDXzhL3CBNhXDPUtXbu.ThhLovJpHAzD7OpoNUbDN0kI27ln6QQl92cKY6QGsKtnFb5xD7ekglopB+JxS9jz1BI0SaqKTUeUasdpl+z1ZjaQA7B28ER1ccCaOIcd836JHZAAUCv6rDm09C62FTi8.VS6pnJAT7XXP.BYRI0oiVTSfCyC3IbbvYNCz5E74LwBtJwtL38bftiCIzHyRouDUyy9RTSdGuV5zRIHT.GzjKu6.l6YcyuFA4xfm906rEDcf27Z.r3afCfsE6Dn+G88vl0bKl+wRw.iLKDk.zHyqIUXeifaoUkj0faaj4UM0IbMNM9lt+j0GGOX75pLfQ.9Oe058XvgESbi4+t06OzQxwlV.sYA3r.cc6qDaVSPS1k0QZzta3Mmm8Je8W+0eCNOL8dLT.PDT00oajP+uRZ8WE6Fn+pmqdl5+MlP+K+GlT++piWOyhIj0aHCtjcsrp6HnPVhts3faEE4aZlDTJKGXtRN3BH4.+o148llaLzlK1P2emWJi1pqtpZNbIqeRi127WRCsJBdqs1Z1VX0OpXoL6Zpt61nHtcry+Qj7gxtRd0c2ptLD7VaUipCanDitmv6X+ATKF.uCEN4ZtmXfmdyUlvHF4WLlaKa0uWsre5+5u8mdtXYq97vx9JOk8GOiQomiRL8qB5sL2SXOzgJS+lovWGW.BHSapWGD9Jeb84xwIeccem85ptnp3aa1fKs5MacbgYniP93mG5XvK46ML2F5EvRFqfKYV+9OmdidKlP9lZ4mKbW58UB+0MieoZoTBn9bpWEFVTLyBvRJ3k7k4OZFWeM3hdftX.5K3G8BCVlzFNv5wM4eIa5hxAGutFRQAqfWkz7T69JWXyUky2aoabrKz0qGG2XA1.8qdL7Ecg1.LJIXbYbLFvzj4ZqF7MvOAHqfiyDfrxDHqFYMAjUm.4p33ECPtZHxD8MrOSNByofcND7LjqP6N8UtmG04TXgCdMLdOyqXVtD7eFafYivs67fcBfeVAqgvY7fdBWtEBRSQ3hdi9vQJkg56cn9snbGbqSyg9PaN120sIPr5MvCgtY1WXCOYVmZAtjwMnXNn21DaTBh2wKDKJtOktFG5g9FjIgog0VXPmz8dfuP9EQ75UuVZH6dESU6JFmoj0nmOAsPBA8SLE9Vbvr4aAcqkVd+byfawoTJZtbBEs+NrSC6MbhsgSBw.ShAEcz7daXKhsMyVWxBa2pA0i1mIYg4iBavzvHwZ5MSslp7CpEUkK0hZNvn9vGvQiQwphL2w+PDqE0w3PLaCFuOWsqaLqLvQ8qn+XJhZNKUB3fO8AH0Yboo+w5M7.wvFEHl.vuEzo6Kn4.wwmYNvPjw4.uDVypuvZMCW1yzZFh76hJJIrl+rvtSTMTuq.CrUFzqpgPPPDr79jwoy42i0fK72iUywtV6oRUEKDUKcs7nVGCV2jhBUyscof2wNI8GHDpacH42Cl96ZnIdQI.6SxjCvWZfOKEr5PQN8mDls4dezCUFkSnxnGv6xgQ.UBV6jCU2RuV.jFfV9vcYTa+GVeiCacHQ8LYOlCDUQpr5GzdPexmyFS1frG8KDdkFQOwnOZT0ar5SOEe7u+vrFNvpSovg3bTKW6P7SF3tzEKv8o7opszO39T0dA33Io9Z5xFpiM4XHw1tm.Ne.Bpi+TnVQGJzaRHzzIt1S3JBaMKYDJjPoaWrPYrtOyEzFRID+EC4pqe.ygQ8SrU3WtNdyhTuI2jcIrEUtzeYgyze8KL0pKAyIPdw8XkK9R8wJmrpl4LqpsvyTOByasopmUso+7+7e+ee4u1zuYdpMsk2v9JaXXApOmCaAOP33nKNcFEjdmJu54VPBw+iEjdInfzp+XAoerfzKeEjV37JHs3TEj9g8Ai6Ss7DOxReSoXD9qpf.VLWUggrl6giIULNQeeFwQA8g7iOxxJMqlZhUm2It57NwaLuS7ly6Du07Nw2edm3G7zmHV9ZigRQe8lZCi8Zrs9hvxD0LADt9s.3iBSsA
-
@ThomAce Remember that masking is fundamentally a psychoacoustic phenomenon. If I understand what you want to do with your plugin, I'd suggest working from that perspective in terms of what you're looking for in time, amplitude and frequency. Hope that's helpful.
-
@clevername27 Yeah. I'm an indie music producer and this plugin does exactly what I wanted to acheive. (I know you know these, but some others might not, so leaving this hear for making some explanation for the tool: )
Masking can be intentional and unintentional. When you are doing it unintentionally, it can cause muddienss, muffled or cloudy song. These are the essential parts that every producer must learn when producing. Sometimes, we are masking intentionally. But, if your kick and bass "kicks in" together, the lower shelf will be roboust, muffled and muddy. Also, you will not be able to maintain clarity in that space and therefore the whole balance of the song was bad, low-shelf oriented and loudness could not be maintained. Here comes the VST I'm making into picture.It's earlier version (Space Maker) was based on Mix Space, but the PRO named version is something that I wanted to achieve more as I have seen some cool features in ProQ. Although, almost all these features I can build in Ableton via racks. Configuration and identification not always that easy and requires extra steps. When I have asked for making a mix and / or mastering for another artist and the time-frame is very tight, these plugins gives a huge helping hand.
Just imagine, that you don't have to do long hours of fine-tuning the dynamic EQs as you have visual feedbacks as well that helps you more easily spot the so-called "clashing frequencies" that would cause unintentional masking. So you can easily tune your dynamic EQ to those parts and you are done. Quick, smooth and easy way.
-
@ThomAce Cheers and best of luck on the plugin - seems like you're well-equipped.