---
title: "코드로 배우는 음악이론 — 쉬운 버전"
creative_title: "도레미는 왜 도레미일까? 계산기로 풀어본 음악의 비밀"
source_url: "https://runjs.app/blog/music-theory-for-programmers"
original_title: "Music theory for programmers"
author: "Luke Haas (RunJS)"
published: 2026-08-17
created: 2026-08-21
level: "중학생"
purpose: "악기 없이 JavaScript 코드만으로 음악이론을 처음부터 유도한 사례를, 중학생도 이해할 수 있는 언어로 재구성한다. 음악 지식 전달이 아니라 '외우는 과목을 계산하는 과목으로 바꾸는 설계 방식'을 학습 목적으로 삼는다."
---

> 원문: https://runjs.app/blog/music-theory-for-programmers

# 도레미는 왜 도레미일까?

## 이 글이 하려는 말 (한 문장)

음악은 "그냥 옛날부터 그랬으니 외워"가 아니라, **계산해서 답이 나오는 것**이다.

글쓴이 Luke Haas는 악기를 하나도 못 다룹니다. 대신 컴퓨터로 소리를 직접 만들어보면서 음악이론을 처음부터 다시 세워봤습니다.

---

## 1단계 · 소리는 그냥 숫자다

- 소리는 **공기가 떨리는 것**입니다.
- 스피커는 앞뒤로 밀었다 당겼다 하면서 공기를 떨게 합니다.
- 컴퓨터는 "지금 얼마나 밀까?"라는 숫자를 **1초에 44,100번** 계산해서 스피커에 보냅니다.

**1초에 440번 떨리면** 우리가 '라(A)' 라고 부르는 소리가 납니다.
숫자가 크면 높은 소리, 작으면 낮은 소리. 그게 전부입니다.

### 왜 "딱!" 소리가 날까?
소리를 갑자기 끄면 스피커가 튀어서 "딱" 하고 잡음이 납니다.
그래서 소리를 **천천히 켜고 천천히 끄는** 장치가 필요한데, 이걸 **엔벨로프(envelope)** 라고 합니다.

- 빨리 커졌다 사라짐 → 기타를 튕긴 소리
- 천천히 부풀어 오름 → 바이올린을 활로 긋는 소리

> 재미있는 점: **음 높이는 똑같은데** 켜고 끄는 속도만 바꿔도 완전히 다른 악기처럼 들립니다.

---

## 2단계 · 악기마다 소리가 다른 이유

기타 줄을 튕기면 줄 전체만 떨리는 게 아닙니다.
**동시에** 반으로 나뉘어서도 떨리고, 3등분으로도, 4등분으로도 떨립니다.

그래서 220Hz를 치면 실제로는 이런 소리들이 **한꺼번에** 납니다.

| 몇 배 | 주파수 |
|---|---|
| 1배 | 220Hz ← 우리가 친 음 |
| 2배 | 440Hz |
| 3배 | 660Hz |
| 4배 | 880Hz |
| 5배 | 1100Hz |

이 딸려오는 소리들을 **배음(harmonic)** 이라고 합니다.

- 바이올린과 트럼펫이 다르게 들리는 이유 = **배음의 비율(레시피)이 다르기 때문**
- 이 "소리의 개성"을 **음색(timbre)** 이라고 부릅니다.

**이 배음이 앞으로 나올 모든 이야기의 열쇠입니다.**

---

## 3단계 · 2배 하면 같은 음이 된다

110 → 220 → 440 → 880 → 1760

전부 앞의 숫자의 **2배**입니다. 높이는 다른데, 신기하게도 **같은 음처럼** 들립니다.
전부 '라(A)'라고 부르고, 이 간격을 **옥타브**라고 합니다.

**왜 같게 들릴까?**
220의 배음은 220, 440, 660, 880… 인데,
440의 배음은 440, 880, 1320… 입니다.
👉 440의 소리는 이미 **220 안에 전부 들어있었습니다.** 새로운 색이 아니라, 같은 색이 더 밝아진 것뿐입니다.

### 여기서 중요한 규칙 2개

- **음의 간격은 곱셈이다.** 한 옥타브 올리기 = ×2 (더하기가 아님)
- **한 옥타브만 풀면 끝난다.** 2배 하면 반복되니까, "220~440 사이를 어떻게 나눌까?"만 해결하면 나머지는 자동입니다.

---

## 4단계 · 왜 어떤 화음은 예쁘고 어떤 건 이상할까

두 음을 같이 눌러보면 결과가 갈립니다.

| 비율 | 이름 | 느낌 |
|---|---|---|
| 2 : 1 | 옥타브 | 아주 안정적 |
| 3 : 2 | 5도 | 안정적 |
| 4 : 3 | 4도 | 괜찮음 |
| 5 : 4 | 장3도 | 예쁨 |
| 16 : 15 | 반음 | 싸우는 소리 |
| √2 : 1 | (무리수) | 자동차 경보음 😱 |

**규칙: 분수가 단순할수록 예쁘게 들린다.**

### 이유 ① 배음이 겹친다
- 220과 330 (=3:2)은 → 660, 1320을 **함께 가지고 있습니다.** 서로를 도와줍니다.
- 220과 311 (≈√2)은 → 겹치는 게 **하나도 없습니다.** 따로 노는 두 덩어리입니다.

### 이유 ② 맥놀이(beating)
두 음이 아주 가까우면 소리가 **우웅~ 우웅~** 하고 울렁거립니다.
6Hz 차이면 1초에 6번 울렁댑니다. 이게 "음이 안 맞는다"는 느낌의 정체입니다.

> **결론: 협화음이란, 우리 귀가 반복되는 패턴을 빨리 찾아낸 상태입니다.**
> √2는 무리수라서 패턴이 영원히 안 돌아옵니다. 그래서 끝까지 불편합니다.

---

## 5단계 · 절대 해결 안 되는 버그

제일 예쁜 비율이 3/2(5도)니까, 이걸로 음계를 만들어봅시다.
"3/2를 계속 곱하다가, 한 옥타브를 넘으면 2로 나눠서 되돌리기"를 12번 반복합니다.

- 시작: **220Hz**
- 12번 후: **222.99Hz** ❌

돌아와야 하는데 안 돌아옵니다. 이 오차를 **피타고라스 콤마**라고 부릅니다.

### 왜 고칠 수 없나
- 5도를 n번 쌓으면 → 3ⁿ / 2ⁿ
- 옥타브를 m번 쌓으면 → 2ᵐ
- 딱 맞으려면 **3의 거듭제곱 = 2의 거듭제곱**이어야 합니다.
- 그런데 2도 3도 **소수**입니다. 👉 **영원히 불가능합니다.**

> 완벽한 음악 시스템은 **존재한 적이 없습니다.** 역사상 모든 조율법은 "이 오차를 어디에 버릴까"에 대한 서로 다른 선택일 뿐입니다.

---

## 6단계 · 인류의 해결책: 그냥 포기하기

현대의 답은 단순하고 과감합니다.

> **"완벽한 비율은 포기하자. 옥타브를 그냥 12등분하자."**

한 칸의 크기 = **2의 12제곱근** (약 1.0595배)
12번 곱하면 정확히 2배가 됩니다. 이게 **평균율**입니다.

- 대가: 옥타브 빼고 **모든 음이 아주 살짝 틀립니다.** (5도는 약 2센트 낮음)
- 보상: **어느 조에서 연주해도 똑같이 살짝 틀립니다.** = 어디서든 쓸 수 있습니다.

### 왜 하필 12일까?
전통이 아닙니다. 계산해보면 나옵니다.
5~25등분을 전부 시험해서 "3/2에 가장 가까운 5도"를 찾아보면 —
👉 **12등분이 오차 0.1% 수준으로 처음 성공하는 숫자**입니다. 그 아래는 전부 3배 이상 부정확합니다.
(29나 41등분이면 더 정확하지만, 건반이 41개인 피아노를 만들 사람은 없습니다.)

### 진짜 보상: 음이 정수가 된다
이제 주파수를 신경 쓸 필요가 없습니다. 음이 **번호**가 됩니다.

- 60번 = 가운데 도
- 69번 = 440Hz 라
- 81번 = 한 옥타브 위 라

---

## 7단계 · 음계 = 그냥 배열

12개 음을 **전부** 순서대로 치면? 사이렌 소리 같고 전혀 음악이 아닙니다.
간격이 다 똑같아서 **내가 어디 있는지 알 수가 없기** 때문입니다.

그래서 음악은 12개 중 **보통 7개만 골라 씁니다.** 이게 **음계(scale)** 입니다.
핵심은 고른 음이 아니라 **간격**입니다.

```
장조(밝음):  2 2 1 2 2 2 1
단조(어두움): 2 1 2 2 1 2 2
```

- 숫자를 다 더하면 12 → 한 옥타브가 딱 맞습니다.
- 간격이 **일정하지 않아서** 내가 어디 있는지 귀로 알 수 있습니다.

### 여기가 놀라운 부분
음악 시간에 "이오니안, 도리안, 프리지안…" 7개 이름을 외우라고 하죠.
그거 전부 **같은 배열을 한 칸씩 돌린 것**입니다.

```
2 2 1 2 2 2 1  → 이오니안 (= 장조)
2 1 2 2 2 1 2  → 도리안
1 2 2 2 1 2 2  → 프리지안
...
2 1 2 2 1 2 2  → 에올리안 (= 단조)
```

👉 **장조와 단조는 다른 시스템이 아닙니다. 같은 배열의 0번 회전과 5번 회전입니다.**

---

## 8단계 · 화음도 그냥 배열

화음(코드)은 여러 음을 동시에 누르는 것입니다.
아무거나 누르면 이상하니까, **배음이 겹치는 음**을 골라야 합니다.

방법: 음계에서 **하나 건너 하나씩** 집기 → `[0, 2, 4]`

이렇게 3개를 집으면 주파수 비가 대략 **4 : 5 : 6**. 단순한 비율 3개가 모였으니 당연히 안정적입니다.

### 밝음과 어두움의 차이는 딱 한 칸

```
장3화음(밝음):  [0, 4, 7]
단3화음(어두움): [0, 3, 7]   ← 가운데 음만 반음 내림
감3화음(불안):  [0, 3, 6]
증3화음(불길):  [0, 4, 8]
```

서양음악의 "기쁨"과 "슬픔"이라는 두 감정의 차이는 → **배열 원소 하나가 1 다를 뿐입니다.**

---

## 9단계 · 조성 = 상대 주소

음계 7개 음 각각에서 화음을 만들면, **자동으로 7개 화음**이 나옵니다.
누가 정한 게 아니라 간격 때문에 **저절로** 이렇게 됩니다.

```
I  ii  iii  IV  V  vi  vii°
대문자 = 밝은 화음 / 소문자 = 어두운 화음
```

이 로마 숫자가 똑똑한 이유:
👉 화음을 **이름이 아니라 '몇 번째 자리'로** 부릅니다.

- "V"는 **어느 조에서든** "5번째 자리 화음"입니다.
- 조를 바꾸려면? **시작 숫자만 더하면 끝**입니다. (60 → 65)

### 왜 어떤 순서는 "끝난 느낌"이 날까
- **V → I** 이동이 가장 강한 끌림입니다.
- V 화음 안의 '시(B)'는 도착지 '도(C)'보다 **반음 아래**에 있습니다. 문 앞에 기대선 느낌이죠.
- 게다가 V7 화음 안에는 **6반음 간격(트라이톤)** 이 숨어 있는데, 이게 바로 아까 그 **√2**, 제일 불안한 소리입니다.

> 긴장이 풀리는 느낌은 비유가 아닙니다. **무리수 비율이 단순한 비율로 바뀌는 물리 현상**입니다.

우리가 아는 코드 진행들:
- `I - V - vi - IV` → 팝송의 절반
- `ii - V - I` → 재즈의 뼈대
- `vi - IV - I - V` → 위와 같은 화음인데 슬프게 시작

---

## 10단계 · 악보는 "저장 파일 형식"이다

악보는 신비한 게 아니라, **인쇄가 비쌌던 시대에 만들어진 데이터 저장 방식**입니다.

- **음자리표** = 좌표의 원점 선언 ("여기가 어디인지" 표시)
- **줄과 칸** = 12음이 아니라 **음계 7음** 기준 (그래서 장음계가 예쁘게 일직선)
- **샵/플랫** = 7칸으로 12음을 표현하다 보니 생긴 **땜빵 장치**
- **조표** = 매번 쓰기 귀찮으니 **맨 앞에 한 번만 선언** (상수 선언과 같음)
- **음표 길이** = 온음표, 2분음표, 4분음표… 전부 **2로 나누기** (2의 거듭제곱)
- **점(.)** = 길이를 1.5배로 (점 두 개면 1.75배)
- **박자** = 시간이 아니라 **비율**입니다. 빠르기(BPM)를 정해야 비로소 초가 됩니다.

---

## 한눈에 보는 전체 흐름

```
숫자     소리 = 시간에 따라 변하는 숫자
  ↓
비율     단순한 분수일수록 예쁘다 (배음이 겹치니까)
  ↓
정수     완벽함을 포기하고 12등분 → 음이 번호가 됨
  ↓
배열     음계·화음·조성이 전부 배열 연산이 됨
```

---

## 그래서 뭘 배울 수 있나

- **결론보다 과정이 재산이다** — "12음이다"가 아니라 "왜 12인지 직접 찾아보자"가 진짜 수업이다.
- **실패를 커리큘럼에 넣어라** — 피타고라스 콤마처럼 "안 되는 지점"이 가장 강한 학습 순간이다.
- **외울 것을 계산할 것으로 바꿔라** — 그리스 이름 7개 암기 → 배열 회전 1개.
- **학습자의 언어로 번역하라** — "모드"보다 "회전", "조옮김"보다 "숫자 더하기".
- **모르는 걸 밝혀라** — 글쓴이는 마지막에 "리듬은 아직 모른다"고 씁니다. 신뢰가 깎이는 게 아니라 올라갑니다.

---

## 마무리 (Bottom Line)

음악이론은 마법이 아니라, **제약 조건 아래서 내려진 공학적 타협**입니다.
12음은 소수 2와 3이 절대 만나지 않아서 생긴 반올림 오차이고, 화음은 배음이 겹치는 음의 조합이고, 악보는 헤더가 달린 파일 형식일 뿐입니다.

지금 당장 여러분이 가르치거나 배우는 과목 하나를 펼치고, **"그냥 외우세요"라고 말하는 부분에 전부 표시**하세요.
그중 계산으로 유도할 수 있는 걸 하나 골라 **직접 돌려볼 수 있는 형태**로 바꾸세요.
그게 다음 수업의 첫 10분입니다.

---

## 전문가 의견 (사실 기반)

수치는 정확합니다. 피타고라스 콤마 1.0136(약 23.46센트), 평균율 5도가 순정보다 약 2센트 낮다는 점, MIDI 69 = 440Hz, `3ⁿ = 2ᵐ`이 불가능하다는 논증 모두 검증됩니다. 다만 세 가지는 걸러 읽어야 합니다. 첫째, **"협화음 = 귀가 반복 패턴을 빨리 찾는 것"은 정설이 아닙니다.** 배음 정합 이론과 임계대역 거칢 이론이 경쟁 중이고, McDermott 등의 볼리비아 Tsimané 부족 연구(2016)는 협화음 선호가 상당 부분 **문화적 학습**일 가능성을 보였습니다. 글쓴이는 이를 물리적 필연처럼 단정합니다. 둘째, **"교류 없는 문화들이 옥타브 등가성에 독립적으로 도달했다"는 서술은 과장**입니다. 널리 퍼진 것은 사실이나 보편은 아닙니다. 셋째, **이 글은 RunJS의 콘텐츠 마케팅**입니다. 글쓴이가 곧 제품 제작자이고 말미에 자사 도구 사용을 유도합니다. 다만 모든 예제가 라이브러리 없는 순수 JavaScript라 RunJS 없이도 완전히 재현되므로, 이해관계가 내용의 타당성을 훼손하지는 않습니다. 참고할 진짜 지점은 음악 지식이 아니라 **"모든 주장에 실행 버튼을 붙이는 구조"** 이며, 이는 특정 도구 튜토리얼보다 수명이 훨씬 긴 설계 방식입니다.
