결국 완성했다.
소리까지 나도록 구현을 했으며, 아마 이걸로 간단하게 끝낼 예정이다.
더욱더 들어가면 여러 파형을 사용자가 직접 그리거나 조절을 해 음량도 조절해야하지만 이 이상으로 하기엔 학생신분인 내가 더 힘들 것 같다는 생각이 들었다.
소리 구현 코드는 다음과 같다.
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에서 돌려볼 수 있다.
다음엔 멋진 프로젝트로 찾아오겠다.
아디오스.
소스코드