• Regarding expansions

    5
    0 Votes
    5 Posts
    126 Views
    ulrikU

    @David-Healey Thanks!

  • What does this above value means

    5
    0 Votes
    5 Posts
    249 Views
    N

    @dannytaurus thank you so much, dont be sorry lol we are humans and humans make mistakes 😊
    thank you again🤙

  • 10 Votes
    15 Posts
    542 Views
    J

    @Sifres
    The storefront was easy to setup, but
    I have a half finished website. I was just testing it out, but seems to be really great so far.
    ...and I havent tried that JUCE module that can work with License activations.

  • Crash when clicking Parametriq EQ1 in module tree

    6
    0 Votes
    6 Posts
    230 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
    5
    0 Votes
    5 Posts
    193 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.

  • JUCE error while exporting VST

    17
    0 Votes
    17 Posts
    557 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);

  • Preset browser expansion installer

    2
    5 Votes
    2 Posts
    120 Views
    ChazroxC

    Epic!

  • Mac installer for audio sample libraries best practices?

    32
    0 Votes
    32 Posts
    2k 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.

    8
    0 Votes
    8 Posts
    318 Views
    lijas90L

    @svkpowa thanks!

  • how can i create a sin lfo in scriptnode

    3
    0 Votes
    3 Posts
    138 Views
    N

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

  • Panel paint routine - different corner radius on same panel?

    13
    0 Votes
    13 Posts
    443 Views
    David HealeyD

    @ustk Nice!

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

    1
    3 Votes
    1 Posts
    104 Views
    No one has replied
  • Matrix Modulator Smoothing Control

    7
    0 Votes
    7 Posts
    261 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

    3
    0 Votes
    3 Posts
    141 Views
    DanHD

    @ustk Sexy, thanks!!!

  • Handling Latency for Delay-Based Modulation Effects

    2
    0 Votes
    2 Posts
    109 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.

  • Best way to structure a multi-mic, multi-output drum library in HISE?

    4
    0 Votes
    4 Posts
    287 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!

  • Hardcoded Polyphonic FX - Filters - some observations.

    5
    1 Votes
    5 Posts
    165 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

    18
    0 Votes
    18 Posts
    486 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.

  • How can I make authentic chiptune sound via waveform generator?

    16
    0 Votes
    16 Posts
    769 Views
    B

    @OstinTheKr0t

    a no - you need to create a third party c++ node template

    --> 1.) Go to Tools -> create C++ third party node template
    --> 2.) name it EXACTLY: chipTuner
    --> 3.) this will create the chipTuner.h file. Open it with Visual Studio or even Notepad and clear everything
    --> 4.) Copy the code below into the file, save and close it
    --> 5.) back in HISE go to Export-> Compile DSP Networks as DLL
    --> 6.) You can now go into the FX Section and load a Hardcoded Master Effect -> there you can choose the chiptuner effect

    My advise, play with settings like Bit depth = 4 and SR Reduction = 8

    #pragma once #include <JuceHeader.h> namespace project { using namespace juce; using namespace hise; using namespace scriptnode; template <int NV> struct chipTuner : public data::base { SNEX_NODE(chipTuner); struct MetadataClass { SN_NODE_ID("chipTuner"); }; static constexpr bool isModNode() { return false; } static constexpr bool isPolyphonic() { return NV > 1; } static constexpr bool hasTail() { return false; } static constexpr bool isSuspendedOnSilence() { return true; } static constexpr int getFixChannelAmount() { return 2; } static constexpr int NumTables = 0; static constexpr int NumSliderPacks = 0; static constexpr int NumAudioFiles = 0; static constexpr int NumFilters = 0; static constexpr int NumDisplayBuffers = 0; // ------------------------------------------------------------------------- // Parameter State // ------------------------------------------------------------------------- float bitDepth = 8.0f; // 1 – 16 Bit float srDivider = 1.0f; // 1 – 32 (sample rate reduction factor) // Sample-Hold state float holdLeft = 0.0f; float holdRight = 0.0f; int holdCounter = 0; // ------------------------------------------------------------------------- // Callbacks // ------------------------------------------------------------------------- void prepare(PrepareSpecs ) { reset(); } void reset() { holdLeft = 0.0f; holdRight = 0.0f; holdCounter = 0; } void handleHiseEvent(HiseEvent& ) {} template <typename T> void process(T& data) { static constexpr int NumChannels = getFixChannelAmount(); auto& fixData = data.template as<ProcessData<NumChannels>>(); auto fd = fixData.toFrameData(); while (fd.next()) processFrame(fd.toSpan()); } template <typename T> void processFrame(T& data) { // --- Sample Rate Reduction (Sample & Hold) --- int divider = jmax(1, (int)srDivider); if (holdCounter <= 0) { holdLeft = data[0]; holdRight = data[1]; holdCounter = divider; } holdCounter--; float outL = holdLeft; float outR = holdRight; // --- Bit Crusher --- float steps = std::pow(2.0f, bitDepth) - 1.0f; // eg 8 Bit → 255 steps steps = jmax(1.0f, steps); outL = std::round(outL * steps) / steps; outR = std::round(outR * steps) / steps; data[0] = outL; data[1] = outR; } int handleModulation(double& /*value*/) { return 0; } void setExternalData(const ExternalData& /*data*/, int /*index*/) {} template <int P> void setParameter(double v) { if constexpr (P == 0) // Bit Depth (1 – 16) bitDepth = (float)jlimit(1.0, 16.0, v); if constexpr (P == 1) // SR Divider (1 – 32) srDivider = (float)jlimit(1.0, 32.0, v); } void createParameters(ParameterDataList& data) { // Bit Depth { parameter::data p("Bit Depth", { 1.0, 16.0, 1.0 }); registerCallback<0>(p); p.setDefaultValue(8.0); p.setParameterValueNames({}); data.add(std::move(p)); } // Sample Rate Reduction { parameter::data p("SR Reduction", { 1.0, 32.0, 1.0 }); registerCallback<1>(p); p.setDefaultValue(4.0); data.add(std::move(p)); } } }; }
  • Loading wavetables by drag-and-drop takes a long time??

    8
    0 Votes
    8 Posts
    222 Views
    OrvillainO

    @dannytaurus said in Loading wavetables by drag-and-drop takes a long time??:

    @Orvillain Weird. I'll try it out here again and see if I get the same result.

    Is yours a standard mono, 'power of 2' file?

    Yeppers.

16

Online

2.2k

Users

13.6k

Topics

118.1k

Posts