트랙
/
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는 예외예요).

온음계

온음계와, 반음계에서 파생된 다른 모든 음계는 음정을 기반으로 만들어져요. 음정은 두 음 사이의 간격이에요.

가장 단순한 음정은 서로 인접한 두 음 사이의 음정이고, "반음" 또는 "단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♯에서 반음만큼 올라가며 건너뛰는 음이 없다는 뜻이에요
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Python Exercism

음계 생성기 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.