<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Scripting]]></title><description><![CDATA[Scripting related questions and answers]]></description><link>https://forum.hise.audio/category/7</link><generator>RSS for Node</generator><lastBuildDate>Thu, 15 Oct 2026 19:40:29 GMT</lastBuildDate><atom:link href="https://forum.hise.audio/category/7.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Sep 2026 14:35:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[HISE_NUM_STANDALONE_OUTPUTS warning]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/4924">@gp_</a> it seems to happen when you disconnect or change an interface Hise had in memory when it’s close, then when you start it again it doesn’t find it and throws this warning.</p>
<p dir="auto">Since when Hise has an issue or crashes it doesn’t rewrite the memory, it will happen next time again and again. The same thing happens with the window configuration since it is saved only with a proper close without issues, recalling an old window configuration (this time without a warning like the audio interface one)</p>
<p dir="auto">Instead, Hise should save the configuration (audio, midi, windows, etc) as they change and not when closing the app.</p>
<p dir="auto">But usually for the interface if the configuration doesn’t change between Hise sessions the warning should just go away</p>
]]></description><link>https://forum.hise.audio/topic/15073/hise_num_standalone_outputs-warning</link><guid isPermaLink="true">https://forum.hise.audio/topic/15073/hise_num_standalone_outputs-warning</guid><dc:creator><![CDATA[ustk]]></dc:creator><pubDate>Wed, 30 Sep 2026 14:35:27 GMT</pubDate></item><item><title><![CDATA[Not finding LoadNAMModel]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/5725">@marceau-dng</a> said in <a href="/post/123001">Not finding LoadNAMModel</a>:</p>
<blockquote>
<p dir="auto">I installed the latest version with the launcher btw</p>
</blockquote>
<p dir="auto">Build from source</p>
]]></description><link>https://forum.hise.audio/topic/15068/not-finding-loadnammodel</link><guid isPermaLink="true">https://forum.hise.audio/topic/15068/not-finding-loadnammodel</guid><dc:creator><![CDATA[David Healey]]></dc:creator><pubDate>Mon, 28 Sep 2026 15:16:57 GMT</pubDate></item><item><title><![CDATA[Audio Waveform&#x2F;Convolution - Knob for Range]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/4855">@svkpowa</a></p>
HiseSnippet 2507.3oc2Yz0aabb7NKcolzwINAoEsus3PPAUjDIOY4OZbsMknjhYsjEgnhcLTDbVd2RxE53sr2cjRBIFv8kh9yx+DBP+Ez+A4k9r6L6dGu8DonkUabaJg+f678L6ryL6xlgBWVTjHzvr39mNfYX9gVsNMHtW8dTdfQiMLLutUcQvHg+vXtHvX8SGPihXdFlly8UHIlEl2P94md35TeZfKKCjgwSEbW117973LnMq8Xtu+VTO1979ZTuZsFthf5BewPvblyppw.p6QztrmPQxthkwinQ8LL+BKWuUcW081sW0gR6bGm12l09tN2wgcW2a48Gbcot2psqyMuI0v7C1ziGKBaESiYQFlyutv6zV8DGGnTvS4Q719LbgiQKPyJvaI78PWDgZTuG22qYZbJxvvzpYVTaNUT6yr1g6wGCOK5cCIBRFG5APyqj27lKm44nadU0LuoXRlZlz7JS5SrZ4FxGDmgAsmqY0HHlE1gB6S5lhhViq7Oja2wrf3x8oGw1JDVLliR2tZ0kHv+rv8JVD1qhhIM1ibehLiobWV7ZC83hVz9C7YiUaI6F6YCLnn+YzQrsDg8AtR0CvWcQ+Ah.XQI6TBryzwHZHABQgwMC7OW9RIHSUHaaF3MKlTnkpRio8nAcY.7HfuCdaZaohjo+Y1Z7PPkgrtjHYvZaVP23df5pBfqTgrdnf54Rif3Nwi0gGvwCeZlXHi5IC1PlFXrQqWGXdyft7.VYW.YLSSDk9dvFs4d1eIwdRFsQOvlF1MBvefsapsZuDwlMB+xgRJhoJJNr3KWPYkz3XpaORrfHoif4cEmTAkUzsuXbXXGwvH1lHOQkNHaG+PPi084tGEsD4QhQfu+6IaDR6BdUWzZj6SSS9ddayAGM.bUajPjFhqBOrtyv.WL9UZrusjxhWn32Wr.uCojbUYdDpscC7OcghE.LER2kKGwheJ0eHKSB31pLOQRSoE.SSi9P1.n...Fgp1xmkL.JRjPBs57+xhiC3WnzBUtz6TBQJKmIUXP5QXLlxC7XmfeYD5Du64Do5HW1fO6jMnwzR1xczs39rxIGa.Mc.V3.yIplayOSPSca2WhVeWWtKChMR.hePHFWs8gXAjUQBXGS5.pEkdghENyowF6gaQ6Kho9JXMBTE2hj6LEKVXbohCpdHtCWxtOEiR5BZYGYAyInUkMLIJUhqmREZnbNWMjWDNZRelTooH41Wwh7.eHgYbniHBRSowskPgu9QHYhfL3lkgCVGOvNA2hNnJgfHfPE2jpujD4RI0lwHrxVwS.uDLi2VEWTbIlScpueaXHgRSXnmm+nT5L8F8S8oQaI1kOG+YLCYtRp7lkGk1JX59SNCU4Mv4qB2ehOjG+jcWmzD5Ce1OIEFdbPaDa1AhtR2DqWPAvw83Qnkssvk5utXXfWjJoDIPzoyyAZVopLWrqxTwAzJkxVI61cUfrkkv5VFNO4uGJGl2dL2XHD4yJc.L3.JrkHzCV4P7eu4gKi.fu6TcgYHddLqedE3EROdRErRhFVbEkNVd0pZpY4UAEAXbRUEZk6GxSXdUEoUVY4UWDIuBP5cg+.LsCElsoYiuvo7sx7uLNkpxYk2N+qn3O0AVym2Mf4sO6jXMmMFVByTPvv0p4hUn8a6BINg.ShA1JaIKfo9unxG2CBXmmhFPCiXv3bi0X5IOPiWf3Wp9sSxqmV9nJcbm5qOY9XtTRIEY4jY8iwzti0xKeF2KtWRwvrd0t3bBLOxO7CpFMnq1Mos8DTAvkHJHkoGzwor73olVRBDXOXoELJEWF0Rb3eyj+Ij+Hb1.EegBJHQ83ch2.lfm7PPFKeeH4tJ4KIiVd46cVVe.43kmEyKNl4EWbrtk1z3x6xbqPUQ0kHYoQXQ3ExA.phsfZDCkHzax.iXHE94LIjJzgAELFCwkIM1rsfug7EIVsFr6MSK+raJKJ0y+dtyKk4mcDgjRCH7frQ5koXCTk1ghshiSK4hCJZuluOIC.JLIoMwgwfJNwPyjRxxoiQIGkcbYaUdMd5nnVOmmHhY6lLGBfgbVTc5LUbI098gwalFZ7xygyhwRAC62lEp2ZCIDtfX9acZc925T+RwtplXZDJBZ.Sft6.Vv4cUYijNe3MTSrJ3N4wx6m9qStepbzO7N.vtUeCNbazhVoWIvPZ55On.lmXX9sVU95HVXTkg9g7iZK7XAU1YXD2sxi3QrJOpQqMgNh69m1r99spz5IMZ1bS3KqAW1MNpx3YMipvCeQDGaj+hPHcMrc4ioiLBGOVODaLeEnzvjgzw0W4aMML95F3XqodE3ffSOfEFyw3o4FrQbWl5V3Er1fEcTrX.D1G262v7W8NDCNQ+IRNMawmW6Xrz3X.+3eoVOFuaOsmZ440FOCeCPnya0XObOYrYbMkYb8zmJfFv7STe5PM5peCM0W66Ni5e0ASn9Mpk+Hlg4Gak6HlQ5rC.OevCdvCdCxUVCeD5adya9qHT3Hepfuwq+m0vFkPXTYl47oO777oqZoloRyidUm+a6QVP1zULTdiEZfF80dTMx2US20tZdWaaZ6DW6izg3nuk0PyAec2y3fFAS3fOHIx96rZg02IxB7vs45C2GmbBTY2fAEOnx5ClyYL4yNcCqcDdC8ow4eEL7sBSPb1mQDedofHd7o5uk3+wdZrKpI9IVM4wt8ltMdkoXivo+eNrwjGT75Va1oCLbalANu0Vey6gWO7SS0u9q9pzOT7PW+aDdZ9W.94u9Yr37fLL1FLt.2bwsF8GLzOJ4Vo5a5IlQifACi0gC05WGNb0MDG5e+d3870kWSXjTlOMmNdDutlL9a+8Za.WXCtwuNMas09IEoS.8Y0v1Bpma9m0VLxy3pdKIUAv1J9Bwfb8cP.ZscLm6Bug6L67M0rLcggvB4n5exv9sfpStL7Q0f5kQRUh8uUqqpJTYXzhE3IW.EwdSBRGbsYBRmTj54zejJLeMqVv.TxGKVlQ8ajqkOIL4qvmwAOQ5Liehge7h9SLL3B+SLrKb+wQr8gN7QCDQ4DbKVe99Pk2HcfPNwVgr+7dXIBc30E3UqlBpe5gaAN4T4oEMdXnrVyZ8gL63b0VlaV+xENWxe4h4+ete4heAzAIW4wBo1XK4g5MCFw7gQ+j13mBy50gNzONEZ9b4cDAhA8DAbW8M58XvYvtcYg519Tcn0vGN8H8pU6w7YT8j1Ou11PxFMDhSrKYrv4c9GZZp6W+VKk4RvCfje414et+uty+6kFAuOzQepan3EtpqXh4oWUBA76.Y27BV6fqINSdix9PUtW35lWTSv3JWVFu4kkwUurLdqKKi29xx3ctrLd22NiXSn0FFK5qNZZXrSyMkW91zby.7dHxSDF+KfGvTIE

<p dir="auto">convolution.gif</p>
]]></description><link>https://forum.hise.audio/topic/14984/audio-waveform-convolution-knob-for-range</link><guid isPermaLink="true">https://forum.hise.audio/topic/14984/audio-waveform-convolution-knob-for-range</guid><dc:creator><![CDATA[ulrik]]></dc:creator><pubDate>Sat, 08 Aug 2026 21:29:02 GMT</pubDate></item><item><title><![CDATA[Need help (script examples) on how to access Channel Switching data from an outside program]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/12">@David-Healey</a> That was my next step using the MIDI Monitor in Cubase to read incoming MIDI data from Dorico.  I had started out working directly in HISE and researching the documentation.  I will respond with what I see...</p>
]]></description><link>https://forum.hise.audio/topic/14966/need-help-script-examples-on-how-to-access-channel-switching-data-from-an-outside-program</link><guid isPermaLink="true">https://forum.hise.audio/topic/14966/need-help-script-examples-on-how-to-access-channel-switching-data-from-an-outside-program</guid><dc:creator><![CDATA[rawl747]]></dc:creator><pubDate>Thu, 30 Jul 2026 21:54:11 GMT</pubDate></item><item><title><![CDATA[Script Processor: &quot;not a function&quot; error is intermittent&#x2F;non-deterministic (4.1.0)]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/5192">@musicayciencia</a> globals are used when you need to share data between script processors - although David correctly suggests that this should be the last tool you pick for that as there are way better ways for cross-module communication by now. The callback of a single script processor share all the variables declared in the onInit callback.</p>
<p dir="auto">Now about the non-deterministic issue: if you compile that script it won't cause an error, as the JS compiler cannot know whether the variable setGlobalVariable is a function that can be called - it might get assigned to something callable at some point so it stays put and doesn't complain. However when you play a note, then it's time to call this variable and that's where HISE realises that you can't execute the (empty) variable.</p>
var callableAtSecondTime = undefined;

function onNoteOn()
{
	callableAtSecondTime();
}
 
function onNoteOff()
{
	callableAtSecondTime = function()
	{
		Console.print("Now I work");
	};
}

<p dir="auto">This script will throw an error when you press the first note, but the first note off will then assign a function to the variable so subsequent notes will not raise the error but call the function. That example looks weird, but it's one of the more powerful features of JS (and HiseScript) to be able to reassign function slots to different functions like this so you can implement dynamic logic more easily.</p>
]]></description><link>https://forum.hise.audio/topic/14961/script-processor-not-a-function-error-is-intermittent-non-deterministic-4-1-0</link><guid isPermaLink="true">https://forum.hise.audio/topic/14961/script-processor-not-a-function-error-is-intermittent-non-deterministic-4-1-0</guid><dc:creator><![CDATA[Christoph Hart]]></dc:creator><pubDate>Wed, 29 Jul 2026 06:28:36 GMT</pubDate></item><item><title><![CDATA[Duplicate symbol errors (createDspObject&#x2F;getModuleList&#x2F;destroyDspObject) compiling DspNetwork as Dynamic Library on macOS]]></title><description><![CDATA[<p dir="auto">Environment: macOS, HISE develop branch (up to date with origin/develop), Xcode, compiling a DSP Network as Dynamic Library via <a href="http://batchCompileOSX.sh" rel="nofollow ugc">batchCompileOSX.sh</a>.</p>
<p dir="auto">Error:<br />
duplicate symbol '_createDspObject' in:<br />
duplicate symbol '_getModuleList' in:<br />
duplicate symbol '_destroyDspObject' in:<br />
ld: 20 duplicate symbols</p>
<p dir="auto">Diagnosis:<br />
Using <code>nm</code> on the compiled .o files, I confirmed these symbols are defined in THREE separate object files instead of one:</p>
<ul>
<li>Main.o</li>
<li>include_hi_tools_01.o</li>
<li>include_hi_tools_03.o</li>
</ul>
<p dir="auto">The function bodies live in HiseLibraryHeader.h, guarded by:<br />
#if HI_EXPORT_DSP_LIBRARY<br />
...<br />
#endif</p>
<p dir="auto">HI_EXPORT_DSP_LIBRARY is set to 1 in AppConfig.h (autogenerated from the .jucer's ), which is correct/intentional for exporting the DLL.</p>
<p dir="auto">The problem: hi_tools_01.cpp and hi_tools_03.cpp both #include "../hi_dsp_library/hi_dsp_library.h" (confirmed via grep), which pulls in HiseLibraryHeader.h and re-generates the factory functions in those translation units as well — in addition to Main.cpp, which is the intended single exporter.</p>
<p dir="auto">This seems like it shouldn't happen — hi_tools shouldn't normally depend on hi_dsp_library at all (dependency direction is usually reversed). Is this expected, or is this a bug in how the hi_tools amalgamation includes hi_dsp_library.h? Toggling IS_STATIC_DSP_LIBRARY in Projucer did not change the outcome.</p>
<p dir="auto">Happy to share the exact grep/nm commands and full build log if helpful.</p>
]]></description><link>https://forum.hise.audio/topic/14946/duplicate-symbol-errors-createdspobject-getmodulelist-destroydspobject-compiling-dspnetwork-as-dynamic-library-on-macos</link><guid isPermaLink="true">https://forum.hise.audio/topic/14946/duplicate-symbol-errors-createdspobject-getmodulelist-destroydspobject-compiling-dspnetwork-as-dynamic-library-on-macos</guid><dc:creator><![CDATA[phanniboi]]></dc:creator><pubDate>Thu, 23 Jul 2026 02:28:17 GMT</pubDate></item><item><title><![CDATA[Warnings about vars]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/12">@David-Healey</a> That's fixed now, it now respects the scope of anonymous functions within a namespace like this.</p>
]]></description><link>https://forum.hise.audio/topic/14940/warnings-about-vars</link><guid isPermaLink="true">https://forum.hise.audio/topic/14940/warnings-about-vars</guid><dc:creator><![CDATA[Christoph Hart]]></dc:creator><pubDate>Tue, 21 Jul 2026 15:52:57 GMT</pubDate></item><item><title><![CDATA[Preset browser LAF - the text box font and text colour?]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/3592">@Lurch</a> It's part of the alert window system so you need to use functions like drawAlertWindow</p>
]]></description><link>https://forum.hise.audio/topic/14938/preset-browser-laf-the-text-box-font-and-text-colour</link><guid isPermaLink="true">https://forum.hise.audio/topic/14938/preset-browser-laf-the-text-box-font-and-text-colour</guid><dc:creator><![CDATA[David Healey]]></dc:creator><pubDate>Mon, 20 Jul 2026 14:43:31 GMT</pubDate></item><item><title><![CDATA[Saving MIDI CC assignments in user presets?]]></title><description><![CDATA[<p dir="auto">I found when unloading a Full Instrument Expansion the automation xml was getting wiped. Made a <a href="https://github.com/christophhart/HISE/pull/1005" rel="nofollow ugc">little PR</a> to fix it.</p>
]]></description><link>https://forum.hise.audio/topic/14914/saving-midi-cc-assignments-in-user-presets</link><guid isPermaLink="true">https://forum.hise.audio/topic/14914/saving-midi-cc-assignments-in-user-presets</guid><dc:creator><![CDATA[David Healey]]></dc:creator><pubDate>Fri, 10 Jul 2026 08:52:39 GMT</pubDate></item><item><title><![CDATA[Sneak Peak at my &#x27;SLIDER BUILDER&quot; app &#x2F;&#x2F; Feature Requests anyone?]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/4879">@Sifres</a> <a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/357">@dannytaurus</a> I've started to add this because its already a popular method to use a slider to make peak meters. Coming soon! 👍</p>
]]></description><link>https://forum.hise.audio/topic/14906/sneak-peak-at-my-slider-builder-app-feature-requests-anyone</link><guid isPermaLink="true">https://forum.hise.audio/topic/14906/sneak-peak-at-my-slider-builder-app-feature-requests-anyone</guid><dc:creator><![CDATA[Chazrox]]></dc:creator><pubDate>Mon, 06 Jul 2026 13:37:04 GMT</pubDate></item><item><title><![CDATA[&#x2F;&#x2F; NEW : Online BUTTON BUILDER for HISE! &#x2F;&#x2F; LAF &amp; PNG Filmstrip Exports &#x2F;&#x2F; More Presets Added!]]></title><description><![CDATA[<p dir="auto">Update!</p>
<p dir="auto">Dual SVG capabilities for buttons such as this.<br />
(shown compiled in HISE)<br />
DualSVGButtonWorkingExample.gif</p>
<p dir="auto">Both import methods and settings panels are identical but are independent from each other between button states.</p>
<p dir="auto">Screenshot 2026-07-05 at 9.10.52 PM.png</p>
<p dir="auto">Screenshot 2026-07-05 at 9.14.27 PM.png</p>
<p dir="auto">And If you didnt already know...<br />
You can also do some pretty nice LED's with the app as well! 👍</p>
<p dir="auto">Screenshot 2026-07-05 at 9.17.58 PM.png</p>
<p dir="auto">Screenshot 2026-07-05 at 9.17.25 PM.png</p>
<p dir="auto">Screenshot 2026-07-05 at 9.18.37 PM.png<br />
They're available now in the preset menu.</p>
]]></description><link>https://forum.hise.audio/topic/14895/new-online-button-builder-for-hise-laf-png-filmstrip-exports-more-presets-added</link><guid isPermaLink="true">https://forum.hise.audio/topic/14895/new-online-button-builder-for-hise-laf-png-filmstrip-exports-more-presets-added</guid><dc:creator><![CDATA[Chazrox]]></dc:creator><pubDate>Thu, 02 Jul 2026 19:59:49 GMT</pubDate></item><item><title><![CDATA[SVG -&gt; base64 Batch conversion?]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/357">@dannytaurus</a></p>
<p dir="auto">I tried to load a 'duo-tone' svg with Base64SVG and this is the result?</p>
<p dir="auto">Screenshot 2026-07-01 at 2.40.49 AM.png</p>
<p dir="auto">SVG file:</p>
<p dir="auto">Screenshot 2026-07-01 at 2.42.10 AM.png</p>
<p dir="auto">Am I doing something wrong or not understanding something?</p>
]]></description><link>https://forum.hise.audio/topic/14893/svg-base64-batch-conversion</link><guid isPermaLink="true">https://forum.hise.audio/topic/14893/svg-base64-batch-conversion</guid><dc:creator><![CDATA[Chazrox]]></dc:creator><pubDate>Wed, 01 Jul 2026 00:51:56 GMT</pubDate></item><item><title><![CDATA[Rotation around center of mass is weird.]]></title><description><![CDATA[<p dir="auto">StarKnobNoiseMaskLayerFixed.gif</p>
<p dir="auto">Heres the fix:</p>
MyKnobLaf.registerFunction("drawRotarySlider", function(g, obj)
{
    var a = obj.area;
    var range = obj.max - obj.min;
    var stableSize = a[2] * (1.0 - 2.0 * 0.15);
    var ox = a[0] + (a[2] - stableSize) / 2;
    var oy = a[1] + (a[2] - stableSize) / 2;
    var cx = ox + stableSize / 2;
    var cy = oy + stableSize / 2;
    var sw = stableSize / 200.0;
    var startOffset = 2.5;
    var totalSweep = 2.0 * startOffset;
    var endOffset = -startOffset + totalSweep * (obj.value - obj.min) / range;


    var cStarBody3Top = 0xffFF0000;
    var cStarBody3Bot = 0xff00FBFF;
    var cStarBody3Outline = 0xfa000000;


    var starBody3Size = stableSize * 0.76;
    var starBody3X = cx - starBody3Size * 0.5;
    var starBody3Y = cy - starBody3Size * 0.5;

    var starBody3Static = Content.createPath();
    starBody3Static.addStar([0.5, 0.5], 3, 0.13, 0.5, 0);
    starBody3Static.roundCorners(1);
    var starBody3StaticBounds = starBody3Static.getBounds(starBody3Size).translated(starBody3X, starBody3Y);

    var starBody3Star = Content.createPath();
    starBody3Star.addStar([0.5, 0.5], 6, 0.05, 0.6, endOffset);
    starBody3Star.roundCorners(1);
    var starBody3RotBounds = starBody3Star.getBounds(starBody3Size).translated(starBody3X, starBody3Y);

	// PASS 1: gradient fill
	g.beginLayer(false);
	g.setGradientFill([cStarBody3Top, cx, starBody3Y, cStarBody3Bot, cx, starBody3Y + starBody3Size, false]);	
	g.fillPath(starBody3Star, starBody3RotBounds);	
	g.endLayer();

    // PASS 2: noise — use full obj.area so noise fills behind mask cleanly
    g.beginLayer(false);
    g.applyMask(starBody3Star, starBody3RotBounds, false);
    g.rotate(endOffset, [cx, cy]);
    g.addNoise({"alpha": 0.3, "monochromatic": true, "area": [a[0], a[1], a[2] * 2, a[3] * 2]});
    g.rotate(-endOffset, [cx, cy]);
    g.endLayer();

    // PASS 3: outline
    g.beginLayer(false);
    g.setColour(cStarBody3Outline);
    g.drawPath(starBody3Star, starBody3RotBounds, 3.06 * sw);
    g.endLayer();
});

]]></description><link>https://forum.hise.audio/topic/14886/rotation-around-center-of-mass-is-weird</link><guid isPermaLink="true">https://forum.hise.audio/topic/14886/rotation-around-center-of-mass-is-weird</guid><dc:creator><![CDATA[Chazrox]]></dc:creator><pubDate>Sat, 27 Jun 2026 05:02:13 GMT</pubDate></item><item><title><![CDATA[Ellipse Masking &#x2F;&#x2F; Mask makes shape dark.]]></title><description><![CDATA[<p dir="auto">Update: I bowed out gracefully.....for now lol</p>
]]></description><link>https://forum.hise.audio/topic/14883/ellipse-masking-mask-makes-shape-dark</link><guid isPermaLink="true">https://forum.hise.audio/topic/14883/ellipse-masking-mask-makes-shape-dark</guid><dc:creator><![CDATA[Chazrox]]></dc:creator><pubDate>Fri, 26 Jun 2026 10:57:45 GMT</pubDate></item><item><title><![CDATA[FREE PRO LICENSE!  &#x2F;&#x2F; NEW: Online KNOB BUILDER for HISE!! &#x2F;&#x2F; Filmstrips, Radial Gradients, Render Bounds]]></title><description><![CDATA[<p dir="auto">Wow congrats bro! I can't wait to try it</p>
]]></description><link>https://forum.hise.audio/topic/14879/free-pro-license-new-online-knob-builder-for-hise-filmstrips-radial-gradients-render-bounds</link><guid isPermaLink="true">https://forum.hise.audio/topic/14879/free-pro-license-new-online-knob-builder-for-hise-filmstrips-radial-gradients-render-bounds</guid><dc:creator><![CDATA[billyharrison02]]></dc:creator><pubDate>Wed, 24 Jun 2026 22:11:44 GMT</pubDate></item><item><title><![CDATA[Drawing gradient along a path? Thermometer style gradient?]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/4087">@Chazrox</a> Never used them, sorry.</p>
]]></description><link>https://forum.hise.audio/topic/14875/drawing-gradient-along-a-path-thermometer-style-gradient</link><guid isPermaLink="true">https://forum.hise.audio/topic/14875/drawing-gradient-along-a-path-thermometer-style-gradient</guid><dc:creator><![CDATA[dannytaurus]]></dc:creator><pubDate>Tue, 23 Jun 2026 23:40:16 GMT</pubDate></item><item><title><![CDATA[Bank headers in flat-list preset browser?]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/357">@dannytaurus</a> No the column just lists the files. A one column browser is pretty easy to create with a viewport or panel though.</p>
]]></description><link>https://forum.hise.audio/topic/14872/bank-headers-in-flat-list-preset-browser</link><guid isPermaLink="true">https://forum.hise.audio/topic/14872/bank-headers-in-flat-list-preset-browser</guid><dc:creator><![CDATA[David Healey]]></dc:creator><pubDate>Tue, 23 Jun 2026 10:46:23 GMT</pubDate></item><item><title><![CDATA[C++ Global Cables &#x2F;&#x2F; How to add multiple cables to an existing compiled network.]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/4087">@Chazrox</a></p>
<p dir="auto">I don't have a "clean" example.<br />
This is old code too, so not a good example of good c++ node practices or anything like that.</p>
<p dir="auto">But here is a c++ node with a global cable(s) set up.</p>
<p dir="auto">I've had no problems before, with updating existing c++ headers when adding more global cables.</p>
<p dir="auto">If you make sure that the generated global cable code is up to date.<br />
When you create more cables, you need to re-generate the global cable c++ code in Hise and update those parts in the c++</p>
<p dir="auto">This generated stuff needs to be kept up to date with the cable names and IDs in your Hise project:</p>
enum class GlobalCables { grainpos = 0 };
    using cable_manager_t = routing::global_cable_cpp_manager&lt;SN_GLOBAL_CABLE(94428153)&gt;;

<p dir="auto">^ Here, only one global cable exists, however when you add more global cables to your Hise project, this code will need regenerating / updating with the new names and IDs of the cables in your Hise project.</p>
<p dir="auto">C++ node example (using one global cable):</p>
// FILE: Griffin_GrainOsc.h
/*
    Granular OSC node: per-voice state &amp; note-reactive pitch.
    Each voice owns a Granulator instance via snex::PolyData so reset/prepare
    are scoped to the active voice. Pitch maps so that MIDI note 60 plays the
    sample at its original pitch / speed
*/

#pragma once
#include &lt;JuceHeader.h&gt;
#include &lt;array&gt;
#include &lt;vector&gt;
#include &lt;deque&gt;
#include &lt;cmath&gt;
#include &lt;atomic&gt;
#include "src/GriffinGrainOsc/GGO_GranularEngine.h"

namespace project
{
    using namespace juce;  using namespace hise;  using namespace scriptnode;

    enum ParamID
    {
        kGrainSizeMs, kDensityHz, kMainPos, kSpray, kPitchSt, kRandPitch, kRandSize,
        kStereoSpread, kReverseChance, kEnvMode, kMaxGrains, kNumParams
    };

    enum class GlobalCables { grainpos = 0 };
    using cable_manager_t = routing::global_cable_cpp_manager&lt;SN_GLOBAL_CABLE(94428153)&gt;;

    template&lt;int NV&gt;
    struct Griffin_GrainOsc : public data::base, public cable_manager_t
    {
        SNEX_NODE(Griffin_GrainOsc);
        struct MetadataClass { SN_NODE_ID("Griffin_GrainOsc"); };

        static constexpr bool isModNode() { return false; }
        static constexpr bool isPolyphonic() { return NV &gt; 1; }
        static constexpr bool hasTail() { return false; }
        static constexpr bool isSuspendedOnSilence() { return false; }
        static constexpr int  getFixChannelAmount() { return 2; }

        static constexpr int NumTables = 0, NumSliderPacks = 0,
            NumAudioFiles = 1, NumFilters = 0,
            NumDisplayBuffers = 0;

        struct Voice
        {
            ggrain::Granulator&lt;float&gt; gran;
            uint32_t lastGrainSm{ 0 };
            double   lastDensityHz{ -1.0 };
            int      note{ 60 };
            double   sr{ 44100.0 };

            void prepare(double sampleRate)
            {
                sr = sampleRate;
                gran.prepare(sr);
                lastGrainSm = 0; lastDensityHz = -1.0;
            }

            void reset()
            {
                gran.prepare(sr);                   // keeps grains cleared, parameters intact
                lastGrainSm = 0; lastDensityHz = -1.0;
            }

            void setSample(const float* mono, uint32_t num, double fileSr)
            {
                gran.loadSample(mono, num, fileSr);
            }
        };

        template&lt;typename PD&gt;
        void process(PD&amp; d)
        {
            auto&amp; fix = d.template as&lt;snex::Types::ProcessData&lt;2&gt;&gt;();
            auto  blk = fix.toAudioBlock();
            float* L = blk.getChannelPointer(0);
            float* R = blk.getChannelPointer(1);

            auto&amp; v = voices.get();
            v.gran.process(L, R, d.getNumSamples());

            flushSpawnEvents();
        }

        void prepare(snex::Types::PrepareSpecs s)
        {
            sr = s.sampleRate;

            voices.prepare(s);
            for (auto&amp; v : voices)
            {
                v.prepare(sr);
                v.gran.setSpawnCallback(&amp;Griffin_GrainOsc::onSpawnThunk, this);
                v.gran.setSpawnInfoCallback(&amp;Griffin_GrainOsc::onSpawnInfoThunk, this);
            }

            // Leave existing param cache alone in runtime use; these are only defaults for first-time init.
            params[kGrainSizeMs] = (params[kGrainSizeMs] == 0.0 ? 100.0 : params[kGrainSizeMs]);
            params[kDensityHz] = (params[kDensityHz] == 0.0 ? 5.0 : params[kDensityHz]);
            params[kMainPos] = (params[kMainPos] == 0.0 ? 0.5 : params[kMainPos]);
            params[kSpray] = (params[kSpray] == 0.0 ? 0.0 : params[kSpray]);
            params[kPitchSt] = params[kPitchSt];   // keep
            params[kRandPitch] = params[kRandPitch];
            params[kRandSize] = params[kRandSize];
            params[kStereoSpread] = params[kStereoSpread];
            params[kReverseChance] = params[kReverseChance];
            params[kEnvMode] = (params[kEnvMode] == 0.0 ? 2.0 : params[kEnvMode]);

            for (auto&amp; v : voices)
                params[kMaxGrains] = (double)v.gran.capacity();

            applyParamsAll();

            qCount.store(0, std::memory_order_relaxed);
            seq.store(0, std::memory_order_relaxed);
        }

        template&lt;int P&gt;
        void setParameter(double v)
        {
            static_assert(P &lt; kNumParams);
            params[P] = v;
            for (auto&amp; voice : voices)
                applyParamsForVoice(voice);
        }

        void createParameters(ParameterDataList&amp; data)
        {
            using PD = parameter::data;

            PD pSize("GrainSizeMs", { 1.0, 2000.0, 0.01 }); pSize.setDefaultValue(100.0); pSize.setSkewForCentre(100.0);
            registerCallback&lt;kGrainSizeMs&gt;(pSize); data.add(pSize);

            PD pDen("DensityHz", { 0.1, 200.0, 0.0001 }); pDen.setDefaultValue(5.0); pDen.setSkewForCentre(10.0);
            registerCallback&lt;kDensityHz&gt;(pDen); data.add(pDen);

            PD pPos("Position", { 0.0, 1.0, 0.0001 }); pPos.setDefaultValue(0.0);
            registerCallback&lt;kMainPos&gt;(pPos); data.add(pPos);

            PD pSpr("Spray", { 0.0, 1.0, 0.0 }); pSpr.setDefaultValue(0.0); pSpr.setSkewForCentre(0.2);
            registerCallback&lt;kSpray&gt;(pSpr); data.add(pSpr);

            PD pPst("PitchSt", { -36.0, 36.0, 0.001 }); pPst.setDefaultValue(0.0);
            registerCallback&lt;kPitchSt&gt;(pPst); data.add(pPst);

            PD pRP("RandPitch", { 0.0, 1.0, 0.0 }); pRP.setDefaultValue(0.0); pRP.setSkewForCentre(0.08);
            registerCallback&lt;kRandPitch&gt;(pRP); data.add(pRP);

            PD pRS("RandSize", { 0.0, 1.0, 0.0001 }); pRS.setDefaultValue(0.0); pRS.setSkewForCentre(0.4);
            registerCallback&lt;kRandSize&gt;(pRS); data.add(pRS);

            PD pSpread("RandPan", { 0.0, 1.0, 0.0001 }); pSpread.setDefaultValue(0.0); pSpread.setSkewForCentre(0.35);
            registerCallback&lt;kStereoSpread&gt;(pSpread); data.add(pSpread);

            PD pRev("ReverseChance", { 0.0, 1.0, 0.0001 }); pRev.setDefaultValue(0.0); pRev.setSkewForCentre(0.4);
            registerCallback&lt;kReverseChance&gt;(pRev); data.add(pRev);

            PD pEnv("EnvelopeShape", { 0.0, 2.0, 1.0 }); pEnv.setDefaultValue(2.0);
            registerCallback&lt;kEnvMode&gt;(pEnv); data.add(pEnv);

            PD pCap("MaxVoiceGrains", { 1.0, (double)128.0, 1.0 }); pCap.setDefaultValue((double)128.0);
            registerCallback&lt;kMaxGrains&gt;(pCap); data.add(pCap);
        }

        /*
           Safe sample load:
             - Push newest buffer.
             - Point all voices at newest buffer (Granulator snapshots pointer/size).
             - Compact pool keeping newest and any buffers still used by active grains.
        */
        void setExternalData(const snex::ExternalData&amp; ed, int) override
        {
            using DT = snex::ExternalData::DataType;

            if (ed.dataType != DT::AudioFile) return;
            if (ed.isXYZ()) return;
            if (ed.isEmpty()) return;
            if (ed.numChannels &lt;= 0 || ed.numChannels &gt; 2) return;
            if (ed.numSamples &lt;= 0 || ed.sampleRate &lt;= 0.0) return;

            auto buf = ed.toAudioSampleBuffer();
            const int nc = buf.getNumChannels();
            const int ns = buf.getNumSamples();
            if (ns &lt;= 0 || (nc != 1 &amp;&amp; nc != 2)) return;

            const double maxSec = 600.0;
            const int cap = juce::jmin(ns, (int)juce::roundToInt(ed.sampleRate * maxSec));

            SampleBuf newest;
            newest.data.resize((size_t)cap);

            if (nc == 1)
            {
                const float* s0 = buf.getReadPointer(0);
                for (int i = 0; i &lt; cap; ++i)
                {
                    float x = s0[i];
                    if (!std::isfinite(x)) x = 0.0f;
                    newest.data[(size_t)i] = juce::jlimit(-1.0f, 1.0f, x);
                }
            }
            else
            {
                const float* L = buf.getReadPointer(0);
                const float* R = buf.getReadPointer(1);
                for (int i = 0; i &lt; cap; ++i)
                {
                    float x = 0.5f * (L[i] + R[i]);
                    if (!std::isfinite(x)) x = 0.0f;
                    newest.data[(size_t)i] = juce::jlimit(-1.0f, 1.0f, x);
                }
            }
            newest.srcRate = ed.sampleRate;

            pool.push_back(std::move(newest));
            const size_t newestIdx = pool.size() - 1;
            const float* newestPtr = pool[newestIdx].data.data();
            const uint32_t newestSz = (uint32_t)pool[newestIdx].data.size();
            const double newestSR = pool[newestIdx].srcRate;

            for (auto&amp; v : voices)
                v.setSample(newestPtr, newestSz, newestSR);

            if (pool.size() &lt;= 1)
                return;

            size_t write = 0;
            for (size_t read = 0; read &lt; pool.size(); ++read)
            {
                const bool keepNewest = (read == newestIdx);
                bool keep = keepNewest;

                if (!keepNewest)
                {
                    const float* p = pool[read].data.data();
                    for (auto&amp; v : voices)
                    {
                        if (v.gran.isSamplePointerInUse(p)) { keep = true; break; }
                    }
                }

                if (keep)
                {
                    if (write != read)
                        pool[write] = std::move(pool[read]);
                    ++write;
                }
            }
            pool.resize(write);
        }

        void reset()
        {
            for (auto&amp; v : voices)
            {
                v.reset();                 // clear grains; keep parameters/seeds/buffers
                applyParamsForVoice(v);
            }
            qCount.store(0, std::memory_order_relaxed);
        }

        void handleHiseEvent(HiseEvent&amp; e)
        {
            if (e.isNoteOn())
            {
                auto&amp; v = voices.get();
                v.gran.flush(true);
                v.note = e.getNoteNumberIncludingTransposeAmount();
                applyParamsForVoice(v);
            }
        }

        SN_EMPTY_PROCESS_FRAME;

        void connectToRuntimeTarget(bool addConnection, const runtime_target::connection&amp; c) override
        {
            cable_manager_t::connectToRuntimeTarget(addConnection, c);
        }

    private:
        // GUI spawn-event sender

        juce::Array&lt;juce::var&gt; packed;

        void flushSpawnEvents()
        {
            const int N = qCount.exchange(0, std::memory_order_acq_rel);
            if (N &lt;= 0)
            {
                packed.clearQuick();
                return;
            }

            packed.clearQuick();
            packed.ensureStorageAllocated(N * 3);

            for (int i = 0; i &lt; N; ++i)
            {
                packed.add(juce::var((double)qP0[(size_t)i]));
                packed.add(juce::var((double)qVel[(size_t)i]));
                packed.add(juce::var((double)qDurMs[(size_t)i]));
            }

            this-&gt;sendDataToGlobalCable&lt;GlobalCables::grainpos&gt;(juce::var(packed));
        }

        static void onSpawnThunk(void*, float) {}

        static void onSpawnInfoThunk(void* user, float p0, float v01ps, float durMs)
        {
            auto* self = static_cast&lt;Griffin_GrainOsc*&gt;(user);
            if (!self) return;

            const int idx = self-&gt;qCount.load(std::memory_order_relaxed);
            if ((unsigned)idx &gt;= (unsigned)kQueueCap) return;

            self-&gt;qP0[(size_t)idx] = p0;
            self-&gt;qVel[(size_t)idx] = v01ps;
            self-&gt;qDurMs[(size_t)idx] = durMs;
            self-&gt;qCount.store(idx + 1, std::memory_order_release);
        }

        void applyParamsAll()
        {
            for (auto&amp; v : voices)
                applyParamsForVoice(v);
        }

        void applyParamsForVoice(Voice&amp; v)
        {
            const double grainMs = juce::jlimit(1.0, 2000.0, params[kGrainSizeMs]);
            const double densityHz = juce::jlimit(0.1, 200.0, params[kDensityHz]);

            uint32_t grainSm = (uint32_t)juce::roundToInt((grainMs * 0.001) * v.sr);
            if (grainSm == 0) grainSm = 1;

            const bool lenChanged = (grainSm != v.lastGrainSm);
            const bool denChanged = (std::abs(densityHz - v.lastDensityHz) &gt; 1e-12);

            if (lenChanged || denChanged)
            {
                v.gran.setParameters(grainSm, densityHz, 0.0);
                v.lastGrainSm = grainSm;
                v.lastDensityHz = densityHz;
            }

            ggrain::SpawnParams sp{};
            sp.mainPos01 = juce::jlimit(0.0, 1.0, params[kMainPos]);
            sp.spray01 = juce::jlimit(0.0, 1.0, params[kSpray]);
            sp.sprayMode = ggrain::SprayMode::Gaussian;

            sp.baseLenSm = grainSm;
            sp.sizeRand01 = juce::jlimit(0.0, 1.0, params[kRandSize]);

            // Honor requested pitch exactly (no limiting). UI control is still clamped, but note+UI sum is not.
            const double uiPitchSt = juce::jlimit(-36.0, 36.0, params[kPitchSt]);
            const double noteSemis = (double)v.note - 60.0;
            sp.pitchSemitones = uiPitchSt + noteSemis;
            sp.pitchRand01 = juce::jlimit(0.0, 1.0, params[kRandPitch]);

            sp.reverseChance01 = juce::jlimit(0.0, 1.0, params[kReverseChance]);
            sp.stereoSpread01 = juce::jlimit(0.0, 1.0, params[kStereoSpread]);

            const int envIdx = (int)juce::jlimit(0.0, 2.0, params[kEnvMode]);
            sp.envMode = (envIdx == 0 ? ggrain::EnvelopeMode::RectRaisedCos
                : envIdx == 1 ? ggrain::EnvelopeMode::Triangle
                : ggrain::EnvelopeMode::Hanning);

            v.gran.setSpawnParams(sp);

            const size_t cap = v.gran.capacity();
            const size_t want = (size_t)juce::roundToInt(juce::jlimit(1.0, (double)cap, params[kMaxGrains]));
            v.gran.setMaxActiveGrains(want);
        }

        struct SampleBuf { std::vector&lt;float&gt; data; double srcRate{ 44100.0 }; };

        static constexpr int kQueueCap = 512;

        double                         sr{ 44100.0 };
        std::array&lt;double, kNumParams&gt; params{};
        snex::PolyData&lt;Voice, NV&gt;      voices;

        std::vector&lt;SampleBuf&gt;         pool;

        std::array&lt;float, kQueueCap&gt;   qP0{};
        std::array&lt;float, kQueueCap&gt;   qVel{};
        std::array&lt;float, kQueueCap&gt;   qDurMs{};
        std::atomic&lt;int&gt;               qCount{ 0 };
        std::atomic&lt;int&gt;               seq{ 0 };
    };
}


]]></description><link>https://forum.hise.audio/topic/14871/c-global-cables-how-to-add-multiple-cables-to-an-existing-compiled-network</link><guid isPermaLink="true">https://forum.hise.audio/topic/14871/c-global-cables-how-to-add-multiple-cables-to-an-existing-compiled-network</guid><dc:creator><![CDATA[griffinboy]]></dc:creator><pubDate>Mon, 22 Jun 2026 14:44:37 GMT</pubDate></item><item><title><![CDATA[HISE Update broke my project.]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/4087">@Chazrox</a> said in <a href="/post/121462">HISE Update broke my project.</a>:</p>
<blockquote>
<p dir="auto">If its not an xml problem whats my next move?</p>
</blockquote>
<p dir="auto">If it was me I'd crack open a debugger and see what it says, not a simple thing to explain how to here though.</p>
]]></description><link>https://forum.hise.audio/topic/14869/hise-update-broke-my-project</link><guid isPermaLink="true">https://forum.hise.audio/topic/14869/hise-update-broke-my-project</guid><dc:creator><![CDATA[David Healey]]></dc:creator><pubDate>Mon, 22 Jun 2026 02:28:03 GMT</pubDate></item><item><title><![CDATA[Full Expansions Included Scripts]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/12">@David-Healey</a> The Problem was that I was including the same Expansions.js in the actual Expansion! Ive commented that and deleted the file and is working in the exported Plugin!</p>
]]></description><link>https://forum.hise.audio/topic/14859/full-expansions-included-scripts</link><guid isPermaLink="true">https://forum.hise.audio/topic/14859/full-expansions-included-scripts</guid><dc:creator><![CDATA[Soundavid]]></dc:creator><pubDate>Wed, 17 Jun 2026 17:39:06 GMT</pubDate></item><item><title><![CDATA[Trading DSP&#x27;s!]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/4087">@Chazrox</a> Have got a Glitch FX and a Granular Pitch Delay. Would be interested in the pitch and varispeed!</p>
]]></description><link>https://forum.hise.audio/topic/14845/trading-dsp-s</link><guid isPermaLink="true">https://forum.hise.audio/topic/14845/trading-dsp-s</guid><dc:creator><![CDATA[CassD]]></dc:creator><pubDate>Fri, 12 Jun 2026 17:43:22 GMT</pubDate></item><item><title><![CDATA[HISE 4.1: Obtaining Peak&#x2F;RMS Values from Script to a Scripted UI Meter?]]></title><description><![CDATA[<p dir="auto">Speaking of which...</p>
<p dir="auto"><a href="https://github.com/christophhart/HISE/pull/984" rel="nofollow ugc">https://github.com/christophhart/HISE/pull/984</a></p>
<p dir="auto">I can't believe the math were wrong the whole time<br />
-&gt; upDecayTime was inverted...</p>
]]></description><link>https://forum.hise.audio/topic/14838/hise-4-1-obtaining-peak-rms-values-from-script-to-a-scripted-ui-meter</link><guid isPermaLink="true">https://forum.hise.audio/topic/14838/hise-4-1-obtaining-peak-rms-values-from-script-to-a-scripted-ui-meter</guid><dc:creator><![CDATA[ustk]]></dc:creator><pubDate>Fri, 12 Jun 2026 01:10:30 GMT</pubDate></item><item><title><![CDATA[Logic crashes on startInternalDrag]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/12">@David-Healey</a><br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/449">@ustk</a><br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/3174">@HISEnberg</a><br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/307">@ulrik</a></p>
<p dir="auto">I've created my own little drag-and-drop implementation. Any suggestions for improvements?</p>
HiseSnippet 1697.3ocuXE0aSbDD9tjbsXWPsHwOfE+P3bIXrSbRHJPaRbR.qRBVj.kHDBs4t02sMm205t0IwBgT+o0eR809T6L6dm8cN1zRDTKPw6Nyry2Ly2N6ttSrzikjHisrKe7v9LK6a5bzPgJrUHkKrZuqk8sbFDE0iJD6FSCr1YXeZRBy2x1d9mhpXWZAK8m+7m2gFQEdrwSYY8ZI2i8bdOtZ7rc15W3QQ6S8YGy6kS6la01SJZIijC.3LuScq9TuynArConZy4X8LZRnk8O5rd2UnqsZ2U7Vm0bYFk5e5pqsg+oqzXs0W4QrldT5iVsoWyMrr+l874JY7QJphkXYuvNR+gGEJuPXbvq4I7SiX3fFVGAd1L89xHeLDwYsZExi76jkmRrfUoy3r17lr1cbNf6yGM+3r2OnEPFaQ9Dn8bEg27EfWi7vqdN3MEHYmCRKXfzscNxKl2WMVBhmuyosPwh6Rg5TdnXz0Zt+pjyCeH4EQ76kPvB98D2a2XY+xsjfYBUsdzyX6GCCFsLtqTu9RjkWsd0MKWFrEClAIjWSi4T.7IkiYAjjKn8Ay5YTAW3.THoCUvhRJC08DE4bZLoudBxSHuMyiALUKYu9RALvsh1fFUptTYxT97IrY4qgMqbMroYkpuChxtxX29DtHMfpV9CkK0uVBS0AXFpWJGn3BlqQXmWBoNizCjCRXsnQQmBT+TwGzZBwChgpI3NIrRbQvynBeybUVhX19jT6hPthsDAKJebTNmzV3y8n.iyj3ym2EQ5pBKFx8SO7FqREXUGOpVBvXQShkQtcoQIrIDCAsLgq3RgKvTPxh9+o7kmSOs.RziaLSTXDiHv7Mb4cqnXWpfnuRkpSmgQzocRZduLWDA+gzcfvCgEIqN3FnKTA05Bcn1NJxsP5DKCAn+LyNR3oQPwxHzOldw1Q7.Ay+X.RtpPdBF.s8cqtDIazykdzncjCD9It0g4q3AgVLyuhoZgAPqPl2Yjiowf5WAtdnPiL2fH4ozn2rDw7kSv..onHAjCYw5aR3jGmFg0hXh.UHL08ueUsZeXD+NBAEQoWUvNiAukij4hpbIH0nFFKOU61rB7abgPnn5C+DpexUU+hBp+qbeU3UUJrfROiwCBUnVSnFWjv8YftoIIxO8D.8Kt3nwOFGeevmKt3T2mCeRSqnoCGa5InoCASCy4TdWWiGqVXwhYpAwBB2DDezne5jOnQ98mEXr585jrdAyfxdPKW14.4QSawUg0E0B5AGqLKDwMq2a0xk.DpUulWD26LlOFP20LSLlCagSC5AKVoYs8pTorEbDKoFW3yt7Ec0zc8N7FnherbIMnvSzln+SNn.aYBRcoopEnIXoaUtB8Bx4F6tbywVLblVbRNKFhV.+aF8l.+9.RC.7vxY9xn9TWwrbc7TwCXoQqIb6.mKJi6Yh3sE9D7.Tx1lxFN9kLvsj8NmEOD.sHHWxnGVzeU++eyGf2KzQ4RLETkb2m.zSjgLCg43USmsnS.zrDPWjwTAbdZmkLyeWV+QPTEhRlWmo34BpWyPHAUYyBDGJI9Y3vGwgrOKlpqEJo7LRen4MKccJxsEv8d2b108rS5lIeZhy5.BB1aezFXo3Poh8BgqduKHiLontcmprT.DwhmpX7R0weJCcEC5cJKdI3z1Hf5loHbwwh2F0Y12FM+kk8LGSmSQonsfqdQelXVWg1J8rc3aup8tTEEuBa5bfdPERwQHXuK6b3ADlKzVxYWVxYJYeK6uczEB.XpzRuU10cQliEGtT6MbLWVz5x7uHY33As2BZtBEzzVrf+9dG3Pex3Ir9L7yx48CequZ9YkYEO+N8KpeZNq34yzOeSQ+n2il5Gy90YEOa8aacAd7+nI9i3svc05mBl2CklUjbSmwaMQu3Xm5AyWRWcG66.CB0WhHaDbaudYuD8lNMWdilaTuw5qUOmfkmPx4YaOrm+yI7WdlzyQ.bxv20QeNcZKMn2F3JSGS3aPCTpPpBglQvSsuxqBg2iJ8GDgmAm+Qp3S4SE.8JJ7xP7gdvsZTCy+T+uXub8+JDusSGtxKb5XbtofQnixWCLl9d+a4rW2tLO0X.tfy9u4qyi6sLuZI3.pJlir3CGz6Hf.5w.uKvyIQV6bXWUy35YD7iXBe8f+F9jJrAN1NUXiLgV8ndwx26YNg.+EEtgdF.SB8u9RImCvwjFV5SMxmm6w84u2yq3RcECW95Z3JWWCadcMb0qqgqccMb8qqgO5e2P72eZ6AJYOy1FKqC5rm9HWa68D3CNzrUq+AfuNwBB

]]></description><link>https://forum.hise.audio/topic/14835/logic-crashes-on-startinternaldrag</link><guid isPermaLink="true">https://forum.hise.audio/topic/14835/logic-crashes-on-startinternaldrag</guid><dc:creator><![CDATA[Oli Ullmann]]></dc:creator><pubDate>Thu, 11 Jun 2026 15:32:58 GMT</pubDate></item><item><title><![CDATA[One shared Script Voice Start Modulator for many Samplers?]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/12">@David-Healey</a> Yes the Global Modulator Container worked beautifully for this.<br />
Thanks to your video I've now also understood the global modulator container better.</p>
<p dir="auto">Regarding the body + release in one sampler:<br />
That's what I've tried first, but it's bugged when using together with loop regions.<br />
It's what I described in this earlier post you commented on:<br />
<a href="https://forum.hise.audio/topic/14799/loud-click-artifact-when-using-releasestart-with-looping-enabled/14?_=1781354181861">https://forum.hise.audio/topic/14799/loud-click-artifact-when-using-releasestart-with-looping-enabled/14?_=1781354181861</a></p>
<p dir="auto">I haven't gotten around to testing it with 48kHz samples yet.<br />
But by now I've found enough use cases to split apart the sections into dedicated samplers.</p>
]]></description><link>https://forum.hise.audio/topic/14834/one-shared-script-voice-start-modulator-for-many-samplers</link><guid isPermaLink="true">https://forum.hise.audio/topic/14834/one-shared-script-voice-start-modulator-for-many-samplers</guid><dc:creator><![CDATA[observantsound]]></dc:creator><pubDate>Thu, 11 Jun 2026 13:34:47 GMT</pubDate></item></channel></rss>