목록개발 공부/Juce 공부방 (40)
음악, 삶, 개발
Debug 모드가 2배정도 Relase Mode 보다 높다. 따라서, CPU 사용량을 정확히 측정하려면 Release Mode 로 VST3 를 컴파일해야한다.
아래 포스팅한 오디오 thread 와 메세지 thread 에 대한 글들을 숙지하였다면, 이제는 먼가를 그려볼 시간이다. PPQ 의 값을 사용하여야한다. 공식문서 ppq 값을 가지고있는 클래스로써, AudioProcessor 클래스의 함수 getPlayHead() 함수를 이용하여, 오디오 thread, 즉 processBlock() 안에서 가져와야한다. 아래는 AudioProcessor 클래스의 getPlayHead() 에 대한 설명이다. 반드시 processBlock() 에서만 호출하라고 되어있다. getPlayHead() 는 AudioPlayHead 객체의 포인터를 return 한다. 이 포인터로 juce::AudioPlayHead::CurrentPositionInfo 객체를 얻는다. void proc..
앞선 포스팅들에서, processBlock() 과 audio thread, gui thread 에 대해 알아보았다. audio thread 와 message thread 를 공유하는 변수를 사용하기위해서는 std::atomic 에 대해 알아야한다. 아래의 링크들을 먼저 읽어보도록 한다. [C++11] atomic cplusplus 닷컴 cplusplus 닷컴 위의 링크에서는 아래와 같이 설명하고있다. Atomic types are types that encapsulate a value whose access is guaranteed to not cause data races, and can be used to synchronize memory accesses a..
프로세스는 뭐고 스레드는 뭔가요? 위의 강의를 강력 추천하다. 짧게 프로세스와 쓰레드를 이해할수있다. 하나의 processor 는 여러개의 process 를 갖는다. ( 크롬, 카카오톡, 윈엠프 등등..) 하나의 process 는 여러개의 thread 를 갖는다. 이 thread 들은 process 가 제공하는 한정된 자원을 공유한다. 서로 다른 thread 가 하나의 변수에 동시에 손을 대면 error 이다. 따라서, processBlock() 같은 함수는 audio thread 이기때문에, gui thread 또는 message thread 가 해야할 다른 일들을 절대 시켜서는 안된다. 또한 audio thread 와 gui thread 가 공유하는 변수..
juce::Timer 클래스 아래의 GUI, Audio thread 의 근간이 되는 클래스이다. pure virtual 을 가진 추상 클래스라서, 객체를 만들지않고 상속해야한다. 아래와 같이 객체를 생성하여 사용하는게 아니라, class MyComponent : public juce::Component { juce::Timer timer; } 아래와 같이 상속을 하고 pure virtual 을 정의해주고, 생성자와 파괴자에서 start 와 stop 을 반드시 해줘야한다. class MyComponent : public juce::Component, juce::Timer { public : MyComponent() { startTimer(1000); // 반드시 생성자에서 s..
이 주제에 관해 이야기하기 앞서, Max 에서 내가 했던것을 먼저 살펴보자. 나는 Max 에서 [phasor] 의 오디오 signal 을 메세지로 변환하여, 아래와 같이 그릴수있었다. [snapshot~ 20] 을 통해, 20ms 마다 현재 오디오 signal 의 값을 체크하여 [multislider] 에 그리고있다. [phasor~] 는 어딘가로 값을 보낼 뿐이고, [snapshot~] 이나 [multislider] 가 뭔지 모른다. Max 에서는 오디오 signal 을 그리는것이 그리어렵지않지만, Juce 즉, C++ 환경에서는 thread 에 대한 이해가 있어야한다. 먼저 아래 사항을 기억해야한다. 1. processBlock() 함수는 Audio ..
processBlock(); 은 DAW 가 호출하는 AudioProcessor 클래스의 pure virtual 함수이다. 따라서 이 클래스의 서브 클래스는 반드시 이 함수를 정의해줘야한다. 이 함수는 내가 호출하지않고, DAW 가 호출하는 콜백함수이다. 오디오와 미디 프로세싱이 일어나는 가장 초입이라고 할수있다. 아래의 오디오 인터페이스 셋팅이 있다고 가정해보자. Sample Rate : 48000 Buffer Size : 512 Latency : 10.75ms 샘플레이트만 생각하면 1초에 48000번을 샘플링한다. 하지만 오디오 프로세싱은 샘플 하나 하나를 처리하지않고, 일정량을 모아서 처리하는데, 이 일정..
Juce 미디 메세지 클래스가 아닌, 말 그대로 미디 메세지에 대해 알아보려 한다. MIDI Message 에 관하여 Summary of MIDI Messages MIDI에서 사용되는 NRPN과 RPN system Exclusive,nrpn,rpn 이해가 안됩니다. It's about time. Timing in MIDI files Tempo-relative timing in Max
아직 Juce 로 Step Sequencer 를 만드는것에 대해 명확한 답을 찾지못했다. 포럼에 있는 포스팅들을 다 찾아보자 MidiMessageSequence MidiMessageSequence::MidiEventHolder MidiMessage MidiMessageMetadata MidiBuffer MidiBufferIterator MidiBuffer::Iterator MidiFile Problem making a step sequencer Best practice for timing (Audio thread) Best way to make scrollable/zoomable sequencer GUI Creating MIDI - some basic ques..
AudioPlayHead 클래스 AudioPlayHead::CurrentPositionInfo 클래스 아래는 AudioProcessor 클래스안에 getPlayHead() 함수에 대한 설명이다. 읽어보자. AudioPlayHead 클래스는 내가 단독으로 객체를 만들면 안되고, AudioProcessor 클래스안의 processBlock 함수에서 getPlayHead() 라는 함수를 통해 AudioPlayHead 객체에 접근해야한다. getPlayHead() 는 AudioPlayHead 포인터를 return 하는데, 이 포인터를 절대 저장하지말고, 오디오 thread 가 아닌곳에서 접근하려하지말라고한다. 한마디로 processBloc..