• Coming over from Kontakt? Read this!

    Pinned
    8
    1 Votes
    8 Posts
    6k Views
    LindonL

    @d-healey said in Coming over from Kontakt? Read this!:

    @Lindon They live inside Kontakt's sample map too, it's just that with Kontakt there is only one sample map and it's part of the NKI.

    I think the main different between Kontakt's groups and HISE's is that with Kontakt you can route them individually and apply effects and other processing to them individually which you can't do in HISE (yet...?).

    In HISE the routing and modulation is at the sampler level rather than the group level.

    Absoloutely - valuable stuff to include - I guess I was thinking inside a group you see a mapping of sample audio files, inside a Sample Map you see....so (to start with) same same...as a starting point. But hey no problem.

  • Absolute Samples - Windows 11

    Unsolved
    4
    0 Votes
    4 Posts
    19 Views
    David HealeyD

    @HISEnberg said in Absolute Samples - Windows 11:

    Yea you can write a bash script to fix this.

    Seems like overkill unless you have a lot of sample maps. You can open the xml in a text editor and use find/replace.

  • 8 Votes
    13 Posts
    130 Views
    J

    @bendurso i setup a mock moonbase storefront on my squarespace website,
    but i was curious about the JUCE module that can work with License activations, which i think only works with juce 8?

  • Asset Manager

    11
    0 Votes
    11 Posts
    154 Views
    HISEnbergH

    @Christoph-Hart Looks very promising. The setup seems straightforward enough (the robot maybe generated too much text description). Happy to throw some FX Libraries and HIsescripts at it if you need some beta testing before launching. 😁

  • What does this above value means

    2
    0 Votes
    2 Posts
    32 Views
    dannytaurusD

    @NISHI_MUSIC It means "minus infinity".

    Since LUFS are measured with 0dB at the top, and all the values are negative values, the 'bottom' value is negative infinity.

    You see it when there's no signal present to measure.

  • JUCE error while exporting VST

    17
    0 Votes
    17 Posts
    116 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
    34 Views
    ChazroxC

    Epic!

  • Crash when clicking Parametriq EQ1 in module tree

    1
    0 Votes
    1 Posts
    26 Views
    No one has replied
  • Mac installer for audio sample libraries best practices?

    32
    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.

    8
    0 Votes
    8 Posts
    77 Views
    lijas90L

    @svkpowa thanks!

  • how can i create a sin lfo in scriptnode

    3
    0 Votes
    3 Posts
    38 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
    124 Views
    David HealeyD

    @ustk Nice!

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

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

    7
    0 Votes
    7 Posts
    75 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
    38 Views
    DanHD

    @ustk Sexy, thanks!!!

  • Handling Latency for Delay-Based Modulation Effects

    2
    0 Votes
    2 Posts
    69 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
    218 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
    136 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
    408 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
    628 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)); } } }; }

45

Online

2.2k

Users

13.5k

Topics

117.3k

Posts