서양 음악의 음계는 반음계(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음 반음계를 만들어요.
b는 예외예요).온음계와, 반음계에서 파생된 다른 모든 음계는 음정을 기반으로 만들어져요. 음정은 두 음 사이의 간격이에요.
가장 단순한 음정은 서로 인접한 두 음 사이의 음정이고, "반음" 또는 "단2도"라고 해요(소문자 "m"으로 쓰기도 해요). 사이에 다른 음이 하나 끼어 있는 두 음 사이의 음정은 "온음" 또는 "장2도"(대문자 "M"으로 써요)라고 해요. 온음계는 인접한 음들 사이에 이 두 음정만을 사용해서 만들어져요.
온음계가 아닌 음계에는 다른 음정이 들어갈 수 있어요. "증2도" 음정은 "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♯에서 반음만큼 올라가며 건너뛰는 음이 없다는 뜻이에요 |
Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.