• Coming over from Kontakt? Read this!

    Pinned
    8
    1 Votes
    8 Posts
    3k 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.

  • Roadmap to HISE 5

    134
    27 Votes
    134 Posts
    4k Views
    Christoph HartC

    @griffinboy yes good idea, and yes the C++ API documentation is seriously lacking, but one thing after the other.

    I've just made a small example - a C++ node that wraps a pitch_mod node and a core::oscillator and then uses the API to pickup the pitch modulation from HISE and apply it to the oscillator frequency. This shows how to pickup modulation signals from HISE and use them however you like - using the core::extra_mod class works the exact same way.

    This can be easily rewritten to a template that you can feed any sound generator type into to pickup the pitch modulation.

    template <int NV> struct osc_with_pitchmod: public data::base { // set this to false and this class will use audio rate pitch modulation instead of the downsampled resolution. // This comes with a little overhead because it needs to resort to per frame processing in that case so it's disabled by default. static constexpr bool UseControlRate = true; // This can be any C++ oscillator class that follows the scriptnode API // The only requirement is that it must have a setPitchMultiplier() method // which will be used to set the pitch ratio accordingly. using OscillatorType = core::oscillator<NV>; SNEX_NODE(osc_with_pitchmod); struct MetadataClass { SN_NODE_ID("osc_with_pitchmod"); }; static constexpr bool isModNode() { return false; }; static constexpr bool isPolyphonic() { return NV > 1; }; static constexpr bool hasTail() { return true; }; static constexpr bool isSuspendedOnSilence() { return false; }; 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; // Scriptnode Callbacks ------------------------------------------------------------------------ osc_with_pitchmod() { // we want the pitch mod to copy the pitch modulation values // to our temporary buffer so we can apply it to the oscillator pitchMod.setProcessSignal(true); } // now we just forward all callbacks to both objects void prepare(PrepareSpecs specs) { osc.prepare(specs); if(UseControlRate && specs.blockSize > 1) { specs.sampleRate /= HISE_CONTROL_RATE_DOWNSAMPLING_FACTOR; specs.blockSize /= HISE_CONTROL_RATE_DOWNSAMPLING_FACTOR; } pitchMod.prepare(specs); // make sure that the pitch mod buffer is initialised // to the correct size specs.numChannels = 1; FrameConverters::increaseBuffer(pitchSignal, specs); } void reset() { pitchMod.reset(); osc.reset(); } void handleHiseEvent(HiseEvent& e) { pitchMod.handleHiseEvent(e); osc.handleHiseEvent(e); } template <typename T> void process(T& data) { // create a ProcessData<1> object with our temp buffer // as data and feed that to the pitch mod so that it // copies the pitch modulation values coming from HISE // into our buffer float* pd[1] = { pitchSignal.begin() }; auto numPitchSamples = data.getNumSamples(); if constexpr (UseControlRate) numPitchSamples /= HISE_CONTROL_RATE_DOWNSAMPLING_FACTOR; ProcessData<1> pitchData(pd, numPitchSamples, 1); pitchMod.process(pitchData); if constexpr (UseControlRate) { // now we chunk the buffer into blocks of 8 (default control raster). // this is essentially the same as a container::fix_block<8> container. ChunkableProcessData<T, false> cd(data); int pitchIndex = 0; while(cd) { auto numToSlice = jmin(cd.getNumLeft(), HISE_CONTROL_RATE_DOWNSAMPLING_FACTOR); jassert(numToSlice == HISE_CONTROL_RATE_DOWNSAMPLING_FACTOR); auto sd = cd.getChunk(numToSlice); jassert(isPositiveAndBelow(pitchIndex, numPitchSamples)); auto pitchRatio = pd[0][pitchIndex++]; osc.setPitchMultiplier(pitchRatio); osc.process(sd.toData()); } } else { // otherwise we use frame processing to iterate over each sample // and before calculating the next oscillator sample we // update the pitch ratio. auto fd = data.template as<ProcessData<2>>().toFrameData(); int pitchIndex = 0; while(fd.next()) { auto pitchRatio = pd[0][pitchIndex++]; osc.setPitchMultiplier(pitchRatio); osc.processFrame(fd.toSpan()); } // copy the left channel to the right one. data[1] = data[0]; } } template <typename T> void processFrame(T& data) { span<float, 1> pd; pitchMod.processFrame(pd); osc.setPitchMultiplier(pd[0]); osc.processFrame(data); } //SN_EMPTY_HANDLE_MOD(); // SN_EMPTY_SET_EXTERNAL_DATA(); // now this is important: you need to define this method and forward it to any // member that connects to a HISE modulation chain for the pitch modulation to work! void connectToRuntimeTarget(bool addConnection, const runtime_target::connection& c) { pitchMod.connectToRuntimeTarget(addConnection, c); } template <int P> void setParameter(double v) {} void createParameters(ParameterDataList& data) {} // this is the pitch_mod node that picks up the pitch modulation from HISE core::pitch_mod<NV> pitchMod; // this is our oscillator. You can plugin any other class that has a // setPitchMultiplier method (where the pitch ratio is being applied. OscillatorType osc; // We'll "render" the pitch signal into a separate audio buffer heap<float> pitchSignal; };
  • Best Practice for Managing Dynamic FX Chains with UI Buttons?

    3
    0 Votes
    3 Posts
    34 Views
    HISEnbergH

    @jhonnmick Lindon is right, you will want to spend most of your time looking at the SlotFx API.

    I've shared one template on how you might handle this here:

    Link Preview Image Modular FX Template - changing Fx order with drag and drop panels

    Modular FX Template Every now and again I see a user posting about how to rearrange FX networks and a new method crossed my mind on how to approach it. This ...

    favicon

    Forum (forum.hise.audio)

    it's fairly recent but may be outdated now, as the most recent update of HISE contains a dynamic container which is well suited to this task. If you pull from the recent developer branch on github you can experiment with this (I haven't yet).

  • Polyphonic FM: problems and questions

    7
    0 Votes
    7 Posts
    86 Views
    griffinboyG

    @Christoph-Hart

    The core:extra mod node can pick up on FM modulation data? Is it polyphonic?
    I haven't used this node before!

    Thanks for your response, I agree, it's certainly a fiddly routing scenario.
    Part of me wants to completely write the sampler and everything else in the project from scratch so that everything is custom c++ and can be routed by hand.

    However, I'm working with Dan on a project where he needs to use the built in Hise sampler because he's made a ton of monolith and sample map files for the hise sampler...

    So my task is to figure out how to play nice with the hise modules while supporting FM between the custom stuff and the hise stuff 😬

  • MIDI Player overlay panel LAF

    7
    0 Votes
    7 Posts
    104 Views
    R

    @HISEnberg Yes I'm using a custom script

    note.setTransposeAmount(note.getTransposeAmount() -12);
    and
    note.setTransposeAmount(note.getTransposeAmount() +12);

    I have tried editing the min & max note values but it didn't untether the bottom note. I also tried manually editing the noteRect variable but it just smushed everything together.

    Here is a snippet, hopefully it explains it better than I did.

    HiseSnippet 6790.3oc67jzbiicdTcOr8HX2SM1kqT1NUpBVIkC0ndPCtHtjI1s.W.IkHEWkDklLYL.3CjfDD.BKbQS0U4JmxeAeyGxOfbM2l+BoRprbKUkSoxk4VtEmu26APBRQsLsaOochYMCEdaeuu8k2inaZapfbbLsirytcWXghry2IZmEFtCKLTRyHR0hQ146FsiglkExkcJx1QyzHR9EVRNNn9Q1YmmVFOsc188hP97UuJujtjgBZUWQhbtolBpl1DM2U817nSzz0Ek5i5pMIzrScTUESiBl5ld.J8zn7QrjTFKM.cpDdZOIZjcdVo9Ztl1cbkbQNQ148xa1eQmglyLny+bMGMYcDtQ7Hc..Q6VzTuOFiw8FovPM89MCHcmHQ1IZyULhmRYDe+n005qsr+ULjOjL.6pUDlerySVG8d5ZnW7vnGeHzaKnzNgPo2ihRfnPwVyxc0HX74aGspgKxVUBX6gQE5bi7j+0eTzBlvLLb4lHMFIZCMVthXo44eAapC42+SXd4KYKChYIVajJxFAhQVWSV2gH15UKVk0JXWYkb76QWZAxlAjXNtjdncv9SYI5PbCPtqwCisGdR6sOmjCoexriA6Lr0cjlXoC.CPBGxirSjrXkrskV7x9HUMCMWP2yeulJY6Oq5RVN38itZ7N1In+ZZNt9.GSQ9KvNDH7WU7vHLQPPZEaufw2yGJJlSjMYkMmyZYZ4oCRX1YZtCANCxA45bKHCHQGXBJCgMHPDf2ByIVlFPifcX47vazFcwAPN1dZtnIN68hPDM2HSMiX68WXr299XmtoT+v7NYIPQf0zfsusoEaePEjUYnoCxf8iYaWp0YUaWpHilgtlAhU0yPAyegouw9iwaaS8XJAH8K.BT2CsOyWvra.CBDn9OFaeNLdrDHwVgweJYceb7OCv2WCn7ijifY.9HQAIccYvePr6BKobBhtIQVAhpPBEYPLrRKMP6TTSGsTUY0jKfWedy4wuSY2xYPTOV1ZcA1d3AUAalXyY0LXk2OzDk52uJLsXy4rQ.NAFi68EMa233RE594hMpUrT6WCj+xw3ln0mJr2hTaITuW4UHpGvRLkGSdoX4Ert1dH52vtrqkg9miYPE0bvqAiHfKPBe5tEegXJaWvsIhREYB86yhcGv9SX63BZqxdttfn.qV2FLcCZREOCrs5ZKYXYZ6l20.jOe51wEYWCLL2a+WvvdOetyEiwj81+yHxuXxXw25679rXdJfh0A2prNd1HhyRejE7cgXMLcASxofcHwQAd3.mE6JS0TvCW0nIoWPgQUR2gv9IPVvwQafAYcJT9EqhOuLv2rKfPNXLZIWhB4ay56FLS.2Ww8eMw4gftiIKrJBH6zsQSeng2EYveh4DfqHYufYcVvmF+y702cpGLk8VpBsE8zsfCaWUEvIPfvNanF39L.Wr0FL.hL0mxP7oLlc0MgmA4SezbPaXcLjizcC0U6BFwvfupJql6epCAVMqIbo+tvrqlZLeX8SY42mYW.avyWScyoxp4PDmfeVXJvx7Q+cIKAuFGfg3RhSpYL.2WHKP7ehgi6t6tuF9eDH2CsxwHjUH0I.OI.GKOhiQEBp63BYQEF7aHc3IRmywKLV7fc50L9TyRpOj7lwGO7oYSC8EPvSIE2.xehomCBS3J5ZJiAQQLrNtMRGgC2rOkO7iWxH10F45Yaf2ZFeNBXduBiC6QBFwmefmmutXH1cXd.Oy8RrDv7ZheJBUfCGXoAQrAsvWvRr0nFivVODAwMsLcHIXDXUIiFnYXfwQZbertMvvXM8HbBLMafPPJkLq6SE6vAqT1zGdw343ot3707Al6pfL30RyBJwsRZhlbjeFSqEZJOgazPwE7bTDGV+thPs4DwvY6f4LqGEPNyZusaVu4Ncul1vfNl5HNKab3j8nqhkPI91U95V3MC6glZeqCAoST2OFtOWCiqklBvOHBNd5ju.gTf4HtIrs3+f8jCxND1YNEd6SGveb7G73XQ4RAl.nyCHJo+A2t+8g7ohm.qvEJhRXB7T7F5Frp9XUr8XOf8NgW.ndM8OzuCSzp5dNCqC9cfBiHDtOo3ut6IvMEr2c36aqwr8PI2g79NRNYcUn++ktwA+NitwtecTNvdBdXUikBahhQPp40DDC4FZCL5N8Csw7.4+ywPTjDATx.oGb9DOmYShD6WFSksAu2fpYr.UyXC1+4LewyIJAC3TAHInqGycnlCdugb.GPOIBbV2zYQ+FBIzAz5PqpMtujqDV1ggAMvBFinyFSjX4IVZbqJPvx+1HfYYLvuLjOEpGG9u.r3Bs9Pon6upiJHsACAA1mEfSX3OQyfnI8SAssLg6WZte+7aRAMvg1I0zCpcD7lFg2lDceIU87kVL+3PXtlSoIVtK.86exOYIwwoiLF.Y49yfrlnKym25acwtz7JXE6uZ7PSMLS6TuIxjST.2.x17SBnffOqn75RPzSnYL+tdQH.DvqVtpk7E5pjlGyuq6ZUud0iqdBXifluB8n.56q.aIYKMA4BJiqlX.4zFjyqsqwewRb4iCnkvaKwBAqKQE6vR2TOXiIKMUBxyQVG0wBpZDlenU+RpDfhDfioMWKdvk6yRTL6K1.ngW1Z7hh1RyH.w4MVtCPgvLVo5EFAmCoUEnKv+YexsmfITgflgj9oTYXH8laO2YXKqfYjXyYbKzpMBenJXa6KWKaQUMZpjAheaL2caJy1Sjz0tA0mRCw1DUWI9Ye4Jcksf2KBXBgA3GwFKrZxGGRVt+8RYK0LAmP3Rowr3WP1iWP4PuHDndIvl.dQH8Dh+BkgXT0gcn4L1gP2r8AEApzlTF7s2QmgR8MmEdOw5iz8k9zs16GT.sT6a8QFfc+W1VpuFDFAGs.7vNWTLUZddQwWvFG70dH9LPwcxymqnPta478ihuU2uarMXenPDFnxw9K8nGKf09B1D3BAdrj.tNCbVTagTngjhwOWHUp3hYDKs+mvt4zv7+6AUhywS9ZK92d8FQIHXjkeQMqz6g5i0TjbMsWEpwZUkO2JJ2spJZePgcCl7mDrmgoxUwhwGnFsyD3vwv7H0gB8Bkmg6l4d4Pu7kSjL7fLEwU9QWPPbeLypFNsfPTvKXWqAOG+s0.VJReM9qmGtPPH6FCfS20rI1lL1F4iPPGbVN34fcg3mrv5UR1llYVCi.lVAhUVL5YqP8HQlAKYSfbg9HHcnhPYxtzv4qkTzWmbhv4guJcH9479e7O3Daz.R9wfTdCw7ZYauan48VLmG7AiooFaq4hPOulfb5Y1c2MSomju+t69ErKKEXSkF5eb3lMTCGHl4QXd6aJsxRxuJqcCrg.mOxjPD9trw44eKSpU1Quo1OqpuA1SrRMYOs8v24wlZ5DM76QylRQfhM6G8RlPUxgEcMfsGqhv.D5lCopt0w7qBfb+.aYX7c.ZeeKLlAIervEJhmXjcdu0ussn28ssE9x.UnEXDZhlFUMzbaXgLtqqHLheUI3KKzGqfo5RtWtOz+d4BNa6HZ8IWV252QQDBxu7tN+EEOJxl.5C7ADsFJBXdVzZllVar1He0qh7nPhuczkm29lfHyiZ6+dQ2rT+MgiOq4AfyGFc85B2BTNqZQHoO7Me5ypA1uEx1UCKY2oHZplBhdOn6FsHxYrKvV14CWVgHPrt9WbKc2E0Mk.WaC5pAZ.Xb34Qmfc.BPE.aj4q17+jiVrRrz7HRpGK6f8u5ngD6hUy+mcjOFRQmuG4Bga.dZAyThy3HAUNhuO8DISkMab9Do3irJHFdfTIxlIdxL4RjMz.I7GIQ5zo34SEgvS14zneAXCu2RExp826OicuP08uG9NN1qJ9XqgQ3IsDAKNyYWXZO1Am1NzO4xEXdMVhsjq8AO.W6ChR2hKfX9lytK11Qe5lrM6MYaeo8WO1V1rGlNa73GlXC1VxjYSvmhOYB9sw1.lV1jI7YakuS1157q3O.+xEM2cM4VtLYykNW5PHPxH6vDM9gGlgmOc1HSCb7rySCyqYtS6ici5eaUgXv+boPL3H+4Go4TG4J0Ln7RpmpvWeD3ZZG7TgPUSbbgcn5DoAv98GFcy6UDuSI3rLFDYcoVj72RYO0QN3y5PTRwk7yDA28OWU8e5UeMHL7MoEhv92PqSXaiFBcgR3t14QQV384sIY89es7uGxzHRXBL2QPYzXh3kX5BewvQdxMOIZbItl5dJiiyDWl9TBl3JzmRxDuO8oTLwQzmNjItJ8ozLwGPeJCS7gzmxxjPhST2yEEmIgL8oDLITnOkjIIraR8YUwsXRJSZ3XAIxXCMUHMmYZ1eFXkyjRhKujiCablTxzmRvjRg9TRlT8oOkhIEh9TV9rPEc3qfbnjMrb0M6V1Ch86xjZvZCLvyfI0vUcoJguOkCk3JpY6tfsFRBZIyUAWQoNogBWEXCXcvWTheW845P1BZKDGTgm6vE9MU45.hLnBUZyAbsMkM8maZItSPKbhyjVl7PBlLRbc.0KiAXJOCsW1JlF3hKx3yHw+xN7rkzXu.xYxUGwjoO24ZlPsZrjwYxfVBD+9qIg0iYx3yUrvRKlLCnfG79IyjYHsgBPIR5LYzVBBGWIX3QKaegjssFjOB7vBFAMa7ce0TSxvrNjKOSQXNPA.Chu7oDLffkoCRxUFo6xzy0VxYCaii942x1H2QONaa+bSVo2+qFutgs0JGu3Yic7FY4wiUkDRFCgRF3yVp+uAFsa5Z3GcKWC38g3YHLos6iL0oUT3W5stk8F7RysvKUgfdcztITxNwNx2KvkOKJSNdGVrhAifgjt4.5s.R6g9kosAaGMnXQahUBQIBSMLh1HzLoEg5oYY1REhyVGoC4ASOC2OlU.XLl36nBu3l0YyyVGzU19TcMmnovlGHb7BRwSVf3e7cuhB13KxksiomNYEIIqnvcufhR1iw+TO.8hPKn3cufRfH2BQl6gTz4dl6bHyNMRXC8vq3dH.QMv8fnosBYKRl3gveQSEOJlm4gvF.pHG+iiKdxzODghEm8MmPfcNJZbO3c4glNX.mMEUnJeOS0FgKOxMD+V3dldEDUcwm.uG0kiACYP40znOY9odPjtFX2wRNWSaBOghLkt6ET2S2UCeDFTEf3Oz7O0DbP2G+m7RTj5A04O0bhTX7+dgtMXZJJQ0U7ER2CnghcLgxVmgH+l6hmfpbU5d38DCC7bOL9CotzzykU.LmfXRMLXq5FBkJe2qpM5iuvVy0khQoR+fXTaHSVv.+D7WX75AMP5nfOnUH3H0JIwCgQ3h+Y6ZCo.tlGj6QKBlLDVEBkC71EDjxWo99VhGn+W0fsN3tDmYNQ8i+A2pyfDJ0jB4J4d1iKzbFx1cHhEpffZrcX5PtHZCHM4WhYGOYp6812Xiu5WK1I.bv+bMuUWHc8M6aLjn.CgmUSxBLKJBbZPsD0e8fCQ7S4LFs97kQ79VzHdO2OhWMIXOHg6de+zYCmE66GNVWjsDH6Ez9bWfK04YQyap2OxsiYukLpu89+sit7mFVXT3ye6fBajYwkG8n3IeaRFKr3emjgvo+1Eu8YK6d2n.VZxV2reXT3KG81AEv00tLMtM3QU2FB93NgnPxOmaUB6pp5vku9ayT9v3xckx2i4HpBwus9FiL9A2hLN614s9vVQNqotX9MfUzF3D8.cnEJuwcObmG81m9fG81WZejrocej85nejHzdaK0WyyYiyl7tryWggueTxygyyGvkUHF6riBeDT69recDwecD+h4Wd9S69r+6+Kg+Fb2gO8ma+Vb7gQAqY7OYf0eoRvuIM9Cr4KYC9s0vvQycQ3C.9s1aZxiEE+tQahOlisiiOYK3XjH+VAG8e+bddzRppHE2UH36EUr2ucdYbBu8+QAmdITSNRZBjWj+q9.AGXhF7NQ7130jx5Q+ZR0zFQduKVyr3KOJuGvi1vX4u8HxVQ+EkEdu7w71HKndARDmPYBztcYaSOqMW0W8JhRA30QYLvJBOPCCDvqcCSiErMcbvGyCAVqYn1zyd.lWspm1HRh+q02odSvWCJXr5Dbpfm4fvxWMk5RfazvmAWDxtv2UhHieRTZ63azNwFsStQ6Taz9vMZmdi1YV0d4ADh0L9gQuiyw4V2h0ydb2hE.WhaqPyLu1fk6IsmG38d6Yu68du8jPnz2J3cRb0uHZBp3eTRgQfBd1136zCcsGZMKqu5U9CQzQC2e3idJrBs+ks1wBs9.67zGMMF+9cmD7dGQdO+BZ.yFSafdC4xKdR5chlHQVNitoOIaAwqE55HvUIW9Ip4sGWbZhbWaYYk+zlIqTMw4SloUN0XQw1FBcO9rQsMLtYZeC6hZdp8tnU5Ql84NWsTNGa4LM8JZldT69hbBYiW7fqpNxbb6xiybYCNyD4mcsybc9IyRXwOleRJMtVWWIdlJbkyL9vY5tc5j5xrWdiblBmjp2boLd5Ge7k8JlHSx72b1M44xO6r3IyHO+bj9MMFu3JqJmM337W1Nk4nZWeMe0dSiyUt941c4lUImpSUCUwS5KTYZUw4YEm1p13is4pNsS9ZW4UtxTmry6cisaR89UWT6pJFyuwVPr8zRkZKOozvKxXoWyd3flVcSTr03oySJWXfAWDLuj95hdzsu2iG8I.feaq.gC1uaGsAFRtd13Ti.GP4krC44h8HX4ZFRqRqC97gGUDYrstwpbcvuSHgcSQ0CWSUqKBxZYUG+kGE4QXU77ngtPv0BNemFGe3Quaab7d+diieuwwCabbWZIhfVRJdesD8iE5t.zRtpsZk7FB83pk.3bRK3RM8ZHaHIAN8CrsNtZGkxbM0O7zjmcPxp5pddE75N06ZQUP+Ta9TuyE6Vv7ZodWW+xRkpeMexKRedl4ozq5ktQ27HOoah2Ur0k7mTRbb0VJWe5DyApIyEW9TYqVkbUatXzMYu3LsyMOL2DqVRSbaktNuw3qb8lphDD4RwwkWL2zpYPU0jKNsfUKtIRW16.TAtZU507PwoUEDlT5bC0dbkVjt6IFJsTZLi+7hSldbwgoLzEtD0pXFYghwqeUuICZdciTWL25jyKV6vElGmbl0XNulEaL8jym2I03Ey50L8PaGi3BI330F6zrfc1lNxsOrqyYFmcVXsl8ukVyVNxp2kTO9R46V8f+IQSE+v.0CwB2bbAtdsNSPnfZhls4ZHkRB+oTilcxKcUY4B4gB8NHsyIHyJI5dPUo1Mb5bY9RoDqTwsmlvIx2jTH9g1oENkqaANOtoVUSXlp9nhnQnAEOWXbQd0dpi3ZUqaUEgRcEF1OUyyxrngvgUGUwar8vgIqnN8Z0Rbyj3pkTsQOtLZpE4lcxnDmazbwvE7mqeLeuwdYleo7bT+osFOLIWC8VC5cUol4qLeFmU6SGmYR6bcZmoSuSkUr51YQBc4xmNc7wkttSm5mk3h5GpVZgB+MWwamtq3McLRWe5vCxkxqcuRGWscBo4J7ib6NNqjlSwzGW4fghdkO8l4mb0zFEDLlkdPAmrhRhh8OW9DGjR5S.3dd5S7TDmjcRY4a5VLslRY6K6NRbfP2NmNN6j44JHWVztjUqVWvMrDWmrsZILs6vQCLDjqHTpG2jd70NepZK2xMKpvU9XUQkqm3cR4rix4jr9z90TUElNc1rwlKx5TQP0g2ycR9tWeQO6qurHR7vzZ7sqmsPM0rtdmplwq8DYCjx48JrvV1JWBsR0RTq4Li1EalaQyN7Yt1qY9QczJjW7hBWWrftbOwimyAFXCt7p1sbUpvMadmRWetyYZUrNTHrgP4Gm6y66J.9cEunHvL4v.yDwp4uoOXlTU7rYE5Z5Tk6fEEKJvQ+XXcCn5bU1TFmgJWqd6aFkTWSsffYavoPt1Z8ln1shV67Elan2t2IoqXLX7wnKO33hipWXXiVb0JxURnYgoxGrHmoxMhU6evf5bVm0Q+J9VExmI2IoO8Jo4pVcGk3fjdccU5cgP07m4Yzv3RtJKZkytrGmY5xM4xMlqzzJKFURVt7EbGTNeKNsZkFXcQSutWMIdiyTuHwDmSJXpoMRSnchLJGfbO4fwGV0Nqpv0kNtyrQcTg.2m0PGcsql3XuYi7ZMVT5fCQwyH.KerRo3FGJZ6cxoSqkudiQEGX04vBW0Y50ouImPm91IzzMRevMKbjuXnS1dGTbvHgSFM+rZWV+7l8L6kUqU9SruT2sc8hwOts5YxyjUUOq9BUqViNnU83mZeY04H4AnCUT45dgQlhcx0db0FmdpLpe2DpmMOyAVotXboKxT5b8LhUpmdtKmz4pVMTOvVQZj6wFKDZcpsAjOw7Kzsyq1pIWI9hIKMQfWZ9f5FhBUN9XiKsGMpaSASYdtNUrG4HzRiab9ti4NwXd8BcGzv0UR5z3phVsGZL5j3kbTlBNJK2Ie9ZcyWs3vbYSVURpXkzmvMhSQV83Acly0iuoRwStxZVegQ0FO1zJS4joxcy0BNcacQU4hZo6b8McACwiCYaI93rstmqe7c3r2eG8T.W6euY1M.G6ngOMgRFSAFOzCFG+dQKhTk7zcC5c8S5ptogo0PSCMk0OKG+2c+v39VIHAPMKbkHe+iZSe2xCelw3eDyR1qeDUes3Ew+Z+u8NaUd8ChRQW5kX96tmd6S++zmd6ZGoztAGeaSS8ETEU7OYL+Rn2MJswZ5zOY8SuMRDQaZgzq3V+0+CG0Jr3ccUyevQs7jzWwcO5e7q96ExqYYpKY+aJm+AzjeuGo5wePzkD0655wXow6133OLpuvE+a5452sw0OHZq+2GA8MJ+.+3MjS9W1OhHsKVZeqaW11zbRn613W8K+k+GupnzDqUWDwQIS9u+pKPt0fUq622u3+r0+xqJZuHbeGw7OCyKzkORfE9Wj0MnP1xPu+cuEOoK56d0ffKtHJjdRGSOaET3633I36Mg1lO3GGcGjQeRieM7wev3AWHBdv3AC93UCnWb.KM+l28zS+NQI2tBK9xv9lD89lPFoD.Jfd7el99K7TTvIvtySzCotR+oU3ophQInNsuQvxIRJ1let++LTgw02mzCfkFjr12MZcba1kuoQQixywGA+N274JJ3.7eb7HQ19ZR7FrljuAqI0avZN7MXMoeCVSl2f0j8dWCtfdAOWyITe6PGMKQUr1Y4Q6uySi7+.UM20QC

    If you click the transpose down button (the right of the 2 transpose buttons) you will see the notes get squished down essentially as the bottom note is anchored to the bottom of the panel. If you then click the transpose up button the notes get stretched out rather than moving as a block.

    If you apply that same transpose script to a MIDI player overlay panel for example then the notes move as a block as they should. Equally if you look through my code and /* out the 'Fill panel version' from row 148 to 207 and remove the /* from row 209 to 234 then recompile you will see the other version that I put in my screenshots above. The transpose behaviour acts as it should in that version as well.

    Let me know if that doesn't make sense

  • Neural Amp Modeler (NAM) in HISE

    33
    0 Votes
    33 Posts
    3k Views
    L

    @aaronventure it's been a long week 🤦 :

  • Whos selling? || Shameless plug thread...

    4
  • Custom Export/Import of UserPresets

    Solved
    5
    0 Votes
    5 Posts
    76 Views
    J

    @d-healey ahhhh really cool! Makes sense and definitely cleaner!

  • Multi-timbral plugin

    15
    0 Votes
    15 Posts
    616 Views
    dannytaurusD

    I've got a multitimbral ROMpler on my list for the near future. Only single MIDI channel though.

    Just allowing users to stack up a few different ROMpler sounds - piano, strings, organ, etc. and optionally pan them, mix volumes, etc.

    The VoiceLimit trick sounds like it'll be very useful in keeping the resource usage down! 🙌

  • No looppoints

    8
    0 Votes
    8 Posts
    96 Views
    dannytaurusD

    Is this the same issue as here?

    Link Preview Image Loop points sometimes don't get imported

    I'm importing wav-files that has loop point set, and some, but not all, get's the loop points imported. Here's one that Hise seems to miss: https://www.dropb...

    favicon

    Forum (forum.hise.audio)

  • [New User Here] Having trouble exporting FX Plugin on Mac

    7
    0 Votes
    7 Posts
    91 Views
    G

    @d-healey Sounds good thank you

  • 1 Votes
    1 Posts
    23 Views
    No one has replied
  • Pitch Shifter (FAUST/RNBO/C++)

    7
    0 Votes
    7 Posts
    698 Views
    d.healeyD

    @Ben-Catman said in Pitch Shifter (FAUST/RNBO/C++):

    compiled it in june

    Switch to the develop branch, v3x is ancient

  • Drift.... and how to design it....

    14
    0 Votes
    14 Posts
    168 Views
    OrvillainO

    @Lindon d6c4b1cd-95ad-45fe-b286-5bc0209153e3-image.png

    This creates a per-voice random value between 0.0 and 1.0.

  • Convolution reverb wet level seemingly not working

    17
    0 Votes
    17 Posts
    238 Views
    pcs800P

    @d-healey Yes i have such a thing already going. I guess I forgot to ad this one.

  • Server.callWithPost content type

    16
    0 Votes
    16 Posts
    544 Views
    HISEnbergH

    @oskarsh @hisefilo

    I figured out a way to solve this (sort of, a better method would be a new scripting call for the Server API, something like Server.callWithPostRawJSON).

    Most of where you want to look is the GlobalServer.cpp file here

    If you are looking for a quick fix you can try editing line 273 of the GlobalServer.cpp script:

    for(const auto& v: d->getProperties()) isComplexObject |= v.value.isArray() || v.value.getDynamicObject() != nullptr; // if(isComplexObject) remove this line if (true) // add this line { extraHeader = "Content-Type: application/json"; url = url.withPOSTData(JSON::toString(parameters, true)); } else { for (auto& p : d->getProperties()) url = url.withParameter(p.name.toString(), p.value.toString());

    I think what happens is that when your JSON objects contain only simple properties (strings, numbers, booleans), HISE will treat it as a simple object and URL-encodes the parameters. So modifying the isComplexObject will just push the JSON data for all objects now (which could cause more issues down the line).

    I'll post here again once I figure out a better/more robust solution.

  • Link Snex Parameter to Ui

    16
    0 Votes
    16 Posts
    168 Views
    O

    @Lindon Noted Thank you

  • GUi Resize choosing from a combo box

    8
    0 Votes
    8 Posts
    72 Views
    O

    @d-healey Thank you i was able to do it.

  • an alternative to FFT

    1
    2 Votes
    1 Posts
    51 Views
    No one has replied
  • This topic is deleted!

    1
    0 Votes
    1 Posts
    18 Views
    No one has replied

15

Online

1.8k

Users

12.1k

Topics

105.7k

Posts