Language agnostic 存储和弦级数规则的数据结构?

Language agnostic 存储和弦级数规则的数据结构?,language-agnostic,data-structures,Language Agnostic,Data Structures,在数据结构中表示各种和弦进行(音乐)规则的最合适(自然适合)方式是什么,这样每个和弦都有一组加权的选项,可以进行调整 这个数据结构将以一种您可以编码的方式在程序音乐生成程序中实现:(语言不可知伪代码) 数据结构将各种进度存储为加权选项。作为一个例子,考虑IV和弦在任何给定的主要键:IV可以自然地进展到II,V,或VII,但也可以打破前进到任何其他和弦的规则。违反规则的情况很少发生 我曾考虑过某种链表/树数据结构,但它几乎与我使用过的任何类型的树或列表都不相似——此外,我无法确定如何实现权重:

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

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

数据结构将各种进度存储为加权选项。作为一个例子,考虑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"
        }
    },
    // ...
}

注意:我很乐意用几种语言来实现这一点,目前我并不关心具体的语言实现,但是语言无关的数据结构体系结构。

听起来您需要某种形式的节点是和弦,边是级数选项,边权重是级数的可能性。

a可能很适合这个问题


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

我希望您的和弦少于100个,因此,如果您使用32位表示概率系列(可能是极端过杀),您将得到100x100x4(40000)用于平面马尔可夫矩阵表示的字节数组。根据矩阵的稀疏性(例如,如果您有50个和弦,但每个和弦通常映射为2或3个和弦),出于速度和不太重要的空间原因,您可能需要一个数组,其中每个最终数组元素都是(和弦ID,概率)

在这两种情况下,这里的一个关键点是,您应该使用概率序列,而不是概率序列。也就是说,不要说“这个和弦有10%的几率,这个和弦有10%的几率,这个和弦有80%的几率”)而是说“第一个和弦有10%的几率,前两个和弦有20%的几率,前三个和弦有100%的几率。”

原因如下:选择随机但加权的值时,可以生成固定范围内的数字(对于无符号整数,0到0xFFFFFF),然后通过和弦执行二进制搜索,而不是线性搜索。(搜索最小概率序列值仍大于或等于生成的数字的元素。)

另一方面,如果每个和弦只有几个后续和弦,线性搜索可能会比二进制搜索更快,因为循环更紧密,然后所有概率序列都可以为您节省计算概率值的简单运行总和的时间

如果这部分代码不需要最惊人的性能(我想你也不需要——对于一台计算机来说,一段音乐中的和弦并不多),老实说,我会坚持使用马尔可夫矩阵的平面表示法——易于理解、易于实现、合理的执行速度


作为一个有趣的旁白,这类事情很好地考虑了预测编码——一种常用的数据压缩方法。你可以考虑一种基于N-gram的算法(例如PPM)。在音乐生成中实现更高阶的结构,而不需要太多的示例材料。它已经在数据压缩领域工作了多年。

有趣的阅读:看起来有一个类似的实现?以什么方式可以实现为数据结构?我已经通过创建MarkovCha实现了文本在封装字典和字符串的类中。在本例中,键是当前状态,列表是下一个可能的状态。这在本例中起作用,因为列表中的值不是唯一的,因此我可以使用有界psuedo随机数来获取下一个状态。哦,是的,就像一阶矩阵。转移矩阵这是一个很好的方法。检查和文件中的链接。
 ----------------------
| Chord | Leads to     |
|=======================
| I     | any          |
| ii    | V, vii       |
| iii   | IV, vi       |
| IV    | ii, V, vii   |
| V     | vi           |
| vi    | ii, ii, IV, V|
| vii   | I            |
 ----------------------
{
    "I":{
        "100%":{
            "I",
            "ii",
            "iii",
            "IV",
            "V",
            "vi",
            "vii"
        }
    },
    "ii":{
        "80%":{
            "V",
            "vii"
        },
        "20%":{
            "i",
            "ii",
            "iii",
            "IV",
            "vi"
        }
    },
    // ...
}