프로그래밍할 때 가장 동기를 잘 부여해주는 것은 시청각적인 결과물이라고 생각합니다.
검은 콘솔 창에서 Hello World! 나 띄우고 있는 건 얼마나 고리타분합니까.
제가 그림을 보여주고 소리를 재생하는 걸 좋아하는 이유입니다.
심심해서 이전에도 가상 악기 플러그인을 만들어 본 적이 있고,
최근에도 하나 시작했었는데 거기서 막혔던 부분이 좀 많아서 정리하는 김에 포스팅합니다.
위에서 링크한 리포지토리는 VST GUI라는 걸 사용합니다.
오래됐고, 사용법도 찾아보기가 어렵습니다. 만들다 버린 프로젝트에 가깝습니다.
요즘 VST 같은 사운드 프로그래밍을 하는 데에는 Juce 만한게 없는 것 같습니다.
GUI를 대부분 쉽게 지원해준다는 점이 좋네요. 전 다른 것보다도 UI가 정말 귀찮습니다.
홈페이지에서 Juce를 다운받고 Projucer를 실행하면, 프로젝트를 만들거나 수정할 수 있습니다.
여기서는 Application - Audio와 Plug-in Basic만 알아봅시다. 두 개가 메인이라고 생각해요.
Application - Audio는 오디오 애플리케이션을 만들 수 있고, Plug-In은 DAW (작곡 프로그램)에서 사용하는 가상 악기 플러그인을 만들 수 있습니다.
가상 악기 시스템에는 VST, AU 등이 있고, Plug-In에서도 Standalone으로 애플리케이션을 만들 수 있습니다.
Application - Audio의 애플리케이션과 Plug-In의 Standalone의 차이점은
Standalone은 Plugin Processor 시스템을 그대로 가져와서 사용한다는 점입니다.
Application - Audio에서는 사운드를 재생할 Component에서 Midi 정보를 받아오거나 만들어서 직접 사운드를 출력하지만
Standalone에서는 이 과정을 모두 Processor에서 담당합니다. 따라서 여기서 사운드를 재생하지 않으면, 다른 컴포넌트에서 재생하려 해도 잘 안 됩니다.
프로젝트를 만드려면 Global Paths를 정의해줘야 합니다. File - Global Paths로 들어가면,
위와 같은 창을 볼 수 있습니다.
Path to Juce : Projuer이 위치한 Juce Library 폴더입니다.
Juce Modules : Juce Library의 modules 폴더입니다.
User Modules : 유저가 사용할 모듈의 폴더를 넣어주시면 됩니다. 저는 추가로 사용할 라이브러리 뭐 그런 건 줄 알았는데, 아니었습니다. 커스텀할 Component나 그런 게 있으면 cpp, h 파일 등을 만들어 넣어놓으면 되는 것 같네요.
VST SDK : VST SDK의 위치입니다. Steinberg 홈페이지에서 다운로드할 수 있습니다.
프로젝트를 생성하면 프로젝트의 파일 목록, 사용할 모듈, 빌드 환경을 볼 수 있습니다.
File Explorer에서 소스 코드 파일을 추가/삭제할 수 있고, 오른쪽 탭에서 수정할 수 있습니다.
소스 코드는 IDE에서 수정하는 게 훨씬 편하고, Projucer에서 소스 코드 자체는 건드리지 않습니다만
프로젝트 파일 (Visual studio에서는 sln 같은 파일)은 수정하므로, 다른 IDE에서 소스 코드를 추가/삭제한 경우는 Projucer에 반영되지 않습니다. 그러니 Projucer로 뭔가 수정하셨을 때는 프로젝트를 잘못 덮어쓰지 않도록 조심하세요.
뭐 다시 파일이야 다시 추가하면 되고, 전처리기도 다시 정의하면 되지만 번거롭습니다.
좌상단의 톱니바퀴 버튼을 클릭하면 프로젝트의 설정을 볼 수 있습니다.
Audo Application에서는 별 다를 게 없고, Plug-in에서는 빌드할 플러그인 설정이 있으니 확인하셔야 됩니다.
VST (Legacy)는 VST2 포맷으로, dll 파일을 생성합니다.
이미 2018년에 안 쓴다고 발표한 포맷이지만, 여전히 VST2를 많이 씁니다.
VST3 지원이 영 시원찮은 이유도 있는 것 같네요.
아래 탭은 플러그인이 어떤 플러그인인지 체크하면 됩니다.
소리를 만들어내는 Synthesizer라면 Plugin is a Synth를 체크하시면 됩니다.
아래 두 옵션은 Midi 데이터를 받아오고 내보내는지 입니다. 신디사이저라면 적어도 Midi 데이터는 받아와야죠.
MIDI Effect Plugin은 오디오 데이터를 받아와서 처리하는 FX 플러그인입니다.
Gain, Reverb 등의 이펙트를 적용할 때는 이걸 체크해서 프로젝트를 만들면 되겠죠.
Exporters에서는 빌드할 환경을 정의할 수 있습니다.
빌드 가능한 IDE에는 Visual Studio, Xcode, Android 등등이 있습니다.
IDE 옵션에서 추가 전처리기 정의와 링크할 라이브러리 이름을 수정할 수 있습니다.
Debug / Release 등 빌드 옵션에는 빌드에 사용할 라이브러리 경로, 라이브러리 이름, 각 빌드에 대한 전처리기를 수정할 수 있습니다.
예를 들어 Architecutre에서는 빌드를 32bit / 64bit 중에서 어느 것으로 할지 선택할 수 있습니다.
Runtime Library는 라이브러리 링크 옵션을 선택할 수 있습니다.
사진에서는 lib 파일을 링크해야 돼서 static runtime으로 설정했습니다. 기본 옵션은 dynamic입니다.
Header Search Paths에서는 추가 헤더 디렉토리를,
Extra Libraray Search Paths에서는 추가 라이브러리 디렉토리를 추가할 수 있습니다.
전자는 소스 코드가 있는 경로 (includes)를, Extra Library Search Paths에는 라이브러리 경로 (lib)를 추가하면 됩니다.
여기서, 라이브러리 경로는 빌드 옵션에서 정의하는데 정작 라이브러리 이름은 그 상위인 IDE 옵션에서 정의하는 걸 아셨을 겁니다. 그래서 디버그와 릴리즈 라이브러리 이름이 다른 경우에 문제가 됩니다.
이럴 때를 위한 방법으로는 전처리기를 사용해서 링크해야 합니다.
여기서 ${전처리기 이름}으로 정의해두고,
각 빌드에서는
와 같은 방식으로 정의하면 됩니다.
이렇게 저장하고 프로젝트를 열면
(Plugin의 경우에는) 이렇게 솔루션 목록을 볼 수 있을 겁니다.
Audio Application은 그냥 단일 솔루션이니, Plugin에 대해서만 설명하겠습니다.
SharedCode에서 코어가 될 프로그램 소스 코드를 작성하시면 됩니다.
StandalonePlugin, VST 등에서는 별도로 소스를 추가하지 않아도 됩니다.
정확히는, 추가할 수는 있지만 Projucer와 호환이 안 되서 권장하지 않습니다. 어차피 Projucer가 덮어쓰면 무위로 돌아가니까요.
StandalonePlugin은 Plugin의 Standalone Application 버전을 빌드합니다.
Windows의 경우에는 exe 파일을 빌드하는 솔루션입니다.
VST 등의 솔루션에서는 각각의 옵션에 해당하는 플러그인 파일을 빌드합니다.
VST는 dll, VST은 vst3 파일 같은 식입니다.
Standalone에만 적용되는 코드, VST에만 적용되는 코드를 컴파일시에 적용되게 하려고
JucePlugin_Build_VST 같은 전처리기를 써봤는데, 이건 작동하지 않습니다.
SharedCode에서 코어를 빌드하고 각 다른 솔루션에서 wrapping하는 느낌이기 때문에
위 전처리기 모두 SharedCode와 상관이 없습니다.
(예를 들어 JucePlugin_Build_VST는 StandalonePlugin에서는 0이지만, VST에서는 1입니다.
JucePlugin_Build_Standalone은 반대로 StandalonePlugin에서는 1, VST에서는 0입니다.
하지만 SharedCode에서는 VST와 Standalone 모두 빌드하는데 쓰이기 때문에 둘 다 1입니다)
요거에 대한 해결 방법은 런타임에서 체크하는 방법밖에 없습니다.
juce::JUCEApplicationBase::isStandaloneApp() 으로 구간을 묶어줘야 합니다.
자세한 내용은 다른 포스팅에서 작성해보겠습니다.
프로그램 코드 작성은 Audio Application과 Plugin이 좀 다르기 때문에, 포스팅을 나눠서 써야할 것 같네요.
각각의 대략적인 구조를 먼저 다루고, 사운드 프로세싱을 포스팅하겠습니다.
사실 Juce 홈페이지에 튜토리얼이 잘 만들어져 있습니다.
어지간한 건 공식 튜토리얼을 따라하면 만들 수 있습니다...만 이리저리 합쳐서 뭔가를 만들만큼 일관적이지는 못합니다.
대부분 Audio Application 기준으로 설명하는 데, 제가 만들던 건 Plugin이었거든요.
나중 가서야 알고 수정하고 땜빵하느라 많이 헤맸습니다.
'C++ > Sound' 카테고리의 다른 글
[JUCE] Juce Framework로 사운드 프로그래밍 #6 ADSR (0) | 2022.07.10 |
---|---|
[JUCE] Juce Framework로 사운드 프로그래밍 #5 GUI (0) | 2022.07.02 |
[JUCE] Juce Framework로 사운드 프로그래밍 #4 Processor와 Value Tree (0) | 2022.06.24 |
[JUCE] Juce Framework로 사운드 프로그래밍 #3 신디사이저 만들기 (0) | 2022.06.12 |
[JUCE] Juce Framework로 사운드 프로그래밍 #2 구조 대충 알아보기 (0) | 2022.06.08 |