AudioLoopPlayer load



  • I have 9 folders with 40-50 samples each - all named differently.

    how do I get them into an array? and then I can load them into the AudioLoopPlayer - without having to make 500 array entries.



  • You could use the file API - https://docs.hise.audio/scripting/scripting-api/filesystem/index.html#findfiles

    I actually think we are missing a function. For expansions we have getAudioFileList() but we don't have it for non-expansion projects.



  • Oh actually, Engine.loadAudioFilesIntoPool(), returns a list as well so we don't need a new function.



  • @d-healey

    This is my entry call.
    The samples are already all in the pool.

    But I still have to load them into the player.
    At the moment I do it like this - it works.
    Disadvantage. The number of samples in each folder (bass, kick, snare, etc.) must be the same.
    The samples are predefined with names in the array.

    But in the end I have a different number of samples with different names in the folders.

    Engine.loadAudioFilesIntoPool();
    var InstrumentID_S1;
    var VariationID_S1;
    const var Instrument_S1 = ["Bass", "Kick", "Snare", "HiHat", "Tom", "Cymbal", "Crash" ];
    const var Sample_S1 = ["sample1.wav","sample2.wav","sample3.wav","sample4.wav","sample5.wav","sample6.wav","sample7.wav", "sample8.wav", "sample9.wav", "sample10.wav", "sample11.wav", "sample12.wav", "sample13.wav", "sample14.wav", "sample15.wav", "sample16.wav", "sample17.wav", "sample18.wav", "sample19.wav", "sample20.wav", "sample21.wav", "sample22.wav", "sample23.wav", "sample24.wav", "sample25.wav", "sample26.wav", "sample27.wav", "sample28.wav", "sample29.wav", "sample30.wav", "sample31.wav", "sample32.wav", "sample33.wav", "sample34.wav", "sample35.wav", "sample36.wav", "sample37.wav", "sample38.wav", "sample39.wav", "sample40.wav", "sample41.wav", "sample42.wav", "sample43.wav", "sample44.wav", "sample45.wav", "sample46.wav", "sample47.wav", "sample48.wav"];
    //End ------------------
    
    
    //Start Knob-KitSelector----------------------------------------------------------------------------------------------------------------------
    inline function onKitSelector_Knob_S1Control(component, value){
    	InstrumentID_S1 = parseInt(value);	
    	Console.print("Instrument_S1" + "{PROJECT_FOLDER}"+Instrument_S1[InstrumentID_S1]+"/"+Sample_S1[VariationID_S1]);
    	Synth.getAudioSampleProcessor("Audio Loop Player_S1").setFile("{PROJECT_FOLDER}"+Instrument_S1[InstrumentID_S1]+"/"+Sample_S1[VariationID_S1]); 
    	knb_Root_S1.setValue(AudioLoopPlayer_S1.getAttribute(AudioLoopPlayer_S1.RootNote));
    	knb_Root_S1.changed();  
    	
    
    };
    


  • @MikeB Change those vars in to reg.

    Engine.loadAudioFilesIntoPool() returns an array that contains the names of all of your audio files.



  • @d-healey

    Change those vars in to reg.>

    I change WAS in vars reg?????

    Engine.loadAudioFilesIntoPool() returns an array that contains the names of all of your audio files.

    A little bit more info Dave - you know I'm not on your level 🙂



  • @MikeB said in AudioLoopPlayer load:

    @d-healey

    Change those vars in to reg.>

    I change WAS in vars reg?????

    Engine.loadAudioFilesIntoPool() returns an array that contains the names of all of your audio files.

    A little bit more info Dave - you know I'm not on your level 🙂

    Do a little exploration work:

    var myList = Engine.loadAudioFilesIntoPool();
    Console.print(trace(myList));
    
    


  • @Lindon You're just pranking me now with that var. 😛

    Never use var unless you absolutely have to - paint routines, mouse callbacks, etc. Everywhere else either use const or reg, and if you're in an inline function or callback use local. var should always be your last choice.



  • @d-healey said in AudioLoopPlayer load:

    @Lindon You're just pranking me now with that var. 😛

    Never use var unless you absolutely have to - paint routines, mouse callbacks, etc. Everywhere else either use const or reg, and if you're in an inline function or callback use local. var should always be your last choice.

    --sorry it was just too easy

    var AnnoyingDave = true;
    

    Actually tho there is a limit to the number of reg variables you can use I think...



  • @Lindon The limit is per namespace. So it's unlikely you'll hit that limit is most instances, if you do, then use var. In our current situation - loadAudioFilesIntoPool - it would make most sense to use a const.



  • Ok you two Jedi Knights 🙂
    So now I have an array with 500 files.

    As you can see there are folders - different folders Kick, Snare, etc.
    In each folder there are samples with different long names (not like here in the excerpt).
    I would like to select the folder (InstrumentID) via one knob and a sample (VariantionID) from this folder via another knob.

     "{PROJECT_FOLDER}Kick/sample1.wav",
      "{PROJECT_FOLDER}Kick/sample10.wav",
      "{PROJECT_FOLDER}Kick/sample11.wav",
      "{PROJECT_FOLDER}Kick/sample12.wav",
      "{PROJECT_FOLDER}Kick/sample13.wav",
      "{PROJECT_FOLDER}Kick/sample14.wav",
      "{PROJECT_FOLDER}Kick/sample15.wav",
      "{PROJECT_FOLDER}Kick/sample16.wav",
      "{PROJECT_FOLDER}Kick/sample17.wav",
      "{PROJECT_FOLDER}Kick/sample18.wav",
      "{PROJECT_FOLDER}Kick/sample19.wav",
    


  • @MikeB Everything you need is here - https://docs.hise.audio/scripting/scripting-api/string/index.html 🙂 time to have a problem.



  • @d-healey Unfortunately this is of no use to me David - but thanks for your support.



  • @MikeB

    Unfortunately this is of no use to me

    Tell me more...



  • @d-healey
    As I said - this is my starting point
    I have two knobs - one calls up the folder (InstrumentID).
    the other calls the sample (VariationID)

    So at the moment it's like this via the knobs:
    a. The folder is selected for example "Kick

    b. the sample is selected "sample3.wav".

    and this is then loaded into the LoopPlayer.

    reg myList = Engine.loadAudioFilesIntoPool();
    Console.print(trace(myList));
    
    var InstrumentID_S1;
    var VariationID_S1;
    const var Instrument_S1 = ["Bass", "Kick", "Snare", "HiHat", "Tom", "Cymbal", "Crash", "Perc", "Electro", "FX" ];
    const var Sample_S1 = ["sample1.wav","sample2.wav","sample3.wav","sample4.wav","sample5.wav","sample6.wav","sample7.wav"];
    
    
    
    //Start Knob-KitSelector----------------------------------------------------------------------------------------------------------------------
    inline function onKitSelector_Knob_S1Control(component, value){
    	InstrumentID_S1 = parseInt(value);	
    	Synth.getAudioSampleProcessor("Audio Loop Player_S1").setFile("{PROJECT_FOLDER}"+Instrument_S1[InstrumentID_S1]+"/"+Sample_S1[VariationID_S1]); 
    };
    Content.getComponent("KitSelector_Knob_S1").setControlCallback(onKitSelector_Knob_S1Control);
    //End --------------------------------------------------------------------------------------------------------------------------------------
    
    //Start Knob-SampleSelector----------------------------------------------------------------------------------------------------------------------
    inline function onSampleSelector_Knob_S1Control(component, value){
    	VariationID_S1 = parseInt(value-1);		
       Synth.getAudioSampleProcessor("Audio Loop Player_S1").setFile("{PROJECT_FOLDER}"+Instrument_S1[InstrumentID_S1]+"/"+Sample_S1[VariationID_S1]);   	
    };
    Content.getComponent("SampleSelector_Knob_S1").setControlCallback(onSampleSelector_Knob_S1Control);
    //End --------------------------------------------------------------------------------------------------------------------------------------    
    
    
    


  • Get the list of audio files with Engine.loadAudioFilesIntoPool. Then you can use a loop and the string functions to automatically split that list into two arrays, one for the folders and one for the samples.



  • @d-healey Thanks David - that's what I meant - if I could do that I wouldn't ask here.



  • @MikeB Which part are you stuck at?



  • @d-healey Folders and samples have names of different lengths. How can I separate them with string?
    Besides, the user should not get a hi-hat sound if he has selected kick.
    But only the samples from the Kick folder.



  • @MikeB

    If you have a string like const s = "{PROJECT_FOLDER}Kick/sample12.wav"

    You can get the folder with const ss = s.substring(s.indexOf("}") + 1, s.indexOf("/"));

    Ready for an hour of trial and error 😉


Log in to reply
 

17
Online

1.5k
Users

4.6k
Topics

42.1k
Posts