• From HISE to Cabbage Audio (CSound) to VCV Rack

    General Questions
    2
    0 Votes
    2 Posts
    42 Views
    d.healeyD

    @ClawFORGE-Studio said in From HISE to Cabbage Audio (CSound) to VCV Rack:

    how do you export a Hise project into csound ?

    It's not possible as far as I know

  • 0 Votes
    3 Posts
    34 Views
    VirtualVirginV

    @Christoph-Hart Thanks!

  • MusicDSP.org importing?

    Newbie League
    5
    0 Votes
    5 Posts
    90 Views
    HISEnbergH

    @Orvillain Actually I would argue it's a very good way of learning about DSP theory if you are already familiar with coding. I'd agree that you wouldn't necessarily get great results inside scriptnode but as a pure learning experience it can be very valuable (for envisioning the signal processing structure). I used to do this all the time in Max MSP (take block diagrams and convert them to Max patches).

    But you're other points are totally on the point. You might as well jump straight to hardcoding these in code if you're already there. Personally I've dropped environments like PureData and Max at this point as I prefer working directly in code.

  • Midi Player - Playlist

    Scripting
    5
    0 Votes
    5 Posts
    565 Views
    M

    If you’re organizing or importing playlists for a MIDI player, MusConv can help by transferring your playlists from streaming platforms like Spotify or Apple Music into local file formats (like CSV or text), so you can easily load them into your MIDI setup.

  • 2 Votes
    9 Posts
    119 Views
    OrvillainO

    So on Windows the original solution did not compile. I had to figure out what was going on. The central issue was that the 'Self' reference we setup before was not accessible at the stage that MSVC wanted during compile.

    So the solution. All of the following happens inside the node struct:

    Remove this: using Self = BBDProcessor<NV>;

    We simply don't need it now. Also remove the kSpecs array that exists inside the node class - probably best to copy it to another file for now.

    Update our ParamSpec struct so that the apply method takes an instance of the node class: struct ParamSpec { int index; const char* name; float min, max, step, def; void (*apply)(BBDProcessor<NV>&, double); // this line here was updated }; Establish some statics: static const std::array<ParamSpec, 1>& specs() noexcept; // <- size 1 for now static constexpr int paramCount() noexcept { return (int)specs().size(); } static constexpr size_t kParamCount = 1;

    The first line defines a compile time static function called specs() - this is linked to an array type, with the data type of our ParamSpec object. We also need to tell it how many. I've gone for '1' in this example, but in my full node it is '71'.

    The second line defines a static helper function that essentially returns the size of specs().

    The third line sets up a constexpr for paramCount - essentially the same thing as our size. This specs() function will be further defined inside of the node class later.

    Then we need to adjust how we create the parameter. So back to this function:

    template <std::size_t... Is> void createParametersImpl(ParameterDataList& data, std::index_sequence<Is...>) { ( [&] { const auto& s = specs()[Is]; parameter::data p(juce::String::fromUTF8(s.name), {s.min, s.max, s.step}); this->template registerCallback<Is>(p); p.setDefaultValue(s.def); data.add(std::move(p)); }(), ... ); }

    This is very similar to before. But we get a reference to our specs() object, assign it to s. This becomes the parameter source. Is is still our compile-time iterator.

    Now we want to adjust how we set a parameter: template <int P> void setParameter(double v) { static_assert(P < kParamCount, "Parameter index out of range"); const auto& spec = specs()[P]; jassert(spec.apply != nullptr); spec.apply(*this, v); }

    There's an assert to catch whenever our parameter index goes out of range - ie; when adding extra parameters, did we update the ParamCount? If not... go back and do it, idiot. (speaking from experience!!)

    We get an instance of specs() and assign it to spec. But since we're indexing with the template parameter, the compiler knows which parameter we're looking for inside specs. We also assert if the particular parameter we're working on right now doesn't have an apply method associated with it.

    The key bit is spec.apply(*this, v);

    This is a function pointer that looks in our parameter table for the relevant callback.

    Now... at this point, we don't actually have a set of ParamSpecs anymore.... so we need to do that.... but it CANNOT be inside of the node's class. It needs to be its own separate struct, but still inside the project namespace. So at the bottom, you can add something like this:

    template<int NV> const std::array<typename BBDProcessor<NV>::ParamSpec, 1>& BBDProcessor<NV>::specs() noexcept { static const std::array<ParamSpec, 1> tbl = {{ // --- Core Delay --- { 0, "Delay Time (ms)", 5.0f, 10000.0f, 0.01f, 500.0f, +[](BBDProcessor<NV>& s, double v){ s.effect.setDelayMs(v); } }, }}; return tbl; };

    So this is a templated static function. Each instance of BBDProcessor (or rather, our nodes struct) gets its own version of this. Which is fine, because for our node, we only want one set of this anyway. If we use two nodes in parallel, each will obviously get its own internal set of parameters.

    const std::array<ParamSpec, 1>&

    This bit sets up a reference to a compile-time fixed size array, with the data type ParamSpec. All told, we're basically overriding the specs() function inside of the BBDProcessor struct (our node class).

    The rest of it just constructs a table of parameters much as we did before, but it returns the table at the end. So specs() inside the node class becomes a version of the table.

    Note the changes here:

    +[](BBDProcessor<NV>& s, double v){ s.effect.setDelayMs(v); } },

    No longer using self as the type for s. Instead we're using the node class as the type.

    This all happens at compile time, so once you have it plumbed in correctly, you don't really need to worry too much about anything except getting the table correct, and the param counts correct.

  • Dynamic reassignment of effect slots

    General Questions
    21
    0 Votes
    21 Posts
    186 Views
    DanHD

    @Christoph-Hart said in Dynamic reassignment of effect slots:

    https://docs.hise.dev/scripting/scripting-api/userpresethandler/index.html#updateconnectedcomponentsfrommodulestate

    What if the controls are not connected by Parameter ID etc but via scripting instead (as lots of mine are as they do more than one job...)

  • 1 Votes
    15 Posts
    133 Views
    dannytaurusD

    @modularsamples said in Recreating Roland Alpha Juno PWM Saw oscillator - ideas?:

    @griffinboy Good point!

    What about this? it should be pretty close to how the AJ works (I think) as it's splitting the signal and "chopping" the output of the saw. The PWM still happens on the pulse..

    HiseSnippet 2170.3oc6Z0CaibbEdVRM5+KN14rgSQ.HBRw4fCBj5uyBo3n90VHG0QHJqjq5xvcGRNf6tylcWJIlf.b.oIcIsFHEtxUAHAoKEA45R.xkBCi.jJiz3B2cEI.oy9Myrq3rjKEonH44CWj.DzNuY1468226MCYYetIMHf6iLV7j1dTjwx3JscCaraCByEc3dHir3yQ6z1iDDPsPFFYeOg.iElAI+442eGhMw0j1YHD5TNyj9.lCKrynkK9CY11GPrnmvbzl85EOzj6tK2l2xWrY4QdDylj5ziHhokAideRPCjw2Gug4VaZZUcqplVadupqs0FEJrV97qs9ZE1vZMR002vZqUWkr4VHiY22hEx8qDRBoAHiY1ga0tRC94tpM3TV.qpMU7PATEXmUCe.21RnhhQQ61fYaUN15DfPF3xcrUYU1paiKwrXWNdGa12TJHWmUna.MxjDdYS.uB5vKuF7RARFZPZFEjdcbESelWXGIB7rD9P2PpeMB3mzghZtHimh2kCSvMbEGRS5A9vCWtf6rY972MG7m24GTqkqYHi6li6dDOj9P267NK9yWbgE+EKlqaQ0pkpLw13ysso9oJVDZ3eUK7NtsbpR8uatyH1snWNQP8SZSw82lp6xMUZs1D4tG5xBenG0seABnHSE7eevg6QBIBGQzXv77n9gLADL1idFjFnbKKf2iFzLj6AIB83yfnEtUKaRXxPHQhVj.vFjvuIbNtArv15Ihis3pgEhuNtLKzrQ5XLSJXDrTSBLFkMdK790pQMC6.vYvG7imLod5a+BwauJaRReJ29uczHtbKZN4vz.V.0uP+3S+2+9+4ecX4S8FZ9z3j76huNITyNRITIiY0l+COi5eFiddGR1TYzlcRQxNyv4ou5Z.uDj6lnlvBwXrBywyltu6YTaffRhw2.XjpQZYGFOZxnxRbWtWCtKyTOP7XZnOqdcpuN1SUg1NLDJi2YjaW7XpMkDnEo98J9.lKk3C1I5HZKJbsqOlp+5swJ3lSjJk6l32lpgYWI+a1gh+cri2QmKdpZ5lGu+Eg9jBCph0KXObDLW8EELOl2Jj4VuDAR6u.JBbTKmJPcESJ.QWWpsnvfQFQOQpmyKdV.nJTWK4CeI7SjvBhmMhDVHVnV6TGQCOm62Tl4F8+fIPXGlCGPNe6Rnsss4muK2wiEEvCwQxwJysaGSWYjQMiXPtsCuE79iPZmrkcr4lMqv9YzXPCGz3DByV7FpzJ.ZAz5gtUf2irZrQ1So9Ax8bNb9UfegjoijTWye.wDL8sKSfB+PVonqRvCR8Ww7ROYrFnmAnNgSrDw6JtrsBOfZ3HrLhCAIbkkI9vJf1xEcWlI10AYRY056Tw5IdBhOxH15kwGFbpPpIwFcpnLuX4x8SL8rJkXNwT+F3ZhsX0GWUXaPIzq2VSuRLqdUotdMWslMtziHmwrhot.1qAAhgWMoJbKPE7oqnjkBtmOZYC.wFYzwIRys.4cW9Dbh5RL2Hb1gAtD4htF642uRH0SEHpMVSnYII3STqETtYgtKBonSnWDdBW9tfTHn8J4dtD9Cbsn0.ujE.r5pSPWoU02ym2xS9PO6dTe.8LN5pUk0K1ip7q9zhcoJezG9g+odUkh+Rm+w8UmK8.e5OsEjg0dLoOOoYwT0GX7AnOO+985ZxW754ZVVpO4NVvu7B2AMrwZ.gbeUn4vkaHZZaLoKHT55hf7uCKDvH5YCm0ouzpJwoRkJkLZDNoxjLGVwgO.J9zvhRx.nRtQTdFZ.cVb8dv4RJ9t5oivnUL5bcY0h+Vd3h+d2gif3o0+CuYwXtN.iS7vusaExc.V0nFrj6fzTc8ywJ9qGNc7m7s16SiHAq3v4gMfFslzJ55ChD7QOsWeFvObs7YKiOlFPi15wjB8nm1WhC8PRcVj4UIfElTotiq9VlUCyKhc3VoP3baMTe4L5E3ZKe5fcbBBHvO3kJAjTPZDPRACf.ZlDDPcZe+DhecZn5BYE2twEw2E6dLnJ.o8NsfSfptFfDiHzLH36h3CfruSUpEXMjKO9PI8kmq6bFYtvHyAn03PYpOiaIuKuwPNy+6Sd1uyJ8NgPOp3TnwgkvOfy8fSi5GNEZdXxqOSslt0xnvXOVWzWKfgpTMVwikR5jZ5id4bioQ6ji0pB8yLhJlzLFzMe5hJyXPprnp4+pjcDUbXriyg8njlERkgWHI0JopkbSo3ke.atTS0c9H6O+PKYDuCoiwWLTrkYRWTPuSCEL54lFje9JqHDkZtJL9HdNkg2.MmrE+BIMQQ8T2+ZbK8xQP6v0LO5pUrm+Wt4J1h3R.LXd1sm70G5qts7jwogwaaY80hye0IoKpcyZPytcSFIo0kBRqcSofwCw9W2yQNwe8u3K+6e1PFGkfkudumZ5E6EIj1My89WyFrGiWj.qVsLoTv7IYQnbE0ic6at5KGWjvS9jm8ruawWctHgjmkEpklJ4hTPpmkUH3+28culRYugWilFiVwDpmwHxpT6HZ5zyX78JaSI9IsKKqBwTRR8dojRdk5nIng6h+5+CZF8agc3t7UC.ITdRS+anBI0k2qCH45GY2fNj.WNyhk1MU9l524W7bRATK04ML09vFdMLOvjYaC+U9MGJAveKLwkX2Nfth9jR8iINwDtNferlpBu8gLXJQmJyMoRf1sA2KnShvi9a67V+wey+purs5DcWEumr62zOr7zPq9QLKH53xWy+8iu2e9KJ8Q2PsJka.PchEcUZ9Iyw9vhaauiB8a+r+yGeuuym2WEZvDhirJqc.TzNbdSGh7aQyn88SdZ7c9wgX5yebzUjHT04ki.4WtRlgEvkDOmq.5rtMiBxtGaZl7U0yBWcTW3Zi5BWeTW3Fi5B2bTW38F0E9tCdghuRtQm6QD1BTGk2WwxZruKopczo5+J38.PLC

    This is a pretty good read once you get past the flame war:

    https://www.kvraudio.com/forum/viewtopic.php?t=420194

    Yeah, I read a lot of that thread. Pity about the flame war! 😂 🔥

    The snippet sounds awesome! Great starting point for me to learn how all this stuff works.

    Thanks! 🙏

  • Range (min/max) of an attribute of an effect

    Unsolved Scripting
    12
    0 Votes
    12 Posts
    72 Views
    Oli UllmannO

    @d-healey
    That's right. Because with SlotFX.getCurrentEffect(), you always get the effect loaded in the slot. So you could also implement it in the effect class and still have access to the functionality from a slot.

    So I believe... :-)

  • SlotFX.getParameterProperties() gives back undefined value

    Bug Reports
    7
    0 Votes
    7 Posts
    42 Views
    Oli UllmannO

    @d-healey
    Great, thanks. I'll see if I can learn something... :-)

  • Calling an Envelope on a Timer

    Newbie League
    3
    0 Votes
    3 Posts
    59 Views
    ulrikU

    @Unversed said in Calling an Envelope on a Timer:

    Hello!

    I am new to HISE, and I have an idea for a "pumper" style effect that I just can't figure out.

    I want to create an effect that essentially triggers an Envelope on an adjustable tempo-based timer. It isn't revolutionary, but it is an interesting effect I would like to use.

    Hi and welcome!

    I've attempted a few iterations of this concept, but I end up getting snagged at the end by something I didn't understand about the fundamental program (LFOs not exporting with Effects was a big one), so I figured I would ask here before I spend some time on the next iteration.

    Is the LFO triggered by midi?
    In that case, not all daws let FX plugins to read midi, that might be the problem

    With the Envelope approach, I can't seem to figure out how even to get an Envelope onto the Master at all. Do I need to create a separate container? Through scripting, does it even matter where the said Envelope is, as long as I can call it to run and push its value onto the gain?

    Anything would be appreciated, thanks :)

    Could you provide a snippet of what you have tried?

  • Display slider value with custom font, size, and position

    Newbie League
    6
    0 Votes
    6 Posts
    64 Views
    YinxiY

    @It_Used wow thanks that’s awesome ! I’ll be able to dig into all of this.

  • Panel Callback with fx

    General Questions
    11
    0 Votes
    11 Posts
    51 Views
    elemen8tE

    @HISEnberg alright got it! Never worked with the autocomplete, but seems like a grea idea :D

  • Reference External C++ Node as Audio Sample script - is it possible?

    Unsolved Feature Requests
    11
    1 Votes
    11 Posts
    129 Views
    HISEnbergH

    @Christoph-Hart I'll try it again but last time I tried it failed to compile. The recorder node is more or less what I am after though. There's a number of features my node possesses that aren't featured here like playback speed, reversing, etc. But I should study this node and see if I can't replicate it.

  • [Feature Request] Quickly open files

    Feature Requests
    8
    0 Votes
    8 Posts
    134 Views
    D

    @daniloprates said in [Feature Request] Quickly open files:

    hi_scripting/scripting/components/ScriptingCodeEditorHelpers.cpp:117

    Ops, line 717, not 117

  • The big bug tier list

    Bug Reports
    72
    9 Votes
    72 Posts
    24k Views
    It_UsedI
    Envelopes in the scriptnode modulator - not recive Midi CC messages.

    How recive midi cc events in scriptnode envelope mod? I has been add a Flex AHDSR, but this is no recive midi cc messages. i tried a more methods for a day, but i didnt take a resault.
    Without scriptnode, build-in envelopes has recive midi cc messages...
    i use it in sampler gain modulator, use it with sustain pedal, if i use midi_cc node - this is working, progress slider on this node - changed while i press/release my sustain pedal, but if i press pedal - any envelope do not apply sustain on sound.
    https://github.com/christophhart/HISE/issues/782

  • 12dB lowcut?

    Newbie League
    3
    0 Votes
    3 Posts
    71 Views
    C

    So, I took two SVF with 12dB/oct each and put them behind each other.
    I've set the resonance of both to 0.707 as I read this would be a neutral position
    and that's what it also looks like in HISE GUI.

    When I check the VST it gives me -22.x dB/oct, so that's ok.
    But at the cutoff frequency where I would expect 2x -3dB = -6dB, I have around +1dB!
    As if there was a resonance boost.

    So I made a version with resonance set to 0.3 - the lowest setting possible and I still
    get +0.4dB instead of -6.

    Any idea what's going on?
    Or is it wrong to expect -3dB at the cutoff frequency of a SVF?

  • callWithPOST change content type

    General Questions
    19
    0 Votes
    19 Posts
    248 Views
    d.healeyD

    @Christoph-Hart I think the first one is the safest option

  • Setting analyser colors when source is a parametric

    General Questions
    4
    0 Votes
    4 Posts
    55 Views
    ChazroxC

    @pcs800 can you screenshot your property editor for your analyzer?

  • Bypassing scriptnode Bypass node via knob

    ScriptNode
    7
    0 Votes
    7 Posts
    90 Views
    ILIAMI

    @ulrik Awesome, thank you so much

  • Moonbase

    General Questions
    15
    0 Votes
    15 Posts
    461 Views
    HISEnbergH

    @tobbentm This looks like excellent work and sounds very promising. Please keep us updated when you integrate JUCE 6 compatibility. Would really love to see a HISE-example integrating Moonbase as well for us here to test out when it's ready :)