목록전체보기 (483)
음악, 삶, 개발
설명 valueTree 는 내가 Max 에서 사용했던 dict 와 같은 것이다. 플러그인의 파라미터들 저장하고, 변경하고 다른 클래스의 객체들과 송신하는것이다. valueTree 에서 행해지는 변화는 juce::ValueTree::Listener 를 사용하여 notify 받는다. 중요한건, 반드시 tree.addListener(this) 를 constructor 로 호출해야한다. 이 valueTree 는 복사해도 실제로 복사되지않고, 하나인 global 로 존재한다고한다. 따라서 이 valueTree 를 다른 클래스의 객체로 넘길때 pass-by-value 해도 실제로 복사되지는않는다고한다. 아래와 같이 다른 class 가 valueTree 가 변화될때 캐치할수있도록 한다. 아래는 Component 클래..
몇번이고 까먹어서, 여기에 정리해놓으려한다. 무조건 juce::AudioProcessor 를 상속받은 main processor 에서 정의되어야한다. 결국 valueTree 를 지니고있는 AudioProcessorValueTreeState 의 객체를 생성후, 이안에 add 한다. 이 apvts 안에는 state 라는 valueTree 가 있는데, 이 state 를 통해 다른 클래스의 객체들과 송신한다. (gui callback 같은) class MainProcessor : public juce::AudioProcessor { public : MainProcessor() // 3. 초기화 : apvts(*this, nullptr, "valueTreeName", createParams()) { } // 2...
Max 에서는 screensize 라는 오브젝트가 있는데, Juce 에서는 Desktop 이라는 클래스를 통해 얻어와야한다. 조금은 복잡하다. const auto userMonitor = juce::Desktop::getInstance().getDisplays().getMainDisplay().totalArea; DBG(userMonitor.getWidth()); // 2560 DBG(userMonitor.getHeight()); // 1600 일단 juce::Desktop::getInstance() 함수로 Desktop instance 를 얻고, 이 instance 에 다시 getDisplays() 를 호출하여 디스플레이"들" 을 얻고, (모니터가 여러대 일수도있으므로) 이중 사용자의 주요 디스플레이를..
함수안에 throw 를 명시하면, caller 가 try 후 catch 할수있는것이 exception 인데, throw 를 하지않겠다는것을 컴파일러에게 명시하는것이 함수뒤에 noexcept 를 붙이는것이라고한다. 하지만, Juce 에서는 거의 쓰이지않을것이라고. 아래 참고자료에 관련 Juce 포스팅을 첨부해놓았다. 참고자료 Juce and Exception Handling? 씹어먹는 C ++ - effective modern c++ : noexcept 선언 [C++] keyword : noexcept
소개 vector를 떡 주무르듯 편하게 사용하기 위해 반드시 알아야 하는 STL 라이브러리다. #include 위와 같이 include후 std:: 를 붙여 사용한다. 이 포스트는 C++11 기준이며, C++20 이 올해 말 출시한다고 한다. 하지만 C++20이 출시되어도, 바로 내가 사용할수있는것은 아니므로, 내가 사용할수있게 되었을 때 이 포스팅도 업데이트해야 함. 아래 안에 들어가있는 함수의 총 리스트를 일단 나열하고, 그후 각각을 설명해나간다. 이제 배우겠지만, 이 안에 함수들은 인자로 iterator 를 받는다. 우리가 vector 에서 index 대신 iteartor 를 쓰는 이유도 이런 표준 라이브러리의 함수들을 가져다 쓰기 위함이다. (index 대신 , iterator 를 인자로 받기때문..
생성자, 연산자 오버로딩 방식과 상황에 따라 호출되는 생성자, 연산자 생성자 : constructor 기본 생성자 : default constructor 복사 생성자 : copy constructor 이동 생성자 : move constructor 연산자 : operator 대입 연산자 : assignment operator 이동 대입 연산자 : move assignment operator 파괴자 : destructor 위에서 보다시피, 영어가 한글보다 훨씬 길기에, 그냥 한글로 사용하겠다. 일단 아래의 그림을 머리속에 박제하도록한다. 이해는 나중에 해도 된다. 상황에 따라 어떠한 생성자와 어떠한 연산자가 호출되는지 외워야한다. 위의 생성자나 연산자중, 뒤에 noexcept 가 붙어야하는것들이..
소개 vector 는 C++ 에서 가장 우선적으로 사용해야할 필수적인 컨테이너다. 나는 vector 를 배우기전, vector 를 사용하는것은 JS 의 array 와 비슷할거라 생각했지만, 불행히도 완전히까지는 아니지만 매우 다른 사용법을 필요로한다. 이 C++ 약점공략부분은 원래는 나의 약점에만 집중하지만(예를 들어, vector 의 push_back 에 대해서만 다룬다던지) 나는 vector 의 전체적인 것들을 처음부터 정리하고자한다. vector 의 초기화 std::vector v1 {1, 2, 3}; // v1 : {1, 2, 3} (리터럴) std::vector v2 (3, 6); // v2 : {6, 6, 6} (3개의 6을 만들라) std::vector v3 (2); // v3 : {0, 0..
#pragma once #include namespace lee { namespace midi { class Velocity { public: Velocity() {} Velocity(int n) { velocity = fix(n); } Velocity(const Velocity& other) { velocity = other.velocity; } Velocity(const juce::MidiMessage& midiMessage) { if (midiMessage.isNoteOnOrOff()) velocity = midiMessage.getVelocity(); } Velocity& operator= (const Velocity& other) { velocity = other.velocity; return ..
#pragma once #include namespace lee { namespace midi { class Pitch { public: Pitch() {} Pitch(int n) { pitch = fix(n); } Pitch(const Pitch& other) { pitch = other.pitch; } Pitch(const juce::MidiMessage& midiMessage) { if (midiMessage.isNoteOnOrOff()) pitch = midiMessage.getNoteNumber(); } Pitch& operator= (const Pitch& other) { pitch = other.pitch; return *this; } Pitch& operator+= (const Pitch&..
#pragma once #include namespace lee { namespace midi { class NoteNumber { public : NoteNumber() {} NoteNumber(int n) { noteNumber = fixNoteNumber(n); } NoteNumber(const NoteNumber& other) { noteNumber = other.noteNumber; } NoteNumber(const juce::MidiMessage& midiMessage) { if (midiMessage.isNoteOnOrOff()) noteNumber = midiMessage.getNoteNumber(); } NoteNumber& operator= (const NoteNumber& other)..