I was wondering how would one create a function, in PHP, which is used for transposing some music chords.
I will try to explain how it works in music theory. I hope I don't forget something. If there are some mistakes, please help me to correct it.
1. The simple chords.
The simple chords are almost as simple as an alphabet and it goes like this:
C, C#, D, D#, E, F, F#, G, G#, A, A# B
From B it loops all over again to C. Therefore, If the original chord is E
and we want to transpose +1, the resulting chord is F
. If we transpose +4, the resulting chord is G#
.
2. Expanded chords.
They work almost like the simple chords, but contain a few more characters, which can safely be ignored when transposing. For example:
Cmi, C#7, Dsus7, Emi, Fsus4, F#mi, G ...
So again, as with the simple chords, if we transpose Dsus7
+ 3 = Fsus7
3. Non-root bass tone.
A problem arises when the bass plays a different tone than the chord root tone. This is marked by a slash after the chord and also needs to be transposed. Examples:
C/G, Dmi/A, F#sus7/A#
As with examples 1 and 2, everything is the same, but the part after the slash needs transpose too, therefore:
C/G
+ 5 = F/C
F#sus7/A#
+ 1 = Gsus7/B
So basically, imagine you have a PHP variable called chord
and the transpose value transpose
. What code would transpose the chord?
Examples:
var chord = 'F#sus7/C#';
var transpose = 3; // remember this value also may be negative, like "-4"
... code here ...
var result; // expected result = 'Asus7/E';
I have found an existed question on StackOverflow, at here. They talk about algorithm for chord-progressions.
How do I transpose music chords with PHP, by increasing or decreasing by semitones?