HISE Logo Forum
    • Categories
    • Register
    • Login

    What is a sensible number of samplers in a single plugin?

    Scheduled Pinned Locked Moved General Questions
    33 Posts 6 Posters 1.5k 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.
    • d.healeyD
      d.healey @Orvillain
      last edited by

      @Orvillain that's a lot of RAM. Will users only load a single instance per project?

      Libre Wave - Freedom respecting instruments and effects
      My Patreon - HISE tutorials
      YouTube Channel - Public HISE tutorials

      O 1 Reply Last reply Reply Quote 0
      • O
        Orvillain @d.healey
        last edited by

        @d-healey said in What is a sensible number of samplers in a single plugin?:

        @Orvillain that's a lot of RAM. Will users only load a single instance per project?

        Well here an empty Groove Agent SE5 is coming in around 300mb by itself. I'd like to get that number down, sure. But 500mb is way more acceptable than the 3.2gb required to do this with the HISE Sampler.

        d.healeyD 1 Reply Last reply Reply Quote 0
        • d.healeyD
          d.healey @Orvillain
          last edited by

          @Orvillain yeah 300 is pretty chunky too. Do you really need 128?

          Libre Wave - Freedom respecting instruments and effects
          My Patreon - HISE tutorials
          YouTube Channel - Public HISE tutorials

          O 1 Reply Last reply Reply Quote 0
          • O
            Orvillain @d.healey
            last edited by

            @d-healey

            16 pads x 8 layers.

            I noticed one thing though. If I put 8 file players in a single ScriptNode instance (rather than having 128 ScriptNode instances), then that seems to bring down the memory. Still doing more testing, but 128 file_player nodes, is showing the entire HISE memory footprint of 105mb. Which is a marked improvement!

            I just need to see if I can get the functionality from the HISE file_player. For instance, right now I cannot see a way to stop it from looping.

            Promising stuff though.

            O 1 Reply Last reply Reply Quote 0
            • O
              Orvillain @Orvillain
              last edited by

              @Christoph-Hart

              How can I tell a specific instance of a file_player within a ScriptNode, to load a file from an absolute path??

              More to the point - how can I iterate through properties and functions for the ScriptNode instance, from my Interface onInit method?

              Christoph HartC 1 Reply Last reply Reply Quote 0
              • Christoph HartC
                Christoph Hart @Orvillain
                last edited by

                @Orvillain it depends on the type of property. Parameter sliders need to be connected to a container meta parameter and can then be accessed through the usual HISE attribute system.

                Any complex data (table, slider packs, audio files) need to be registered as external data slot and then can be modified using the scripting API (just like you would load a file into the inbuilt loop player.

                gives about 500mb of RAM

                This is way too much but you should be able to bring this down by lowering the voice limit. If you have 128 instances, you don't need 256 voice polyphony so with 16 voices per sampler you can cut it down significantly.

                O 1 Reply Last reply Reply Quote 0
                • O
                  Orvillain @Christoph Hart
                  last edited by

                  @Christoph-Hart

                  The way I'm thinking is I somehow need to travese down this tree:
                  container.chain.softbypass_switch9.sb_container.sb1.file_player

                  And that would allow me to do something like:

                  abs_path = FileSystem.fromAbsolutePath(file_obj.fileName);
                  parsed = [this_sampler.parseSampleFile(abs_path)];
                  file_player.loadSampleMapFromJSON(parsed);
                  

                  Or whatever the call is to load a file into the file_player.
                  Sort of pseudo code, similar to what I've been doing with the SAMPLER, but hope it makes sense.

                  If I do this:

                  const var ScriptnodeSynthesiser1 = Synth.getChildSynth("Scriptnode Synthesiser1");
                  const attr_count = ScriptnodeSynthesiser1.getNumAttributes();
                  
                  
                  for (i = 0; i < attr_count; i++)
                  {
                  	var attr = ScriptnodeSynthesiser1.getAttributeId(i);
                  	Console.print(attr);
                  }
                  

                  Then I just get these printed in the Console:
                  Interface: Gain
                  Interface: Balance
                  Interface: VoiceLimit
                  Interface: KillFadeTime
                  Interface: Sample Select

                  Sample Select is a custom meta parameter. So I'd already figured that bit out. Really what I'm looking to get is an object reference to the internal nodes within the ScriptNode.

                  8296692d-1be7-44a1-a253-eb3650b5b99e-image.png

                  This is where I'm currently at. You can see Sample Select at the top. You can also see that my file_player nodes are all set to an external audio file slot.

                  If you could help me get the object reference I'm looking for, I'm pretty sure I can figure the rest out from there. Does it have anything to do with ScriptnodeSynthesiser1.ScriptParameters; ?

                  1 Reply Last reply Reply Quote 0
                  • d.healeyD
                    d.healey
                    last edited by

                    Are you using the clone container? That might reduce some of the complexity

                    Libre Wave - Freedom respecting instruments and effects
                    My Patreon - HISE tutorials
                    YouTube Channel - Public HISE tutorials

                    O 1 Reply Last reply Reply Quote 0
                    • O
                      Orvillain @d.healey
                      last edited by Orvillain

                      @d-healey Not yet. It isn't really what I'm after right now. I'm just trying to make sure I understand how to iterate through the node tree, get and set data within it, and then I'll look at optimization and stuff later.

                      I'm just trying to sus out how to achieve this before I invest too much time in it really.

                      PS: Been rinsing your HISE videos on Youtube. I'm half way through the paint routines one, and have learnt a lot! Thanks very much!

                      O 1 Reply Last reply Reply Quote 1
                      • O
                        Orvillain @Orvillain
                        last edited by Orvillain

                        @Orvillain

                        Ahhhh.. I imagine I need to use Engine.getDspNetworkReference(String processorId, String id)
                        in order to access the actual node network? I'll try that tomorrow.

                        And obviousy then, I finally check the docs 🐶

                        Link Preview Image
                        HISE | Docs

                        favicon

                        (docs.hise.audio)

                        I'll give this a thorough read tomorrow too. Looks like this is what I want.

                        O 1 Reply Last reply Reply Quote 0
                        • O
                          Orvillain @Orvillain
                          last edited by Orvillain

                          @Christoph-Hart
                          Could you let me know what I'm doing wrong here?

                          var samplepath = "D:\Samples\Drums\Hits\Reverb Drum Machines\MXR Drum Computer\Reverb MXR Drum Computer Sample Pack_Audio Files\Reverb MXR Drum Computer Sample Pack_CHH.wav";
                          
                          const var s = Synth.getAudioSampleProcessor("Scriptnode Synthesiser1");
                          const slot = s.getAudioFile(0);
                          slot.loadFile("{XYZ::SingleSample}" + samplepath);
                          

                          I do actually see a change:
                          1997ebb2-d818-4d39-9412-2c84db0465f7-image.png

                          But it hasn't actually loaded it. Just applied a label.

                          If I do this:

                          var samplepath = "D:\Samples\Drums\Hits\Reverb Drum Machines\MXR Drum Computer\Reverb MXR Drum Computer Sample Pack_Audio Files\Reverb MXR Drum Computer Sample Pack_CHH.wav";
                          
                          const var s = Synth.getAudioSampleProcessor("Scriptnode Synthesiser1");
                          const slot = s.getAudioFile(0);
                          slot.loadFile(samplepath);
                          

                          Then HISE just crashes.

                          And if I do this:

                          const var samplepath = "D:\Samples\Drums\Hits\Reverb Drum Machines\MXR Drum Computer\Reverb MXR Drum Computer Sample Pack_Audio Files\Reverb MXR Drum Computer Sample Pack_CHH.wav";
                          var abs_path = FileSystem.fromAbsolutePath(samplepath);
                          
                          var s = Synth.getAudioSampleProcessor("Scriptnode Synthesiser1");
                          const slot = s.getAudioFile(0);
                          slot.loadFile(abs_path);
                          ;
                          

                          Then I get this:
                          2f8dddfe-5019-43bf-98eb-f458d59224e4-image.png

                          Again, it doesn't load the file... but does put an object reference in the filename box.

                          O 1 Reply Last reply Reply Quote 0
                          • O
                            Orvillain @Orvillain
                            last edited by

                            Bah! Figured it out:
                            c39aab47-627f-4854-8fdf-a4c927dda560-image.png

                            You can see.. the filepath needed the backslashes escaping. I have to do this when using Python all the time, and it just occurred to me to try it in HISE too.

                            Works fine. Sample loads. I've got enough to go on now!

                            O 1 Reply Last reply Reply Quote 0
                            • O
                              Orvillain @Orvillain
                              last edited by

                              Actually @Christoph-Hart if you do see this, how can I disable looping on the file_player object?

                              O 1 Reply Last reply Reply Quote 0
                              • O
                                Orvillain @Orvillain
                                last edited by

                                @Orvillain Just a note to self, looking through the source code I suspect there might be a setUseLoop bool on the sample itself. I'll look for that tomorrow. It could also be LoopEnabled, as that is listed under special parameters for the AudioLooper class.

                                I'm sorta hoping those follow through to the file_player.

                                O 1 Reply Last reply Reply Quote 0
                                • O
                                  Orvillain @Orvillain
                                  last edited by

                                  @Orvillain said in What is a sensible number of samplers in a single plugin?:

                                  @Orvillain Just a note to self, looking through the source code I suspect there might be a setUseLoop bool on the sample itself. I'll look for that tomorrow. It could also be LoopEnabled, as that is listed under special parameters for the AudioLooper class.

                                  I'm sorta hoping those follow through to the file_player.

                                  @Christoph-Hart

                                  So I tried these in a small demo project, but it doesn't seem to work.

                                  Here's the snippet - would love it if someone could help me disable loop for the file_player node. Do I have to get the node itself perhaps???

                                  HiseSnippet 3131.3oc6ZusaaibGGGmz1zw1Ma1CMnmtRHnW3.j0PRVVxdKJZb7gFiM1QvJMnWX.AZpQ1DlhTKIkOzh9N1K6iQeCZmgjRhTQ1xV0ITK52r.aBOM7OImeCoH+T22yRDD34qou7GtoqPS+oFMtwM77cN2z1U6fc0zetQfkuc2PWuVhuOvrSWGgu1atoqYPfnklt97+Y0Zpu7BZQ+4e+mdioioqkX3rzz9nmsk3c1crCGN25u9Gscb12rk3C1cRs1Ud8AVdt63430SVUyaTTqqo0ElmINxTsZyYnou3dsrC87aDZFJBzzW3Mdstow4dW4Fu9ezNv9TGgZhRZMjMT7r22yokphUyUamyscZUu+Qefl73r9vyEyGet34FGZ2xdv7GdN4ahVPggaQ5yG5yks7lOS4UJc4ULU4MlRROUIYDWReqQinqFCWhpd9EFG3FJ7aaJOsmtTNpWms60x1aeaGUkXnqKOAG2.Zys1bF63I2L2v05XdgXee4DCZlUqVr3qJH+eu7OrRgUjWPBBKbooegFC5KD0MQDXGH7KU3OVHZx0NSDFcXDM0puX3ZWH8p+BYilpMi6T00L7bY67hc+gSNoQzbBN4jc860Q9Wu0NLYhBGZZctsq3jSdiWPPgcO96qVsnbQQ+8OZacQ40W6JyKegbGnZZySCZlzvpyAMtIHTzYs19dc19z.Omdgh5xkt5vJ3kIaXP5Conygw0zfy62mCt.GuPY6DLnMT0vppSopkrlimYqn4jd22tmqUnsmaAO2i7BEu2c0WtxeekkW4erRgQWT61icYpKp9dNxX5XWrJs4eWa3pt85bpv+UxqMN8DCVQYNKa+Ziauec5XmUberTqnm6At1guuqv81BiZIcLk+q+xA6ZFZpBCIyStdcE9g1pRPeWwkxQVhiFKarqH3hPutxwVFlaVHdgxDqWqdNlgYiwpwtRVf7bPlriJJ3FXGdS5w1dzx122R7aMpaGZc93qw4FSMJOS84nFSFQ7qL1qcagU3vBbAi8+qedF9K8tek9693PWTdKZ2+aMtkX3cbKp+488VTcu22h5SFncogCzp+JiGRJ6Nu4Voo7laKNycyseFjQyb+2k6WiMrUCVum6kBG4.QQ032IG4osYOmv9yMauuC8b85dtmqsU5NbGKB8sO6Lge5ZerGPaGFJeBngy44u9XgivLHUOxe+qem7lhl9xySho7bQo6+4h6550uwHtbKnhLE946Xqy++MisdWmhVxXuqC8MKMCd0KozJ+krzN1qWns6YGZJitWKGlWNreC48.rDxxx0U3DMz+bpmeId5hpoUEQCgaqnI9Ox+jrvRCdfb4BK0egodzmiDgW44eQT5K4eqo+j3AbZtYy2YdivuYijeQ11NNdWU2y4l9izDcjI7CT8q0ehQw0j+W7ZsiWmt1I83kmyhmr+gv1c75I26IGGu0L3Cl1Npm0nQu.4Sr058tMjqbzMOk8G0OJZ.mE22zRdB9F0CSqxUpm4SdcR3ul0fqWiolGdkK5Lu7JRcSe4uxS9aPBhO.TMe+6yFelTVscTmdh9gfyqVd74m35H4Gr50N7zn1tYvUpH9VZSn.G29Na0ceqj4hqDCUkrhQ7tWdnlY++MQ6e4CAr10skObg+crqdpQkxaVYqZEqVYqQ1iodPX4bRlR1weN0t9qU8MScD8Q0SYnZ9MiBXoW0EMhtqQxZrjQinZV1sL5u+fou7Wun1EKkdFIOPtqH5wZBxNYxYgCjGOFFAmVRaPgnl0JFCNb0l1lr7ieSt9ieSV4wuI23wuIq932j0d7axMu8lLU2b0yozeJ4sONz1MoasgZ.PsCMudvzkjSq59+Di3YscuPuNxaPz+gnSkielb+2bvPFSZrjaM9lMkeGgY8QRnO03ffOpVpkoyvjbw3ZLJZlpXiSbYpwecpZTM1Xy3AGmtJcjgbi1mekQa4MEZ10QM7d1882I229h0Ru7G1.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
                                  
                                  O 1 Reply Last reply Reply Quote 0
                                  • O
                                    Orvillain @Orvillain
                                    last edited by

                                    Content.makeFrontInterface(600, 600);
                                     
                                    const var ScriptnodeSynthesiser1 = Synth.getChildSynth("Scriptnode Synthesiser1");
                                    
                                    const var samplepath = "D:\\Samples\\Drums\\Hits\\Drum Machine\\Boss DR-660\\DR-660Kick23.wav";
                                    
                                    var abs_path = FileSystem.fromAbsolutePath(samplepath);
                                    
                                    var s = Synth.getAudioSampleProcessor("Scriptnode Synthesiser1");
                                    
                                    const slot = s.getAudioFile(0);
                                    slot.loadFile(samplepath);
                                    
                                    var the_network = Engine.getDspNetworkReference("Scriptnode Synthesiser1", "_8_Layer_Sampler");
                                    
                                    var fileplayer = the_network.get("file_player");
                                    
                                    fileplayer.LoopEnabled(false);
                                    

                                    This doesn't work either - getting the node directly.

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

                                    22

                                    Online

                                    1.7k

                                    Users

                                    11.8k

                                    Topics

                                    102.8k

                                    Posts