将 0 和 1 的多重排列扩展到 12 位的比例

主要观点:

  • 写完上一篇文章的音阶生成器后,想用属性测试更彻底地测试解决方案,需先探索音阶世界并生成任意音阶公式作为测试输入。
  • 可将音阶视为定义音阶“调性中心”的根音和与根音有特定关系的音符集合,每个音符与根音的关系可用音程定义,常见的大调音阶有特定模式即公式。
  • 还可通过将八度或 12 个半音分成若干部分来生成任意音阶公式,如创建 12 个元素的列表并给每个元素赋值 0 或 1,连续数字块可视为音阶的音符,块长度定义音程。
  • 可将此视为生成多重排列,然后映射并测量每个块的长度,再将其转换为以根为导向的记法,此解决方案可得到 4096 种公式即所有可能的音阶公式。
  • 把生成音阶公式的解决方案封装在函数get_formulas/0中,用于测试音阶生成器代码的一些属性,使用StreamData生成各种输入并进行断言。
  • 虽然当前生成音阶公式的解决方案可行,但可能有其他有趣的方法,已生成 4096 种“音阶”,但是否有更清晰的见解和语义值得思考。

关键信息:

  • 上一篇文章的音阶生成器,用属性测试探索音阶世界。
  • 音阶的定义及大调音阶公式。
  • 生成音阶公式的方法及多重排列。
  • 测试音阶生成器代码属性的函数及输入生成。
  • 对现有解决方案的思考和探索。

重要细节:

  • [0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0]示例展示生成大调音阶公式的过程。
  • 测试函数中对音阶的各种属性断言,如音符数量、拼写、与根音的半音距离等。
  • 思考是否有更清晰的解决方案及语义。
阅读 10
0 条评论