Viewport
-
Im also still interested in how to view / sort the samplemaps into folders as talked about in this thread.
-
@Dalart @dustbro the "Registers & Chords" is a viewport
I populated it using array
this arrayconst var ArtList = ["Stradella", "Freebass", "Tenor (Bass)", "Master (Bass)", "Alto (Bass)", "Low Shift (Bass)", "Master Shift (Bass)", "High Shift (Bass)", "Bassoon (Treble)", "Bandoneon (Treble)", "Master (Treble)", "Violin (Treble)", "Clarinet (Treble)", "Major (Chord)", "Minor (Chord)", "Seventh (Chord)", "Diminished (Chord)"];
and making the array readable in the VP
inline function onArtVpControl(component, value) { ArtVp.set("items", ArtVpList.join("\n")); uaccVp.setValue(uaccUserList[value]-1); };
and accessing the value from another array called uaccUserList and sending it to the "uaccVp" which is an ComboBox
So the "ArtVp" is the ViewPort now populated with the array "ArtVpList" and clicking on any of the items in the ArtVp will get you a value, the same value as the index of the array, if I remember right, maybe the value starts with 1 (and the first index in an array is 0)
-
@ulrik How do you populate it with the contents of a folder?
-
@dustbro if you mean without having the folder content already in an array? I don't know. :(
-
@ulrik I found this line in "ScriptingApi.h" from the source code
/** Returns a list of the sounds selected in the samplemap. */ var createListFromGUISelection();
and
/** Returns an array with all available sample maps. */ var getSampleMapList() const;
maybe this has something to do with it?
-
@dustbro This will get you an array of all sampleMaps, then you can populate the ViewPort with the array.
const var list = Sampler.getSampleMapList();
I don't know about getting midi files from the folder, sorry.
-
@Christoph-Hart yes it would seem we need a generalised way to get the contents(a list of files) from a named folder - by type(e.g. *.wav, *.mid)
Of course it would be nicest if this was a FloatingTile with a content type of FileList
-
Nah, I won't do more FloatingTiles unless absolutely necessary - the overhead of adding the text colour for the directory name is killing me.
What I can do is adding two simple function calls:
/** Returns the folder that contains the application data of your plugin. */ Engine.getAppDataFolder() /** Returns a list of filenames in the given folder (non-recursively). */ Engine.getDirectoryContent(String filename)
This way you could create a file browser for yourself by grabbing the list and throw it to a viewports
items
property. But I won't add more Norton Commander features to HISE, from there you're on your own (but file filtering can easily be done using standard Javascript methods). -
@Christoph-Hart sounds good I assume this:
Engine.getDirectoryContent(*.mid)
would work? - of course as you say I could filter with javascript but then what would be the point in having "filename"
-
@Christoph-Hart said in Viewport:
/** Returns the folder that contains the application data of your plugin. */
Engine.getAppDataFolder()/** Returns a list of filenames in the given folder (non-recursively). */
Engine.getDirectoryContent(String filename)Have these been added yet?
-
@dustbro agreed, have these function calls been integrated yet?
-
@Christoph-Hart is there any example of this being done simply by having the samplemaps in categorized folders. seems much more simple than to have all this regex going on just to display simple lists. also cant the samplemap list in the containing folders and the category folder names themselves simply by calling to the directory? is there any example of this?
-
There's no easy solution for this because every project has another hierarchy.
inline function createTwoLevelHierarchy() { local allList = Sampler.getSampleMapList(); local obj = {}; for(id in allList) { local tokens = id.split("/"); local key = tokens[0]; local value = tokens[1]; if(obj[key]) obj[key].push(value); else obj[key] = [value]; } return obj; } const var sorted = createTwoLevelHierarchy();
This code creates an object with a two level hierarchy and can be used to populate two lists.
-
@Christoph-Hart said in Viewport:
inline function createTwoLevelHierarchy()
{
local allList = Sampler.getSampleMapList();
local obj = {};for(id in allList) { local tokens = id.split("/"); local key = tokens[0]; local value = tokens[1]; if(obj[key]) obj[key].push(value); else obj[key] = [value]; } return obj;
}
const var sorted = createTwoLevelHierarchy();
ok so i need to create a viewport called what? or two? im trying to interpret this. sorry
-
@mwplugs What Christoph has provided is a function to generate an object
obj
that contains the IDs of all of your sample maps and their folders. It's up to you to create a way to display them on your GUI (using viewports if you want).You can see the contents of
obj
by right-clicking on the variable you save it to (sorted
in his example) in the watch table. -
@d-healey ok i see that nice
so how do i get these into arrays or whatever
using two viewports? i see this is being created
{ "Brass": [ "FreshHornStaccato" ], "Guitar": [ "AcousticCampfire" ], "Keys": [ "DeepFuzzVibe", "HorrorPianoFuzz" ], "Piano": [ "CloudyJazzPno", "GoldenPiano", "RustyPiano" ], "Strings": [ "ChamberTremelo", "ChamberViolinPizz", "ChamberViolinSpiccati", "ChamberViolinTremble", "MidMedSoloString", "MovieStringStacc", "SoloViolinLeg", "ViolinPizz1", "ViolinStaccato", "ViolinStaccatoB" ], "Vox": [ "WhooMaleVox" ] }
now how do i get the left viewport to pull the categories and the right to list the samplemaps? thanks
-
haha 2 days trying to figure out this simple thing i have no idea how to make this "sorted" object an array for the viewports :/
-
@Christoph-Hart the object created "sorted" does contain the proper data but there is no reference as to how to split to cats and maps into arrays to be used the viewports. ive looked at every post and reply in the whole forum with the words samplemaps and also viewports. there is one involving parsing characters from BD ludwig etc and displaying by filtering names but it is not relevant. i cannot get the data in the object into a list or array for it to be used in vp
-
@mwplugs You don't need arrays, you have an object ;)
-
This turns the object into a flat key list:
const var obj = {}; // some object const var keyArray = []; for(k in obj) keyArray.push(k);
Put the
keyArray
into the left viewport, and set the items on the right viewport by fetching the instrument list from theobj
using the value of the left callback. In the right callback, assemble the samplemap name from the two viewports and load it in the sampler.