I don't see "Export > Export Tools" (is this an AI invention?)
Export Tools is a subsection of the menu, but it might not show up on all platforms.
I don't see "Export > Export Tools" (is this an AI invention?)
Export Tools is a subsection of the menu, but it might not show up on all platforms.
The idea of scriptnode was precisely to be able to customize stuff like this so that I don‘t have to frankenstein every HISE module with fringe use cases.
You can literally rebuild the waveform generator with a few nodes (minus hardsync)
easy job for scriptnode:
HiseSnippet 1455.3oc4X0saaaCEVJNzswKqHcnWrcmuXWjNTDXm5kzfcQb9wIyX0oFQoA6tBFJ5XBKQpIQkDugALfcydE5c60X2sWfALf8hj2fsCojrjhbbs8RSwvb.BDOjT76b9N+Q00WPnAABeCyJmLziZXtLxZHW1eu9XF2n89FlOB0AGHo9UiDs6PObP.01vzrzgJAlKsng920auK1AyIzTQFFmJXD5KYtLYpztM+FliyAXa5IL2LqtQy1DAeOgiHDvSITMCOLY.9b5QX0xV.Y703f9FleAZK5YjFjy5Yi2ZimWqw5aUmtIdyFaQWmPNqgcs5a7b6Mo0dggY4V1Lov2Rhkz.3ktqvdnUewk7nC3TV.6LGpZPcCK3jiDarWelic2DiSfggIpapopTjo5InNLa1H4olrUzSTMcGYMZlKLIHUeFfjYFHsXDjdLxh3y7joynvyGgZyAFrGF3lrPIZsFl+NZOAr.tbMW7.5A9vfQaX0MpU6YUg+8zupWHmHYBdUA+Hgj9J9pOsxOTYoJ+Xkp2bpd8F6bpiwW33P8G6zJ2A+IswU4gtmQ8eV0KvNgzQKDT+71zxSmMkDo0YVnf2lyjuxiFO9.gisxVodtHCXDa1fmdc68wRrhThkAqyi5KYJ3XtO8BHLHhhVBsOMXfT3AABE3OvyQXG5fk4cmTAZwS.1ibbnhn3AL4vrAhyfOVsI5iMsP7wntLIo+3w3BiAifk58AFiiL+XTqd8nDYJ.WDcv2NuggS+wuTxwGEYoyjpO9OKVBWXSqpESCXAT+5SHe5eNs4S8l57oIA7OCMKAW2HG5hSWvUde1LqeLYxJ+AH45cii+GvXyb4+WJAiVLWOGZK9ETGHAjFieBjwoGNzQlHMuWWGAW30WvYjrNZGSk9ryOm5mE6iUg1QJgxzoRdRyioNTbPFOwOu4KYbJ1GrSz4zVL60BGKe8onH3VUEpT8+t4TK8+lbpSxD8PTqqj935uqpMe.XuXns98IzNVDJY7y6fgP2qfVVOJz0Bx8Sn.r3bpC7xQlKn5aIZbM0XEHrnba8f+F9EOYc0Xy3IqmLYlVdNhJuT3OPG8E+Ln1QU6BFUs6MAYq1siii3x8DtdrXWZvqQKqqvYXRRHyEhVQBr2wUDBmXL1SiG10QPFXw9dZhZ.WO3DLyQ8FrBCfl3reE2BdO5ZnlkNk5GnOyGfpsF7GDtbjNgT4CvDf.F1ECkqg3NUeg.OR8WiLhOuccJaDPzMUt80pNujBxQXFTUWk8Tc8FyRY5ZLJmlZD3srfBBKiZGbpZVB1w3TUQZklpempkWJVYTKsLxEJRZjSudjVufB8qomqHri2z+JLVFoywGitJnSgBNDkCeFd6Dr+4TYPbyxbJIxSPSFssUgN9Xtsv0nK1G.FbQDkzGfhdooRUt7Yz4QaKmVuxHsNd1h58nMNKZ9LnOKiDADnCMUBhapSc6qJTlSm.aZxH3pacX7XiYZZ9N3qtgrq21RR8hhERWm0.5kQFibEw2O0XdB8J4IB8y.zu.TN8ghdM2l1Ch.rAjcdzcusBO6PeQnmdPAHE2gQA46DJEtPdM6QtpwrUNiRg3Oe5ZYltHkka2yDsoRs3PuJ41Z6yB7bvC2MDpsEY7yIQ4UClhqRR+0B5P1FtQnd6IoDyQdkyPdUlNxaklEIOfPuUxKNF6Nh6td6ai6LlrpznYAU4W9qapJ+5ae6uUTUZ9yt+w1QeYhC7oeWHjgd3cj97SCZNV8Aj+Nzmq2tH0TaFolk05S0iU4EdeSPWuswr6qMtDES1W6PH589UUdukyKJY68bNu6FNZRJVY8cPuO4HUhzcEhAtXc+ey2W+59naUWLwW7l3N.TomenVBTTfqqirDpiZb05FWbSdQ0KzaHj7upBab84ciOed2Xi4cie47twMl2Mt47twW7t2n5i.EGno51Bhi51JpprYKNFtujtaAi+QDB5ZT
@Oriah-Beats are you using the latest commits? There was an issue with the spectrum analyzer messing up the UI rendering but that's fixed now.
@ustk Alright I fixed the code generation - the fix was surprisingly easy because it already scoped the parameter class types correctly so it was just some inner variables that were acting up.
In a modulation context with that many branches (64 in total). Are all the branches modulated no matter if they are active or just the selected one is modulated behind the scene to save CPU?
The container.branch will selectively process the audio signal with only the selected child element, but if you have multiple connections from eg. an outside peak node, it will send its modulation output to all connected targets, not just the one that's inside the currently active branch child.

I've added a new node control.branch which you can use to send the value to a single target only. This can be used in combination with the container.branch node to limit the CPU usage:

Alright it's merged now, thanks @Dan-Korneff for the contribution! I had to modify the code a little bit to allow the usage of neural networks in compiled effects - the HPF filter setting will be baked into as a compile time constant when you generate the C++ code for the network.
I also added a check that throws an error if you try to use a hardcoded network with a neural network (or global cable, same concept) without creating it first in the scripting initialisation - before it just failed silently but now you get an error message in the hardcoded module's interface.
@d-healey is this new? I didn‘t touch that stuff for a few months.
@Yinxi you didn‘t have to pay for a VST3 license before and the immediate real world consequences for plugin developers are not very substantive unless you have a fringe use case that requires a super permissive license. It is rather interesting from a business perspective and will ensure that they cannot pull stunts like with the VST2 SDK.
The biggest problem is Hise not spitting enough info when failing to compile,
Yes, the problem is that this is not deterministic - sometimes the compile process will send its output back to HISE's dialog, and sometimes it doesn't and I have yet to figure out why it works or doesn't.
That's the right direction, but I would also try to stay within the HISE user preset system so you get the intended loading prodecure (kill voices, load the preset on a background thread, then unsuspend the audio processing).
With the custom data model you can define the layout of the user preset file as you wish. Note that it will be converted from JSON to XML at some point though (which is a bit weird).
They also want to be able to export a preset, and include any sample content with the preset - ie; bundle the custom loaded .wav file, or the samplemap, with the preset. For personal sharing purposes.
I would detach this from the user preset system. A preset with sample mapping data and samples should be
all in one folder.
can you confirm this is a vaiable solution?
Sounds like a hack, but then using HISE to create an installer app is already a bit weird.
Speaking of hacks, the "cleanest" hack would be to just deactivate the entire audio processing:
This is the main callback for a compiled plugin (or standalone app). So if you add this code
#if IS_STANDALONE_APP
return;
#endif
at the beginning of this function, it will never call into the HISE rendering. Note that there are a few things that might be glitchy, some things in HISE rely on the audio thread to be working and initialised correctly.
@ustk Ah yes fixing this should be possible, but quite complicated because the code generator would need to find a unique ID for each parameter.
I'll see what I can do.
@Oli-Ullmann yes that is deprecated. You can only do this with a container.soft_bypass node now - this also adds a small fade when bypassing to remove clicks.
There's a template in the scriptnode node popup that creates a setup with a soft_bypass
HiseSnippet 1351.3oc0X0zSiaDFdb.GVxx1tqDR8ZNxVgPIPJrndfP9hF0FHBmEs2PSFOgLJ1y3ZOFR1pJUodY+Kr25gdt26s9Gnm5uf9Of+AsuiGmDmOVfjRa0FjPYd+vy6y62NM8EDZPfvGYjo0.OJxXCSqAbY2xcwLNpdEjwmX1.GHo9Y0jJMvCGDPsQFFqbhhfw5qhh9b6QkvNXNgNlDBcgfQneCykIGSsYwul43TCaSawbSHcgh0IBdYgiHDrmULyg7vjd3qnmhUhkxD8U3ftHiO27PZaRAR6N13C2eubE18v7zCvGT3P5tDR6B14xu+d1GPy8JjQ5p1Lov2Rhkz.3gVRXOvpq3Ft9BtfEvZ6PUGxirfaVSFUtKywt4PmS.BYrZywtpUztpMMavrYinO1k87HFYGqQRmlQp6xjxu.ljQBSZUsI8BSKhOySNlixddpYcNDA6fgXSRSQKKx32LKK.A3xcbw8n07gCiTXq8yka6rv+d4W1IjSjLAOqfepPROiu0Ky7cYVOy2mI6zr5zYt7TWiuvwg5OW1pzA+6Rws3gtso9am8ZrSHcjf.7mzml9g4SIZTmPPAuNmIOyiFetlvwV4qTee1H.J1sAe600qfkXUPIlFHmG0WxTliQE50PYfNDstYEZPOovCJDlI9AYNB6PGrbxzIUgVLCveLQLTEn3AL4fjEhKPNVt6LG6gZhuvrISR5NeaL0brQvS8ugMFWY9Lypc5PIxwF3pl0dyxVFlagKCyDWFB2o5x2H9X1ZuI+bK.em43jcOepG1m1RzzAOXq.rqmC8bvF2NaaGAomE6szYqP7zlPIkDaQ5h4bpSvxTHk9Qp4D5bQnjwupAV5y5iLLOMz0B5qSnkisNflQJUMj9bN0YUdgEkaGc3ufOwLyqNaDyL+PlIJ+NkJuQ32KJbD+cjwSz99fHm7kc5mGcrii3lxBWOVbVJDChn0T3LvqqfyHJRZIFZoG6JBgKI1bGmhWZX3XnkCSmZgYNpLdqv.nGh8YbK34DMRzXkKn9AQ24Zl41A9Cp.NUXCrVqFl.97AMwxtpRIUaIHuk5uCYT96DvHYJjd13DrUO0gSQ0VF.HWkiRMCUEMah8A0fN7plSoLVIQyJc9r5DTslRe00CtPwkfcPWnxWTJEcKZ+cDHRqD8YlAhNxKaGYenIf0mk.VIEJYeBMVl7gb2fYJSO0CyzmRpO0zxUHjcgz0nERhEzzXS00MObtgoHf.6vnZBhlI54S2IA64ErRvdQvmhEzMn+vQMUXAdPShRgPyNcqnInnfG2l1eX8RUnj2FFmEo9vZnDoB.3FcB5g0fwi8DiaZ2.2eJZOunkj5oKCFO.xpG8FseIIUkqKsZ7AE0h1W1RD8rfp3qADptymZ9Zvf6.II1fgckdoOqv1m3KB8hNLiEUg1AG5HmgN5tgRghy.k28GSCke58u+WmEJE+Q2e+H8ZU07oeaHTeO3QBO+PuhyEO.86AO2dzrglbKXnYiH7j8bU2sGq.zsGM+.zsGgV7bMv3WvbsSfwXez.EX71GDJqY1rKN3++5lGCrjNZe1+4Pwaye4j+7s+7CHrDjDW5YbiQ4F5Z4pbLrYyYADzhi5nsglKdq1GtCN1Iwlwv1gPaZ0k8gP3D.Z1P2863pqopWzU8FIbZzBfAwufR7w3MPpaO8P2QdGEqLliFggJID8bwQKZsbuxy+EqE5hI9hKI5McUP9IQTfvDOZ965lMTmylGc8ztVW381ujPl7QMih6trJt2xpXgkUwuXYUb+kUwCVVEe08qn5mU43PovUWIAkkMqp2lwPW9Fkwi9a.8pRF6B
@Dan-Korneff can you upload the changes (or make a pull request) with the 5Hz cutoff stuff, then I‘ll merge it.
@tomekslesicki It's a dynamic preprocessor which will fetch the value from the extra definition field while working in HISE so you don't have to recompile HISE anymore - just change the definition, hit save in the settings dialog and toggle the script fx bypass to hear the change.
I'm pretty sure that DAWs will not respect your fractional sample value - they just use it to offset the buffers they send you and I don't think any DAW will interpolate this.
The fact that the JUCE method's signature is
void juce::AudioProcessor::setLatencySamples(int newLatency)
^^^
should be a good hint about the industry practice here.
Puh, unfortunately I'm not really familiar with Scriptnode yet.
Well, then stop what you're currently doing and start learning scriptnode, then you'll look back at the HISE delay module and laugh at it for being so bland.
Here's a simple delay. It uses the tempo_sync node for calculating the delay times and has a filter in the delay feedback path so it gets dampened over time. That's just one of the things that you can customize with scriptnode. You can go from there, add ping pong mode, distort the feedback path or whatever you want.
HiseSnippet 2582.3oc6a07aaibEmzxT9yM6toYQ5QUr8f2h.CKYGuwnGDi+PYMZrspkiSbu3NlbjEgI4vRRYKsEEM.sG1asG2bqmxwhEF8Ruki8vVf.j8Oft.8xdy6+.M8MbHEmQjRVRQ1wYW6.Dn4Myv48989bFxorKQC64QbkjmbmlNXI4oUpzz1u1J0PF1Rqupj7MT1.44icywHsbSGjmGVWRVNyCnDjmXTof+Nq3xHSjsFNljjztDCM7CMrL7ioVV8WYXZVBoi2wvhazKnttFwdEhIoNvOYTlSxAocD5P7lH5vFQQ5yPd0jj+EJGjGcv7UWBgxu3An6ketkVJe06d2Ocg6ocf1RZKpixizW3dUyKImcMcCehaEejO1SRdzkI5MqTibhMaA10vy3.SLsQdoJvJyHWhXpSEQJUoUpYXpWNBn7jjjUJGCaYXv1sT1vP2nE8X36CB5HW7L3AP4QDYuLBrW9NwdovRxbrznLV5CUpn4Z33G2CkelRYcaPaVEA5IdVgMVI4WnrBAFfs+rVnivkbgFslvLKN2b2IG7eexurZcaMeChcNh8lDe7V1y7IS96mbhI+CSlq8tpVM09nKiKwzD6lZ2TSC2tMwYrqac.18N4NFYVG2Zff3KhoY6MLUiI0bCjXutsg+VN3v1c2nPJD1fe8n0WE4inJkPZv3bvt9FT1QdU7wfKASEMgxpXui7INfSQB8GX4Pzqah7EMmnNcgc.3gfNjpnr8L7ax6T1G1Xy0UardkE+PkxF9Z0RmGGIEdDPpKBdLzy78TVqZUrleLCNpRomLntgy02tgSF5FBqIcwmNrYtROIepNfegRrwtiK1A4h2gT1D0bFOjkiIdafGuStCLIZGUw3ywI8PbXrvxzQLiVMjsM1zaPbjxNjBNIsMotug8gaf7cMZ.gO2rtUEHFuFdkPtCnIOB0Gh0dNZapcQErsdPiWC+E1YdZa4vNyG0Im62lX+SHtGEnNB+sj73TreLEcL.jR22zjbxJDKGiPCT.9CnUlX1zoFw1PiRhMhHl79Vj5vyOjSistWNRSDwzPRpcPFlTi8J08fvG5aYWAdNAYFkyrK10KXMGSYtYg+AF+aRzgtFqDRCf6lkQ90ndQzHRfIK1cVsVltQR.ugCK6XTOzmUTJTF+.hgEEYnIPopuxHWXFPHcZznQjyvEchY.SaAtmivLWW2aWZuZHSocoFHzIErJzgGw5zgNohtay8OA6CgJ6jj34XBUBjjK345Ix9rC+iulx4IkxIhVCAoB5UjexFyONTd3bP1jqC2b6NflXoCfh2OhM22xnA1Ub8+ff0Gb7lsQUnFH2TV91me5vCOeDkbJgBcj1TnuO06iC7C0oLqZo1FbVZ7cbzXFW4g.ngbAWuSnQ32A4dH1OXQ3IDl3yFGDmwSrYHNstdDFeHUAzhenzyFjhSbQ58mIEz57yjSvo15Qsfxh1vvNTLiSKsApQazNqXEerCyaOdbUNBeBSEyORl+J6ArCtg+NjfeC78w.DGrnJOxVGWE.UcfyNjUiak5G7.WRcmfFIXoUwUQ0M8SP+908IVPb5.iHoDdkAHhfU3TfUnKd1C6l8ePm8ks2H71dhnclti168hjnMfrhn8e6YO6eVLAZ+hC+pORkYtFnkujAaN4ZxdxJR8un1Sx0u8mr5qJxpYuhEg3WCxgNrDtETSW3VP8bjmggdZZkswdX+KIWCoAIAGuoqjPREZ.lAMoRq41mIUBV52SopQi7KtePoehq9s4Vc9AkjGDeHmGa7lTZfLGqOlhEnYL5Ljw5NspZX8zOLpTZf2XJLsReqzxn7v1BAt2SO80CWnZTNFcBEWrF13Xb6rpKqH5Yi5Nshih5SjgOcOTRFtKQpuDxKNoRILV+.DXCdoFsdDde4on9B6yJaNQEZPtw3dSh07yUDs+M6cZeg1iz2n8.j+XUJiFbZaCA39kGU84OpC4O1SUDt66jiR+U0jlRmUrqlRQmj3PxT5ocP1dppXl.hMdeGhYadp2DrLLo51Ya0eZoBZ0on0ye+z8NmfKztbLwMhNioRrUK9mzXNf.2HZqwqA6tWGJPKXBQaWVvDLa2MAWPMgV5KdkZO4vq9mr92glfkbw+t5vlfa1Q0T7H5E0D3EjpZBn2ylfpyO+qJ1lv8hu9q+3dS3j93u+kABWFke8vx16rhoa6cVwywUpPJ0kUPs+hJeYU+7.DUnGSvbgUxr5294+4zTMAzGRxS2hxEtS72UTMcSTlPYMazAl.udw6yvEuNqhG1VWLV8MZUUUPeIiSGNo9sdpTJ.j63JhXyVkqItaiNs0iwYkvN+fTC61sWC6oO6BrF1IijrBWWD6EcQrSGWHZgqqh85pX6ypXmpUgnEttL1qKi85xXutL1qKi8pbYriETQZgqP0wxUsWWJj87Jwcr3SWu+eYUsl00urpqeYU+H+kU0wcAM1EytfFWYU2lOF6KJRhaXo2d48s+UOH7F7idS5RIdUOs1HjO1xgruWSaMwnG2p0GbA2HRFFQ3AzC6FRrb13OHHtOKhTES9McIHh7avQJ0oJrYuNOWASfQ6+MBWnO27xXJ6PQtK5DgsuK3t66eVwjB1b8ofMsxFzW+nioArHWpkFO06HEszqmXwE1wCzRztAv5TWWr9vbWzcR9L5ztyZeinSyx0GvSCeAesFvhXiL49XagxgV0viojSQDCYEwf0bbfpU0pGod9n25Lprue1dJ7tP7UgfWso5jZG9FmdmDfdkF9gu5e.DZHBdcBqBhIRY71soxoNLAunfuIPMdNX3GMYH.bIV8KWqt3XgIfNtS1c3WzT+ibiwRt2I36IK8O9WO+K+uugvW5EqDeb7BXGG.I0gODyVaJriSjO+ME0UTdX4RWI.7Nap9y9J2Ze6M+th8F5wc9nsUsV7gDJ0ghDiOW1NO0jH3FFMthif+uuow287u7aJ1OejvAeT4BvPqccHsLgbjEJ368+M9l2baVmSo7Xzw3f6AWvWc+GEztJw0J2Cv1XW58cIeWtIburWuIbN87MgaKMefE1wEY64P7v4EzYXKic.yEOApsMiBoNiBhU53W2V7QyHILJJTTBfBtwMtZDwB7DKirEdXPagmD0VsUy+SQVz3JXPx02xSC.FTalgkqa5gergtes77SLlbAdxeFxUOH4G+EMJS2tOfc7NsHdmq3FeJWAnruEtbfCmKt0aw6VlvEmZhHdrhA8UDsFjzxDbiC3wapDFVIhpne3FDaRzE3IVquM1203vCwh6YHMA5999zTSsnbK0swlXjGmu4OWkcKHBNH6ACK5+6xYp5qepBicyQCdj6c26DXlePem.6cuOHd3Uas3sUf3xExEnJy81QWdYbUBuLVCKjlKY+vykj5zOd.EPtsC+LX1f1NWdoiauTNKHkw9ZZhOpDSrvfNw4GzItvfNw6NnSbwAche5fNw6c9SjlQO7rgn9FPYNkWi8MKHGseS5Kh4+qFm6nN
@tomekslesicki Alright, thanks I missed that, now I can reproduce it.
The easiest solution is to just warmup the network whenever the reset call was made - it then just processes a bunch of silent samples and throws away the result. I'm not sure why it creates the spike in the first place and usually the convention of calling reset() just before processing the audio signal should work here too, but this will definitely remove the necessity for high pass filtering the values.
I can imagine that the amount of samples necessary depends on the network so I made it a dynamic preprocessor constant. Just add
HISE_NEURAL_NETWORK_WARMUP_TIME=2048
to your ExtraDefinitions field and click save (no need to recompile, HISE will reload that value and use it dynamically. In the compiled plugin it will be a compile time constant).
Note that there are a few situations where the reset() call can be made in the audio thread - eg. when using it polyphonically and starting a new voice, so if you try to outsmart the system by adding
HISE_NEURAL_NETWORK_WARMUP_TIME=10000000000
you'll blow up your audio callback.