Get list of midi files
-
Hey guys,
I could use some pointers with the FileSystem.
I'm trying to use the File Browser to populate an array with a list midi files within a directory.
here's what I'm doing, but it's returning an empty array://hold file list var fileList = []; const var Browse = Content.getComponent("Browse"); inline function onBrowseControl(component, value) { if(value) //if button clicked { //open file broswer FileSystem.browseForDirectory("", function() { //push midi list into array fileList.push(FileSystem.findFiles("", "*.mid", false)); }); } }; Content.getComponent("Browse").setControlCallback(onBrowseControl);
HiseSnippet 932.3ocsV0uiZbCD2KGaTXaIpQJO.q3ufpqvRa9RJppW.NpPM2ETIMpRQUolc8dXgWajs26BJ5d25SPeV5aPxX6E1kKjSIHUy+v7wuw+73YFuSkhXhRIjHuFuZ8JBx6a8mslqWLbAlxQSFg7tm+YXklHCcpFrdEVoHIHOui9UiBuF0Q10+8KCvLLOlTpBgdsfFSdAMipK0N8jeixXiwIjWQyp38COYRrfOTvD4.eNxOBsBGuDeA4brwsZ9Hu6bZBUKjyzXMQA9LPjrd1BwUbm+ulpnyYDiPezLHPN0ngKnrjoaNqJDxq9zxS9QtS9C7OilP2puLC7cVCgkHplC7psKkpuCk5+4nzXAKwDfOC87pPu5N5ce+YwR5JcoEC29F+Ib3xIECo8pzx4Kp1+Vyen.7fq6lgWRFKAgsHZ+3nniCeTTTmm0LnYPudK.VElRYjPFUoaFbIVZEeAHE9ygu4ur9AWRfnw1.o3JEArrYOtfnGJxVI3fP6VNysbQmxYTNILMmGqoBdnf6LafJEr1wavcLDZVNoSyf22LHDVzz1NMg85QSCmmq0.9XFMdIIw4RgmlUudhUDt6TLWJTWQjkFGCZmsFJmy5N2t6iExQTIIFtAW2tUqi2xu1cJQcicnbmVkqVDlYJNL4qPJWKBwRId8m57lzXWCl1U3QJkmXDU1su022EhmgGXlhzwk5pFmq67Lq70MCZzL3Zq8aO62UYTaSxCwL1bnmp8MR9tso7WkKoyEZxKgrQv6CZDbcP3MMkltWaEAlQj60rowWda.ayyylSjapE13HzMra61c9xZ2hcYnJNJ3S3T8KgREmbYCY+8zPhJRwv+9iIivZroGsPG32JhTSMzwaD4RXfmqisg+HhZoVrx5aw8BPYs058J5mGXKmQTXuuqu6VA8tsCE+6kmrdqv+7lST3KIS3SkD3R0zmSUmIxfvhkfad0Pe5bCX5kHImg06NRyL6tv.j32Y1gY9.WQ0qqNa+qXNWzdmys2z5WHcuu+TpNdw94as8vW354+a9V7pQS+SSSg4Gkjst+3+7Peh3qfJ+tHWS4WbFVKoP8h+44YyfGNiI.S3bBC1Henfv.0JGYjMYlYDdhU3CvpvXeirWgw9aLhxvwRwaicsjl2ktqUCvIt8I4Fv2F.xg8Q11T.meT2HjYh3aiiMohe.399w7iG.le5.v7vC.yiN.LO9.v7jC.ySuULluT444ZQlqMATL8T67JOuS4XnJyVQh9H7XmydB
-
Browse for directory returns the selected directory - except in your snippet where you've decide not to return anything in your callback function ;) and then you can search that directory for files.
-
@d-healey Thank you so much!
//hold file list var fileList = []; const var Browse = Content.getComponent("Browse"); inline function onBrowseControl(component, value) { if(value) //if button clicked { //open file broswer FileSystem.browseForDirectory("", function(dir) { //push midi list into array fileList.push(FileSystem.findFiles(dir, "*.mid", false)); }); } }; Content.getComponent("Browse").setControlCallback(onBrowseControl);
-
And one last tweak. The above code puts an array of files inside of an array...
This will just populate the array with files://hold file list var fileList = []; const var Browse = Content.getComponent("Browse"); inline function onBrowseControl(component, value) { if(value) //if button clicked { //open file broswer FileSystem.browseForDirectory("", function(dir) { //push midi list into array local midiFiles = FileSystem.findFiles(dir, "*.mid", false); for(m in midiFiles) { fileList.push(m); } }); } }; Content.getComponent("Browse").setControlCallback(onBrowseControl);
-
@dustbro Then why not just:
fileList = FileSystem.findFiles(dir, "*.mid", false);
Or if you want to keep a local var (if ever you have a good reason)
fileList = midiFiles;
-
@ustk said in Get list of midi files:
@dustbro Then why not just:
fileList = FileSystem.findFiles(dir, "*.mid", false);
That works too!
Next question. The array of files are Objects. Tips on converting to string so I can load in the MidiPlayer?
The files in the array looks like:"File: E:\\Company\\Groove 06 - 155 bpm\\Pattern01.mid"
I'm calling
MIDIPlayer.setFile(fileList[0], 1, 1);
and getting an error:
API Call with undefined parameter 0
I guess technically I just need to remove
File:
from the file name
-
-
replace works on strings, fileList is an array so no replace function there. You'd need to loop through your array of objects and run replace on each one.
-
@d-healey here's my attempt:
//hold file list var fileList = []; const var formattedNames = []; const var Browse = Content.getComponent("Browse"); inline function onBrowseControl(component, value) { if(value) //if button clicked { //open file broswer FileSystem.browseForDirectory("", function(dir) { //push midi list into array fileList = FileSystem.findFiles(dir, "*.mid", false); for (i = 0; i < fileList.length; i++) { var newName = fileList[i]; newName = newName.replace("File: ", ""); formattedNames.push(newName); } }); } }; Content.getComponent("Browse").setControlCallback(onBrowseControl);
getting this error:
function not found at newName = newName.replace("File: ", "");
-
filelist is an array of objects. So filelist[i] is an object not a string. Try
Console.print(trace(filelist[i]));
to see what is contained within your object. -
@d-healey said in Get list of midi files:
Console.print(trace(filelist[i]));
It returns
Interface: undefined
-
@dustbro If you're going to copy and paste things that I write you should check that I've written it correctly ;) Your variable is called fileList, not filelist.
-
@d-healey said in Get list of midi files:
fileList
I've been sitting at the computer for 13 hours... maybe I need a break.
Now that I'm using variables that actually exist in my project, it returns empty:
Interface:
Also, thanks for the help.
-
What do you get with
Console.print(fileList.length);
? -
@d-healey 15, which is the amount of files in my test folder
-
Try this in place of your loop
for (f in fileList) { Console.print(f.toString(File.FullPath)); }
I also notice you're using some
vars
, always uselocal
in inline functions, and in on init use reg or const. 99% of the timevar
should not be used except in paint routines, mouse callbacks, timer callbacks, and occasionally a few other places. -
@d-healey said in Get list of midi files:
Try this in place of your loop
Now we're talking! that returns the file path correctly
-
@dustbro Yeah it's late here :) the objects in your array are all file objects so you have access to all of the File class functions, like
toString()
-
@d-healey said in Get list of midi files:
99% of the time var should not be used
Thanks for this advice as well.