HISE Logo Forum
    • Categories
    • Register
    • Login
    1. HISE
    2. aaronventure
    A
    • Profile
    • Following 0
    • Followers 3
    • Topics 167
    • Posts 1,714
    • Groups 1

    aaronventure

    @aaronventure

    Beta Testers

    730
    Reputation
    191
    Profile views
    1.7k
    Posts
    3
    Followers
    0
    Following
    Joined
    Last Online

    aaronventure Unfollow Follow
    Beta Testers

    Best posts made by aaronventure

    • Visage: Open Source C++ Graphics Library

      Found this on the Audio Programmer YouTube channel. Open and MIT-licensed. @Christoph-Hart I remember you saying that the new animation framework would be one of the reasons to upgrade to JUCE 8. Would this serve as an alternative instead?

      The examples are really cool, there are some great things in there.

      Link Preview Image
      GitHub - VitalAudio/visage: C++ UI library meets creative coding

      C++ UI library meets creative coding. Contribute to VitalAudio/visage development by creating an account on GitHub.

      favicon

      GitHub (github.com)

      posted in General Questions
      A
      aaronventure
    • RE: The big bug tier list

      @DanH said in The big bug tier list:

      but I have to re-set my midi controller in the Hise settings every time I open Hise!

      this happens on crashes too, but I've been using this for a long time now and completely forgot that this is still actually an issue

      https://forum.hise.audio//post/80689

      defo not a long term solution but might help your sanity until it gets fixed. the fact that I can hardcode it like that with a few lines of code and it remains consistent through everything means it should not be that hard of a fix so we never ever have to go back and change it

      There we go, I made an issue for this

      Link Preview Image
      [UX] HISE sometimes resets audio device and midi device settings · Issue #716 · christophhart/HISE

      This happens on crashes and some other instances. I made a workaround here https://forum.hise.audio//post/80689 and forgot about this, but it is a major issue. HISE should never manually reset the selection of an audio device or a MIDI d...

      favicon

      GitHub (github.com)

      posted in Bug Reports
      A
      aaronventure
    • Snippet/Network: AHDSR Envelope with Curves

      Lots of talk about this, so I created it in ScriptNode for everyone to use. Made possible by the relatively new compare node!

      18f950d4-ec12-4b7b-843c-36cbcbcef01a-image.png

      The network is fully commented so you can understand how or why it works. The parameters are ready for usage from the interface script.

      How to Use

      1. Add the .xml file to your project/DSPNetworks/Networks directory
      2. Restart HISE
      3. Add the Script Envelope Modulator to your sound generator's GainModulation section and load the network from the dropdown menu.
        c26bb289-c5dc-49b3-a37a-ec276dd2a4ab-image.png

      Download

      Download the file here:
      AHDSREnvelopeWithCurveControl.xml

      Here's a snippet for a quick preview.

      HiseSnippet 3228.3oc6bs0ababElTRypK1oNoNso8oNE8AmT3Hrb2U2PeH1RxWDZjsfVE6hhBHLhb1cmJtbVPNTWRQ+Mz+O8o7Sn+D5Og9beo8LWHWNq4dUqhsakBPr3b8Lm4aNmuygC0QwbeZRBO1wcsSttG0w89nlWGI5rWGBKx4f8cb+InCIIBZLVWztW2ijjPCbbcW7ExBbWcIG0O+quYWRHIxm1uHGm2vY9zuk0kI5W5QO42yBCeNIfdBqagV23IG3yi1iGxSA4YQTUmdD+yIsouhHa1BHmWRR5339aQ02oUsfFzMZrYiy1XyfMp2nVq.5Va4uQvlar4VAPod6Teq5NtUdV.SviaJHBZBLn6xCttYG9kQ5I3MrD1YgT4CdNMgYVWrydcXgAGkobRbbbQG0WUsnVU84nCYAr7x6qx9TUE398nnRycgQIRdSgH4VPjVRKReFpoeLqmneMR44dnChfcvVDXuonnnaqi6Of1iCMHRrdWx4zmGCOj2gubypUeLF9ee0uqUZjufwiv7nWwEzWG8ke0Z+k0Vcs+5Z3AqpUqRqSNMw7vPZboUKgCwipieYTZ2ynwOFeAILkl2PX4aqSqLY5Te8ptPC4QGDwDutG077y4gARck72e2c.GiZC9su6f8IBhbSwTFztdzXASJNt6Su.NFn2hVEsOM4bAuGbP3c1+.jCOHMjHrgSxCZlJ.8g0dnbiJJgItt3AwAwXKMb8Q0B5iwrZmPw8yPGwD9cJWdWnD4EzZ21xq4D6mfdVqVTeQegcIzy+Ci734bWT9BsnbOzaIWPU1ZUBxOS8bKdbW7KnQzXoN0aXVaexudu+wjZss2Das809BPDNIlDkzimP8JNxMocYmvinIVkNPOpUZOrJcepHMxdn0EY0Jop34fpnP6V4IYEVqXgGQhrFL3YqQ5P1U8e7e9MOKh.adMovJO30I9fhQpmKdz4nzvD5aYAhNdE6X+hqUr3WRhCf8PeKv7hSLBpnwH6y3EZeIV9qba4L5GUCE2b6ZKNYh6X7ctrVF+kFemOK5BZHX7NWhUB6CQO8k627X7kLQG7dowW.yeQ48PdDuWGdDyBKbLUDyZ2lZAwJcok4K9wnowuGZNwknfmrWQEWxiOWojL+ti6JRUvuRqBxzOuEzDJEgQHcdZXH+xi3gWmoGTh.MNQt25tLp55v+I4vcBgEZ1i.YcOd2tvTmnauZPfh5wLfBP2pejBHmnHZ3S6xSAI0E4tfzLSZB3sN30QMgVnLGJQ0uhG.+1xOm3CZmqOh.FYA+RR+8.hiFuteNHbbKp96wR4UyD82XvBYcB+1bPANqexU1QjXn8.QJyZSJUYFbQtNJ0tZsqH25tnrdodOS70zuaIGjqN8rPt+4NVqneQgUjUqJSnGXfxmYLvu+bJNIMlxDOJAmP51Kj90De+TvIDc8RVIUKYk7NReEMyyDlb3NkDaK5eNhZTdq2uEkI1EGgbY9OgNoCEmMB3NzXJljJ3cAHiOIL7ZbLElsDrfiO7f8O.yh5kJvIb7kTbZBEyDXvUKV.iRub.KtsZ8VxZCUfMm11g7I376BxE4CPuJsaAMzajGRyvmNMuTxF5DRbapPodJVfgvXDUcfOYfl+N0JOJj8nQQe.nspff4tmStHnK6EvpQcv9c6vxpN3ME83mfTpvSE71sACJVcbYH7BnNEZF1otJiI79rjdgjq2ME3boM5ZUhT6EEPuRRB6q8bdFXgK.7pn5s77fSAUJzl7mfI7PVTlRVZUw4PxUlmWA4UsprnlBZulruW4Yr55xBk+30XmpddaBFCOmdoFPpaP8pdUqCMXmc1twNaU0SYaXEzSEBHDzrczJvfCC89zVjzPgcgNuGjuUQGSCojD5zJfUFt.hPdVRm9Y4rYvGV8ydlzkUbhPiahjC7mXTyJCnSv32mwP9oJmB1bVEEwOsKv4w1hyCKXrLqAkYvoe2yM27Un2RwA7nGIvWRhDZSJfoEiucLXp.KOPkLw1EWFo8.MFGTkIeqf.u8sgQLW7tDsGXtSPUlyRXsiHgIJyafMvN3DYqUzVXQ3t7.0HiijBkwfnOIBLPFvtfEjpLd1KLssbv5BEKWlvv5yiiAiBXvBaGcmK0P4hizP48QGj7FYsfM5r8YEejLUzRETQqgxD1A8bzWKk2hxUTlSuSoa2JZvtxjp0LeOXlioqqpnrIzzmwLcKUB7snY9BFcWA0kE0kb0fla0pto1bqaQys1VWWbxrdspx5ks4qJx1XavR1s5N5c7inwLdfJzS6CyKKGKXjdp1ucd3DSq0i6g9VNuGblHV3XU4bw1jwn2fikmsfCd5KB7KZMJeOzBJ8oJPLvSbcSskCfMUNN.bYHpEJEQsJLuc6QhoC55+aosDCw0OBQBBFBDzBDUYZUtYCy.P.Kk8zuksprUrtocuEbUAiM4J6wtLnl2v82Vp299SkwY8ft+qs8NU2rw10Zrw1ddM1rlAaJa13vlyzgJXngC3SmBblHUrFBBXjDKCFdBlrhmwJB8blZ2NvIVqvTx7jTeFc1TA8RdXvD6pYQK9JYmIKgMfzDQV0kyVIq14mQBczA0lhnCdfUzA0FR3AC0iyDBIU1nlu1JVFcLqcmozwwHA5aMDf98Q6o1nTITZJg5VDG06MSEwjrNkCH9aJzJtWGH1AE8OdDP6KQ5CE9UeMSRM6ISiXIX9Evg.7AQXYr2E5OT0eNMQfImwgXrk8TNa5fxCn.+CVTaM0T832R8v9Tex05QnTljSAMoQh9VQ6io1czk9vgtjVvGBBevcSKj9OO2nnU5HJCzO33jC9+6nuKRvBUnvBvXE5L4w8Av.ZVkznN7TnQmQweOMluNdW.3JSgTd6jQCAQGRSTwGxiOGGxNWVOQ73r7MIarNGTZwQF8XWRjNbKyDI6fNAu3zbArnrUdDWS94j0x7U3UN6ugBwmIO6Yl8muFrMGm8tE31kaoXLR7sOIjFyHIjGhzVUIQA3lfIYY6lTFIHqPuyAJy.kjB8ddyIo9LyIw6NNI2xbRpOKbRpOGyVxplvkqcW5R9X1+uD3DATMkSZIIvUa8IqAk+Fi5WeNV5XzKnBbaYpOaEy6hC1U5B9Lk24.LIAaxY.3wtCyuijTqz8aqPNONixpwj5HHsN5zeVQ9RvySv8pnfypotSGN2XLd+TdXiScKGmtBfnqN3VX0ALRTccaT5CQardiZ0psU0c1ZmM1tZMuslhj3XEua1ZX5SIV+9NKtVbmdGE8Ce3C6TcM2G26Ry0scZt7lV+rCBTmOQF4MGOJUA0MMzaRxU7GMgW38+dgW3MigWz+0MOKo4L6NGLCrD85O7+Q0M+PRx.2KS4.ggG0VkGJl1uevikuYSU7z4QoqCgVmcKBDytf9nD0E9.6GxSFxqybFXe5cG6yac1mdkPcYt7x55uIN6TSJ.VOI2peFERcSzoLxBudlI0oIvNCNfEqwWx1jHXg5bAk.yyMMGPi5d7ja76tWq2c7c9.fuy.X0Ykty.CSgPBOnkwUf7bF7uv4QsCCsaN8UmQmQXimOLvuQv5Ex.uNpCw8yNrb4cyNahjrmdeQdxcg4E0oaEFY0lVbzMl5j0.XcgNJiD0jc2sVCkckgKxnovs2J+Jsd10YPs7Wel48wouOWl2Yf51nqdcZMOVWSxiL0M.il6ips8lauc8saTs5M9dZUjWm95gXoLVCIulXqKKuLsftG4JfQbOsbWXnoyXd5IZH1eLQyT1RSdPs7klrl7k1jkP940p7lj0MsfeCVpiJ3f2aKPai.yUKB2vnwd.JQ98JHN8bl7ygbv60egKGewVUdz71sIeG4mhTeNX3CIQfcAUYicqYgx8rHSXXM6cmkQe8lUGh6k6AAoESAWigANClxQ68v7huwLN.qHf+zh2e3gyfaXPD2UJFYk0M.eNElUNcvMpNDoava7u6Dei+sBeyRepISY7enuk0yclqiUsOYKrxuxqFJwNCt8Xt0Uefs4T58mZn6NKqsvobTLmWI4erA2z0R8oAo8IFmdeXCzFxaRYXHsUQY9uuEdMJYawK8u+Oxe9heX1WVEe4WiIRh7UVli64K3aYTs4B1yaZvdOHaw7QB5yaHnuYfbwtb94cIpObya0+ZDLxOu+E++9Ou+Q+AOeH6J7GM+gb3KPuNwuFVscie+ueeLDWKDK7gDQr7i5W9QW1DXx5m8cAmj8IWZdtZFG2lzn.0CRiqlJ8jO6ZpzKqxeTlitD+X9olzWoXcpJAV2QlDIen7YrmyEY9ExTrxOKsS88sGp2oi0l0NVeV6XiYsiaLqcbyYsiaMqcb6w2Q4enELwiJOm33b3QOS+4r5p+COg5Hiy+EvWm5MA
      

      Expanding on The Concept

      The main idea here is the usage of the compare nodes couple with ramp nodes to create and progress through different stages, and using the minmax node to have parameterized control of min/max/skew. This same concept can be used to add additional stages, easily creating a Flex Envelope with full parameterized control over the curves and the target values, although a different expression should be used at the end (multiplication of the base would just make it messy).

      Getting the Accurate Display in the Interface

      The curves use the Skew function, which is just output = Math.pow(input, skew). Knowing this, you should be able to draw your envelope using the Graphics API. Alternatively, you can just create a table, set the points and set the curves to the same values that you're sending to the network using Table.setTablePoint().

      Creating a UI for Interacting With the Envelope

      Since this thread's purpose is fulfilled with this post as it's just about sharing the finished network with the community, the rest of it could potentially be used for discussion or sharing the snippets for the UI/UX.

      The simplest way to go is to just create the knobs and link them to the network's parameters.

      If you want to let the user interact with the envelope graphic, due to the complexity of it and the abstract representation of time which cannot be standardized (as everyone's target size of the graphic will be different), it's best to go with a panel overlaying the table, and using the panel's mouse callback to write the logic to manipulate the underlying table using the Table API.

      posted in ScriptNode
      A
      aaronventure
    • RE: More Positive Posts?

      Well, HISE and Christoph's responsiveness are currently enabling my dream of creating a fully modeled and playable orchestra, and make it into a better product than I ever thought it could be.

      I've been implementing my existing models into HISE, and they run and sound amazing. In the process, I've also conceived of at least 4-5 other things I can develop, all thanks to the ease and ability of HISE to do it, as well as Christoph's willingness to respond to feedback and fulfill my feature requests in ridiculously short timeframes compared to what I was used to dealing with other software.

      I've been HISEing for 8+ hrs/day for over a year now, and being mostly unrestricted in what I can do has been truly amazing. The learning curve was steep, especially as I was pushing on boundaries of what's possible in certain aspects. But for at least 6-7 months now, I've been able to work without having to learn and figure things out, and generally just have a blast.

      posted in General Questions
      A
      aaronventure
    • The HISE Color Palette Tool

      I think a project-wide color palette tool would be a great addition to HISE's UI design toolkit.

      I'm envisioning this as a sort of popup window that lets you define different palettes and colors within them with custom naming.

      The popup could be anywhere. Maybe in the interface designer? Maybe in the main toolbar?
      add6134b-d3a5-44f1-b476-146588054edf-image.png

      It would pop out a small window with two columns: left column would be palettes and the right column would be the colors within a selected palette. The colors are just a list like the component colors

      b233f279-82cd-4f2e-a86f-ad5a939ad70e-image.png

      with the ability to change the name of the color.

      Clicking on the color itself pops out the color picker.

      At the top of the right column there'd be an array of buttons where we could save variations of the selected palette to, for quick A/B/C-ing.

      The Key Features

      Accessibility

      The colors are accessible like object properties. Each palette is an object within a class (perhaps ColourPalette or in the Colours class under Colours.Palette) and its colors are its properties. If you have a palette called Background and in it you have 4 colors, you'd access them with e.g. Colours.Palette.Background.Highlight.

      Instant Preview

      Changing any color in the palette would instantly refresh the entire interface so any components that reference any color from any palette would instantly be repainted.

      What Already Exists

      A palette panel can be hacked together using a hidden panel and a component property broadcaster, but there are issues with this approach:

      • it spams the component list
      • it's unintuitive for anyone who's not working with code a lot or is unfamiliar with broadcasters
      • you're limited to 4 colors per panel
      • making a variations switcher requires additional coding and it all becomes a mess when you have more than 4 colors and more than 2 variations as you juggle between panels
      posted in Feature Requests
      A
      aaronventure
    • ScriptNode Feedback After a Month of Heavy Use

      I've been living and breathing ScriptNode for a month now, day in, day out. I used it here and there over the past few months but it was for small networks and modulators, usually no more than 10 nodes.

      It's ridiculously easy to get most DSP prototypes working in Scriptnode. If you add Faust to the mix, it really is a superweapon ready for the future. Global cables as well as external slots make it easy to communicate the data out to the UI.

      I'm currently working with massive, interconnected networks with lots of parameters. I think I loaded every node at least once.

      For some context: I have a decent amount of experience using Unreal Engine Blueprint and writing complex animation blueprints and state machines in Unreal (putting together designer-friendly AAA-level non-replicated locomotion systems and character blueprints up until UE5.2).

      I've been vocal about ScriptNode lately in various threads and have posted numerous bug reports as well. I figured collecting my feedback in this thread will make it easier to discuss.


      Issues

      There's a number of issues lurking, many of which have been only made apparent in my attempts to scale this thing to megacity-levels (200+ nodes and counting).

      Unique IDs

      The biggest design flaw in ScriptNode is that connections are tied to IDs, which are user-facing and user-editable, and the repercussions of messing with this are not audible until you reload the network (e.g. close and re-open HISE).
      I've elaborated on this here. https://forum.hise.audio/topic/9835/scriptnode-prevent-renaming-a-node-id-when-attempting-to-use-one-that-already-exists

      The magnitude of this issue is most apparent when trying to copy/paste nodes which have active connections (it's impossible): https://github.com/christophhart/HISE/issues/546

      Suggestions:

      • unique IDs for nodes in the back, just a name property for the front. Notes spawn with the default name property without the number, like they currently do.
      • if a name of the node is changed from the default name, hovering the node name should show the original node name (the factory path property from right click)

      Navigation

      I haven't found a way to navigate around a network freely other than with a mouse or a touch pad. It becomes problematic when you want to plug a, say, peak node into whatever parameter of another node two screens away. If you don't have an MX Master, which has a vertical and a horizontal scroll wheel, or a similar peripheral, and the network is too big even for zooming out, your only choice is to exit HISE, edit the XML and reload the project.

      Suggestions:

      • double clicking on an output pin or parameter enters plug mode: you can now freely scroll by clicking on the scroll sliders or using two fingers on a touchpad
      • be able to use arrow keys to scroll the screen instead of jump around node selection
      • moving the mouse while holding the drag pin to the edge of the screen scrolls the screen, like in a CRPG/Strategy/MOBA game.

      Labeling

      When working on a big anything, keeping things organised is paramount. Node comments in a vertical layout are fine. But if you switch to a horizontal layout, they now unnecessarily add to the width by staying on the side, when they could be moved to the top or bottom.
      https://forum.hise.audio/topic/9816/put-node-comments-above-below-nodes-when-the-container-is-laid-out-horizontally

      Also, once the ID issue is sorted out and the name property becomes just a name, right clicking a node should automatically enable the editing of the node property field so you can immediately type a desired name.

      Connection Clarity

      Once things get bigger than your screen, and as they grow, it becomes ridiculously hard to keep track of connections.
      This has been briefly touched on here https://forum.hise.audio/topic/9819/scriptnode-highlight-incoming-cable-on-hover-when-cables-are-hidden but there's still a long way to go.

      • If you right click a source (parameter or output pin), a target will be displayed
      • If you right click a target, a source will be displayed only if it's a parameter, not if it's a node (e.g. peak)
      • After the feature in the link above was added, the source will now be displayed on hover if you hover a target, but still nothing if you right click it
      • There's no mention of the source or target's parent nodes
      • The names are direct node IDs, which ties in to the ID issue mentioned above, so you're discouraged from changing the node names, in fear of accidentally ending up with two nodes that share the same name/ID
      • If you collapse a node, connections to any of its parameters or child nodes disappear both visually and in the right-click connections tab for the source parameter

      Suggestions:

      • The new feature that shows a source should always be on
      • Remove the tooltip when hovering a parameter which just repeats the visible node ID and parameter ID, that just obscures the new source tooltip
      • Show full target hierarchy both on hover and on right click menus as outlined here https://forum.hise.audio/post/81634
      • Fix missing source connections from node outputs when right clicking parameters
      • Show cables running to and from collapsed nodes; show source/target node names in the connection list
      • Have a way to click on a node name in the connection list in parameter properties that will move the viewport to that node

      Wishlist

      Here are the things that I find missing at the moment.

      Logic operators and Clamping

      Basic < > = operators, as well as unscaled input clamping. Discussed here. https://forum.hise.audio/topic/9844/scriptnode-add-to-control-logic_op/6

      Variables

      Having variables in scriptnode that can be saved or read. Here's an example from Unreal's Blueprint: https://youtu.be/oKGJECvQJA8?t=88

      Suggestion:

      • variable creation window, maybe like the parameter toolbar; variable needs an identifier and a default value
      • get node (dropdown menu that lets you select the variable to get, output pin)
      • set node (dropdown menu that lets you select the variable to set, parameter for writing, writes on change)

      The get node avoids the need for a cable mess since you can write to a variable with set, and then just load as many get nodes as needed.

      Wrapping Nodes into External Files

      Just like you can wrap nodes into a chain, and like you can move selected code into an external file, you should be able to move the nodes to an external file, which will then be available in the Project tab in Add Node, automatically replace the moved nodes and connections. Because DspNetworks need defined parameters if you need input, perhaps this moving into external files should only be possible for chain nodes, as you can add Parameters to it.

      Cable Outputs for Embedded Project Nodes

      If you create a network, it can always be added as a node to any other network from the Project tab of the Add Node window. Any parameters of the main container are also visible here.

      It would be great to also have output pins for any (scaled or unscaled) peak node from within the network, with usual text ("Drag to Modulation Target") being replaced with the name of the peak node. This is the equivalent of adding outputs to a function in Unreal Blueprint; whenever you add that function to any blueprint, it has the configured input/output pins. Scriptnode currently has inputs (parameters), but not outputs like this.

      Extended Expr Nodes

      Math and Cable.expr nodes are great, I just wish they had more inputs for algos that need more than one input but are small enough that they don't warrant a SNEX file, which limits visibility

      SNEX Docs

      I gather SNEX is the place for any complex algorithms because it supports variables and is blazing fast, but at this point I have no clue how to get a sound out of it; the examples in the docs either don't compile or crash HISE.

      posted in ScriptNode
      A
      aaronventure
    • ScriptNode Compilation Workflow and What to Do About It

      Unfortunately I was not able to make it to the meet, so I decided to convert my notes about Scriptnode into a post here. On a second thought that’s maybe even better, as this way it’ll stay here easily searchable and visible.

      I wanted to talk about the current ScriptNode workflow with regard to compiling of networks and/or nodes.

      ScriptNode evolved a lot in the short time that I’ve been here, but the compilation workflow seems to be stuck in a time where it was a smaller scale add-on to HISE.

      In its current state, the compilation workflow is incompatible with large projects, and by that I mean any network with a lot of interconnect and repetitive node chains.

      I’ll examine three examples:

      • Math Expression node
      • A node chain template
      • Faust

      The Expression Node

      I’ll use it as the most basic example of a problem that the current compilation workflow introduces. This is a very important node that could play a very significant role in almost any network, but I find myself avoiding it at all costs because it requires network compilation in order to work in the final plugin.

      This is problematic because network compilation is not just freeze-in-place like a track in a DAW. You need to enable compilation for the network, run the compilation process, restart HISE, load your project, remove your network from the chain, add in a hardcoded FX module, and add your network there. You cannot leave your ScriptFX network in the chain, even if it’s bypassed, because the exported plugin will refuse to scan in a number of DAWs, and there’s no warning in the exporter for this. Even if it didn’t, that’s a whole lot of additional clutter.

      This is fine if you need a small modulator that you set up and forget. It’s not fine for big networks where you are likely to be making changes a few dozen times in the future. It’s also problematic if you’re using that network in multiple places in your entire project tree, because in order to make changes, you need to now load in the scriptFX network in all the spots, and every time you make a change, you still need to reload in order for the change to be reflected everywhere, which in this case means restarting HISE.

      A good workflow in big projects requires a lot of testing, which means a lot of plugin exports. Every time some major change is made to the project, I export it to make sure it still works both as a plugin and functionality-wise. If the plugin is conceived to be used many times in a standard composition/mixing session, that needs to be tested, too, which makes the plugin version of HISE unsuitable for the task (but also because it doesn’t have a FAUST version).

      The Node Chains

      There are cases where you need to have a node chain repeated a number of times across the network. This is the same as a function in code. HISE has node templates, but the major problem with it is that if you make a change in one instance, it’s not reflected in another. This could be beneficial, true, but in order to have the changes reflected in all instances, you need to do that whole thing in a separate network. This clutters the network list as the only way to differentiate between these “function” networks and networks to be used as modules in the main tree is to settle on a naming scheme and name the networks accordingly.

      Once you have them all over your main network (loaded from the Project tab in the Node Browser), if you make any changes to any of them, the network requires a reload (unload the network, then load it again) and if you’re using them in multiple networks, it’s easier to just restart HISE. God forbid you used an Expression/SNEX node in there which mandates that you first need to compile the function network.

      Faust

      When working with Faust, you cannot just leave the faust node in your network and compile it, expecting the network to work. The compiled faust node needs to be used in order to export the plugin. This is a bit problematic because in the Projects tab in the Node Browser, there’s no real indication that this is a compiled faust node, and not a compiled network. A simple naming error can take you places. If you’re going to be using a compiled faust node as part of a bigger network, you need a separate network where you’ll be compiling the faust.dsp files, then unloading that network and reloading the main network where you’re using the compiled faust node. The compiled faust node by itself currently has a lot of bugs, which I posted on the Github issue tracker.

      What to do about all of this?

      I’d recommend to always look to Unreal Blueprint when in doubt about UX changes. That thing has been in development for the past 12+ years and has received contributions from dozens, if not hundreds of people. It's incredibly smooth and easy to work with. Unreal Blueprint has 2 types of “node chains”: macros and functions. Macros are project-wide, and functions are local to the blueprint where they were created.

      A blueprint is the same thing as a network in HISE. When creating a function, a new window pops up and you build a node chain like you do in the base blueprint window. You can define function inputs and their types, as well as function outputs and their types. The function then appears in the sidebar while editing the main blueprint, and you can either add it from the search/browser or drag it from the sidebar. Any changes you make to the function itself will be instantly reflected in all the functions in the blueprint.

      This would somewhat solve the Node Chains issue.

      About Faust and SNEX, if compilation itself cannot be added to the export process automatically, maybe there should be a freeze-in-place option. Right click, freeze the node, it instantly becomes available in the projects tab in the Node Browser. If you unfreeze any instance, make changes to it, then freeze it again, all other frozen instances should automatically update. For faust this can be tracked based on the .dsp file, for SNEX it could be tracked using the file as well. No idea how it would be tracked for the expression nodes. Maybe they’d be assigned another type of ID on freeze.

      I wrote about expression nodes requiring more inputs (maybe dynamically like the xfader node) as their strongest trait is that the expression is visible and instantly editable.

      posted in ScriptNode
      A
      aaronventure
    • Merry Christmas: Polyphonic FLEX Envelope

      e027ff8a-6da5-4156-9908-1f8b3b0b7e27-image.png

      Happy Holidays, folks! Here's my gift to you all. Over the past few months I saw a few threads asking about Kontakt's flex envelope so I gave it shot at recreating it in ScriptNode. It lacks individual point modulation as we can't, as of this date, access them inside the network.

      • Use this as a script envelope modulator. It is fully polyphonic.
      • Load it in after loading the Table Envelope. Use the Table Envelope for Attacks and Releases. I tried recreating these here as well to have it all in one view, but always ran into problems with clicking. If there was a Table Envelope node like all the other envelope nodes that automatically triggers on note-on/off and kills the voice, it would be great.
      • Attack Time should be set to whatever your attack time for the Table Envelope is. There's a ramp that acts as a timer, and once the attack finishes, the flex envelope starts doing its thing.
      • It acts like a factor, multiplying the output from the Table Envelope. That way the gain perfectly fades into the flex and out to a release.
      • Right click drag on lines to make them into curves. If you decay the Flex to 0, the Release won't play.
      • Looping the Flex goes from the end -- you're setting the start point of the loop as the percentage of the table's x axis
      • If you need longer timings, open the collapsed node, find the ramps, right click on PeriodTiming and set your desired Min/Max
      • Default block size is 32 samples. If you need a different size for faster/slower processing (shorter Flex times and wild patterns will likely require bigger resolution and therefore smaller block size), right click on the fix_blockx node and set your desired block size. At this size the overhead is miniscule and 5-10ms smoothing clears out any zipper noises.
      • Unless Funky's got an ace up his sleeve and is sitting on the API for this, the table itself isn't dynamically adjustable. You can use the logic that you see, create additional serial rampings, set your min/max for each point, create more tables and you could get to a point where you can adjust the factors from scripting, but it's gonna be seriously messy. Plus to my knowledge (that I absorbed from the Script Envelope documentation), there's no way to edit the curve amounts anyway. In that case it's easier to just do it in SNEX/Faust.

      Copy the XML to your project directory into DspNetworks\Networks.
      FlexEnvelope.xml

      Or copy the base 64 string to your clipboard, create a new DspNetwork, click somewhere to add a new node and you'll have an option to import FlexEnvelope from your clipboard.

      ScriptNode1292.3ocyXssbaTCFVqikSaCzRfBWwvnKo.0icgRatJGbRJgoNMSsobYGYux1ZxtqVzpM0lq30nWv.uF7Pz2EdC.cX8ZoM6l3zbX5dQpk9k9O98eP8PlOA30Xe7PAiO6HrXBvac3PVj.SiH7lCmH+WvA6B7tKb+.xz8hNgDvhIfclEiSRH9.uUfs.8lvdyQXNNjHH7D0dsAGJYcGV.KkC7fd.4WGVXHIR.7pAkGQQOA.77NTqCPkP9H3H5zWOHfM73o.Gk5KrTJqyrPMLL7rD3QbohyETsTqksZl7mFIePxqTTGhC.uBGjJUIuZfBmZM3NJ41i96j4GpN76eD.L2XVwxXVE1GOHf3ZGet1N3rflCUDesPejKfYT21L.cY9oAXAkE0GyGSDZGZGVTDYnZS4UTr6.IigPruOHOHo1ZUnwFTBHVFb2EKvp6qU6j7eor8HexTk57exu8BGP78I95i6QfO4QMy+1ni7Om7B4eN7o+T+c+4mjuN8oNzGs8FCh61ZA8eYC26O5asVC.VnKodkuRZDcoQYghaWGj80EOsvd+6l8DjXcfy5b8Nl7FS3w9jlfmgAmh0amJXgXgNVUCXB2MT2Xc3yYioCQ3Hez1AwSvfyIqxME5rC66yB7MhbQhSMKr1GC2VHvCOFoCJNB99VBNj4ewk8BIVuLI9RbXrqDWSJQNoIWQvUP4rcc3yHBTFG5SCIknCd0Wdz88f84oDzuNgDgjA+kCmuKMIN.OamzQixvUN6HWmg6qCeX6BPvUrffMV.AgvVMaYA+tE7wsZo1ZA569xiztk4q8OrQq1s+w1N.QEOdLvTT5HBmx70NHKfmp7JvRApWsB.gskqM0tdNiE2Sf4BfCwKLmZ.elTOJxD6xRV3jhQlRvlKpFRlFyqBxLAp4gXBAYg7PinQISHIHEZiFM96PTAZL8D4NpSNl8P7DB1GIX50pdXl6I2HQ4KP9L40j2RcA4uZVFR7r6cz.1QYuY9iOC1UZaMGEvX7ulFEmJd.nXejUg6RFjNd9UT1YokxqUJX+VPYRbzXRkn7RK+GlFTwEpr15RgFlylh3SKLPtB6D7+jEAeC0JB7+Fbu.ZHMRxaDmDSDTgL9hNQIUj4pInDS7kSRHBotiXQAyPJuHRvoiGS3De4dYGGIiKpncBZHNgXsuDTz9Aki.V9ZQ2ANWKtQ82Uk.ZoNNt+OM28mSuh.vWAeIIyKVHIZ.YH9R5sVClyNW2UVUlaBuksHbnHk2RMlnyHrZ6ojI.tBaDaOlosCbIaCediXdy2m71PcKwO3ZTdY4UFH9LQekjqXCnLUtchr2AFpZwn1uhT1sjMgNlfRR4DUCQYmtYIHrPm9NfLlFEoZ5kFInA1cTkMSoptokVBr1MacqFvXB93RgzZBUX4eIrCNVnra0ozSiK33njPpn4kbHy4On65d3xq3hSWQU2ZX5j+hTgbjlk+sMm2CZseYy6qxU70Pl25VVJiZ+KvisqUYj3Ct2fl0qOIjwjIzE50eOSdSNwqFWPsKrKXq+ZqBtf+9su8e17Tt.z69y2so40C8z5rrZkt1tE69iF.v2rkqq35OlbW4j6ivoAhkHzrRgTupV3U2tIoyiq6efznuNdd4hxysZ4Tuq5xetu32oHnS+WPQqIaBEMwqkQ.x3PCs2XIslJm6rRaotoJjZ3.jY5fyqs2ovZWRUydxjR7x4oJfq9jw7+2NaurNXqZQNFQwT52qVR+OTfNZfA
      

      Enjoy!

      posted in ScriptNode
      A
      aaronventure
    • RE: Where can I find Laf functions?

      @griffinboy Well it happens, I always look through the forum, the docs, the github docs (way better search than on the docs page) and google with the site: hise forum target, but even then sometimes I'll ask something and David or someone else will pop by and drop a link to the docs.

      If every post you made was asking about something that can be easily found in the docs, then I'm sure eventually someone would make a comment about that.

      But generally, you're fine. I understand it can be an anxiety thing, I have close people who have dealt with similar stuff all their life, and while it can never go away, it does get easier when you remind yourself of the reasonable take on the whole thing. Which, granted, someone often has to give you first, so in case that's what's up, here's mine.

      If you, for just a moment, disregard the whole gift-to-humanity FOSS side of the entire project and look at it from the business side, your posts are good data. You yourself are just one data point, but if everyone else started asking repetitive questions, that could indicate a documentation or some other problem.

      You can see this, for example, in the introduction of the export pre-flight checklist that happened a few weeks ago. If you go through the forum, at one point a couple of months ago you'll see a lot of similar posts started appearing on a nearly daily basis: compilation fails, export fails, and most of them caused by the users not actually reading the very first readme right on the github page.

      Someone made a video about plugin creation with HISE on youtube, it got some traffic and HISE got an influx of new users. A lot of them just went to the hise.dev webpage, downloaded the binary and attempted to VCR through the whole thing by putting together something in the WYSIWYG editor and clicking export. When it didn't work, the first thing they did was come to the forum.

      This gives you a lot of clues about how curious hobbyists think and work, and if your business decision is that there's still potential future developers there (or you're just annoyed with the daily export error posts), you now have data to work off of and make changes.

      It's a good deal. Chris provides a place to talk, in return he gets QA and customer support.

      You're asking good questions. The talk we had about the dynamic continuous event modulation yesterday was a good talk. These are new features in HISE, and it's good to test the general audience's understanding of these by bringing it up, which, as you saw in my snippet, requires a decent understanding of HISE in order to implement properly. People will surely benefit from it. If even one person does, it's worth it. I am where I am in life because of selfless contributions of countless people of many forums and those who created, maintained and moderated them, allowing me to search, browse and read days, months or years after these talks took place and benefit from the information.

      Even this topic, silly as it may seem in hindsight, is framed very well and is a very SEO friendly question. A few weeks from now, whether someone attempts to search it here, search it on google, or it gets swallowed by some LLM and someone asks there, i'll easily be the thing that comes up first.

      So your questions are good. You're not being a jerk, you're not forcing political themes or sexualizing other forum members. You're talking about HISE and instrument development practices and workflows. It's all on topic, and you're even actively contributing, like with the C++ tutorial. So all's good. Keep talking, that's what the forum is for.

      posted in General Questions
      A
      aaronventure
    • RE: Cost Of Operations?: License Fees?

      @ustk if enough people start your exe, defender will eventually stop throwing a warning. That's why I suggested an installer app for HISE where devs would just attach a payload. That way once it eventually got past the defender smart screen, it would stay so.

      And it exists, check the Payload Installer in the tools directory of HISE. The windows one works, the one for Mac not so much. I'll probably be pesting Chris about it soon.

      Also, you can just upload your exe files to the defender whitelist on the microsoft page (you gotta be logged into your Microsoft account), select that you're a developer uploading an app for whitelisting, and after 3 weeks it'll be whitelisted and smart screen shouldn't pop anymore. But 3 weeks is a lot, almost feels like shipping for PlayStation.

      posted in General Questions
      A
      aaronventure

    Latest posts made by aaronventure

    • RE: I wasted 3 hours on deepseek trying to create Autotune, Reverb and Delay in Hise

      @Chazrox Writing small pieces of code, like functions. Connect it to context7 so it can get docs, but obviously that only works if the docs are complete, and HISE docs are not.

      I did once write a full 3d rendering engine in HISE PaintRoutine, with frustum culling and all the jazz. You'd just pass it a "mesh" like a an array of points relative to a center, pass it a location for the the mesh center, pass it camera specs like xyz, pitch, yaw, fov and it would render the whole scene using line calls. Of course it was all running on the CPU so it wasn't very efficient at all.

      I did eventually move to WebView and three.js because that's what three is made for and it runs on the GPU, but this is the kind of stuff where even testing it out meant you had to go and learn computer graphics from complete zero just to implement this here, but the toughest question would be where to even look and what to look for. With AI it was much faster to find the relevant information and get it going.

      So in a world where a question "is this even viable to try to implement" can be answered in days instead of months, it's like magic wand.

      posted in Scripting
      A
      aaronventure
    • RE: I wasted 3 hours on deepseek trying to create Autotune, Reverb and Delay in Hise

      @Chazrox said in I wasted 3 hours on deepseek trying to create Autotune, Reverb and Delay in Hise:

      Who will maintain all this 💩 code??? lol

      The point is that you shouldn't look at it. Does it work? Is the performance acceptable? Have you tested for security issues? Just ship it. That's the current way of things. Some of the stuff I'm seeing in new repos popping up is the stuff of nightmares, but hey, it works.

      I mean it's incredible, it's literal science fiction stuff, you write an instruction as if you were writing it to a developer on your team, and it becomes reality. If you told me 3 years ago this would be a reality today I would've called you crazy. Of course, currently it's just step by step, so you still need to have the big picture, understand on high level how things work so your instructions can be accurate etc.

      But code developed both to be functional and to be readable to humans so they can write it and debug it. This is no longer necessary, so I have no trouble imagining a language coming up in a very near future that is completely oriented to be written by LLMs.

      The potential is just too much to ignore.

      posted in Scripting
      A
      aaronventure
    • RE: I wasted 3 hours on deepseek trying to create Autotune, Reverb and Delay in Hise

      @d-healey yeah you're right

      plus as I've said elsewhere, large part of HISE is not code-based

      No way through HISE currently other than the hard way. which may become increasingly inaccessible as people become super impatient with AI doing their shit for them in seconds in other areas of life. I do often think how impossible it will be for us to relate to the new kids, given how we had to go and read 300 pages of docs before writing some code back in the day.

      Now it's all just a prompt away.

      posted in Scripting
      A
      aaronventure
    • RE: ScriptNode Compilation Workflow and What to Do About It

      @Christoph-Hart Haha that's not at all what that requirement says.

      The requirement says that if I input MIDI or audio into HISE and it spits something out, then pressing export should result in that same plugin.

      Faust nodes need the compilation step before they can work? Alright ,throw a warning and tell me to enable Allow Compilation. If I didn't ask again on export. But then it should compile to a plugin that works. Because it works in the HISE IDE.

      I can, in HISE, have a single .dsp file that I use in 10 different networks at 30 different places in Fasut nodes and it'll work in the IDE. I can make changes and it'll work. But just pressing export wont.

      So what, I should now first compile that faust dsp file in a lone network that exists just for compiling lone faust files, replace all existing faust nodes that are used for development because I cannot just branch, as the nodes cannot be in there when exporting, connect all the cables for 30 instances across 10 networks and then compile? And then when I have to make a change, what then? Git discard all the changes to the networks, make changes, and then replace and reconnect 30 nodes again just to run pluginval?

      Come on, man 😄

      posted in ScriptNode
      A
      aaronventure
    • RE: I wasted 3 hours on deepseek trying to create Autotune, Reverb and Delay in Hise

      @d-healey That's why you should ask Claude with the Context7 MCP installed

      // ========================================
      // HISE Hello World Script Examples
      // ========================================
      
      // 1. BASIC CONSOLE OUTPUT
      // The simplest way to output "Hello World" in HISE
      Console.print("Hello World");
      
      // 2. CREATING A BASIC USER INTERFACE
      // Create the main interface (600x500 pixels)
      Content.makeFrontInterface(600, 500);
      
      // Add a button programmatically
      const var HelloButton = Content.addButton("HelloButton", 10, 10);
      HelloButton.set("text", "Click for Hello World!");
      
      // 3. BUTTON CALLBACK FUNCTION
      // Define what happens when the button is clicked
      inline function onHelloButtonControl(component, value)
      {
          if(value) // Button was pressed (value = 1)
          {
              Console.print("Hello World from Button!");
              
              // You can also show a popup message
              Engine.showMessageBox("Hello World", "Greetings from HISE!", 0);
          }
      };
      
      // Connect the callback to the button
      HelloButton.setControlCallback(onHelloButtonControl);
      
      // 4. DRAWING TEXT ON A PANEL
      // Add a panel for custom graphics
      const var HelloPanel = Content.addPanel("HelloPanel", 10, 70);
      HelloPanel.set("width", 300);
      HelloPanel.set("height", 100);
      
      // Set a custom paint routine for the panel
      HelloPanel.setPaintRoutine(function(g)
      {
          // Set background color
          g.setColour(Colours.withAlpha(Colours.blue, 0.3));
          g.fillRect(this.getLocalBounds(0));
          
          // Set text properties
          g.setFont("Arial", 24);
          g.setColour(Colours.white);
          
          // Draw the hello world text
          g.drawFittedText("Hello World!", this.getLocalBounds(5), "centred", 1, 1.0);
      });
      
      // 5. CREATING A SIMPLE SOUND GENERATOR
      // Get reference to a sine wave generator (if one exists in your project)
      // Note: You need to add a SineWaveGenerator module first in HISE
      /*
      const var SineGen = Synth.getChildSynth("Sine Wave Generator");
      
      if(isDefined(SineGen))
      {
          Console.print("Sine generator found - Hello World with sound!");
          
          // Set some basic parameters
          SineGen.setAttribute(SineGen.SaturationAmount, 0.1);
          Console.print("Saturation set to: " + SineGen.getAttribute(SineGen.SaturationAmount));
      }
      else
      {
          Console.print("No sine generator found - add one to test sound generation");
      }
      */
      
      // 6. WORKING WITH ARRAYS AND LOOPS
      Console.print("=== Array Hello World ===");
      const var words = ["Hello", "World", "from", "HISE"];
      
      for(i = 0; i < words.length; i++)
      {
          Console.print("Word " + i + ": " + words[i]);
      }
      
      // Join the words together
      var message = "";
      for(word in words)
      {
          message += word + " ";
      }
      Console.print("Complete message: " + message);
      
      // 7. BASIC MATH OPERATIONS
      Console.print("=== Math Hello World ===");
      const var x = 5;
      const var y = 10;
      const var result = x + y;
      Console.print("Math result: " + x + " + " + y + " = " + result);
      
      // 8. TIMER-BASED HELLO WORLD
      // Create a timer that prints hello world every 2 seconds
      const var HelloTimer = Engine.createTimerObject();
      HelloTimer.setTimerCallback(function()
      {
          Console.print("Timer says: Hello World! " + Engine.getUptime());
      });
      
      // Start the timer (2000ms = 2 seconds)
      HelloTimer.startTimer(2000);
      
      // 9. BASIC FUNCTION DEFINITION
      inline function sayHello(name)
      {
          return "Hello " + name + " from HISE!";
      }
      
      // Call the function
      Console.print(sayHello("Developer"));
      Console.print(sayHello("World"));
      
      // 10. BASIC CONDITIONAL LOGIC
      const var currentTime = Engine.getUptime();
      if(currentTime > 5.0)
      {
          Console.print("Hello World - HISE has been running for more than 5 seconds!");
      }
      else
      {
          Console.print("Hello World - HISE just started!");
      }
      
      Console.print("=== HISE Hello World Script Complete! ===");
      
      posted in Scripting
      A
      aaronventure
    • RE: ScriptNode Compilation Workflow and What to Do About It

      @Christoph-Hart hey, so it's been a bit, where are we with this?

      During the last meetup, we talked about this and my point was basically:

      If it works in the HISE IDE, pressing export should result in a plugin that works/sounds the same.

      No need for hidden steps like compiling nodes separately in a different network, then replacing Faust node instances etc.

      I just tried creating a simple faust effect in a Faust node. HISE kindly reminded me to set the Allow Compilation flag to true. I tried, the error failed to go away, the "Fix it" button worked.

      The effect was having an effect and doing what it should in HISE Standalone.

      I hit export. Build succeeds. VST3 fails to scan. AU crashes host.

      posted in ScriptNode
      A
      aaronventure
    • RE: What are you using to build UI for your plugin? What's your preferred way and why?

      @mrcurious No.

      If you don't fancy building your own components, check out PrimeVue/PrimeReact.

      Then either pick Vue+Nuxt for the Vue version or NextJS for the react version, configure it to build a static website and start.

      Link Preview Image
      PrimeReact | React UI Component Library

      Slider is a component to provide input with a drag handle.

      favicon

      (primereact.org)

      posted in General Questions
      A
      aaronventure
    • Can we please get "Debug/Release with Faust" configuration for the plugin version of HISE?

      This would enable using Faust in Scriptnode and analyzing it in realtime with PluginDoctor.

      posted in Feature Requests
      A
      aaronventure
    • RE: Mask does not scale properly on HiDPI or Retina display

      @prehm It uses the old JUCE routine for drawing blur, which is about 100x slower than the melatonin version that HISE is still missing, and it's still done on the CPU.

      If you want fancy graphics and visual effects, use a WebView and enjoy all the modern frontend tech.

      posted in Bug Reports
      A
      aaronventure
    • RE: Tired of this error on Startup

      So say we all

      Link Preview Image
      The big bug tier list

      @Christoph-Hart HISE_NUM_STANDALONE_OUTPUTS Error // Channel Amount Mismatch on every start https://github.com/christophhart/HISE/issues/692 This one has bee...

      favicon

      Forum (forum.hise.audio)

      posted in General Questions
      A
      aaronventure