티스토리 뷰

기술(Tech, IT)/C++

[C++] JUCE - 2

Daniel803 2024. 10. 27. 02:21

다음은 GUI 애플리케이션 설정, 오디오 입력/출력 처리, 간단한 오디오 효과 만들기 등 일반적인 작업을 보여주는 몇 가지 기본적인 JUCE 구현 예제다. 이 예제에서는 JUCE가 설치되어 있고 프로젝트가 Projucer (JUCE의 프로젝트 고나리 도구)에서 생성되어 있다고 가정한다.

이 코드 스니펫은 fixed gain을 0.5f 로 설정하고 있으며, 슬라이더에 연결된 변수로 대체해 gain level을 실시간으로 제어할 수 있다. 여러 개의 사용자 제어 파라미터가 있는 더 복잡한 플로그인을 구축하는 경우 AuidoProcessorValueTreeState 클래스를 사용해 파라미터를 처리할 수 있다.

 

  1. Basic GUI Application
    : 이 예제에서는 슬라이더와 슬라이더의 값을 표시하는 레이블이 있는 간단한 GUI 애플리케이션을 만든다.
    #include <JuceHeader.h>
    
    class MainComponent : public juce::Component, private juce::Slider::Listener
    {
    public:
        MainComponent()
        {
            // Add and configure slider
            slider.setRange(0.0, 100.0);
            slider.addListener(this);
            addAndMakeVisible(slider);
    
            // Add and configure label
            label.setText("Value: 0", juce::dontSendNotification);
            label.setFont(juce::Font(16.0f));
            addAndMakeVisible(label);
    
            setSize(300, 200);
        }
    
        void resized() override
        {
            slider.setBounds(10, 10, getWidth() - 20, 20);
            label.setBounds(10, 40, getWidth() - 20, 20);
        }
    
    private:
        void sliderValueChanged(juce::Slider* slider) override
        {
            label.setText("Value: " + juce::String(slider->getValue()), juce::dontSendNotification);
        }
    
        juce::Slider slider;
        juce::Label label;
    
        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MainComponent)
    };
    
    class MainAppWindow : public juce::DocumentWindow
    {
    public:
        MainAppWindow() : DocumentWindow("JUCE App", juce::Colours::lightgrey, DocumentWindow::allButtons)
        {
            setContentOwned(new MainComponent(), true);
            setResizable(true, true);
            setUsingNativeTitleBar(true);
            centreWithSize(getWidth(), getHeight());
            setVisible(true);
        }
    
        void closeButtonPressed() override
        {
            juce::JUCEApplication::getInstance()->systemRequestedQuit();
        }
    };
    
    class SimpleJuceApplication : public juce::JUCEApplication
    {
    public:
        const juce::String getApplicationName() override { return "Simple JUCE Application"; }
        const juce::String getApplicationVersion() override { return "1.0"; }
    
        void initialise(const juce::String&) override { mainWindow.reset(new MainAppWindow()); }
        void shutdown() override { mainWindow = nullptr; }
    
    private:
        std::unique_ptr<MainAppWindow> mainWindow;
    };
    
    START_JUCE_APPLICATION(SimpleJuceApplication)


  2. Basic Audio Processing: Simple Gain Effect
    : 이 예제는 슬라이더 값에 따라 오디오 버퍼의 크기를 조절하는 기본 게인 (볼륨 조절) 효과를 생성한다.
    #include <JuceHeader.h>
    
    class GainProcessor : public juce::AudioAppComponent
    {
    public:
        GainProcessor()
        {
            addAndMakeVisible(gainSlider);
            gainSlider.setRange(0.0, 1.0);
            gainSlider.setValue(0.5);
            setSize(400, 300);
            setAudioChannels(2, 2); // Stereo input and output
        }
    
        ~GainProcessor() override { shutdownAudio(); }
    
        void prepareToPlay(int samplesPerBlockExpected, double sampleRate) override
        {
            juce::ignoreUnused(samplesPerBlockExpected, sampleRate);
        }
    
        void getNextAudioBlock(const juce::AudioSourceChannelInfo& bufferToFill) override
        {
            auto gain = gainSlider.getValue();
    
            for (int channel = 0; channel < bufferToFill.buffer->getNumChannels(); ++channel)
            {
                auto* channelData = bufferToFill.buffer->getWritePointer(channel);
                for (int sample = 0; sample < bufferToFill.numSamples; ++sample)
                    channelData[sample] *= gain; // Apply gain to each sample
            }
        }
    
        void releaseResources() override {}
    
        void paint(juce::Graphics& g) override
        {
            g.fillAll(juce::Colours::black);
        }
    
        void resized() override
        {
            gainSlider.setBounds(20, 20, getWidth() - 40, 40);
        }
    
    private:
        juce::Slider gainSlider;
    
        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(GainProcessor)
    };
    
    class GainApplication : public juce::JUCEApplication
    {
    public:
        const juce::String getApplicationName() override { return "Gain Effect"; }
        const juce::String getApplicationVersion() override { return "1.0"; }
    
        void initialise(const juce::String&) override { mainWindow.reset(new MainAppWindow()); }
        void shutdown() override { mainWindow = nullptr; }
    
        class MainAppWindow : public juce::DocumentWindow
        {
        public:
            MainAppWindow() : DocumentWindow("Gain Effect", juce::Colours::lightgrey, DocumentWindow::allButtons)
            {
                setContentOwned(new GainProcessor(), true);
                setResizable(true, true);
                centreWithSize(getWidth(), getHeight());
                setVisible(true);
            }
    
            void closeButtonPressed() override
            {
                juce::JUCEApplication::getInstance()->systemRequestedQuit();
            }
        };
    
    private:
        std::unique_ptr<MainAppWindow> mainWindow;
    };
    
    START_JUCE_APPLICATION(GainApplication)


  3. Creating an Audio Plugin Project
    : JUCE 플러그인 프로젝트에서는 processBlack 함수를 재정의해 오디오 효과를 구현한다. 다음은 간단한 gain plugin 예제다.
    #include <JuceHeader.h>
    
    class SimpleGainAudioProcessor : public juce::AudioProcessor
    {
    public:
        SimpleGainAudioProcessor() : AudioProcessor (BusesProperties().withInput("Input", juce::AudioChannelSet::stereo())
                                                    .withOutput("Output", juce::AudioChannelSet::stereo())) {}
    
        void prepareToPlay (double sampleRate, int samplesPerBlock) override {}
        void releaseResources() override {}
    
        void processBlock (juce::AudioBuffer<float>& buffer, juce::MidiBuffer&) override
        {
            auto gainValue = 0.5f; // Fixed gain for simplicity
    
            for (int channel = 0; channel < buffer.getNumChannels(); ++channel)
            {
                buffer.applyGain(channel, 0, buffer.getNumSamples(), gainValue);
            }
        }
    
        const juce::String getName() const override { return "Simple Gain"; }
        // Other necessary overrides omitted for brevity
    
    private:
        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SimpleGainAudioProcessor)
    };


반응형

'기술(Tech, IT) > C++' 카테고리의 다른 글

[C++] JUCE - 1  (2) 2024.10.26
[C++] Parameter 관점에 Call by Value  (0) 2024.10.19
[C++] map VS. unordered_map  (2) 2024.10.17
[C++] C++ vs. Python (Low-Level Memory Management)  (0) 2024.07.12
[C++] C++ vs. Python (Performance)  (0) 2024.07.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
반응형