- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想知道如何创建一个用于移调音乐和弦的 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
我想应该就这些了,除非我忘记了什么。
基本上,假设您有一个名为 chord
的 javascript 变量和转置值 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';
最佳答案
像这样的小东西怎么样:
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"
请注意,我加入“F#maj9#11”示例只是为了让您更多地思考什么构成了一个有效的和弦名称:您可能会发现一个“#”尖锐的符号没有跟在后面一封信(在本例中它属于“11”)。
而且,显然,我的函数只理解升号,不理解降号,并且不理解键,因此,例如,transposeChord("C/E", 1)
将给出“C#/F "而实际上应该是 "C#/E#"。
关于javascript - 如何使用 JavaScript 移调音乐和弦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7936843/
我使用Andrew的d3和弦图示例并希望将弯曲切片内的所有文本标签居中。我尝试了很多东西,但始终无法将文本居中。你知道需要什么巫师技巧吗? var width = 720, height = 720,
我正在尝试实现一个系统,在该系统中我可以同时播放一组频率,目前可以单独播放每个频率。下面我有一个代码,它播放给定的频率,一次播放一个。 import java.applet.*; im
是否可以一次重新映射使用 ctrl+k 作为第一个按键操作的所有和弦? 我使用 ctrl+k 删除该行的其余部分。由于它与 vscode 中使用的最常见和弦冲突,因此通过快捷方式重新映射快捷方式会很不
我是一名优秀的程序员,十分优秀!