• Crash when clicking Parametriq EQ1 in module tree

    General Questions
    6
    0 Votes
    6 Posts
    212 Views
    pcs800P

    @David-Healey I found the issue.
    ParamEQ.setAttribute(band * 5 + 4, bandColors[band]);
    band * 5 + 4 is an invalid attribute index for the CurveEq

  • Absolute Samples - Windows 11

    Unsolved General Questions
    5
    0 Votes
    5 Posts
    183 Views
    L

    @David-Healey I had about 16, I just automated the find/replace in VScode and it worked really well. Thank you for the videos on exporting plugins, went back and followed them to the letter and they worked perfectly.

  • Something probably broken.

    Bug Reports
    2
    0 Votes
    2 Posts
    120 Views
    LindonL

    @Quemis what version of HISE are you using? have you compiled from the latest development version?

  • JUCE error while exporting VST

    General Questions
    17
    0 Votes
    17 Posts
    518 Views
    J

    @David-Healey said in JUCE error while exporting VST:

    @Jeetender How big is it?

    Content.makeFrontInterface(700, 400);

    const var scriptFx = Synth.getEffect("Script FX1");
    const var buttons = [];
    const var panels = [];

    for (i = 0; i < 5; i++)
    {
    buttons[i] = Content.getComponent("Button" + (i));
    panels[i] = Content.getComponent("Panel" + (i));
    buttons[i].setControlCallback(onButtonControl);
    }

    inline function onButtonControl(component, value)
    {
    if (!value) return;

    local idx = buttons.indexOf(component); local compSwitchValue = idx * 0.25; // Show corresponding panel for (i = 0; i < 5; i++) { panels[i].showControl(i == idx); buttons[i].setValue(i == idx); } scriptFx.setAttribute(0, compSwitchValue);

    }

    //const var scriptFx = Synth.getEffect("Script FX1");
    const var mtbuttons = [];
    const var mtpanels = [];

    for (j = 0; j < 3; j++)
    {
    mtbuttons[j] = Content.getComponent("MtrBut" + (j));
    mtpanels[j] = Content.getComponent("MtrPnl" + (j));
    mtbuttons[j].setControlCallback(onMtrButControl);
    }

    inline function onMtrButControl(component, value)
    {
    if (!value) return;
    local ide = mtbuttons.indexOf(component);
    local compSwitchValue = ide * 0.25;

    for (j = 0; j < 3; j++) { mtpanels[j].showControl(j == ide); mtbuttons[j].setValue(j == ide); }

    }

    const var rm = Engine.getGlobalRoutingManager();
    const var cable = rm.getCable("global_cable");

    const var Knob1 = Content.getComponent("Knob1");

    cable.registerCallback(function(value)
    {
    var dB = Engine.getDecibelsForGainFactor(value);
    dB = Math.max(-60, dB); // Clamp to -60dB
    Knob1.setValue(dB);
    Knob1.changed(); // Update UI
    }, AsyncNotification);

  • 5 Votes
    2 Posts
    109 Views
    ChazroxC

    Epic!

  • 0 Votes
    32 Posts
    1k Views
    David HealeyD

    I also emailed the Araelium dev and he said the situation is the same with Package Builder. The limitation is with the Apple installer which all pkg files use.

  • Pro Tools is not recognizing my AAX plugin.

    General Questions
    8
    0 Votes
    8 Posts
    270 Views
    lijas90L

    @svkpowa thanks!

  • It´s possible to change Popup Data in execution time?

    Scripting
    11
    0 Votes
    11 Posts
    341 Views
    jadgJ

    @ustk Thank you very much. i,ve created a similar solution a few hours ago. I don´t use Broadcaster just the proper scriptSlider callback ,a "InlineStyleSheet" for the valuePopup Label and a Timer:

    Content.makeFrontInterface(400, 200 ); const var Label1 = Content.getComponent("Label1"); const var lblCss = Content.createLocalLookAndFeel(); Label1.set("text", "ValuePopup"); const var valuePopupTimer=Engine.createTimerObject(); valuePopupTimer.setTimerCallback(function(){ Label1.set("visible", false) ; valuePopupTimer.stopTimer(); }); // Label Laf lblCss.setInlineStyleSheet(" * { letter-spacing: 1px; font-weight: bold; font-size: 12; } /** Render the default appearance. */ label { background-color: var(--bgColour); color: var(--textColour); border-radius: 5px; border-size: 1px text-align: centred; text-shadow: 2px 2px 5px rgba(0,0,0,0.6); } /** If you edit the text, it will use this selector. */ input { text-align: left; padding-top: 0.5px; padding-left: 50px; padding-right: 20px; caret-color: white; font-weight: bold; } /** Style the text selection with this selector. */ ::selection { background: #50FFFFFF; color: white; } "); Label1.setLocalLookAndFeel(lblCss); inline function onKnob1Control(component, value) { Label1.set("visible",true); Label1.set("text", Engine.doubleToString(component.getValue(), 1) +" "+ component.get("suffix")); Label1.set("width", Engine.getStringWidth(Label1.get("text"),Label1.get("fontName"), Label1.get("fontSize"), 0.15)); Label1.set("x",component.get("x")-(Label1.get("width")/2)+(component.get("width")/2)); Label1.set("y",component.get("y")-20); valuePopupTimer.startTimer(1100); }; Content.getComponent("Knob1").setControlCallback(onKnob1Control); Content.getComponent("Knob2").setControlCallback(onKnob1Control);

    Probably the best solution is a combination of yours and mine. Thank you very much again.

    ezgif-4b86ba577ac754d8.gif

  • New version removes show text box

    Bug Reports
    11
    0 Votes
    11 Posts
    273 Views
    S

    @David-Healey Wow haha. Works fine on PC, everything is fine there. I didn't feel the need to change it, since it was perfectly working for me. And sometimes updates cause troubles.

  • how can i create a sin lfo in scriptnode

    General Questions
    3
    0 Votes
    3 Posts
    127 Views
    N

    @ustk thank you so much ill try it
    Thanks again im so happy😄

  • 0 Votes
    13 Posts
    381 Views
    David HealeyD

    @ustk Nice!

  • Trying to give back in my own small way - KnobForge!

    General Questions
    1
    3 Votes
    1 Posts
    90 Views
    No one has replied
  • Matrix Modulator Smoothing Control

    General Questions
    7
    0 Votes
    7 Posts
    235 Views
    ustkU

    @DanH just set it to zero then you’ll eat as many kinder as you want (pretty sure this sounds weird in German… 😬)

  • Toggle Oversample container in Scriptnode

    General Questions
    3
    0 Votes
    3 Posts
    120 Views
    DanHD

    @ustk Sexy, thanks!!!

  • Handling Latency for Delay-Based Modulation Effects

    General Questions
    2
    0 Votes
    2 Posts
    83 Views
    HISEnbergH

    @Yinxi Good question.

    Just to start, latency refers to a short period of delay (usually measured in Samples in DSP) when an input signal enters the plugin and when it exits the plugin. In many cases that is not desirable so HISE (using the JUCE backend) has a function called Engine.setLatnecySamples. This works by telling the host/DAW: "Hey, this plugin introduces X samples of latency, so adjust the signal so it is X samples further ahead in time".

    An example of this happening in Scriptnode is if you use oversampling, which will generally introduce a few samples of latency. So you need to calculate the amount of latency introduced (Use Tools>Check latency of signal chain) and use Engine.setLatencySamples to adjust it. This function is dynamic, meaning you can adjust the number of samples depending on the latency you are introducing. Example: if you have a knob that adjusts the oversample size from 2x to 4x, this might cause your latency to jump from 1 samples to 2 samples. You can write an if statement to change this and the host will be updated:

    // pseudo-code if (OversampleKnob = 2x) Engine.setLatencySamples(1); else if (OversampleKnob = 4x) Engine.setLatencySamples(2);

    Small note: Each host has a different way of handling the information it receives from a plugin so results may vary here. You need to make sure to update the latency report once when initializing the plugin, and any time after if changes(this is probably updated once per block).

    But returning to your earlier question about vibrato, if you consider that latency is just a delayed signal, that is not necessarily a bad thing. Vibrato is basically just a time-varying delay (delay line modulated by an LFO). The pitch shifting comes from the rate of change of the delay. In other words, the delay(or latency) introduced by the Vibrato is precisely what you want, so there is no reason to adjust for the latency.

    This is all an oversimplification but hopefully clarifies things a bit. You can test this out in a DAW to confirm as well. Run an impulse through your plugin and record the output and see how they line up.

  • 0 Votes
    4 Posts
    113 Views
    HISEnbergH

    @Allen Ah thanks for clarifying. I believe this should work the same for RNBO node as any other C++ node. You need to add these flags to your projects Extra Definitions:

    NUM_HARDCODED_FX_MODS=4 //or however many slots you need NUM_HARDCODED_POLY_FX_MODS=4

    It is possibly you may need to first add that to HISE's extra pre processor definitions in projucer first and recompile HISE, then also add those to your project (so it works in the compiled plugin).

    The documentation about this is a bit hard to find. There's also a forum post about it here.

    Here is a spreadsheet of the different HISE flags you can use (it needs to merge this into the documentation somewhere).

    Just for some extra context this is straight from the docs:

    // number of modulation slots for Script FX HISE_NUM_SCRIPTNODE_FX_MODS=0 // number of modulation slots for Polyphonic Script FX HISE_NUM_POLYPHONIC_SCRIPTNODE_FX_MODS=0 // number of modulation slots for Scriptnode Synthesisers HISE_NUM_SCRIPTNODE_SYNTH_MODS=2 // If you plan to compile the DSP network to a C++ node // (which is possible with this node since HISE 5.0), you will // also need to set the corresponding preprocessor variables // for the hardcoded modules: // number of modulation slots for Hardcoded FX modules NUM_HARDCODED_FX_MODS=0 // number of modulation slots for Hardcoded Polyphonic FX NUM_HARDCODED_POLY_FX_MODS=0 // number of modulation slots for Hardcoded Synthesiser NUM_HARDCODED_SYNTH_MODS=2
  • 0 Votes
    4 Posts
    243 Views
    V

    Hi all,

    I’ve been playing around with this in my free time and making some progress.

    So far I’ve populated a couple of samplers with instruments, just to test different mic counts: a kick with 7 mics and a tom with 5. I was able to get the multimic merge working, and so far that part behaves well. I also added simple per-mic gain controls in the sampler FX, which is also working fine.

    For routing, I’m currently using a container. Based on what I read in the forum and the docs, I added Routing Matrix FX modules in the container, one for each mic.

    Here’s a snippet:

    HiseSnippet 3290.3oc6c0sTaijEVFP.1AHYxlsp8loJsY2KLa.hk7evvxDiARBUvXVLI6jJ0TTxRsgdQVxkjLCraMUMuFyc6ivd6dWdjl2fc6V+X2pssvVXL1P6aBce59zmyQm9q++jiLMT.VVFlbwRbx0M.bwVfux051muy4xPct82Emgkl9oW.sOMkDWwqaHaYAT4hEa52gKQr3yv4762dSQYMYcEP6r339jATAb.rNztctGU3CPMs2JqBNAVmnzYJruhg9NFZFMQRyz7o3ZHqbg7YfCkwEaJdt2KacNWr+Be5p0xkQQLeU47RaTcib41HqZ5ZpxRoAJUqJKAPjyjsVNtXytmJz1vrhsrMvhK1LEMTutx4F+jtaC7InErpF.mPjqBpkcy9sFZpXUDmK2NmC0TOx2LYwgX5QsMZS6ZzdAeInJrU9sMdOygfP6ZPZ.iMUPwa5.hmHo3khP75hHEiPjlwUj9F9JJlvF1sofkmmvuutMvrlL56Don3VVtoVHA+NFnRnauVc4K.u0DknUMRtdpTqHjIUpk2LQBGuj0TA0.l6HqoUE8sxJosYS.l3qe8G1emOHTZ+cp7cBhas6mObEAos1oL5eRu0Ie7vC26.Di1p76WQH6VGWtboUDxs0m163hBUde4iOYEg7toNn7guKAxqvxV3vOV5TLSOEyTgsDxuo.pYNdaTybR4RzMElyo83bl.bNaW4LlO9bNKRA7HcF563a+ATde4G2zKqKzqhc7CjWUa8RMsAd44q8qNz9knlgoPRHh+o1T.J7WCZLPY8pWs7+JQ7W+5+gfsgvE.PCAcTmFKAz2WCEHx6RESnNTQHYIwUDJIsh.vVYs0Va4DwuT1DS4vl0qBLQMA7UhHSah3t59ZMZZcdR2O1mAr2qVMfhcxWV6pO.Ut.aHNsDT4kBupMKVF6.D2yL4VceWJDC1wndCCcThjuDUjPYhOO9B7GWyBWScaSCMemsjF5evktGgk2LdheNQBemh6XqeKGFBqeXF9+DxxCUv1dnxPv5er7Pv5GJSZY8C3q8pA6aQBntFTGHTqothMzPWftfIU7knUDtTVCgdfrjZFJxZBPcUvUHKhut3jtbs10.Kjtlou3PyQx1111DVE0YLYPRXV32Da5JaXWkhmbXEgS1qxINoPnvNcl+NASCb+YbGFQmOf3d7nrZzz1qKO96FpjXGX720SLJ4BJzcisWIcKE1bK9RjTzQ86tosnK5Bt.tXq8TLkadkP0lV2fjVDUhaTPQEp6xIhPnhIhtqT1t0MqiqtC6PMbGdyDjQslPharhGizOn9YkjQepuht93l1yrfLXcwAjvb1UuOT0ayPrp5ONYRmhf5+mZsrXG73HZ91Eamuedk368KwO2VXPeV5srfrYcUTBz.3B0I+6focJTPqx5HtkP.8iT0LA0MtDTAnqh9XpCbpdRD1Dd389proWQPD2IzozvZB9sT73jUUVUs6sQb5FoyR52B+LVUCUSwVmvUzfBfTOUxfMe59RA6j2cS45BmwJFg+vgF1fx5IWNApMPTDnIUqVWo40YTCX1Ux34YaFVESp6.66644WPzbICNAU9dOAUx4Oq3BsPTPC880g1ka.z60rp47viPSlcIOoBUTamoxtj2TYqnAUAlbPzLVeNO0rGD4bjcxEevEE9HQymO+0HwmzCI9jYHwmrCI9jaHwm7C.eJ1z11P2gOufuygRo4zu8l9gS+N9NFqa.XDspQNUpaiqHIejFR7I8PhOYFR7IaW3yG2eWYaY7JY8vAPXCM.l1PLrSrcAWBU.tqqMN+t.qKrMZvEapVSbAsnb21eQ+U8JqCzbZ944c9aQtqZ2feegqIa8eBpZedqLJXT3b.7ryI1xhqKDKAQasvf.KcE4NbPzr6Vntgpm9n.qhj15jamxm+Zc4qHERKaPiJv+ouY6e+q+5+8MVMqUChJEOufZQT8UU0.GYXAwn6sqqzWsAWYiKEZwwbMjMQJAg1zx.wEMUTpWp3u7o6AUbmx2ApX5dphxibUbdd28OoO0xEGjgZ5gV90yF4Z4L7keOGzFT2e+.WfWLuTlLqKkYiTCeUOaO6lpOxU8Y4waa0HT4y0KkWv7dv61cu5Fgpe9do9EZdeo9GbaU+3C1DnHzBURm+8K36RVZ68OjZbxe4u0w3jYJzawycmhCtqA9KFfn3Cz705gbijL+gCJ9wJ2NwtKVU+4Xbfb0Vywv4u68f8+4VFR7NoQ70UB+4MijnXp0EkDywU8r1e0yHkecwMRkZ8TAbGhymMUZQQo78ouvMMyHxwuQ83G3YFMa+OlZvYIOoLyHoAAYI3D3mzGPMxpd5G.CnFYkOyChATir5m8Aw.pRCDzuzMB8mf2+rJuqg+QRdmGG7y3KYn1TS1N3oSi+l4Q.a+HORX7w9pirqWStgHCsirteEwug+Hnsx4cWFmpKxHG2chL5cP+Kx6dpEsEvY3e6Ob2bp9jM+783xY7T9KPSIBOsJTN.ygw8ynQee+LhM8cw0qfer65Uv5N8Pn6Tr45r8iyiOKQ.pIws8h7DGXSPgX59VHDC2FD3rK4h8GOrY8JnNTJ.jIPGAdiOkkXOCuyptoSgS++P+vmLVqDdDEIIJRQTBmdJDmvDcRv0lsowom1inShXsIlgjsYnXaVRhYoHlijXNJh4IIlmh35jDWmh3FjD2f1HDvDI1gMJnQh1JIJEfrDM4zAHmllb.SkHssRLfwpcJtAwST5ggmnOQZKb.CLs80wfNimaZFJeXGyIuGwrT9vLOwgumX5G6dhQGSbVO2zbT9vNNey4QLOkOLySrWdhYXdhi9Qmm2yMccJeXGmu3dD2fxG9gtmXVlm3D07DS34m5lhvK1026I9jEo8iG68Dyw7DeDshkE7cToWYmqu2h9joWa2nvSLOySjs149DSbIeGU5U24568TexsVeGom3255I9b9J1l.45HeiJx0anAL8bIsbSg8KGc6LZB9Z0jqplKeVjnBzLjUINBC7g+UnXyZ0.lAy8+TvoE2ttQS8.MomFcLnAP1tj6wm3Qb9BGe76LMZ1ftVBEb1kuSLkUt.YTHU0x5.TeOaRUcGSCKqZHsxgWVjjNpo4YXSV6bNFbIvzJXdn9gj8.wKm4iV.b+cnhem01k1oURchrSe9o3cSKRkVhJcZpzYnRmkJcNpz4am10fVRtA1GIty9meZ85cbWmms+foP7w4PWHJYQ3YsZC2bl3dPgS.63cf27XbeYrBDa32S+RTGOTNXY7476BpI2Ty1O2fasaICciFmanCUB5libaO6LfIor2UEZaaamaxheNunvw.MfrEf7H.O.pCjMC16cfrEhC76+rqeu9C7thq.F.SXx8jJl9wyIUz9j+bbseWa6Sv2foXHivwwsKPSNfs5uG3l8v84BcYLv8QcXLsOxPS1j1ROrlSWrY5a2AmWc6XsKKFoAYlG2ERmO8i2B4yv2jg6IQjZUFeaWWkwRTqxfyadpccUFw7mDKaUFitUYvEALzvhuEe9qLLTFFJCC8tCCcHcKGnwPCbKGXXn20XnoYXnLLTFF5DGF5P594PigF394vvP6OLzLLLTFFJCC8QDF5P5lkQigF3lk83BCMKCCkggxvPYXnit6DIMFZf6D4jHFZNFFJCCkggxvPmLtMucfgF717d+fglmggxvPYXnLLzGC2C8NvPCdOzowPCyUaId2KQo.xywzdLruvB7N2rTA78AdruevTgc+TlNr6mxLgc1p7gc1pyF14BLWXmKv7gsmVwCaOsRD15wdRnqGagvmKwhgOWhkBuevS6refh+mKtXy482Nw.0XSCzwWVYmHxfF3RfVfPhiW3uYd9RhqhiZUbQptRqhCTlQntOguT5U8h.kQn5ywWJypkeeTpZb9RYW0IRNEMwN2p3PAzpUhX0y6V8Ch3yPI5WPrne4Fh9AyE8MU9VrgH2tIyOvCDExyPoiGDUvmgRuWJ.cv4A+.LXAmGVv4gEbdtoq7Ne+7.CwQYNVv4gcs0t+ez09dhrfyCK37Ld3IxBNOrfyy3gmHK37vBNOiGdhrfyCK37LR7D6y.QA1ujEHJFYAhB9Ip.QA1FwBDEOlBDERr.QAKPTLwrqbgcgWB9erKr.QA6BuvtvKC6C5+220UYjfEHJ5iUYvEAbLIFNFCGigicOgiwBFDCKbrzLbLFNFCGahCG6gb.YHJ3XYX3XLbLFN1iHbrw+fhPTvwxxvwX3XLbLFN1XTfIf8nrlr1q1GxuIDxGFE+n8gQMG9gQE4WmT5ayqSJys60Ik8185jX2MoGX2WyQ7aTi4ELV5ETWVwz3TECcaSCG7z4cxAAqnK6buw3KgSKHxcorVy.KonNTEdphRPV0QEkhZESG0JlIpULaTqXtnVw7QshqeyUDe2q1tosQc2YcywU5n8bGwH1dsFwXZt+OHGS6jI

    I’ve run into a couple of questions / obstacles with the Routing Matrix approach:

    At first I thought I could access it through Synth.getEffect(), but that didn’t work. After searching the forum, I found that Synth.getRoutingMatrix() seems to be the correct method. Is that expected, or am I misunderstanding how Routing Matrix modules should be accessed?

    When I use removeConnection() or removeSendConnection(), the signal seems to get routed back to channels 0/1 automatically, and .clear() doesn’t seem to do anything. Is that expected behaviour?

    In this example, I added two buttons just for the first kick mic:

    one connects / disconnects that mic to the main bus the other connects / disconnects it to its own aux bus

    I’m not fully sure this is actually the best feature design. It might make more sense to have a single "THRU" button for the whole kit that mutes / unmutes the main output using send fxs, instead of handling everything with Routing Matrix instances. But I’m also using this project as a learning exercise, so I’m experimenting a bit to understand the options better.

    Overall, does this structure and routing approach make sense?

    PS:

    The code is still pretty rough, I’m just testing ideas quickly for now. In this example, the rack tom is not routed properly. I still haven’t compiled HISE for multi-output or exported a VST3 to test in the DAW, so before going further I’d like to understand what the best routing approach would be.

    Thanks again!

  • 1 Votes
    5 Posts
    161 Views
    LindonL

    @Lindon Ok well more investigations..... and a "work around" solution....

    So you need to put your Hardcoded Polyphonic FX in an Effects chain in the same container as your Gain AHDSR envelope, and add a small (around 100-150) ms of release and this clicking goes away....

    So for example lets say you have this structure:
    2201b459-a17a-4291-a850-4dcd9d00ca65-image.png

    You must put your AHDSR envelope (here AHDSR Envelope1) in the Syntesiser Group1 where you must also place your Hardcoded Polyphonic FX

    Put the FX down in the Waveform Generator and leave the AHDSR where it is? - nope no worky...
    Put the Poly Hardcoded FX down in the Waveform Generator and leave the AHDR where it is? - again - not gonna work reliably....

  • Channel Amount Mismatch when converting to monolith

    General Questions
    18
    0 Votes
    18 Posts
    446 Views
    J

    @elemen8t
    i can only get it to work using the method david mentioned:

    Select all the samples, right click in the mapping window, Tools > Merge into multi mic samples

    the samples do have to be ...exactly the same length for each mic position.

    also, doesnt work in juce 8 last time i checked. if you are using juce 8.

  • Correct setup for scriptnode synth?

    ScriptNode
    6
    0 Votes
    6 Posts
    183 Views
    D

    @Christoph-Hart That was totally my fault again. It turned out to be the default envelope with a 5 ms attack 🤦♂ . I literally spent a few days searching the forum and trying different solutions.