티스토리 뷰
다음은 GUI 애플리케이션 설정, 오디오 입력/출력 처리, 간단한 오디오 효과 만들기 등 일반적인 작업을 보여주는 몇 가지 기본적인 JUCE 구현 예제다. 이 예제에서는 JUCE가 설치되어 있고 프로젝트가 Projucer (JUCE의 프로젝트 고나리 도구)에서 생성되어 있다고 가정한다.
이 코드 스니펫은 fixed gain을 0.5f 로 설정하고 있으며, 슬라이더에 연결된 변수로 대체해 gain level을 실시간으로 제어할 수 있다. 여러 개의 사용자 제어 파라미터가 있는 더 복잡한 플로그인을 구축하는 경우 AuidoProcessorValueTreeState 클래스를 사용해 파라미터를 처리할 수 있다.
- 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)
- 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)
- 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
링크
TAG
- tf-idf
- Android
- 안드로이드
- 딕셔너리
- socket programming
- 티스토리챌린지
- The Economist
- 파이썬
- DICTIONARY
- 소켓 프로그래밍
- leetcode
- Computer Graphics
- I2C
- defaultdict
- vertex shader
- 오블완
- ml
- C++
- 이코노미스트
- 머신 러닝
- 이코노미스트 에스프레소
- The Economist Espresso
- join
- min heap
- machine learning
- 투 포인터
- Python
- 리트코드
- Hash Map
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형