목록개발 공부/Juce 공부방 (40)
음악, 삶, 개발
앞선 포스트에서 우리는 Component 클래스를 배우기위해, Component 클래스의 멤버 함수들의 인자로 사용되는 다른 클래스들을 공부해야한다고하였다. 따라서, 이 포스트에서는 GUI 와 관련되어 자주 사용되는 클래스들의 설명을 Juce 공식 문서에서 가져와 정리해놓았다. 각 클래스 마다 어떻게 작동하는지에 관한 세세한 내용들은 앞으로 독립적인 포스트들로 만들어 소개할것이다. 이 포스트는 이 클래스들을 둘러보는 사전정도로 활용하면 좋을것이다. 여기세 적혀있는 대부분의 클래스들은 Graphics 클래스의 멤버 함수의 인자로 존재하는것들이다. Graphics 클래스가 결국 paint() 함수내에서 그림을 그리는 부분이기때문이다. The base class for all JUCE..
Graphics Class Reference Tutorial: The Graphics class 앞서 우리는 juce::Component 를 상속받아 나의 클래스를 형성하고, 이들간에 부모-자식-관계를 설정하는 법에 대해 배웠다. 이제는 실질적으로 무언가를 그리는 방법에 대해 배울것이다. 앞서 만들었던 Canvas 클래스를 다시 보자. class Canvas : public juce::Component { public : Canvas() { setSize (canvasW, canvasH); } private : const int canvasW {800}; const int canvasH {500}; }; 이 상태로..
더보기 Component Class Reference Graphics Class Reference Colour Class Reference Colours Namespace Reference Tutorial: Parent and child components Tutorial: Responsive GUI layouts using FlexBox and Grid Tutorial: Advanced GUI layout techniques FlexBox Class Reference FlexItem Class Reference FlexItem::Margin Struct Reference Grid Class Reference Grid::Fr Struct Reference Grid::Px Struct Re..
앞서 이론을 배웠으니, 실제 ValueTree 에 요소들을 추가, 삭제하는등에 대해 연습문제를 풀면서 해보겠다. 문제 정답 juce::Identifier treeName {"Note"}; juce::ValueTree tree {treeName}; 설명 setProperty 와 헷깔리지말자. setProperty 는 말그대로 이미 생성된 ValueTree 에 Property 를 추가 또는 변경하는것이다. ValueTree 의 이름은 반드시 초기화할때 인자로 넘겨야한다. 또한 초기화후 해당 ValueTree 의 이름은 절대 변경될수없다. 문제 정답 const juce:..
Tutorial: The ValueTree class ValueTree Class Reference ValueTree::Listener Class Reference Identifier Class Reference var Class Reference XmlElement Class Reference 이 기본기 포스트는, Tutorial: The ValueTree class 를 바탕으로 쓰여졌다. 따라서 내 포스팅을 다 읽고도, 또는 시간이 흘러 무언가 희미하다면.. 반드시 위의 Juce 공식 튜토리얼을 읽고 이 포스팅을 다시 읽도록한다. ValueTree 는 Juce 에서 제공하는 컨테이너이다. Thread 안정성을 보장하지 않기때문에..
Juce 로 미디이펙트를 만들기위한 가장 필수적인 지식들과 예제코드들을 정리해보려한다. 이 포스트는 VST3 플러그인 기준이며, Standalone 이나 iOS 는 해당되지않는다. Max 에서는 미디 메세지의 움직임은 모두 MSP object 가 아닌, Max object 에서 일어난다. 하지만 Juce 는 그렇지않다. 미디의 입,출력이 audio thread, 즉 processBlock() 안에서 일어난다. void processBlock(juce::AudioBuffer& audioBuffer, juce::MidiBuffer& midiBuffer) override { /* 이안에서 지지고볶고 하는것이다. */ } processBlock() 함..
이제 남은 문제는 아래와 같다. 4. 어떻게 나의 파라미터를 GUI 에 연결할수있는지? 5. 어떻게 나의 파라미터 값을 이 GUI 로 변경할수있는지? 위 문제들을 마지막으로 해결하기전에 아래의 강좌를 무조건 시청한다. Controlling Audio Parameters with ValueTree Attachments 위의 강좌는 파트1, 파트2 내용을 모두 다루는데, 우리는 이미 앞선 포스트들로 학습을 했기때문에 이해하는데 무리가 없을것이다. 4. 어떻게 나의 파라미터를 GUI 에 연결할수있는지? 앞서 우리는 juce::AudioProcessor 의 서브 클래스에 코드를 작성하는 작업을 하였다. 이제부터는 juce::AudioProcessorEditor 의 서브 클래스에 코..
앞선 포스트에서 우리의 고민 사항은 아래와 같았다. 1. 어디에 나의 파라미터를 추가할것인지? 2. 어떻게 나의 파라미터를 추가할수있는지? 3. 어떻게 나의 VST 출력은 이 파라미터 값을 반영할수있는지? 4. 어떻게 나의 파라미터를 GUI 에 연결할수있는지? 5. 어떻게 나의 파라미터 값을 이 GUI 로 변경할수있는지? 1. 어디에 나의 파라미터를 추가할것인지? 2. 어떻게 나의 파라미터를 추가할수있는지? 를 해결하여 아래의 코드를 완성했다. class VSTPlugin : public juce::AudioProcessor { public : VSTPlugin() : apvts(*this, nullptr, juce::Identifier("APVTS"), createParams()) ..
위의 사진을 보면, 내가 노브를 돌렸을때 하단의 값이 변하고, 하단의 값을 움직이면 위의 노브가 변한다. 우리는 결국 이와 같은것을 하고싶다. 저렇게 VST 에 내가 원하는 이름의 파라미터를 추가하고싶다. 그뿐만 아니라, 내가 만든 GUI 로 저 파라미터를 조절하고싶다. 사용자의 느낌으로 얼핏보았을때는, 흠 쉬운데? 할수있지만 개발자의 입장에서는 불행히도 그렇지않다... 음식도 먹는게 쉽고, 만드는게 훨씬 어렵지않은가.. 여러가지 스탭들이 합해야 위의 그림같은 상황을 연출할수있다. 내가 앞선 포스트들에서 audio thread 와 message thread 를 지속적으로 이야기한 이유가 결국 여기에 있다. gui thread (즉, message t..
이 부분에 대해, 추가적인 연구가 필요한데 일단 Nathan 과 Peter 가 얘기해준 부분을 남겨놓는다. 추후 공부하면서 이 포스팅은 다시 업데이트 하는걸로. Nathan Quick tip that my be helpful to you. If you set JUCE_ENABLE_REPAINT_DEBUGGING to enabled in the projucer under the juce_gui_basics module, then you can see when areas of the screen are being redrawn. I have found that using a child component for drawing ui elements means that it will only redraw the ..