결국 완성했다.

소리까지 나도록 구현을 했으며, 아마 이걸로 간단하게 끝낼 예정이다.

더욱더 들어가면 여러 파형을 사용자가 직접 그리거나 조절을 해 음량도 조절해야하지만 이 이상으로 하기엔 학생신분인 내가 더 힘들 것 같다는 생각이 들었다.

소리 구현 코드는 다음과 같다.

class SynthAudioSource : public juce::AudioSource {
public:
    SynthAudioSource(juce::MidiKeyboardState &keyState) : keyboardState(keyState) {
        for (auto i = 0; i < 4; i++) synth.addVoice(new SineWaveVoice());
        synth.addSound(new SineWaveSound());
    }

    void setUsingSineWaveSound() {
        synth.clearSound();
    }

    void prepareToPlay(int /*smaplesPerBlockExpected*/, double sampleRate) override {
        synth.setCurrentPlaybackSampleRate(sampleRate);
        midiCollector.reset(sampleRate);
    }

    void releaseResources() override {}

    void getNextAudioBlock(const juce::AudioSourceChannelInfo &bufferToFill) override {
        bufferToFill.clearActiveBufferRegion();

        juce::MidiBuffer incomingMidi;
        midiCollector.removeNextBlockOfMessages(incomingMidi, bufforToFill.numSample);

        keyboardState.processNextMidiBuffer(incomingMidi, bufferToFill.startSample, bufferToFill.numSamples, true);

        synth.renderNextBlock(*bufferToFill.buffer, incomingMidi, bufferToFill.startSample, bufferToFill.numSamples);
    }

    juce::MidiMessageCollector* getMidiCollector()
    {
        return &midiCollector;
    }

private:
    juce::MidiKeyboardState &keyboardState;
    juce::Synthesiser synth;
    juce::MidiMessageCollector midiCollector;
};

현재 만든 이 프로그램은 깃허브에서 볼 수 있으며, Ableton 16에서 돌려볼 수 있다.

다음엔 멋진 프로젝트로 찾아오겠다.

아디오스.

소스코드

Team-KoDiNa/KoDiSynth