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.
Don't know if this has been posted before, but it's a good read from Moonbase:
State of the Independent Audio Plugin Companies PDF
https://moonbase.sh/reports/state-of-audio-plugin-companies-2025/
Not too many shocking conclusions in there. Mostly what you'd expect, but good as sanity check.
@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.
@David-Healey No, because this is about persisting the file to the user's disk.
Although as I said earlier, I think the final best answer is to display the license directly in the plugin somewhere.
Then nobody could ever accuse the developer of not making the license easily available.
Website goes down - no problem
User moves the plugin to another machine - no problem
User wipes/moves/modifies their AppData folder - no problem
If the license is in the plugin itself, it can't be accidentally moved, deleted or overwritten, and it can't become unavailable because of server outage.
Probably going this route now...
@ustk I don't do plugin licensing, so my plugin has no server calls at all currently.
Not a bad idea though, pulling it from its web URL. 
@David-Healey said in Automatic license file placement, like user presets:
the first page of the installer and it's on the website
Yeah, that's all I was going to do too. But then I thought some persisted version on the user's disk might be good too.
I think probably the best way is to show it in the plugin, even if it's a footer link in a settings/credits panel.
That's the only way to be sure that the license always travels with the plugin.
@David-Healey Gotcha. Problem with that method is keeping two separate copies/formats of the license text in sync, assuming you also want to display it on your website/elsewhere too.
I'm not even sure how I want to show/store the plugin license yet.
I looked at a bunch of other (well-known) plugins on my system and can't find any licenses/EULA files for most of them.
They either have it in a panel in the plugin, or it's just on their website.
@David-Healey How would you do it with script?
Any interest in this as a PR? Or are you all handling license files in your installer?
I extended HISE to write the project's LICENSE.txt file into the AppData folder on first launch.
Same mechanism as the UserPresets system.
@David-Healey Looks great! I kid ye not, I'm noodling on my website redesign now and used very similar colours and layout!
Total coincidence! 


@David-Healey I doubt it. Once you start notarising, I reckon you'll never stop.
Two free Mac apps from Mothers Ruin.
First one is Apparency, which allows you to inspect the status of VST3 and AU plugins. You can see the signature and notarisation and the property list strings.
Here's Rhapsody VST3:



The AU has some extra property list strings, and one of them is a dead giveaway that it's a HISE plugin 

Next app is Suspicious Package, which allows you to inspect your installer PKGs - what files they install and where, what scripts they run, the installer code sign and notarisation and more.
Here's the Rhapsody 3.0.0. installer PKG:





What's very cool is that you can drag and drop from the All Files tab in Suspicious Package, into Finder. So if you just want to grab any of the assets for a closer look, just drag them into a Finder window.
Oh, and it has a Finder Quick Look action too, so you can see the main details from Finder by hitting spacebar:
