Populate samplemaps based on folder choice(almost working)



  • Hi all,

    Im trying to populate a samplemap list to a viewport. (the samplemaps are located in folders) and displayed based on a category(viewport) selection. I cant get this working for over a day.

    The folder structure inside the Samplemaps directory is as follows:

    Folder1 > Sub-folderA;
    Folder1 > Sub-folderB;
    
    Inside the Sub-folders the .XMLs are as follows:
    0.xml ---------------------dummy file
    samplemap1.xml
    samplemap2.xml
    zzz.xml -------------------dummy file
    

    On Init(compile) it lists the selected category samplemaps BUT if i click the other category (A, B), it does not re-list!
    Also im trying to clear the samplemap list on each IF statement (SamplemapList.set("items", ""); but its not clearing..

    Ive tried so many IFs and ELSEs! got it to populate, but then it was populating the samplemaps to infinity on each click of the category.. so i came back to this example.

    What am i overlooking??!
    Why wont it populate on category click(select)??

    Content.makeFrontInterface(600, 500);
    
    // =================== [ SamplemapList ] ================== //
    const var SamplemapList = Content.getComponent("SamplemapList");
    const var Sampler = Synth.getSampler("Sampler");
    const var sampleMapList = Sampler.getSampleMapList();
    
    //populates the Directory path
    global SMLdir_select;
    
    //SMLdir_start, SMLdir_end point to the directory
    // /0 is the first file in a directory, and /zzz is the last file
    global SMLdir_start = sampleMapList.indexOf(SMLdir_select + "/0");
    global SMLdir_end = sampleMapList.indexOf(SMLdir_select + "/zzz");
    
    global formattedSamplemaps = [];
    
        for (i = SMLdir_start+1; i < SMLdir_end; i++){
        var newName = sampleMapList[i];
        newName = newName.substring(10, 100);
        formattedSamplemaps.push(newName);
    }
    
    
    // =================== [ Category ] ================== //
    
    const var CAT = Content.getComponent("CAT");
    
    
    inline function onCATControl(component, value)
    {
        local items = component.get("items").split("\n");
    	
    	//CAT
    	if(items[value] == "A"){	    
    	    SamplemapList.set("items", "");
            SMLdir_select = "Folder1/Sub-folderA";
    	    SamplemapList.set("items", formattedSamplemaps.join("\n"));
    	    Console.print(items[value] +"- "+SMLdir_select);
        }
       
        if(items[value] == "B"){        
            SamplemapList.set("items", "");
            SMLdir_select = "Folder1/Sub-folderB";
    	    SamplemapList.set("items", formattedSamplemaps.join("\n"));
            Console.print(items[value] +"- "+SMLdir_select);
        }
    };
    Content.getComponent("CAT").setControlCallback(onCATControl);
    

    Many thanks!!



  • Do i need some sleep?
    Im sure its something stupid

    Would really appreciate if someone could pitchIn

    HiseSnippet 2752.3oc6Zs0aaiiEVJopSs25YmYv7v9xBPXLOXijFeoMYtjcvl3jzIEaRaPbZmAHaPfrLsMSkEEjnRpaQ.leR6Og4mz979xtGRQJQIeIttIEc1ccaQMIO7b93gGd34SxGEPcvggz.CyBmLxGaX9Pq1i7XC1YfMwy3Y6ZXVzpS.8pPbvFFsF4aGFh6ZXZt7OwG2rv8LDe9m+0V1t1dN3ztLLdEk3fOfLjvR68ns9aDW2mZ2EeBYnlzOYqm4P81g5Ri.rrrUcCeamWa2G+batXKYYXd+85RXzf1LaFNzv7dsncG0d.8JuX4eEIjzwEyazvnMnn3teJ0sKGw7dM1Y.ws6Qp0bnggo0Qodfki8.es0gjtjj9S8DegX.T5Lz8GlKMK30PGd0me3YpAu6ECuuzpsS.wmkNBGa+Aqm4wvA8rgs.cXEKqwR+q6asCEjvis1P6WieZ.zHYFU1nd8UQqWud0MKUrTwZ0P+33ePmhZaOz2EOz1+.RHCc1DjBUqVohvFIL7k1A4lvOhTPnOlsCcnO0CZTobFoJywPdMD.yUDVxmorK07BxMiPQuGlXSoToyTNTE0h0m5G4x2zPrAXztj.rCrONB4ayFTpXeWZGaWT6COnKI37PrKLpbhp9X1ArUURf85h7oDOFhQEJrqRgBGas5HRrg5QB.70i3hQDOjcpbqhrAcT6su8sJQcskRNFb3lFViYVyqQ75heyK5UIClQqfJWqtvWkUGb.O+Z.PU4XGmTK8nACsYLb2jcwPPcmdlPFD7AD.Ugv2Hzv7JM1DQP+EML.sWYkpuKdN78QO7U7y94w1oDtp4BkJf7aqEF0IjEP75WoADO2HNdVhg7fbM+nvAUjyjK20b.Oif+cfPj973hoF2qGEty1mL03cXLoOrTQhmKwCBFh7bXDpGBxAt8I7oEPcq3nlypfNcivUKUT5fboNfumvvC4d6D43FpRYQ2kqtVnuKAZ928DVq.72Z0BwLN1Zh5XCYH.ywa0.FhzqhXdmJrDeMhJuc4puq.2bv37+KyA00BSs0pnxkU9ZgfYha.MIRyEznV6nNOpm36aWdyaVqSZe6B3vU7hppRCf+Jj5hWyG16YYWFqT9QnxqjAOU2TfyqEvMFySZw2BV7p0i1J6VzEz51wEnr3h5EtFzwLBT4vQFPtisqaG3Z4J5QopHYsP3mSY3W3UoZw2UrPwqKhxOTudSbLoB441mzv7BFBl0Dq3EMrCNPcXQIHbyY1qlsl9Uy5UN3D6SzDj58LOB6E9XuocgsgzQBWcujDUfnLwE2ek7hab2WQvW4SCXFD3NZKKvWZHfLzvzzPpk4Xp+QqLANJknpo5AaY7xmsqMyliFsBIJN0J8Zc7K9416c7i0Jgf6Ihq06gVMVqt7iQR4dOzpdZu5U7UxZimjNR1p9JY0TaV2Tkesh.u7qvAgvtM2esw50g+6NqVNNDLMu0qEST2mrZru4g2lUigtqKGS.hsccoWIJG4RYLHuBGWtl3cJx2Tp3DxjEEhEZZUDKHBGquOpE3gNRVgWbcWpDpwXWT6ETF.xNHvdjtclYkMB8dLdH8RLJtlCTu.5vTvg7fvWc04LvNH7DpbNfhJ2Z2yOHp6Uj9kWk+8eYzaguzVqy1pN2eewWlPQU0iqiJa4atXu9rAwUTkd+v6R+5bUeklktH1RW.VJyxHwRWLMKMdQZAXeWdTdFEc5Emk+BzqS+57T9VtoI1edoeW0ttJlchQny+csB0d.0tapSaR0vkwF2b0bpHXWPwIgvUxtsDeSd0MKLqKryczcxWcOIvotDW8mDW3Mk5QVULAXO89l.5bdkmyWVHgnSjYnl.Mmec07CJsl.MSK2131Z5YAS7x9QLTDv4BxRHYYnuR4YRBWzLFHkgfsBXEALJuBtJFM.p.Ur.iixhMAbAFOuXmQZvHIeAsCOKv6tNA47iKU73IPEyV67udB.tYOgaVAajX9rxDlPYpTH4qvWGEx6gOXexkXOTH12NvFJZSSShj+97TIJpMmWN0QlHR2fgmqvOO6l+o0OayIHS7JWkCz+zFmkUW.v+YL3I7fbdXmWCjDD3KQ0vZx1M.a2cDfdbWsYxoSDtKtGjUnaEvucpNjNqptmh+YLIhStkEiU2jCHaeeNec4iV.+Fv0w8abWnlRwtg3axF73orV3LgEbfUDjyL9NQwVic7IgWiGooSHMagBnYmqcFmaTYbystylrcZGkxLYM7OVt5w+C.zcChFh3kusIp0tqhZC+a+8WEgYN2XlbwB3lSmO2Ynko0lizz5Vt5lYWKg.gx30inuV69Cn37AqhfT.qphkamseU26u+OnDCbAaNW9fl2rOnVsaZ2KzOy906oaq4b61Zp41l.GUAhKHd7OSjm5TFWmq5TDQxWc1JHGmUcgAJCyheoYdRhkjjQNvtC1UvO7yr5QgqUT7BApTJBgllsA5Vb9aeQBoOEWwwo4.jknc4UPmkAEmVnb.NyrrTc3zY7BIrQ4HNNAlUyqE+RqiHLmASwjMxZx5ysIkTEKYsWudXGVp8tm0S+kalWntp9ymnnqyfznCgTyxR6D5qfkp0s.85O2p45arX7qOJ.Kpzj7VL+YH7cM99lZVNB7BApwdR8ueib1e6gPL03.PtzNF6C2e.aQBr+3zwO93eJfF4qlclUqXa8j.3.L3wxM1K7vsGPY47D6DPCC6AqWgRCyM5QQA84N2LcdL9RbP3Xc+7ngvNtmGbmYbTzKCw7GTDw4PanLk2jSbg8pehs34EAGnDsajqcybsebt1OIW60y0dibs+1z1IzC3ATekURSjC0eDZiIkyv792oOWjO94Kx7jXJnLYaB2Urm2kPvMzSr+AJByNxko5sQNidH0i5Of5QbFKXA1662GNplEMSCkayXPzKuy00UhK1NTbbrgltO.td0NPcD48XoNKu6exJFBHdB.zmNYkq+IPV4Yg9OWdDB0l+Zot68VOzRbhFwyU+AXsioQ7B+UonrfrXwWnqmKqogrUc4SeDnNTm6.eTC0HMjOzaXjFxQLbTp.rr76w0LrLPSDxCIus0Exm5laOMDt7fiGdkF2kPbnsS.8bm3Bf3.8Ahd.I8DOz3BVGxaiZj7b04nzXHjZ6bGmLZYr4zbAlyiWf47jEXNqu.yYiEXNe6BLmualygeqx1QL5v3TDPGGsmrRz8RippmTfKDs6iCXD96qwbW7kPgGwmpJ.4zCeMi5KdCKRBBP2yw6X4MouZjC1ZTRie8zsthzkMHoieqyVCvj9CR+Yq7q1aIe9MpWQCiRcYDekpEjZ3M1tXK9ZHAWO385E3ngvKt0P384Hr4sw8zlKqkiJ8m9ycxO8kaiqeLWZB3k+xvtiw67d20czuZnOLFIK7OsK+49m1UFBHJw9sszodn58erUFRGo1ZB7MReum4HajtTxwzHcfDZFoqww3XjNjhfQZOorKR6KC0h3CkiQtHU5OoXVTxp0t0Zs64uHhUq9Xu.8Oa9dA5ftNxFV8ZR1hzOwNw8nGJm3wEnR621mwcFolOBGAuaS1t77AWi6HVTlKqygR+7PBApTrOwEjh5jpmudqDdSpt9lsz4LsP9hFyuu3Cjl0u6tjb4+m+RxEhf3mh6ySgc4GUnNG79rLWhe+ZByOKwO5II2OKy+M7Ik7W7EmR5ewCNOTTMWRRPMMj98jc5GLJ++rT+uQVplKa7e.YMvthB
    


  • Perhaps my question is....

    1. Why samplemaps(Array) wont populate on click. Only populates on INIT

    2. Why wont "SamplemapList.set("items", ""); is not emptying a viewport.

    THanks!
    @d-healey @Christoph-Hart @Lindon @-anyone?



  • @ten7kur

    Q1: becuase your code doesnt have a click event that is asking to do this

    look at these two line sand see if you cna work out where you are going wrong:

    const var SamplemapList = Content.getComponent("SamplemapList");

    SamplemapList.set("items", "");



  • just loking at this now.. Thanks for the response!!
    I dont quite understand what you mean to look at "SamplemapList"
    Could you elaborate more?
    I tried:

    CAT.setMouseCallback(function(event)
        {
        	if(event.clicked){    
        	
        for (i = SMLdir_start+1; i < SMLdir_end; i++){
        var newName = sampleMapList[i];
        newName = newName.substring(10, 100);
        formattedSamplemaps.push(newName);
    }
     Console.print("excuted"); 
        	} ;
    

    I cant compile...



  • This post is deleted!


  • wiget does no appear in API,. im at a loss..



  • @ten7kur yes, you are starting to confuse me now too... this might not be for you. 🙂



  • @ten7kur said in Populate samplemaps based on folder choice(almost working):

    setMouseCallback

    I cant manage to find any example with viewports and clickEvents.
    Can you point to an example?



  • @ten7kur viewports dont have mouse call backs - only panels do - read the documentation:

    https://docs.hise.audio/ui-components/plugin-components/index.html



  • This post is deleted!


  • So how come the SamplemapList viewport is not populating on Category viewport selection?
    Only populates on INIT.

    Im doing this in onCATControl

    if(items[value] == "A"){	    
    	    SamplemapList.set("items", "");
            SMLdir_select = "Folder1/Sub-folderA";
    	    SamplemapList.set("items", formattedSamplemaps.join("\n"));
    


  • @ten7kur Have a look at the watchtable, the samplemaps names and start/end are looking weird...



  • @ustk said in Populate samplemaps based on folder choice(almost working):

    @ten7kur Have a look at the watchtable, the samplemaps names and start/end are looking weird...

    Yea oops messed up along the way somewhere.
    This works, but still only populates on INIT.

    Im trying to send the SMLdir_select from onCATControl back through the script to show the new formatedSamplemaps.

    global SamplemapList = Content.getComponent("SamplemapList");
    
    const var Sampler = Synth.getSampler("Sampler");
    const var sampleMapList = Sampler.getSampleMapList();
    
    global SMLdir_select = "Folder1/Sub-folderA";;
    global formattedSamplemaps = [];
    
    global SMLdir_start = sampleMapList.indexOf(SMLdir_select + "/0");
    global SMLdir_end = sampleMapList.indexOf(SMLdir_select + "/zzz");
    
    
        for (i = SMLdir_start+1; i < SMLdir_end; i++){
        var newName = sampleMapList[i];
        newName = newName.substring(10, 100);
        formattedSamplemaps.push(newName);
    }
    SamplemapList.set("items", formattedSamplemaps.join("\n"));
    

    Would this solely have to be inside the onCATControl?


    I did this before. It works half way. It populates Samplemaplist based on CAT Item selected but its not clearing the SamplemapList viewport. So everytime i select a CAT Item it just adds and adds to the SampemapList.

    inline function onCATControl(component, value)
    {
        var items = component.get("items").split("\n");
    	
    	if(items[value] == "A"){
    	    SMLdir_select = "Folder1/Sub-folderA";
    	    
    	    global SMLdir_start = sampleMapList.indexOf(SMLdir_select + "/0");
                global SMLdir_end = sampleMapList.indexOf(SMLdir_select + "/zzz");
    
        
        for (i = SMLdir_start+1; i < SMLdir_end; i++){
        global newName = sampleMapList[i];
        newName = newName.substring(10, 100);
        formattedSamplemaps.push(newName);
    }
        }
        else
        if(items[value] == "B"){
    	    SMLdir_select = "Folder1/Sub-folderB";
    	    
    	    global SMLdir_start = sampleMapList.indexOf(SMLdir_select + "/0");
                global SMLdir_end = sampleMapList.indexOf(SMLdir_select + "/zzz");
    
        
        for (i = SMLdir_start+1; i < SMLdir_end; i++){
        global newName = sampleMapList[i];
        newName = newName.substring(10, 100);
        formattedSamplemaps.push(newName);
    }
        }
        //else
                
    	//SamplemapList.set("items", "");	    
    	SamplemapList.set("items", formattedSamplemaps.join("\n"));
          
    };
    Content.getComponent("CAT").setControlCallback(onCATControl);
    
    
    


  • bump.
    Anyone?

    At least the simplest of question;
    Why wont a viewport clear its items with:

    Viewport.set("items", "");
    

    ??
    Thanks



  • @ten7kur said in Populate samplemaps based on folder choice(almost working):

    bump.
    Anyone?

    At least the simplest of question;
    Why wont a viewport clear its items with:

    Viewport.set("items", "");
    

    ??
    Thanks

    I think it's a bug. i just did a simple test and you're right, it doesn't work.



  • @ten7kur possibly try to insert viewport.changed somewhere in the code to tell the component to initiate the callback and update item list. I believe I had the viewport updating not to long ago, just not in an if statement. Might not work, just trying to help🙂



  • @d-healey Apparently, you need to have at least something as a workaround,
    like Viewport.set("items", "-"); or Viewport.set("items", "Select a category");

    I think .isNotEmpty() is the cause:

    void ScriptingApi::Content::ScriptedViewport::setScriptObjectPropertyWithChangeMessage(const Identifier &id, var newValue, NotificationType notifyEditor /* = sendNotification */)
    {
    	if (id == getIdFor(Items))
    	{
    		jassert(isCorrectlyInitialised(Items));
    
    		if (newValue.toString().isNotEmpty())
    		{
    			currentItems = StringArray::fromLines(newValue.toString());
    		}
    	}
    
    	ScriptComponent::setScriptObjectPropertyWithChangeMessage(id, newValue, notifyEditor);
    }
    

    I'll try to remove it...



  • @coreyu21 said in Populate samplemaps based on folder choice(almost working):

    possibly try to insert viewport.changed somewhere in the code to tell the component to initiate the callback and update item list

    Tried it but no luck..
    I looked in the API, found "changed()" but it seems like it exists for all components Besides the Viewport..

    @ustk said in Populate samplemaps based on folder choice(almost working):

    I'll try to remove it...

    🙏 🙏



  • It works by commenting out the .isNotEmpty() condition
    @d-healey I'll make a pull request to your fork in a moment if you want this fix of course...
    The fact is that I don't know if it can involve a wrong behavior somewhere else in Hise, so, be warned if you use it!


Log in to reply
 

6
Online

647
Users

2.6k
Topics

21.4k
Posts