계단식 무작위 변조를 하려면 일정한 간격으로 새 값을 선택하고 다음 업데이트까지 그 값을 유지합니다. 이 REAPER 작업 흐름에서는 합성 톤과 작은 사용자 지정 JSFX 게인 효과를 사용해 지속 시간과 범위가 명확한 무작위 볼륨 단계를 만듭니다.
이 작업의 범위는 의도적으로 좁게 설정했습니다. 하나의 지속음을 예측할 수 없는 방식으로 레벨을 바꾸되, 레벨 사이를 계속 부드럽게 오가지는 않도록 합니다. 아래 자동화 방법은 완전한 효과 프로그램을 한 번 복사해야 합니다. 뒤의 섹션에서는 REAPER의 기본 자동화 엔벌로프를 사용해 편집 가능한 반복 계단을 만드는 방법을 설명합니다.
계단식 무작위 변조란?
결과를 결정하는 요소는 세 가지입니다. 값이 바뀌는 시점, 새로 선택되는 값, 그리고 효과가 그 값으로 이동하는 방식입니다. 이 작업 흐름에서는 타이밍이 일정하고, 레벨은 의사 무작위로 선택되며, 전환은 즉시 이루어집니다. 업데이트 사이에는 게인이 일정하게 유지됩니다.
예를 들어 −15 dB를 250밀리초 동안 유지한 다음, 다음 250밀리초 동안 −9 dB로 바꾸고, 이어서 −18 dB로 바꿀 수 있습니다. 이 숫자는 동작 방식을 설명하기 위한 예일 뿐, 측정값이나 보장된 출력 순서가 아닙니다.
REAPER의 파라미터 변조 시스템에는 Speed, Strength, Phase 및 방향을 조절하는 LFO가 있습니다. 자동화 시스템에는 별도로 Square 엔벌로프 포인트가 있습니다. 이 둘은 서로 다른 도구입니다. LFO 속도는 변조 속도를 조절하고, 스퀘어 엔벌로프 구간은 포인트 사이에서 유지되는 값을 정의합니다. Up and Running: A REAPER User Guide의 18장과 19장을 참조하세요.
아래의 사용자 지정 효과는 코드에서 유지 동작을 명시적으로 구현합니다. 스테레오 게인을 직접 처리하며, 다른 모든 플러그인 파라미터에 적용할 수 있는 범용 계단식 무작위 소스를 설정하지는 않습니다.
지속되는 합성 톤 준비하기
빈 REAPER 프로젝트와 트랙 하나로 시작합니다. 해당 트랙의 FX 체인에 ReaSynth를 추가합니다. REAPER 설명에 따르면 ReaSynth는 MIDI 아이템으로 연주할 수 있는 신시사이저이므로 녹음이나 외부 오디오 파일이 필요하지 않습니다. 출력 볼륨, 서스테인, 파형 믹스 등의 컨트롤이 있습니다. The REAPER Cockos Effects Summary Guide, ReaSynth.
다음과 같이 간단히 소스를 설정합니다.
- 프로젝트 템포를 120 BPM으로 설정하고 4/4박자에서 4마디 구간을 사용합니다.
- 트랙을 선택하고 4마디 전체를 포함하는 시간 선택 영역을 만듭니다.
Insert→New MIDI Item을 선택합니다.- MIDI 아이템을 두 번 클릭해 MIDI 편집기를 엽니다. 음표 하나를 그린 뒤 아이템 전체를 채우도록 오른쪽 끝을 늘립니다.
- ReaSynth에서
Volume을 약 −12 dB로,Sustain을 0 dB로 설정합니다. 간단한 톤을 위해Square mix,Sawtooth mix,Triangle mix는 0으로 둡니다.
MIDI 아이템 생성 및 편집 작업 흐름은 REAPER User Guide의 13장에 설명되어 있습니다. 여기 제시한 템포, 길이 및 레벨은 예시 설정이며 애플리케이션의 필수 조건이 아닙니다.
변조를 추가하기 전에 구간을 재생합니다. 트랙에서 지속음이 나오는지 확인합니다. 소리가 일찍 멈추면 음표 길이와 서스테인 설정을 확인합니다. 소스 자체의 레벨이 일정하게 유지될 때 게인 변화를 더 쉽게 판단할 수 있습니다.
무작위 레벨을 유지하는 효과 추가하기
JSFX는 텍스트 프로그램으로 작성하는 REAPER 내장 효과 시스템입니다. REAPER는 JSFX를 불러올 때 컴파일하므로, 이 예제에는 외부 프로그래밍 라이브러리가 필요하지 않습니다. 구조는 공식 JSFX Programming reference를 따릅니다.
View → FX Browser를 엽니다. 브라우저의 FX 메뉴에서 Create new JS FX를 선택하고 Stepped Random Gain처럼 구별하기 쉬운 이름을 지정합니다. Edit JS FX를 사용해 소스를 열고, 기존 내용을 아래의 전체 프로그램으로 바꾼 뒤 저장합니다. 이 생성 및 편집 명령은 REAPER User Guide의 16.16절에 설명되어 있습니다.
desc:Stepped Random Gain
slider1:250<20,2000,1>Step duration (ms)
slider2:-18<-60,0,0.1>Level endpoint A (dB)
slider3:-6<-60,0,0.1>Level endpoint B (dB)
in_pin:Left
in_pin:Right
out_pin:Left
out_pin:Right
@init
remaining = 0;
gain = 1;
@slider
interval_samples = max(1, floor(srate * slider1 / 1000 + 0.5));
low_db = min(slider2, slider3);
high_db = max(slider2, slider3);
remaining = 0;
@sample
remaining <= 0 ? (
level_db = low_db + rand(1) * (high_db - low_db);
gain = 10 ^ (level_db / 20);
remaining = interval_samples;
);
spl0 *= gain;
spl1 *= gain;
remaining -= 1;
이것은 코드 조각이 아니라 완전한 스테레오 오디오 효과입니다. 트랙의 FX 체인에서 ReaSynth 뒤에 추가합니다. 이름이 보이지 않으면 FX 브라우저의 검색 필터를 지웁니다.
프로그램은 rand(1)을 사용해 의사 무작위 값을 얻고 그 값을 두 dB 끝점 사이로 매핑합니다. 언어의 조건문 문법, 거듭제곱 연산자, 무작위 함수는 JSFX Programming Reference — Language Essentials에 설명되어 있습니다.
카운터는 REAPER의 현재 샘플 레이트인 srate을 사용합니다. 각 샘플은 카운터가 만료될 때까지 저장된 동일한 게인을 거칩니다. 두 채널 모두 같은 게인을 받으므로, 이 효과는 각 채널의 레벨을 따로 무작위화하지 않습니다. REAPER는 srate, spl0, spl1을 JSFX Programming Reference — Special Variables에 설명합니다.
이 프로그램은 해당 참조 문서를 바탕으로 검토했습니다. 카운터 산술도 44.1 및 48 kHz에서 별도로 확인했지만, 이 문서를 위해 REAPER에서 JSFX를 실행하지는 않았습니다.
단계 지속 시간과 레벨 범위 설정하기
Step duration (ms)를 250으로, Level endpoint A (dB)을 −18로, Level endpoint B (dB)을 −6으로 설정해 시작합니다. 이 설정은 초당 네 번 감쇠 값을 새로 선택합니다. 컨트롤을 변경하지 않는 한, 선택된 각 값은 전체 구간 동안 유지됩니다.
끝점은 신시사이저 뒤에 적용되는 게인을 지정합니다. 출력 미터의 목표 판독값이 아닙니다. 예를 들어 −6 dB는 약 0.501의 샘플 배율에 해당하고, −18 dB는 약 0.126에 해당합니다. 최종 출력은 여전히 소스 신호와 그 뒤의 트랙 처리에 따라 달라집니다.
| 원하는 동작 | 예시 설정 | 바뀌는 점 |
|---|---|---|
| 느리고 뚜렷한 평탄 구간 | 1,000 ms | 초당 한 번 새 레벨 선택 |
| 중간 속도 계단 변화 | 250 ms | 초당 네 번 새 레벨 선택 |
| 빠른 계단 변화 | 125 ms | 초당 여덟 번 새 레벨 선택 |
| 작은 레벨 차이 | 끝점 −9 및 −6 dB | 선택 범위가 좁아짐 |
| 비교를 위한 일정한 감쇠 | 두 끝점 모두 −6 dB | 매번 같은 게인 선택 |
120 BPM에서 8분음표 하나는 250밀리초입니다. 60초를 120박으로 나눈 다음 다시 2로 나눈 값입니다. 이는 계산 과정을 보여 주는 예입니다. 제공된 효과는 밀리초를 사용하며 템포 변경을 따르거나 프로젝트의 음악 그리드에 단계들을 맞추지 않습니다.
프로그램이 끝점을 정렬하므로 어느 순서로 입력해도 됩니다. 슬라이더를 변경하면 다음 처리 샘플에서 새 구간이 시작됩니다. 무작위 레벨은 보간 없이 유지되지만, 연속해서 선택된 두 값이 우연히 서로 가까울 수는 있습니다.
편집 가능한 반복 계단 만들기
정확한 타임라인 위치에 정확한 값을 지정하려면 자동화 엔벌로프를 사용합니다. 이는 노출된 효과 파라미터에 유지되는 변화를 적용하는 기본 기능을 이용하는 방법이기도 합니다. REAPER의 User Guide 18장에는 파라미터 엔벌로프와 Square 포인트 모양이 설명되어 있습니다.
고정 볼륨 패턴을 만들려면 먼저 사용자 지정 JSFX를 바이패스합니다. 트랙의 엔벌로프 컨트롤을 열고 Volume 엔벌로프를 표시합니다. 수동으로 편집하는 동안 트랙을 Trim/Read 상태로 둡니다.
Shift 키를 누른 채 클릭해 250밀리초 간격으로 포인트를 만든 다음, 포인트를 불규칙한 레벨로 옮깁니다. 포인트를 오른쪽 클릭하고 Set Point Shape → Square를 선택합니다. 다음 포인트까지 값이 유지되어야 하는 각 포인트에 이 모양을 적용합니다. 엔벌로프에 수평 평탄 구간과 그 뒤를 잇는 수직 변화가 표시되어야 합니다.
다른 효과의 파라미터를 사용하려면 원하는 컨트롤을 터치하고 Param → Show track envelope를 선택합니다. 대신 해당 엔벌로프에 포인트를 추가하고 모양을 지정합니다. 파라미터 메뉴 사용 방법은 The REAPER Cockos Effects Summary Guide에 설명되어 있습니다.
불규칙한 값을 수동으로 배치하면 고정 패턴이 만들어지며, 재생할 때마다 새 무작위 값이 생성되지는 않습니다. 패턴을 재사용하려면 해당 시간 범위를 선택하고 엔벌로프를 오른쪽 클릭한 다음 Automation items → Insert new automation item을 선택합니다. REAPER는 반복 자동화 아이템과 풀링된 복사본을 지원하며, 한 복사본을 편집하면 다른 복사본에도 변경 사항이 반영됩니다. REAPER User Guide, Automation Items.
부드러운 움직임, 변화가 보이지 않는 문제, 반복 재현 문제 해결하기
엔벌로프가 계속 기울어져 보이면 나가는 포인트의 모양을 확인합니다. Linear는 램프를 만들고, Square는 여기 필요한 유지 구간을 만듭니다. 스퀘어 LFO와 수동으로 그린 다중 레벨 계단도 서로 다른 용도입니다. 두 레벨만 번갈아 나타나게 해서는 임의의 레벨 순서가 만들어지지 않습니다.
사용자 지정 효과에서 눈에 띄는 변화가 없다면 ReaSynth 뒤에 있는지, 활성화되어 있는지, 끝점이 서로 다른지 확인합니다. 구조를 더 쉽게 살펴보려면 단계 간격을 1,000밀리초로 설정하고 끝점을 −24 및 −6 dB로 설정해 보세요. 그런 다음 프로젝트에 필요한 범위로 되돌립니다.
게인이 갑자기 바뀌면 샘플 배율이 즉시 변경되므로 클릭음이 생길 수 있습니다. 이 프로그램에는 의도적으로 스무딩 처리를 넣지 않았습니다. 레벨 차이를 줄이면 이런 불연속의 크기를 줄일 수 있지만, 클릭이 없다고 보장할 수는 없습니다. 전환 램프를 추가하면 즉시 단계가 바뀌는 동작 자체가 달라집니다.
이 효과는 스테레오 트랙용이며 첫 두 오디오 채널만 수정합니다. 자동화 포인트를 기록하거나, 선택된 무작위 순서를 저장하거나, 값을 소수의 레벨로 양자화하거나, 템포와 동기화하지 않습니다. REAPER는 보통 재생이 시작될 때 JSFX의 @init 구간을 실행하며, 이 프로그램은 그때 카운터를 초기화합니다. 재생을 다시 시작한 뒤 동일한 무작위 순서가 재현될 것이라고 기대하지 마세요. JSFX code-section reference.
자동으로 생성되는 유지 레벨을 원한다면 사용자 지정 게인 효과를 사용합니다. 특정 변화를 편집하고 반복하며 보존하려면 스퀘어 자동화를 사용합니다. 두 방법 모두 합성 톤을 뚜렷한 평탄 구간으로 바꿀 수 있습니다. 선택은 새 값을 원하느냐, 정확한 타임라인 패턴을 원하느냐에 따라 달라집니다.
출처
- Up and Running: A REAPER User Guide v7.84 — REAPER / Geoffrey Francis.
- The REAPER Cockos Effects Summary Guide — REAPER / Geoffrey Francis.
- JSFX Programming — Cockos.
- JSFX Programming Reference — Language Essentials — Cockos.
- JSFX Programming Reference — Special Variables — Cockos.