Files
juce_playground/sine/Source/MainComponent.cpp
2017-06-14 17:49:33 -04:00

87 lines
2.5 KiB
C++

#include "../JuceLibraryCode/JuceHeader.h"
class MainContentComponent : public AudioAppComponent,
public Slider::Listener {
public:
MainContentComponent() : samplerate(0.0),
angle(0.0),
delta(0.0),
current(500.0),
target(current) {
addAndMakeVisible(freqslider);
freqslider.setRange(50.0, 5000.0);
freqslider.setSkewFactorFromMidPoint(500.0);
freqslider.setValue(current, dontSendNotification);
freqslider.addListener(this);
setSize(800, 600);
setAudioChannels(0, 1);
}
~MainContentComponent() {
shutdownAudio();
}
void prepareToPlay (int, double sampleRate) override {
samplerate = sampleRate;
updateDelta();
}
void getNextAudioBlock(const AudioSourceChannelInfo& buf) override {
const float level = 0.125f;
float* const buffer = buf.buffer->getWritePointer(0, buf.startSample);
const double lt = target;
if (lt != current) {
const double i = (lt - current) / buf.numSamples;
for (int s = 0; s < buf.numSamples; ++s) {
const float c = (float) std::sin (angle);
current += i;
updateDelta();
angle += delta;
buffer[s] = c * level;
}
current = lt;
} else {
for (int s = 0; s < buf.numSamples; ++s) {
const float c = (float) std::sin (angle);
angle += delta;
buffer[s] = c* level;
}
}
}
void updateDelta() {
const double c = freqslider.getValue() / samplerate;
delta = c * 2.0 * double_Pi;
}
void sliderValueChanged(Slider* s) override {
if (s == &freqslider) target = freqslider.getValue();
}
void releaseResources() override {}
void paint (Graphics& g) override {
g.fillAll (getLookAndFeel().findColour(ResizableWindow::backgroundColourId));
}
void resized() override{
freqslider.setBounds(10, 10, getWidth() - 10, 20);
}
private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)
double samplerate, angle, delta;
double current, target;
Slider freqslider;
};
Component* createMainContentComponent() { return new MainContentComponent(); }