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.
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! 
@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!

@GUJIAN You're on an old version of HISE. It's usually recommended to use the latest version, unless you need to keep an old version for compatibility with old projects.
Did you compile HISE from the GitHub source code yourself?
Which branch and commit of HISE are you on?
@GUJIAN Scroll down to Compiler Settings:

@Ben-Catman You need to compile HISE with 2 preprocessor definitions added to the Projucer, under Extra Preprocessor Definitions:
NUM_MAX_CHANNELS=16
HISE_NUM_PLUGIN_CHANNELS=16
Then in your HISE plugin project settings, under Extra Definitions Windows & OSX:
HISE_NUM_PLUGIN_CHANNELS=16
This will give you 16 internal routing channels in your plugin, and expose 16 outputs to your host/DAW. Change it to whatever number you need.
@David-Healey Fascinating stuff! Big takeaway for me is keep your business model simple.
@rzrsharpeprod The following script draws something like a glow.
It ain't pretty, and I doubt it's very performant, but it might help to get you started.

const flt = Content.getComponent("FloatingTile1");
const laf = Content.createLocalLookAndFeel();
laf.registerFunction("drawAhdsrPath", function(g, obj)
{
var path = obj.path;
var area = obj.area;
var fillColour = Colours.red;
var lineColour = Colours.red;
var bgColour = Colours.red;
// Fill the path
g.setColour(Colours.withAlpha(fillColour, 0.05));
g.fillPath(path, area);
// Draw glow with multiple strokes with decreasing alpha
var glowColour = lineColour;
var numGlowLayers = 5;
var maxGlowWidth = 20.0;
for (i = 0; i < numGlowLayers; i++)
{
var alpha = 0.5 / i;
var strokeWidth = maxGlowWidth * (i / numGlowLayers);
g.setColour(Colours.withAlpha(glowColour, alpha));
g.drawPath(path, area, strokeWidth);
}
// Draw the main stroke on top
g.setColour(lineColour);
g.drawPath(path, area, 2.0);
});
flt.setLocalLookAndFeel(laf);
HiseSnippet 1514.3oc4X8zaaTDEe1jrEhaaJUBAWG4S1MFG6Dm1FBnFW63zHRZshSa4VY7tisGxtyrL63jXU0y.huAHwM9d.G4Xk3NeF5QtEdytq8tahw0wBnsBeHZm2el2u48u4MooTXQ88ERjQlCG3QQFWyr0.tpWsdDFGsacjwRl6S7UTINjz8G3Q78o1HCi42QSvXwEPA+d08tOwgvsnwjPnmHXVz8XtLUL0la8ELGmFDa5gL2DRWYqcsD7ZBGQe.OyaVB4QrNhzk9PhVr4LQOf32CYbKyxz6V4N1s2vp8sqTtxZVaTYsMJYeWREZGKZox1aTockMrJcGjwU11loDxVJhh5Ca58E1CZ0SbBOz.Og4yZ6P0KJiZAVNjLpVOlicygNGeDxvrYrqZ9PW0GZtOylMhdrK6CBXfi0HoSyXtIAoxWBHYj.RKDBoaZ1xRx7Twbz34pl6xgHXGBDaRBkPYQy8sKXVS.RvUEcIGQaHgEizH2sKUp.F9S9MyjAhO9JbGGE9ywCUoKUUS35I3vhbYa3HHJFu6gLGZ4rfNgp3P5jPEKIEN76IrHN6IDGUka2fRcxos.HXQIsKSmx0nO2RwD7bYskjSp1y1W1jn5ks.tyPNcKfEs+57YddFL76XhD6AR.lBnVT+4liXP.iFwP+YLiNP1XXVW.D0e3CXvNVBGFmNYIZ28umeveVYEbCvNXUOZ.DCH1snu14okO2P0Ngo5U0wqGIWLtJfKUrz54yuYjVZNZOQN8NUH3jkOsspCNLbWGwIX89gc66nXdNTruRJNh5GR0lpCD9PzBSzVbzoQq3nyS7gO93x66tCHydjAToOHy5wrbImpY8TlcPbXU.4IfVGgDmiAzKsIlg+rzaDPZ4kyGHWX7bTnSiNsREWGuBlsYJlgGog1Kk4uk1Vqj1H4i0dzGSNND6MJDhj7I1itE04lmKXTHInhD9EWL9nyEbglFQRiEbrR3cgLi3.vnDfwZyUKpqQegtJBpP0avEpvfpq7aNr3Ar2CEJ5i34z0OKlAP34Y0oyX4oqikBGGpbrr0s0kSRwbPDoMEbmGSb5SGIHzFKcuwqLc8FsBaqjPPAeWNS8HOZz5FBGacOO82WrSJJpuD70i2sNQQzMWinAx4QkJlFNF0oGCWmE1pcQy5T+if3UfrQ8+fdspn6FBatlrcHhAH3Flo5PhNEtZw36AKOP+wyiAyvqiq9f5sNXGIwqGZXSFv3W4rnKXYJpaLUD5ryRSc0jjUzSUID9LT.0fSrQKScMW1Q9kcsy9o3rAVGuM+XpC3GJmsfVlc41zSAteR4fkfyUWwIjG4CWXSAFcHN9zLuHALVK.yQFDcwKtfqLE18cHpz2ipmvHhAj.k5xK8ETbelZPxIPtDWtVZhWtNsP7llMYJqdiGiyMFLBoV+afwnQRtt41c5PsTw.bAyFe4rN+wza9kBM+UMaA8pBFfLv3eTvZ7SIGSw6P4To14UdByP9xocFRuodFxGYo.yenjv88D9o13VTW1gPcqeRhO1GF.h9MGnilIoWSPjik0qtWC3PNVcZQT8kAoEUcE84pToAymNNrvz0qKcEQB4eKYl0+YJqdCV4mZr5aDhw2KrKbTE+45IlBa6K3BudBNyJYr9.pRx51kJSh3wdLppTvadp0WdbpL05TKxfyQcnvin7i+7VgT1iBPKh7W8xk+ie4Av0eWX6FQ3O+gsZ02WEWHt0u8SK+qGPcfYCis2286assk.BIzYzseIdf0jRMttY3gDGT3eoyKVX5xKdMCLLkXcogXMLh71MXulYPZw6B90aXFkv9NgicIynZo2EbsSbfl4+ey.MSxE8wlw2qieyLc5Ah95mPrOAtWQ+BhG12sELwiEEPImSc70OlXN8TKgqKoWGNxC2NXwYvuHlk0qMhXVdHy+SrgKwRJdlU3qB02B79ATfyMO3+42hl6qWiKiBdoXxrNWXbkmYYkdqtfhqNqJt1rpXkYUw0mUEu8rp3clUEu6qWQ8zjU6qDtg0FHz9M2N7glFayIPVdPYB5u3st0bC
@rzrsharpeprod You've tried the three LAF functions in the autocomplete?

The syntax for drawAhdsrPath is here: https://docs.hise.dev/glossary/custom_lookandfeel.html
@David-Healey said in this one looks interesting:
built lots of little projects
100% this! That's what I did over the last year or so.
Folks who jump straight in with a large project are asking for trouble. Even if they're seasoned in other languages or environments. For example, I'm well-versed in building web applications in Ruby On Rails but I wouldn't jump straight over to ASP.NET and try to build a massive project right off the bat.
The ideas for the first 4 HISE plugins I'm developing all came from a very simple concept for each one - focus on one single sound type. The first one is sub bass. Even keeping it simple like this has it's challenges.
@David-Healey And all I'm talking about there is getting set up to use HISE. Let alone the challenges in actually developing in HISE.
I'm not trying to sh*t on HISE. I love HISE, and for the most part I find it very enjoyable to develop plugins. The possibilities are vast compared to where I came from - Maize Sampler.
But when you hit a wall, it's often difficult to move forward. It might be missing, outdated or incorrect documentation. It might be hitting the barriers of Christoph's vision for certain aspects of HISE. It might be, that after investing dozens or hundreds of hours in HISE, you finally realise that you can't achieve you goal without plunging into custom C++, which makes HISE a convenient UI playground at best.
At least with something like Maize, you know the limitations from the start. And all the rest is easy.
Compare the whole process of cloning, configuring and compiling HISE (and then repeat the configuration and compilation process, PLUS notarisation, to export a plugin) with Maize Sampler - you download the app, you chuck in a load of samples, you add simple UI elements and then your plugin is compiled on Maize's own servers, fully notarised and ready for distribution.
I'm not saying Maize is in any way comparable to HISE in features. But I've built a real business, making comfortably more than minimum wage, just selling Maize-based plugins.
PS I can't upvote any more of your posts today! 
@David-Healey I don't think you need to rush it. Plus, maybe an accompanying document would be good because it can be updated without republishing the video?
@David-Healey said in NI Insolvency:
I'm just not sure how it would work, the two are so different
That's kinda the point! 
I'd help if I could, but I only built a couple of basic things in a very old version of Reaktor, and I never got on with Kontakt at all.