제3강 Pure Data 기초
Pure Data(Pd)의 기본 조작을 배우고, 소리를 생성・가공하는 방법을 익혀 봅시다.
이번 강의의 목표
- Pd의 기본 조작(오브젝트 배치, 연결)을 익힌다
- 사인파를 생성하고 주파수・음량을 제어할 수 있게 된다
- 엔벨로프, 필터, 딜레이 등의 음향 처리를 이해한다
- 연습 문제를 통해 배운 내용을 정착시킨다
준비
Pd 설치
지난 강의의 절차대로 Pd를 설치했는지 확인해 주세요. 실행해서 Pd 콘솔이 표시되면 OK입니다.
라이브러리 설치
이 수업에서는 cyclone 과 else 라는 외부 라이브러리를 사용합니다. 다음 절차대로 설치해 주세요.
- Pd를 실행한다
- 메뉴에서 도움말(Mac의 경우 Tools)→ external 찾기(Find externals) 를 선택한다
- 검색란에
cyclone을 입력해서 검색한다 - 검색 결과에서 cyclone 을 선택한다
- Install 버튼을 클릭해서 설치한다
- 같은 방법으로
else를 검색해서 설치한다
plugdata를 사용하는 경우
이 수업에서 사용하는 plugdata 에는 cyclone・else가 모두 미리 내장되어 있으므로, 위의 설치 작업은 필요 없습니다.
설치 후 재시작(Pure Data를 사용하는 경우)
라이브러리를 설치했다면 Pd를 한 번 종료했다가 다시 실행해 주세요. 재시작하지 않으면 라이브러리가 로드되지 않는 경우가 있습니다.
Pd의 기본 조작
| 조작 | Windows | Mac |
|---|---|---|
| 오브젝트 배치 | Ctrl+1 | Cmd+1 |
| 메시지 배치 | Ctrl+2 | Cmd+2 |
| 넘버 박스 배치 | Ctrl+3 | Cmd+3 |
| 편집 모드 전환 | Ctrl+E | Cmd+E |
| DSP 켜기/끄기 | Ctrl+/ | Cmd+/ |
편집 모드와 실행 모드
- 편집 모드(커서가 화살표): 오브젝트의 배치・연결・이동이 가능
- 실행 모드(커서가 손가락): 슬라이더나 넘버 박스를 조작할 수 있음
Ctrl+E(Cmd+E)로 전환합니다
사인파 생성
소리의 기본은 사인파(sine wave) 입니다. Pd에서 사인파를 생성해 봅시다.
사용하는 오브젝트
| 오브젝트 | 기능 |
|---|---|
osc~ | 사인파 오실레이터. 지정한 주파수의 사인파를 생성한다 |
output~ | Pd 표준 출력 오브젝트(음량 슬라이더 포함) |
else/out~ | else 라이브러리의 출력 오브젝트(기능이 더 풍부) |
~(틸데)의 의미
오브젝트 이름 끝에 ~ 가 붙은 것은 시그널(오디오 신호) 을 다루는 오브젝트입니다. ~ 가 붙지 않은 것은 값(숫자나 메시지) 을 다룹니다. 이 구별은 매우 중요합니다.
절차
- 새 패치를 만든다(
Ctrl+N/Cmd+N) Ctrl+1(Cmd+1)로 오브젝트를 배치하고osc~ 440을 입력한다- 같은 방법으로
output~을 배치한다(또는else/out~) osc~의 출력(아래쪽)에서output~의 입력(위쪽)으로 선을 긋는다- DSP를 켠다(
Ctrl+//Cmd+/, 또는 콘솔의 DSP 체크박스) - 440 Hz의 사인파가 들리면 성공

음량에 주의
DSP를 켜기 전에 PC의 스피커 음량을 낮춰 두세요. 갑자기 큰 소리가 날 수 있습니다. 헤드폰을 사용 중이라면 특히 주의해 주세요.
주파수 컨트롤
사인파의 주파수(음의 높낮이)를 실시간으로 변경하는 방법을 배웁니다.
방법1: 메시지로 변경
- 메시지 박스(
Ctrl+2/Cmd+2)를 배치한다 - 메시지에
440을 입력한다 - 메시지를 하나 더 만들어
880을 입력한다 - 각 메시지에서
osc~의 왼쪽 인렛(입력)으로 연결한다 - 실행 모드로 전환하고 메시지를 클릭하면 주파수가 바뀐다
방법2: 넘버 박스로 변경
- 넘버 박스(
Ctrl+3/Cmd+3)를 배치한다 osc~의 왼쪽 인렛에 연결한다- 실행 모드에서 넘버 박스를 드래그하면 값을 연속적으로 변경할 수 있다
방법3: 슬라이더로 변경
- 메뉴 배치 → H 슬라이더(또는 V 슬라이더)를 선택한다
- 슬라이더를
osc~의 왼쪽 인렛에 연결한다 - 슬라이더의 범위를 설정한다:
- 편집 모드에서 슬라이더를 우클릭 → 속성 을 선택
- 하한(lower) 을
100, 상한(upper) 을2000으로 설정한다
- 실행 모드에서 슬라이더를 움직이면 100〜2000 Hz 범위에서 주파수가 바뀐다

MIDI 노트 넘버와 주파수의 변환
음악에서는 MIDI 노트 넘버 를 사용해 음정을 지정하는 것이 일반적입니다. mtof 오브젝트로 MIDI 노트 넘버를 주파수(Hz)로 변환할 수 있습니다.
| MIDI 노트 | 음명 | 주파수 (Hz) |
|---|---|---|
| 60 | C4(가운데 도) | 261.6 |
| 69 | A4(라) | 440.0 |
| 72 | C5(높은 도) | 523.3 |
절차
- 넘버 박스를 배치한다
mtof오브젝트를 배치한다- 넘버 박스 →
mtof→osc~순으로 연결한다 - 넘버 박스에
69를 입력하면 440 Hz(라 음)가 난다

ftom
반대로 주파수에서 MIDI 노트 넘버로 변환하려면 ftom 을 사용합니다.
음량 컨트롤
음량을 제어하려면 시그널에 숫자를 곱합니다.
사용하는 오브젝트
| 오브젝트 | 기능 |
|---|---|
*~ | 시그널의 곱셈. 음량 조정에 사용한다 |
toggle | 켜기/끄기 스위치(0과 1을 전환) |
방법1: 토글로 소리 켜기/끄기
toggle(배치 → Toggle)을 배치한다*~오브젝트를 배치한다osc~ 440→*~→output~순으로 연결한다toggle→*~의 오른쪽 인렛에 연결한다- 토글을 클릭하면 소리를 켜고 끌 수 있다

방법2: 메시지로 음량 지정
output~ 이나 else/out~ 은 메시지로 음량을 제어할 수 있습니다.
level $1슬라이더나 넘버 박스의 값을 $1 에 대입해서 음량을 변경할 수 있습니다.

음량・값의 자동 변화(엔벨로프)
소리를 자연스럽게 들리게 하려면, 음량을 시간에 따라 변화시키는 엔벨로프 가 중요합니다.
line~ - 직선적인 변화
line~ 은 지정한 시간 동안 값을 직선적으로 변화시킵니다.
- 메시지
1 1000: 1000 밀리초에 걸쳐 값을 1까지 변화시킨다 - 메시지
0 500: 500 밀리초에 걸쳐 값을 0까지 변화시킨다
vline~ - 더 정확한 변화
vline~ 은 line~ 보다 높은 정밀도의 타이밍으로 동작합니다.
vline~ 의 메시지 형식
vline~ 에서는 쉼표 , 를 사용해 여러 개의 변화를 하나의 메시지에 담을 수 있습니다.
1 10, 0 1000 500이 예는 「10ms에 1로 올리고, 500ms 후부터 1000ms에 걸쳐 0으로 내린다」는 의미입니다. 쉼표 앞뒤에 공백을 넣는 점에 주의 해 주세요.
delay - 지연 실행
delay 오브젝트는 지정한 밀리초 후에 뱅(bang)을 출력합니다.
delay 10001000 밀리초(1초) 후에 bang을 출력합니다.
엔벨로프 제너레이터
else 라이브러리에는 편리한 엔벨로프 오브젝트가 있습니다.
| 오브젝트 | 기능 |
|---|---|
else/asr~ | Attack-Sustain-Release 엔벨로프 |
else/adsr~ | Attack-Decay-Sustain-Release 엔벨로프 |
else/envgen~ | 자유롭게 커브를 그릴 수 있는 엔벨로프 제너레이터 |
else/envgen~ 은 -curve 옵션으로 커브의 형태를 바꿀 수 있습니다.



사칙연산
Pd에서 수치 계산을 하는 오브젝트입니다.
| 오브젝트 | 기능 | 예 |
|---|---|---|
+ | 덧셈 | + 10 → 입력에 10을 더한다 |
- | 뺄셈 | - 5 → 입력에서 5를 뺀다 |
* | 곱셈 | * 2 → 입력을 2배로 한다 |
/ | 나눗셈 | / 3 → 입력을 3으로 나눈다 |
expr | 수식을 기술 | expr $f1 * 2 + 100 |
* 와 *~ 의 차이
*(틸데 없음): 값(숫자)의 곱셈*~(틸데 있음): 시그널(오디오 신호)의 곱셈
값과 시그널은 서로 다른 것입니다. 혼동하지 않도록 주의합시다.
expr 을 사용하면 복잡한 수식을 하나의 오브젝트로 쓸 수 있습니다. $f1 은 첫 번째 입력(float)을 나타냅니다.


센드/리시브
패치가 복잡해지면 선이 많아져서 보기 어려워집니다. 센드(s) 와 리시브(r) 를 사용하면 선을 긋지 않고도 데이터를 주고받을 수 있습니다.
사용법
s freq오브젝트를 배치한다(보내는 쪽)r freq오브젝트를 배치한다(받는 쪽)- 같은 이름(이 예에서는
freq)으로 대응시킨다
넘버 박스에서 직접 보내기
넘버 박스의 속성에서 직접 센드할 수 있습니다.
- 편집 모드에서 넘버 박스를 우클릭 → 속성 을 선택
- 「심볼 보내기(Send symbol)」 에 이름을 입력한다(예:
freq) - 이렇게 하면 넘버 박스의 값이 바뀔 때마다
r freq로 값이 전송된다

무선 연결
센드/리시브를 사용하면 패치를 정리하기 쉬워집니다. 특히 큰 패치에서는 적극적으로 활용합시다.
화음 생성
여러 개의 osc~ 를 사용해서 화음을 내 봅시다.
절차
osc~를 3개 배치한다(예:osc~ 261,osc~ 329,osc~ 392)- C4(도), E4(미), G4(솔)의 화음(C 메이저)
- 세 소리를
+~로 섞는다 *~ 0.3으로 음량을 낮춘다(세 음을 섞으면 커지기 때문)output~에 연결한다

가산 합성
가산 합성 은 여러 개의 사인파를 겹쳐서 복잡한 음색을 만드는 기법입니다. 기본 주파수의 배음(정수배의 주파수)을 더하면 다양한 악기의 음색에 가깝게 만들 수 있습니다.
배음렬
| 배음 | 주파수(기본 주파수 = 440 Hz) |
|---|---|
| 제1배음(기음) | 440 Hz |
| 제2배음 | 880 Hz |
| 제3배음 | 1320 Hz |
| 제4배음 | 1760 Hz |
각 배음의 음량비 를 바꿈으로써 서로 다른 음색을 만들 수 있습니다.

그 밖의 오실레이터
사인파 이외의 파형을 생성하는 오실레이터도 준비되어 있습니다.
| 오브젝트 | 파형 | 특징 |
|---|---|---|
osc~ | 사인파 | 가장 기본적인 파형. 부드러운 소리 |
phasor~ | 톱니파 | 밝고 풍부한 배음을 포함 |
noise~ | 화이트 노이즈 | 모든 주파수를 포함하는 랜덤한 신호 |
else/tri~ | 삼각파 | 사인파에 가깝지만 홀수 배음을 포함 |
else/square~ | 구형파 | 속이 빈 듯한 소리. 홀수 배음이 강하다 |


파형과 음색의 관계
음색의 차이는 배음의 구성 으로 결정됩니다. 여러 가지 파형을 비교해 들으며 음색의 차이를 체감해 봅시다.
딜레이(지연 효과)
딜레이는 소리를 지연시켜 반복하는 효과로, 에코나 리버브 같은 공간적인 확산을 만들 수 있습니다.
사용하는 오브젝트
| 오브젝트 | 기능 |
|---|---|
delwrite~ | 딜레이 버퍼에 기록한다 |
delread~ | 딜레이 버퍼에서 읽어낸다 |
cyclone/delay~ | 간단한 딜레이 |
else/delay.m~ | else 라이브러리의 딜레이 |
기본적인 사용법
delwrite~ $0-delay 1000을 배치한다(1000ms의 버퍼를 생성)delread~ $0-delay 500을 배치한다(500ms 지연된 소리를 읽어낸다)- 원음과 지연음을
+~로 믹스한다
$0-delay 의 의미
$0 은 패치마다 고유한 번호로 치환됩니다. 이를 통해 같은 패치를 여러 개 열어도 버퍼 이름이 충돌하지 않습니다. $0-delay 는 「이 패치 전용의 delay라는 이름의 버퍼」라는 의미입니다.

시그널과 값의 변환
Pd에는 시그널(오디오 신호, 굵은 선)과 값(숫자나 메시지, 가는 선)의 두 종류 데이터가 있습니다. 이들을 서로 변환해야 하는 상황이 있습니다.
시그널 → 값
| 오브젝트 | 기능 |
|---|---|
snapshot~ | 시그널의 현재 값을 취득(metro 와 조합해서 사용) |
else/s2f~ | 시그널을 값으로 변환(else 라이브러리) |
else/numbox~ | 시그널의 값을 표시하는 넘버 박스 |
snapshot~ 은 metro(메트로놈)와 조합해서 사용합니다. metro 100 은 100ms마다 bang을 출력하고, 그 타이밍에 시그널의 값을 취득합니다.
값 → 시그널
| 오브젝트 | 기능 |
|---|---|
sig~ | 값을 시그널로 변환 |
else/f2s~ | 값을 시그널로 변환(else 라이브러리) |
DSP를 켜기
시그널 관련 오브젝트는 DSP가 켜져 있지 않으면 동작하지 않습니다. 값이 표시되지 않거나 변하지 않는다면, 먼저 DSP가 켜져 있는지 확인해 주세요.


필터
필터는 특정 주파수 대역을 강조하거나 깎아내는 오브젝트입니다.
기본 필터
| 오브젝트 | 종류 | 기능 |
|---|---|---|
lop~ | 로우패스 필터 | 지정 주파수보다 낮은 소리를 통과시킨다 |
hip~ | 하이패스 필터 | 지정 주파수보다 높은 소리를 통과시킨다 |
bp~ | 밴드패스 필터 | 지정 주파수의 주변만 통과시킨다 |
사용법
noise~ → lop~ 1000 → output~이 예에서는 노이즈에서 1000 Hz 이하의 성분만 추출합니다(먹먹한 소리가 됩니다).
필터와 vline~ 에 대한 주의
lop~ 은 오른쪽 인렛에 vline~ 을 연결해서 컷오프 주파수를 매끄럽게 변화시킬 수 있지만, hip~ 과 bp~ 는 오른쪽 인렛에 vline~ 을 직접 연결할 수 없습니다. 대신 sig~ 로 값을 시그널로 변환한 뒤에 연결해 주세요.
값과 시그널의 선의 차이
패치를 연결할 때 가는 선(값)과 굵은 선(시그널)의 차이에 주목해 주세요. 시그널 오브젝트끼리는 시그널(굵은 선)로 연결됩니다. 값 오브젝트와 시그널 오브젝트를 뒤섞으면 생각한 대로 동작하지 않을 수 있습니다.



연습 문제
다음 연습 문제에 도전해 봅시다. 지금까지 배운 오브젝트를 조합해서 만들어 주세요.
문제1: 1000 Hz의 사인파 출력
1000 Hz의 사인파를 output~ 에서 출력하는 패치를 만들어 주세요.
힌트
osc~ 1000 과 output~ 을 연결하기만 하면 됩니다.
문제2: 두 개의 메시지로 주파수 전환
메시지 박스 두 개(500 과 1000)를 만들고, 클릭으로 osc~ 의 주파수를 500 Hz와 1000 Hz로 전환할 수 있는 패치를 만들어 주세요.
힌트
메시지 박스를 두 개 만들고, 각각 osc~ 의 왼쪽 인렛에 연결합니다.
문제3: 버튼으로 1초만 소리 내기
bang(버튼)을 클릭하면 1000 Hz의 사인파가 1초만 울리고 자동으로 멈추는 패치를 만들어 주세요.
힌트
vline~ 을 사용해서 음량을 제어합니다. bang → 메시지 1 10, 0 10 990 → vline~ → *~ 와 같이 연결합니다. 10ms로 페이드인하고, 990ms 후에 10ms로 페이드아웃합니다.
문제4: 페이드인하고 1초 후에 정지
bang 을 클릭하면 0에서부터 서서히 음량이 올라가고(페이드인), 1초 후에 소리가 멈추는 패치를 만들어 주세요.
힌트
vline~ 의 메시지에 1 500, 0 10 1000 과 같이 기술하면, 500ms에 걸쳐 페이드인하고 1000ms 후부터 10ms로 페이드아웃합니다.
문제5: 에코 추가
문제3의 패치에 0.5초 후에 에코(반복되는 소리)가 걸리도록 delwrite~ 와 delread~ 를 추가해 주세요.
힌트
delwrite~ $0-echo 1000 으로 1초 분량의 버퍼를 만들고, delread~ $0-echo 500 으로 500ms 지연된 소리를 읽어냅니다. 지연음의 음량을 *~ 0.5 로 절반으로 줄여 원음과 섞으면 자연스러운 에코가 됩니다.
문제6:【심화】방송 차임(딩동댕동)
「딩동댕동」 같은 차임 소리를 만들어 봅시다.
힌트
네 개의 음을 순서대로 냅니다. 예를 들면:
- 딩: G5(784 Hz)
- 동: E5(659 Hz)
- 댕: C5(523 Hz)
- 동〜: G4(392 Hz, 조금 길게)
delay 오브젝트로 각 음의 타이밍을 어긋나게 하고, 각각의 음에 vline~ 으로 엔벨로프를 걸면 차임다워집니다. 마지막 음은 조금 길게 울려 봅시다.