轨道
/
Python
Python
/
练习
/
音阶生成器
音阶生成器

音阶生成器

中等

说明

半音阶

西方音乐中的音阶都以半音阶(12 个音)为基础。 这个音阶可以用下面这组音高来表示:

A, A♯, B, C, C♯, D, D♯, E, F, F♯, G, G♯

一个带升号的音(用 ♯ 表示)也可以表示为它上方那个音的降号形式(用 ♭ 表示),因此半音阶也可以这样写:

A, B♭, B, C, D♭, D, E♭, E, F, G♭, G, A♭

大调、小调以及各种调式都是这十二个音的集合的子集。 它们各有七个音,被称为自然音阶。 这些音阶中的音用升号还是降号来记写,取决于主音(起始音)。 下表说明了对于给定的主音,音阶会使用降号形式还是升号形式:

调号 大调 小调
自然 C a
升号 G, D, A, E, B, F♯ e, b, f♯, c♯, g♯, d♯
降号 F, B♭, E♭, A♭, D♭, G♭ d, g, c, f, b♭, e♭

请注意,按照常见的乐理惯例,自然音“C”和“a”在上行时使用升号音阶,在下行时使用降号音阶。 就本次练习的范围而言,音阶只考虑上行。

任务

给定一个主音,生成以该主音开头的 12 个音的半音阶。

  • 适当移动基础音阶,使返回的全部 12 个音都以给定的主音开头。
  • 对于给定的主音,判断音阶应该用降号还是升号返回。
  • 无论给定主音的大小写如何,返回的所有音都用大写字母(降号用的 b 除外)。

自然音阶

自然音阶,以及所有从半音阶衍生出来的其他音阶,都建立在音程之上。 音程是两个音高之间的距离。

最简单的音程位于两个相邻的音之间,叫做“半音”,也叫“小二度”(有时写成小写的“m”)。 中间隔着一个音的两个音之间的音程叫做“全音”,也叫“大二度”(写成大写的“M”)。 自然音阶只用相邻音之间的这两种音程来构建。

非自然音阶可以包含其他音程。 “增二度”音程写作“A”,它中间隔着两个音(例如从 A 到 C,或从 D♭ 到 E),或者说是一个“全音”加一个“半音”。 还有更小和更大的音程,但它们不会出现在本次练习中。

任务

给定一个主音和一组音程,生成以该主音开头、并按照指定音程模式排列的音阶。

这与生成半音阶类似,只不过不是返回 12 个音,而是对 N 个音程返回 N+1 个音。 第一个音始终是给定的主音。 然后,对于模式中的每个音程,都从上一个音出发,跳过该音程所指示的音数,就得到下一个音。

例如,从 G 开始,使用七个音程 MMmMMMm,会得到下面八个音:

音 说明
G 主音
A M 表示从 G 起的一个全音,跳过 G♯
B M 表示从 A 起的一个全音,跳过 A♯
C m 表示从 B 起的一个半音,不跳过任何音
D M 表示从 C 起的一个全音,跳过 C♯
E M 表示从 D 起的一个全音,跳过 D♯
F♯ M 表示从 E 起的一个全音,跳过 F
G m 表示从 F♯ 起的一个半音,不跳过任何音
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Python Exercism

准备好开始 音阶生成器 了吗?

注册 Exercism,借助 17 个概念146 个练习 和真人导师指导,学习并掌握 Python,全部免费。