<?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[[Tutorial] How to Multiband in Scriptnode (without artefacts!)]]></title><description><![CDATA[<p dir="auto">I’ve seen a few people try to build multiband chains in ScriptNode and run into the same problem:</p>
<p dir="auto">The filters look like they are splitting bands correctly,</p>
<p dir="auto"><img src="/assets/uploads/files/1780587600497-6cbc85b5-008e-40b1-9d56-eb3419dda181-image.png" alt="6cbc85b5-008e-40b1-9d56-eb3419dda181-image.png" class=" img-fluid img-markdown" /><br />
<em>(image note: the middle band filters are a highpass node followed by a lowpass node, they share a linked filter display which is why they both look like a bandpass on the display. That's a drawing of the combined response, but it's actually a separate lowpass and highpass node)</em></p>
<hr />
<p dir="auto">but when you sum them back together the sound gets hollow.<br />
The spectrum has a dip!</p>
<p dir="auto">It is phase cancellation.</p>
<p dir="auto"><img src="/assets/uploads/files/1780587376185-d31af9ae-ca53-4fc8-9e17-9b6b8327fe4a-image.png" alt="d31af9ae-ca53-4fc8-9e17-9b6b8327fe4a-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">I actually do have my own custom multiband node for this, that handles everything automatically, with higher quality filters that can be modulated without glitches. And I’ll be releasing that to the forum for free in the future.</p>
<p dir="auto">But until then:<br />
It's actually possible to make a basic splitter in Hise using stock effects.<br />
So without further ado, lets begin : )</p>
<h2>The mistake</h2>
<p dir="auto">A multiband splitter does not work if you just:</p>
<ul>
<li>lowpass for the low band</li>
<li>bandpass for the middle band</li>
<li>highpass for the high band</li>
<li>then sum everything back together</li>
</ul>
<p dir="auto">That looks logical, but the filters are not only changing volume.</p>
<p dir="auto">They are also changing phase.</p>
<p dir="auto">So when the bands recombine, your signals are out of phase with each other and don't add together properly. Part of the signal cancels out and you get a frequency dip.</p>
<p dir="auto">That is the hole.</p>
<hr />
<h2>Building a perfect multiband in ScriptNode</h2>
<hr />
<p dir="auto"><img src="/assets/uploads/files/1780592151162-e735ee21-55b7-4a84-9b63-cc03d0947cab-ezgif-141257e24d046bf1.gif" alt="e735ee21-55b7-4a84-9b63-cc03d0947cab-ezgif-141257e24d046bf1.gif" class=" img-fluid img-markdown" /></p>
<p dir="auto">Use <strong>Linkwitz-Riley</strong> filters for the crossover split. In HISE, that means <code>jdsp.jlinkwitzriley</code>.</p>
<p dir="auto">In Linkwitz-Riley the <strong>LP</strong> and <strong>HP</strong> modes are designed to add back together cleanly when they use the same crossover frequency.</p>
<p dir="auto">For 2 bands, it's easy.<br />
For more than 2 bands, you also need <strong>AP</strong> mode.<br />
That is where the annoying part begins.</p>
<hr />
<h3>The simple case: 2 bands</h3>
<p dir="auto">A 2-band splitter is just one matched crossover.</p>
<p dir="auto"><img src="/assets/uploads/files/1780590362308-02afbf8f-5c8b-44b2-a7a8-3dc1dfe75b07-image.png" alt="02afbf8f-5c8b-44b2-a7a8-3dc1dfe75b07-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">That gives you:</p>
<pre><code class="language-text">Low:
LP 1

High:
HP 1
</code></pre>
<p dir="auto">Both filters use the same crossover frequency.</p>
<p dir="auto">Nice and clean. No phase artefacts yet.</p>
<hr />
<h3>The hard case: more than 2 bands</h3>
<p dir="auto">The 2-band split is easy because there is only one crossover.<br />
(One side gets <strong>LP 1</strong>, the other side gets <strong>HP 1</strong>, and they are a matched pair).</p>
<p dir="auto">With 3 bands or more, it's different.<br />
This is where the simple setup breaks.</p>
<p dir="auto">Lets use 3 bands as an example.<br />
With 3 bands there are two crossovers:</p>
<p dir="auto"><img src="/assets/uploads/files/1780592231050-faec4798-a139-4051-8a68-d7413c9f0e36-image.png" alt="faec4798-a139-4051-8a68-d7413c9f0e36-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">It is tempting to think this is correct:</p>
<pre><code class="language-text">Low:
LP 1

Mid:
HP 1 -&gt; LP 2

High:
HP 2
</code></pre>
<p dir="auto">That looks reasonable at first glance.</p>
<p dir="auto">Low is lowpassed.<br />
Mid is between the two crossovers.<br />
High is highpassed.</p>
<p dir="auto">But the paths are not phase equivalent anymore.</p>
<p dir="auto">Filters affect phase, so if one band gets shifted differently from the others, the bands will not line up properly when summed:</p>
<p dir="auto">In a 3 band multiband split, we have two crossovers.<br />
The mid band has already gone through <strong>two</strong> crossover filter stages:</p>
<pre><code class="language-text">Mid:
HP 1 -&gt; LP 2
</code></pre>
<p dir="auto">But the low and high bands have only gone through <strong>one</strong> crossover filter stage each.<br />
That is the mismatch.</p>
<p dir="auto">The mid band has been shaped by crossover filter 1 <strong>and</strong> crossover filter 2, so its phase has moved through both filter stages.</p>
<p dir="auto">But In the naïve version, the high band is only:</p>
<pre><code class="language-text">High:
HP 2
</code></pre>
<p dir="auto">That skips crossover 1 completely.</p>
<p dir="auto">We need both crossovers to be represented.</p>
<p dir="auto">So the high band should be:</p>
<pre><code class="language-text">High:
HP 1 -&gt; HP 2
</code></pre>
<p dir="auto">Not because we want to “highpass it twice” for the sound, but because the high band still needs the phase from crossover 1 and well as crossover 2.</p>
<p dir="auto">The low band has the opposite problem.</p>
<p dir="auto">It has crossover 1 already:</p>
<pre><code class="language-text">Low:
LP 1
</code></pre>
<p dir="auto">But it does not have crossover 2 at all.</p>
<p dir="auto">We do not want to filter the low band with <code>LP 2</code> or <code>HP 2</code>, because that would change the low band itself.</p>
<p dir="auto">We only want it to carry the phase movement from crossover 2.</p>
<p dir="auto">That is what an allpass is for in this situation:</p>
<pre><code class="language-text">Low:
LP 1 -&gt; AP 2
</code></pre>
<p dir="auto">Now the full 3-band layout is:</p>
<pre><code class="language-text">Low:
LP 1 -&gt; AP 2

Mid:
HP 1 -&gt; LP 2

High:
HP 1 -&gt; HP 2
</code></pre>
<p dir="auto">This is the correct layout to copy.</p>
<p dir="auto"><img src="/assets/uploads/files/1780596896033-a4fd7eb8-0227-4640-b851-5e5d7b01fecc-image.png" alt="a4fd7eb8-0227-4640-b851-5e5d7b01fecc-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">The allpass is not changing the frequency balance. It is just giving the low path the same phase movement from crossover 2, so everything adds back together properly.</p>
<p dir="auto">No more frequency dip! : )</p>
<p dir="auto"><img src="/assets/uploads/files/1780596966700-895d9d21-f183-4d91-bebc-b6c0bd9e3a01-image.png" alt="895d9d21-f183-4d91-bebc-b6c0bd9e3a01-image.png" class=" img-fluid img-markdown" /></p>
<hr />
<h2>Add your effects after the splitter</h2>
<p dir="auto">Once the splitter is correct, add whatever effects you wanted to apply to each band, after the crossover nodes.</p>
<p dir="auto"><img src="/assets/uploads/files/1780597118572-4f2f6c13-3f38-4da1-aaa6-42b86812ee36-image.png" alt="4f2f6c13-3f38-4da1-aaa6-42b86812ee36-image.png" class=" img-fluid img-markdown" /></p>
<hr />
<h2>The generic recipe</h2>
<p dir="auto">Once you understand the 3-band version, the bigger versions are just more of the same.</p>
<p dir="auto">The practical way to do this is to work <strong>band by band</strong>.</p>
<p dir="auto">Each band is one branch in your <code>container.split</code>.</p>
<p dir="auto">For each band, you need as many <code>jdsp.jlinkwitzriley</code> filters as crossover frequencies.</p>
<p dir="auto">So if you want <strong>6 bands</strong>, that means you'll have <strong>5 crossovers</strong>, and so each branch should have 5 Linkwitz-Riley filters placed inside it.</p>
<p dir="auto">The filter modes change depending on which band you are making.</p>
<p dir="auto">For <strong>Band "X"</strong>:</p>
<ul>
<li>add <strong>HP</strong> filters for every crossover before Band "X"</li>
<li>add <strong>LP</strong> for the crossover at the top of Band "X"</li>
<li>add <strong>AP</strong> filters for every crossover above Band "X"</li>
</ul>
<p dir="auto">The top band is the only exception.</p>
<p dir="auto">It has no top cutoff, so it is just <strong>HP</strong> for every crossover.</p>
<p dir="auto">Lets do an example with a 6-band splitter.<br />
A 6 band splitter has 5 crossovers, so needs 5 filters on each band:</p>
<pre><code class="language-text">Band 1:
LP 1 -&gt; AP 2 -&gt; AP 3 -&gt; AP 4 -&gt; AP 5

Band 2:
HP 1 -&gt; LP 2 -&gt; AP 3 -&gt; AP 4 -&gt; AP 5

Band 3:
HP 1 -&gt; HP 2 -&gt; LP 3 -&gt; AP 4 -&gt; AP 5

Band 4:
HP 1 -&gt; HP 2 -&gt; HP 3 -&gt; LP 4 -&gt; AP 5

Band 5:
HP 1 -&gt; HP 2 -&gt; HP 3 -&gt; HP 4 -&gt; LP 5

Band 6:
HP 1 -&gt; HP 2 -&gt; HP 3 -&gt; HP 4 -&gt; HP 5
</code></pre>
<p dir="auto">The <strong>HP</strong> filters get set to the frequency of the band above the lower crossovers.</p>
<p dir="auto">The <strong>LP</strong> filter gets set to the frequency of the top edge of that band.</p>
<p dir="auto">The <strong>AP</strong> filters are only phase compensation for the higher crossovers and so need those frequencies.</p>
<p dir="auto">The rule is not hard.<br />
But the bookkeeping is a bit fiddly.</p>
<hr />
<h2>One last trap</h2>
<p dir="auto">A Linkwitz-Riley multiband split does sum back flat, but it is not phase-identical to the untouched dry signal.</p>
<p dir="auto">So be careful with global dry/wet mixing:</p>
<pre><code class="language-text">untouched dry signal
+
recombined multiband signal
</code></pre>
<p dir="auto">That can create a new cancellation problem after you already fixed the splitter.</p>
<p dir="auto">For parallel multiband effects, either mix dry/wet inside the bands, or send the dry path through the same crossover phase path.</p>
<hr />
<p dir="auto">And that's it!<br />
A native ScriptNode multiband splitter, without the giant spectral bite taken out of it.</p>
<p dir="auto">Viola : )</p>
<hr />
<p dir="auto">Extra note: HISE actually has some built-in templates for splitting, but they are set up wrong with mistakes, and so they don't sum together properly!</p>
<p dir="auto"><img src="/assets/uploads/files/1780603082132-2ede47c8-58d6-4162-a37d-8a249a996f03-image.png" alt="2ede47c8-58d6-4162-a37d-8a249a996f03-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1780602902138-6a49b5be-e575-4699-a2b4-03f96533cc47-image.png" alt="6a49b5be-e575-4699-a2b4-03f96533cc47-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Also, Hise's Linkwitz-Riley filters aren't using modulation safe designs.<br />
So if you modulate the crossovers you'll get some pretty bad pops and clicks. This isn't due to parameters needing smoothing. This is to do with the way the filters are written internally.</p>
]]></description><link>https://forum.hise.audio/topic/14808/tutorial-how-to-multiband-in-scriptnode-without-artefacts</link><generator>RSS for Node</generator><lastBuildDate>Thu, 04 Jun 2026 23:19:56 GMT</lastBuildDate><atom:link href="https://forum.hise.audio/topic/14808.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Jun 2026 20:04:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Tutorial] How to Multiband in Scriptnode (without artefacts!) on Thu, 04 Jun 2026 20:19:32 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/357">@dannytaurus</a><br />
I fear I might have explained it badly - only after I started writing this article did I realise how difficult it was to put into words!</p>
<p dir="auto">Luckily, Chat GPT exists, and anybody who doesn't have a clue what I'm trying to explain, can hopefully just ask GPT to elaborate  <img src="https://forum.hise.audio/assets/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f601.png?v=fba14f4754a" class="not-responsive emoji emoji-emoji-one emoji--beaming_face_with_smiling_eyes" style="height:23px;width:auto;vertical-align:middle" title=":beaming_face_with_smiling_eyes:" alt="😁" /></p>
]]></description><link>https://forum.hise.audio/post/120849</link><guid isPermaLink="true">https://forum.hise.audio/post/120849</guid><dc:creator><![CDATA[griffinboy]]></dc:creator><pubDate>Thu, 04 Jun 2026 20:19:32 GMT</pubDate></item><item><title><![CDATA[Reply to [Tutorial] How to Multiband in Scriptnode (without artefacts!) on Thu, 04 Jun 2026 20:15:10 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.hise.audio/uid/3542">@griffinboy</a> Great stuff! <img src="https://forum.hise.audio/assets/plugins/nodebb-plugin-emoji/emoji/android/1f44f.png?v=fba14f4754a" class="not-responsive emoji emoji-android emoji--clap" style="height:23px;width:auto;vertical-align:middle" title=":clap:" alt="👏" /></p>
]]></description><link>https://forum.hise.audio/post/120848</link><guid isPermaLink="true">https://forum.hise.audio/post/120848</guid><dc:creator><![CDATA[dannytaurus]]></dc:creator><pubDate>Thu, 04 Jun 2026 20:15:10 GMT</pubDate></item></channel></rss>