From 30c40a5e14224bad3b64bbbd29fba6174a911224 Mon Sep 17 00:00:00 2001 From: hellerve Date: Wed, 14 Jun 2017 17:49:33 -0400 Subject: [PATCH] sine: added project --- sine/Source/Main.cpp | 102 ++++++++++++++++++++++++++++++++++ sine/Source/MainComponent.cpp | 86 ++++++++++++++++++++++++++++ sine/sine.jucer | 55 ++++++++++++++++++ 3 files changed, 243 insertions(+) create mode 100644 sine/Source/Main.cpp create mode 100644 sine/Source/MainComponent.cpp create mode 100644 sine/sine.jucer diff --git a/sine/Source/Main.cpp b/sine/Source/Main.cpp new file mode 100644 index 0000000..6debb5a --- /dev/null +++ b/sine/Source/Main.cpp @@ -0,0 +1,102 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ + +#include "../JuceLibraryCode/JuceHeader.h" + +Component* createMainContentComponent(); + +//============================================================================== +class sineApplication : public JUCEApplication +{ +public: + //============================================================================== + sineApplication() {} + + const String getApplicationName() override { return ProjectInfo::projectName; } + const String getApplicationVersion() override { return ProjectInfo::versionString; } + bool moreThanOneInstanceAllowed() override { return true; } + + //============================================================================== + void initialise (const String& commandLine) override + { + // This method is where you should put your application's initialisation code.. + + mainWindow = new MainWindow (getApplicationName()); + } + + void shutdown() override + { + // Add your application's shutdown code here.. + + mainWindow = nullptr; // (deletes our window) + } + + //============================================================================== + void systemRequestedQuit() override + { + // This is called when the app is being asked to quit: you can ignore this + // request and let the app carry on running, or call quit() to allow the app to close. + quit(); + } + + void anotherInstanceStarted (const String& commandLine) override + { + // When another instance of the app is launched while this one is running, + // this method is invoked, and the commandLine parameter tells you what + // the other instance's command-line arguments were. + } + + //============================================================================== + /* + This class implements the desktop window that contains an instance of + our MainContentComponent class. + */ + class MainWindow : public DocumentWindow + { + public: + MainWindow (String name) : DocumentWindow (name, + Desktop::getInstance().getDefaultLookAndFeel() + .findColour (ResizableWindow::backgroundColourId), + DocumentWindow::allButtons) + { + setUsingNativeTitleBar (true); + setContentOwned (createMainContentComponent(), true); + setResizable (true, true); + + centreWithSize (getWidth(), getHeight()); + setVisible (true); + } + + void closeButtonPressed() override + { + // This is called when the user tries to close this window. Here, we'll just + // ask the app to quit when this happens, but you can change this to do + // whatever you need. + JUCEApplication::getInstance()->systemRequestedQuit(); + } + + /* Note: Be careful if you override any DocumentWindow methods - the base + class uses a lot of them, so by overriding you might break its functionality. + It's best to do all your work in your content component instead, but if + you really have to override any DocumentWindow methods, make sure your + subclass also calls the superclass's method. + */ + + private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow) + }; + +private: + ScopedPointer mainWindow; +}; + +//============================================================================== +// This macro generates the main() routine that launches the app. +START_JUCE_APPLICATION (sineApplication) diff --git a/sine/Source/MainComponent.cpp b/sine/Source/MainComponent.cpp new file mode 100644 index 0000000..af0727c --- /dev/null +++ b/sine/Source/MainComponent.cpp @@ -0,0 +1,86 @@ +#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(); } diff --git a/sine/sine.jucer b/sine/sine.jucer new file mode 100644 index 0000000..af5e025 --- /dev/null +++ b/sine/sine.jucer @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +