이 튜토리얼에서는 메타사운드를 사용하여 프로시저럴 음악을 생성하는 방법을 배우게 됩니다. 이 과정에서 어드벤처 게임에 사용할 프로시저럴한 방식으로 배경 음악을 생성하게 됩니다.
메타사운드는 블루프린트 비주얼 스크립팅 시스템과 유사한 노드 기반 시스템을 사용하여 사운드 소스를 생성할 수 있는 고성능 오디오 시스템입니다.
시작하기 전에
다음과 같은 주제는 신규 사용자를 위한 언리얼 엔진 문서에서 다루는 내용이므로 반드시 이해하고 있어야 합니다.
노드를 추가하고 연결하는 것과 같은 블루프린트 기초
메타사운드로 프로시저럴 음악 생성
먼저 메타사운드 에셋을 생성하는 것부터 시작합니다. 다음 단계를 따르면 됩니다.
콘텐츠 브라우저에서 콘텐츠(Content) > AdventureGame > Artist > Audio 폴더로 이동합니다.
Audio 폴더에서 Music이라는 이름의 새 폴더를 생성합니다.
Music 폴더에서 우클릭하고 오디오(Audio) > 메타사운드 소스(MetaSound Source)를 선택합니다.
이 에셋 이름을
MS_BGM으로 지정합니다(메타사운드 배경 음악의 약어).에셋을 엽니다.
에셋이 메타사운드 에디터에서 열립니다. 새 창에서 그래프 안에 세 개의 노드가 표시됩니다. 이 노드는 Input, Output On Finished, Input Out Mono입니다.
Input 트리거는 이 오디오 소스가 재생될 때 실행됩니다. 메타사운드는 항상 Input 노드로 시작합니다.
Output On Finished 트리거는 소스 재생을 중지하기 위해 실행됩니다. 블루프린트 등 다른 곳에서 오디오를 중지하는 경우에는 이 노드를 사용하여 오디오 소스 재생을 중지할 필요가 없습니다. 이 경우 블루프린트를 사용하여 오디오를 시작하고 중지하므로, 이 노드를 사용할 필요는 없습니다.
Output Out Mono 노드는 메타사운드 그래프의 최종 오디오 출력을 나타내며, 모든 업스트림 오디오 신호를 단일 채널(모노) 출력으로 라우팅합니다. 이 노드에 연결된 모든 노드는 하나로 믹스되어 최종 사운드 출력으로 엔진에 전달됩니다.
음악 템포 및 리듬 설정
먼저 음악의 템포와 리듬을 설정하는 노드를 생성합니다. 다음 단계를 따르면 됩니다.
Input 노드의 핀에서 드래그하여 Trigger Repeat 노드를 추가합니다.
Trigger Repeat 노드에서 기간(Period) 핀을 드래그하여 BPM To Seconds 노드를 추가합니다. 온음표 나누기(Divisions of Whole Note)를 16으로 설정합니다.
BPM To Seconds 노드에서 BPM 핀을 드래그하고 그래프 입력으로 승격(Promote to Graph Input)을 선택합니다.
화면 왼쪽 상단의 멤버(Members) 패널의 입력(Input)에서 BPM 이름을 Note In으로 변경합니다.
디테일(Details) 패널에서 노트 입력(Note In) 노드의 디폴트 값(Default Value)을 60으로 변경합니다. 이 값은 노드 하단에서도 변경할 수 있습니다.
Trigger Repeat 노드의 반복 출력(RepeatOut) 핀에서 드래그하여 새 Trigger Counter 노드를 추가합니다.
Trigger Counter 노드를 선택하고 리셋 카운트(Reset Count)를 8로 설정합니다.
이 섹션에서는 템포와 리듬을 설정합니다. 또한 추가한 네 개의 노드(Trigger Counter, Trigger Repeat, BPM To Seconds, Input)를 모두 선택한 후 C 키를 눌러 이 노드들이 포함된 코멘트 박스를 추가할 수 있습니다. 이 코멘트 박스의 이름을 Tempo and Rhythm으로 짓습니다.
멜로디 생성
다음으로는, 정의한 템포와 리듬을 사용하여 멜로디를 생성하는 기능을 만들어 보겠습니다. 다음 단계를 따르면 됩니다.
Trigger Counter 노드에서 다음을 수행합니다.
트리거 시(On Trigger) 핀에서 드래그하여 Random Get (Float:Array) 노드를 추가합니다.
Trigger Counter 노드의 On 리셋(Reset) 핀을 Random Get 노드의 리셋 핀에 연결합니다.
Random Get 노드의 In 배열(In Array) 핀에서 드래그하여 Scale to Note Array 노드를 추가합니다.
Scale to Note Array 노드의 음계도(Scale Degrees) 핀에서 드래그하여 그래프 입력으로 승격을 선택하고 이름을 Scale로 짓습니다.
Random Get 노드의 시드(Seed) 핀에서 드래그하여 Random (Int) 노드를 추가합니다.
Random (Int) 노드의 다음(Next) 핀에서 드래그하여 Trigger Counter 노드의 리셋 시(On Reset) 핀에 연결합니다.
이 섹션에서는 멜로디를 생성합니다. 다시 한 번, 새로 추가한 노드를 모두 하이라이트하고 Melody Generation이라는 코멘트 박스를 추가합니다.
멜로디 합성
다음으로는, 합성 기능을 생성하여 멜로디의 실제 사운드를 만들어 보겠습니다. 즉, 생성된 멜로디 노트 데이터를 실제 오디오 신호로 변환하는 것을 의미합니다. 다음 단계를 따르면 됩니다.
Random Get 노드의 값(Value) 핀에서 드래그하여 Add (Float) 노드를 추가합니다.
Add 노드의 두 번째 입력 핀의 값을 0에서 48로 변경합니다.
Add 노드의 실행 핀에서 드래그하여 MIDI To Frequency (Float) 노드를 추가합니다.
MIDI To Frequency (Float) 노드의 Out 주파수(Out Frequency) 핀에서 드래그하여 Sine 노드를 추가합니다.
Sine 노드의 오디오 출력 핀에서 드래그하여 Add (Audio) 노드를 추가합니다.
이 Add 노드에 연결되는 Sine 노드를 하나 더 추가합니다. Add 노드의 다른 입력 핀에서 드래그하여 Sine 노드를 추가합니다.
새로운 Sine 노드의 주파수(Frequency) 핀에서 드래그하여 MIDI To Frequency (Float) 노드를 추가합니다.
MIDI To Frequency 노드의 MIDI 입력(MIDI In) 핀에서 드래그하여 Add (Float) 노드를 추가합니다.
Add 노드에서 다음을 수행합니다.
첫 번째 입력 핀을 첫 번째 Sine 노드에 연결된 Add 노드에 연결합니다.
두 번째 입력 핀을 드래그하여 그래프 입력으로 승격을 선택합니다. 이름을 Detune으로 짓습니다.
디튠(Detune) 입력을 선택하고 디테일 패널에서 범위(Range)를 0~12로 변경합니다.
디테일 패널에서 디폴트(Default) 값을 12로 변경합니다.
이제 생성될 멜로디의 합성을 완료했습니다. 다시 한 번 이 새로운 섹션에 대해 코멘트 박스를 추가하고 이름을 Synthesis로 명명합니다.
엔벨로프로 사운드 변화 다듬기
다음으로는 시간이 경과함에 따라 사운드가 변화하는 방식을 조절하기 위해 엔벨로프를 추가해 보겠습니다. 이를 통해 시작, 유지, 페이드아웃을 제어하여 보다 자연스러운 결과를 만들 수 있습니다.
엔벨로프를 추가하려면 다음 단계를 따릅니다.
이전에 생성한 멜로디 생성 섹션으로 스크롤합니다(코멘트 박스를 추가했다면 이름이 Melody Generation임). Random Get (Float:Array) 노드에서 다음에(On Next) 핀을 드래그하여 AD Envelope (Audio) 노드를 추가합니다. 이 새 노드 합성 섹션에서 추가한 두 Sine 노드 뒤로 이동합니다.
이 노드에서 Out 엔벨로프(Out Envelope) 핀을 드래그하여 Multiply (Audio) 노드를 추가합니다.
이 Multiply 노드에서 두 번째 입력 핀을 드래그하고 두 Sine 노드를 연결한 Add (Audio) 노드의 출력 핀에 연결합니다.
AD Envelope (Audio) 노드에서 감쇠 시간(Decay Time)을 0.2로 변경합니다.
Multiply (Audio) 노드의 출력 핀에서 드래그하여 기존 메타사운드 소스에 있던 Output Out Mono 노드에 연결합니다.
이제 메타사운드 소스 창 상단 툴바에 있는 재생(Play) 버튼을 누릅니다. 프로시저럴하게 생성된 음악이 끊김 없이 계속 재생됩니다.
언리얼 엔진에서 프로시저럴 음악을 제작하는 방법을 자세히 알아보려면 메타사운드로 프로시저럴 음악 생성하기 페이지를 참고하세요.
블루프린트로 인게임 음악 재생
다음 단계로 넘어가기 전에, 레벨에서 배경 음악을 재생하는 블루프린트를 생성해 보겠습니다.
이 블루프린트는 레벨에 추가되지만 비주얼 표현이 없으므로, 블루프린트에 빌보드(Billboard) 컴포넌트를 추가합니다. 이 컴포넌트는 레벨을 편집하는 동안 쉽게 찾을 수 있도록 에디터에 표시되는 2D 스프라이트를 추가하지만, 게임에서는 보이지 않습니다.
배경 음악 블루프린트를 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서 콘텐츠 > AdventureGame > Artist > Audio > Music으로 이동합니다.
우클릭하여 액터(Actor) 부모 클래스를 상속하는 새 블루프린트 클래스(Blueprint Class)를 생성합니다. 이름을 BP_BGM으로 명명합니다(블루프린트 배경 음악의 약어).
컴포넌트 패널에서 추가(Add)를 클릭하고 빌보드(Billboard) 컴포넌트를 추가합니다. 디테일 패널에서 스프라이트(Sprite)가 기본적으로 S_Actor로 설정되어 있는 것을 확인할 수 있습니다. 스프라이트를 변경해도 되고, 그대로 둬도 됩니다.
기능을 빌드하기 위해 이벤트 그래프(EventGraph) 탭으로 이동합니다.
Event BeginPlay 노드에서 드래그하여 Branch 노드를 추가합니다.
Branch 노드에서 조건(Condition) 핀에서 드래그하여 변수로 승격(Promote to Variable)을 선택합니다. 이 변수의 이름을 Active로 명명합니다. 이 변수는 이 오디오 소스가 활성 상태인지 여부를 판단하는 데 사용됩니다.
내 블루프린트(My Blueprint) 패널의 변수(Variables) 목록에서 Active 변수 옆의 눈 모양 아이콘을 클릭하여 해당 변수를 퍼블릭으로 설정하고 레벨 에디터에서 편집할 수 있게 합니다.
블루프린트를 컴파일하고 디테일 패널에서 Active 변수의 디폴트 값(Default Value)이 true(활성화됨)인지 확인합니다.
Branch 노드의 True 핀에서 드래그하여 Play Sound 2D 노드를 추가합니다.
Play Sound 2D 노드에서 드롭다운을 사용하여 Sound(사운드) 핀을 MS_BGM으로 설정합니다.
Play Sound 2D 노드에서 아래쪽 화살표를 클릭하여 노드 옵션을 펼칩니다. Volume Multiplier 핀에서 드래그하여 변수로 승격을 선택합니다.
이 변수의 눈 모양 아이콘을 클릭하여 퍼블릭 및 편집 가능한 상태로 만든 후 블루프린트를 컴파일하고 디폴트 값을 0.5로 변경합니다.
블루프린트를 저장하고 컴파일합니다.
Play Sound 2D 노드에서 '2D'는 사운드가 레벨 내 플레이어의 위치와 무관하게 재생된다는 의미입니다. 즉, 3D 공간화가 적용되지 않으므로 거리나 방향에 따라 플레이어가 소리를 듣는 방식이 달라지지 않습니다.
게임에서 음악 테스트
이제 레벨 에디터로 돌아가 BP_BGM 블루프린트를 레벨에 추가할 수 있습니다.
레벨에서 BP_BGM 액터를 선택하고, 디테일 패널에서 추가한 두 변수가 올바르게 구성되어 있는지 확인합니다. Active는 켜짐 상태여야 하고, Volume Multiplier는 0.5로 설정되어야 합니다.
'Volume Multiplier' 값을 다양하게 조정해 보면서 상황에 가장 적합한 값을 찾아볼 수 있습니다. 배경 음악이므로, 너무 두드러지지 않도록 볼륨을 더 낮은 값으로 설정하는 것이 좋습니다.
이제 게임을 플레이합니다. 이제 여러분이 생성한 음악이 배경에서 재생되는 것을 들을 수 있을 것입니다!
다음 순서
다음 단원에서는 플레이어 캐릭터가 현재 이동 중인 바닥 타입에 따라 서로 다른 소리가 재생되도록 동적인 발소리 이펙트를 추가하는 방법을 배우게 됩니다.