Ric*_*uez 11 javascript music-notation
我想知道如何创建一个用于转置音乐和弦的javascript函数.
由于我不希望每个人都成为这里的音乐家,我会试着解释它在音乐理论中是如何运作的.我希望我不要忘记一些事情.如果是的话,请音乐家纠正我.
1)简单的和弦
简单的和弦几乎和字母一样简单,它是这样的:
C,C#,D,D#,E,F,F#,G,G#,A,A#B
从B开始它再次循环到C.因此,如果原始和弦是E并且我们想要转置+1,则产生的和弦是F.如果我们转置+4,产生的和弦就是G#.
2)扩展的和弦
它们几乎像简单的和弦一样工作,但包含更多的字符,在转置时可以安全地忽略它们.例如:
Cmi,C#7,Dsus7,Emi,Fsus4,F#mi,G ......
再次,就像简单的和弦一样,如果我们转置Dsus7+ 3 =Fsus7
3)非根低音
当低音演奏与和弦根音不同的音调时会出现问题.这是以和弦后的斜线为标记,也需要调换.例子:
C/G,Dmi/A,F#sus7/A#
与示例1和示例2一样,一切都是相同的,但是斜杠之后的部分也需要转置,因此:
C/G + 5 = F/C
F#sus7/A# + 1 = Gsus7/B
我认为这应该是全部,除非我忘记了什么.
所以基本上,假设你有一个调用的javascript变量chord和转置值transpose.什么代码会转换和弦?
例:
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';
Run Code Online (Sandbox Code Playgroud)
nnn*_*nnn 10
有点像这样的东西:
function transposeChord(chord, amount) {
var scale = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
return chord.replace(/[CDEFGAB]#?/g,
function(match) {
var i = (scale.indexOf(match) + amount) % scale.length;
return scale[ i < 0 ? i + scale.length : i ];
});
}
alert(transposeChord("Dm7/G", 2)); // gives "Em7/A"
alert(transposeChord("Fmaj9#11", -23)); // gives "F#maj9#11"
Run Code Online (Sandbox Code Playgroud)
请注意,我投入了"F#maj9#11"示例,只是为了让您更多地考虑有关构成有效和弦名称的内容:您可能会发现一个不符合字母的"#"尖锐符号(在这种情况下,它属于"11").
并且,显然,我的函数只能理解锐利,而不是平面,并且不理解键,因此,例如,transposeChord("C/E", 1)当它真的应该是"C#/ E#"时会给出"C#/ F".
只是为了扩展 nnnnnn 的答案。我们可以采用他的代码并添加更多代码以使其真正适用于平面。
transposeChord("F#sus7/A#", 1)
> "Gsus7/B"
transposeChord("Bb", 1)
> "B"
... works like a charm
Run Code Online (Sandbox Code Playgroud)
transposeChord("F#sus7/A#", 1)
> "Gsus7/B"
transposeChord("Bb", 1)
> "B"
... works like a charm
Run Code Online (Sandbox Code Playgroud)
function transposeChord(chord, amount) {
var scale = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
var normalizeMap = {"Cb":"B", "Db":"C#", "Eb":"D#", "Fb":"E", "Gb":"F#", "Ab":"G#", "Bb":"A#", "E#":"F", "B#":"C"}
return chord.replace(/[CDEFGAB](b|#)?/g, function(match) {
var i = (scale.indexOf((normalizeMap[match] ? normalizeMap[match] : match)) + amount) % scale.length;
return scale[ i < 0 ? i + scale.length : i ];
})
}Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4531 次 |
| 最近记录: |