음악, 삶, 개발
VST3 플러그인의 기본적인 코드 구조 본문
Juce 는 굉장히 거대한 프레임워크이기때문에,
바로 디테일로 들어가면 이해가 하나도 안된다.
따라서 가장 기본이 되는 VST3 의 골격 구조를 코드로 정리해놓고, 머리속에 넣어두자.
Juce 에서 VST3 을 만들때 가장 필수 클래스는
juce::AudioProcessor 와 juce::AudioProcessorEditor 이다.
이 둘을 상속받아 클래스를 만들고, 그후 하위 클래스들을 객체로 배치해나가면서 플러그인을 만드는것이다.
나는 미디 플러그인을 기준으로, 필요한 클래스는 다음과 같다.
1. Main.cpp : createPluginFilter() 를 실행하며, Juce 에서는 main() 함수 역할을 한다.
2. 파생클래스 from juce::AudioProcessor (추상클래스) : ValueTree 를 보유해야하며, 실제 프로세싱은 4번에서 담당.
3. 파생클래스 from juce::AudioProcessorEditor (추상클래스) : 플러그인 창을 생성한것이고, 실제 GUI 는 5번 클래스에서 담당.
4. 미디 프로세싱 클래스 : 2번 클래스의 미디 buffer 를 프로세싱.
5. 파생클래스 from juce::Component, juce::ValueTree::Listener : GUI 디자인하며, valueTree 를 통해 다른 클래스와 송신.
6. 파생클래스 from juce::LookAndFeel_V4 : 다른 Component 파생 클래스를 꾸며주기위함. Gui 에 대한 일종의 Skin 또는 Theme
// Main.cpp : createPluginFilter() 를 실행하며, Juce 에서는 main() 함수 역할을 한다.
juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() {
return new MainProcessor();
}
// 2. 파생클래스 from juce::AudioProcessor (추상클래스) : ValueTree 를 보유해야하며, 실제 프로세싱은 4번에서 담당.
class MainProcessor : public juce::AudioProcessor {
public :
juce::AudioProcessorValueTreeState apvts; // ValueTree
}
// 3. 파생클래스 from juce::AudioProcessorEditor (추상클래스) : 플러그인 창을 생성한것이고, 실제 GUI 는 5번 클래스에서 담당.
class MainEditor : public juce::AudioProcessorEditor {}
// 4. 미디 프로세싱 클래스 : 2번 클래스의 미디 buffer 를 프로세싱.
class MidiProcessor {}
// 5. 파생클래스 from juce::Component, juce::ValueTree::Listener : GUI 디자인하며, valueTree 를 통해 다른 클래스와 송신.
class LeeComponent : public juce::Component {}
// 6. 파생클래스 from juce::LookAndFeel_V4 : 다른 Component 파생 클래스를 꾸며주기위함. Gui 에 대한 일종의 Skin 또는 Theme
class OtherLookAndFeel : public juce::LookAndFeel_V4 {}
juce::AudioProcessor 가 가장 부모 클래스,
그 다음이 juce::AudioProcessorEditor 라고 보면 된다.
물론 이제 실제 개발에 들어가면 디테일에서 머리가 아파지지만,
이렇게 큰 그림을 머리속에 넣어두는것이 중요할것이다.