/* ============================================================================== This file was auto-generated! ============================================================================== */ #ifndef MAINCOMPONENT_H_INCLUDED #define MAINCOMPONENT_H_INCLUDED #include "../JuceLibraryCode/JuceHeader.h" //============================================================================== /* This component lives inside our window, and this is where you should put all your controls and content. */ class MainContentComponent : public AudioAppComponent { public: //============================================================================== MainContentComponent() : phase (0.0f), delta (0.0f), frequency (5000.0f), amplitude (0.2f), sampleRate (0.0) { setSize (500, 400); // the the input and output channels (currently Mono in and out) setAudioChannels (1, 1); } ~MainContentComponent() { shutdownAudio(); } //======================================================================= // HANDLE AUDIO void prepareToPlay (int samplesPerBlockExpected, double newSampleRate) override { sampleRate = newSampleRate; } /* This is where the audio is created. In this example we fill the audio buffer with a sine wave whose frequency is controlled by the mouse Y position and whose volume is controlled by the mouse X potition. */ void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) { bufferToFill.clearActiveBufferRegion(); // iterate over each sample of the sample buffer for (int i = bufferToFill.startSample; i < bufferToFill.numSamples + bufferToFill.startSample; ++i) { bufferToFill.buffer->getWritePointer (0)[i] = amplitude * sinf (phase); // increment the phase step for the next sample phase += delta; // reset the phase when it reaches 2PI to avoid large numbers while (phase >= 2.0f * float_Pi) phase -= 2.0f * float_Pi; } } void releaseResources() override { // This gets automatically called when audio device paramters change // or device is restarted. } //======================================================================= // HANDLE DRAWING void paint (Graphics& g) { // fill background g.fillAll (Colours::black); // Set the drawing colour to white g.setColour (Colours::white); // Draw an ellipse based on the mouse position and audio volume int radius = amplitude * 200; g.fillEllipse (mouse.x - radius/2, mouse.y - radius/2, radius, radius); // draw a representative sinewave Path wave; for (int i = 0; i < getWidth(); i++) { if (i == 0) wave.startNewSubPath (0, getHeight()/2); else wave.lineTo (i, getHeight()/2 + amplitude * getHeight() * 2.0f * sin (i*frequency*0.0001f)); } g.strokePath (wave, PathStrokeType (2)); } // Mouse handling void mouseUp(const MouseEvent& e) override { amplitude = 0.0f; } void mouseDown (const MouseEvent& e) override { mouseDrag (e); } void mouseDrag (const MouseEvent& e) override { // Update the mouse position variable mouse.setXY (e.x, e.y); repaint(); frequency = (getHeight() - e.y) * 10.0f; amplitude = e.x/float(getWidth()) * 0.2f; delta = 2.0f * float_Pi * frequency / sampleRate; } void resized() { // This is called when the MainContentComponent is resized. // If you add any child components, this is where you should // update their positions. } private: //============================================================================== // private member variables float phase; float delta; float frequency; float amplitude; double sampleRate; Point mouse; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent) }; Component* createMainContentComponent() { return new MainContentComponent(); }; #endif // MAINCOMPONENT_H_INCLUDED