主要观点:
- 写完上一篇文章的音阶生成器后,想用属性测试更彻底地测试解决方案,需先探索音阶世界并生成任意音阶公式作为测试输入。
- 可将音阶视为定义音阶“调性中心”的根音和与根音有特定关系的音符集合,每个音符与根音的关系可用音程定义,常见的大调音阶有特定模式即公式。
- 还可通过将八度或 12 个半音分成若干部分来生成任意音阶公式,如创建 12 个元素的列表并给每个元素赋值 0 或 1,连续数字块可视为音阶的音符,块长度定义音程。
- 可将此视为生成多重排列,然后映射并测量每个块的长度,再将其转换为以根为导向的记法,此解决方案可得到 4096 种公式即所有可能的音阶公式。
- 把生成音阶公式的解决方案封装在函数
get_formulas/0
中,用于测试音阶生成器代码的一些属性,使用StreamData
生成各种输入并进行断言。 - 虽然当前生成音阶公式的解决方案可行,但可能有其他有趣的方法,已生成 4096 种“音阶”,但是否有更清晰的见解和语义值得思考。
关键信息:
- 上一篇文章的音阶生成器,用属性测试探索音阶世界。
- 音阶的定义及大调音阶公式。
- 生成音阶公式的方法及多重排列。
- 测试音阶生成器代码属性的函数及输入生成。
- 对现有解决方案的思考和探索。
重要细节:
- 用
[0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0]
示例展示生成大调音阶公式的过程。 - 测试函数中对音阶的各种属性断言,如音符数量、拼写、与根音的半音距离等。
- 思考是否有更清晰的解决方案及语义。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。