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. -
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 toreg
.Engine.loadAudioFilesIntoPool()
returns an array that contains the names of all of your audio files. -
Change those
vars
in toreg
.>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:
Change those
vars
in toreg
.>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
. :pNever 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
. :pNever 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.
-
-
@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 "Kickb. 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. -
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 ;)