|
- /*
- ==============================================================================
-
- JUCE demo code - use at your own risk!
-
- ==============================================================================
- */
-
- #include "StringSynthesiser.h"
- #include "StringComponent.h"
-
-
- //==============================================================================
- class StringDemoComponent : public AudioAppComponent
- {
- public:
- StringDemoComponent()
- {
- createStringComponents();
- setSize (800, 560);
-
- // specify the number of input and output channels that we want to open
- setAudioChannels (0, 2);
- }
-
- ~StringDemoComponent()
- {
- shutdownAudio();
- }
-
- //=======================================================================
- void prepareToPlay (int /*samplesPerBlockExpected*/, double sampleRate) override
- {
- generateStringSynths (sampleRate);
- }
-
- void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) override
- {
- bufferToFill.clearActiveBufferRegion();
-
- for (int channel = 0; channel < bufferToFill.buffer->getNumChannels(); ++channel)
- {
- float* const channelData = bufferToFill.buffer->getWritePointer (channel, bufferToFill.startSample);
-
- if (channel == 0)
- {
- for (auto synth : stringSynths)
- synth->generateAndAddData (channelData, bufferToFill.numSamples);
- }
- else
- {
- memcpy (channelData,
- bufferToFill.buffer->getReadPointer (0),
- bufferToFill.numSamples * sizeof (float));
- }
- }
- }
-
- void releaseResources() override
- {
- stringSynths.clear();
- }
-
- //=======================================================================
- void paint (Graphics& g) override
- {
- g.fillAll (Colours::black);
- }
-
- void resized() override
- {
- int xPos = 20;
- int yPos = 20;
- int yDistance = 50;
-
- for (auto stringLine : stringLines)
- {
- stringLine->setTopLeftPosition (xPos, yPos);
- yPos += yDistance;
- addAndMakeVisible (stringLine);
- }
- }
-
- private:
- void mouseDown (const MouseEvent& e) override
- {
- mouseDrag (e);
- }
-
- void mouseDrag (const MouseEvent& e) override
- {
- for (int i = 0; i < stringLines.size(); ++i)
- {
- auto* stringLine = stringLines.getUnchecked(i);
-
- if (stringLine->getBounds().contains (e.getPosition()))
- {
- float position = (e.position.x - stringLine->getX()) / stringLine->getWidth();
-
- stringLine->stringPlucked (position);
- stringSynths.getUnchecked(i)->stringPlucked (position);
- }
- }
- }
-
- //=======================================================================
- struct StringParameters
- {
- StringParameters (int midiNote)
- : frequencyInHz (MidiMessage::getMidiNoteInHertz (midiNote)),
- lengthInPixels ((int) (760 / (frequencyInHz / MidiMessage::getMidiNoteInHertz (42))))
- {
- }
-
- double frequencyInHz;
- int lengthInPixels;
- };
-
- static std::vector<StringParameters> getDefaultStringParameters()
- {
- return { 42, 44, 46, 49, 51, 54, 56, 58, 61, 63, 66, 68, 70 };
- }
-
- void createStringComponents()
- {
- for (auto stringParams : getDefaultStringParameters())
- {
- stringLines.add (new StringComponent (stringParams.lengthInPixels,
- Colour::fromHSV (Random().nextFloat(), 0.6f, 0.9f, 1.0f)));
- }
- }
-
- void generateStringSynths (double sampleRate)
- {
- stringSynths.clear();
-
- for (auto stringParams : getDefaultStringParameters())
- {
- stringSynths.add (new StringSynthesiser (sampleRate, stringParams.frequencyInHz));
- }
- }
-
- //=======================================================================
- OwnedArray<StringComponent> stringLines;
- OwnedArray<StringSynthesiser> stringSynths;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StringDemoComponent)
- };
|