diff --git a/dependencies/Maximilian b/dependencies/Maximilian index 1162c2a6e89b5adaea2685b3ff2b844aa9cacff4..6c3d65be199ec74753e61ec026284fd3ebc71faa 160000 --- a/dependencies/Maximilian +++ b/dependencies/Maximilian @@ -1 +1 @@ -Subproject commit 1162c2a6e89b5adaea2685b3ff2b844aa9cacff4 +Subproject commit 6c3d65be199ec74753e61ec026284fd3ebc71faa diff --git a/examples/JUCE/regression_synth/LICENSE b/examples/JUCE/regression_synth/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..8cc86f95db7c607bfd31fda2d8f4a27601f88dcf --- /dev/null +++ b/examples/JUCE/regression_synth/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2016, Goldsmiths Creative Computing (UK, London) +All rights reserved. +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + Neither the name of Goldsmiths nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/examples/JUCE/regression_synth/Source/Main.cpp b/examples/JUCE/regression_synth/Source/Main.cpp new file mode 100755 index 0000000000000000000000000000000000000000..17355abc7e4ddfe44cb9194681c157ac83c9d038 --- /dev/null +++ b/examples/JUCE/regression_synth/Source/Main.cpp @@ -0,0 +1,101 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ + +#include "../JuceLibraryCode/JuceHeader.h" + +Component* createMainContentComponent(); + +//============================================================================== +class RAPID_JUCEApplication : public JUCEApplication +{ +public: + //============================================================================== + RAPID_JUCEApplication() {} + + 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, + Colours::lightgrey, + 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> mainWindow; +}; + +//============================================================================== +// This macro generates the main() routine that launches the app. +START_JUCE_APPLICATION (RAPID_JUCEApplication) diff --git a/examples/JUCE/regression_synth/Source/MainComponent.cpp b/examples/JUCE/regression_synth/Source/MainComponent.cpp new file mode 100755 index 0000000000000000000000000000000000000000..451a141f0fcf0906ea08a64974d4e9388af1f0e6 --- /dev/null +++ b/examples/JUCE/regression_synth/Source/MainComponent.cpp @@ -0,0 +1,470 @@ +/* + ============================================================================== + + This file was auto-generated! + + ============================================================================== +*/ + +#ifndef MAINCOMPONENT_H_INCLUDED +#define MAINCOMPONENT_H_INCLUDED + +// It's important to call any headers that might +// include apple libs / headers before Juce's +// to prevent ambigious classes +#include "../../../../dependencies/Maximilian/maximilian.h" +#include "../../../../dependencies/RapidLib/src/regression.h" +#include <random> +#include <array> +#include "../JuceLibraryCode/JuceHeader.h" + +class MainContentComponent; + +//============================================================================== +class Oscilloscope : public Component, + private Timer +{ +public: + Oscilloscope(MainContentComponent* _p) : parent(_p), + writePosition(0), + bufferSize(16384), + paintSize(256) + { + startTimer(40); + } + + void pushBuffer(const float* _sampleData, int _numSamples) + { + for (int i = 0; i < _numSamples; ++i) + { + size_t pos = ++writePosition % buffer.size(); + oldBuffer[pos] = buffer[pos]; + buffer[pos] = _sampleData[i]; + } + } + + void paint(Graphics& _g) override + { + boundary = getLocalBounds(); + _g.fillAll(juce::Colour(0xff000000)); + Path path; + path.startNewSubPath(0, .5 * boundary.getHeight()); + const float bufferYScale = .3f; + int paintPos = 2; + + while (paintPos < buffer.size()) + { + if (isZeroCrossing(paintPos)) + { + break; + } + ++paintPos; + } + + const int posOffset = paintPos; + while (paintPos < buffer.size()) + { + float bufferPoint = buffer[paintPos];//0.5 * std::abs(buffer[paintPos] - oldBuffer[paintPos]); + Point<float> point((paintPos - posOffset) * boundary.getWidth() / paintSize, + 0.5 * ((bufferYScale * bufferPoint) + 1) * boundary.getHeight()); + path.lineTo(point); + ++paintPos; + } + _g.setColour(juce::Colour(0xff00ff00)); + _g.strokePath(path, PathStrokeType(2.0f)); + } + + void mouseDrag(const MouseEvent& _event) override; + +private: + //========================================================================== + void timerCallback() override + { + repaint(); + } + + bool isZeroCrossing(int i) const noexcept + { + jassert(i > 0); + return buffer[i] > buffer[i - 1] && buffer[i] > 0 && buffer[i - 1] < 0; + } + + //========================================================================== + juce::Rectangle<int> boundary; + std::array<float, int((float)44100 / 83)> buffer; + std::array<float, int((float)44100 / 83)> oldBuffer; + std::size_t writePosition; + const int bufferSize; + const int paintSize; + MainContentComponent* const parent; +}; + +//============================================================================== +class MainContentComponent : public AudioAppComponent, + public Slider::Listener, + public Button::Listener +{ +public: + //========================================================================== + /* Setup */ + MainContentComponent(): + modulationFrequency(4.1), + modulationDepth(.2), + centreFrequency(512), + resonance(2), + targetModulationFrequency(4.1), + targetModulationDepth(.2), + targetCentreFrequency(512), + targetResonance(2), + trained(false), + oscilloscope(this) + { + header.setColour(TextButton::buttonColourId, Colours::wheat); + header.setColour(TextButton::textColourOffId, Colours::white); + header.setEnabled(false); + header.setButtonText("Rapid API Example"); + addAndMakeVisible(header); + + sidebar.setColour(TextButton::buttonColourId, Colours::white); + sidebar.setColour(TextButton::textColourOffId, Colours::white); + sidebar.setEnabled(false); + addAndMakeVisible(sidebar); + + train.setColour(TextButton::buttonColourId, Colours::wheat); + train.setColour(TextButton::textColourOffId, Colours::white); + train.setButtonText("Train"); + train.addListener(this); + addAndMakeVisible(train); + + randomise.setColour(TextButton::buttonColourId, Colours::wheat); + randomise.setColour(TextButton::textColourOffId, Colours::white); + randomise.setButtonText("Randomise!"); + randomise.addListener(this); + addAndMakeVisible(randomise); + + footer.setColour(TextButton::buttonColourId, Colours::wheat); + footer.setColour(TextButton::textColourOffId, Colours::white); + footer.setEnabled(false); + footer.setButtonText("Select the synth parameters you like, then move the mouse to an area and hold space to associate that space with that sound. Repeat with a few sounds"); + addAndMakeVisible(footer); + + modulationFrequencySlider.setRange(0, 4096); + modulationFrequencySlider.setSkewFactorFromMidPoint (500.0); + modulationFrequencySlider.setValue(modulationFrequency, dontSendNotification); + modulationFrequencySlider.addListener(this); + addAndMakeVisible(modulationFrequencySlider); + + modulationFrequencyLabel.setText("Mod Frequency", dontSendNotification); + modulationFrequencyLabel.setColour(Label::ColourIds::textColourId, Colours::white); + modulationFrequencyLabel.attachToComponent(&modulationFrequencySlider, false); + addAndMakeVisible(modulationFrequencyLabel); + + modulationIndexSlider.setRange(0., 1.); + modulationIndexSlider.setValue(modulationDepth, dontSendNotification); + modulationIndexSlider.addListener(this); + addAndMakeVisible(modulationIndexSlider); + + modulationIndexLabel.setText("Mod Index", dontSendNotification); + modulationFrequencyLabel.setColour(Label::ColourIds::textColourId, Colours::white); + modulationIndexLabel.attachToComponent(&modulationIndexSlider, false); + addAndMakeVisible(modulationIndexLabel); + + filterFrequencySlider.setRange(0.00001, 4096); + filterFrequencySlider.setColour(Label::ColourIds::textColourId, Colours::white); + filterFrequencySlider.setSkewFactorFromMidPoint (500.0); + filterFrequencySlider.setValue(centreFrequency, dontSendNotification); + filterFrequencySlider.addListener(this); + addAndMakeVisible(filterFrequencySlider); + + filterFrequencyLabel.setText("Filter Frequency", dontSendNotification); + filterFrequencyLabel.setColour(Label::ColourIds::textColourId, Colours::white); + filterFrequencyLabel.attachToComponent(&filterFrequencySlider, false); + addAndMakeVisible(filterFrequencyLabel); + + filterResonanceSlider.setRange(0.00001, 40); + filterResonanceSlider.setValue(resonance, dontSendNotification); + filterResonanceSlider.addListener(this); + addAndMakeVisible(filterResonanceSlider); + + filterResonanceLabel.setText("Filter Resonance", dontSendNotification); + filterResonanceLabel.setColour(Label::ColourIds::textColourId, Colours::white); + filterResonanceLabel.attachToComponent(&filterResonanceSlider, false); + addAndMakeVisible(filterResonanceLabel); + + addAndMakeVisible(oscilloscope); + + setSize (800, 600); + + // No inputs, two outputs + setAudioChannels (0, 2); + } + + ~MainContentComponent() + { + shutdownAudio(); + } + + //========================================================================== + /* Audio Methods */ + void prepareToPlay (int _samplesPerBlockExpected, double _sampleRate) override + { + // Remember this is part of the audio callback so we must be careful + // not to do anything silly like allocating memory or dare I say wait + // for locks! + maxiSettings::setup(std::round(_sampleRate), 2, _samplesPerBlockExpected); + } + + void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) override + { + int periodLength = int(maxiSettings::sampleRate / 83); + // Get the buffers for both output channels + float* const bufferL = bufferToFill.buffer->getWritePointer(0, bufferToFill.startSample); + float* const bufferR = bufferToFill.buffer->getWritePointer(1, bufferToFill.startSample); + + const double localTargetModulationFrequency = targetModulationFrequency; + const double localTargetModulationDepth = targetModulationDepth; + const double localTargetCentreFrequency = targetCentreFrequency; + const double localTargetResonance = targetResonance; + + const double modulationFrequencyDelta = (localTargetModulationFrequency != modulationFrequency) ? (targetModulationFrequency - modulationFrequency) / bufferToFill.numSamples : 0; + const double modulationDepthDelta = (localTargetModulationDepth != modulationDepth) ? (targetModulationDepth - modulationDepth) / bufferToFill.numSamples : 0; + const double centreFrequencyDelta = (localTargetCentreFrequency != centreFrequency) ? (targetCentreFrequency - centreFrequency) / bufferToFill.numSamples : 0; + const double resonanceDelta = (localTargetResonance != resonance) ? (targetResonance - resonance) / bufferToFill.numSamples : 0; + + // Create our FM Maximilian noises and send the mixed output to the channels + for (int sample = 0; sample < bufferToFill.numSamples; ++sample) + { + modulationFrequency += modulationFrequencyDelta; + modulationDepth += modulationDepthDelta; + centreFrequency += centreFrequencyDelta; + resonance += resonanceDelta; + + const double modulatorFrame = (modulator.sinewave(modulationFrequency) + 1.0) / 2.0 * modulationDepth + (1 - modulationDepth); + const double carrierFrame = carrier.pulse(83, modulatorFrame); + const double filteredFrame = filter.lores(carrierFrame, centreFrequency, resonance); + + mixer.stereo(filteredFrame, outputs, .5); + bufferL[sample] = float(outputs[0]); + bufferR[sample] = float(outputs[1]); + } + + modulationFrequency = localTargetModulationFrequency; + modulationDepth = localTargetModulationDepth; + centreFrequency = localTargetCentreFrequency; + resonance = localTargetResonance; + + oscilloscope.pushBuffer(bufferL, bufferToFill.numSamples); + } + + void releaseResources() override {} + + //========================================================================== + /* Graphics, GUI */ + void paint (Graphics& _g) override + { + // (Our component is opaque, so we must completely fill the background with a solid colour) + _g.fillAll (Colour::fromRGB(40, 40, 40)); + + } + + // This is called once at startup and then everytime the window is resized + // Essentially all the code here just subdivides the available window space + void resized() override + { + juce::Rectangle<int> area(getLocalBounds()); + + const int headerFooterHeight = 36; + header.setBounds(area.removeFromTop(headerFooterHeight)); + footer.setBounds(area.removeFromBottom(headerFooterHeight)); + + const int sidebarWidth = jmax(100, area.getWidth() / 4); + juce::Rectangle<int> sidebarArea(area.removeFromLeft(sidebarWidth)); + sidebar.setBounds(sidebarArea); + + const int drawingWidth = area.getWidth(); + drawingArea = area.removeFromRight(drawingWidth); + + oscilloscope.setBounds(drawingArea.reduced(int(sidebarWidth / 4.0))); + + const int sideItemHeight = 40; + const int sideItemMargin = 5; + + train.setBounds(sidebarArea.removeFromTop(sideItemHeight).reduced(sideItemMargin)); + randomise.setBounds(sidebarArea.removeFromBottom(sideItemHeight).reduced(sideItemMargin)); + filterResonanceSlider.setBounds(sidebarArea.removeFromBottom(sideItemHeight).reduced(2.5*sideItemMargin)); + filterFrequencySlider.setBounds(sidebarArea.removeFromBottom(sideItemHeight).reduced(2.5*sideItemMargin)); + modulationIndexSlider.setBounds(sidebarArea.removeFromBottom(sideItemHeight).reduced(2.5*sideItemMargin)); + modulationFrequencySlider.setBounds(sidebarArea.removeFromBottom(sideItemHeight).reduced(2.5*sideItemMargin)); + + } + + //========================================================================== + /* Interaction events via mouse and keyboard */ + + void mouseDrag(const MouseEvent& _event) override + { + if (trained) + { + std::vector<double> input = normaliseMouseSpace(_event.position.roundToInt(), drawingArea); + std::vector<double> output = rapidRegression.run(input); + + targetModulationFrequency = output[0]; + targetModulationDepth = output[1]; + targetCentreFrequency = output[2]; + targetResonance = output[3]; + modulationFrequencySlider.setValue(targetModulationFrequency, dontSendNotification); + modulationIndexSlider.setValue(targetModulationDepth, dontSendNotification); + filterFrequencySlider.setValue(targetCentreFrequency, dontSendNotification); + filterResonanceSlider.setValue(targetResonance, dontSendNotification); + } + else + { + + AlertWindow::showMessageBoxAsync(AlertWindow::AlertIconType::WarningIcon, "Error", "Please train the model before trying to run it!", "ok"); + } + } + + void mouseMove(const MouseEvent& _event) override + { + if (KeyPress::isKeyCurrentlyDown(KeyPress::spaceKey)) + { + std::vector<double> input = normaliseMouseSpace(_event.position.roundToInt(), drawingArea); + trainingExample<double> example; + example.input = { input[0], input[1] }; + example.output = { modulationFrequency, modulationDepth, centreFrequency, resonance }; + trainingSet.push_back(example); + + // only do once... + if (input.size() > 0) + { + footer.setButtonText("When you have finished recorded the sounds you want, press train!"); + } + } + } + + std::vector<double> normaliseMouseSpace(const juce::Point<int>& _position, const juce::Rectangle<int>& _area) + { + juce::Point<int> pos = _area.getConstrainedPoint(_position); + std::vector<double> temp; + temp.resize(2); + temp[0] = double(double(pos.getX() - _area.getX()) / _area.getWidth()); + temp[1] = double(double(pos.getY() - _area.getY()) / _area.getHeight()); + return temp; + } + + void sliderValueChanged(Slider* _slider) override + { + if (_slider == &modulationFrequencySlider) + targetModulationFrequency = modulationFrequencySlider.getValue(); + else if (_slider == &modulationIndexSlider) + targetModulationDepth = modulationIndexSlider.getValue(); + else if (_slider == &filterFrequencySlider) + targetCentreFrequency = filterFrequencySlider.getValue(); + else if (_slider == &filterResonanceSlider) + targetResonance = filterResonanceSlider.getValue(); + } + + void buttonClicked(Button* _button) override + { + if (_button == &train) + { + if (trainingSet.size() > 2) + { + trained = rapidRegression.train(trainingSet); + + footer.setButtonText("Now just drag the mouse to play!"); + } + else + { + AlertWindow::showMessageBoxAsync(AlertWindow::AlertIconType::WarningIcon, "Error", "Please record more audio and mouse coordinate examples before training!\n\nYou can add examples by choosing mouse coordinates with the current sound and holding space whilst wiggling the mouse", "ok"); + } + } + else if (_button == &randomise) + { + std::random_device random; + std::default_random_engine generator(random()); + std::uniform_real_distribution<double> distribution(0.0, 1.0); + + targetModulationFrequency = 4096 * distribution(generator); + targetModulationDepth = distribution(generator); + targetCentreFrequency = 4096 * distribution(generator); + targetResonance = 40 * distribution(generator); + + modulationFrequencySlider.setValue(targetModulationFrequency, dontSendNotification); + modulationIndexSlider.setValue(targetModulationDepth, dontSendNotification); + filterFrequencySlider.setValue(targetCentreFrequency, dontSendNotification); + filterResonanceSlider.setValue(targetResonance, dontSendNotification); + + } + } + + +private: + //========================================================================== + /*** AUDIO ***/ + + // FM Synthesis private parameters + double modulationFrequency; + double modulationDepth; + double centreFrequency; + double resonance; + double targetModulationFrequency; + double targetModulationDepth; + double targetCentreFrequency; + double targetResonance; + double outputs[2]; + + // Maximilian objects + maxiOsc carrier; + maxiOsc modulator; + maxiFilter filter; + maxiMix mixer; + + //========================================================================== + /*** MACHINE LEARNING ***/ + + // Rapid regression + regression<double> rapidRegression; + std::vector<trainingExample<double> > trainingSet; + + // Program state + bool trained; + + //========================================================================== + /*** GUI ***/ + + // Layout + TextButton header; + TextButton sidebar; + TextButton footer; + juce::Rectangle<int> drawingArea; + + // Rapidmix + TextButton train; + + // Maximilian + Slider modulationFrequencySlider; + Label modulationFrequencyLabel; + Slider modulationIndexSlider; + Label modulationIndexLabel; + Slider filterFrequencySlider; + Label filterFrequencyLabel; + Slider filterResonanceSlider; + Label filterResonanceLabel; + TextButton randomise; + + //========================================================================== + /*** GRAPHICS ***/ + Oscilloscope oscilloscope; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent) +}; + +void Oscilloscope::mouseDrag(const MouseEvent& _event) +{ + parent->mouseDrag(_event); +} + +// (This function is called by the app startup code to create our main component) +Component* createMainContentComponent() { return new MainContentComponent(); } +#endif // MAINCOMPONENT_H_INCLUDED diff --git a/examples/JUCE/regression_synth/regression_synth.jucer b/examples/JUCE/regression_synth/regression_synth.jucer new file mode 100644 index 0000000000000000000000000000000000000000..55dd9b05984fae98acf8e074b847cbefabe202c2 --- /dev/null +++ b/examples/JUCE/regression_synth/regression_synth.jucer @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<JUCERPROJECT id="Zh7kpS" name="regression_synth" projectType="guiapp" version="1.0.0" + bundleIdentifier="com.goldsmiths.rapidmix" includeBinaryInAppConfig="1" + jucerVersion="5.1.2" displaySplashScreen="1" reportAppUsage="1" + splashScreenColour="Dark" cppLanguageStandard="11" companyWebsite="rapidmixapi.com"> + <MAINGROUP id="g6MNSM" name="regression_synth"> + <GROUP id="{EEA5B7C1-BCCC-64B0-259E-056090611E46}" name="Maximilian"> + <GROUP id="{E20267E7-DDC5-EF6E-1EAE-C4B745764568}" name="libs"> + <FILE id="h0SFJ1" name="fft.cpp" compile="1" resource="0" file="../../../dependencies/Maximilian/libs/fft.cpp"/> + <FILE id="pYguvb" name="fft.h" compile="0" resource="0" file="../../../dependencies/Maximilian/libs/fft.h"/> + <FILE id="QKNTAJ" name="maxiAtoms.cpp" compile="1" resource="0" file="../../../dependencies/Maximilian/libs/maxiAtoms.cpp"/> + <FILE id="FFoUBX" name="maxiAtoms.h" compile="0" resource="0" file="../../../dependencies/Maximilian/libs/maxiAtoms.h"/> + <FILE id="iwzAfI" name="maxiBark.cpp" compile="1" resource="0" file="../../../dependencies/Maximilian/libs/maxiBark.cpp"/> + <FILE id="yMdl88" name="maxiBark.h" compile="0" resource="0" file="../../../dependencies/Maximilian/libs/maxiBark.h"/> + <FILE id="xngR2q" name="maxiFFT.cpp" compile="1" resource="0" file="../../../dependencies/Maximilian/libs/maxiFFT.cpp"/> + <FILE id="A78B6e" name="maxiFFT.h" compile="0" resource="0" file="../../../dependencies/Maximilian/libs/maxiFFT.h"/> + <FILE id="I4uKZC" name="maxiGrains.cpp" compile="1" resource="0" file="../../../dependencies/Maximilian/libs/maxiGrains.cpp"/> + <FILE id="iWeaAV" name="maxiGrains.h" compile="0" resource="0" file="../../../dependencies/Maximilian/libs/maxiGrains.h"/> + <FILE id="Zhejq6" name="maxim.h" compile="0" resource="0" file="../../../dependencies/Maximilian/libs/maxim.h"/> + <FILE id="sYsKW9" name="maxiMFCC.cpp" compile="1" resource="0" file="../../../dependencies/Maximilian/libs/maxiMFCC.cpp"/> + <FILE id="mCQV3j" name="maxiMFCC.h" compile="0" resource="0" file="../../../dependencies/Maximilian/libs/maxiMFCC.h"/> + <FILE id="u3TFe0" name="sineTable.h" compile="0" resource="0" file="../../../dependencies/Maximilian/libs/sineTable.h"/> + </GROUP> + <FILE id="m2Fbmi" name="maximilian.h" compile="0" resource="0" file="../../../dependencies/Maximilian/maximilian.h"/> + <FILE id="R5ZjoZ" name="maximilian.cpp" compile="1" resource="0" file="../../../dependencies/Maximilian/maximilian.cpp"/> + </GROUP> + <GROUP id="{D5573091-5DD2-23C2-72F7-033E80306961}" name="RapidLib"> + <GROUP id="{9F227387-ED1A-B17B-AAF3-0B2D43546269}" name="src"> + <GROUP id="{A3EB9FB3-AE6F-6CA1-169C-0FF061BD4B0C}" name="emscripten"> + <FILE id="o0rrsi" name="classificationEmbindings.h" compile="0" resource="0" + file="../../../dependencies/RapidLib/src/emscripten/classificationEmbindings.h"/> + <FILE id="K95sXr" name="knnEmbindings.h" compile="0" resource="0" file="../../../dependencies/RapidLib/src/emscripten/knnEmbindings.h"/> + <FILE id="BMqYkg" name="modelSetEmbindings.h" compile="0" resource="0" + file="../../../dependencies/RapidLib/src/emscripten/modelSetEmbindings.h"/> + <FILE id="jEjfUj" name="nnEmbindings.h" compile="0" resource="0" file="../../../dependencies/RapidLib/src/emscripten/nnEmbindings.h"/> + <FILE id="gjnhIh" name="nodeEnv.js" compile="0" resource="1" file="../../../dependencies/RapidLib/src/emscripten/nodeEnv.js"/> + <FILE id="iRFc6d" name="rapidLibPost.js" compile="0" resource="1" file="../../../dependencies/RapidLib/src/emscripten/rapidLibPost.js"/> + <FILE id="PzNivx" name="rapidStreamEmbindings.h" compile="0" resource="0" + file="../../../dependencies/RapidLib/src/emscripten/rapidStreamEmbindings.h"/> + <FILE id="GHQaRa" name="regressionEmbindings.h" compile="0" resource="0" + file="../../../dependencies/RapidLib/src/emscripten/regressionEmbindings.h"/> + <FILE id="PivhZh" name="seriesClassificationEmbindings.h" compile="0" + resource="0" file="../../../dependencies/RapidLib/src/emscripten/seriesClassificationEmbindings.h"/> + <FILE id="Q4hJHG" name="svmEmbindings.h" compile="0" resource="0" file="../../../dependencies/RapidLib/src/emscripten/svmEmbindings.h"/> + </GROUP> + <FILE id="VDnAfe" name="baseModel.h" compile="0" resource="0" file="../../../dependencies/RapidLib/src/baseModel.h"/> + <FILE id="x2NkmO" name="classification.cpp" compile="1" resource="1" + file="../../../dependencies/RapidLib/src/classification.cpp"/> + <FILE id="iQdC88" name="classification.h" compile="0" resource="0" + file="../../../dependencies/RapidLib/src/classification.h"/> + <FILE id="otvyPe" name="dtw.cpp" compile="1" resource="0" file="../../../dependencies/RapidLib/src/dtw.cpp"/> + <FILE id="zh6JH2" name="dtw.h" compile="0" resource="0" file="../../../dependencies/RapidLib/src/dtw.h"/> + <FILE id="gg80D5" name="fastDTW.cpp" compile="1" resource="0" file="../../../dependencies/RapidLib/src/fastDTW.cpp"/> + <FILE id="Ga8ett" name="fastDTW.h" compile="0" resource="0" file="../../../dependencies/RapidLib/src/fastDTW.h"/> + <FILE id="d3LgeL" name="knnClassification.cpp" compile="1" resource="0" + file="../../../dependencies/RapidLib/src/knnClassification.cpp"/> + <FILE id="G5zqzw" name="knnClassification.h" compile="0" resource="0" + file="../../../dependencies/RapidLib/src/knnClassification.h"/> + <FILE id="eEEUwv" name="modelSet.cpp" compile="1" resource="0" file="../../../dependencies/RapidLib/src/modelSet.cpp"/> + <FILE id="ieo9qs" name="modelSet.h" compile="0" resource="0" file="../../../dependencies/RapidLib/src/modelSet.h"/> + <FILE id="BLEyMT" name="neuralNetwork.cpp" compile="1" resource="0" + file="../../../dependencies/RapidLib/src/neuralNetwork.cpp"/> + <FILE id="MEILfO" name="neuralNetwork.h" compile="0" resource="0" file="../../../dependencies/RapidLib/src/neuralNetwork.h"/> + <FILE id="x3ZMq1" name="rapidStream.cpp" compile="1" resource="0" file="../../../dependencies/RapidLib/src/rapidStream.cpp"/> + <FILE id="C7Nz0H" name="rapidStream.h" compile="0" resource="0" file="../../../dependencies/RapidLib/src/rapidStream.h"/> + <FILE id="wJpnuO" name="regression.cpp" compile="1" resource="0" file="../../../dependencies/RapidLib/src/regression.cpp"/> + <FILE id="ny9hho" name="regression.h" compile="0" resource="0" file="../../../dependencies/RapidLib/src/regression.h"/> + <FILE id="QwAPCf" name="searchWindow.cpp" compile="1" resource="0" + file="../../../dependencies/RapidLib/src/searchWindow.cpp"/> + <FILE id="hRP4uS" name="searchWindow.h" compile="0" resource="0" file="../../../dependencies/RapidLib/src/searchWindow.h"/> + <FILE id="INKhcY" name="seriesClassification.cpp" compile="1" resource="0" + file="../../../dependencies/RapidLib/src/seriesClassification.cpp"/> + <FILE id="B0c8F3" name="seriesClassification.h" compile="0" resource="0" + file="../../../dependencies/RapidLib/src/seriesClassification.h"/> + <FILE id="T74lKl" name="svmClassification.cpp" compile="1" resource="0" + file="../../../dependencies/RapidLib/src/svmClassification.cpp"/> + <FILE id="cVqdZA" name="svmClassification.h" compile="0" resource="0" + file="../../../dependencies/RapidLib/src/svmClassification.h"/> + <FILE id="lKTpTj" name="trainingExample.h" compile="0" resource="0" + file="../../../dependencies/RapidLib/src/trainingExample.h"/> + <FILE id="DtjqOn" name="warpPath.cpp" compile="1" resource="0" file="../../../dependencies/RapidLib/src/warpPath.cpp"/> + <FILE id="JjHvke" name="warpPath.h" compile="0" resource="0" file="../../../dependencies/RapidLib/src/warpPath.h"/> + </GROUP> + <GROUP id="{C5C7E07C-213F-8ECA-B1B6-B6BE04D35EAF}" name="dependencies"> + <GROUP id="{E2AB2F69-E9EC-0A7F-8492-228002C6DB3D}" name="json"> + <FILE id="vuXt8e" name="json-forwards.h" compile="0" resource="0" file="../../../dependencies/RapidLib/dependencies/json/json-forwards.h"/> + <FILE id="pVNxcf" name="json.h" compile="0" resource="0" file="../../../dependencies/RapidLib/dependencies/json/json.h"/> + </GROUP> + <GROUP id="{5C2C9ACC-885E-978B-0183-576F0DD3DA61}" name="libsvm"> + <FILE id="Hh1DiU" name="libsvm.cpp" compile="1" resource="0" file="../../../dependencies/RapidLib/dependencies/libsvm/libsvm.cpp"/> + <FILE id="f5D4KB" name="libsvm.h" compile="0" resource="0" file="../../../dependencies/RapidLib/dependencies/libsvm/libsvm.h"/> + </GROUP> + <FILE id="ibbler" name="jsoncpp.cpp" compile="1" resource="0" file="../../../dependencies/RapidLib/dependencies/jsoncpp.cpp"/> + </GROUP> + </GROUP> + <GROUP id="{24ED27E9-EF99-2FF0-3FAC-40EF82C0F046}" name="Source"> + <FILE id="KK8sNt" name="MainComponent.cpp" compile="1" resource="0" + file="Source/MainComponent.cpp"/> + <FILE id="vn82oj" name="Main.cpp" compile="1" resource="0" file="Source/Main.cpp"/> + </GROUP> + </MAINGROUP> + <EXPORTFORMATS> + <VS2015 targetFolder="Builds/VisualStudio2015"> + <CONFIGURATIONS> + <CONFIGURATION name="Debug" winWarningLevel="4" generateManifest="1" winArchitecture="32-bit" + isDebug="1" optimisation="1" targetName="RAPID_JUCE" headerPath="../../../../dependencies/Maximilian/"/> + <CONFIGURATION name="Release" winWarningLevel="4" generateManifest="1" winArchitecture="32-bit" + isDebug="0" optimisation="3" targetName="RAPID_JUCE" headerPath="../../../../dependencies/Maximilian"/> + </CONFIGURATIONS> + <MODULEPATHS> + <MODULEPATH id="juce_core" path="../JUCE/modules"/> + <MODULEPATH id="juce_events" path="../JUCE/modules"/> + <MODULEPATH id="juce_graphics" path="../JUCE/modules"/> + <MODULEPATH id="juce_data_structures" path="../JUCE/modules"/> + <MODULEPATH id="juce_gui_basics" path="../JUCE/modules"/> + <MODULEPATH id="juce_gui_extra" path="../JUCE/modules"/> + <MODULEPATH id="juce_cryptography" path="../JUCE/modules"/> + <MODULEPATH id="juce_video" path="../JUCE/modules"/> + <MODULEPATH id="juce_opengl" path="../JUCE/modules"/> + <MODULEPATH id="juce_audio_basics" path="../JUCE/modules"/> + <MODULEPATH id="juce_audio_devices" path="../JUCE/modules"/> + <MODULEPATH id="juce_audio_formats" path="../JUCE/modules"/> + <MODULEPATH id="juce_audio_processors" path="../JUCE/modules"/> + <MODULEPATH id="juce_audio_utils" path="../JUCE/modules"/> + </MODULEPATHS> + </VS2015> + <XCODE_MAC targetFolder="Builds/MacOSX"> + <CONFIGURATIONS> + <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="RAPID_JUCE" + headerPath="../../../../dependencies/Maximilian"/> + <CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="RAPID_JUCE" + headerPath="../../../../dependencies/Maximilian"/> + </CONFIGURATIONS> + <MODULEPATHS> + <MODULEPATH id="juce_video" path="../JUCE/modules"/> + <MODULEPATH id="juce_opengl" path="../JUCE/modules"/> + <MODULEPATH id="juce_gui_extra" path="../JUCE/modules"/> + <MODULEPATH id="juce_gui_basics" path="../JUCE/modules"/> + <MODULEPATH id="juce_graphics" path="../JUCE/modules"/> + <MODULEPATH id="juce_events" path="../JUCE/modules"/> + <MODULEPATH id="juce_data_structures" path="../JUCE/modules"/> + <MODULEPATH id="juce_cryptography" path="../JUCE/modules"/> + <MODULEPATH id="juce_core" path="../JUCE/modules"/> + <MODULEPATH id="juce_audio_utils" path="../JUCE/modules"/> + <MODULEPATH id="juce_audio_processors" path="../JUCE/modules"/> + <MODULEPATH id="juce_audio_formats" path="../JUCE/modules"/> + <MODULEPATH id="juce_audio_devices" path="../JUCE/modules"/> + <MODULEPATH id="juce_audio_basics" path="../JUCE/modules"/> + </MODULEPATHS> + </XCODE_MAC> + </EXPORTFORMATS> + <MODULES> + <MODULE id="juce_audio_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_audio_devices" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_audio_formats" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_audio_processors" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_audio_utils" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_core" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_cryptography" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_data_structures" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_events" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_graphics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_gui_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_gui_extra" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_opengl" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + <MODULE id="juce_video" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/> + </MODULES> + <JUCEOPTIONS/> + <LIVE_SETTINGS> + <WINDOWS/> + </LIVE_SETTINGS> +</JUCERPROJECT>