I'm trying to find a way to extract the key from the file name, bypassing all min/maj characters (case insensitive), but allowing # and b.
A couple of file name examples:
sample_F_one_shot.wav
sample_oneshot_F#maj.wav
sample_Ab_one_shot.wav
An example of what the result should look like:
A; B; C; D; E; F; G
and their combinations with # and b.
Here are the basic rules:
- The key is not case sensitive and can be written in small or capital letters.
- The key is not at the beginning of the file name.
- The key can be in brackets: "()"; "[]".
- There may be signs before the key: ""; ""; "."; " "; "space"; "-"; "--"; "*"; "-".
- After the key there may be signs: ""; ""; "."; " "; "space"; "-"; "--"; "*"; "-"; ".wav"; ",aif"; ".rx2".
- There cannot be letters before the key.
- There cannot be numbers before the key.
- After the key there may be numbers: “C1”; "F#2" - numbers must be cut off.
- Possible options with: "#maj"; "#Maj"; "#min"; "#Min"; "#m" - everything after "#" should be cut off
I came up with a 2 step system using [regexp]. In the first step I find the key with symbols around it, for example: F; .F.; [F]; F#; _F#maj; and so on...
Something like:
"regexp (?:[^a-gA-G#b]|^)([A-G](?:#|b)?(?:m(?:in(?:or)?)?|M(?:aj(?:or)?)?))(?:[^a-zA-Z#bd]|$)"
The second step is to simply get rid of all the characters, leaving only # and b in the key using another [regexp].
Problem: In the first step I am unable to achieve high accuracy in isolating the key with symbols.
Question: Perhaps there is an easier way to do this?
I think I'm confused about this. I also tried to do this using ChatGPT and it seems to be the best option I got, but it is not entirely accurate.
In the examples, the keys you want to extract appear to be surrounded by
_or.. The keys have the form: A singleA-Foptionally followed by eitherbor#or#maj. You also mentioned 'min', so let's include that too.A regexp for that would be:
That exactly follows the description above:
_or.(or start of input),A..Fbor#or#major#min,.or_(or the end of input).