Just wanted to wish everyone a happy, productive and prosperous new year!
Just wanted to wish everyone a happy, productive and prosperous new year!
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. 
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! 
Just leaving this here in case it helps anyone searching for quarantine issues on macOS.
Remove the quarantine flag on a VST3/AU plugin so you can move it between Macs while testing:
xattr -rd com.apple.quarantine "/Library/Audio/Plug-Ins/Components/MyPlugin.component"
// or
xattr -rd com.apple.quarantine "/Library/Audio/Plug-Ins/VST3/MyPlugin.vst3"
That's if they're in the standard location. If they're somewhere else, like the User folder, adpapt the file path.
@David-Healey @Oli-Ullmann Sounds like the HISE store will let folks create and sell things like this.
I'd pay good money for well designed widgets like that. Such a time-saver.
Looking forward to it!
This is just an idea.
️ It may be useless
It may already exist
It's definitely already solved by a simple script.
However...
I wanted some buttons to show/hide some panels in my plugin, but I also needed to be able to turn all panels off. Something that comes up often for a lot of devs, I'm sure.
The button radioGroup feature is almost right for it, but just needs that one last part.
Since all the code for radio group buttons is already there, I just added a way to set specific radio groups as nullable.
PR here: https://github.com/christophhart/HISE/pull/823
Usage (snippet below):
// Set Nullable Radio Group by ID
Content.setRadioGroupNullable(2, true);
// Set Nullable then back to regular Radio Group
Content.setRadioGroupNullable(3, true);
Content.setRadioGroupNullable(3, false);
// Test invalid radio group ID, console shows:
// Interface:! No buttons with radio group 99 found
Content.setRadioGroupNullable(99, true);
// Test wrong number of arguements, console shows:
// Interface:! Too few arguments: 1, (Expected: 2)
Content.setRadioGroupNullable(1);
Here's a demo video: https://share.cleanshot.com/v6tfjFN6
In the video:
Screenshot of the demo:

Here's a snippet (the nullable calls won't work unless you have the PR merged, of course):
HiseSnippet 1535.3oc0Y0saaaCElJIZq1YsnEnC6pAvkap8PVq+owsNaCyM+0YrlTi5rh0qZoknrIpLofDUR8JJPeT1iReSVeD1aP1gTx1Rqxxo1IEq9hfvCO+7cN7vCOjpiuvhFDH7QFEOdjGEY7UlcGwkC1c.gwQs2CYbMyCIARpONhzNi7HAATajgwpOTQvnvZH8u+4W1g3R3VzojPnmJXVzGwFxjSo1o0uwbcOfXSOlMLA22sUaKAeWgqHDvyplUPdDqWR5SOhnXaESzuRBFfL9dy6a0ytQSax850nQu6U0xtoSkpMITZu5ac+5zsrZXU0oAoBx3K12lIE9ckDIM.Yr1NB6QcGHNkGYfmxBX8bopAUQcAKGQ9.gqsxEUTQ6Nf4Z2YbfJ.AZoyzv1pQgsaZdHylMg9zv200SfmJQx.nwJog2pofW0jvqRB3kAjLR.o0hfzML6Z4y7jSmQgm0MaygUSGBrNkDJQ7hV4uW0bWAvAWd6gjWROvGFLQhRMpTYSL7mx+Xwh24N3tTI9nPWWB.R7SH1LA9g9hPuhiUQ.UpIqoNlyR01DK8CoYoD4.JGejf+CKfZqOQsykOGhavX6eLMPhY7SHtLaru1Z8U7iau2lXHgLP.nH.VTB1Vw9jfw1eG.TbuPoD3AeJSNHkzMahcDgbaPl7gSyloBGZ3bJD16i4gC6Aa7DNXhe+P5PPGAyCRGKDXG5oZIzBrMt5l3R6+JOpkjZuMtV44hnpJn3H7wk7f.CdLy8oxG35tqXnmfqzboM73taTtL161JrnXyW3VZRrUqgd4qgdRtRCutXgdJv7ThaHsjJ8JZbrN2k351CpETBXOlDvxaJVjwcYbJ1IjaIYBNd57krFakMwmnzp1HtBKhKFfM9mwSXPAqRaHouRtQ4a6S8bUY5ZjsINxEA3jvElf+RvjkS46QVBf1DDI3GIjzGyKUtHXe.y3+6TNNYNWrJco9YNspzoedBVJJ6Yr2OlQn7P5ZNlytlSxRhVQ9eBFE71bl7wdT9rJThhCZv+86s2iHIpBUwz.97n9RlBBF6QOANlHprUAy8nAuTJ7PFe6jHMTHWpm8ZwE01QusCwrUB.KUU8gxXuZ5YIOq0nICdKok+jj7jmWEPNg1l2wmBYZpZfnyk8VWau99TvwSXQ9kmEKpsXOXYLgAe2oWdFTGRqkSHE71rrGp0RDRqkaH8B1h5PZs7BoWFFrddFrUXlF7JKSLsdtwzKXKpyZpmSVyBYOy7sWk713+5ETy5XWk72hun5VmHTI2Myu97r.b0XU+HROpqVyWwT++Um4l1m0RcHGx3aLeBsenKwOYyU3pHnCn97gQFwzk5HQIs6WNG6Val1kEa2xlY0UGtFtDbRjjAc7bKUiP2pbFH4TlsbvDU9WiZ8w.s5yBZuyOFZ+j44qETb8DfU2oy4AsxVeLKf2clAxQwn8qMgNGvjT.qxbV9JLGqt0LsZ6IoMYEQBxvtNvY7cY+Yh61UqU5Px6CaMfx5OPl75eIgawzvsCgGC2BlPWW4cbeKZqdBeapeZDfPQTUPOLHIcljNb7sNK7EHzYmklZsjjGiZSiaBiR6TnWjxEVeVtv5ZWH+RyKoSbFJSmHlblNgowagAmLt8uzEclouTT6K4dt1x4J.fyxUFSdNqGKj6jaeAu26yH2QmokeiUKo+7oKSSuwOulRWVOYo13uPdSdMKgO8+edSwbyyxuYyk0eV37ry+99baOeIw+m1885rq7ZM9Eu4yn8J5rq7aGeY8mOsmWla6+Koqbwkn8gOo70MOTXCWbPl9EtUeGf3IXhzeh.0SSxCXxQIeThKrm897BwaX1gIsFjMFWICLhPWJXL9iEbUy8cbnVxo.bMyC9iKmuL.5IhP0sUNjH8YPFGzC+vtPRgEErNGxJUOAnwJpxjQiqnFqh.coba8fyfewSVUM1HdxpimDMjX4KdtUzCOp9bDWQSAvDW+oaJXdnZLbES8iQlLNOjYydtkUZU8ABVaQEr9hJ3cWTA2ZQErwhJ38VTAu+7ET8wqdPnTLLZaCBcXm80ujqgw9b0UA0Yqn+EXWJL4H
I'm being facetious, of course. But when you work for yourself, holidays can be... different 
Besides, making plugins and more recently, using HISE, is what I do for fun anyway!
Happy holidays to everyone here! 

What a great bunch! 
@ustk Could do, but I prefer to keep the button's 'on' state synced to the panel's visible state.
If I start flipping values as a workaround, my future self will not thank me when he looks at the code in 2 years! 
Some of you might remember my troubles compiling HISE on my 2020 M1 MacBook Air with 8GB RAM.
It was taking an hour to compile a debug version, if it finished at all - it usually crashed.
Seemed like the 8GB RAM limit was the issue, causing havoc with memory swap.
My solution then was to write a build script that builds my version of HISE using GitHub Actions, whenever I push a change live. It took about 15 minutes round trip to push a change, wait for the build, then download the build artefact to test the change.
I used this long-winded system to add features and fix bugs for the last few months. Painful!
Finally I upgraded to a 2024 M4 MacBook Air with 32GB RAM and I can now build debug HISE locally in 20 seconds! It's like a dream!
Just wanted to put this out there in case anyone else is having issues compiling on an 8GB MacBook.
@aaronventure said in Quick F5 tip for Mac users:
@d-healey Hold Shift while typing to amplify my anger.
Exactly this! Left pinky on the SHIFT and hammer those keys! 
Same on iOS. Instead of double-tapping the shift key to lock it, I shift uppercase every character, just so it makes me more angry! 
@d-healey LOOK AT THAT BEAUTIFUL RELEASE CURVE!
🥰
️
@David-Healey Fixing the underlying issue is the real power move 

@DJJD12345 Faust is an optional external dependency. It's not required unless you're actually using Faust code in your project.
@ustk Just made a quick proof of concept in Claude. Haven't read all the code yet, so no idea if it's well implemented or performant, but it does look kinda nice!

@David-Healey I guess you mean hide them? If so, then yes, agreed.
So if you close Container, all child modules are hidden. When you open the Container, child modules are show, and in the state they were in before closing Container.