JUCE를 사용하여 VST 플러그인을 Mac에서 개발
JUCE란?
Jules' Utility Class Extensions의 약자입니다. 자세한 것은 @ COx2 님의 기사 에 일본어로 알기 쉽게 해설되어 있습니다.
한마디로 표현하면, OS에 의존하지 않고 C++의 빌드를 편하게 실시하는 개발 환경,이라고 생각합니다. (아직 경험은 얕습니다만…)
JUCE에서 시작한 프로젝트를 xcode에서 빌드하면 쉽게 빌드할 수 있었습니다.
VST나 AU등의 DAW소프트용의 파일에 대응하고 있어, 그러한 자작의 음원 소프트등을 개발하고 싶은 사람에게는 적합하다고 생각합니다.
소개
설치 방법 등은 @ COx2 님의 기사을 참조하십시오.
이 기사에서는, 보다 앞의 내용인, MIDI 신호를 입력으로 wav 파일을 출력하는 음원 작성의 튜토리얼을 다루고 싶습니다.
참고로 하는 것은 공식 튜토리얼(2019년 6월 참조) . 이 녀석을 일본어로 해설할 수 있으면 좋겠다고 생각합니다.
Orientation ~코드에 대한 가벼운 해설~
JUCE에서 "Audio Plug-In"을 선택하면 자동으로 생성되는 파일에 대해 해설.
이미지로서는 Processor는 Editor의 친분인 것 같다.
하나의 프로세서에 대해 여러 Editor가 있습니다.
Editor로 설정한 노브를 꼬리면 Processor 안의 파라미터가 변화하는 것일까.
Processor 클래스에서 특히 만나는 부분은 processBlock() 함수 안입니다. 이 함수로 midi 신호를 받거나 wav 파일을 출력합니다.
Editor 클래스에서 특히 만나는 부분은 생성자 부분과 paint() 함수입니다.
예를 들어 다음은 Editor 클래스의 생성자 안의 플러그인의 화면의 크기를 결정하는 setSize (세로의 픽셀, 가로의 픽셀) 함수입니다.
PluginEditor.cpp
TutorialPluginAudioProcessorEditor::TutorialPluginAudioProcessorEditor (TutorialPluginAudioProcessor& p)
: AudioProcessorEditor (&p), processor (p)
{
// ここでプラグインの画面の大きさを決定するよ!
setSize (200, 200);
}
Create a simple GUI control ~간단한 컨트롤러 만들기~
이 튜토리얼로 만드는 것은 midi의 음량을 바꿀 수 있는 페이더입니다.
Slider midiVolume;
라고 PluginEditor.h상에서 정의해, 이것에 대해서 다양한 기술을 행해 간다.PluginEditor.h
class TutorialPluginAudioProcessorEditor : public AudioProcessorEditor
{
public:
TutorialPluginAudioProcessorEditor (TutorialPluginAudioProcessor&);
~TutorialPluginAudioProcessorEditor();
//===================================================================
void paint (Graphics&) override;
void resized() override;
private:
// This reference is provided as a quick way for your editor to
// access the processor object that created it.
TutorialPluginAudioProcessor& processor;
Slider midiVolume; // これを追加!
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TutorialPluginAudioProcessorEditor)
};
다음에 페이더의 디자인의 상세를 기술.
PluginEditor.cpp
TutorialPluginAudioProcessorEditor::TutorialPluginAudioProcessorEditor (TutorialPluginAudioProcessor& p)
: AudioProcessorEditor (&p), processor (p)
{
// ここでプラグインの画面の大きさを決定するよ!
setSize (200, 200);
// フェーダーの詳細をここで決定。
midiVolume.setSliderStyle (Slider::LinearBarVertical);
midiVolume.setRange(0.0, 127.0, 1.0);
midiVolume.setTextBoxStyle (Slider::NoTextBox, false, 90, 0);
midiVolume.setPopupDisplayEnabled (true, false, this);
midiVolume.setTextValueSuffix (" Volume");
midiVolume.setValue(1.0);
// 下記で上記で設定したフェーダーを追加。
addAndMakeVisible (&midiVolume);
}
다음에 resized() 함수에 위치 정보를 기재.
유저가 윈도우를 괴롭혀도, 이것이라면 GUI가 무너지지 않는 것 같다.
PluginEditor.cpp
void TutorialPluginAudioProcessorEditor::resized()
{
// 位置情報を記載。
midiVolume.setBounds (40, 30, 20, getHeight() - 60);
}
마지막으로 GUI부를 설정.
PluginEditor.cpp
void TutorialPluginAudioProcessorEditor::paint (Graphics& g)
{
// fill the whole window white
g.fillAll (Colours::white);
// set the current drawing colour to black
g.setColour (Colours::black);
// set the font size and draw text to the screen
g.setFont (15.0f);
g.drawFittedText ("Midi Volume", 0, 0, getWidth(), 30, Justification::centred, 1);
}
Pass control information to the processor class ~매개 변수 조정~
페이더의 디자인은 가능했지만, 이 페이더를 상하로 움직여도 현재에도 파라미터는 변하지 않는다.
Processor 클래스를 괴롭히는 것으로 실제로 midi 볼륨을 변화시킬 수 있도록 해 갑시다!
먼저 noteOnVel이라는 float 변수를 Processor 클래스의 헤더에 public 안에서 정의합시다.
PluginProcessor.h
class TutorialPluginAudioProcessor : public AudioProcessor
{
public:
float noteOnVel; // これを追加!
// 以下略
그런 다음 페이더 값을 순차 noteOnVel 값에 할당하는 설정을 수행합니다.
이 작업은 sliderValueChanged 함수입니다.
sliderValueChanged 함수는 모든 클래스에서 상속받을 수 있지만 이번에는 Editor 클래스에서 상속합니다.
PluginEditor.h
class TutorialPluginAudioProcessorEditor : public
// 下記を追加!
private Slider::Listener
AudioProcessorEditor
{
public:
TutorialPluginAudioProcessorEditor (TutorialPluginAudioProcessor&);
~TutorialPluginAudioProcessorEditor();
//===================================================================
void paint (Graphics&) override;
void resized() override;
private:
void sliderValueChanged (Slider* slider) override; // sliderValueChanged関数の定義
// This reference is provided as a quick way for your editor to
// access the processor object that created it.
TutorialPluginAudioProcessor& processor;
Slider midiVolume;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TutorialPluginAudioProcessorEditor)
};
헤더를 채우면 midiVolume에 slider listener 함수를 추가합시다.
PluginEditor.cpp
TutorialPluginAudioProcessorEditor::TutorialPluginAudioProcessorEditor (TutorialPluginAudioProcessor& p)
: AudioProcessorEditor (&p), processor (p)
{
// 上は省略
// add the listener to the slider
midiVolume.addListener (this);
}
마지막으로 sliderValueChanged 함수의 내용을 설명합니다.
PluginEditor.cpp
void TutorialPluginAudioProcessorEditor::sliderValueChanged (Slider* slider)
{
processor.noteOnVel = midiVolume.getValue();
}
완성!
Logic에서 본 이미지를 아래에 첨부합니다. Cubase에서도 확인되었습니다.
다만, 파라미터가 잘 설정되어 있는지는 모릅니다.
Logic에서 이 이펙터를 끼우면 음량이 사라지고 있다는 것은, 어쩐지 움직이고 있는 것이겠지만 기대대로는 움직이지 않는 생각이…
앞으로 플러그인 음원을 구현할 때 코드 내용을 이해할 것입니다.
Reference
이 문제에 관하여(JUCE를 사용하여 VST 플러그인을 Mac에서 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/keinko/items/e5abcc39af857bd6d01e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)