正则表达式查询或音乐转置功能

时间:2018-02-08 01:36:18

标签: javascript regex audio

我正在创建一个功能,根据以度数写的进展来显示正确的音乐和弦。

我有这个功能:

    function transpose(accord, tonOrg, tonDest) {
var scales = {  
"GammeDeg": ["I", "II", "III", "IV", "V", "VI", "VII", "#I", "#II", "#III", "#IV", "#V", "#VI", "#VII", "bI", "bII", "bIII", "bIV", "bV", "bVI", "bVII", "*I", "*II", "*III", "*IV", "*V", "*VI", "*VII", "bbI", "bbII", "bbIII", "bbIV", "bbV", "bbVI", "bbVII"],
"GammeC": ["C", "D", "E", "F", "G", "A", "B", "C#", "D#", "E#", "F#", "G#", "A#", "B#", "Cb", "Db", "Eb", "Fb", "Gb", "Ab", "Bb", "C*", "D*", "E*", "F*", "G*", "A*", "B*", "Cbb", "Dbb", "Ebb", "Fbb", "Gbb", "Abb", "Bbb"],
"GammeG": ["G", "A", "B", "C", "D", "E", "F#", "G#", "A#", "B#", "C#", "D#", "E#", "F*", "Gb", "Ab", "Bb", "Cb", "Db", "Eb", "F", "G*", "A*", "B*", "C*", "D*", "E*", "F#*", "Gbb", "Abb", "Bbb", "Cbb", "Dbb", "Ebb", "Fb"],
"GammeD": ["D", "E", "F#", "G", "A", "B", "C#", "D#", "E#", "F*", "G#", "A#", "B#", "C*", "Db", "Eb", "F", "Gb", "Ab", "Bb", "C", "D*", "E*", "F#*", "G*", "A*", "B*", "C#*", "Dbb", "Ebb", "Fb", "Gbb", "Abb", "Bbb", "Cb"],
"GammeA": ["A", "B", "C#", "D", "E", "F#", "G#", "A#", "B#", "C*", "D#", "E#", "F*", "G*", "Ab", "Bb", "C", "Db", "Eb", "F", "G", "A*", "B*", "C#*", "D*", "E*", "F#*", "G#*", "Abb", "Bbb", "Cb", "Dbb", "Ebb", "Fb", "Gb"],
"GammeE": ["E", "F#", "G#", "A", "B", "C#", "D#", "E#", "F*", "G*", "A#", "B#", "C*", "D*", "Eb", "F", "G", "Ab", "Bb", "C", "D", "E*", "F#*", "G#*", "A*", "B*", "C#*", "D#*", "Ebb", "Fb", "Gb", "Abb", "Bbb", "Cb", "Db"],
"GammeB": ["B", "C#", "D#", "E", "F#", "G#", "A#", "B#", "C*", "D*", "E#", "F*", "G*", "A*", "Bb", "C", "D", "Eb", "F", "G", "A", "B*", "C#*", "D#*", "E*", "F#*", "G#*", "A#*", "Bbb", "Cb", "Db", "Ebb", "Fb", "Gb", "Ab"],
"GammeF#": ["F#", "G#", "A#", "B", "C#", "D#", "E#", "F*", "G*", "A*", "B#", "C*", "D*", "E*", "F", "G", "A", "Bb", "C", "D", "E", "F#*", "G#*", "A#*", "B*", "C#*", "D#*", "E#*", "Fb", "Gb", "Ab", "Bbb", "Cb", "Db", "Eb"],
"GammeC#": ["C#", "D#", "E#", "F#", "G#", "A#", "B#", "C*", "D*", "E*", "F*", "G*", "A*", "B*", "C", "D", "E", "F", "G", "A", "B", "C#*", "D#*", "E#*", "F#*", "G#*", "A#*", "B#*", "Cb", "Db", "Eb", "Fb", "Gb", "Ab", "Bb"],
"GammeG#": ["G#", "A#", "B#", "C#", "D#", "E#", "F*", "G*", "A*", "B*", "C*", "D*", "E*", "F#*", "G", "A", "B", "C", "D", "E", "F#", "G#*", "A#*", "B#*", "C#*", "D#*", "E#*", "F**", "Gb", "Ab", "Bb", "Cb", "Db", "Eb", "F"],
"GammeD#": ["D#", "E#", "F*", "G#", "A#", "B#", "C*", "D*", "E*", "F#*", "G*", "A*", "B*", "C#*", "D", "E", "F#", "G", "A", "B", "C#", "D#*", "E#*", "F**", "G#*", "A#*", "B#*", "C**", "Db", "Eb", "F", "Gb", "Ab", "Bb", "C"],
"GammeA#": ["A#", "B#", "C*", "D#", "E#", "F*", "G*", "A*", "B*", "C#*", "D*", "E*", "F#*", "G#*", "A", "B", "C#", "D", "E", "F#", "G#", "A#*", "B#*", "C**", "D#*", "E#*", "F**", "G**", "Ab", "Bb", "C", "D#", "Eb", "F", "G"],
"GammeF": ["F", "G", "A", "Bb", "C", "D", "E", "F#", "G#", "A#", "B", "C#", "D#", "E#", "Fb", "Gb", "Ab", "Bbb", "Cb", "Db", "Eb", "F*", "G*", "A*", "B#", "C*", "D*", "E*", "Fbb", "Gbb", "Abb", "Bbbb", "Cbb", ,"Dbb", ,"Ebb"],
"GammeBb": ["Bb", "C", "D", "Eb", "F", "G", "A", "B", "C#", "D#", "E", "F#", "G#", "A#", "Bbb", "Cb", "Db", "Ebb", "Fb", "Gb", "Ab", "B#", "C*", "D*", "E#", "F*", "G*", "A*", "Bbbb", "Cbb", "Dbb", "Ebbb", "Fbb", "Gbb", "Abb"],
"GammeEb": ["Eb", "F", "G", "Ab", "Bb", "C", "D", "E", "F#", "G#", "A", "B", "C#", "D#", "Ebb", "Fb", "Gb", "Abb", "Bbb", "Cb", "Db", "E#", "F*", "G*", "A#", "B#", "C*", "D*", "Ebbb", "Fbb", "Gbb", "Abbb", "Bbbb", "Cbb", "Dbb"],
"GammeAb": ["Ab", "Bb", "C", "Db", "Eb", "F", "G", "A", "B", "C#", "D", "E", "F#", "G#", "Abb", "Bbb", "Cb", "Dbb", "Ebb", "Fb", "Gb", "A#", "B#", "C*", "D#", "E#", "F*", "G*", "Abbb", "Bbbb", "Cbb", "Dbbb", "Ebbb", "Fbb", "Gbb"],
"GammeDb": ["Db", "Eb", "F", "Gb", "Ab", "Bb", "C", "D", "E", "F#", "G", "A", "B", "C#", "Dbb", "Ebb", "Fb", "Gbb", "Abb", "Bbb", "Cb", "D#", "E#", "F*", "G#", "A#", "B#", "C*", "Dbbb", "Ebbb", "Fbb", "Gbbb", "Abbb", "Bbbb", "Cbb"],
"GammeGb": ["Gb", "Ab", "Bb", "Cb", "Db", "Eb", "F", "G", "A", "B", "C", "D", "E", "F#", "Gbb", "Abb", "Bbb", "Cbb", "Dbb", "Ebb", "Fb", "G#", "A#", "B#", "C#", "D#", "E#", "F*", "Gbbb", "Abbb", "Bbbb", "Cbbb", "Dbbb", "Ebbb", "Fbb"]
};
var tonOrgGamme = scales["Gamme" + tonOrg];
var tonDestGamme = scales["Gamme" + tonDest];
var accordTranpose = accord.replace(/((("I"|"II"|"III"|"IV"|"V"|"VI"|"VII")#\*)|(("I"|"II"|"III"|"IV"|"V"|"VI"|"VII")#)|(("I"|"II"|"III"|"IV"|"V"|"VI"|"VII")b+)|(("I"|"II"|"III"|"IV"|"V"|"VI"|"VII")\**))/g, function(match) {
var i = tonOrgGamme.indexOf(match)
return tonDestGamme[i]
})
return accordTranpose
};

因此,如果我发送“I”以在C中转置,则该函数将返回C.如果我发送“V7”以在C中转置,则结果将为G7。我只希望改变罗马数字的程度,以及保持不变之后的任何东西,我不确定在Regex中写什么。

1 个答案:

答案 0 :(得分:0)

这不会很难。首先,您需要将用户输入解析为输入中的部分userKeySignatureuserChordQualityuserNashvilleNumber(您这样做)。接下来,找到和弦索引。但要做到这一点,你首先需要获得密钥,纳什维尔数字(罗马数字)找出实数,从零开始。

获得该实数后,keys对象/数组结构将更容易获得所需和弦的根。

let keys = {
  c: ['c', 'd', …]
};

如果您可以"C"作为用户选择的密钥,则可以使用keys[userSelectedKey.toLowerCase()]

接下来,您需要从纳什维尔号码中找到和弦名称。这有两个问题。首先,纳什维尔数字是罗马数字。第二个问题是它是基于一个的,而不是从零开始的(数组是从零开始的)。但是我们可以通过使用对象或数组来解决这个问题。我在这里使用了数组。

let nashvilleNumbers = ['I', "II", "III", "IV", "V", "VI", "VII"];

接下来,找到和弦索引:

var chordIndex = nashvilleNumbers.indexOf(userNashvilleNumber);

现在您知道数组中的和弦位置,您只需要选择键,但是您已经从userKeySignature解析并检查了它,对吗?

  var selectedKey = keys[userKeySignature];
  var selectedRoot = selectedKey[chordIndex];

输出应为selectedRoot + userChordQuality;

始终验证用户输入。此代码不完整。