What is the process for writing my own module (not scriptnode)
-
@Orvillain There you go:
HiseSnippet 1230.3ocuWs0aiTCE1SZmtz.qDU.uOpOkBUQIj1rcYEhjlKKAHsQaJk8sJGONIl3wdjGOsMfVo9HOxOU9G.G6YlLSXydQQvlJUkyM6OeNemicFojDZTjTgbJe0xPJx4SbGuTnm2YNlIPC5B5c6h03qnQZz4KCwQQTejiyNO2X2Y+cQ1O+02cNliEDZtJD5ZIiP+IV.SmqcTqejw48w9zqXAE79jVCHRQGIWFCXYG2ZnPLYAdF8BrwsRtnuGGMG47kt0O6oD7IjSaVmdxjl9Owu4DxYjFSwM7e5o3F1u1rQiFHm854yzR0XMVSiPN6dtze434x6DIav0rH1DN0HTGMF14D08kbeyQznE0YNi6OJKIEgfUYTdJamjT1m6Nj4yVoOO08oVCd4QTLA5TZc3syZvqdQ3Uq.71.jbJ.ocSfzAtiIJVnN2hAOer6.glplhg5TQnj3KpzCNtcjfGBc0.7BZeEHrJhJMqU6XO3eG8rxkgZUj16VrxSE38sd8DyXBZ0YT8y4xIX9KjwZlX1Pr.pfpJqGgOPm5fgiFDnJvDjUpxgqLbnIfURUUzYrH.EcsZ37I.ynxzXAQyjhJF+Np7uWde.5QRv8PESnqbX21W09a7Nz6q7zJC7s9AK7qN5YYw5IEWH0zKEUrKP4WU16eaZ5zMZyjlTRN2b31fYC2V81BrhHNXBUcLjP3wzUNB0u0IEtuYRQQNKIopUvQoXffouLjJdSLYTZo1PfRQEzxnszmuHk9zN1mI+E7szoRU.h4anzqoqNxd.J10axy1FVEVLiBGDEz965XLY0zS3mIi94AlZZFB.v..LjpzLyY2oK8VX.RBgde2tznEZYn02fPov.8s.u2uBqOzp0xbgen0cLe87UJ9yGZElksF3amKZ2Bu9uDxludGGzqK8i4X85C.LiISM.Df055LcVhHldYwwn+mMU38EhG3NhoIy2LFKsALBUq+OvX5rzG61a5TJQmCvcc6+xO.CNcS1+xokYXOMa9ZU8hf3h3.KwpOia6ScLD5z4nN+gadKenhFhUzqji33kUhvAgb5K.fer2DtjrXL62nu9bhTl24FOpPliEBJOZaFmr26cpp9auRsZhtVwfVHW37OFtplP6jhNSNnjYpRhbsrd7wTguU3ugOoFquJgAFqmYLefD5Bp9NoZgsFk9cjyiLEj8cuSgCCghv0TUjgt57H2ZUg+Ps4b4clYCrThLTlr5FI4KCmKELhQUhGY3tcfLVny.O7FiqvLtg4ONNBFd5eoXL3r8gMFl2ERe3a60GSfr5xQXy.iCbMieA5JUUkrh1lCzbZiI2l7dlbqlUL6YOIYL.fA1gavLTfnA1SxCIacx83lgr2HLZVCJelKvb9Un8oZtCaZ6Kt.uK.LBqfXfqeS5Xxj.mGxDWmL820TBPCw2uRtNHaf5icGtLOlTy6At2rIpKcJNlqKrFmZ2bnC49r6EJzjUTBYFe5SuO4PkCDqzJXX4xEtRADJbXVyhcVfQBlzUJoyePz0FqDLOC2.G4bobQ.1RM2pau9fzHEfIJ4MjjYClC2GY0.IDQJ6anQ1aC2dG.OX8FBY8k50B7q21.arsAdx1F3oaafM21.ex1F3Yu6.M+dh1wZYPxDNDZ3ndVRniSOg4wx1KmP+Cf1ouMo
-
@Christoph-Hart Right! That is really cool! I'll dig into this when I get some chance and see how I can leverage this kind of system for my thing.
-
@Christoph-Hart I think this is going to be amazing. Been looking at the snippet, and it mostly makes sense. Being able to throw data from a custom node to the UI is exactly what I want to do.
So ultimately, consider the title of this thread to be null and void - custom node is where it is at! I've just got to port my HISEscript over to c++ and start properly learning scriptnode.
-
Thanks, I'm already making use of the new Global Cable feature!
It works great.Here we are sending the drawing straight from Hise into a c++ node for playback!
-
@griffinboy woah thats sick.
-
Noice. Are you doing any kind of band limiting with the drawings to reduce aliasing?
-
@griffinboy Coool!!! I've done this a while back using a hidden sliderpack with 1024 sliders with a drawing method and a SNEX node if I reckon well. It was working but wasn't very effective and aliasing was awful. Yours seems to be very responsive!
-
@griffinboy yes - very impressive - so you are going to use this to build a poly synth?
-
no that's next. I'm either going to use the Vital or Serum method. Serum's is simpler so I might go with that. Precomputed mip maps using fir filters. Easier to program but it will use a lot of memory... Maybe I'll end up switching later down the line to a realtime FFT based mip map method like vital!
There is clear aliasing in the video - but it's not 'awful' that's probably because I am processing the drawing in real time using a buffer. I've got interpolation between a few different points using splines. I'm probably going to expose smoothing as a parameter for the user. This wasn't done to affect the sound of the waveform, I am just ocd about drawing shaky lines
-
@griffinboy
This looks great! :-)
Do you have any kind of hint how to realize this? -
@griffinboy Nice!
-
@griffinboy said in What is the process for writing my own module (not scriptnode):
Precomputed mip maps using fir filters. Easier to program but it will use a lot of memory...
Yup, that's what I'm doing with the wavetable synthesiser module too. Sounds good enough for me.
-
That's good to know.
Doesn't it use a lot of memory? You'd have to store maps for each wavetable frame right, for various octaves?
Did you find a way around this or is that just the cost of precomputation?Vital gets around the memory issue by creating mip maps in real time. You probably already know, but it stores waveforms in the freq domain, silencing aliasing bins, and then inverse fft. Super nice, but the optimization sounds far more challenging since now the burden is on the cpu for efficient realtime fft.
-
This is potentially for a commercial project,
However if my the client says it's okay, I'll share how to do this.It's about time for a new c++ node tutorial I think...
-
@griffinboy
I'm keeping my fingers crossed for the project! :-)
But yes - a new C++ tutorial would be great! :-) -
Doesn't it use a lot of memory?
Less than samples lol. Something like 50-100MB per wavetable is completely neglible considering the fact that people are raw-dogging their uncompressed filmstrips into the system memory without hesitation.
-
Good point
-
I think a third party node collection (like we did with LAF), would be very useful.
-
I've been wanting to.
But the interface for 3rd party nodes is still a bit shaky.
For instance I share things on the forum, but there is setup required for each of the nodes, and these are simple nodes.If we could get a Hise feature that could allow the safe importing of nodes into a project that would be neat. At the moment you can break nodes if you drag them into a project and try to compile them, you need to actually go through the process of using the create c++ode feature, and then compile (in order that hise creates all the correct files behind the scenes) and then you replace the node code with the external node...
Also any nodes (such as my recent one here) that uses global cables, will only work in the project where the cables exist exactly the same way, because the c++ code inside the node n references the hise cables directly. We don't have agnostic input output ports for data in the nodes, excepting external data.
Maybe if we could pass data through external data that would provide a more general interface... I don't know.
But as it stands it's kind of difficult to share nodes because of these things. Although a collection of examples would probably be useful nonetheless.
-
At the moment you can break nodes if you drag them into a project and try to compile them, you need to actually go through the process of using the create c++ode feature, and then compile (in order that hise creates all the correct files behind the scenes) and then you replace the node code with the external node...
The only thing that is needed is the
node_properties.json
file in the Third party node folder - if you copy that file (or manually merge the JSON objects) you can just paste in the files.Also any nodes (such as my recent one here) that uses global cables, will only work in the project where the cables exist exactly the same way,
The global cables are identified through their hashed ID (that's what that boilerplate code generator is doing) so if you use the same cable names they will work across projects.