Beta Testers

All developers participating in the HISE Betatest Program

Private

Posts

  • [BLOG] How does DSP work? [Part 3]

    Part 1
    Part 2

    How does DSP work? [Part 3]

    This time, we're going to look at distortion.

    In Part 1, I briefly described distortion as "bending the waveform" by changing the sample values.
    Now let's unpack what that actually means.

    Distorting a waveform

    To "distort" something means to change its shape.

    A distortion effect does exactly that to a waveform:

    88b1a706-e7d2-401e-8b68-854c0c78a4df-distortion-shape.png

    We talked previously about how in a gain/volume effect, every sample is multiplied by the same amount.
    The waveform becomes taller or shorter, but it keeps the same shape.

    A distortion effect changes sample heights by different amounts.
    That is what allows the waveform to bend shape.

    Clipping

    The simplest example of distortion is clipping.

    For example, a clipper that only allows sample values between -1.0 and +1.0.

    (fact: Most audio file formats will clip at this value)

    Values inside that range are left alone.
    Anything above +1.0 or below -1.0 is clamped.

    Watch what happens as the waveform gets louder:

    62a3a3c9-0cde-49d6-b4ff-55b81cf7b7a9-clipping-drive.gif

    At first, the waveform simply gets taller.

    Once the peaks reach the limits, they cannot get any taller.
    That's how a clipper works. This is a distortion.

    Let's zoom in and look at a few of the sample values:

    585f2c9d-f85f-433e-bd11-bcb730cc0210-clipping-samples.png

    Only the sample values that exceed the limits are changed.
    The extra height is cut off, leaving the waveform with flat edges.

    In pseudocode, the whole effect could be written like this:

    for each sample in the buffer:
        sample = clamp(sample, -1.0, 1.0)
    

    In other words:
    if the sample value is less than -1.0, it gets set to -1.0.
    if the sample value is greater than 1.0, it gets set to 1.0.

    Waveshaping

    This kind of distortion is called a Waveshaper.
    Hardclipping is just the straightforward clamp.

    9bcd1f2d-c637-45bc-850e-ff1a41ad3482-function-one-value.png

    But we can use other rules/functions to create different waveshapers.

    You can create waveshapers by defining a function that maps input values to output values.

    174ff98f-2991-4840-8d7f-c14e30f8cde7-mapping-pairs.png

    In other words:
    If the original sample value is equal to -0.75 we set it to -0.88.
    If the original sample value is equal to -0.50 we set it to -0.67,
    and so on.

    This is called mapping.
    One value is mapped to another value.

    And the table is called a lookup table.

    Drawing the table

    The input and output mapping can also be drawn as points on a graph.
    You've probably seen this kind of thing before:

    aab8ad25-cb34-43a8-bfd2-3e89c5bef259-mapping-curve.png

    It's an easy way to visualize the waveshaper.

    Input values run along the bottom.
    Output values run up the right side.

    To look up an input of 0.50, start at 0.50 along the bottom, move up until the line is reached, then move right to read the output:

    db05a93e-37b5-4e34-bf1c-026ffa55ce31-curve-lookup.gif

    The result is 0.67.

    This plot is called a transfer curve or waveshaper curve.

    bc282e62-4fae-4ad5-b594-ef945a0d6966-identity-and-shaper.png

    Bending the line means we are mapping the samples to different output values.

    A waveshaper

    Here is a waveshaper processing a waveform:

    4fa77841-29c4-448a-bd75-340360a71ff0-waveshaper-samples.gif

    For each sample of the original wave, we look up the input value on the transfer curve,
    and replace it with the corresponding output value.

    The same process on a more dense smooth waveform looks like this:

    89c81430-ee51-4fca-94af-020254731854-waveshaper-waveform.png

    The Math

    The input and output mappings do not have to be stored in a lookup table.
    Some waveshaper distortions use a table, but some use a formula instead.

    Here is the most common "soft-clipping" formula:

    output = tanh(input * drive)
    

    input is the current sample value.
    tanh is a math function that returns the new sample value.

    The function is simply another way of providing an input-to-output map.

    (You could also use sin, cos, or any other function that takes an input value and gives you an output value!)

    The drive multiplication in my code makes the original sample value larger (increases gain) before tanh waveshapes the output.
    Tanh has more of a shape at the extreme edges, so increasing the volume of our waveform means we get mapped with all those strong parts of the curve.
    And get a more warped (distorted) waveform.

    bcdc3b56-7673-49dc-aba6-bc153a4f23b7-waveshaper-drive.gif

    Basically we get more distortion when we go into the waveshaper with a louder signal.

    The algorithm is still very simple:

    for each sample in the buffer:
        sample = tanh(sample * drive)
    

    In HISE-style C++:

    b1aa719a-7b52-4613-abb3-cb385b65a8d1-hise-waveshaper-cpp.png

    HISE's math.expr node does exactly this kind of thing, and it lets you type in your own waveshaping formula!

    85d91bf7-130f-483c-b0d7-a486664dd23f-image.png

    What distortion sounds like

    Different shaped waveforms sound different (well duh).

    A sine wave sounds smooth and pure.
    A square wave sounds harsh and loud.

    When we apply waveshaping, we are bending the waveform to make new waveforms.

    37ec97d5-de58-43d0-af8c-a7215c506e4c-distortion-harmonics.png

    More bending changes the shape more (and creates all kinds of harmonics)!

    You can use a lot of different kinds of formulas to bend waveforms in weird ways.
    Different transfer curves create different effects!

    ea20e5d9-6987-4cfe-b677-6fb11a2d830f-distortion-family.png

    To Recap

    A distortion effect changes the shape of a waveform by altering the sample values.

    A clipper does this by limiting/clamping sample values.

    Waveshapers use a function to map each input sample value to a new output value.
    You can visualise this mapping nicely as a transfer curve.

    Apply the mapping to every sample in the buffer, and the new sample heights you get, form a distorted waveform.

    That is how a waveshaper works.

    posted in C++ Development
  • RE: Mono plugin with side-chain

    Claude said:

    Main bus   Sidechain   Host buffer  SC lands at    Internal scratch
    mono         mono         2 ch        buf 1        [m0][m0][sc0][sc0]
    mono         stereo       3 ch        buf 1–2      [m0][m0][scL][scR]
    stereo       mono         3 ch        buf 2        [L][R][sc0][sc0]
    stereo       stereo       4 ch        buf 2–3      [L][R][scL][scR]
    either	     none          —           —           ch2/3 silent
    

    So a mono-track instance sidechained from a stereo source works fine: the mono main is duplicated across ch0/1 (HISE renders internally in stereo regardless) and only channel 0 is copied back out, while the stereo sidechain keeps its L/R on ch2/3. A mono sidechain gets duplicated. The network always sees one fixed layout — no mode-dependent logic anywhere.

    Stereo sidechain detection is genuine, not left-channel-only. envelope_follower::processFrame takes max(abs(s)) across all channels of the frame, so it detects the louder of L/R.

    I say:
    All good 👍

    posted in Feature Requests
  • RE: Mono plugin with side-chain

    @dannytaurus said in Mono plugin with side-chain:

    @ustk What's your intention behind mono compatibility? Is it for a specific DAW?

    Simply for mono tracks like compressing bass for instance where you might need sidechain with the kick

    And are you looking for mono sidechain input, or stereo?

    In the end I think I just need to "monoize" the sidechain if it's forced stereo with mono plugins. I still have to investigate this, but it's not crucial as long as a mono track goes through the first SC channel... The ideal is to have the possibility to connect either mono or stereo SC no matter if the plugin is inserted on a mono or stereo track.

    @HISEnberg Nice! Claude patched Hise for me, I am testing it in the afternoon...
    If yours was made a few years ago then it might not account for the existence of HISE_SIDECHAIN_CHANNEL_LAYOUT

    posted in Feature Requests
  • RE: Mono plugin with side-chain

    @ustk I’m away from my system, but i did this a few years back (mono and stereo with sidechain support for VST3/AU/AAX). I had to modify the HISE source code at the time, perhaps this is built in now.. Once I have a moment I’ll share with you the process ;)

    posted in Feature Requests
  • RE: Mono plugin with side-chain

    @Oli-Ullmann Yes, that's why I've made a patch and hopefully a PR soon.

    posted in Feature Requests
  • RE: Mono plugin with side-chain

    @dannytaurus
    So if I understand this cortect, it's only for stereo plug-ins?

    If we have HI_SUPPORT_MONO_CHANNEL_LAYOUT enabled, we have to compile two versions of our plug-in?

    One stereo with sidechain and one mono without sidechain?

    posted in Feature Requests
  • RE: How to move the position of the console tab?

    @observantsound Aha ok, I didn't realise how old that video was. The basic layout controls are the same though.

    @observantsound said in How to move the position of the console tab?:

    When I do Show Custom Workspace, then it appears instead of the UI editor. But Code Editor and Module Tree tabs are still there.

    The custom workspace always shows at the right side of the screen. You need to readd the interface designer and anything else you want.

    Here's mine which you can load up using the Load from JSON option

    {
      "Type": "HorizontalTile",
      "Title": "Custom Workspace",
      "StyleData": {
      },
      "Font": "",
      "FontSize": 16.0,
      "LayoutData": {
        "ID": "CustomWorkspace",
        "Size": -0.5,
        "Folded": -1,
        "Visible": true,
        "ForceFoldButton": 0,
        "ForceShowTitle": 0,
        "MinSize": -1
      },
      "ColourData": {
      },
      "Content": [
        {
          "Type": "HorizontalTile",
          "StyleData": {
          },
          "Font": "",
          "FontSize": 16.0,
          "LayoutData": {
            "ID": "anonymous",
            "Size": -0.5,
            "Folded": -1,
            "Visible": true,
            "ForceFoldButton": 0,
            "ForceShowTitle": 0,
            "MinSize": -1
          },
          "ColourData": {
          },
          "Content": [
            {
              "Type": "Tabs",
              "StyleData": {
              },
              "Font": "",
              "FontSize": 16.0,
              "LayoutData": {
                "ID": "anonymous",
                "Size": -0.7089258744251568,
                "Folded": -1,
                "Visible": true,
                "ForceFoldButton": 0,
                "ForceShowTitle": 0,
                "MinSize": -1
              },
              "ColourData": {
              },
              "Content": [
                {
                  "Type": "VerticalTile",
                  "StyleData": {
                  },
                  "Font": "",
                  "FontSize": 16.0,
                  "LayoutData": {
                    "ID": "anonymous",
                    "Size": -0.5,
                    "Folded": 0,
                    "Visible": true,
                    "ForceFoldButton": 0,
                    "ForceShowTitle": 0,
                    "MinSize": -1
                  },
                  "ColourData": {
                  },
                  "Content": [
                    {
                      "Type": "ScriptComponentList",
                      "StyleData": {
                      },
                      "Font": "",
                      "FontSize": 16.0,
                      "LayoutData": {
                        "ID": "anonymous",
                        "Size": -0.21505048318491,
                        "Folded": 0,
                        "Visible": true,
                        "ForceFoldButton": 0,
                        "ForceShowTitle": 0,
                        "MinSize": -1
                      },
                      "ColourData": {
                      },
                      "ProcessorId": "Interface",
                      "Index": 0,
                      "FollowWorkspace": false,
                      "Openess": true
                    },
                    {
                      "Type": "ScriptContent",
                      "StyleData": {
                      },
                      "Font": "",
                      "FontSize": 16.0,
                      "LayoutData": {
                        "ID": "anonymous",
                        "Size": -0.9208939579940479,
                        "Folded": 0,
                        "Visible": true,
                        "ForceFoldButton": 0,
                        "ForceShowTitle": 0,
                        "MinSize": -1
                      },
                      "ColourData": {
                      },
                      "ProcessorId": "Interface",
                      "Index": 0,
                      "FollowWorkspace": false,
                      "EditMode": true
                    },
                    {
                      "Type": "InterfacePropertyEditor",
                      "StyleData": {
                      },
                      "Font": "",
                      "FontSize": 16.0,
                      "LayoutData": {
                        "ID": "anonymous",
                        "Size": -0.2599186681484935,
                        "Folded": 0,
                        "Visible": true,
                        "ForceFoldButton": 0,
                        "ForceShowTitle": 0,
                        "MinSize": -1
                      },
                      "ColourData": {
                      },
                      "ProcessorId": "Interface",
                      "Index": 0,
                      "FollowWorkspace": false
                    }
                  ]
                },
                {
                  "Type": "ScriptEditor",
                  "StyleData": {
                  },
                  "Font": "",
                  "FontSize": 16.0,
                  "LayoutData": {
                    "ID": "anonymous",
                    "Size": -0.5,
                    "Folded": 0,
                    "Visible": true,
                    "ForceFoldButton": 0,
                    "ForceShowTitle": 0,
                    "MinSize": -1
                  },
                  "ColourData": {
                  },
                  "ProcessorId": "Interface",
                  "Index": 15,
                  "FollowWorkspace": false,
                  "ScriptFile": "Expansions.js"
                },
                {
                  "Type": "ScriptEditor",
                  "StyleData": {
                  },
                  "Font": "",
                  "FontSize": 16.0,
                  "LayoutData": {
                    "ID": "anonymous",
                    "Size": -0.5,
                    "Folded": 0,
                    "Visible": true,
                    "ForceFoldButton": 0,
                    "ForceShowTitle": 0,
                    "MinSize": -1
                  },
                  "ColourData": {
                  },
                  "ProcessorId": "Interface",
                  "Index": 28,
                  "FollowWorkspace": false,
                  "ScriptFile": "RhapsodyFramework/Core/includes/UserSettings.js"
                },
                {
                  "Type": "ScriptEditor",
                  "Title": "onInit",
                  "StyleData": {
                  },
                  "Font": "",
                  "FontSize": 16.0,
                  "LayoutData": {
                    "ID": "anonymous",
                    "Size": -0.5,
                    "Folded": 0,
                    "Visible": true,
                    "ForceFoldButton": 0,
                    "ForceShowTitle": 0,
                    "MinSize": -1,
                    "FocusKeyPress": "",
                    "FoldKeyPress": ""
                  },
                  "ColourData": {
                  },
                  "ProcessorId": "Interface",
                  "Index": 0,
                  "FollowWorkspace": false,
                  "ScriptFile": "RhapsodyFramework/Core/includes/Fonts.js"
                },
                {
                  "Type": "VerticalTile",
                  "Title": "Dual Sampler",
                  "StyleData": {
                  },
                  "Font": "",
                  "FontSize": 16.0,
                  "LayoutData": {
                    "ID": "anonymous",
                    "Size": -0.5,
                    "Folded": 0,
                    "Visible": true,
                    "ForceFoldButton": 0,
                    "ForceShowTitle": 0,
                    "MinSize": -1,
                    "FocusKeyPress": "",
                    "FoldKeyPress": ""
                  },
                  "ColourData": {
                  },
                  "Content": [
                    {
                      "Type": "HorizontalTile",
                      "StyleData": {
                      },
                      "Font": "",
                      "FontSize": 16.0,
                      "LayoutData": {
                        "ID": "anonymous",
                        "Size": -0.5,
                        "Folded": -1,
                        "Visible": true,
                        "ForceFoldButton": 0,
                        "ForceShowTitle": 0,
                        "MinSize": -1,
                        "FocusKeyPress": "",
                        "FoldKeyPress": ""
                      },
                      "ColourData": {
                      },
                      "Content": [
                        {
                          "Type": "GlobalConnectorStreamingSampler",
                          "StyleData": {
                          },
                          "Font": "",
                          "FontSize": 16.0,
                          "LayoutData": {
                            "ID": "anonymous",
                            "Size": 18.0,
                            "Folded": 0,
                            "Visible": true,
                            "ForceFoldButton": 0,
                            "ForceShowTitle": 0,
                            "MinSize": -1,
                            "FocusKeyPress": "",
                            "FoldKeyPress": ""
                          },
                          "ColourData": {
                          },
                          "ProcessorId": "",
                          "Index": -1,
                          "FollowWorkspace": false
                        },
                        {
                          "Type": "SampleEditor",
                          "StyleData": {
                          },
                          "Font": "",
                          "FontSize": 16.0,
                          "LayoutData": {
                            "ID": "anonymous",
                            "Size": -0.54359197907585,
                            "Folded": 0,
                            "Visible": true,
                            "ForceFoldButton": 0,
                            "ForceShowTitle": 0,
                            "MinSize": -1,
                            "FocusKeyPress": "",
                            "FoldKeyPress": ""
                          },
                          "ColourData": {
                          },
                          "ProcessorId": "",
                          "Index": -1,
                          "FollowWorkspace": false
                        },
                        {
                          "Type": "SampleMapEditor",
                          "StyleData": {
                          },
                          "Font": "",
                          "FontSize": 16.0,
                          "LayoutData": {
                            "ID": "anonymous",
                            "Size": -0.45640802092415,
                            "Folded": 0,
                            "Visible": true,
                            "ForceFoldButton": 0,
                            "ForceShowTitle": 0,
                            "MinSize": -1,
                            "FocusKeyPress": "",
                            "FoldKeyPress": ""
                          },
                          "ColourData": {
                          },
                          "ProcessorId": "",
                          "Index": -1,
                          "FollowWorkspace": false
                        }
                      ]
                    },
                    {
                      "Type": "HorizontalTile",
                      "StyleData": {
                      },
                      "Font": "",
                      "FontSize": 16.0,
                      "LayoutData": {
                        "ID": "anonymous",
                        "Size": -0.5,
                        "Folded": -1,
                        "Visible": true,
                        "ForceFoldButton": 0,
                        "ForceShowTitle": 0,
                        "MinSize": -1,
                        "FocusKeyPress": "",
                        "FoldKeyPress": ""
                      },
                      "ColourData": {
                      },
                      "Content": [
                        {
                          "Type": "GlobalConnectorStreamingSampler",
                          "StyleData": {
                          },
                          "Font": "",
                          "FontSize": 16.0,
                          "LayoutData": {
                            "ID": "anonymous",
                            "Size": 18.0,
                            "Folded": 0,
                            "Visible": true,
                            "ForceFoldButton": 0,
                            "ForceShowTitle": 0,
                            "MinSize": -1,
                            "FocusKeyPress": "",
                            "FoldKeyPress": ""
                          },
                          "ColourData": {
                          },
                          "ProcessorId": "",
                          "Index": -1,
                          "FollowWorkspace": false
                        },
                        {
                          "Type": "SampleEditor",
                          "StyleData": {
                          },
                          "Font": "",
                          "FontSize": 16.0,
                          "LayoutData": {
                            "ID": "anonymous",
                            "Size": -0.5435471100554236,
                            "Folded": 0,
                            "Visible": true,
                            "ForceFoldButton": 0,
                            "ForceShowTitle": 0,
                            "MinSize": -1,
                            "FocusKeyPress": "",
                            "FoldKeyPress": ""
                          },
                          "ColourData": {
                          },
                          "ProcessorId": "",
                          "Index": -1,
                          "FollowWorkspace": false
                        },
                        {
                          "Type": "SampleMapEditor",
                          "StyleData": {
                          },
                          "Font": "",
                          "FontSize": 16.0,
                          "LayoutData": {
                            "ID": "anonymous",
                            "Size": -0.4564528899445764,
                            "Folded": 0,
                            "Visible": true,
                            "ForceFoldButton": 0,
                            "ForceShowTitle": 0,
                            "MinSize": -1,
                            "FocusKeyPress": "",
                            "FoldKeyPress": ""
                          },
                          "ColourData": {
                          },
                          "ProcessorId": "",
                          "Index": -1,
                          "FollowWorkspace": false
                        }
                      ]
                    }
                  ]
                },
                {
                  "Type": "HorizontalTile",
                  "Title": "Sampler",
                  "StyleData": {
                  },
                  "Font": "",
                  "FontSize": 16.0,
                  "LayoutData": {
                    "ID": "anonymous",
                    "Size": -0.5,
                    "Folded": 0,
                    "Visible": true,
                    "ForceFoldButton": 0,
                    "ForceShowTitle": 0,
                    "MinSize": -1,
                    "FocusKeyPress": "",
                    "FoldKeyPress": ""
                  },
                  "ColourData": {
                  },
                  "Content": [
                    {
                      "Type": "GlobalConnectorStreamingSampler",
                      "StyleData": {
                      },
                      "Font": "",
                      "FontSize": 16.0,
                      "LayoutData": {
                        "ID": "anonymous",
                        "Size": 18.0,
                        "Folded": 0,
                        "Visible": true,
                        "ForceFoldButton": 0,
                        "ForceShowTitle": 0,
                        "MinSize": -1,
                        "FocusKeyPress": "",
                        "FoldKeyPress": ""
                      },
                      "ColourData": {
                      },
                      "ProcessorId": "",
                      "Index": -1,
                      "FollowWorkspace": false
                    },
                    {
                      "Type": "SampleEditor",
                      "StyleData": {
                      },
                      "Font": "",
                      "FontSize": 16.0,
                      "LayoutData": {
                        "ID": "anonymous",
                        "Size": -0.7952971198946208,
                        "Folded": 0,
                        "Visible": true,
                        "ForceFoldButton": 0,
                        "ForceShowTitle": 0,
                        "MinSize": -1,
                        "FocusKeyPress": "",
                        "FoldKeyPress": ""
                      },
                      "ColourData": {
                      },
                      "ProcessorId": "",
                      "Index": -1,
                      "FollowWorkspace": false
                    },
                    {
                      "Type": "VerticalTile",
                      "StyleData": {
                      },
                      "Font": "",
                      "FontSize": 16.0,
                      "LayoutData": {
                        "ID": "anonymous",
                        "Size": -0.204702880105379,
                        "Folded": -1,
                        "Visible": true,
                        "ForceFoldButton": 0,
                        "ForceShowTitle": 0,
                        "MinSize": -1,
                        "FocusKeyPress": "",
                        "FoldKeyPress": ""
                      },
                      "ColourData": {
                      },
                      "Content": [
                        {
                          "Type": "SampleMapEditor",
                          "StyleData": {
                          },
                          "Font": "",
                          "FontSize": 16.0,
                          "LayoutData": {
                            "ID": "anonymous",
                            "Size": -0.7360655737704918,
                            "Folded": 0,
                            "Visible": true,
                            "ForceFoldButton": 0,
                            "ForceShowTitle": 0,
                            "MinSize": -1,
                            "FocusKeyPress": "",
                            "FoldKeyPress": ""
                          },
                          "ColourData": {
                          },
                          "ProcessorId": "",
                          "Index": -1,
                          "FollowWorkspace": false
                        },
                        {
                          "Type": "SamplerTable",
                          "StyleData": {
                          },
                          "Font": "",
                          "FontSize": 16.0,
                          "LayoutData": {
                            "ID": "anonymous",
                            "Size": -0.2639344262295082,
                            "Folded": 0,
                            "Visible": true,
                            "ForceFoldButton": 0,
                            "ForceShowTitle": 0,
                            "MinSize": -1,
                            "FocusKeyPress": "",
                            "FoldKeyPress": ""
                          },
                          "ColourData": {
                          },
                          "ProcessorId": "",
                          "Index": -1,
                          "FollowWorkspace": false
                        }
                      ]
                    }
                  ]
                },
                {
                  "Type": "Console",
                  "StyleData": {
                  },
                  "Font": "",
                  "FontSize": 16.0,
                  "LayoutData": {
                    "ID": "anonymous",
                    "Size": -0.5,
                    "Folded": 0,
                    "Visible": true,
                    "ForceFoldButton": 0,
                    "ForceShowTitle": 0,
                    "MinSize": -1,
                    "FocusKeyPress": "",
                    "FoldKeyPress": ""
                  },
                  "ColourData": {
                  }
                }
              ],
              "CurrentTab": 0,
              "CycleKeyPress": ""
            },
            {
              "Type": "Tabs",
              "StyleData": {
              },
              "Font": "",
              "FontSize": 16.0,
              "LayoutData": {
                "ID": "anonymous",
                "Size": -0.2920741255748428,
                "Folded": -1,
                "Visible": true,
                "ForceFoldButton": 0,
                "ForceShowTitle": 0,
                "MinSize": -1
              },
              "ColourData": {
              },
              "Content": [
                {
                  "Type": "ScriptEditor",
                  "Title": "onInit",
                  "StyleData": {
                  },
                  "Font": "",
                  "FontSize": 16.0,
                  "LayoutData": {
                    "ID": "anonymous",
                    "Size": -0.5,
                    "Folded": 0,
                    "Visible": true,
                    "ForceFoldButton": 0,
                    "ForceShowTitle": 0,
                    "MinSize": -1
                  },
                  "ColourData": {
                  },
                  "ProcessorId": "Interface",
                  "Index": 0,
                  "FollowWorkspace": false,
                  "ScriptFile": ""
                },
                {
                  "Type": "ServerController",
                  "StyleData": {
                  },
                  "Font": "",
                  "FontSize": 16.0,
                  "LayoutData": {
                    "ID": "anonymous",
                    "Size": -0.5,
                    "Folded": 0,
                    "Visible": true,
                    "ForceFoldButton": 0,
                    "ForceShowTitle": 0,
                    "MinSize": -1
                  },
                  "ColourData": {
                  },
                  "ProcessorId": "Interface",
                  "Index": 0,
                  "FollowWorkspace": false
                },
                {
                  "Type": "DspNetworkGraph",
                  "StyleData": {
                  },
                  "Font": "",
                  "FontSize": 16.0,
                  "LayoutData": {
                    "ID": "anonymous",
                    "Size": -0.5,
                    "Folded": 0,
                    "Visible": true,
                    "ForceFoldButton": 0,
                    "ForceShowTitle": 0,
                    "MinSize": -1,
                    "FocusKeyPress": "",
                    "FoldKeyPress": ""
                  },
                  "ColourData": {
                  },
                  "ProcessorId": "Interface",
                  "Index": 0,
                  "FollowWorkspace": false
                },
                {
                  "Type": "ScriptBroadcasterMap",
                  "StyleData": {
                  },
                  "Font": "",
                  "FontSize": 16.0,
                  "LayoutData": {
                    "ID": "anonymous",
                    "Size": -0.5,
                    "Folded": 0,
                    "Visible": true,
                    "ForceFoldButton": 0,
                    "ForceShowTitle": 0,
                    "MinSize": -1,
                    "FocusKeyPress": "",
                    "FoldKeyPress": ""
                  },
                  "ColourData": {
                  },
                  "ProcessorId": "Interface",
                  "Index": 0,
                  "FollowWorkspace": false,
                  "Active": false
                },
                {
                  "Type": "ScriptContent",
                  "StyleData": {
                  },
                  "Font": "",
                  "FontSize": 16.0,
                  "LayoutData": {
                    "ID": "anonymous",
                    "Size": -0.5,
                    "Folded": 0,
                    "Visible": true,
                    "ForceFoldButton": 0,
                    "ForceShowTitle": 0,
                    "MinSize": -1,
                    "FocusKeyPress": "",
                    "FoldKeyPress": ""
                  },
                  "ColourData": {
                  },
                  "ProcessorId": "Interface",
                  "Index": 0,
                  "FollowWorkspace": false,
                  "EditMode": true
                }
              ],
              "CurrentTab": 1,
              "CycleKeyPress": ""
            }
          ]
        }
      ]
    }
    

    The vertical console is in a tab.

    posted in Newbie League
  • RE: VST/plugin GUI design + launch graphics — ads, motion, web

    Latest UI Experiment.

    VERY inspired by Neural DSP ;)

    This is a blend of Figma and Blender.
    Kind of a cross between steampunk and the 60´s , refined steampunk I guess you could say.

    Sundial UI

    SundialFINAL 3.png

    Sundial Standalone

    Sundial DAW.png

    Sundial 16:9 AD

    Sundial wide.png

    Sundial 4:5 AD

    Sundial Hi.png

    posted in General Questions
  • RE: How to move the position of the console tab?

    @observantsound said in How to move the position of the console tab?:

    but it is a bit out of date.

    In what way?

    @observantsound said in How to move the position of the console tab?:

    I'd like to have my code console in a vertical tab instead of a horizontal one, but keep my code editor as a horizontal.

    Custom workspace of a floating window is the way to go.

    posted in Newbie League
  • RE: Mono plugin with side-chain

    @David-Healey Well this is new to me so not very clear yet.
    But the old trick was to add more channels in the the routing matrix and route them the way you want.

    Now on top of this there are extra proc:
    HISE_NUM_FX_PLUGIN_CHANNELS=4 which is the normal num channel + the sidechain channels
    And
    HISE_SIDECHAIN_CHANNEL_LAYOUT=1 which I didn't know about until tonight...

    I'll try tomorrow to actually export a test plugin and see how it goes...

    posted in Feature Requests