UVA449 Majoring in Scales

题目描述

## 题目背景 乐理小知识: 在西方音乐中,十二个音符按照以下顺序排列: $C/B^\#,C^\#/D^b,D,D^\#/E^b,E/F^b,F/E^\#,F^\#/G^b,G,G^\#/A^b,A,A^\#/B^b,B/C^b$ 请注意,上面列表中的 $/$ 表示同一音符的替代符号。 在上述列表中,任何两个相邻的音符之间的关系都被称为半音(semitone,以下简写为 $s$)。 在上面的列表中,任何两个中间有且只有一个音符间隔的音符之间的关系都被称为全音(tone,以下简写为 $t$)。 一个大调音阶由 $8$ 个音符组成。 它从上面给出的十二个音符中的一个音符开始,并在 $t\rightarrow t\rightarrow s\rightarrow t\rightarrow t\rightarrow t\rightarrow s$ 的进程中移动。 例如,从 $D^b$ 开始的大调音阶由以下音符组成: $D^b,E^b,F,G^b,A^b,B^b,C,D^b$ 以下规则也适用于大调音阶: 1. 音阶将包含 $A$ 到 $G$ 的每个字母一次且仅一次,除了音阶的第一个字母(将作为音阶的最后一个音符重复)。 2. 音阶不能同时包含降音符($^b$)和升音符($^\#$)。 为了解决这个问题,我们只关注以下几个大调音阶: $C,D^b,D,E^b,E,F,G^b,G,A^b,A,B^b,B$ 音程是音阶上两个音符之间的距离,可以是升序,也可以是降序。 音程的名称是由两个音符之间的距离得来的。 例如大调音阶中相邻的两个音符被称为大调二度,大调音阶中有三个音符隔开的两个音符被称为大调五度。 八度是一种特殊的音程,它在大调音阶中从一个音符的出现到下一个音符的出现。 ## 题面描述 写一个程序,要求实现读取给定主音以及其他音阶与主音之间的音程(包括升序和降序),然后输出音程所对应的音。

输入格式

输入文件中的数据将由多组两行组成。 每组的第一行将包含要使用的大调音阶,每对的第二行将包含一个或多个要计算的音程。 要计算的每个间隔将以分号分隔。 要计算的间隔将指定为一个开始音符,一个方向(UP 表示升序,DOWN 表示降序), 以及音程本身(`SECOND` 表示二度,`THIRD` 表示三度、`FOURTH` 表示四度、`FIFTH` 表示五度、`SIXTH` 表示六度、`SEVENTH` 表示七度,`OCTAVE` 表示八度)。 在指定音符时,小写字母 `b` 将用于表示降记号 $^b$,符号 `#` 将用于表示升记号 $^\#$。 分号的前面和后面没有空格,但是一个空格将音符与方向以及方向与音程分开。

输出格式

每个测试点后面都有一个空行。 输入文件中的每组两行都将生成一行说明,后面是计算间隔的结果,每行一个间隔。 如果音程的开始音符不是正在使用的大调音阶的一部分,程序应该输出 `invalid note for this key`。 听不懂的话请看下面的输入输出样例。