在和弦进程中计算吉他和弦最舒适的手指位置

时间:2017-09-26 17:22:35

标签: javascript node.js guitar music-notation

我想计算用不同的“指法”(例如开弦,和弦和弦)演奏特定和弦进行是多么有趣。

例如,如果我们有和弦进程G D Em C。对于大多数人来说,最舒适的玩法可能就像开放的和弦一样:

G D Em C

如果我们的和弦进程包括一个在标准调音中不能作为开放和弦的和弦,那就不再那么简单了。

例如E C#m G# A
E C#m G# A

在这种情况下,我们有

  • C#m在Am形状的第4个音品上演奏。
  • G#关于G形的第一个音品。

我选择的图表显示了一种非常不舒服的“手指”和弦的方式:以G形状演奏的和弦通常非常不舒服;许多“跳跃”(open => 4th fret => 1st fret => open)

A(在我看来)更舒服的方式是:

E C#m G# 2 A 2

可以说打开A可能更容易。特别是如果序列连续多次播放。

我想说的是,在计算最舒适的指法时,有很多因素需要考虑。并且有些情况归结为个人偏好 但我认为在某些情况下,大多数吉他手会同意某些指法会更舒适。

我不确定我要求的是什么。我现在拥有的是a big library of guitar chords that includes finger positions

我说我的问题是:我需要一种公式,我需要合理的数字来表示大多数吉他手可以达成一致的公式中的因素。 (例如,G形barre比Em形状的barre更不舒服;超过15个音品的和弦开关比2个音品上的和弦开关更不舒服;等等。)

1 个答案:

答案 0 :(得分:1)

公平警告:我不是吉他手:)

也许你可以通过和弦列表进行迭代并为每个和弦分配一种“得分”,允许你从最高“得分”到最低订单。例如,如果给定的和弦有一个G形条纹,则在其得分上加10,但如果它有一个Em形状,则只加5。或者,如果它有超过15个音符的和弦开关,则减去15个点,但只减去如果涉及2个音品等2点

换句话说,每个和弦都被赋予了具有理想品质的分数,最舒适的和弦最终得分最多。

一些伪代码:

// I saw that your library has `chords` as an object, so I will try to work with that
var chords = {/*...*/};

for (chord of chords) {
  chord.points = 0;

  // This is where you investigate the chord, awarding points for desirable qualities.

  // I suppose the chord's can be somehow determined from the fingering, but your the guitarist, not me! :)

  if (chord.shape == 'G') {
    chord.points += 10;
  } else if (chord.shape == "Em") {
    chord.points += 5;
  }

  chord.points -= chord.numberOfFrets;
  // or, if # of frets should be weighted more heavily,
  chord.points -= 100 * chord.numberOfFrets;

}

// now we can rank the chords by score

var rankedChords = Object.keys(chords).sort((a,b) => chords[a].score - chords[b].score);

你的算法可能从基础开始,但是当你想到用数字排序和弦的方法时,你的结果会变得更有意义。 这听起来像一个整洁的项目,所以我希望它适合你!