• Hardcoded Polyphonic FX - Filters - some observations.

    5
    1 Votes
    5 Posts
    445 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
    1k 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
    3k 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
    500 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.

  • 0 Votes
    26 Posts
    3k Views
    OrvillainO

    @Christoph-Hart

    It's like this ..... I have an external arppegiator triggering my synth... I click my left/right arrows to change preset.... and because I use a custom data model, I have to tap into the pre/post callbacks.... so here's what I get:

    synth notes triggering.... click the arrow....
    Interface: preLoadCallback triggered - no synth notes triggering when this is running
    Interface: onPresetLoad triggered - no synth notes triggering when this is running
    Once the onPresetLoad method is finished, a midi note does sneak through into the synth....

    Then this callback fires:
    Interface: postLoadCallback triggered
    This kills the previous notes, and triggers the new ones.....

    Here is my full loadGlobalPreset method:

    inline function loadGlobalPreset(obj) { local samplemaps = obj.samplemaps; local wavetables = obj.wavetables; local params = obj.parameters; local fxSelections = obj.fxSelections; local fxChainOrder = obj.fxChainOrder; lastLoadParams = params; // Restore samplemaps UISoundSelector.syncSamplerMenu(1, samplemaps[0]); UISoundSelector.syncSamplerMenu(2, samplemaps[1]); UISoundSelector.syncSamplerMenu(3, samplemaps[2]); // Restore wavetables UISoundSelector.syncSynthMenu(1, wavetables[0]); UISoundSelector.syncSynthMenu(2, wavetables[1]); UISoundSelector.syncSynthMenu(3, wavetables[2]); // Update all UI parameters - except the ones that are not tagged as saveInPreset UserPresetHandler.updateSaveInPresetComponents(params); // TODO: Restore custom samples // Fix-up FX menus by stable id, but only when they differ if (isDefined(fxSelections)) { for (i = 0; i < fxSelections.length; i++) { local sel = fxSelections[i]; if (!isDefined(sel) || !isDefined(sel.id)) continue; local targetId = (isDefined(sel.idName) && sel.idName != "") ? sel.idName : "empty"; local menu = Content.getComponent(sel.id); if (!isDefined(menu)) continue; // what saveInPreset restored (by index) local currentId = UIEffectDropDownMenu.getIdForIndex(menu.getValue()); if (currentId == undefined) currentId = "empty"; // only fire callback if mismatch if (currentId != targetId) UIEffectDropDownMenu.setMenuToId(sel.id, targetId, true); } } // Restore FX chain ordering (pageKey -> [4 slots]) if (isDefined(fxChainOrder)) { for (k in fxOrderKeys) { local key = fxOrderKeys[k]; local saved = fxChainOrder[key]; // expect an array of length 4 with unique 0..3 if (!isDefined(saved) || saved.length != 4) continue; UIEffectReordering.pageOrder[key] = saved; // update UI state UIEffectReordering.applyVisualOrder(key); // move panels PluginEffectReorder.apply(key, saved); // set DSP chain } } // Update all UI parameters - except the ones that are not tagged as saveInPreset //UserPresetHandler.updateSaveInPresetComponents(params); }

    It is doing quite a lot... and ultimately what happens is when I switch a preset, I get one voice that sounds one way... and then another voice that sounds completely different... like a voice is being allowed to be triggered before the preset is fully loaded.

    It seems to be something related to my effect menus and/or effect re-ordering.

    It is hard to explain. Might have to make a video. But any immediate thoughts??

  • Change preset browser “Row name“ in the core base of Hise.

    1
    0 Votes
    1 Posts
    86 Views
    No one has replied
  • VS 2026

    24
    0 Votes
    24 Posts
    2k Views
    GabG

    @dannytaurus weird then, I'm not sure why it happens. I'll leave my setup, I added MSVC V143 in the list compared to the default settings.

    VS2026Setup.png

  • Stock Table Upgrade?

    45
    1 Votes
    45 Posts
    6k Views
    ustkU

    @Christoph-Hart Considering my post right above about the issues and limitation of the scriptnode table, could the upgraded UI table be ported to scriptnode with at least a default behaviour if a customisable one isn't convenient to add?

    Linking a UI table for each one we want in scriptnode is not really an option so much it is cumbersome during development...

  • Sample Map XML recovery??

    5
    0 Votes
    5 Posts
    274 Views
    dannytaurusD

    @l4ch If you're on Mac, try opening the XML in TextEdit then go to File > Revert To... > Browse all versions.

    It might have some version history saved by macOS that you can restore from.

  • Export Setup Wizard Issue

    26
    0 Votes
    26 Posts
    2k Views
    D

    I’m so absent-minded 😰 The issue was that I forgot you need to enable compilation in the main container. Thank you for your help, guys! @David-Healey @Christoph-Hart @dannytaurus

  • I am unable to get an AudioAnalyser to display in a floating tile

    9
    0 Votes
    9 Posts
    1k Views
    D

    @Chazrox Hey everyone, I am currently running into the same issue with this setup. HISE crashes on Index 1 or 2, but works fine on Index 0. Even on a fresh project.
    Did you anyone of you get this running the with other options? Would love to incorporate an oscilloscope into my plugin :)

  • Samplerobot Loop Points

    18
    0 Votes
    18 Posts
    5k Views
    B

    @Christoph-Hart

    Hallo Christoph ;)
    grüße aus Österreich :)

    I was thinking about doing a little python script that creates the loop point meta data Hise needs for user samples. TBH i have never looked that much into your sample engine. Are there any specific metadata that hise needs? Would such a little project help the community ?

    cheers

  • Needing a windows user tester

    1
    0 Votes
    1 Posts
    361 Views
    No one has replied
  • Hardcoded master FX - Knobs with filmstrips not working

    Solved
    5
    0 Votes
    5 Posts
    1k Views
    VorosMusicV

    @David-Healey ahh, no they don't
    this might be the issue (I'll try)

    Okay, it's working now!
    Thank you!

  • Polyphonic Hardcoded FX - filter fx - nasty noises.....

    2
    0 Votes
    2 Posts
    392 Views
    LindonL

    @Lindon ok more investigation..it really doesnt matter what you attach the LFO to its making nasty noises in the audio stream.....

  • This topic is deleted!

    2
    0 Votes
    2 Posts
    11 Views
  • Compile DSP networks as DLL keeps launching Export Setup Wizard

    5
    0 Votes
    5 Posts
    1k Views
    V

    @David-Healey said in Compile DSP networks as DLL keeps launching Export Setup Wizard:

    @versusjona Yeah it's super annoying. We're waiting for @Christoph-Hart to remove it.

    Close HISE Find the HISE app data folder on your system, in there find compilerSettings.xml and open it in a text editor. Add <ExportSetup value="Yes"/> below the <EnableLoris> entry. Save the file Reopen HISE

    Thanks a lot for the quick reply, that did it!

    Cheers,
    Jon

  • Broadcaster Events - Looking for mouse scroll / wheel

    6
    1 Votes
    6 Posts
    481 Views
    DanHD

    @David-Healey @griffinboy @ustk Claude Code has done it :)

    Whether it lives up to Christoph's coding standards we will have to see, but I did have the new Agents.md doc in the repo so hopefully Claude referenced that when making changes....

  • This topic is deleted!

    1
    0 Votes
    1 Posts
    6 Views
    No one has replied
  • HISE pitch shift node introduces 100-200ms delay

    8
    0 Votes
    8 Posts
    707 Views
    HISEnbergH

    @Straticah yup checkout @resonant ’s link, someone already calculated the latency for you. So you just need an if/else statement to set the latency based on the octave amount.

6

Online

3.0k

Users

14.0k

Topics

121.7k

Posts