메타사운드로 프로시저럴 음악 생성하기
메타사운드 는 오디오 디자이너가 사운드 소스를 생성하기 위해 디지털 신호 처리(Digital Signal Processing, DSP) 그래프를 완벽하게 제어할 수 있게 해 주는 하이 퍼포먼스 오디오 시스템입니다.
이 가이드에서는 메타사운드 소스 및 블루프린트를 사용하여 게임플레이 기반 프로시저럴 음악 시스템을 생성하는 방법을 살펴봅니다.
전제 조건
이 가이드에서는 일인칭 템플릿 프로젝트 등 플레이어 캐릭터 무브먼트를 지원하는 프로젝트가 필요합니다.
1 - 음악 메타사운드 생성
이미지를 클릭하면 전체 크기로 표시됩니다.
먼저 프로시저럴 음악을 재생하는 메타사운드를 생성합니다. 아래의 각 단계에 따라 위 그래프를 섹션별로 빌드합니다.
이 프로세스는 향후 단계에서 블루프린트에서 액세스하기 위해 몇 개의 입력 파라미터를 노출합니다.
1.1 - 초기 구성
퍼시스턴트 스테레오 오디오를 지원하는 메타사운드 소스를 생성합니다.
- 메타사운드 소스를 생성합니다.
- 콘텐츠 브라우저 에서 추가(Add) 버튼을 클릭합니다.
- 오디오(Audio) > 메타사운드 소스(MetaSound Source) 를 선택합니다.
- 새로 생성한 메타사운드를
MSS_Music등으로 명명합니다.
- 메타사운드를 더블클릭하여 메타사운드 에디터(MetaSound Editor) 를 엽니다.
- 인터페이스(Interfaces) 패널에서 UE.Source.OneShot 인터페이스 항목 옆에 있는 휴지통 모양의 제거(Remove) 버튼을 클릭합니다. 그러면 앰비언스 또는 음악 등 퍼시스턴트 사운드에서 사용되지 않는 On Finished Output 노드가 제거됩니다.
- 메타사운드 에디터 툴바에서 메타사운드(MetaSound) 버튼을 클릭합니다.
- 디테일 패널에서 메타사운드 > 출력 포맷(Output Format) 드롭다운을 클릭하고 스테레오(Stereo) 를 선택합니다. 그러면 Out Mono Output 노드가 Out Left 및 Out Right Output 노드로 대체됩니다.
1.2 - Tempo and Rhythm
Trigger 노드로 음악의 타이밍을 제어하기 위해 'Tempo and Rhythm' 섹션을 빌드합니다.
- On Play Input 노드를 찾아서 핀을 빈 공간으로 드래그합니다. 노드 검색에 'Trigger Repeat'를 입력하여 연결된 노드를 생성합니다. 그래프에서 노드를 드래그하여 이동할 수 있습니다.
- Trigger Repeat 노드에서 다음을 수행합니다.
- 주기(Period) 핀에서 드래그하여 BPM To Seconds 노드를 생성합니다.
- 반복 출력(RepeatOut) 핀에서 드래그하여 Trigger Counter 노드를 생성합니다.
- BPM to Seconds 노드에서 다음을 수행합니다.
- 온음표 나누기(Divisions of Whole Note) 를 16으로 설정합니다.
- BPM 핀에서 드래그하여 그래프 입력으로 승격(Promote to Graph Input) 을 선택합니다. 그러면 'BPM'이라는 이름의 플로트 입력 노드가 생성됩니다.
- BPM 노드를 선택합니다.
- 디테일 패널에서 디폴트 값(Default Value) > 범위(Range) 를 60.0, 180.0으로 설정합니다.
- Trigger Counter 노드에서 리셋 카운트(Reset Count) 를 8로 설정합니다.
- On Play Input 노드를 제외한 모든 노드를 선택하고 선택한 노드 중 하나를 우클릭한 후 선택에서 코멘트 생성(Create Comment From Selection) 을 선택합니다.
- 코멘트 박스를 'Tempo and Rhythm'으로 명명합니다.
디테일 패널에서 선택한 코멘트 박스의 컬러를 변경할 수 있습니다.
1.3 - Melody Generation
'Melody Generation' 섹션을 빌드하여 지정된 스케일에서 멜로디를 랜덤으로 생성합니다.
- 'Tempo and Rhythm' 섹션의 Trigger Counter 노드에서 다음을 수행합니다.
- 트리거 시(On Trigger) 핀에서 드래그하여 Random Get (Float:Array) 노드를 생성합니다.
- 리셋 시(On Reset) 핀에서 드래그하여 Random Get (Float:Array) 노드의 리셋(Reset) 에 연결합니다.
- Random Get (Float:Array) 노드에서 다음을 수행합니다.
- In 배열(In Array) 핀에서 드래그하여 Scale to Note Array 노드를 생성합니다.
- 시드(Seed) 핀에서 드래그하여 Random (Int) 노드를 생성합니다.
- 값(Value) 핀에서 드래그하여 Add (Float) 노드를 생성합니다.
- Scale to Note Array 노드의 스케일 각도(Scale Degrees) 핀에서 드래그하여 그래프 입력으로 승격 을 선택합니다. 그러면 'Scale Degrees'라는 이름의 열거형 입력 노드가 생성됩니다.
- Scale Degrees 노드를 선택합니다.
- 디테일 패널에서 다음을 수행합니다.
- 일반(General) > 입력(Input) 을 'Scale'로 설정하여 입력의 이름을 변경합니다.
- (선택 사항) 디폴트 값 > 디폴트(Default) 를 사용하려는 음계로 설정합니다. 디폴트는 '장음계(Major Scale)'입니다.
- Random (Int) 노드에서 다음을 수행합니다.
- 최대(Max) 를 100000으로 설정합니다.
- 다음(Next) 핀에서 드래그하여 그래프 입력으로 승격 을 선택합니다. 그러면 'Next'라는 이름의 트리거 입력 노드가 생성됩니다.
- Next 노드를 선택합니다.
- 디테일 패널에서 일반 > 입력 을 'NewMelody'로 설정하여 입력의 이름을 변경합니다.
- Add (Float) 노드에서 '하단 가수(Bottom Addend)'를 48.0으로 설정합니다. 이는 4옥타브의 오프셋입니다.
- 새 노드 주변에 'Melody Generation'이라는 코멘트 박스를 생성합니다.
1.4 - Synthesis (Sine)
'Synthesis (Sine)' 섹션을 빌드하여 입력 음표의 주파수에서 사인파를 생성합니다.
- 'Melody Generation' 섹션의 Add (Float) 노드에서 다음을 수행합니다.
- '출력(Output)' 핀에서 드래그하여 MIDI To Frequency (Float) 노드를 생성합니다.
- '출력' 핀에서 다시 드래그하여 Add (Float) 노드를 생성합니다.
- 새 Add (Float) 노드에서 다음을 수행합니다.
- '출력' 핀에서 드래그하여 MIDI To Frequency (Float) 노드를 하나 더 생성합니다.
- '하단 가수' 핀에서 드래그하여 그래프 입력으로 승격 을 선택합니다. 그러면 'AdditionalOperands'라는 이름의 플로트 입력 노드가 생성됩니다.
- AdditionalOperands 노드를 선택합니다.
- 디테일 패널에서 다음을 수행합니다.
- 일반 > 입력 을 'Detune'으로 설정하여 입력의 이름을 변경합니다.
- 디폴트 값 > 디폴트 를 12.0로 설정합니다.
- 디폴트 값 > 범위 를 0.0, 12.0로 설정합니다.
- 각 MIDI To Frequency (Float) 노드의 Out 주파수(Out Frequency) 핀에서 드래그하여 Sine 노드를 생성합니다.
- 첫 번째 Sine 노드의 오디오 핀에서 드래그하여 Add (Audio) 노드를 생성합니다.
- 두 번째 Sine 노드에서 오디오 핀을 Add (Audio) 노드의 '하단 가수'에 연결합니다.
- 새 노드 주변에 'Synthesis (Sine)'이라는 코멘트 박스를 생성합니다.
1.5 - Synthesis (Saw)
'Synthesis (Saw)' 섹션을 빌드하여 입력 음표의 주파수에서 쏘우파를 생성합니다.
- 'Synthesis (Saw)' 섹션의 모든 노드를 선택하고 선택한 노드 중 하나를 우클릭한 후 복제(Duplicate) 를 선택합니다.
- Add (Float) 및 MIDI to Frequency (Float) 노드의 '입력(Input)' 핀이 'Melody Generation' 섹션에 있는 Add (Float) 노드의 '출력(Output)' 핀에 연결되어 있는지 확인합니다.
- 두 Sine 노드를 삭제하고 Saw 노드로 대체합니다.
- 새 노드 주변에 'Synthesis (Saw)'라는 코멘트 박스를 생성합니다.
1.6 - Crossfade
사인 및 쏘우 합성 비율을 제어하기 위해 'Crossfade' 섹션을 빌드합니다.
- 'Synthesis (Sine)' 섹션의 Add (Audio) 에 있는 '출력' 핀에서 드래그하여 Crossfade (Audio, 2) 노드를 생성합니다.
- Crossfade (Audio, 2) 노드에서 다음을 수행합니다.
- In 1 핀을 'Synthesis (Saw)' 섹션에 있는 Add (Audio) 노드의 '출력' 핀에 연결합니다.
- 크로스페이드 값(Crossfade Value) 핀에서 드래그하여 그래프 입력으로 승격 을 선택합니다. 그러면 'Crossfade Value'라는 이름의 플로트 입력 노드가 생성됩니다.
- Crossfade Value 노드를 선택합니다.
- 디테일 패널에서 일반 > 입력 을 'Crossfade'로 설정하여 입력의 이름을 변경합니다.
- 새 노드 주변에 'Synthesis (Crossfade)'라는 코멘트 박스를 생성합니다.
1.7 - Filtering
'Filtering' 섹션을 빌드하여 사운드를 스무딩합니다.
- 'Crossfade' 섹션의 Crossfade (Audio, 2) 노드에서 Out 핀에서 드래그하여 Ladder Filter 노드를 생성합니다.
- Ladder Filter 노드에서 다음을 수행합니다.
- 공명(Resonance) 을 6.0으로 설정합니다.
- 컷오프 주파수(Cutoff Frequency) 핀에서 드래그하여 LFO 노드를 생성합니다.
- LFO 노드에서 다음을 수행합니다.
- 주파수(Frequency) 를 0.5로 설정합니다.
- 최솟값(Min Value) 을 500.0으로 설정합니다.
- 최댓값(Max Value) 을 5000.0으로 설정합니다.
- 새 노드 주변에 'Filtering'이라는 코멘트 박스를 생성합니다.
1.8 - Enveloping
시작-감쇠 엔벨로프로 'Enveloping' 섹션을 빌드하여 멜로디에서 음표가 지속되는 것을 제거합니다.
- 'Melody Generation' 섹션에 있는 Random Get (Float:Array) 노드의 다음에(On Next) 핀에서 드래그하여 AD Envelope (Audio) 노드를 생성합니다.
- AD Envelope (Audio) 노드에서 감쇠 시간(Decay Time) 을 0.1로 설정합니다.
- 새 노드 주변에 'Enveloping'이라는 코멘트 박스를 생성합니다.
1.9 - Effects Processing
'Effects Processing' 섹션을 빌드하여 스테레오 와이드닝 이펙트를 생성합니다. 이 딜레이는 원래 모노인 신호가 마치 스테레오 신호처럼 들리게 합니다.
- 'Enveloping 섹션의 AD Envelope (Audio) 노드에 있는Out 엔벨로프(Out Envelope) 핀에서 드래그하여 Multiply (Audio) 노드를 생성합니다.
- Multiply (Audio) 노드에서 다음을 수행합니다.
- '하단 피제수(Bottom Multiplicand)' 핀을 'Filtering' 섹션에 있는 Ladder Filter 노드의 Out 핀에 연결합니다.
- '출력' 핀에서 드래그하여 Delay 노드를 생성합니다.
- Delay 노드에서 다음을 수행합니다.
- 딜레이 시간(Delay Time) 을 0.02로 설정합니다.
- Out 핀에서 드래그하여 Stereo Delay 노드를 생성합니다.
- Stereo Delay 노드에서 다음을 수행합니다.
- In 오른쪽 핀을 Multiply (Audio) 노드의 '출력' 핀에 연결합니다.
- 딜레이 모드(Delay Mode) 를 '핑퐁(Ping Pong)'으로 설정합니다.
- 딜레이 시간(Delay Time) 을 0.2로 설정합니다.
- 딜레이 비율(Delay Ratio) 을 0.2로 설정합니다.
- 드라이 레벨(Dry Level) 을 0.7로 설정합니다.
- 웻 레벨(Wet Level) 을 0.2로 설정합니다.
- 피드백(Feedback) 을 0.4로 설정합니다.
- Out 왼쪽 핀을 Out Left Output 노드에 연결합니다.
- Out 오른쪽 핀을 Out Right Output 노드에 연결합니다.
- Delay 및 Stereo Delay 노드 주변에 'Effects Processing'이라는 코멘트 박스를 생성합니다.
1.11 - 메타사운드 재생
메타사운드를 이제 재생할 수 있습니다.
- 메타사운드를 저장합니다.
- 메타사운드 에디터 툴바에서 재생(Play) 버튼을 클릭하여 메타사운드를 재생합니다.
- 위젯 또는 디테일 패널을 사용하여 실시간으로 입력 값을 조정하고 변경사항을 수신합니다.
2 - 블루프린트 액터 빌드
박스 콜라이더 가 있는 블루프린트 액터 를 생성합니다. 이는 런타임 도중 메타사운드에서 변경을 트리거합니다.
2.1 - 블루프린트 클래스 생성
- 콘텐츠 브라우저 에서 추가 버튼을 클릭합니다.
- 블루프린트 클래스(Blueprint Class) 를 선택합니다.
- 부모 클래스 선택(Pick Parent Class) 창에서 액터(Actor) 를 선택합니다.
- 새로 생성된 블루프린트 액터를
BP_MusicPlayer등으로 명명합니다.
2.2 - 컴포넌트 추가
액터에 컴포넌트를 추가하여 3개의 구분된 트리거 영역을 생성합니다. 이 영역은 플레이어가 안팎으로 움직일 때 반응합니다.
- 블루프린트 액터를 더블클릭하여 블루프린트 에디터(Blueprint Editor) 를 엽니다.
- 박스 콜리전 컴포넌트를 추가합니다.
- 컴포넌트(Components) 패널에서 다음을 수행합니다.
- 추가 버튼을 클릭합니다.
- 검색창에 'Box Collision'을 입력하고 Enter를 누릅니다.
- 디테일 패널에서 다음을 수행합니다.
- 트랜스폼(Transform) > 스케일(Scale) 을 5.0, 5.0, 1.0으로 설정합니다.
- 렌더링(Rendering) > 게임에서 숨김(Hidden In Game) 을 비활성화합니다.
- 컴포넌트(Components) 패널에서 다음을 수행합니다.
- 박스 콜리전 컴포넌트에 텍스트 렌더 컴포넌트를 추가합니다.
- 컴포넌트 패널에서 다음을 수행합니다.
- 박스 콜리전 컴포넌트를 선택합니다.
- 추가 버튼을 클릭합니다.
- 검색창에 'Text Render'를 입력하고 Enter를 누릅니다.
- 디테일 패널에서 다음을 수행합니다.
- 트랜스폼 > 위치(Location) 를 0.0, 0.0, 150.0으로 설정합니다.
- 텍스트(Text) > 가로 정렬(Horizontal Alignment) 을 '중앙(Center)'으로 설정합니다.
- 텍스트 > 월드 크기(World Size) 를 64.0으로 설정합니다.
- 컴포넌트 패널에서 다음을 수행합니다.
- 컴포넌트의 사본 2개를 추가로 생성합니다. 다음을 두 번 수행합니다.
- 컴포넌트 패널에서 Ctrl을 누른 채로 클릭하여 박스 콜리전 컴포넌트와 텍스트 렌더 컴포넌트를 모두 선택합니다.
- 우클릭하고 복제 를 선택합니다.
- BPM 트리거를 커스터마이징합니다.
- 컴포넌트 패널에서 첫 번째 박스 콜리전 컴포넌트를 우클릭하고 이름변경(Rename) 을 선택한 다음
Trigger_BPM으로 명명합니다. - 디테일 패널에서 트랜스폼 > 위치 를 0.0, 350.0, 0.0으로 설정합니다.
- 컴포넌트 패널에서 자손 텍스트 렌더 컴포넌트를 선택합니다.
- 디테일 패널에서 텍스트 > 텍스트 를 'BPM'으로 설정합니다.
- 컴포넌트 패널에서 첫 번째 박스 콜리전 컴포넌트를 우클릭하고 이름변경(Rename) 을 선택한 다음
- 크로스페이드 트리거를 커스터마이징합니다.
- 컴포넌트 패널에서 두 번째 박스 콜리전 컴포넌트를 우클릭하고 이름변경 을 선택한 다음
Trigger_Crossfade으로 명명합니다. - 자손 텍스트 렌더 컴포넌트를 선택합니다.
- 디테일 패널에서 텍스트 > 텍스트 를 '크로스페이드(Crossfade)'로 설정합니다.
- 컴포넌트 패널에서 두 번째 박스 콜리전 컴포넌트를 우클릭하고 이름변경 을 선택한 다음
- 멜로디 트리거를 커스터마이징합니다.
- 컴포넌트 패널에서 세 번째 박스 콜리전 컴포넌트를 우클릭하고 이름변경 을 선택한 다음
Trigger_Melody로 명명합니다. - 디테일 패널에서 트랜스폼 > 위치 를 0.0, -350.0, 0.0으로 설정합니다.
- 컴포넌트 패널에서 자손 텍스트 렌더 컴포넌트를 선택합니다.
- 디테일 패널에서 텍스트 > 텍스트 를 'Melody'로 설정합니다.
- 컴포넌트 패널에서 세 번째 박스 콜리전 컴포넌트를 우클릭하고 이름변경 을 선택한 다음
- 메타사운드에 대한 오디오 컴포넌트를 추가합니다.
- 컴포넌트 패널에서 다음을 수행합니다.
- 추가 버튼을 클릭합니다.
- 검색창에 'Audio'를 입력하고 Enter를 누릅니다.
- 디테일 패널에서 사운드(Sound)> 사운드 를 'Music MetaSound'로 설정합니다.
- 컴포넌트 패널에서 다음을 수행합니다.
2.3 - 트리거 이벤트 추가
각 영역에 대한 콜리전 응답 이벤트를 추가합니다.
- 컴포넌트 패널에서 'Trigger_BPM'을 선택합니다.
- 디테일 패널에서 다음을 수행합니다.
- 이벤트(Events) > 컴포넌트 오버랩 시작 시(On Component Begin Overlap) 옆에 있는 추가(Add) (+) 버튼을 선택합니다.
- 이벤트 > 컴포넌트 오버랩 종료 시(On Component End Overlap) 옆에 있는 추가 (+) 버튼을 선택합니다.
- 컴포넌트 패널에서 'Trigger_Crossfade'를 선택합니다.
- 디테일 패널에서 다음을 수행합니다.
- 이벤트 > 컴포넌트 오버랩 시작 시 옆에 있는 추가 (+) 버튼을 선택합니다.
- 이벤트 > 컴포넌트 오버랩 종료 시 옆에 있는 추가 (+) 버튼을 선택합니다.
- 컴포넌트 패널에서 'Trigger_Melody'를 선택합니다.
- 디테일 패널에서 이벤트 > 컴포넌트 오버랩 시작 시 옆에 있는 추가 (+) 버튼을 선택합니다.
2.4 - 트리거 이벤트 빌드
이미지를 클릭하면 전체 크기로 표시됩니다.
각 이벤트에 노드를 어태치하여 음악을 제어합니다.
아래에서 사용되는 Set Float Parameter (Audio) 및 Execute Trigger Parameter 노드를 찾으려면 검색 컨텍스트 메뉴 오른쪽 상단에 있는 컨텍스트 구분(Context Sensitive) 필터를 꺼야 할 수도 있습니다.
- On Component Begin Overlap (Trigger_BPM) 노드의 실행 출력(Exec Output) (>) 핀에서 드래그하여 Set Float Parameter (Audio) 노드를 생성합니다.
- Set Float Parameter 노드에서 다음을 수행합니다.
- In 이름(In Name) 을 'BPM'으로 설정합니다.
- In 플로트(In Float) 를 120.0으로 설정합니다.
- On Component End Overlap (Trigger_BPM) 노드의 실행 출력 (>) 핀에서 드래그하여 Set Float Parameter (Audio) 노드를 하나 더 생성합니다.
- 새 Set Float Parameter 노드에서 다음을 수행합니다.
- In 이름 을 'BPM'으로 설정합니다.
- In 플로트 를 90.0으로 설정합니다.
- On Component Begin Overlap (Trigger_Crossfade) 노드의 실행 출력 (>) 핀에서 드래그하여 Set Float Parameter (Audio) 노드를 하나 더 생성합니다.
- 새 Set Float Parameter 노드에서 다음을 수행합니다.
- In 이름 을 'Crossfade'로 설정합니다.
- In 플로트 를 1.0으로 설정합니다.
- On Component End Overlap (Trigger_Crossfade) 노드의 실행 출력 (>) 핀에서 드래그하여 Set Float Parameter (Audio) 노드를 하나 더 생성합니다.
- 새 Set Float Parameter 노드에서 다음을 수행합니다.
- In 이름 을 'Crossfade'로 설정합니다.
- In 플로트 를 0.0으로 설정합니다.
- On Component Begin Overlap (Trigger_Melody) 노드의 실행 출력 (>) 핀에서 드래그하여 Execute Trigger Parameter 노드를 생성합니다.
- Execute Trigger Parameter 노드에서 다음을 수행합니다.
- In 이름 을 'NewMelody'로 설정합니다.
- 컴포넌트 패널에서 오디오 컴포넌트를 타깃(Target) 핀으로 드래그합니다.
- 블루프린트를 컴파일하고 저장합니다.
3 - 레벨 테스트
이제 블루프린트를 테스트할 수 있습니다.
- 'BP_MusicPlayer'를 콘텐츠 브라우저 에서 레벨(Level) 로 드래그하여 배치합니다.
- 캐릭터가 내부 및 외부로 이동할 수 있도록 트랜스폼 위젯을 사용하여 액터를 배치합니다.
- 레벨 에디터 툴바 에서 플레이(Play) 버튼을 클릭합니다.
- 트리거 안팎으로 움직이면서 음악에 미치는 영향을 관찰합니다.