diff --git a/io/Source/Main.cpp b/io/Source/Main.cpp new file mode 100644 index 0000000..796de93 --- /dev/null +++ b/io/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 ioApplication : public JUCEApplication +{ +public: + //============================================================================== + ioApplication() {} + + 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 (ioApplication) diff --git a/io/Source/MainComponent.cpp b/io/Source/MainComponent.cpp new file mode 100644 index 0000000..8e2de46 --- /dev/null +++ b/io/Source/MainComponent.cpp @@ -0,0 +1,70 @@ +#include "../JuceLibraryCode/JuceHeader.h" + +class MainContentComponent : public AudioAppComponent{ +public: + MainContentComponent() : random(Random()) { + + addAndMakeVisible(levelslider); + addAndMakeVisible(levellabel); + levelslider.setRange(0.0, 1.0); + levelslider.setValue(0.5); + levelslider.setTextBoxStyle(Slider::TextBoxRight, false, 100, 20); + levellabel.setText("Level", dontSendNotification); + + setSize(800, 600); + setAudioChannels(2, 2); + } + + ~MainContentComponent() { + shutdownAudio(); + } + + void prepareToPlay(int, double) override {} + + void getNextAudioBlock(const AudioSourceChannelInfo& buf) override { + AudioIODevice* device = deviceManager.getCurrentAudioDevice(); + const BigInteger ic = device->getActiveInputChannels(); + const BigInteger oc = device->getActiveOutputChannels(); + + const int mic = ic.getHighestBit() + 1; + const int moc = oc.getHighestBit() + 1; + + const float l = (float) levelslider.getValue(); + + for (int c = 0; c < moc; ++c) { + if (!oc[c] || !moc) buf.buffer->clear (c, buf.startSample, buf.numSamples); + else { + const int ac = c % mic; + + if (!ic[c]) buf.buffer->clear(c, buf.startSample, buf.numSamples); + else { + const float* ib = buf.buffer->getReadPointer(ac, buf.startSample); + float* ob = buf.buffer->getWritePointer(c, buf.startSample); + + for (int s = 0; s < buf.numSamples; ++s) ob[s] = ib[s] * random.nextFloat() * l; + } + } + } + } + + void releaseResources() override {} + + void paint(Graphics& g) override { + g.fillAll(getLookAndFeel().findColour (ResizableWindow::backgroundColourId)); + } + + void resized() override { + levellabel.setBounds(10, 10, 90, 20); + levelslider.setBounds(100, 10, getWidth() - 110, 20); + } + + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent) + Random random; + Slider levelslider; + Label levellabel; + +}; + +Component* createMainContentComponent() { return new MainContentComponent(); } diff --git a/io/io.jucer b/io/io.jucer new file mode 100644 index 0000000..8e382d6 --- /dev/null +++ b/io/io.jucer @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +