i am trying to generate file paths to all audio files with js, but my script isn’t work as i expected. Here is my file structure:
- audio/
- 36/
- 3/
- maj/
- c.mp3
- cis.mp3
- d.mp3
- dis.mp3
- e.mp3
- f.mp3
- fis.mp3
- g.mp3
- gis.mp3
- a.mp3
- b.mp3
- h.mp3
- min/
- c.mp3
- cis.mp3
- d.mp3
- dis.mp3
- e.mp3
- f.mp3
- fis.mp3
- g.mp3
- gis.mp3
- a.mp3
- b.mp3
- h.mp3
- 6/
- maj/
- c.mp3
- cis.mp3
- d.mp3
- dis.mp3
- e.mp3
- f.mp3
- fis.mp3
- g.mp3
- gis.mp3
- a.mp3
- b.mp3
- h.mp3
- min/
- c.mp3
- cis.mp3
- d.mp3
- dis.mp3
- e.mp3
- f.mp3
- fis.mp3
- g.mp3
- gis.mp3
- a.mp3
- b.mp3
- h.mp3
https://github.com/TonnyHawk/solfege/tree/main/%23src/audio/36
As you can see there are only 12 filenames that repeated and only folder names change. i collected all posible file and folder names in this object
let pth = {
audioFolder: 'audio',
section: ['36'],
interval: ['3','6'],
type: ['maj','min'],
bassNote: [
'c',
'cis',
'd',
'dis',
'e',
'f',
'fis',
'g',
'gis',
'a',
'b',
'h',
],
octave: [1],
ext: '.mp3'
}
and supposed to generate paths like this audio / 36 / 3 / maj / octaves / 1 / a.mp3
let paths = [];
let it = 0;
sections(audioFolder + '/');
function sections(path){// should recieve audio/
let str;
for(i = 0; i < pth.section.length; i++){
str = path;
str += pth.section[i];
str += '/';
console.log('sections')
intervals(str);
}
}
function intervals(path){// should recieve audio/36
let str;
for(i = 0; i < pth.interval.length; i++){
str = path;
str += pth.interval[i];
str += '/';
console.log('intervals')
types(str);
}
}
function types(path){// should recieve audio/36/3/
let str;
for(i = 0; i < pth.type.length; i++){
str = path;
str += pth.type[i];
str += '/';
console.log('types')
octaves(str)
}
}
function octaves(path=path+'octaves/'){// should recieve audio/36/3/maj/
let str;
for(i = 0; i < pth.octave.length; i++){
str = path;
str += pth.octave[i];
str += '/';
console.log('octaves')
notes(str);
}
}
function notes(path){// should recieve audio/36/3/maj/octaves/1/
let str;
for(i = 0; i < bassNote.length; i++){
str = path;
str += pth.bassNote[i];
str += ext;
console.log('notes')
paths[it] = str;
it = it + 1;
}
}
for(i = 0; i < paths.length; i++){
console.log(paths[i])
}
but all that i recieving is just filenames for only one folder
audio/36/3/maj/1/c.mp3
audio/36/3/maj/1/cis.mp3
audio/36/3/maj/1/d.mp3
audio/36/3/maj/1/dis.mp3
audio/36/3/maj/1/e.mp3
audio/36/3/maj/1/f.mp3
audio/36/3/maj/1/fis.mp3
audio/36/3/maj/1/g.mp3
audio/36/3/maj/1/gis.mp3
audio/36/3/maj/1/a.mp3
audio/36/3/maj/1/b.mp3
seems like all for
loops acting just one time and only notes()
function goes through all pth.notes array. Can someone explain me this behaviour? I am open to hear your solutions
Advertisement
Answer
You need to assume or let the i
variable in each function separately because it’s overridden by the previous value. Please check the below code or check js fiddle
let pth = {
audioFolder: 'audio',
section: ['36'],
interval: ['3','6'],
type: ['maj','min'],
bassNote: [
'c','cis','d','dis','e','f','fis',
'g','gis','a','b','h',
],
octave: [1,2],
ext: '.mp3'
}
let paths = [];
sections(pth.audioFolder + '/');
function sections(path){// should recieve audio/
let str, i;
for(i = 0; i < pth.section.length; i++){
str = path;
str += pth.section[i];
str += '/';
intervals(str);
}
}
function intervals(path){// should recieve audio/36
let str, i;
for(i = 0; i < pth.interval.length; i++){
str = path;
str += pth.interval[i];
str += '/';
types(str);
}
}
function types(path){// should recieve audio/36/3/
let str, i;
for(i = 0; i < pth.type.length; i++){
str = path;
str += pth.type[i];
str += '/';
octaves(str)
}
}
function octaves(path){// should recieve audio/36/3/maj/
let str, i;
for(i = 0; i < pth.octave.length; i++){
str = path;
str += 'octaves/';
str += pth.octave[i]+'/';
notes(str);
}
}
function notes(path){// should recieve audio/36/3/maj/octaves/1/
let str, i;
for(i = 0; i < pth.bassNote.length; i++){
str = path;
str += pth.bassNote[i];
str += pth.ext;
paths.push(str);
}
}
for(i = 0; i < paths.length; i++){
console.log(paths[i])
}
console.log('Total Path: ' + paths.length);