@Natan If I understand what you want, i.e., duplicating a Scriptnode network and changing minor components within it, this has been my strategy in the past. Simply duplicate the file in your file folder (YourProject/DspNetworks/Networks/YourScriptnodeFile). Rename the copied file (NewFileName) then open it in a script editor. Rename the "Network ID" and "ID" to the same name (NewFileName). Save it and then you should be able to open it in Scriptnode with all the same properties.
Best posts made by HISEnberg
-
RE: Moving DSP Networks Around
-
RE: Distortion
@pelle There are plenty of options in scriptnode already using the math operators (like tanh and clip), as well as plenty of faust code for different waveshapers like soft clip and chebyshev.
-
RE: Reducing LAF scripting redundancy
@d-healey & @Lindon Thank you very much, both of your responses have really helped me explore the possibilities here. I am pleased to know I can use the text property in this way, and will definitley explore this more in future projects. A lot of this particularly UI is already laid out so I am settling for bypassing any text that is not the exception cases, and employing it for any cases that call for customized value displays.
Example based on Lindon's edits:
const tempos = ["1/1", "1/2D", "1/2", "1/2T", "1/4D", "1/4", "1/4T", "1/8D", "1/8", "1/8T", "1/16D", "1/16", "1/16T", "1/32D", "1/32", "1/32T", "1/64D", "1/64", "1/64T"]; const filterModeLabels = ["Lowpass", "Highpass", "Bandpass"]; const LAF_StandardKnob = Content.createLocalLookAndFeel(); LAF_StandardKnob.registerFunction("drawRotarySlider", function(Style,Widget) //... if (Widget.text.contains("FilterType")) { // For FilterType knob, display the corresponding label displayLabel = filterModeLabels[parseInt(Widget.value)]; //For TempoSync, display tempo sync values }else if (Widget.text.contains("TempoSync")){ displayLabel = tempos[parseInt(Widget.value)]; } else { // For all other knobs, display the value displayLabel = Engine.doubleToString(KnobValue, 2) + Widget.suffix; } Style.drawAlignedText(displayLabel, [Area[STARTX] + LabelOffset, Area[HEIGHT]-Area [HEIGHT] +6, Area [HEIGHT]+LabelOffset, Area[HEIGHT]], "left"); //...
-
RE: Mac Installer Advice
@FatMitchell Yea I managed to figure it out eventually. The problem really is that if you don't incorporate certificates and notarize your product, then it is flagged as malware making it difficult/seemingly risky for the customer to install.
-
RE: Codesign error on Mac, what am I missing?
@d-healey said in Codesign error on Mac, what am I missing?:
Yes your video helped me out a lot previously setting up my package installer, really appreciate you sharing that.
I still don't know why but I was having one hell of a time trying to set up my certificates and getting it notarized, terminal kept failing me (not acknowledging my ID's specifically). In the end these two videos and their extended links did the trick for me:
Certificates:
https://www.youtube.com/watch?v=m097IHT7v0QNotarization:
https://www.youtube.com/watch?v=GpdN97OX1Z8@Mors the notarization video may help you in stapling if you still haven't solved it.
-
RE: Auto Gain?
@Straticah I think you more or less have hit upon the best solution, and this sort of issue isn't at all unique to HISE. Understanding the gain added/reduced by any one particular effect, sampler, or synth in isolation and compensating it with a nonlinear gain node is probably the solution, outside of compression which as @ustk hinted at, can squash the sound or introduce unwanted artefacts.
Personally when working on FX I'll introduce a gain node in my scriptFx chain which does precisely this. I do agree that it would be nice to have a meter node which could help us analyse the gain output at any point in the chain, but at the end of the day you have to trust your ears!
-
RE: Combo Box Dropdown LAF
@d-healey Sincerest apologies, it is totally possible I had completely misunderstood! Thanks for you help
-
RE: Combo Box Dropdown LAF
@clevername27 Thank you for putting that tutorial together, I had some fun with it a while back! Unfortunately, it doesn't show anyway to stylize the dropdown portion of the combo box. I think it is as Mr. Healey is hinting at, that to edit this portion you need to go into the source code.
-
RE: Multi-column comboboxes
@d-healey This is great. Can you tell us how to populate the levels with an array? The traditional combobox method doesn't work here and I tried via scripting a few different combinations but I haven't been able to figure this out.
-
RE: Upwards Compression?
@Straticah You might want to try something from Faust like
si.bus(N) : peak_expansion_gain_N_chan_db
I think I have implemented something similar for an OTT but it was a while ago. If I find it I can let you know.
Latest posts made by HISEnberg
-
RE: Introducing: HISESnippet Browser
@Dominik-Mayer Awesome this is such a big time saver!!!
-
RE: Distortion
@pelle There are plenty of options in scriptnode already using the math operators (like tanh and clip), as well as plenty of faust code for different waveshapers like soft clip and chebyshev.
-
RE: Reducing LAF scripting redundancy
@d-healey & @Lindon Thank you very much, both of your responses have really helped me explore the possibilities here. I am pleased to know I can use the text property in this way, and will definitley explore this more in future projects. A lot of this particularly UI is already laid out so I am settling for bypassing any text that is not the exception cases, and employing it for any cases that call for customized value displays.
Example based on Lindon's edits:
const tempos = ["1/1", "1/2D", "1/2", "1/2T", "1/4D", "1/4", "1/4T", "1/8D", "1/8", "1/8T", "1/16D", "1/16", "1/16T", "1/32D", "1/32", "1/32T", "1/64D", "1/64", "1/64T"]; const filterModeLabels = ["Lowpass", "Highpass", "Bandpass"]; const LAF_StandardKnob = Content.createLocalLookAndFeel(); LAF_StandardKnob.registerFunction("drawRotarySlider", function(Style,Widget) //... if (Widget.text.contains("FilterType")) { // For FilterType knob, display the corresponding label displayLabel = filterModeLabels[parseInt(Widget.value)]; //For TempoSync, display tempo sync values }else if (Widget.text.contains("TempoSync")){ displayLabel = tempos[parseInt(Widget.value)]; } else { // For all other knobs, display the value displayLabel = Engine.doubleToString(KnobValue, 2) + Widget.suffix; } Style.drawAlignedText(displayLabel, [Area[STARTX] + LabelOffset, Area[HEIGHT]-Area [HEIGHT] +6, Area [HEIGHT]+LabelOffset, Area[HEIGHT]], "left"); //...
-
Reducing LAF scripting redundancy
Not sure why this is causing me such a headache, but I have a LAF for my knobs with display labels. In most cases I want the display labels to just show the values, but in some cases I want it to make exceptions to display a specific list (LPF, HPF, BPF, or for TempoSync 1/1, 1/2, etc.)
I have figured out how to display the labels I want fairly easily, for example:
// Labels for Filter Mode const filterModeLabels = ["Lowpass", "Highpass", "Bandpass"]; //... var displayLabel = filterModeLabels[parseInt(Widget.value)]; Style.drawAlignedText(displayLabel, [Area[STARTX] + LabelOffset, Area[HEIGHT]-Area [HEIGHT] +6, Area [HEIGHT]+LabelOffset, Area[HEIGHT]], "left");
I cannot figure out how to make an exception in my LAF code for each specific use case. So far I have just been copying my entire LAF and creating a new one for each use case (creating a lot of redundancy). Wondering if someone can help me out. Here is a snippet:
HiseSnippet 1954.3oc6Ys0aiaiEVJSzzZ2KnEn8cB+Pg7DGGKmjoYf2sMwI1SLhSbZr6zY2.iALRT1DQlzPhdl31NE8mx9KXedeb+G09On8PcW9RRp6UTLxHFlmqe7vCO7Dpyc4lDOOtqhZtdSGSTTeWstSYhgGNDSYJsNBnqcBieUarsR8oiwddDKEU0G7TIa0bqq3+7iedcrClYRRHon7LN0jzlNhJRnd99mPcbZhsH8niRI8N62xjyNj6vm.P4AZUTFiMuFOfbFVJ1ZZJpOrgEUvc6JvBhGHSct0ztC4uhEH+yndzqbHxAFJcACEPV4vgTGqyilldJJpqedxj9AAS5OR6TpEMldxj+C7YfRzHcLPcsaCRF+BfjZJHsd.j9PstltzwhDNR77NZsXBhqMFB0ogRfrJq8u+XsC4fDLQ4Q3qIMcgAwZn+3JUJgfuJVKedHb6IPc6cvE8dN5ehpTKMk+EPwHhxW05ndGCDpFQ33Fsd5w8.JaGamC6bV2dun6De+7TWrEEfPO9XokuoYyJ9O0tMgqyEB9nP42Yucpua0rxWm6ZQbCRQBE6IaCedRVwNh5ggftUKlE0DCqNozv1dW7tWsq4h0HDPY7fwSLvFVKV95S.Dy5QtQjET6.evyFYFgcbBTnIrjzk90DYHFlh42ZqurEJT3WhcQxcaF.yn0wADv9iFyYv.8B9bKTr1LJT8VUnpTAoml8AcxYcpiZ2oyInCN6HTyFMZilWp7Qyk1Gz7EPxNyB6ZIsaJmZ5RfMAs4lXm1b90GvrZRHN5w.UpZSpCjIdJ2hbuTL+rtqrKY.0CLQyILSAkyzKX4he0EbA1cZWGJjdTnDxNhYWwTGRouhZAAjh4+l74jAqC.2AdOfZYLLpV.CoCNlPGLT.rkRcYPZd+T7AsDCmmc9DIBygB8xkFUKgj+4ONRiMqtSoLl.HzWt9jyGwk8HhnMEPDyQ+xPvREjQAYZFyXws.W.6rmStpKPtzNtODkCcpM3oFNNzwdD8YlHxkhbasUa7UDmfYp+O6XaCHc9nQ7jH.C5gnRDuOoXZgj6FzKz4loCHLTctiUAYDqXMTjLxU3CbnCXDK4VszlqD5ReeGTDqOZiz.alPbl3.Zy8lIxrwR0reITAGhs.1BgfmkA8KHCl3fk4eFURg9jvPkm2r4daCe9zhoxndF1YBIIe7kxggrgMHP8KBC9yJRrFrATFDS3SfBP83cEtT1.8XCUpZQHHDYLuI11zapsr.4b1e0Cma73UNbJ+S9UPkr4pKbNVLTOJf4ixKvrAohXiv2f1Ld.kUK1XdPUAQbRZ0x6jvB6Z1aH07ZFbvprpc4JUyvLZetQ4JfwqBe+nL5DhGByJ19al1caDpSZZOJyZ7YbW3DA3T.qDGCL.CUnPBkCbMicPkxFx8gTajNROY9h9GnJEQexmjPCBHeljVQz2LSL.lm6UC8ZvJmTFaYAVW+xLghsPUArG60Rn6jaPjZirBtYhPOp58TLHuHSHbSezVJULdCeJ9oMwAnwP5QXs1Sjm6UmOgY4omp5dTdmTu41TFGztZPboIooS1v3m+cRoXGUJ8IGW52YT+YRNBKWdJehGA04kDWeSJW2BUcHGHh91uMxTlNflDKX8JetDumpxAzTwgFvGnrXtzhrh.DENKec9ncfvY9ni.igDCIH+7SDMp8oxohHtbYmt5wqIPEiEDpkIJYgQJF8yDhu8SIRjSd5zEx0Vh0EDSnkfAND8k46j5AY37HzlPBjwRQ1RUqR4pOY2EqlO2JaWZoZVYWHwdaYAL3yqC6BKntpGxl6hB5IBIaJJrSI63tjBEC5inPa9qjM6CGuT3XnGkneWGZNx+28CaWJoEqeMMKg98rYoeS5U5u1sJg9itWon5gVTuwN3o99D71roRWNF65Qf+eP8zmEUres+V2r0xlboCV+o06yaZ84Ms972pVe9qeyNuoWlek8xDzGi+MQIm0yc2MyduMf392B0RENoqkh0h5HAwYmwEjNLc+6tIOr.NKKa6ExSVF0k63PbWHa4EO6daJpylL5JhaofNgiETQc8rW26CueW2qYPU8TBxYsXTQmwjvwMgixkWiq72ye4vJgGKnnntVHBAQE9WR76GdIwA8yoPAi7V9WWughO3Cuf8u+i9u+vmqbuUtZFkCd9xVGgEX4UUGBG.hiItBpLRndD4kTSRvEWmS6Hh20B9Xe7FdOjJpu8ch3aRbn09SiG78ew9Q0n.ZO7mfGI4jV2jTU9te5+Io9JY0VEUM02WUQYneGpxQ+GE+3XLXxemQfDv7+uJEX1e79wtX84bwhwzhPObTUpv69Pe5ik2ILXHM3jWEk4ee.efFr+.55Qj80SHeOLgLfj3LuS.489y7nhooeOM+BdmEUt02Yw8Ehen14Tg4vEiw0V.Fk44+Nfwv2zy6o0v1FJ6l.v00Z97U805bGtGJyKnrAmhEtTX8V6rIi5BIBlDv6LFzPtLwYMYpYv3JxwxHPW3XI+Ax7kPlFxwpgLMhXBYRlt7WXFr2V9tjdaeJ.lX9u5rbZmJGiLleS8HpE8EllYM0bJVcUUb6UUwcVUE2cUU7wqphe5pp3d2shx273ASD7QAaaTTN87F9EgUUav7eCTxrUkeF7bR6sA
-
RE: Group Project: Reverse Delay
@WaterSpoon Congrats on finding a solution! Very similar approach to the one I took. You can embed the RNBO patch in scriptnode as well for any further adjustments.
I know there are some new features like time stretch and core.record in scriptnode as well, which means storing buffers. I.e. once these are fully functioning things like a reverse delay should be possible.
Just fyi, buffers can communicate in RNBO and Gen~, so you just need to store a copy in both and your good to go.
-
RE: NEATBrain Writeup
@iamlamprey Fantastic work, NEATBrain sounds very promising!
-
RE: Group Project: Reverse Delay
@WaterSpoon I have been working on a reverse delay in RNBO/Gen that I am pretty happy with. Haven't finished working out the Scriptnode network yet (for tempo syncing, etc.) but once its done I would be happy to share.
-
RE: Recorder Demo - trying to compile
When I remove the SNEX object it compiles, but loading the Hardcoded FX crashes HISE.
-
RE: Recorder Demo - trying to compile
@Lindon @ulrik @Christoph-Hart Any luck with compiling the dll? I am experiencing the same error.
-
RE: Scriptnode Cloning
@HISEnberg Ah I believe it just means that the number of clones (voices) needs to be the first macro parameter in the network.