我想写一个算法,建立一个给定的八度转换到下一个八度,如果不是所有可能的音符都涵盖正常的3键钢琴和弦的进展例如:
Cmaj键将给出它前进过程中的所有音符/和弦,因为起始音符是八度音阶的开始,它将在下一个C结束。但是如果我从同一个八度音阶的B音符开始,它也将在下一个八度音阶中以B结尾。
我想建立这两个主要和小规模的能力,以扩大它为7和9型和弦在未来。
这不是家庭作业,我想用c,然后用f重新写一遍,以便多学一点这门语言。
编辑:
我的问题是:
八进制(C到C):linkedList列表应该使用什么数据结构,或者这可能需要完全不同的结构?
编辑2:
所以如果我们像这样索引笔记,我不确定它是否是正确的方法:
0 1 2 3 4 5 6 7 8 9 10 11 12
Input: Note = C (0), Scale = Maj
Output: 0 4 7, 2 5 9, 4 7 12, etc.

最佳答案

或许,最简单的建模方法是使用midi note mapping的概念,因为键是枚举的,并且从给定根开始的第一个反转三元组是

root, root + 4, root + 7

下一个反转是
root + 4, root + 7, root + 12

下一个反转是
root + 7, root + 12, root + 16

其中root是根的MIDI音符编号。
事实上,给定一个和弦在第一个反转中,通过删除第一个条目,将其放在最后并加上12来生成所有其他的反转是很简单的。所以你的和弦看起来真的是这样的:
public int GetChord(ChordName chord)
{
    switch (chord) {
    case ChordName.Major: return new int[] { 0, 4, 7 };
    case ChordName.Minor: return new int[] { 0, 3, 7 };
    case ChordName.Augmented: return new int[] { 0, 4, 8 };
    case ChordName.Dominant7: return new int[] { 0, 4, 7, 10 };
    case ChordName.Maj7: return new int[] { 0, 4, 7, 11 };
    // etc
 }

然后,无论从这里返回什么(可能使用list会更好),您都可以编写一个返回每个逆的IEnumerable。然后将根的值添加到输出和ta da你有你的和弦,现在非常容易输出,以及,midi。
public int[] InvertChord(int[] chord)
{
    int[] inversion = new int[chord.Length];
    for (int i = 1; i < chord.Length; i++) {
        inversion[i-1] = chord[i];
    }
    inversion[inversion.Length-1] = chord[0] + 12;
    return inversion;
}

public int[][] ChordAndAllInversions(int[] chord)
{
    int[][] inversions = new int[chord.Length][];
    inversions[0] = chord;
    for (int i=1; i < chord.Length; i++) {
        inversions[i] = InvertChord(inversions[i - 1]);
    }
    return inversions;
}

关于c# - 您将如何编程钢琴 Octave 音阶?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4454728/

10-11 12:06