Skip to main content

Notice

Please note that most of the software linked on this forum is likely to be safe to use. If you are unsure, feel free to ask in the relevant topics, or send a private message to an administrator or moderator. To help curb the problems of false positives, or in the event that you do find actual malware, you can contribute through the article linked here.
Topic: Search-by-Distance-SMP (Read 25681 times) previous topic - next topic
0 Members and 1 Guest are viewing this topic.

Re: Search-by-Distance-SMP

Reply #25
regor, I have a (dumb) question regarding harmonic mixing...I use InitialKey instead of Key. Where should I change (replace InitialKey with Key)  this, in which script or properties panel?

Re: Search-by-Distance-SMP

Reply #26
regor, I have a (dumb) question regarding harmonic mixing...I use InitialKey instead of Key. Where should I change (replace InitialKey with Key)  this, in which script or properties panel?
That one along bpm are hard-coded. Will be configurable on properties on next releases.

Line 1423 at search_bydistance.js:
Code: [Select]
const restTagNames = [(keyWeight !== 0 || bInKeyMixingPlaylist) ? 'key' : 'skip', (dateWeight !== 0) ? dateTag[0] : 'skip', (bpmWeight !== 0) ? 'bpm' : 'skip', (customNumWeight !== 0) ? customNumTag[0] : 'skip']; // 'skip' returns empty arrays...

Replace 'key' with 'InitialKey' or whatever you use.

Btw if you use the customizable button (buttons_search_bydistance_customizable.js), it should allow you to configure most things without touching the properties. In next releases key would be on that tag list:

X

Re: Search-by-Distance-SMP

Reply #27
I replaced key with initialkey where you said, but it doesnt work, this is what I have in the console :

Called: Harmonic mix\Harmonic mix from playlist
do_harmonic_mixing: Tracks don't have key tag.
["domKey", "energySwitch", "moodDrop", "perfectMatch", "moodBoost", "subDomKey", "energySwitch", "energyRaise", "perfectMatch", "energyBoost", "energyDrop", "energyDrop", "perfectMatch", "domKey", "perfectMatch", "perfectMatch", "perfectMatch", "subDomKey"]

initialkey is using this values :
G#m
Bmaj
Ebm
Gb
Bbm
Db
Fmin
Ab
Cmin
Eb
Gmin
Bb
Dmin
Fmaj
Amin
Cmaj
Emin
Gmaj
Bmin
Dmaj
F#m
Amaj
C#m
Emaj
Thanks for the tip about buttons_search_bydistance_customizable.js

Re: Search-by-Distance-SMP

Reply #28
If you check the related repository at github for harmonic mixing you will see only standard notation is allowed
https://github.com/regorxxx/Camelot-Wheel-Notation

i.e. 'Abm'   or 'G#m'
Bmin or Dmaj are not allowed, Dmaj is D, Bmin is Bm.

You can either retag your files with standard notation (masstagger could automate the process or mp3tag) (*) or edit camelot_wheel_xxx.js (keyNotationObject and keyNotation). Note your files have also mixed notations (D#m and Dmin) (**).

If you prefer to edit the descriptor, you would add this to keyNotation for ex. but replacing the left column with Abmin, D#m (?? it should be D#min (**)), etc. (Also note you should not add duplicates, if D#m is already present on standard notation, skip it)
Code: [Select]
['G#m'	, '1A' 	], // Minor
['Abm' , '1A' ],
['D#m' , '2A' ],
['Ebm' , '2A' ],
['A#m' , '3A' ],
['Bbm' , '3A' ],
['Fm' , '4A' ],
['Cm' , '5A' ],
['Gm' , '6A' ],
['Dm' , '7A' ],
['Am' , '8A' ],
['Em' , '9A' ],
['Bm' , '10A' ],
['F#m' , '11A' ],
['Gbm' , '11A' ],
['C#m' , '12A' ],
['Dbm' , '12A' ],
['B' , '1B' ], // Major
['F#' , '2B' ],
['Gb' , '2B' ],
['C#' , '3B' ],
['Db' , '3B' ],
['G#' , '4B' ],
['Ab' , '4B' ],
['D#' , '5B' ],
['Eb' , '5B' ],
['A#' , '6B' ],
['Bb' , '6B' ],
['F' , '7B' ],
['C' , '8B' ],
['G' , '9B' ],
['D' , '10B' ],
['A' , '11B' ],
['E' , '12B' ],

I'm not sure about adding that additional translation on next release, which program gives those tags?

(*) Just replacing 'min' with 'm' would do on all tracks. No need to create an script for every key. Also, maybe that solution could be added to the script:

Code: [Select]
const camelotKey = camelotWheel.keyNotationObject.has(key) ? {...camelotWheel.keyNotationObject.get(key)} : null;
->
const camelotKey = camelotWheel.keyNotationObject.has(key.replace('min','m')) ? {...camelotWheel.keyNotationObject.get(key.replace('min','m'))} : null;

Code: [Select]
const camelotKeyNew = camelotWheel.keyNotationObject.get(keyNew);
const camelotKey = camelotWheel.keyNotationObject.get(key);
->
const camelotKeyNew = camelotWheel.keyNotationObject.get(keyNew.replace('min','m'));
const camelotKey = camelotWheel.keyNotationObject.get(key.replace('min','m'));

Code: [Select]
camelotKeyCurrent = keyCurrent.length ? camelotWheel.getKeyNotationObject(keyCurrent) : null;
->
camelotKeyCurrent = keyCurrent.length ? camelotWheel.getKeyNotationObject(keyCurrent.replace('min','m')) : null;

Code: [Select]
camelotKeyNew = (keyNew.length) ? camelotWheel.getKeyNotationObject(keyNew) : null;
->
camelotKeyNew = (keyNew.length) ? camelotWheel.getKeyNotationObject(keyNew.replace('min','m')) : null;

Or alternatively simply editing the has/get funcs at camelot_wheel_xxx.js would do (not needing anything more):
Code: [Select]
	hasKey(xy) {return (typeof xy === 'object' ? (xy.hasOwnProperty('hour') && xy.hasOwnProperty('letter') ? this.keyNotation.has(xy.hour + xy.letter) : false): this.keyNotation));},
getKeyNotationObject(y) {return (this.hasKey(y) ? {...this.keyNotationObject.get(y)} : null);},

->

hasKey(xy) {return (typeof xy === 'object' ? (xy.hasOwnProperty('hour') && xy.hasOwnProperty('letter') ? this.keyNotation.has(xy.hour + xy.letter) : false): this.keyNotation.has(xy.replace('min','m')));},
getKeyNotationObject(y) {return (this.hasKey(y.replace('min','m')) ? {...this.keyNotationObject.get(y.replace('min','m'))} : null);},

Let me know if it works for you, and probably I will add the latest change too.

Re: Search-by-Distance-SMP

Reply #29
Sorry for late answer but my foobar configuration refused to start ( a problem with SMP, a shutdown corrupted a package json, the settings for Library Tree were lost, but in the end everything was restored 100% , I had a backup for Library Tree, but it took awhile until it was solved).

"I'm not sure about adding that additional translation on next release, which program gives those tags?"
Probably you shouldn't.
It was simply an error from my part (I copied the wrong notations), I use standard notation (I use Serato for key values).

"Line 1423 at search_bydistance.js:
const restTagNames = [(keyWeight !== 0 || bInKeyMixingPlaylist) ? 'key' : 'skip', (dateWeight !== 0) ? dateTag[0] : 'skip', (bpmWeight !== 0) ? 'bpm' : 'skip', (customNumWeight !== 0) ? customNumTag[0] : 'skip']; // 'skip' returns empty arrays...

Replace 'key' with 'InitialKey' or whatever you use."
This didn't worked
But I noticed that if I copy the values from initialkey tag to key tag, the script works, so those values (key notations ) are good.

Well, our discussion wasn't totally useless because you reminded me about a masstagger script that I had. For those that don't want to remap tags or simply want to have in the "key'' tag , Camelot notations (obviously the files must have a key value somewhere added with Serato or other program) : http://sendanywhe.re/ZDXKN35B
Then, if you go to : Display - Playlist View - Columns - Style script ( don't forget to check "Use custom style script") and you add this:

$if($strstr(%KEY%,1A),$set_style(back,$rgb(86,241,218,86,241,218)),%KEY%)
$if($strstr(%KEY%,1B),$set_style(back,$rgb(2,237,202,2,237,202)),%KEY%)
$if($strstr(%KEY%,2A),$set_style(back,$rgb(125,242,170,125,242,170)),%KEY%)
$if($strstr(%KEY%,2B),$set_style(back,$rgb(60,238,129,60,238,129)),%KEY%)
$if($strstr(%KEY%,3A),$set_style(back,$rgb(174,245,137,174,245,137)),%KEY%)
$if($strstr(%KEY%,3B),$set_style(back,$rgb(134,242,79,134,242,79)),%KEY%)
$if($strstr(%KEY%,4A),$set_style(back,$rgb(232,218,161,232,218,161)),%KEY%)
$if($strstr(%KEY%,4B),$set_style(back,$rgb(223,202,115,223,202,115)),%KEY%)
$if($strstr(%KEY%,5A),$set_style(back,$rgb(253,191,167,253,191,167)),%KEY%)
$if($strstr(%KEY%,5B),$set_style(back,$rgb(255,160,124,255,160,124)),%KEY%)
$if($strstr(%KEY%,6A),$set_style(back,$rgb(253,175,183,253,175,183)),%KEY%)
$if($strstr(%KEY%,6B),$set_style(back,$rgb(255,160,124,255,160,124)),%KEY%)
$if($strstr(%KEY%,7A),$set_style(back,$rgb(253,170,204,253,170,204)),%KEY%)
$if($strstr(%KEY%,7B),$set_style(back,$rgb(255,129,180,255,129,180)),%KEY%)
$if($strstr(%KEY%,8A),$set_style(back,$rgb(242,171,228,242,171,228)),%KEY%)
$if($strstr(%KEY%,8B),$set_style(back,$rgb(238,130,217,238,130,217)),%KEY%)
$if($strstr(%KEY%,9A),$set_style(back,$rgb(221,180,253,221,180,253)),%KEY%)
$if($strstr(%KEY%,9B),$set_style(back,$rgb(206,143,255,206,143,255)),%KEY%)
$if($strstr(%KEY%,10A),$set_style(back,$rgb(190,205,253,190,205,253)),%KEY%)
$if($strstr(%KEY%,10B),$set_style(back,$rgb(159,182,255,159,182,255)),%KEY%)
$if($strstr(%KEY%,11A),$set_style(back,$rgb(142,228,249,142,228,249)),%KEY%)
$if($strstr(%KEY%,11B),$set_style(back,$rgb(86,217,249,86,217,249)),%KEY%)
$if($strstr(%KEY%,12A),$set_style(back,$rgb(85,240,240,85,240,240)),%KEY%)
$if($strstr(%KEY%,12B),$set_style(back,$rgb(85,240,240,85,240,240)),%KEY%)

The colors will look exactly like in the Camelot Wheel :








Re: Search-by-Distance-SMP

Reply #30
So, my problem was solved. I use Serato to get the key values in ''initialkey'' tag, then I use a script for Masstagger to add  Camelot notations in ''key'' tag (this way it will also have a great look, similar to dj programs) . Thanks, once again @regor , for the help
Btw, just to be sure, if you look at that picture, (I used : Playlist tools - Playlist manipulation - Harmonic mix from playlist) your script works ok, no? I'm asking just to be sure that foobar doesn't rearranges the songs in a wrong order

Re: Search-by-Distance-SMP

Reply #31
So, my problem was solved. I use Serato to get the key values in ''initialkey'' tag, then I use a script for Masstagger to add  Camelot notations in ''key'' tag (this way it will also have a great look, similar to dj programs) . Thanks, once again @regor , for the help
Btw, just to be sure, if you look at that picture, (I used : Playlist tools - Playlist manipulation - Harmonic mix from playlist) your script works ok, no? I'm asking just to be sure that foobar doesn't rearranges the songs in a wrong order
Note the whole point of only allowing standard notation was to translate it to camelot notation on the fly hahahahaha (*)
So there is no need at all to do it first by yourself! (my idea was to allow SMP to work with standard notation -Gbm- and camelot notation at the same time -2A- without forcing you to re-tag). Just copying Initialkey to key should work. Obviously, doing the translation too. Anyway retagging will not be needed at all in next release since you can set the key tag.

(*) My first approach to the problem was also using a similar script than the one you posted. But it's really tedious to apply that script since it had so many lines... and you need to re-apply it on every new track. So I found it better to just do it on the SMP script using the keys we already had (Gbm, ...).
There is another problem, some keys have a sharp and flat notation and are equivalent. Abm and G#m are both 1A. So you have to duplicate the script to include both cases. For common users, that requirement would have been a big No.

Now that you mention it I will add that masstagger script to 'presets\Masstagger\' (I think the latest public release does not have that folder (?)). I'm sharing my own masstagger scripts which may be useful for people (although not related to any tool in particular), and the key translation may come useful too. From standard to camelot and the opposite one.

Quote
Replace 'key' with 'InitialKey' or whatever you use."
This didn't worked
But I noticed that if I copy the values from initialkey tag to key tag, the script works, so those values (key notations ) are good.
Note there are 2 functions (one called V2), maybe you edited the wrong function (?). It's 100% sure that editing that line should allow you to load tags from initialkey (try lowercase).

About it working, see console. If it says it works, then it works hahahaha Really, if you enable console debug, it will output an array of keys telling you the movements used. With that, you can compare the actual order and the "desired order" and easily check if it works. Looking at your screenshot I would say yes... similar keys are grouped, when it changes it tries small steps (+- 1) and there are a few mood boosts/drops (+-3). The complete arrangement is random, i.e. on every run a new "pattern" is created. But the proportion of movements allowed is not (for ex. 10% of movements are +-3).

Finally, use your ears. If the playlist flows without strange jumps and following tracks sounding as a natural progression of the previous one, no matter the music genre... then it works. There are a few mood/energy jumps here and there, but really limited in number and meant to spice it a bit.

Re: Search-by-Distance-SMP

Reply #32
To enable debug, it seems I missed to expose a global bool... you can enable it for Search By distance buttons at properties, but not for Playlist Tools menu.

Anyway, at main\playlist_tools_menu.js look for 'const defaultArgs'
This is my current code (probably different to the latest public release)
Code: [Select]
const defaultArgs = {
playlistLength: menu_properties['playlistLength'][1],
forcedQuery: menu_properties['forcedQuery'][1],
ratingLimits: menu_properties['ratingLimits'][1].split(','),
bHttpControl: () => {return utils.CheckComponent('foo_httpcontrol') && _isFolder(fb.ProfilePath + 'foo_httpcontrol_data\\ajquery-xxx')},
httpControlPath: fb.ProfilePath + 'foo_httpcontrol_data\\ajquery-xxx\\smp\\'
};

if you add 'bDebug: true' there it will output verbose comments to console log for most tools:
Code: [Select]
const defaultArgs = {
playlistLength: menu_properties['playlistLength'][1],
forcedQuery: menu_properties['forcedQuery'][1],
ratingLimits: menu_properties['ratingLimits'][1].split(','),
bHttpControl: () => {return utils.CheckComponent('foo_httpcontrol') && _isFolder(fb.ProfilePath + 'foo_httpcontrol_data\\ajquery-xxx')},
httpControlPath: fb.ProfilePath + 'foo_httpcontrol_data\\ajquery-xxx\\smp\\',
bDebug: true
};

Re: Search-by-Distance-SMP

Reply #33
Have updated the repository with all the latest changes and fixes. Key remap included. If anyone want to test it, download the files directly from the repository not the releases.

(it's recommended to also download the latest files from the rest of my scripts, since I have changed all with major changes in Playlist Tools. If you use Playlist Tools, just download all from there, since it includes this)

Changelog is up to date on github. Check unreleased.

Re: Search-by-Distance-SMP

Reply #34
"Now that you mention it I will add that masstagger script to 'presets\Masstagger\' (I think the latest public release does not have that folder (?)) I'm sharing my own masstagger scripts which may be useful for people (although not related to any tool in particular) "
No, there is no folder with Masstagger scripts, so it will be a useful thing
@regor I know, I forgot to mention , my method sacrifices a bit of efficiency in favor of visual aspect haha . The easiest solution would be just to remap the tags and that's all. But instead I choose to push a button from time to time just to have that colorful effect like in that picture (and Camelot notations), and besides it's not entirely silly, it helps a lot visually , if you want to make a manual mix using Camelot notations , you just see the colors and you know that something is wrong , so you could include that little script for CUI too (  Display - Playlist View - Columns - Style script).......for those interested in visual aspect or those that can find it useful :)

"Looking at your screenshot I would say yes... similar keys are grouped, when it changes it tries small steps"

Good to know it's working (I had a silly belief that maybe foobar will interfere with your script and will try to sort the songs in a wrong way haha), I didn't looked at the camelot wheel for a long time so I completely forgot the rules haha, so I thought you'll spot immediately if something is wrong :)



Re: Search-by-Distance-SMP

Reply #35
"Now that you mention it I will add that masstagger script to 'presets\Masstagger\' (I think the latest public release does not have that folder (?)) I'm sharing my own masstagger scripts which may be useful for people (although not related to any tool in particular) "
No, there is no folder with Masstagger scripts, so it will be a useful thing
@regor I know, I forgot to mention , my method sacrifices a bit of efficiency in favor of visual aspect haha . The easiest solution would be just to remap the tags and that's all. But instead I choose to push a button from time to time just to have that colorful effect like in that picture (and Camelot notations), and besides it's not entirely silly, it helps a lot visually , if you want to make a manual mix using Camelot notations , you just see the colors and you know that something is wrong , so you could include that little script for CUI too (  Display - Playlist View - Columns - Style script).......for those interested in visual aspect or those that can find it useful :)

"Looking at your screenshot I would say yes... similar keys are grouped, when it changes it tries small steps"

Good to know it's working (I had a silly belief that maybe foobar will interfere with your script and will try to sort the songs in a wrong way haha), I didn't looked at the camelot wheel for a long time so I completely forgot the rules haha, so I thought you'll spot immediately if something is wrong :)



I think it may be possible to simply add the translation script directly to the column but use standard notation on tags. So you have both, no need to re-tag and easy visualization. Will check it

The latest update already includes those masstager scripts for moods (at presets).

Update:

key translation (both flat and sharp standard notations) + UI Colors (CUI): using this one there is no need to re-tag files but you can still visualize camelot keys as a column.
Code: [Select]
$if($stricmp(%KEY%,G#m),$puts(kTrans,1A))
$if($stricmp(%KEY%,Abm),$puts(kTrans,1A))
$if($stricmp(%KEY%,D#m),$puts(kTrans,2A))
$if($stricmp(%KEY%,Ebm),$puts(kTrans,2A))
$if($stricmp(%KEY%,A#m),$puts(kTrans,3A))
$if($stricmp(%KEY%,Bbm),$puts(kTrans,3A))
$if($stricmp(%KEY%,Fm),$puts(kTrans,4A))
$if($stricmp(%KEY%,Cm),$puts(kTrans,5A))
$if($stricmp(%KEY%,Gm),$puts(kTrans,6A))
$if($stricmp(%KEY%,Dm),$puts(kTrans,7A))
$if($stricmp(%KEY%,Am),$puts(kTrans,8A))
$if($stricmp(%KEY%,Em),$puts(kTrans,9A))
$if($stricmp(%KEY%,Bm),$puts(kTrans,10A))
$if($stricmp(%KEY%,F#m),$puts(kTrans,11A))
$if($stricmp(%KEY%,Gbm),$puts(kTrans,11A))
$if($stricmp(%KEY%,C#m),$puts(kTrans,12A))
$if($stricmp(%KEY%,Dbm),$puts(kTrans,12A))
$if($stricmp(%KEY%,B),$puts(kTrans,1B))
$if($stricmp(%KEY%,F#),$puts(kTrans,2B))
$if($stricmp(%KEY%,Gb),$puts(kTrans,2B))
$if($stricmp(%KEY%,C#),$puts(kTrans,3B))
$if($stricmp(%KEY%,Db),$puts(kTrans,3B))
$if($stricmp(%KEY%,G#),$puts(kTrans,4B))
$if($stricmp(%KEY%,Ab),$puts(kTrans,4B))
$if($stricmp(%KEY%,D#),$puts(kTrans,5B))
$if($stricmp(%KEY%,Eb),$puts(kTrans,5B))
$if($stricmp(%KEY%,A#),$puts(kTrans,6B))
$if($stricmp(%KEY%,Bb),$puts(kTrans,6B))
$if($stricmp(%KEY%,F),$puts(kTrans,7B))
$if($stricmp(%KEY%,C),$puts(kTrans,8B))
$if($stricmp(%KEY%,G),$puts(kTrans,9B))
$if($stricmp(%KEY%,D),$puts(kTrans,10B))
$if($stricmp(%KEY%,A),$puts(kTrans,11B))
$if($stricmp(%KEY%,E),$puts(kTrans,12B))
$if($get(kTrans),,$puts(kTrans,%key%))
$get(kTrans)
$if($stricmp($get(kTrans),1A),$set_style(back,$rgb(86,241,218,86,241,218)),$get(kTrans))
$if($stricmp($get(kTrans),1B),$set_style(back,$rgb(2,237,202,2,237,202)),$get(kTrans))
$if($stricmp($get(kTrans),2A),$set_style(back,$rgb(125,242,170,125,242,170)),$get(kTrans))
$if($stricmp($get(kTrans),2B),$set_style(back,$rgb(60,238,129,60,238,129)),$get(kTrans))
$if($stricmp($get(kTrans),3A),$set_style(back,$rgb(174,245,137,174,245,137)),$get(kTrans))
$if($stricmp($get(kTrans),3B),$set_style(back,$rgb(134,242,79,134,242,79)),$get(kTrans))
$if($stricmp($get(kTrans),4A),$set_style(back,$rgb(232,218,161,232,218,161)),$get(kTrans))
$if($stricmp($get(kTrans),4B),$set_style(back,$rgb(223,202,115,223,202,115)),$get(kTrans))
$if($stricmp($get(kTrans),5A),$set_style(back,$rgb(253,191,167,253,191,167)),$get(kTrans))
$if($stricmp($get(kTrans),5B),$set_style(back,$rgb(255,160,124,255,160,124)),$get(kTrans))
$if($stricmp($get(kTrans),6A),$set_style(back,$rgb(253,175,183,253,175,183)),$get(kTrans))
$if($stricmp($get(kTrans),6B),$set_style(back,$rgb(255,160,124,255,160,124)),$get(kTrans))
$if($stricmp($get(kTrans),7A),$set_style(back,$rgb(253,170,204,253,170,204)),$get(kTrans))
$if($stricmp($get(kTrans),7B),$set_style(back,$rgb(255,129,180,255,129,180)),$get(kTrans))
$if($stricmp($get(kTrans),8A),$set_style(back,$rgb(242,171,228,242,171,228)),$get(kTrans))
$if($stricmp($get(kTrans),8B),$set_style(back,$rgb(238,130,217,238,130,217)),$get(kTrans))
$if($stricmp($get(kTrans),9A),$set_style(back,$rgb(221,180,253,221,180,253)),$get(kTrans))
$if($stricmp($get(kTrans),9B),$set_style(back,$rgb(206,143,255,206,143,255)),$get(kTrans))
$if($stricmp($get(kTrans),10A),$set_style(back,$rgb(190,205,253,190,205,253)),$get(kTrans))
$if($stricmp($get(kTrans),10B),$set_style(back,$rgb(159,182,255,159,182,255)),$get(kTrans))
$if($stricmp($get(kTrans),11A),$set_style(back,$rgb(142,228,249,142,228,249)),$get(kTrans))
$if($stricmp($get(kTrans),11B),$set_style(back,$rgb(86,217,249,86,217,249)),$get(kTrans))
$if($stricmp($get(kTrans),12A),$set_style(back,$rgb(85,240,240,85,240,240)),$get(kTrans))
$if($stricmp($get(kTrans),12B),$set_style(back,$rgb(85,240,240,85,240,240)),$get(kTrans))

Key translation only (for column display CUI)
Code: [Select]
$if($stricmp(%KEY%,G#m),$puts(kTrans,1A))
$if($stricmp(%KEY%,Abm),$puts(kTrans,1A))
$if($stricmp(%KEY%,D#m),$puts(kTrans,2A))
$if($stricmp(%KEY%,Ebm),$puts(kTrans,2A))
$if($stricmp(%KEY%,A#m),$puts(kTrans,3A))
$if($stricmp(%KEY%,Bbm),$puts(kTrans,3A))
$if($stricmp(%KEY%,Fm),$puts(kTrans,4A))
$if($stricmp(%KEY%,Cm),$puts(kTrans,5A))
$if($stricmp(%KEY%,Gm),$puts(kTrans,6A))
$if($stricmp(%KEY%,Dm),$puts(kTrans,7A))
$if($stricmp(%KEY%,Am),$puts(kTrans,8A))
$if($stricmp(%KEY%,Em),$puts(kTrans,9A))
$if($stricmp(%KEY%,Bm),$puts(kTrans,10A))
$if($stricmp(%KEY%,F#m),$puts(kTrans,11A))
$if($stricmp(%KEY%,Gbm),$puts(kTrans,11A))
$if($stricmp(%KEY%,C#m),$puts(kTrans,12A))
$if($stricmp(%KEY%,Dbm),$puts(kTrans,12A))
$if($stricmp(%KEY%,B),$puts(kTrans,1B))
$if($stricmp(%KEY%,F#),$puts(kTrans,2B))
$if($stricmp(%KEY%,Gb),$puts(kTrans,2B))
$if($stricmp(%KEY%,C#),$puts(kTrans,3B))
$if($stricmp(%KEY%,Db),$puts(kTrans,3B))
$if($stricmp(%KEY%,G#),$puts(kTrans,4B))
$if($stricmp(%KEY%,Ab),$puts(kTrans,4B))
$if($stricmp(%KEY%,D#),$puts(kTrans,5B))
$if($stricmp(%KEY%,Eb),$puts(kTrans,5B))
$if($stricmp(%KEY%,A#),$puts(kTrans,6B))
$if($stricmp(%KEY%,Bb),$puts(kTrans,6B))
$if($stricmp(%KEY%,F),$puts(kTrans,7B))
$if($stricmp(%KEY%,C),$puts(kTrans,8B))
$if($stricmp(%KEY%,G),$puts(kTrans,9B))
$if($stricmp(%KEY%,D),$puts(kTrans,10B))
$if($stricmp(%KEY%,A),$puts(kTrans,11B))
$if($stricmp(%KEY%,E),$puts(kTrans,12B))
$if($get(kTrans),,$puts(kTrans,%key%))
$get(kTrans)

Key translation only (DUI)
Code: [Select]
$if($stricmp(%KEY%,G#m),$puts(kTrans,1A))$if($stricmp(%KEY%,Abm),$puts(kTrans,1A))$if($stricmp(%KEY%,D#m),$puts(kTrans,2A))$if($stricmp(%KEY%,Ebm),$puts(kTrans,2A))$if($stricmp(%KEY%,A#m),$puts(kTrans,3A))$if($stricmp(%KEY%,Bbm),$puts(kTrans,3A))$if($stricmp(%KEY%,Fm),$puts(kTrans,4A))$if($stricmp(%KEY%,Cm),$puts(kTrans,5A))$if($stricmp(%KEY%,Gm),$puts(kTrans,6A))$if($stricmp(%KEY%,Dm),$puts(kTrans,7A))$if($stricmp(%KEY%,Am),$puts(kTrans,8A))$if($stricmp(%KEY%,Em),$puts(kTrans,9A))$if($stricmp(%KEY%,Bm),$puts(kTrans,10A))$if($stricmp(%KEY%,F#m),$puts(kTrans,11A))$if($stricmp(%KEY%,Gbm),$puts(kTrans,11A))$if($stricmp(%KEY%,C#m),$puts(kTrans,12A))$if($stricmp(%KEY%,Dbm),$puts(kTrans,12A))$if($stricmp(%KEY%,B),$puts(kTrans,1B))$if($stricmp(%KEY%,F#),$puts(kTrans,2B))$if($stricmp(%KEY%,Gb),$puts(kTrans,2B))$if($stricmp(%KEY%,C#),$puts(kTrans,3B))$if($stricmp(%KEY%,Db),$puts(kTrans,3B))$if($stricmp(%KEY%,G#),$puts(kTrans,4B))$if($stricmp(%KEY%,Ab),$puts(kTrans,4B))$if($stricmp(%KEY%,D#),$puts(kTrans,5B))$if($stricmp(%KEY%,Eb),$puts(kTrans,5B))$if($stricmp(%KEY%,A#),$puts(kTrans,6B))$if($stricmp(%KEY%,Bb),$puts(kTrans,6B))$if($stricmp(%KEY%,F),$puts(kTrans,7B))$if($stricmp(%KEY%,C),$puts(kTrans,8B))$if($stricmp(%KEY%,G),$puts(kTrans,9B))$if($stricmp(%KEY%,D),$puts(kTrans,10B))$if($stricmp(%KEY%,A),$puts(kTrans,11B))$if($stricmp(%KEY%,E),$puts(kTrans,12B))$if($get(kTrans),,$puts(kTrans,%key%))$get(kTrans)

Should look like the image koshingg provided:
Spoiler (click to show/hide)

Btw @Koshingg , why does that masstagger script provide both an initial key and a key tag when you already have a key tag? (in fact it gets cleared and replaced with ?)
Spoiler (click to show/hide)
I like that it works with multiple formats though

Re: Search-by-Distance-SMP

Reply #36
You found a better solution, thanks for those scripts for CUI :)

''Btw @Koshingg , why does that masstagger script provide both an initial key and a key tag when you already have a key tag? (in fact it gets cleared and replaced with ?)  ''
It's great that you found that error. Here is the new version without that error (and with Initial Key) tag : http://sendanywhe.re/T5I5KNLW Ok, now I'll explain why the script provides an Initial key tag too, haha . Actually is a hidden bonus, for those that maybe use this plugin https://getmusicbee.com/forum/index.php?topic=24631.0 for Musicbee, that tag is needed for that plugin to work. I used MusicBee a few years ago, for one year, I still have that configuration so I thought : hmmm, let's add this tag too, who knows what might happen in the future, hahaha, what if foobar goes x64 and many components will not work ? :)
Anyway, the final version of the script, it adds only camelot notation in Key tag (Initial key tag it's not present anymore): http://sendanywhe.re/6452ULMS (you've probably corrected that mistake already, haha, but maybe someone else will find it useful)



Re: Search-by-Distance-SMP

Reply #37
You found a better solution, thanks for those scripts for CUI :)

''Btw @Koshingg , why does that masstagger script provide both an initial key and a key tag when you already have a key tag? (in fact it gets cleared and replaced with ?)  ''
It's great that you found that error. Here is the new version without that error (and with Initial Key) tag : http://sendanywhe.re/T5I5KNLW Ok, now I'll explain why the script provides an Initial key tag too, haha . Actually is a hidden bonus, for those that maybe use this plugin https://getmusicbee.com/forum/index.php?topic=24631.0 for Musicbee, that tag is needed for that plugin to work. I used MusicBee a few years ago, for one year, I still have that configuration so I thought : hmmm, let's add this tag too, who knows what might happen in the future, hahaha, what if foobar goes x64 and many components will not work ? :)
Anyway, the final version of the script, it adds only camelot notation in Key tag (Initial key tag it's not present anymore): http://sendanywhe.re/6452ULMS (you've probably corrected that mistake already, haha, but maybe someone else will find it useful)



Didn't know that plugin. Seeing what it does, it's pretty similar (but limited to a subset of tags and features). Musicbee is a great program btw and has many built-in features that foobar misses (or only found on plugins).

You can pretty much replicate its behavior by setting style, date and other tag weights not used to zero. Key weight can be set to zero (so it doesn't look for similar keys), and enabling harmonic mixing on search by distance buttons (properties or custom one). Thus it will only use BPM, genre, energy (you can set it as a custom tag) and keys (only for harmonic mixing). The method may be set to graph to allow a more variate list of related genres, instead of using simple matching.

Only thing left is rating, but you can use global forced query to discard 1 or 2 rated tracks. (that's the default query in fact). I'm not sure rating should be added in any other way... since it would clearly favor high rated tracks instead of using all above the limits set.

Finally, those settings can be saved as a preset (recipe) to easily switch functionality when needed. I will add that recipe in next release. Feel free to suggest other mixes ideas, I perfectly know the "main weakness" of these scripts is their complexity (also its strength since they can  be fine tuned to do anything), so more examples and recipes will be welcomed by many.

Will check the masstagger scripts again, thanks :)

Re: Search-by-Distance-SMP

Reply #38
Just updated the custom buttons to show the current value on the menus (no need to click on them or open properties).
It also shows the value if set(forced) by the recipe. Also added a submenu for the weights and ranges (not available previously).
Replace file 'buttons_sbd_menu_config.js' at 'helpers' with the one provided to update.

X

Also added the mentioned recipe 'LikeADJ (MusicBee).json'. Install it on 'presets\Search by\recipes\' so it gets automatically shown on the recipe list within foobar.

All this will be added to the repository when I update it.

EDIT: Btw if you know what 'Energy' is I would appreciate it. Mixed in Key offers that tag, but I don't have the software. As far as I have seen it relates to danceability. So chill is 0. Since I strongly prefer open source solutions, musicBrainz offers some high level data similar to that.
https://essentia.upf.edu/svm_models/accuracies_v2.1_beta1.html
In particular danceability and moods (relaxed/party)

And low level data:
https://essentia.upf.edu/reference/streaming_Danceability.html

Re: Search-by-Distance-SMP

Reply #39
Well, it seems they're 2 different things :
Danceability: Describes how suitable a track is for dancing based on a combination of musical elements including tempo, rhythm stability, beat strength, and overall regularity.
Energy: Represents a perceptual measure of intensity and activity. Typically, energetic tracks feel fast, loud, and noisy. High-Energy tracks have increased entropy, and tend to feel fast, loud, and noisy. For example, death metal has high energy, while a Bach prelude scores low on the scale.
Mixed in Key adds the value for Energy from 1 to 10 (AFAIK it's the only software to do that, maybe that has changed lately, I didn't checked in the last 1-2 years) ,But some people add that value manually, values are added from 1-5.

I have these errors for Search by distance and Playlist Manager (even using the dev build for SMP, WINDOWS 10, latest stable version of foobar)
Error: Spider Monkey Panel v1.5.2-dev+327ba5dc ({311F3B08-764E-4315-8AB1-BF3F99B97668})
include failed:
Path does not point to a valid file: helpers\buttons_xxx.js

File: <main>
Line: 35, Column: 2
Stack trace:
  @:35:2

Error: Spider Monkey Panel v1.5.1 (Playlist Manager: Playlist Manager v0.2 by XXX)
include failed:
Path does not point to a valid file: helpers\helpers_xxx.js

File: <main>
Line: 27, Column: 1
Stack trace:
  @:27:1

Error: Spider Monkey Panel v1.5.2-dev+327ba5dc (Playlist Manager: Playlist Manager v0.2 by XXX)
include failed:
Path does not point to a valid file: helpers\helpers_xxx.js

File: <main>
Line: 27, Column: 1
Stack trace:
  @:27:1

Should I report this to SMP thread? Probably I should since I have another error from this component caused by other scripts (Biography , Library Tree)

Also, it seems I can't remap the key tag. I made a gif for you, http://sendanywhe.re/SBJKBHJ5 maybe you see where the problem is.
I tried to remap the key tag with : INITIALKEY or INITIAL KEY, but it doesn't work

"Feel free to suggest other mixes ideas"
Ok, I will, maybe not necessary ideas about mixes , but just a few ideas about various things
Nice to see that recipe 'LikeADJ (MusicBee) in Foobar too, haha.

Hmm, I remembered something.....
There is a way to get Energy tag (and other tags) but you have to do it manually
You need Spotify (free account, so you don't have to pay anything). Unfortunately we don't have this https://getmusicbee.com/addons/plugins/306/musicbeesynctoservice/  (Maybe someone can do it, I know there is a Spotify plugin for Foobar, but it's only for Premium users, and I don't think it can synchronize playlists ,from foobar to Spotify and from Spotify to Foobar.) But we can use this https://www.tunemymusic.com/#step1 (you can export a foobar playlist and then you can import that playlist in Spotify.
Then we can import that playlist from Spotify , here http://organizeyourmusic.playlistmachinery.com/#
Now, in Foobar (in that playlist that we have exported), we can add values (manually) to these tags :
Year
Genre
BPM
Energy
Danceability
Loudness (dB)
Liveness
Valence
Acousticness
Speechiness
Popularity
Maybe there is a possibility to do it automatically ? Manually it's obviously not ideal, maybe for a few playlists ...

Some links, maybe they're useful:
https://www.rcharlie.com/spotifyr/
https://www.kaylinpavlik.com/classifying-songs-genres/
https://towardsdatascience.com/what-makes-a-song-likeable-dbfdb7abe404
https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-audio-features
http://www.playlistmachinery.com

Btw, if you didn't downloaded those scripts for masstagger because the links have expired, you can download both of them from here http://sendanywhe.re/APATMI1Y




Re: Search-by-Distance-SMP

Reply #40
That's the relative path bug... already reported at SMP. I can't do anything but revert the change to absolute paths until @TheQwertiest gives us an answer.

Quote
Danceability: Describes how suitable a track is for dancing based on a combination of musical elements including tempo, rhythm stability, beat strength, and overall regularity.
Energy: Represents a perceptual measure of intensity and activity. Typically, energetic tracks feel fast, loud, and noisy. High-Energy tracks have increased entropy, and tend to feel fast, loud, and noisy. For example, death metal has high energy, while a Bach prelude scores low on the scale.
Mixed in Key adds the value for Energy from 1 to 10 (AFAIK it's the only software to do that, maybe that has changed lately, I didn't checked in the last 1-2 years) ,But some people add that value manually, values are added from 1-5.
On the other hand, they can be perfectly similar without knowing how energy it 's really calculated hahahaha I mean, even if the descriptions are "different", I would think both variables match for the examples you gave. In fact the one at essentia is also a scale.
https://essentia.upf.edu/reference/std_Danceability.html

In fact according to their patent they may be equivalent:
https://patents.justia.com/patent/8865993

If you are interested on test it, I could give you a set of samples tagged with Danceability values to analyze them in mixed in key. If there is correlation, I could support both as equivalent variables. (in its own variable, instead of using the custom one for the user)

Quote
Also, it seems I can't remap the key tag. I made a gif for you, http://sendanywhe.re/SBJKBHJ5 maybe you see where the problem is.
I tried to remap the key tag with : INITIALKEY or INITIAL KEY, but it doesn't work
Oh! You are mixing scripts hahahaha Ok... this script is the left one. What you configure there obviously only works there!
You are talking about Playlist Tools (so you would have to write that at its thread). Key tag is hard-coded there yep, forgot to change that. In fact, in no way (even it they were the same script) it could work as you did... 2 panels can not share their config and they should not! (it could be done but I see no reason to do that, since it's up to you how you want to config different panels). Also note they are 2 different things with different aims. Using harmonic mixing with Playlist Tools just remixes the current playlist. Search by Distance creates a new playlist using a complex algorithm exactly like the links you provided.

I thought you were using the custom search by distance buttons to create playlists by similarity, obviously, and there it works (it also has an harmonic mix method).

Also a question, why are you adding those buttons in 3 panels? you can merge them in one (see tooltip at background).
And... why don't you add the bar to the top? If you rigth click on the top bar you can add a SMP panel as a toolbar ;)

Note that I created a framework to have a buttons bar, but that doesn't mean that a config set at a button applies to the other buttons. This is by design, you must configure each tool separately (even if they are in the same panel). Being in different panels applies the same.

Spoiler (click to show/hide)

Re: Search-by-Distance-SMP

Reply #41
Now, in Foobar (in that playlist that we have exported), we can add values (manually) to these tags :
Year
Genre
BPM
Energy  -> previous comment
Danceability -> previous comment
Loudness (dB) -> replay gain does that (see my UI scripts at presets)
Liveness
Valence -> these are moods, picard (essentia) gives them
Acousticness -> with a % picard (essentia) gives it too. BUT I find it better to simply look for an Acoustic tag/mood. Not a percentage. This is already done on Search by Distance.
Speechiness -> with a % picard (essentia) gives it too. BUT I find it better to simply look for an Instrumental tag/mood. Not a percentage. This is already done on Search by Distance with an additional logic to scatter instrumental tracks.
Popularity -> last fm popularity?
Maybe there is a possibility to do it automatically ? Manually it's obviously not ideal, maybe for a few playlists ...

In any case, you can add those tags to the custom tag. BUT I have to think about adding more, since some of them are more valuable in Spotify than here. Spotify suggests new -meant to be popular- songs, this plugin creates a playlist by similarity. I'm not gonna suggest a song everybody should like according to a predefined variable (that's precisely what I dislike about online players hahahaha), but only suggest songs similar to the ones you selected. In that sense a "popularity" variable is useless to me, although I know many people love playing the most popular songs according to a chart.... there is Find & Play by @WilB  for that.

I could add more low level data though, but I already think most users are not even using 30% of the capabilities of this script... lets not talk about adding more! (this doesn't equal to a "No", but it's not a priority since probably I will be the only one using it)

AcousticBrainz Tags
Quote
Tag files with tags from the AcousticBrainz database, all highlevel classifiers and tonal/rhythm data.

By default, only simple mood and genre information is saved, but the plugin can be configured to include all highlevel data.
AcousticBrainz Tonal-Rhythm
Quote
Add's the following tags:

    Key (in ID3v2.3 format)
    Beats Per Minute (BPM)

from the AcousticBrainz database.
https://picard.musicbrainz.org/plugins/

EDIT:
https://towardsdatascience.com/what-makes-a-song-likeable-dbfdb7abe404
For example that link you gave me exactly represents what I dislike about using data to predict what we like or how to "create a hit". It's like saying we like X because we listen to X thus we should create more tracks like X since we love X. Therefore, we continue listening to X and liking X. And so on... works, but makes zero sense to me. That's about music as a product, not about relations between different tracks, genres, etc. It's even more stupid when you think... hey if you wanted to tell me to do X because we love X, you didn't need at all to study the tracks with such detail. Just tell me to replicate the current 40 top charts and done.

Something similar happens with 'Similar artists' thing which works for occidental music but nothing more. And it only outputs the "most popular" artists because it's heavily based on popularity and user listening habits. I really dislike such biased approaches to music.

Re: Search-by-Distance-SMP

Reply #42
http://www.playlistmachinery.com/
You can do that with pools at playlist tools. And even use playlists as sources (see playlist manager integration). And that's why I say most people are not using even 30% of what I did hahahaha You have macros, pools and dynamic queries (evaluated with selection) at Playlist Tools, that should cover any imaginable thing you want to do to create your own mixes.

https://www.kaylinpavlik.com/classifying-songs-genres/
That's already done at Music Brainz, using machine learning and those features. Genre classification only has a 50-60% precision anyway. But it's there if you want it. No need to reinvent the wheel, and it's open source.

https://www.rcharlie.com/spotifyr/
That's something which may be useful for the spotify plugin, you could suggest it there.

EDIT: About the key thing at Playlist Tools
https://hydrogenaud.io/index.php?topic=120978.msg1000973#msg1000973

Re: Search-by-Distance-SMP

Reply #43
Just a small correction, you say Valence attribute is the same as moods which isn't fully correct. Based on Robert Thayer's mood classification model (Spotify uses this model, among others) mood classification is a combination of Valence in relation to Energy. Valence by itself doesn't say that much. High Valence with high energy means a very upbeat happy song while the same energy with low valence is a high stress/agressive song. Low Energy with low Valence is a sad song while a high valence and low energy song is a relaxing mood.
High valence by itself could both mean very upbeat and happy or just relaxing (and everything in between).

https://sites.tufts.edu/eeseniordesignhandbook/2015/music-mood-classification/

I manually tag my library using this model. I always use both attributes (Valance, Energy) on the same scale. The numbers I tag are coordinates plotted on an X-Y graph and depending on where the position of the coordinates fall I derive meaning from them ("moods", but it's a bit more abstract).

Re: Search-by-Distance-SMP

Reply #44
Well I didn't mean they are strictly the same (low level data), obviously, but I consider them a replacement (high level data). Specially since I was talking about usable open source data (since Spotify's data is not that).
Essentia cites a lot of research on that sense: https://essentia.upf.edu/research_papers.html

In fact none of the Essentiadata is strictly the same. Danceability in Spotify uses different scales and model than the one at Essentia. But I assume they are equivalent as long as you know in which model you are working and what you do with it.

Quote
I manually tag my library using this model. I always use both attributes (Valance, Energy) on the same scale. The numbers I tag are coordinates plotted on an X-Y graph and depending on where the position of the coordinates fall I derive meaning from them ("moods", but it's a bit more abstract).
How do you tag them manually?

Re: Search-by-Distance-SMP

Reply #45
it's rather simple, I use a masstagger script to tag and split (multivalue) series of numbers (usually 2 but can be up to 6 numbers). I bind that script to keyboard shortcuts (alt+numpad). The first number input is the X axis coordinate (Valence), the second number is the Y-axis coordinate (Energy). The scale goes from 1 to 7 (both axis). I created a map to visualize it for myself. On my config I have a panel that shows me this:


It gives me essentially 4 quadrants of "mood" variations. Left upper is high energy, low valence = unsettling, aggression (I colored this red). Right upper is high valence, high energy =upbeat and happy (yellow color). Left lower is somber, sad melancholy (blue color). Right lower high valence but low energy= generally relaxing.

Combinations are possible (max 3 sets of coordinates). I also have a masstagger script which translates the numbers into a normal mood tag. For now I just say either aggression, upbeat, relaxing, sad depending on in which quadrant the coordinate falls but in essence if I were to assign each separate coordinate a certain mood name I'd have 36 separate combinations. But I don't need to name them, I basically just look at the coordinates and immediately know how the song will feel. Example

3;6 : agressive but not extreme (heavy metal music for example)
1;7: very aggressive, very extreme (brutal death metal)
7;6 very upbeat and energetic (like the intro song from the movie La LA land)
6;2: positive sounding and relaxing (soft upbeat but relaxing reggae music)
1;2: basically a song that will make you cry

All is done with titleformatting because I know shit about coding. There are other aspects I include with this mood model but I'll stick to just explaining this. I too developed a method to easily create selections which groups songs based on genre, mood, song complexity, and era by just using "quicksearch for same". It's done in a more manual fashion and without sourcing data from the internet but it works for me  (and it's highly accurate). But I do admire what you're doing.

Re: Search-by-Distance-SMP

Reply #46
That looks interesting although it's a nightmare to tag an entire library manually if you start from scratch! I have done that for genre/styles instead of using online tags, since they are mostly a joke. The graph is the natural representation of a proper genre map as a result . I used MusicBrainz for mood tagging since it has an accuracy over 90%, so it's fine for me. Then I manually re-tag any obviously wrong track on playback from time to time.

You can use your method with these scripts too (don't think they require at all internet sourced tags) as long as you have genre/style tags. You can even use those numeric tags as the custom num tag, so it works with your tagging method. (or using the mood tag if you translate your values into moods with masstagger first)

I know 'the quicksearch for same 'component. An improvement over that is that this one doesn't use queries, but assigns an score similarity. Queries are too restrictive (although they work) because tracks are either in or out of your group. An scoring allows you to fine-tune the degree of similarity. Then there are a dozen of other features which can be used to create the playlist, while the query approach just outputs all matches.

Btw at Playlist Tools you have tools which use queries too. In fact, probably you would be more interested on them. There are dynamic queries (its 100% equal to Quicksearch for same functionality but allows more advanced queries like multitags, multiple expressions, etc.). and queries combinatory. Let's say you want any track which must match at least 3 of these: Sad, Acoustic, Rock, Instrumental, key Abm:. Doing that manually is not feasible (a combination of queries takes easily 10 lines as soon as you have +3 elements) and it's out of scope for quicksearch component. You have it in the Playlist Tools button an also as an independent configurable button.

X


Re: Search-by-Distance-SMP

Reply #47
Have simplified the code of the masstagger key presets since they had another problem, they removed already existing tags (since it used some of them as intermediate values). Now they give only one tag per script (a new one or a replacement) and don't remove any other.

There are 3 versions now:
- Standard notation to Camelot notation. key (*) -> %KEY%
- Standard notation to Camelot notation. key (*) -> %INITIAL KEY%  (recreates new tag, like Mixed in Key)
- Camelot notation to Standard notation. key (*) -> %KEY%  (the reverse of the previous ones)

(*) key at left will use any of these as sources: %INITIAL KEY%, %INITIALKEY%, %KEY_START%, %KEY%, %KEY_CAMELOT%, %KEY_OPENKEY%

In any case, the other tags are not touched at all and will be left as is. Also note these presets are NOT NEEDED at all for the SMP scripts since the translation is done automatically on the code. Neither to show the translated values at UI.  Just sharing them for other uses. They will be present on the repository at '.\presets' folder.

PD: Back to this SMP script, I will add open key support on next releases too, translating internally that notation to camelot keys. Obviously it will be ported to Playlist Tools too for harmonic mixing. Finally, I will add 4 more masstagger presets to translate standard keys and camelot keys to open keys and back. And edit the UI presets to also support open key notation.

Re: Search-by-Distance-SMP

Reply #48
"Oh! You are mixing scripts hahahaha "
haha, yes, somehow I managed to do that. But at least the little problem is solved now, the tag key it's not hard-coded anymore , in Playlist Tools

''Also a question, why are you adding those buttons in 3 panels? you can merge them in one (see tooltip at background).
And... why don't you add the bar to the top? If you rigth click on the top bar you can add a SMP panel as a toolbar''

That wasn't my main foobar configuration, it's just a portable foobar for testing. I have the scripts in my main foobar config. too and I was thinking to add a new tab (because it's not ideal how they are placed now) with your scripts, and a few other things for manual tagging, all in one place

 "I could give you a set of samples tagged with Danceability values to analyze them in mixed in key''
regor , I don't have mixed in key

"For example that link you gave me exactly represents what I dislike about using data to predict what we like or how to "create a hit....hey if you wanted to tell me to do X because we love X, you didn't need at all to study the tracks with such detail. Just tell me to replicate the current 40 top charts and done"

haha, I agree with you, I just sent those links in the eventuality that maybe you'll find something interesting

"AcousticBrainz Tonal-Rhythm"
Thanks about the tip , I already had that plugin BUT I didn't noticed those settings (about highlevel tags)

"most people are not using even 30% of what I did hahahaha You have macros, pools and dynamic queries''

I think you're right, I didn't used macros and pools until now, but I will , I also added a few dynamic queries. But it's very very good that options do exist, people have different needs .  I'll use much more than 30% :)

For those interested to add ENERGY, DANCEABILITY, ACOUSTICNESS, INSTRUMENTALNESS, LIVENESS, SPEECHINESS, VALENCE and AUDIO_FEATURES ( for ex. #dynamics-med; #energy-high; #vocal-high; #neutral), there is another option ( Picard can do this too, and a bit more, as regor said) : https://onetagger.github.io/#download
I'm not saying it's better than Picard but strictly for adding these tags it seems it does a better job, it's faster.

regor, I didn't said you should or you shouldn't add more low level data (as you said the scripts are already complex), just that it's fun to have more data in your tags, haha. Those tags can be used with dynamic queries (Playlist tools), or for example a very simple use, just sort a playlist after Danceability (or other tag) , from the highest value to the lowest. Obviously they're not 100% accurate (the same happens for Key, or BPM)





Re: Search-by-Distance-SMP

Reply #49
regor, I didn't said you should or you shouldn't add more low level data (as you said the scripts are already complex), just that it's fun to have more data in your tags, haha. Those tags can be used with dynamic queries (Playlist tools), or for example a very simple use, just sort a playlist after Danceability (or other tag) , from the highest value to the lowest. Obviously they're not 100% accurate (the same happens for Key, or BPM)
Glad it's solved. I will upload the latest changes to the repositories, although most people seem to have problems due to the SMP bug so...

As you noted, you can use any arbitrary tag on Playlist Tools for queries, whether you use dynamic queries, standard queries, sorting or Search same by. And save those entries for later use. My concerns are about adding them at this particular script since it must comply with some open source data standard, and those tags must be easily retrievable by other users. That's why I have limited the subset of 'exotic' tags to BPM, KEY, MOODS which can be retrieved by picard, but also by Bio script, multiple DJ software, etc.

Arbitrary tags may be added to the 2 custom fields by anyone. Also multiple tags may be merged into one slot. So if you want to use those arbitrary tags as 'moods' you can simply set Moods -> Moods,Valence,Danceability. It works the same, no need to create an additional slot. Only consideration: string slots must use string tags. Numeric slots must use numeric tags.

Now, the last program you linked finally appears to be a real alternative/complement to Picard and AcousticBrainz data.... so I will study its use, how tags are being added, etc. and If I found it in line with the rest, I would gladly implement those other tags. Have to check if it needs Spotify installed, since I would need to bypass that limitation because I don't have an account.

On the other hand, those are 'intermediate' level data because they are neither final tags (Acoustic, Instrumental, ...) nor low level data so some considerations must apply here. Otherwise I would be duplicating work and results: if you already use Acoustic as a genre tag and/or moods (picard), it makes no sense to also check for Acousticness since both give you the same info. It would make tracks with the 3 tags being more similar than they are, since I would be adding a score to the 3 features. In other words, it would require either the user having to choose between 2 models (AcousticBrainz vs Spotify) or discarding some features if others are present (and that's really complicated). (*)

(*) I would have to check for things like if a track is using Instrumental genre/mood tag, then Instrumentalness = 100%. But only one of them should be scored. And finally another track may have Instrumentalness but not the other tags, so I would have to compare the previous virtual tag to it... and it easily becomes a mess.