用于存储和弦进行规则的数据结构?

Mic*_*per 7 language-agnostic data-structures

在数据结构中表示各种和弦进程(音乐)规则的最合适(自然适合)的方式是什么,这样每个和弦都有一组可以进展的加权选项?

这个数据结构将以一种你可以编码的方式在程序音乐生成程序中实现:(与语言无关的伪代码)

Chord[7] songArray;

Chord first = new Chord(I); //set the first chord's value

songArray[0] = first;

for (i=0; i<7; i++){
    Chord temp = songArray[i].next();   //select the following chord
    songArray[i+1] = temp;
}
Run Code Online (Sandbox Code Playgroud)

注意:在古典型音乐中,给定键中的每个和弦可以按照以下规则自然地进入另一个和弦:

 ----------------------
| Chord | Leads to     |
|=======================
| I     | any          |
| ii    | V, vii       |
| iii   | IV, vi       |
| IV    | ii, V, vii   |
| V     | vi           |
| vi    | ii, ii, IV, V|
| vii   | I            |
 ----------------------
Run Code Online (Sandbox Code Playgroud)

数据结构将各种进度存储为加权选项.例如,考虑任何给定主键中的IV和弦:IV可以自然地进展到ii,V或vii,但也可以打破进入任何其他和弦的规则.违反规则的情况很少发生.

在此输入图像描述

我考虑过某种链表/树数据结构,但它几乎不像我曾经使用的任何类型的树或列表 - 另外,我无法弄清楚如何实现加权:

在此输入图像描述

另一个想法是使用JSON或类似的东西,但它似乎很快就会变得多余:

{
    "I":{
        "100%":{
            "I",
            "ii",
            "iii",
            "IV",
            "V",
            "vi",
            "vii"
        }
    },
    "ii":{
        "80%":{
            "V",
            "vii"
        },
        "20%":{
            "i",
            "ii",
            "iii",
            "IV",
            "vi"
        }
    },
    // ...
}
Run Code Online (Sandbox Code Playgroud)

注意:我很乐意用少数几种语言实现它,此时我并不关心特定的语言实现,而是与语言无关的数据结构体系结构.

rta*_*bot 3

马尔可夫可能很适合解决这个问题。

马尔可夫链是一个随机过程,其中下一个状态的进展由当前状态决定。因此,对于表中的给定间隔,您可以对“导致”值应用权重,然后随机确定要进展到哪个状态。