목록개발 공부 (130)
음악, 삶, 개발
프로세스는 뭐고 스레드는 뭔가요? 위의 강의를 강력 추천하다. 짧게 프로세스와 쓰레드를 이해할수있다. 하나의 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..
Adobe 의 Illustrator 를 보면 아래와 같은 Gradient 패널을 볼수있다. Gradient 는 Linear 와 Radial 라는 2개의 종류로 나뉜다. Linear : 시작점에서 끝점으로. Radial : 중심에서 바깥으로, 우리가 일러스트레이터에서 에서 Gradient 를 만들듯이, Juce 에서 이를 코드로써 표현하면 된다. 하지만, 이런 Gradient 디자인을 코드로 하기전에, 일러스트레이터로 먼저 작업해봄으로써 디자인을 확정하는것이 많은 프로그래머들이 추천하는 방식이다. 코드는 계속해서 컴파일을 해야 결과를 볼수있기때문에, 컴파일을 해가며 디자인을 해나가는것은 굉장히 시간 낭비이기때문이다. 결국 훌륭한 GUI 디자인을 위해서, 더나아가 VST 개발을 위해 Illust..
https://www.youtube.com/watch?v=WTAMfjPCOqc&ab_channel=mimisim https://www.youtube.com/watch?v=gPvILTTzFcQ&ab_channel=DesignArtStudio