Skip to content

제3강 Pure Data 기초 ​

Pure Data(Pd)의 기본 조작을 배우고, 소리를 생성・가공하는 방법을 익혀 봅시다.

이번 강의의 목표 ​

  • Pd의 기본 조작(오브젝트 배치, 연결)을 익힌다
  • 사인파를 생성하고 주파수・음량을 제어할 수 있게 된다
  • 엔벨로프, 필터, 딜레이 등의 음향 처리를 이해한다
  • 연습 문제를 통해 배운 내용을 정착시킨다

준비 ​

Pd 설치 ​

지난 강의의 절차대로 Pd를 설치했는지 확인해 주세요. 실행해서 Pd 콘솔이 표시되면 OK입니다.

라이브러리 설치 ​

이 수업에서는 cyclone 과 else 라는 외부 라이브러리를 사용합니다. 다음 절차대로 설치해 주세요.

  1. Pd를 실행한다
  2. 메뉴에서 도움말(Mac의 경우 Tools)→ external 찾기(Find externals) 를 선택한다
  3. 검색란에 cyclone 을 입력해서 검색한다
  4. 검색 결과에서 cyclone 을 선택한다
  5. Install 버튼을 클릭해서 설치한다
  6. 같은 방법으로 else 를 검색해서 설치한다

plugdata를 사용하는 경우

이 수업에서 사용하는 plugdata 에는 cyclone・else가 모두 미리 내장되어 있으므로, 위의 설치 작업은 필요 없습니다.

설치 후 재시작(Pure Data를 사용하는 경우)

라이브러리를 설치했다면 Pd를 한 번 종료했다가 다시 실행해 주세요. 재시작하지 않으면 라이브러리가 로드되지 않는 경우가 있습니다.

Pd의 기본 조작 ​

조작WindowsMac
오브젝트 배치Ctrl+1Cmd+1
메시지 배치Ctrl+2Cmd+2
넘버 박스 배치Ctrl+3Cmd+3
편집 모드 전환Ctrl+ECmd+E
DSP 켜기/끄기Ctrl+/Cmd+/

편집 모드와 실행 모드

  • 편집 모드(커서가 화살표): 오브젝트의 배치・연결・이동이 가능
  • 실행 모드(커서가 손가락): 슬라이더나 넘버 박스를 조작할 수 있음
  • Ctrl+E(Cmd+E)로 전환합니다

사인파 생성 ​

소리의 기본은 사인파(sine wave) 입니다. Pd에서 사인파를 생성해 봅시다.

사용하는 오브젝트 ​

오브젝트기능
osc~사인파 오실레이터. 지정한 주파수의 사인파를 생성한다
output~Pd 표준 출력 오브젝트(음량 슬라이더 포함)
else/out~else 라이브러리의 출력 오브젝트(기능이 더 풍부)

~(틸데)의 의미

오브젝트 이름 끝에 ~ 가 붙은 것은 시그널(오디오 신호) 을 다루는 오브젝트입니다. ~ 가 붙지 않은 것은 값(숫자나 메시지) 을 다룹니다. 이 구별은 매우 중요합니다.

절차 ​

  1. 새 패치를 만든다(Ctrl+N / Cmd+N)
  2. Ctrl+1(Cmd+1)로 오브젝트를 배치하고 osc~ 440 을 입력한다
  3. 같은 방법으로 output~ 을 배치한다(또는 else/out~)
  4. osc~ 의 출력(아래쪽)에서 output~ 의 입력(위쪽)으로 선을 긋는다
  5. DSP를 켠다(Ctrl+/ / Cmd+/, 또는 콘솔의 DSP 체크박스)
  6. 440 Hz의 사인파가 들리면 성공

사인파 생성

음량에 주의

DSP를 켜기 전에 PC의 스피커 음량을 낮춰 두세요. 갑자기 큰 소리가 날 수 있습니다. 헤드폰을 사용 중이라면 특히 주의해 주세요.


주파수 컨트롤 ​

사인파의 주파수(음의 높낮이)를 실시간으로 변경하는 방법을 배웁니다.

방법1: 메시지로 변경 ​

  1. 메시지 박스(Ctrl+2 / Cmd+2)를 배치한다
  2. 메시지에 440 을 입력한다
  3. 메시지를 하나 더 만들어 880 을 입력한다
  4. 각 메시지에서 osc~ 의 왼쪽 인렛(입력)으로 연결한다
  5. 실행 모드로 전환하고 메시지를 클릭하면 주파수가 바뀐다

방법2: 넘버 박스로 변경 ​

  1. 넘버 박스(Ctrl+3 / Cmd+3)를 배치한다
  2. osc~ 의 왼쪽 인렛에 연결한다
  3. 실행 모드에서 넘버 박스를 드래그하면 값을 연속적으로 변경할 수 있다

방법3: 슬라이더로 변경 ​

  1. 메뉴 배치 → H 슬라이더(또는 V 슬라이더)를 선택한다
  2. 슬라이더를 osc~ 의 왼쪽 인렛에 연결한다
  3. 슬라이더의 범위를 설정한다:
    • 편집 모드에서 슬라이더를 우클릭 → 속성 을 선택
    • 하한(lower) 을 100, 상한(upper) 을 2000 으로 설정한다
  4. 실행 모드에서 슬라이더를 움직이면 100〜2000 Hz 범위에서 주파수가 바뀐다

주파수 컨트롤


MIDI 노트 넘버와 주파수의 변환 ​

음악에서는 MIDI 노트 넘버 를 사용해 음정을 지정하는 것이 일반적입니다. mtof 오브젝트로 MIDI 노트 넘버를 주파수(Hz)로 변환할 수 있습니다.

MIDI 노트음명주파수 (Hz)
60C4(가운데 도)261.6
69A4(라)440.0
72C5(높은 도)523.3

절차 ​

  1. 넘버 박스를 배치한다
  2. mtof 오브젝트를 배치한다
  3. 넘버 박스 → mtof → osc~ 순으로 연결한다
  4. 넘버 박스에 69 를 입력하면 440 Hz(라 음)가 난다

mtof

ftom

반대로 주파수에서 MIDI 노트 넘버로 변환하려면 ftom 을 사용합니다.


음량 컨트롤 ​

음량을 제어하려면 시그널에 숫자를 곱합니다.

사용하는 오브젝트 ​

오브젝트기능
*~시그널의 곱셈. 음량 조정에 사용한다
toggle켜기/끄기 스위치(0과 1을 전환)

방법1: 토글로 소리 켜기/끄기 ​

  1. toggle(배치 → Toggle)을 배치한다
  2. *~ 오브젝트를 배치한다
  3. osc~ 440 → *~ → output~ 순으로 연결한다
  4. toggle → *~ 의 오른쪽 인렛에 연결한다
  5. 토글을 클릭하면 소리를 켜고 끌 수 있다

음량 컨트롤1

방법2: 메시지로 음량 지정 ​

output~ 이나 else/out~ 은 메시지로 음량을 제어할 수 있습니다.

level $1

슬라이더나 넘버 박스의 값을 $1 에 대입해서 음량을 변경할 수 있습니다.

음량 컨트롤2


음량・값의 자동 변화(엔벨로프) ​

소리를 자연스럽게 들리게 하려면, 음량을 시간에 따라 변화시키는 엔벨로프 가 중요합니다.

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 1000

1000 밀리초(1초) 후에 bang을 출력합니다.

엔벨로프 제너레이터 ​

else 라이브러리에는 편리한 엔벨로프 오브젝트가 있습니다.

오브젝트기능
else/asr~Attack-Sustain-Release 엔벨로프
else/adsr~Attack-Decay-Sustain-Release 엔벨로프
else/envgen~자유롭게 커브를 그릴 수 있는 엔벨로프 제너레이터

else/envgen~ 은 -curve 옵션으로 커브의 형태를 바꿀 수 있습니다.

엔벨로프1

엔벨로프2

엔벨로프3


사칙연산 ​

Pd에서 수치 계산을 하는 오브젝트입니다.

오브젝트기능예
+덧셈+ 10 → 입력에 10을 더한다
-뺄셈- 5 → 입력에서 5를 뺀다
*곱셈* 2 → 입력을 2배로 한다
/나눗셈/ 3 → 입력을 3으로 나눈다
expr수식을 기술expr $f1 * 2 + 100

* 와 *~ 의 차이

  • *(틸데 없음): 값(숫자)의 곱셈
  • *~(틸데 있음): 시그널(오디오 신호)의 곱셈

값과 시그널은 서로 다른 것입니다. 혼동하지 않도록 주의합시다.

expr 을 사용하면 복잡한 수식을 하나의 오브젝트로 쓸 수 있습니다. $f1 은 첫 번째 입력(float)을 나타냅니다.

사칙연산1

사칙연산2


센드/리시브 ​

패치가 복잡해지면 선이 많아져서 보기 어려워집니다. 센드(s) 와 리시브(r) 를 사용하면 선을 긋지 않고도 데이터를 주고받을 수 있습니다.

사용법 ​

  1. s freq 오브젝트를 배치한다(보내는 쪽)
  2. r freq 오브젝트를 배치한다(받는 쪽)
  3. 같은 이름(이 예에서는 freq)으로 대응시킨다

넘버 박스에서 직접 보내기 ​

넘버 박스의 속성에서 직접 센드할 수 있습니다.

  1. 편집 모드에서 넘버 박스를 우클릭 → 속성 을 선택
  2. 「심볼 보내기(Send symbol)」 에 이름을 입력한다(예: freq)
  3. 이렇게 하면 넘버 박스의 값이 바뀔 때마다 r freq 로 값이 전송된다

센드・리시브

무선 연결

센드/리시브를 사용하면 패치를 정리하기 쉬워집니다. 특히 큰 패치에서는 적극적으로 활용합시다.


화음 생성 ​

여러 개의 osc~ 를 사용해서 화음을 내 봅시다.

절차 ​

  1. osc~ 를 3개 배치한다(예: osc~ 261, osc~ 329, osc~ 392)
    • C4(도), E4(미), G4(솔)의 화음(C 메이저)
  2. 세 소리를 +~ 로 섞는다
  3. *~ 0.3 으로 음량을 낮춘다(세 음을 섞으면 커지기 때문)
  4. output~ 에 연결한다

화음


가산 합성 ​

가산 합성 은 여러 개의 사인파를 겹쳐서 복잡한 음색을 만드는 기법입니다. 기본 주파수의 배음(정수배의 주파수)을 더하면 다양한 악기의 음색에 가깝게 만들 수 있습니다.

배음렬 ​

배음주파수(기본 주파수 = 440 Hz)
제1배음(기음)440 Hz
제2배음880 Hz
제3배음1320 Hz
제4배음1760 Hz

각 배음의 음량비 를 바꿈으로써 서로 다른 음색을 만들 수 있습니다.

가산 합성


그 밖의 오실레이터 ​

사인파 이외의 파형을 생성하는 오실레이터도 준비되어 있습니다.

오브젝트파형특징
osc~사인파가장 기본적인 파형. 부드러운 소리
phasor~톱니파밝고 풍부한 배음을 포함
noise~화이트 노이즈모든 주파수를 포함하는 랜덤한 신호
else/tri~삼각파사인파에 가깝지만 홀수 배음을 포함
else/square~구형파속이 빈 듯한 소리. 홀수 배음이 강하다

오실레이터1

오실레이터2

파형과 음색의 관계

음색의 차이는 배음의 구성 으로 결정됩니다. 여러 가지 파형을 비교해 들으며 음색의 차이를 체감해 봅시다.


딜레이(지연 효과) ​

딜레이는 소리를 지연시켜 반복하는 효과로, 에코나 리버브 같은 공간적인 확산을 만들 수 있습니다.

사용하는 오브젝트 ​

오브젝트기능
delwrite~딜레이 버퍼에 기록한다
delread~딜레이 버퍼에서 읽어낸다
cyclone/delay~간단한 딜레이
else/delay.m~else 라이브러리의 딜레이

기본적인 사용법 ​

  1. delwrite~ $0-delay 1000 을 배치한다(1000ms의 버퍼를 생성)
  2. delread~ $0-delay 500 을 배치한다(500ms 지연된 소리를 읽어낸다)
  3. 원음과 지연음을 +~ 로 믹스한다

$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가 켜져 있는지 확인해 주세요.

시그널과 값1

시그널과 값2


필터 ​

필터는 특정 주파수 대역을 강조하거나 깎아내는 오브젝트입니다.

기본 필터 ​

오브젝트종류기능
lop~로우패스 필터지정 주파수보다 낮은 소리를 통과시킨다
hip~하이패스 필터지정 주파수보다 높은 소리를 통과시킨다
bp~밴드패스 필터지정 주파수의 주변만 통과시킨다

사용법 ​

noise~ → lop~ 1000 → output~

이 예에서는 노이즈에서 1000 Hz 이하의 성분만 추출합니다(먹먹한 소리가 됩니다).

필터와 vline~ 에 대한 주의

lop~ 은 오른쪽 인렛에 vline~ 을 연결해서 컷오프 주파수를 매끄럽게 변화시킬 수 있지만, hip~ 과 bp~ 는 오른쪽 인렛에 vline~ 을 직접 연결할 수 없습니다. 대신 sig~ 로 값을 시그널로 변환한 뒤에 연결해 주세요.

값과 시그널의 선의 차이

패치를 연결할 때 가는 선(값)과 굵은 선(시그널)의 차이에 주목해 주세요. 시그널 오브젝트끼리는 시그널(굵은 선)로 연결됩니다. 값 오브젝트와 시그널 오브젝트를 뒤섞으면 생각한 대로 동작하지 않을 수 있습니다.

필터1

필터2

필터3


연습 문제 ​

다음 연습 문제에 도전해 봅시다. 지금까지 배운 오브젝트를 조합해서 만들어 주세요.

문제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~ 으로 엔벨로프를 걸면 차임다워집니다. 마지막 음은 조금 길게 울려 봅시다.