Posts
-
RE: ChatGPT HISE Copilot?
Ah I have been unmasked.
So I have been working on this since the beginning of the year. I simply fed it a lot of information from the HISE docs and this forum, forgot I had it published. If anyone has a problem with it being there I can take it down fyi. Just send me a message.
I meant to share it here once its performance is optimized, so the fact that I haven't tells you all you need to know. I also figured theres a bunch of users here who probably have their own versions (come on guys, fess up) so it didn't seem worthwhile publishing in the forum.
My opinion is that it doesn't understand HISE scripting even until this day. It confuses HISE for Javascript constantly. Even after months of training it doesn't grasp simple concepts like the
inline function and ControlCallback.
(I don't know how many times I have tried to get the GPT to understand this but it constantly gaslights me on it).What I find it good for is mainly debugging or writing out redundant tasks. It seems to be okay with LAF as well but that is about the extent of its capabilities.
As @d-healey said, beginners should definitely stay away from asking it to produce code. It will very easily provide wrong answers and tell you why it is right, so it can lead you in the wrong direction.
However, if there is code from the forum or docs that you find, something about the ScriptingAPI you can't understand, the GPT is actually quite helpful at explaining it. This is where it performs most optimally, and it is also helpful for checking your code against (but always take its advice with a handful of salt).
In short it is good for speeding up workflow and checking for errors, but anything more than that is asking too much generally. Its also advisable to know something of the topic you are talking about in order to prompt it with the right type of inquiries.
In any case hope you all can make use of it and if there are any issues people see vis a vis intellectual property, reach out to me and we can talk about it
-
Free LED - Activity Indicator
Just wanted to share an LED Indicator I put together today. It comes curtesy of a script that I believe @clevername27 has posted before on a VU Meter (can't find the link) as well as @d-healey 's video on LED styled buttons
For this one I just mapped it to a gain node but it could easily be routed to something else.
Enjoy and let me know if you have feedback.
HiseSnippet 2181.3oc2Y01TajbDdEv5Xzcj5tTWpKebJW4CqHJXsB33HTjCYIAnJ.RkjNewkKJpgcGIMm22pcmErxU9eZ9P9Ij+AN8Ly9xrn0XLmOebYKaX2d5tmddlt6o6gAg9VjnH+PsJUGOOfnU4y0GM2iMq8LL0SqWGsJ55NDasmMO.GEAuToxxGwGpxpqnId9ue2yvNXOKRNIMsm6SsHmPcorbpCN3ePcbNDaSFScU3dqC5Y46012wOFLik0anEfsdEdJ4LLmskz0NFGMSqx556t81lX6I6LwbSycuzdhEYycZ7MasSS71e6jI6zvbqMs2YxVfQ9nt1Tle3HFlQhzprxy7smOZl+0dxI34zH5kND9GlZifYVR9PeGa9RjSUq8Lpi8fT7IRCPhA4n0xRz5qzOkZSynmiZegX.TtDp.XkkJZdKWv7LUMuFJlWIlTEESZEoI8k5irBoAr7Q31ymo2yiQBmfg8IUSQxq1R6uldaefCO1Ft3WQNLD9HSBCyFMpifeTaupUe5SQ6m8fNoaGTqy5cZqw85elx.b1FOiFgf+4hCBH1HlOhMifNEGApEwchPt91wNj5nKiYHJCY4G6Xi9w3HFBGgH3HpybthtjfBIAwgA9QR8.ZDg8li7AEFhlD6Ywn9dHCg9v72qiNsWmdHxUvJpNhvr1n1Zbam65EVE72f43JbHhg1G00aJ0irgUHA1NDLz+xejXwLfk6ZJ7NvyokG0UnePrT7ZJg012Mv2C9v3IpL8jZ6oJOeImr52GIhx3x1cxD9b8D4HbdDhkJXmtsa8hKF1ZbWPnFar6dH.P5PrvyQCAyMksQm1u+3i6c1QWbXq1i6ODX1D8WAA1YagDGReM.cQt9.jQ8lB1iSblvG+hQi6Nr6nditX7wvuOt+IcDyVCEYmMmaejHXCUHb5DOnaWNylaCbyMaPf1wgg.XfdNmun0pFRlhrhCOA1MbNIQwEoNr.UoYRrKQfBCkKkXZOAPPzQeeOo8Egl3GpX0qUkuG3.7bTLUXY4Z9libCE2gLAbPPrq8AWTGHxSnZJO7HvW5ukBkN9Wyyjw2gU8D3azFOgxHtx7bJdFynSmcWDoYhaA0ygaLYN84lAQnFCvDpKzZcDD7BoYpg9o0phfGGeKrSBQX1NECdfgXuoDCIs57EMDnuQC9TwkHjvhC8PRKHZCW5qKQ8.uuIam+RpUQjIyRWzzs3b2SkYiHFNjGv5Y+wy5E5D8WPFfVgXBwm0PqiRjCdK6EiMAFZlQol5Za.1i3fxy.Xz0wgFDQPWSYyP1y8vtvZW3fTDAfLOE1XiHrAPXNaneLCvCiT7vXZ1Zk6PhgEIDrFwcDNgu1elermcjQ1xiyjmenK1g9uH1hDpEfkhwJKBOb4sjgpoNfk4LIdodteZ8aLoR2RtB4wfPx.YFs+FpeLOU2zPrMkmMHZF11+ZQnCmqofpQDAqRomxAliR39PnTAiWl52wQ3VNAyvFYTlAQF7kz10pivur44nmhZxeaS4aRUVxy6VkW5.kcvUYSgJabN3xHz75.sM2YaNQSIwMUHxBiImmBoS2XBX3INFFu7lZoQIJQRKggcqmOvtmW.Y644QxQtO.HScKVt+WDwLO+CAsJpsFar0B3+cELLaVBZjPLgEInuY5GEAj1DtypvuzA9+OKuns9YgIKnNyaCTrCwW+wDTpiZJioeC+GUYb.PTESariykfOcdBFH+RVjOOz8DxDdAP4ElHJlQtCKxZXXVaODpfLC4X8sKjnNwTYBH3WkcPd5jppzLFFlvfXFRz.cBxPQC+875HRWK7G0hKx4dOw3uAQbfjzkw756qTdUB2het3TOTYpGV1TOTcpG9dl5gkO0od1sBBblKOc7FmklU.mf0EpSprCTKvS87Ue8EpYr1dKp0g2AsNLWqCKUqB0V3HPnbd9IfPE1HtaqnqhQDlnAAlnDcvMleNsvQ1PTjYs8xJbv26LeFoO3PW8mptZUXS6lCMYRoiwqYOz2wAzYYCKmsaQPCuX2KIPhOQIlYLBMeUriN82cGcpMbZIagPgQeuddTV+.h26pMTsj9Nf299dcvLLuMvDZ.eAjPFkaBU5PtBZBW1T3p5cHQuh4GH3MoYEsJ+NlXz0RaYjWgiFEZL72qqtco8Z0d6mq9wLBOXMmxKNPohUf7id6+V6s7AxIyo1XcIUsE6eE5bV1EWw1oEoaxZuqPOrbWSuHJat5kR7QqG66pI9k5CnLqYkaiKUhMB6a+RXiI2LwZ5xxvxMvUzO7e9I3ZHdb18HQcCbHGkN8etddGt2x0Ioo0g3fK.S+.0lMS0EqjKbpm2Ufi+.H+T3MA4kuyqRyaeUtxc1SPTK9CZu0+ft.lenajhs9G1F4WnCoM+UxDkcPNE54KjB4n0OK1cDjg0h.lGztfC+jnJKwOyP9cC92biXDzJr3i2BOICZx+tRxfloCpBCesDF9L8e.eEQbAVBD3OJ9F5qyEcDAZRgiOleLtw3f67MF22hAlvXnu2H9kDZpp4QDW5X3.unBTugDMKUhlEyKwh8JpZIoBbwghCAnPguGePJwlpDA2lBJC9tflNkpbr6+4655gAmhQDXka2OxB.FNNqhpChgpMEQLlpBlStoJ4iwg1vdn0skqbk6Vtx2y8l+nGb2a9uAJ6nvYpqlZixyT6BG14.U5kkIeBN1gkRsXn2o9d9Ay78nE1nGRfLFSmRJ3+T5BpEiAsPlS4qNXHwgfiTBG+yGbB0ifCAbhbOwByO3+LGkte8mzklKhmu.8a2xEW9+qKW7tG8Ao.eXuK905Pp3lHwVI5Wm8xOE0.7oXNbwVg9WXI6ylGz+XAEXc6I96.uJz+.7MxTSz6sJX5BGYbgkUQUsffMuuBt48UvstuBt88Uvu49J3N2WA+12uf7SzaEy7StLAnxlAcEWbQkJxhZDgIZ+OvkIPQf
// ========== LED ANIMATION ========== // This is mapped to the Master Gain module, but it could just as easily // be repurposed to map any other function (modulation, MIDI event, etc.) //Timer const var t = Engine.createTimerObject(); const var PnlAnimation = Content.getComponent("PnlAnimation"); const var GainMaster = Synth.getEffect("MasterGain"); const DECAY_RATE = 0.9; // Decay Rate const SMOOTHING_FACTOR = 1 - 0.75; // Fixed smoothing value const HYSTERESIS_THRESHOLD = 0.0; // Fixed hysteresis value const SPEED = 15.0; // Current Values reg curLevelL = 0.0; reg curLevelR = 0.0; reg smoothedLevelL = 0.0; reg smoothedLevelR = 0.0; // Last GUI values for hysteresis var lastGuiValueL = 0.0; var lastGuiValueR = 0.0; // Define two colors for interpolation const lowColor = PnlAnimation.get("itemColour"); const highColor = PnlAnimation.get("itemColour2"); inline function interpolateColor(low, high, factor) { local factor = Math.range(factor, 0.0, 1.0); return Colours.mix(low, high, factor); } // Cubic interpolation function inline function cubicInterpolation(start, end, factor) { local factor = Math.range(factor, 0.0, 1.0); return start + (end - start) * (factor * factor * (3 - 2 * factor)); } // Panel Animation (Ellipse with dynamic color interpolation) PnlAnimation.setPaintRoutine(function(g) { var a = this.getLocalBounds(0); var normalizedGain = Math.range(smoothedLevelR, 0.0, 1.0); var currentColor = interpolateColor(lowColor, highColor, normalizedGain); // LED Effect: Outer gradient shadow for LED glow effect g.setGradientFill([Colours.withAlpha(Colours.white, 0.5), a[2] / 2, a[3] / 2, Colours.withAlpha(Colours.black, 0.2), a[0] + a[2] * 0.375, a[1] + a[3] * 0.375, true]); g.fillEllipse([a[0] + a[2] * 0.05, a[1] + a[3] * 0.05, a[2] * 0.9, a[3] * 0.9]); // Inner LED glow g.setGradientFill([Colours.withAlpha(currentColor, 1.0), a[2] / 2, a[1], Colours.withAlpha(currentColor, 0.4), a[2] / 2, a[3]]); g.fillEllipse([a[0] + a[2] * 0.125, a[1] + a[3] * 0.125, a[2] * 0.75, a[3] * 0.75]); // Center highlight g.setGradientFill([Colours.withAlpha(Colours.white, 0.4), a[2] / 2, a[1], Colours.withAlpha(Colours.white, 0.1), a[2] / 2, a[3]]); g.drawEllipse([a[0] + a[2] * 0.125, a[1] + a[3] * 0.125, a[2] * 0.75, a[3] * 0.75], 2.0); }); t.setTimerCallback(function() { var GainLeft = GainMaster.getCurrentLevel(1); var GainRight = GainMaster.getCurrentLevel(0); var peakLevelL = GainLeft; var peakLevelR = GainRight; if (peakLevelL > curLevelL) { curLevelL = peakLevelL; } else { curLevelL *= DECAY_RATE; } if (peakLevelR > curLevelR) { curLevelR = peakLevelR; } else { curLevelR *= DECAY_RATE; } // Apply cubic interpolation smoothing smoothedLevelL = cubicInterpolation(smoothedLevelL, curLevelL, SMOOTHING_FACTOR); smoothedLevelR = cubicInterpolation(smoothedLevelR, curLevelR, SMOOTHING_FACTOR); PnlAnimation.repaint(); }); // Set the timer t.startTimer(SPEED);
-
RE: ScriptNode Feedback After a Month of Heavy Use
@aaronventure Not to derail your current conversation but but you make some excellent points so kudos to you for putting it altogether in a single post. Coming from more of a MAX MSP background I am definitely seeing Scriptnode as a robust DSP alternative, and I think it is part of what is drawing so many users to HISE.
I have been messing around in Scriptnode for over a year now and I have noticed most of the issues you brought attention to. I think the docs could use a healthy touchup. I personally feel a few tutorial videos on making Scriptnode networks would put an end to half of the forum posts we see on the topic. My personal feeling is we need a D. Healey but for Scriptnode. to come out of the woodworks.
There are a lot of functions that are hidden in Scriptnode already that users aren't familiar with that greatly increase workflow (wrapping DSP networks, the importance of different container types, show/hide cables, copy range to source, loading DSP Graphs, etc.). It took me a while to figure out these things were there.
I actually agree with Christoph about modularization, as it reminds me more of how MAX MSP operates. It really isn't the cleanest, but encapsulating certain aspects of DSP and recycling them across networks is a more ideal solution. If there were a simpler/clearer way to share these across projects without having to drag network files across projects, that would be great.
One feature I personally have been eagerly waiting for is a buffer inside Scriptnode which opens up a can of DSP worms. I know there is the Recorder Demo Snex project, which is perfect, except that it still doesn't compile
Other issues I noticed is embedding RNBO .dll in Scriptnode requires you to resave the network each time before compiling .
The IDs are the number one issue so glad to see that is being addressed. I have had other issues that I can't recall that I will post here after I give it more thought.
Also, sorry to derail the conversation further, but how do you add comments/labels inside Scriptnode? I never figured this out but I have a few projects I intend to share soon to help users cut their teeth with Scriptnode, so I want to be able to explain the signal chain.
-
RE: Best Practice for Creating a Draggable Filter Linked to Scriptnode
@Noahdeetz Okay here is my hacky solution to creating a draggable filter
HiseSnippet 2683.3oc2ZzzaabbcojWmH53TaizlzdZfPQAoirLIk+rJFlRhhVBVRlzT0N5TvpcGRNvK2Y8tCkDcgA5Qeq8VO1dqmKP+Aji8PKPAxef9Sn+CTeuY1OlkZEEsbZbb2CFZdy66ul2LzsB31zvPdfQgh6NxmZT3SL6LxSzes9VLOiMaXT3plMBr50yZeWZSlqfFXr5HeqvPpiQgBy9HDsBycAC42+4gqZ4Z4YSSAYX7LNyltEa.SjBsU8GybcaZ4P2kMPC6aUeSat2ZbW9PPkl0rhguk8Kr5Q2wBQaFSiMrB6aT35lcumSUaq6eKGZkaSocqbGq6T8d62sxsueMmkpYW6N2892s18pV0nvEW2gI3AcDVBZHvzU4Ni5zmenmR.OiEx.aCWT0nCHYEXi05ybcZE6eBMLJX1J0aMqxa8YlaybXIvS8ZWQtAIkBcmVgYljJU8sPkJnoRWPoRW0ric.yWjtCpOWxbSOH100BhM5phBWiYtwmZdya9f79HIgehJ9GRxEuhmF8Oakmt4Jqt05cNE5f.dnfbfUPD+qRd.QlCtXOpX8tco1hRyGs07kWtHHH0JRCVnuq0HcNHTaEsCxp03fg6IPlsFefO2CV.7aLDQFqXSWwSogBUJHPdkitWklxuTDVwVvNfpgRylwnTbbFuXHEDGSPGnve9ExHAk8PZY4Qc0riVdtnaO0gjuUjEsTavGYml9sTE0mTXO1iuenlrdr29MCnu7zkRLBo7Ohr1Sjl1wQKxldLAyxEHycHMjzkGP5phf9VAPgMlTULf1iXOTv61EE1PpmsL7UUp13lurokMTzHAtnxTHOkJBXzCn.kAAff0EghYDKOGRaR2.9.hnebNbQzBTH7LjBfmQNQzNVQ.bc+gBZopfEfn9xIhUsxINVo6Hf6VrHyyk4QIcG5AYKbOB2K1OFgRI6X20BJ0tbweaw4hEPnt.hAl3YhoX4huFD8YE1PlEIz0rbc2GZoV5DpCZC4qzseGz31Sol1dRpY6L53o0mo0J6r9VjMVYmFas4NO5TaRQtA9EgcU0phYKjPEoEzIW7T9PA3OJE6OJ0CsXB7gIEGxbD8gbBQeVHZQOGWWBzwXD5SY85KzvXCIfXTj+SuEgRA2UbcKoUzh1ItInsfmvdnKbNAwmGxjAEL4FSkU4uIRylEX6R+ZPbk11B5d5x6UROE+ljZUJC+axlXoU4xjqqLj7D4doBk2UISoPH6aAme.YGPkkL7lnDiZwCUVGqKoTTYyWIqXKSTtN7CQCUzXLtAoxhKgJWI.wnU3xZKq7RulPcComjAUV71juTmMR4.r49Kd+nUJ1n3xX9p8.NDEitdrjQFWFjZwWG07Za9PPxwIjDAmzGZo.9.G7bQlWOYGl97CnAvhbxjjLHIgNIUB5Z4IjEPnBM.QBicRvKdzxZf2KA7H.bw4.kZcuvgATYDQhBgEBQQHMySBSlJQ1mOzywB5OFpXlDZ0mGk0Nlhpm+pg8FwovmD8zj4j3sRKk9Bn9iTsrJ5kF1lpSG0OdEBEXFI3x6QQeukbOhMrY.l+IkUB6GSICn9XUbb81qUZiLSJGssx4Sa0OKmHORB3m.00.XmHM8v9TOhGWjlmLkp739VLoq76tSMg1j7NYWgAVGUpxBQ+MyqjVFyBQnVdbh2axDqxRhnduxwYKQsZ1h2CRPE8GvrICr78wxozytSvDyG8nGtl5D8G.MxfBVof74GJ6iEqdPwtlROlzvibfCmhaZk1EaTZeNrJB6aPrDjALGeNDMxnGQcdTcKJE4BtYlxkxQcszZTkqGp5Bp1M53GYpsS8xXvWxkuBa2o2EE+PbkMBWBaDl18D6nIo55jZZgrSzHUiGHweodqSjGJlbCknGiWoN2bmA.LujflFY4haMIts0PKd7DDOY28R4wL4zAYPQmGSeUVb29cgSpI9AxhsPsdox4G2mh4mx99XdyPQHyAZk.HBywhSeJwMmi.ZDcTwpXG4vRS2v7kWVaLrc3B5S7JIOunHbN13a0sat6EM2jKMH2swKeGLIBK4Mbv9z.8w8PDgKal8FrWb5tAqsxv0Pj6gWN3I9zn0M4tN3MSw+9j220HxyA27clHMDPUHu26mFcu2NtPPIvfALonYbRjgT+w2Y3u8W+KKeSu+Tciof9OxTldkR7+7efeyU232rYCKgEdA7HMBzRensOCcFEZPOfYSUWGeNyFzvWH39FELSB1FE9DQz6GnDZSWtELoYucYfSCE8kMaJVwyxczqfbAiizeOkQoK1qdj3Ux5mXtxPGFWRWHXC62K9kTl6hKszRGijjdr.B8Mu4MiAsFBtQiFRvB5QhTjiU.ooWXKSrIx7IgmMcl+WSlOV1UmeAb2M8bnGAvqIWAAWW9gOmG7hPeKaJ.uqEzMp3qMjSfBdnB+gBFFpQxvU+cCYLOwqcoyvqcMywOKbBttIHyrNoiO93emQZxWruNifx3qiE2XdUfOZ9uGmq+Kt5Oi26FUOC2mtOpnxGc43mABaIIcNWwLaGlymqwB0g3oYgj8eg4ZtL3uVfrgbPpeEItY23lugwwUP1Olm5iNYVYrNYbxBlIWkej9KIlZQ+YQcLSFeErjaPaLf6PGCh9SYdq5vo0IKey2UOTP86vdEU+0NCG1sKCvxzjrwq.5cf6EzJZRBDuBHZ9+w5NztVCcUmQkPe8eeccCbtyrMjl04jm0MqYaCck1fTOxjVR98cO7jZXrkjqFBvMN4CLdEys4N38Cy9dm3KAGsAxa8GYDe5QOPliz47awifVYhOB5zphW0rESX2OecblbzQ7Tl+GniQOc7kMUusYpBdAyle848chmr3KLil7mSI+qY1h6NxuO2iYG8v9nRLmYb6gS+Y9MLRKZT.qiGo1NZw2hGQtsr7Jlhund6gVti4cWk4ycsBdW87mwSjegoL83mk1If7tjGegoKHcFC5L04zXj4CG88maFEzIny9CG89SMa+iKk0TorEMSF1S8q7jL+UFcbU3bJZP1Su915sfq4vnGFMmZD3qTuvreOU5Ynd9zdv8cCjmRtyvAcfi3so364.ikDhCULCdNuZcEbMpDcndNxEvHSGGsYUbcgnMqFuotO4yUVxkLet0AT4ufjzo7Skq6xCFPdD0iFfQ1I0c6eMs+Hl9S8Oh4SrEfJrafkWnOOjVUmycnCX6By.DlA5XTTKWJx.sAULzKKqUfxfE5JZBtBM7935w.qoCDFbLCyf0Y3z1LsIM92ObcO7mHrCErbmmDZCNFzOqWSzZHLrp7YYppSXJ3Z5f2vJvAhg1YNTX1otpROyL6jIZ3myoEW78vuw62Oi27dbBrL+LzyEqicXC7coq6c.0EtarTGuFbYX4blwPyVGtM2iqFHQOpK+M950ilIYJWCZEg.tTRJjOq9SotTqPsZyeY8sXdTqfrim7V4Kd6+I4yMd8ElJ0kfMOHe3N47r+e8jySe0GzO7G2QwO2D5KWiHCkj2OwxeHFH3GBYLvxNf+M1pWPDK5+XIDvt8j++TZNysw0DsmNL1YBWAm8M11YY0IHr14kvkNuDdqyKg297R3cNuDd2yKg26rIDOQekgB9.UsALlSq0UuWWA0DNxxDi+KcEp4GB
This example uses HISE's stock filter, so it will have to be readjusted for controlling a Scriptnode filter. The code should support this ( I have done this in other projects). I have also added modulation to it in the past and it should, in most cases, display correctly.
I wrote this about a year ago so there is definitely some things I would do differently (the Q calculation is just an estimate based on the HISE stock filters, so will have to be readjusted depending on the filter algorithm you use), but this is a start on a potential solution.
I think it would probably be best to script a draggable filter using just the scriptPanel, or possibly incorporating an external C++ module from JUCE. That would certainly improve accuracy as well as allows for different slopes.
Either way I haven't had it crash on me and it performs well enough imo, here is the code:
//===================== Draggable Filters ===================== //===================== VARIABLES ===================== const var Filter1 = Synth.getEffect("Filter1"); //Filter Display const var FtFilterDisplay1 = Content.getComponent("FtFilterDisplay1"); const ftRestColour = 0x80FFFFFF; const ftActiveColour = 0xFFFFFFFF; FtFilterDisplay1.set("itemColour", ftRestColour); // Panel const var PnlDragFilter1 = Content.getComponent("PnlDragFilter1"); const panelColour = 0x30000000; //Knobs const var KnbFreq1 = Content.getComponent("KnbFreq1"); const var KnbQ1 = Content.getComponent("KnbQ1"); // Initial values for filter parameters reg cutoffFrequency1 = 1000; reg qFactor1 = 1.0; // Retrieve current values for cutoff and Q from the Filter var cutoffValue = Filter1.getAttribute(1); var qValue = Filter1.getAttribute(2); //Knob Control inline function onKnbFreq1Control(component, value) { Filter1.setAttribute(Filter1.Frequency, value); }; Content.getComponent("KnbFreq1").setControlCallback(onKnbFreq1Control); inline function onKnbQ1Control(component, value) { Filter1.setAttribute(Filter1.Q, value); }; Content.getComponent("KnbQ1").setControlCallback(onKnbQ1Control); //===================== PANEL HANDLING ===================== // ----- PANEL 1 ----- PnlDragFilter1.setPaintRoutine(function(g) { var width = this.getWidth(); var height = this.getHeight(); g.fillAll(panelColour); // Calculate position for the cutoff var circleX = (Math.log(cutoffValue / 20) / Math.log(1000)) * width; // Calculate Y position of the circle based on Q value var yPos; if (qValue <= 1.0) { yPos = ((qValue - 0.3) / (1.0 - 0.3)) / 2; } else { yPos = 0.5 + ((qValue - 1.0) / (9.9 - 1.0)) / 2; } var circleY = height * (1.0 - yPos); }); // Mouse Callback to handle dragging and hovering PnlDragFilter1.setMouseCallback(function(event) { var mouseX = event.x; var mouseY = event.y; // Ensure the mouse is within the panel boundaries var panel1Width = PnlDragFilter1.getWidth(); var panel1Height = PnlDragFilter1.getHeight(); if (event.hover == 1) { FtFilterDisplay1.set("itemColour", ftActiveColour); // Change to active color on hover PnlDragFilter1.repaint(); } else if (event.hover == 0) { FtFilterDisplay1.set("itemColour", ftRestColour); // Revert to rest color when not hovering PnlDragFilter1.repaint(); } if (event.drag) { FtFilterDisplay1.set("itemColour", ftActiveColour); mouseX = Math.max(0, Math.min(panel1Width, mouseX)); mouseY = Math.max(0, Math.min(panel1Height, mouseY)); // Logarithmic mapping for cutoff var newCutoff = 20 * Math.pow(1000, mouseX / panel1Width); // Compute Q value based on y position with 1.0 at midpoint var yPos = 1.0 - (mouseY / panel1Height); yPos = Math.max(0, Math.min(1, yPos)); var newQ; if (yPos < 0.5) { newQ = 0.3 + (1.0 - 0.3) * (yPos * 2); } else { newQ = 1.0 + (9.9 - 1.0) * ((yPos - 0.5) * 2); } Filter1.setAttribute(1, newCutoff); Filter1.setAttribute(2, newQ); KnbFreq1.setValue(newCutoff); KnbQ1.setValue(newQ); PnlDragFilter1.repaint(); } }); // This prevents the panel from being dragged outside its parent panel PnlDragFilter1.setDraggingBounds(Content.getComponent("PnlDragFilter1"));
-
RE: DSP fine tuning, that metallic diffuser sound
@Christoph-Hart do you think we could get a DSP category on the forum? It is a good talking point, one which we could see more discussion of. :)
-
RE: Change default scrollbar box padding?
@griffinboy @Gab I think you can now use CSS styling on the preset browser. I haven't tried yet but it should allow you to do this.
https://docs.hise.dev/ui-components/floating-tiles/plugin/presetbrowser.html#css-styling
-
RE: VST Graphics Design
This was quite funny, but just to clarify. Christoph is the creator of HISE, and no one does more for this community than he does, which is why we all find this so hilarious.
@AudioUi your initial post had a ring of spam, which is why Christoph suggested he might delete the post and your account. However, your content is in the right spot and some users here may find it useful.
-
Hise Snippet Browser: Date Uploaded
Would it be possible to add the date the snippet was uploaded to the git repo displayed in the new Snippet Browser (next to Name and Author)?
Small feature request but it would keep me from having to open GithubDesktop to find which ones are new. Or if it would be possible to arrange the snippets based on the upload date, that would be just as good.
-
RE: Free LED - Activity Indicator
@d-healey Ah it took me a minute to follow what you meant here, but yes it would be better in this scenario to do the LAF on the peak meter floating tile. I designed this with the idea of having any input (modulator, midi event, etc.) triggering the LED so I think the timer offers more flexibility.
@clevername27 Here is another version where it's mapped to an LFO. I included a few knobs to control the parameters (
Speed, Hysteresis, Decay, Smooth
) so it should be a bit more user friendly. You should be able to combine this with the first version in order to continue controlling the gain.HiseSnippet 3114.3oc6arsaabbcok1Fa5bwIMAon.EXfQefxgklWjrrpganL0ESDIKUREmj5ZDLb2gja7xc1tWrLSQ.xeP+EJPeueC8CHOj25qs+A8k9b64LydYFwkTzJNNNEkvll6LmyYN2lykYVeb.2hEFxCLJU9jo9LiRutY+odQi6Ll53YzcGiR+DyCX1MMt2TeZXHy1nToU1GmqzUV0P74e8g2i5R8rX4CYX7PtiE6.mINQ4idb6Oxw0cOpM6DmIJPud6tVbuNbWdLvGqXV2vmZ8D5H1CnHXWxz39zvwFktg4VarQCp8vMG1nUisFXOzh0Zy52Z8MaR231CGtY8Fq2xdygqCL4OYWamHdP+HZDKznzp2iaOs+X9odxE3gNgNCbY3CML5Cqrb383t1nHhiZzYriq8woJnPCfnGmqtVQptdWyCcrcxFOWscMwDjbLTUfktjN6shF60Pk8pqvdEvRkTXoUkrzaa12JvwOJeFjetpYWuHVvPJXmTYEIrFW5adGyNb.BunZSnOgsW.7PFFUZUudUB70Z2ob4adSxcy9PNX2cHa+ftGt8IcO5AJSffcxXmPB7mITeelMIhShFyHGRCAxRPmHxDtcrKqJYPbDwIhXwicsIeQbXDgFRXzPG2oHgFvHAL+3.ednjN.EITuoDNPv.xvXOqHGtGohfdT72UIG1cmtD1SAIpJgEYUaMAqitdAkA+MXMdJMfDQtKYWuQNdrZVALvbH.3nAeAyJphTb+HO9fPETN1ycaOmIhkAvNUsMhE0gOwm6AOT45p.ccfN4n+DuA2eJpBXgftYd3qA0LDn+DNH5KBYIDyhnOCzfKBODfYPaGlEc5hPS.v0k5qCEFUzLMj65xOUgTnQOw9eWhHPCRpcGND01WWNCBiNCbvdGcnzvxCZnhX1nUtN.CIGnDNgzINH.XQxCotwrvxArQDq3fC.uB2C.BUuV86nMXO0ACEpPl8rfqMSFN3BtCaH3JQhNkCNytvdTPGDPbvMR9bomI.1mwiIVTOh0Xp2HlXWgkH7GrcwS7ne.2mEDMkvDAJRTFfxDCShJOU+KTUT45NQrIxfn4ZuwNiFuLXzLUg8PZfCEB8DBLjWT.X+.2kASIgtN1rfvxn4vFs08fsJ.QafBNNnTk33MZOpUjX8pWq4Fx4Fm4HexX3eFCQYS0YBTS7IaknC6HWYRGpq6.HSfPEpsenrimKply13y8zlOgBUrR8QqB9QfGvZk+ikIvmhYHAH2o7WUt7RskrVHNqXgR4zJEyGqsX4RtUsXYRN24IOyp7A6B4WQpHfhbCTW2XsEKZoALlqXowJmmHglz4HQ3Tmq.k3RbHE1nGvi8rkhBrr3zQ0BinAQhP0UDvt1cH.67w91naItAJBmKgNNSl.aifYfrIKTEHi8MeMfBqeNJ.Q7vhU.hoNOEvY1i8bZKShFOWAQkEPA4r7Yd7JlH5QEHvSUQvjpjgBWr0HR9zkaQcSFKydgA0pHGqJxtUQQHwzEvhhC7HxvNg0l37rBHtP5NKSYEOvwpqZjzJBu.H6tm8KJ9RPQxGPp.zDT5hGWCT5InA+J6GUZA.zLaj0jbM3SbL0i4RxKQnrVjWvlbLjgKpGONBjuJoxWkQo7NFSjBLMriNDssGfxx8vMAgUDUfg.Aqy9rHgqtGOXB004KAOcoOxv.9DwLXRwIoIEyns6PNPcsjp3xrcTTfCTHFqRpNIAXQxyhvHI6pHKXEEFKo5jTNPvTIJYkbm6cTJgKxxdFnplwHUOazNkE9PnrPbUSwNe4SK9TjTNS3rjBPZFxhb6E+nZdhzpyH.JqOVLrrXleM4nXrJmQATaGrBjvwTa9ohvCHTi.RSXBPEHOB8K1OA38f1jp7nzsHm5DMdaW+wzJYiLFxbidvarVUB8QMeL4ljl3uZI+kfhE7Y9TbfKDa.oXSAEq+XXKffvX3lVatANXC4fsTFLJHl83DmkQ0FBr8tttN9grJO5rDodAzPNVB.aUMehsdrhRsqmGSQoMfh8.v8Jv8ZoThp1bY..ccXiG+bn+zIV8ZqOiAYIUOMZVf9IYvDPjVgVoOnph5vPOWgSpK72uKtTq+cQcLC0Zr.8gc.8zWj5ipjlhn4eURpYLX.50.67wVJJeyaTNBUIhpFxxGlE9UM5KB+ArgXug4crLSDOHKLgngSOT4uXjxBfi33ynOIq6hzEUknY.zKA.wJjPAmgjJJT32nzZyGTTItoRH9QsKnbZHMMeEg4FxJD3ab27JSR.V78r7SOE9o2xyO8T4mdmC+zqP9QohXkd2VTNFALUyEyhRwLCQ6sDDsWNQ6M27VZUGDv7whCfroDgi7MtY1gVfNxISKaQTTlQV3v7PgKiW9BWTbI6KJDJqR5xEUxsRcsOfGwNBHOT95UfxfHmcpgCKbtNoMYFT3zxUaAHVwKdx.VfRwyB.MJsp9ArYN+CXS87+rjETq.H2qqmSzQ9Lu4cpfFIUgimOXBWAfFINJt2L4n35K5d1vw1nzaYp0gngfwSOKz+9e4a+PikfHW0LqeLMB7292U9lkh.kMSamQC+u9tkq0dowWzEgF9j+59+Sk0eUI9uQB9mfGrf.8KaJ9cCcoG+.8uQMJsgYqaUS+ySO5fG9r3sZswuczlcDOCeM7Cvo1pyWbRqwGYrLL9qiL9AC46Ev9C5q9Z+92pswG2cGjALJUJwpdr7bXbPmnR6vdpiESdJqWwbGV3Sh39FkdsrlufeqKxhVADK7aZptky3YpB8T0GFyvP74i7YsUNlFT.Vu4VquU8FasQKi7YjSb6FsZsws23VnpHikLWZewbl5qYs0XpH1yhvkPA3kaIT8TmG42usj7W1LAPURekkwGddT9SaOQ8lJp0dBUQw6.yZa6xNlG5HLJYyzMgidMSI8sYCowtQOT2aUrUYIzAJaVlCi1dP1BJgyX9tTErKZdNSNsO0wFzmkLK8mU7rLK86fm7Sig0EH06Y9PFzxrSzTkCQUiKt5xskJmUZqYIbRDv2xDySgfFy7rlZnYe9Genl8Ym4Ze9ksCiGNzAf0zjb+uTWVtlo9YAa3SCnSXfeaWgCY9haL6kmbMyLDUuKGQAcY2sf1Enfo+8.Fbp5Mh8B6BdVVV7sMO1IxZbw73kJfGgXbeeviIWK1aXJaCNmAW0buO8kvcfc4rawzYhuKa+zk+0MyubgEbWlfSGykpol9D4Vn7vwEbamc8dJjj3XnFvfypjWYokxFKVJWco8DD2r1qzdquioPM+pNSJL8uZyjWyDJw3GHVTdBliNjFEHBE+f3I8gRQrX.64A08f0cW5RXExxmqiOiLQelms3g+C7IYxF3ykRlrQ5jFyt09matuKe.0MWY.UpApCl7dt+EISmm.fjAPiEry+aW12hA+k9sX36m89uZ7hGrr9m+zYLGguDcQ0RM71R1zDKOHQSclBENWF6dNXe9A374UQnz+.5UzM2op8ep8mPeJaHOXRRSCYT5.1HXMUG4DFTqU+odVpNf8SOx.ces2s8Abt+tdX4e1pD43wzPrY6PVjFY.xdBWlArCTm2SzRdMxiGvjMvqNdm3vH9jTAP7d3zOh4KZPpziLu050T5.C9p0QuXd94ovjyYeykVZuTzSHyji9DO+doqtbdoK9cLx34hiybB+Q.GuvJTW4+oqP8kclx2WJhW0D27JdYYDB36YltYlrOCRGNaPuK3K12xmR7HqHfENIf5EhuKWMzBRwl3bBzsYn1nmAilEhQS8J3ih8zIsbHMnPUwdfpPAtK2NcvlpCBEXoQL3YMJcnyyTagUFUtOCjb6iBs.ECpm0BRG6FxD0V1PEw7gapN78oA1mMsvYqrX0kKB4O5d8F+QPC5Z4XtRJOJ69bWnsPWNLRZOOhSQJcT8sdGx839i4dNZF5dLHhwnQLM+mBEnsihnp40e218XtLnZ.0SM4.nJXZ.nmXWPcQim62F0BsW+LSI6JtXie3avJoyhxYGBVR3xhNSrykC+3Pl7H5zrX34CnVpFFSxxY.yU2X.wWSVSAM146vog+Byp9+Sv+BLNEjr3U6CT38MgjVMIBSI4GFa4KipkdYrFSnVA7OO48nECOdYwHfb6I9O1vULODelTv0fMARt94VV5jZFDadQQr0EEw0unHtwEEwacQQbyKJh297QDq8Y6Xn6X4dCnFvi2UFqtTVS4kVw3+hOyOXl
-
RE: template or tutorial for custom c++ scriptnode?
@Morphoice Nice you move fast!
-
RE: Ring modulator below 20hz
@Morphoice This is how I got started with it, though I don't think it is the greatest tutorial series I have watched: https://www.kadenze.com/courses/real-time-audio-signal-processing-in-faust/info
Romain Michon is the GOAT when it comes to Faust resources so just finding his course lectures and online material is good place to start.
-
RE: Ring modulator below 20hz
@Morphoice Just add a faust node inside of Scriptnode. Click the square box on the node which will open a scripting window.
Put this in there:
declare id "ring_modulator"; declare name "Ring Modulator Mono"; declare shortname "Ring Modulator"; declare category "Modulation"; import("stdfaust.lib"); freq = hslider("freq[name:Freq]", 240, 120, 1600, 0.5); wet_dry = hslider("dry/wet[name:Mix]", 0.5, 0, 1, 0.05); process = ((1 - wet_dry)*_,(_*os.osc(freq))*wet_dry);
Now it should operate just like any other node in Scriptnode. I am not sure if this snippet will work but here you go:
HiseSnippet 1303.3ocuVstaaTDEdVmroDS4RAd.V4e4DEbsyklVpPIMNwfEjTqtgnJg.qI6Na7Hu6LKyLtIFD+mWg9O9KuE7nviPeCfyYmcs23XBMV.NRal4bYNey45vtxvDgrv9ZAOMkYHDmk5ojALsVpHNUOcbJi3beW+wByf1CnbAo6gDm228Xp1vTdVRGLNkp0rPhiyReARvY0kIY+dydGPioh.1TRDxYRd.6q4IbyTp81+q3wwcngrS4Ikjd686FHEskwxQ.dVxsIIkFLjdA6DJJVEWxWR0CHNq69jc1oEMLZ2nVa05ImGFEv1Z2lOZ6c2jtyiih1sYqs2Jb2nsAPtxQgbiT4anFlFNzCjgi8GHuTXMvYbM+7XFtoEwGrrkLo8.db3DmiFbUKWxUsj0U8ItGyC4SnO0k8gYL7lpQYmlSkaCRstCPxoDjV1BoG35Gn3olobP77ttcEPDLhBwlxPwJKw42caKAADlFIzgrNJXyDEp+nlM2vC9r1SiFIBLbovSJNQZXOWTesp+T0Uq9yU8lkUTzb4glQIiiYp4xFSGT2lh0EiRNmo1v6Uz3QrIBBW+q6SW4symFXu0kDTJ5J3lmmxx22QFGh9Jb8Mi.jb2Fr5a5dH0PwfRNMPtTlxvQ33bH6UPYfMDsp6gL8PiLEJDtQ7CxbjgiholqmNgEZ4L.+w0hgXfRn4lwkKDuC4XMu0br2VH9.2dbSvf4iwJyAifm5+BLlWY9dtGEEwBLSA3xtcd4hVF17NWFVMuLDrIZ76mu0qyKaM2BvewcZxdphkRUrSk8hoiqqoIowrW.XbCuyikAC84+H6lUHoVHb.JQ8fATgfEqWjBoU9Wp4D4ExQFt3hioFE+Jhi6IiR7g95Ar14nCn4TAqgr6ah6w7BeXHU1l+D9kyrEt2ImYqBlkJ+NgYtTpFlENxWSbtG56+H2WfvPF1OOjbE4YwwxKaKSR444pPjHiVOY73zARAO.IYkn.uOKQNBLUNngAQmR4wXxs+HMztH74BeP3roeNKcFSoyN3641rA7GjrehLDXsRGZ.3dG2iZFfUMXGHHEkoZDLIUcNHtbNicX3bDBsPwvSqqDtAIn+AGclMqunijMoE2AkjUronc0mgbCnwjyvjB7tkclVmpE9nn2yMhNRaHW6pbe3pnXMrbtIbKz4NgwJyfwUcaGCma2vB.tZgSHqGPYQ+.LeqGUAFGlioKTvZRRIFnUJ1A2ui4hhydRipioWMCs2rmugkhUh4z90W+5eaO+grKs9jxRZAdnZ7CuDdx0LGzerG41s92u+Ms9q2eFqmcP+8VeE2HE6Gl0zh8I9Wh8rOkptfYzy3VHGHkCSnYkTK1vs+OZ.jPCTx9A1dZXv7cxn.IRhrztUg2tB68ZQd0rQ0D3EZ8CBt9QcCE2bQUbqEUwsWTE2YQU7QKph6tnJ93+YEwGP+rQFYhsCMTE16nrjPGmiDTXDTVyEBClhEBuPy1DDyUmPQvtpCzQNq6UDGmYUA+mEIersezCy6ezHTmV7ZPRktNtgrfXXHrGOzyyqlBjpeRwqdp8zpErwCyqFdHdSdTDrRHKIidfTYlmfkjI.l1dAzK0q1zWPArqxSRAkqWSaByvaiX940VCXfUzdet2.cLODdxbMb+2hF4y5.q9tZa3s41vy1asI9I6E7MarCnHzCpOzKprp4slrZeL+JTYPX3CnJtrIpX07WX.ZVudKuO0K+jVa89aTu+5RcCoNnNBi0Va8BdOkP9KFTBC5A
-
RE: Getting Panel Value to Change Knob
@Natan I think you can set this up quite easily in the mouse callback:
pnlMenu.setMouseCallback(function(e) { var value = parseInt(e.x / this.getWidth() * myColours.length); if (e.mouseUp) { Console.print(value); this.setValue(value); this.repaint(); Knob1.setValue(value); Label1.set("text",value); }
Which means you can also remove your other inline function
inline function onKnob1Control(component, value) { Label1.set("text",value); }; Content.getComponent("Knob1").setControlCallback(onKnob1Control);
HiseSnippet 1679.3oc2X8tSabDD+NfqA6Tm1zlOzOthVEctAYrCPRknQ0fwz3FLXgIoIJJJc4t01qx5cOc2Z.WDp8QqOR8Mnc16O91yXCAqDTSOjv2MyN67alclYmca4KbHAABeCybGNziXX94VsGxk8p0CS4FM11v7NVMwARhOJhzVC8vAADWCSy4+YEAybKXD972+zVXFl6PRIYX7BA0grKsOUlRsU0mQYrcvtjCo80F8ZUa3H30DLw..OyaU1vC67NbWxdX0vlyxv7yp6RkB+1RrjDXXtvVB2gs6INgGM9WPCnGwHpOpXzFlnHx6HXtJDqnZTqGk41JwtCLLLsZk5ElOxKbOqlTW5H5odiuLjAJUBc+g4bYg27YfWEc3UVCdS.RlZPZgHHcWq1N9TOYJGEdtsUCNr3zACtccnDMVi49iaYUS.ifKK0G+NxN9vGijvdsxkWFsZ4xE2nP9B4gGv+GHQGi8QOiKNpB5InDo6Rj0D88Db3C6kB4tTwMzDXW7QD1zkHh8RJMkJiGm0jvGLUgh4mUQ8GFEhD.h85xub80T+sL5xd6Ma.1FZJOExGqlRADYKXgVdfXfjxIH6NC3NRpfa2sXg7mUHbJ5VpCD8tIiYW9zHOWzjn9eGgOxlB3p7FHJ5GQqA+7fGTLhYr7pGkYbJLLYOZfxj+UpqrmcwUFYZkXDdWYOz2inajOEnIuMARqrx193SPaAYLc8EC3torncP1IZ5EX1.hcQzSdBhVbzHNKetjW6p7BQnvNALmPk81j40CaOBful9Fv8V5wqWrXJ.OuP9rN1j2Hr.RAcskKW1gNBhtXItTOwwP8F.hUP2+9nwn2f6RNMB+YmiyJL1R7LZSO7Q51zXS06E8w7CYs9IB0qKFKqv3Egy33H+3ukp2nv3CTQJD2CHNRLuKiX+5Sgoe4qLvb4jA7TBsaOocw2r7nTgQv.bCmGUYQ8mVRVSwf.RMLicDDslljQRSxTIHGqBUgjDOre.ApYYSJcJZkwgFjhLN3z.RRxYzupnLRo9Js+buKlUB0fBDLRIOenFfcn50soPEGjjBMY19DOUADas.nvRkWPtQripKp3aujjbpbokyLywgRogPmMlFuPhQjeaioNLXDjn2lN3iYbNJdEDdnblpjXxhERviWPUUt8ELamjx1KGgfh4OK+kX+muQ9qnleTBQ3jOJVYbsBSTXvkFr1SHI6ysUpOWdHtebVc5LQdwSHi3OQ1pNU7uLAs4C5eDwWy3CGHr8c1dBrldOA5sr3D4azFnf2fSk66Q3SqQFiXGJz+vbwnBFpLr6gBIcOf4DlAE5QHmUrqzHDw.xLm2HdRzk7NwR1lQcI9ghdKqvE0wD74M1FBxTMuDiC.adDeIUY1laSNF5DLpUlbVaSBdmT3YXlezJug4hWMTOUu2xg5ebhpbPJggU6EVYJkxqpBAQhSRBk.L8EVvt3nTBA3ig5Ls7IPfGf34Lzv1slF1tsU36a56UYpnaupigtFiitp+V0iSBD.u40SwOTWwMpdyo3U0U7qtAU7ZZJ9uN5FTwqqawzaPE+HMEWUbCp3Gq6p8+Po3O6Jqsn4mOTSqvTBGF0qM82I5m7rOVa7KVUWUVYswv8aC0zhVQ68pafLMU8m3ppMjGUe6hGICNLnvc.CKydBQ0whiY.aQj4XYpidwCnxg5f+C1wFeeg3csZQkN8lLFmaBXTsixGALFeX6BV06zA5.MEfKXsyK+3bxZc0+0IpeyAtTwtB0tUgp+dQTPJRnVL7PhekODW7g268EezdH2AVdxDiGtlcnOrUEk2UWUJXVmiA62Um7ABgT0wi9EuzF22iQ.unOzDd1QSfNBCxNC6PYw28x2ZcVqC1+WpW6v2ty96tc8CNu1t62t91nmt4gnUK0ggcL5q7IVlJACSGidkAfKTe5DpycS9zb9K6JcpLiWoyB+m6Jc9Dn7QlacJWBFaSUgL04GSXPBRHF+Jn+sN3ALYB0rYGMEbgWOAm5jM.S5S61k3qi8IZPaJkPPdJk6U8.BifCzhj+tp6BmFA6OdNx0vWT4ZeCbSb85arhfKRkRi9zsr+7++trezU50sIFBBU0l1aP+1P0VGBncNzoi5jYPG+JQC+tbR8o1Dta3G+C7Dyrh5ayXlURXdini9XGewachNilJNcwPJfcyCKTmypo5aznCmktV1Gpx8VGmrS0ED7gypfqNqBt1rJ35ypfOZVE7wypf+vUKnZSnMGHE8iRMMLZ1pd3ApMMGs4NzH5+d0MX5M
-
RE: Adding a Faust scriptnode make the signal path mono
@arcy That's one solution, another is to just make it stereo in Faust by processing the code on each channel, so in this case it would be
process = v.korg35LPF(normFreq,Q), v.korg35LPF(normFreq,Q);
-
Scriptnode/RNBO Odd Build Behaviour
Has anyone else experienced this issue?
Anytime I close and reopen my project, I have to open all my Scriptnode networks which contain a RNBO project, resave them, and then continue to build them out to .dll. Otherwise the build will throw an error.
My project is starting to become large so if someone can shed light on how to skirt this issue, I would greatly appreciate it!
-
RE: Moving DSP Networks Around
@Natan If I understand what you want, i.e., duplicating a Scriptnode network and changing minor components within it, this has been my strategy in the past. Simply duplicate the file in your file folder (YourProject/DspNetworks/Networks/YourScriptnodeFile). Rename the copied file (NewFileName) then open it in a script editor. Rename the "Network ID" and "ID" to the same name (NewFileName). Save it and then you should be able to open it in Scriptnode with all the same properties.
-
RE: Issue with FX Plugin Export in HISE - Need Help!
@filipalex96 There is a space after "Jucelay" which might be causing issues.
-
RE: Next HISE Developer Hang
@clevername27 can you repost the link and time for the meeting here?
-
RE: RNBO optimization/best practice
@mmprod I think @clevername27 is referring to @Phelan-Kane , he's posted a couple of videos on RNBO/HISE.