Just wanted to wish everyone a happy, productive and prosperous new year!
Just wanted to wish everyone a happy, productive and prosperous new year!
Anyone care to share their overall plans and goals for the coming year? 
My main goal is to start releasing HISE plugins. I've been learning HISE for a while and it's time to start exporting my efforts!
A series of 4 free synth plugins, first one Sublime posted here for design feedback, and another 3, each based around one simple preset concept. Sublime is all about bass.
Then I have 2 collaborations I want to work on, both with UK house music producers. One is a multi-output drum plugin based on a series of expansions, the other is a chord synth with some interesting features.
I also have a lot of vintage reverb impulses recorded and processed, which I'd like to turn into a suite of free reverbs.
My user base is mostly house music producers & related genres - rave, techno, classic house, etc. I've built a decent brand and I think my customers will love the move from Maize-based ROMpler plugins to way more fully-featured HISE-based plugins.
What are your goals?
I like using overlay images to ensure my Figma design is translated properly to HISE. Currently, the only way I know to toggle the image visibility is to select/unselect the image, or quickly slide the alpha slider, which is difficult because of the 'invert' half of the slider.
This PR adds a toggle button between the image dropdown and the alpha slider. It uses an existing image icon for the button and respects the alpha slider value.
This allows me to toggle the image without taking my eyes off the interface, making it easier to spot changes.
PR here: https://github.com/christophhart/HISE/pull/825

@David-Healey I just had a go at fixing this. Is that what you mean?

HiseSnippet 1112.3ocsVs2aaaCDmJIJKwacqEne.H7e4roYH+pIcACMO8pwxCi4rhMDDTPKcxhKRjFRTMwXneH12z8MH6ndXKO6klZfI.av6Eue2wi2w9QRGHNVFQLpb0jw.w3qLGLQn7O1mwEjdmPL9ZyyYwJHhlw5nIiYwwfKwvX8eRyvX6MHoe+8aNhEvDNvLVDx6jbG3LdHWMia+C9YdPPWlKbEOrj1sOnmiTbrLPlf3YcSaxXlysrQvELsZqYRdKK1mX7sl1scX60zqSqVu9061wcH330.FtqCytCyqCC41l0tSi1DiMO0kqjQCTLEDia5QR2IC7k2Ixbv63w7gAflnAY.54L1ji84At8KRNwDhwF8mkpVOKU8Ryy4t7o7mkxddp.5LKJmzLV6wfTiOCHYTBRajAoWXNvIhOVMShFOeoYOAdB5wvylxPISWxZ+05lGKQMDp5gragtQHwTKp0z11hh+sy9UpfmOwJZ.yi9izBSbh.LRNS5vBNSJu8PgaW.BpoUGUrdDLhqqe5lHbTbonVU2H1c8kiSFeNHRNBOhGEISDtUsndE5LxhJG9G6T4OqPwuQ0iAUVcQsp12am+UEcQlXOrd5W.GUsqssrsz.F+cCJ9iOQTzSAg+29+CrHJCiXjUcFFs3dVvdLy8PjCJ7Z1012P+NZSKJ65FSW07F52SaqW0Jc0M6uPHo2Vd7a4i7CveJvk9FZln35ih.PP+gozCCRf4CacpCb0QOSLJ.pkiHK5d6TBmJ3dUAPy0HCt6YUDCHnmsNE1Md0LFstYIHu.U24yUyfEJuKVaTq5IfGKIPgI1FsqaOUtNyeHFpBv8JDVowuFeVSQoEsZ.3opVbBlU1crLbn7H48MJU7MRikvwRAnc3TMzVNkPCnEJOwhhc1u37lJEWHUvkhZ5i7sq7wJz+sHOukJSiiHYP.DsTw5FbQOlg0DIgCgHK7PRexVnHdgd9tDa9z5R3jkVJonTzSvUWNFxo6JCb0290qWrmBIOup6tjiPTUUZukmm2aoHuR3t5VKSSyjzPnbyexu16DlhUrY39h9ZLDo35Px3D3C3vgrFWaadBDeqRNF6yO8.kXrUlqeVQaMl.BR86VloqaPturCmTl.KICKFlr8lDxCOLO2lkYeG2U4OyZ9A9f9tXYNjR35KdhoDDclFMyPlowKwEgrTdqunO+8CzXCSLei4kBnxU2IqbkOd8GGXtPedbBizMIfoleridfbt.rJatd8594hXtZR4A1eFyhrezYQOUH9By9bki+xw3ZKAiXsy+GXLeB9yLO0yC6bNCfaX182V0w0eB2icpUbwnyYpHttF3hjvAXYnCfdWf0xw55h0z2Ayns0z5Lv.P3lR7.9kKrgl1HWXiBgX0kSj78NY2b0uQXqTNHlDougZa7wbHMcIWVCwmr7dGm42pELr4pZXqU0v1qpgcVUCe0pZ3tqpg68oMT+hxCSTxvrqMDx48OMs4pgwoBFVAlVsR9GztgJYG
Content.makeFrontInterface(200, 200);
const laf = Content.createLocalLookAndFeel();
laf.registerFunction("drawPopupMenuBackground", function(g, obj)
{
g.setColour("0x00000000"); // any transparent colour
g.fillRect([0,0,200,200]);
});
laf.registerFunction("drawPopupMenuItem", function(g, obj)
{
var a = obj.area;
var padArea = [a[0] + 2, a[1] + 2, a[2] - 4, a[3] - 4];
g.setColour(obj.isHighlighted ? Colours.green : Colours.blue);
g.fillRoundedRectangle(padArea, 8);
var textArea = [padArea[0] + 8, padArea[1], padArea[2] - 16, padArea[3]];
g.setColour(Colours.white);
g.setFont("Default", 14.0);
g.drawAlignedText(obj.text, textArea, "left");
});
const ComboBox1 = Content.getComponent("ComboBox1");
ComboBox1.setLocalLookAndFeel(laf);
The drawPopupMenuBackground object should probably include an area, and the popup menu items still have a subtle drop shadow. But they're both fixes for another day.
PR here, if it's useful: https://github.com/christophhart/HISE/pull/805
@bendurso Today I learned that right-clicking a module in edit mode shows a different context menu to right-clicking not in edit mode. 
Posting this in case it helps anyone else. I just banged my head against a brick wall for too long before I realised how simple this was! 
When using a Floating Tile with content type Waveform (to display the waveform of Sine Wave Generator or Waveform Generator, for example) the default waveform path is a filled shape.
You can override this with LAF function drawAnalyserPath and draw a line path instead of a filled path:
laf.registerFunction("drawAnalyserPath", function(g, obj)
{
g.setColour(Colours.white);
g.drawPath(obj.path, obj.area, 5);
});
However, this means that the path is clipped at the bounds of the floating tile, especially at wider line thicknesses:

To prevent the clipping, I fudged around with it for longer than I want to admit before I realised the answer is to simply reduce the area that the path is drawn in, by half the thickness of the path:
laf.registerFunction("drawAnalyserPath", function(g, obj)
{
g.setColour(Colours.white);
g.drawPath(obj.path, obj.area.reduced(2.5), 5);
});
Voila! No more clipped paths!
Top row is using obj.area, bottom row is using area reduced by half line thickness:

You might want the left/right of the path to bleed out of bounds, in which case change the reduction from all-round to y-only:
obj.area.reduced(5) 👈 all-round
obj.area.reduced(0, 5) 👈 y-only
Note: you might need to compile with HISE_USE_SCRIPT_RECTANGLE_OBJECT=1 for the reduced and other Rectangle helper functions, as per the docs: https://docs.hise.dev/scripting/scripting-api/rectangle/index.html. Not sure if it's still the same, or if it's built-in to all new builds.
@Lindon Fixing regression issues seems like it should be high(est?) priority.
PR that adds StartPhase1 and StartPhase2 to Waveform Generator.
Coded for my own needs but someone else might find it useful.
Works great for setting a random phase offset on MIDI note-on.
Works independently for Osc1 and Osc2.
https://github.com/christophhart/HISE/pull/792
EDIT: from this conversation https://forum.hise.audio/topic/13720/free-running-or-randomised-phase-for-waveform-generator-oscillators/9
I'm fortunate that I started with a (small) audience, and I'm selling to a focussed crowd. My plugins serve a very specific niche and the producers there are always hungry for more authentic products.
I've never done any paid ads. I might do an experiment on Instagram one day. I see a lot of adverts for plugins in my feed and I'm curious how effective they are.
I sell on Gumroad. They take about 15% fee, then you pay payment processor fees. I haven't done the maths for the total cut but I'd say it's less than 20%.
It's a good deal for me because it includes basic web presence, file hosting, secure delivery, payment processing (cards, Apple Pay, Google and PayPal), email marketing and analytics.
I started selling in September 2022. I'd done a couple of free plugins before that through various platforms like SimpleGoods and SendOwl but didn't take it seriously until later.
When I started selling I posted each new product on my Facebook and Instagram accounts. The engagement was pretty good to start with but I noticed that over time, I got more results from sending emails to my ever-growing email list. When I launch a new product now, I only send it to my email list at first. Then later I post short clips to Instagram but they're supplemental to the email list.
You NEED an email list. They say "the money's in the list" and in my experience, that's 100% correct.
Free products are a great way to build your email list. Most people stay subscribed and as long as you don't flood them with emails, they're happy to receive them.
This is my email strategy:
That's it. I don't like to bombard my list with too many emails. I'm on some Gumroad seller lists where they send continual discounts, sometimes daily. This would be way too much for me as a customer.
Gumroad includes email marketing, which is a bonus because when your list gets large things like Mailchimp, ConvertKit, etc get into the $100's/month.
I can target emails to people who have or haven't bought specific products. Very handy for offering a discount only to those who haven't bought something. Or offering a discount for a product Y to those who have already bought product X. You can also target by how much someone has spent, so you can offer extra discounts or free stuff to your most loyal customers.
Gumroad also includes extra features like affiliates (having others push your products for a % split), collaborators (where you can split a products revenue with someone else), email automations (for sending drip emails to customers - I don't use those) and upsells (recommended products at checkout).
It does have some downsides. The download links in the receipt emails sometimes don't work and you have to send a link manually to the customer (Gumroad have so far refused to acknowledge this as an issue). I also find their fees to be expensive compared to other services, but for what I get built-in I still think it's worth it for now.
Something else that might be of interest is that Gumroad recently made the source code available, so if there's a feature you want to add and you're handy with Ruby on Rails and JavaScript you might be able to contribute.
Happy to report this has been merged in to develop branch! 
@Sifres Might be the same issue as this:
https://forum.hise.audio/topic/14511/lfo-not-working?_=1773706710804
and this:
LFO modulation stopped working in the Master Chain after a specific commit a while ago.
There's a PR here that fixes it but you'll have to merge it yourself because it hasn't been merged into develop yet.
@David-Healey said in Agentic coding workflows:
Does it not save it for you to view in the web version?
Oh, I don't know. I've only used the terminal version. Makes sense that there would be a web backup off chats though. I don't really get how it works, coding with AI on the web. I guess you just link it to a GitHub repo and then view the diffs in the web app? Feels a bit detached to me. But I am slowly spending less and less time in the actual files, and more time reading diffs.
How do the Codex models compare to Sonnet (that's the main one I'm using)? And does it have usage limits like Claude (resets every 5 hours/week)?
I found GPT-5.4 to be on par with using Opus 4.6 in Cursor. Mind you, I often switch to Sonnet in Cursor because I don't feel like there's a huge difference for what I do. And Opus costs 5X Sonnet, so that's good.
Does not compute... you mean you don't start by outlining your namespaces before writing your script
Not at all. I still haven't got my head around when and why to use namespaces. Maybe I haven't made a plugin complicated enough to really benefit from them. But that's what's cool about AI. I can code up ad-hoc from scratch then have the model tidy it up for me. Of course, that would be much more reliable if we had unit tests for everything 
@David-Healey It will probably be useful for refactoring and moving things into namespaces. I'm on a short HISE-atus (see what I did there) at the moment but I'm gagging to get back into it now we have the MCP stuff set up.
The future is leaning back in my chair with a cup of tea casually throwing out commands like "now add an effects section on the right with a Juno-style chorus and an authentic BBD-style delay, and wire them both up to XY pads with, I don't know, you choose the parameters." 
@Lindon It'll be a continually evolving world for quite a while I think.
You might know all this already but...
There are 2 main choices to make - the coding environment and the AI model that you use within that coding environment.
My preferred coding environment was always an IDE like VSCode, so Cursor, which is a VSCode port, was my obvious first step into this. But lately I've been trying the terminal-based Claude Code, where you don't get tabs with open files or a directory tree, etc. You just get chats and code diffs in one continual terminal window.
If you prefer and IDE try Cursor or Zed (David mentioned it, looks good). The advantage of Cursor is that it comes with the Claude model "built-in", so you don't have to set up API keys etc to get going. Another Cursor bonus is that it seems to absorb some of the AI model cost from your usage. Not sure how that will pan out in time. They can't keep doing that.
Another benefit of using an IDE over a terminal-based approach is that the IDEs keep a chat history of all your work. Meaning in Cursor, I can go back to any historical chat and just keep working on that same task without having to relearn all the context. As far as I know, terminal-based approaches like Claude Code can't do that. When you finish the task and close the terminal tab/window, all the history is gone. You're just left with the resulting code. Personally, I go back and carry on work in previous chats all the time, so I need an environment that allows this.
For the AI models, it sounds like Christoph is pretty set on Claude Opus 4.6 (an Anthropic model) but I've had decent results with the faster and cheaper (meaning not as thorough) Claude Sonnet 4.6 (also Anthropic). I also just had a couple of good Ruby coding sessions with GPT-5.4 (an OpenAI model) so that's another option.
The models are advancing all the time and some models are better for some tasks than others. But unless you want 3 or more AI subscriptions, you're probably better off paying for one that has a decent range mod models. For me, so far, this is paying $20/mo for Cursor so I can access the "built-in" Opus and Sonnet. And even sometimes Haiku (super fast and simple) for non-coding things like writing emails or support docs.
I also pay $20/mo to OpenAI for ChatGPT but now I'm trying out the Codex coding environment that all works within the same $20/mo subscription.
I don't feel like I've simplified anything at all here but it might be useful info for someone cruising by this post 
@David-Healey said in This script processor has a network that consumes the parameters:
The only place you should use var is within functions and paint routines. In on init you should use const as much as possible, followed by reg. In MIDI callbacks and inline functions you should use local.
We should just use var everywhere and let the parser/compiler sort it out.
@Christoph-Hart How are you finding Opencode? I'm trying out a few but haven't landed on one I like best yet.
Cursor: love the chat history and better context management, but steering messages are janky
Claude Code: like the simplicity of single terminal window but not really the resulting view
Codex: love the split chat/diff layout and it has chat/task history too, best so far for me
Haven't tried Opencode yet. Looks a lot like Claude Code in layout and style.
@Jeetender Check the docs. Looks like you're missing an 's' at the end - setForwardControlsToParameters
https://docs.hise.dev/scripting/scripting-api/dspnetwork/index.html#setforwardcontrolstoparameters
@David-Healey Oof! It got swallowed up in this commit
Shouldn't we always blame humans? Because everything should be looked over before committing.
@NISHI_MUSIC Sorry, I didn't read your question properly. I thought you were asking what "-inf" represents. But I think you're actually asking if those numbers are in LUFS?
No, the numbers above the meter on the of the Audio Analyser panel are not LUFS. They're simple peak meters.
Top number is the maximum peak value for the buffer.
Bottom number is the "current" peak value, which uses a shorter buffer.
There's no loudness weighting or integration window. They're simple peak calculations for the specific buffer length.
Both values display -inf when the value is below -99.5dB.
@NISHI_MUSIC It means "minus infinity".
Since LUFS are measured with 0dB at the top, and all the values are negative values, the 'bottom' value is negative infinity.
You see it when there's no signal present to measure.