HISE Logo Forum
    • Categories
    • Register
    • Login

    Generative Wavetable OSC?

    Scheduled Pinned Locked Moved General Questions
    14 Posts 6 Posters 258 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • StraticahS
      Straticah @HISEnberg
      last edited by Straticah

      @HISEnberg oh no! so no way i could do it utilizing SNEX, RNBO, FAUST? I guess if i use snex i need to go c++ anyways

      I will start checking SNEX synth examples :)

      building user interfaces in HISE :)
      web: www.vst-design.com

      1 Reply Last reply Reply Quote 0
      • StraticahS
        Straticah @HISEnberg
        last edited by

        @HISEnberg i am already running into issues with snex osc - seems it does not support variable-length arrays, not even fixed-size arrays?

        building user interfaces in HISE :)
        web: www.vst-design.com

        HISEnbergH 1 Reply Last reply Reply Quote 0
        • HISEnbergH
          HISEnberg @Straticah
          last edited by

          @Straticah I think it should but I really know little to nothing about SNEX..

          With RNBO you can import buffers and possibly use a sliderpack or table to edit them, so this seems like the lowest resistance option for you.

          1 Reply Last reply Reply Quote 0
          • griffinboyG
            griffinboy @HISEnberg
            last edited by

            @HISEnberg
            @Straticah

            Honestly one of the hard things here is how to get the 'drawn' information into the node. Christoph is working on new ways to communicate complex info into custom nodes but it's not here yet.

            C++ is probably the way to go though. Especially since you'll need to implement algorithms to interpret that shape into something that doesn't generate a ton of aliasing. You'll need antialias, which will end up being a bigger more complex script. C++ will allow you to organise better using headers and external libraries.

            Not that you can't do it in snex. But it's probably worth doing it in c++ for the workflow more than anything else. And for the fact that there are lots of C++ libraries and github repositories for this kind of thing that you can use as reference or straight up plug in.

            1 Reply Last reply Reply Quote 2
            • A
              aaronventure
              last edited by aaronventure

              I think you should be able to use a panel for the UI to allow drawing (storing event.y data for each event.x) and use that to fill a table. Then just plug a looping ramp into the table in ScriptNode and there's your drawn oscillator.

              As a bonus, you can apply smoothing to the signal, but you'll have to do it in a modchain because the direct signal smoother node only works on one channel, until it gets fixed.

              StraticahS 1 Reply Last reply Reply Quote 2
              • D
                dianasv25
                last edited by

                You want a wavetable oscillator where:

                Hand-Drawn Wavetables: Users can draw a waveform (e.g., via a UI element) to define a single-cycle waveform.
                Random Generation: A function generates a random single-cycle waveform.
                HISE Integration: The oscillator works within HISE, leveraging its synthesis and modulation capabilities.
                HISE already has a built-in WavetableSynth module, but it relies on pre-converted .hwt files and doesn’t natively support real-time drawing or random generation in its UI. You’ll need to create a custom oscillator and possibly extend the UI to meet your needs.

                HISE supports multiple DSP development paths:

                SNEX: A C++-like scripting language native to HISE for real-time DSP, integrated with its scriptnode system.
                RNBO: A Max/MSP-based code export tool from Cycling ’74, which generates C++ code deployable in HISE.
                FAUST: A functional programming language for signal processing, which compiles to C++ and can be integrated into HISE.

                StraticahS 1 Reply Last reply Reply Quote 0
                • StraticahS
                  Straticah @dianasv25
                  last edited by

                  @dianasv25 this ai?

                  building user interfaces in HISE :)
                  web: www.vst-design.com

                  1 Reply Last reply Reply Quote 2
                  • StraticahS
                    Straticah @aaronventure
                    last edited by Straticah

                    @aaronventure thanks will check!

                    @griffinboy what does something like this cost freelance properly setup?

                    I will probably go another route and combine some basic shapes into a wavetable and not generate the table from scratch.

                    building user interfaces in HISE :)
                    web: www.vst-design.com

                    griffinboyG 1 Reply Last reply Reply Quote 0
                    • griffinboyG
                      griffinboy @Straticah
                      last edited by griffinboy

                      @Straticah

                      Cost? I wouldn't be sure! Personally I'd be able to do it myself fairly easily. The hard part is interfacing with the rest of Hise. I've never done that kind of data communication before to an external node. Like @aaronventure said, using a table would probably be the way, for c++ you can communicate table data to c++ nodes from Hise.

                      If I were to guess, the whole thing would probably take a few days to a week maximum. But I don't know how much that would cost freelance.

                      edit* I was wrong, Christoph has implemented communication to c++ nodes for different data types now. So communication shouldn't be an issue

                      1 Reply Last reply Reply Quote 1
                      • A
                        Allen
                        last edited by

                        RNBO is also a nice way to go.

                        I think you mean wave terrain synthesis for the "random" generated wavetable. It usually implemented by reading the data in a certain area of a dynamic 2d matrix(like a glsl), scale the data size into one cycle length of the wavetable and play it back.

                        There's a book called "generating sound & organizing time" which has nice examples of wavetable and wave terrain oscillators made in gen~, which can be your start point.

                        for the drawing case, I think you just need to add a multislider with the size of one cycle and write the data in multislider into the wavetable buffer with an offset of "cycle length * cycle index"

                        HISEnbergH 1 Reply Last reply Reply Quote 2
                        • HISEnbergH
                          HISEnberg @Allen
                          last edited by

                          @Allen oh true, the GOT book is a really good recommendation for navigating wavetables in max, and you can bring a lot of this into RNBO and Hise

                          1 Reply Last reply Reply Quote 0
                          • A
                            aaronventure
                            last edited by

                            Nice little practice....

                            086de2fa-536d-4bd3-9eae-774dc04206b9-image.png

                            HiseSnippet 4354.3oc0aszbiakcFTpQaKY2YFWyLUkkHJUMCUfLMAeAfxSmVuaIqWrEYqGcWc0CHvkjnEH.Z.PIQE6UYyrKqSVkE4GP1lc9OvrZ9Ujc9ePx4buW.BHBvtGEaWYnKKyyEm64dNemuy4BPbc6.OSRXnWfPok6NwmHT5yE6LwMZ3VCMrcE1eagR+MhGYDFQBjXCs4DeivPhkPoRK9bbfRK8HA5me3YaZ3X3ZRlNjfvYd1ljCsGYGMcz1qefsiytFVjt1iRoci022zycKOGuwf+rnXUAeCyqLFPN1.UaAQg8LBGJT5ePrkUeiVVpMqpPpqYoVSQsodC0VUq12RSQsmZu5FVFsTqJT5w6XYG4EzIxHhDJT5Qa5YMoyPuabYKvY1g18bHnfhPGXkYCuqmiEFh3nBaMz1wpcLPEJ.Vo8TXaQFr8qEOx1xNY7ov2ujdAooyHM.VZgrt2hYbOkztW0TtWNtToTtjHyk9BwNlA19QSuB5Oel39tP1ruAjmR6JGOdTWCXs.uPrzBP1fMYgE15Iha4ASwMpxHiqH6F.BIlnLf4qIA+Y0ud4k+puRhMIWOKhD0ZKCIzvHoqMB3WZ2KTjdpDkhUY.IhpThCVdElRRfVqvs3S+K7yOayIUnEAgTLFYXYQCpxqDsxZR.3fPSTkPRT4Utw1JZ3Jw3EevgD6ACQcqyPQlYiParsQjAX5cbGX6RpXFP.VxFtVmRFXiUjci0orBGrNz18JongD1zkrcoBubeoHO52rPC506cDyHX4CH8Ai3QsPx5kukXyI1LgSyxrKW9lg1lCkrCkfPB0hbK3etFNRgNdQqtbh0q3.1sqW4DxPBInb0U++8YbjfCw2XeJJ3a3Rbj5aGDFgWo6PH7uAZrI0iHMFppjLjfbYTfGfBioUKvULMfKQm9HO7alFNN8ftbRCrulHMwarT+wfIhmngqEfkDywQ1dtR88BjHF.PylK4ZfvkhF5mkF1F8uxq3OkF5mGMzOWZHeTv67tYKtOFBWckM.ua5.S0Lz3Zx9tsCHfDnWTvXxpesDfK2PjtwvkxJv9GHV.7owALxHfY9jfPjOCwBhi1t1Q1FN12wfIif.iIzHODZTZ6N.r10LlLrz3+oBcfmJ8527.4OrP3HDSiirx8G6ZhXdYJHu5x+SKuDXZH57bX4hujR0AzA1YD8tQdPXMHvvcriQfczjkWBSIvD.Oq0WyjtA9dDPSPR+4XRn7p7qLL0U1ilInWhtnGkfZ2P9cveM8tlPAhDRHUsKAtiogqjkmjcjTuIRCMtNVKSuQ9dtPfHYzG2JOovdModiinqrzfwFf2GQ.O1NhZw8A0cB8Pq55EgzZFUDn1..f4o0jfKeCljXLYb8fEGtJ.aASxvSWhFe.n8pCgA.h4FN2XLI7D2td9qjDrmGyVh6VAzFXgmxQXqHhCi8AEhiPFYxcJl76BA5FLvYFNiITtCbiDqIwZTQKS41DDhFJkl9F6H9XkHDN1t79dwjBvLdAWQAA.Bfq3B5FQgcf6vy0LRYbRk5F7bpceoxkif8n85WFUaUo+tmJsBqE6JRe62RmaEGh6.vw98R0hG50UeyzQquJNb4zp9O9TP9qPJmrTsUWc0kWZo3RiWWk0DnRy2rlzqUVSRgI7lXb+DWISGayqVSB7NVZKMZJATiADtqSymUtEWupR+1eqTr7u+oR2rJN.WiI2SiInFCSqgEjTvvfIQc.hE53P4F5UPuMfGEwcHdNFRFU+REdv85iLf6jvjX6D6VH.r5avfN1ufdPqIUd3Wx8hUgAFxBeH5gvOIesqsCTc.zaVyjkVBKrKaiHAMOAifNFEErC2lzG1V1prMEoYWYozloh+3vgvkQKsz2sL6eYAFxGS2eitEPBO6Zjr.JFWwvHOoMMZyuim5vBOoJlCwLjEcK5.6AC3U4w6ujg4Sqpi0xXbj2HnPB0bBu+.u7lKAeAvTziwVCgr7P+.uQYJKYUXTOJJYqPXJichhoRw0OP28HHlIXwqefGXEXkueuEIdGCdfg0Ne2C8NDVlUPS6XPRcaMCArDVLHBLf0sed6KiHEFNXq0b5.hMZ2a+N6.xv96oQpjtREgT1tP+xofBXA+sXa6WNoe8ZLt.e+G3xv9OjJ9P6+nxQA3MfytNqwxzayJL9Vq8.MCg6YezFHOiqMfj.PFeqBP2oshWO71EVEmM2SR1Obpys5+m1ksMzSN5TOXOTWxzMYGPCP7tEbHXGKJhSF4CrDJ9av1P.1d0GXwR3FfNPUikcnguOwHHjQMRAkG6EQNwsL0tK+cKKc+K0uetWiGiNjfbuL97pAyahkcGOpGIHcZCUDdjwrOnmXwOnW5mC0jkhRonm69.q6DehaQOcp.OuBOT3BbuBV9H5iD9D9iDR4FB1zmvMRf5qoencj1Jrv4OVTolRsJzOuaug6c6VvWt9juom1dp0qX9ppL48Gt2PU0610kKiJn9tMO+DElraGiJZuS8fy3xAui7BM3O2vkir5dg10mpuSso1SCsOW1+n1izTiZEwkCd9NQZ8ONbi5I16Fs9u+46vkspYVSCWetLoa8lz0u9T+Q2UohIW9lp1ap6BKRrL3J53hvkA2YO8fMZdGWt0KFbf90Wrub8D+4X8qAizfICtJHCFgKqcvYmpem2Qsikcu9k52Yu44MlF+50a9hAMR72Woq9hAumKOBbUcv8ukKC+oudkcOnAWt8HEPF9zLIdFpCv2VbYOv2zw7GWdv6e9U5u6J0C3xNpG3ni3EW9zAuej91fWwkO61wt5aePiyi0+RGO88.TrYBd7d8C6o4xksuR885A999Mmlun3GWFVpw5W2JpEW9hf2kQFRs2n2d6WrcKl7QSNbh9ciuXet7NQV2o20n+wb4FmGbmdaHp3xa17NEJ9xkad2t00u.XksR7+FT7lKuED45P5bXqD+ukNxmaMkOq2C7JtLrz55P3dcqj3QVu2q15tVI7kJx8.RHWVemC1PtBZU97q2bCYHoUQkIWqh4lxHeVMId2RFyepI4usjQ9sZR7usbEHpTSxm6HiwuZB+ZGYDu3xux4xcku6vIGxkUr274xX9VMIe+bYHb6nlvG2SFqWTmVuK6doykpI0a6Ki0OpI322HuG1DHg+9MxW.nr5z5EYDO4xf5GJeHj03xP5EjAVFW9ku7kGIi7c0o0WxH+gKu2NQGKeH.fpI3+IxWa0stZR8QaYr9fKCop1xH+RMIe7B41XSpj7wKjw5Gsj5mSkw5YtbG8c5Pwesj7QGYrdRKIezUtKXUsj50WRwat7V24AxP8uVR93LYnm0oZI4iyk6BQsVR93b4Ktc7EZS6OHi0aZIwyET7WKgOeoLxe0RhmKkqedv63xWQt4Ux8.uPKIeXHi7Ysj7QOJ9qkjO.Y3uZI7eSJdqkjOrn3oVR9vhhmZI8qIxX+Qso8qn3qNSlsCEcaoEytsD8WrfusjOeaoE9Odh32z4jigGgoB8IXppzJyG0jGqAuFUil0y7oQFMxY1UalcvVomPcpFpUy7QIiFJ4XR0r9P8zSng1rWqp1bBqlMopnOG2rUNSWoZwlTMGaonTr95TEpMGExyfoCakpZyD0JoyMJJMYiU3hj25qzrPfVoNyfsJViF43SYVwl4oPwNHykzJVAMpB5YFZV2SQuXWVeViWqZgpWiRUqklvVqFcnZoGhNkZYlX8Yi7Z0KLvpQg5ZMJ1QZlie2LsB7gJdInXWshqSpQg0ZpE6C54DSZoTnNCszyLj1LMSpoWnOTmES0KNivLw8FZVsqWbCj5zhq5ES7qS8n5E2tntpxLWZdpqMKtcO5Q5BYV.VLEtAEkaTcNJnLC9VOcRoQsYcnFoIzMpOaVqQlkfllZjwsaxGq3.qUNKawogFTpUiVyQgbrWZ1TCclKUbGml4zUMu8WhUWIG0KNS0jITcNJLq8ZV71NLDtoRw1qUN6ylNw1jYtZExUaxpmyXTF0odgyg88zMiZwV4VEtqeKlSUbhoEyCJdqfVTlUF2HmciZULVwBgVE2mfsbsxDWZrgJFJzzy7gpdwcTYqfVglSs5r0gsJt6oJEUUKl.oRWbUkBKQUoBpooLpMYCU7bnd7btiM0bp6UyXAJrplFoUoPmZFvHmseTSGcZJyx2TKtXVigV5yQgYQ+za2okSWRshwVMZ7oULPpQiVshu8aMZzpU7c3oQcOslyQAlSTbSUJtqUbcmdUlEJF1zyoIodw0g5LEJtkjd8YqozKtaDqmudZxjN855sJDX0oQndwbEcJvpqmYnbByhqM0mAvTpvemRuQP3k6i+vy3IQg+6O1l9C6GYi+bmk1lbssIgctTVRbaR3UQd9zefR9O7rPoOYd+Dk2hmJE7mlbR7WnuDavXO9hEX+nkrWfMNxZkXiP+4v220hPmMcvTq2mNum87AsdYeY4Bk9EhYdY4BoeGiIdTpysyiX3yuT7HOqwNFQYOFQ3gsheAaurmCK7333FZGMI8gw5GsyVzGqK9EhssiLGluOtPN9H9KT+SfOxOQVOQbm98IlQScvGIt6E+7c7qVVL9PtPW7OWb5Yap3CdUooG7pR+QwoufA+.huQ.oqWaGiIkCMF46PNEb50j543YdUG66Hy9VI7Y9zlnFkwWiFvvCeHu7hG+QCSJyOKwdwOCNxHJvFKwfXui23.SxVbuK9vmwkqFW80g3ZQE9efO7Kpj.XvEUhu3zW+gvwjH78zSyO7uCsYXIC1QX5s8uUQXCZYKzXvlSagjBcr1dNS7G54ZahCwzH1S2Xj2X2nX2cOivtF1NHOuy3PeveNwsCnL8vPVZwyvW9GZ3OQrZE3e.d+wdVvkd7tFl.vNosA1a4KDw22CvVIA3a8jyZy3qYHNzSEYlKiVM97SJF2vaDsc2BhPVIUOYFmEkfJxEXKz9gmgW0zvQ3L16DBhNzlLHj4xryDZ+.X0u8sT1mPln3uMUTjQqY886YleJ89ES48KKNxyhAvY77ecJOOQiY85TS+mAO9SXGZS9IgfDj0k+Uh7SJVkoJLqGmd5ywk+LwcCHueLvZmjbBXgljyOJdLtU.I1+WhZhZGAZNceftFACHQg76MvkXxpxn0.6agl.XA9BsMPx.3i3XetXaRfsmE8DBO8RLOHVBPmircOK6qurw5GYba1w9i+406DQ7wtj3X+a+q3m+qm04JxMLzDG8O8s+2p+yi9SOCCpOQjYfDyvtimtquMouwXmnyt+aLUHE8hGNYxSXFHfTgdgYyO7Y7AXSOJcd3u.38Ihl39Kukd6PYQ433jdeQNjaiuEtssC8gMZ1bLrCJCyyLBl5iusJrm6Nv1FV.cgN839vYxYKlJm8o2Km8ui4hYxYq+ujImEqW1bV785vJmRwXtWB5xBRbWt9FrS+B6dTDlOyB.866kvZeOuj9oXu7yDOzyyG1IMHRXFyWH65md+5wv8WFMCt8COKeW5GdVZBeVBVFd+uYZ+oTpLaEPVSLmBAMw7NgwRkU9xdF3YtEOQOvyjHwjrc4mU4Ue3kOhhFVVebkM76iK9aoKSvf3CWlTZNkI+Hknmo01Gh7UPERX1ldLTJStG1mDOad33ylvY5+A53sPlT1ekgTY1QXvL2rAeGgA4eOF7Y7vwmEmeKiK+9YwG.K9XZ398C9O+MqG2x.7wTVYc898+6+9e75h8wtGve3Ws8el2csyHOungvyXHLysEjue0Xcge5gpOW7TR7437gz1+9oWgM87tZjA8YadP+xK+r7jXiLLC7dKeC.jT9ozQ.xoKkjuj3Qnrjxrm.sQ1V1u0zLqolYh0dnSr9CchMdnSr4CchsdnST8gNQsO7Dw+WZi2sC2rDJcauCaWsR63ha8QakI7+BtlhzHC
                            

                            Tweak the res variable for input resolution. Basically it's "step size" in pixels.

                            You can put a smoother in the chain in ScriptNode to get some smoothing - probably a good idea, but you'll need to dynamically change the smoothing time to compensate for frequency changes, so use the core.smoother node until the cable one gets fixed.

                            Also, you could do some math for setting the Curve value of each point, so that the previous point's Curve is set based on the the current Y vs previous Y.

                            4290af26-195a-45ce-8393-ac9acb987752-image.png

                            If you want to allow the user to change the curve for each point manually, that can also be done with the mouse callback of the panel.

                            Then simply decide how you want to set the frequency:

                            • from script: create a parameter in the network and set it for each note on
                            • automatically/polyphonically: use this in a scriptnode synthesiser

                            If you're changing networks, you'll need to make sure the network reference is correct and that you set the cable_table node to an external slot using the little icon next to the table display in scriptnode.

                            1 Reply Last reply Reply Quote 3
                            • First post
                              Last post

                            17

                            Online

                            1.7k

                            Users

                            11.8k

                            Topics

                            102.5k

                            Posts