#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(); }