diff --git a/.gitignore b/.gitignore index e257658..3488d8e 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,6 @@ *.out *.app +JuceLibraryCode/** + +/.vs diff --git a/Assets/Clicks/01 SeikoSQ50/High Seiko SQ50.wav b/Assets/Clicks/01 SeikoSQ50/High Seiko SQ50.wav new file mode 100644 index 0000000..64d39e2 Binary files /dev/null and b/Assets/Clicks/01 SeikoSQ50/High Seiko SQ50.wav differ diff --git a/Assets/Clicks/01 SeikoSQ50/Low Seiko SQ50.wav b/Assets/Clicks/01 SeikoSQ50/Low Seiko SQ50.wav new file mode 100644 index 0000000..ebdbf40 Binary files /dev/null and b/Assets/Clicks/01 SeikoSQ50/Low Seiko SQ50.wav differ diff --git a/Assets/Clicks/02 Stick/High Stick.wav b/Assets/Clicks/02 Stick/High Stick.wav new file mode 100644 index 0000000..e26199f Binary files /dev/null and b/Assets/Clicks/02 Stick/High Stick.wav differ diff --git a/Assets/Clicks/02 Stick/Low Stick.wav b/Assets/Clicks/02 Stick/Low Stick.wav new file mode 100644 index 0000000..2f899ea Binary files /dev/null and b/Assets/Clicks/02 Stick/Low Stick.wav differ diff --git a/Assets/Clicks/03 Cowbell/High Cowbell.wav b/Assets/Clicks/03 Cowbell/High Cowbell.wav new file mode 100644 index 0000000..684aa39 Binary files /dev/null and b/Assets/Clicks/03 Cowbell/High Cowbell.wav differ diff --git a/Assets/Clicks/03 Cowbell/Low Cowbell.wav b/Assets/Clicks/03 Cowbell/Low Cowbell.wav new file mode 100644 index 0000000..1d3ad04 Binary files /dev/null and b/Assets/Clicks/03 Cowbell/Low Cowbell.wav differ diff --git a/Assets/Clicks/04 vChip Wood/High Wood.wav b/Assets/Clicks/04 vChip Wood/High Wood.wav new file mode 100644 index 0000000..211db22 Binary files /dev/null and b/Assets/Clicks/04 vChip Wood/High Wood.wav differ diff --git a/Assets/Clicks/04 vChip Wood/Low Wood.wav b/Assets/Clicks/04 vChip Wood/Low Wood.wav new file mode 100644 index 0000000..a74aad2 Binary files /dev/null and b/Assets/Clicks/04 vChip Wood/Low Wood.wav differ diff --git a/Assets/Clicks/05 vChip Claves/HIgh Claves.wav b/Assets/Clicks/05 vChip Claves/HIgh Claves.wav new file mode 100644 index 0000000..19985eb Binary files /dev/null and b/Assets/Clicks/05 vChip Claves/HIgh Claves.wav differ diff --git a/Assets/Clicks/05 vChip Claves/Low Claves.wav b/Assets/Clicks/05 vChip Claves/Low Claves.wav new file mode 100644 index 0000000..709c949 Binary files /dev/null and b/Assets/Clicks/05 vChip Claves/Low Claves.wav differ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b53609d --- /dev/null +++ b/Makefile @@ -0,0 +1,229 @@ +# Automatically generated makefile, created by the Projucer +# Don't edit this file! Your changes will be overwritten when you re-save the Projucer project! + +# build with "V=1" for verbose builds +ifeq ($(V), 1) +V_AT = +else +V_AT = @ +endif + +# (this disables dependency generation if multiple architectures are set) +DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) + +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + +ifndef STRIP + STRIP=strip +endif + +ifndef AR + AR=ar +endif + +ifndef CONFIG + CONFIG=Debug +endif + +JUCE_ARCH_LABEL := $(shell uname -m) + +ifeq ($(CONFIG),Debug) + JUCE_BINDIR := build + JUCE_LIBDIR := build + JUCE_OBJDIR := build/intermediate/Debug + JUCE_OUTDIR := build + + ifeq ($(TARGET_ARCH),) + TARGET_ARCH := + endif + + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=1" "-DJUCE_USE_DARK_SPLASH_SCREEN=0" "-DJUCE_PROJUCER_VERSION=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_JACK=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_B28D=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -IJuceLibraryCode -IJuceLibraryCode/modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" + JUCE_TARGET_APP := Tchick + + JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) + JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++20 $(CXXFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + + CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) +endif + +ifeq ($(CONFIG),Release) + JUCE_BINDIR := build + JUCE_LIBDIR := build + JUCE_OBJDIR := build/intermediate/Release + JUCE_OUTDIR := build + + ifeq ($(TARGET_ARCH),) + TARGET_ARCH := + endif + + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=1" "-DJUCE_USE_DARK_SPLASH_SCREEN=0" "-DJUCE_PROJUCER_VERSION=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_JACK=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_B28D=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -IJuceLibraryCode -IJuceLibraryCode/modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" + JUCE_TARGET_APP := Tchick + + JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS) + JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++20 $(CXXFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + + CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) +endif + +OBJECTS_APP := \ + $(JUCE_OBJDIR)/OptionsPanel_74384d2f.o \ + $(JUCE_OBJDIR)/TempoPanel_68242652.o \ + $(JUCE_OBJDIR)/PlayPanel_f7a1c6f1.o \ + $(JUCE_OBJDIR)/MesurePanel_621c6998.o \ + $(JUCE_OBJDIR)/Config_df6c736b.o \ + $(JUCE_OBJDIR)/BPMPanel_fcde4d0e.o \ + $(JUCE_OBJDIR)/Main_b18eef62.o \ + $(JUCE_OBJDIR)/Metronome_d2176e73.o \ + $(JUCE_OBJDIR)/MainComponent_fec15f05.o \ + $(JUCE_OBJDIR)/include_juce_audio_basics_854129ea.o \ + $(JUCE_OBJDIR)/include_juce_audio_devices_c670bf62.o \ + $(JUCE_OBJDIR)/include_juce_audio_formats_7957c261.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_46d0f806.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_ara_80e36097.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_badcdc68.o \ + $(JUCE_OBJDIR)/include_juce_audio_utils_d9446d36.o \ + $(JUCE_OBJDIR)/include_juce_core_f75b497b.o \ + $(JUCE_OBJDIR)/include_juce_data_structures_7e723c43.o \ + $(JUCE_OBJDIR)/include_juce_events_92002035.o \ + $(JUCE_OBJDIR)/include_juce_graphics_915442e7.o \ + $(JUCE_OBJDIR)/include_juce_gui_basics_1fa21125.o \ + $(JUCE_OBJDIR)/include_juce_gui_extra_fc3dee7a.o \ + +.PHONY: clean all strip + +all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) + +$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES) + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors alsa freetype2 libcurl + @echo Linking "Tchick - App" + -$(V_AT)mkdir -p $(JUCE_BINDIR) + -$(V_AT)mkdir -p $(JUCE_LIBDIR) + -$(V_AT)mkdir -p $(JUCE_OUTDIR) + $(V_AT)$(CXX) -o $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(OBJECTS_APP) $(JUCE_LDFLAGS) $(JUCE_LDFLAGS_APP) $(RESOURCES) $(TARGET_ARCH) + +$(JUCE_OBJDIR)/OptionsPanel_74384d2f.o: Source/OptionsPanel.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling OptionsPanel.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/TempoPanel_68242652.o: Source/TempoPanel.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling TempoPanel.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/PlayPanel_f7a1c6f1.o: Source/PlayPanel.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling PlayPanel.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/MesurePanel_621c6998.o: Source/MesurePanel.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling MesurePanel.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/Config_df6c736b.o: Source/Config.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling Config.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/BPMPanel_fcde4d0e.o: Source/BPMPanel.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling BPMPanel.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/Main_b18eef62.o: Source/Main.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling Main.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/Metronome_d2176e73.o: Source/Metronome.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling Metronome.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/MainComponent_fec15f05.o: Source/MainComponent.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling MainComponent.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_basics_854129ea.o: JuceLibraryCode/include_juce_audio_basics.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_basics.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_devices_c670bf62.o: JuceLibraryCode/include_juce_audio_devices.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_devices.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_formats_7957c261.o: JuceLibraryCode/include_juce_audio_formats.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_formats.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_46d0f806.o: JuceLibraryCode/include_juce_audio_processors.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_ara_80e36097.o: JuceLibraryCode/include_juce_audio_processors_ara.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_ara.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_badcdc68.o: JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_lv2_libs.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_utils_d9446d36.o: JuceLibraryCode/include_juce_audio_utils.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_utils.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_core_f75b497b.o: JuceLibraryCode/include_juce_core.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_core.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_data_structures_7e723c43.o: JuceLibraryCode/include_juce_data_structures.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_data_structures.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_events_92002035.o: JuceLibraryCode/include_juce_events.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_events.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_graphics_915442e7.o: JuceLibraryCode/include_juce_graphics.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_graphics.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_gui_basics_1fa21125.o: JuceLibraryCode/include_juce_gui_basics.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_gui_basics.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_gui_extra_fc3dee7a.o: JuceLibraryCode/include_juce_gui_extra.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_gui_extra.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +clean: + @echo Cleaning Tchick + $(V_AT)$(CLEANCMD) + +strip: + @echo Stripping Tchick + -$(V_AT)$(STRIP) --strip-unneeded $(JUCE_OUTDIR)/$(TARGET) + +-include $(OBJECTS_APP:%.o=%.d) diff --git a/README.md b/README.md index 8a3a67e..b7a767f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,12 @@ # Tchick -Simple metronome \ No newline at end of file +A basic metronome application built to test capabilities of [JUCE](https://github.com/juce-framework/JUCE) +audio application framework. + +## Build +Generate your prefered build chain via Projucer by opening Tchick.sln +Visual Studio 2022 and linux makefiles are provided as examples. +On linux, you have to copy Assets/Clicks folder in the output directory. + +## Run +Run the executable. Click play button. Have fun. \ No newline at end of file diff --git a/Source/.continue/mcpServers/new-mcp-server.yaml b/Source/.continue/mcpServers/new-mcp-server.yaml new file mode 100644 index 0000000..0e32aa6 --- /dev/null +++ b/Source/.continue/mcpServers/new-mcp-server.yaml @@ -0,0 +1,10 @@ +name: New MCP server +version: 0.0.1 +schema: v1 +mcpServers: + - name: New MCP server + command: npx + args: + - -y + - + env: {} diff --git a/Source/.continue/rules/new-rule.md b/Source/.continue/rules/new-rule.md new file mode 100644 index 0000000..f9554c7 --- /dev/null +++ b/Source/.continue/rules/new-rule.md @@ -0,0 +1,5 @@ +--- +description: A description of your rule +--- + +Your rule content \ No newline at end of file diff --git a/Source/.vscode/settings.json b/Source/.vscode/settings.json new file mode 100644 index 0000000..0c2297c --- /dev/null +++ b/Source/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "continue.enableConsole": true, + "continue.enableQuickActions": true, + "continue.telemetryEnabled": false +} \ No newline at end of file diff --git a/Source/BPMPanel.cpp b/Source/BPMPanel.cpp new file mode 100644 index 0000000..68f671b --- /dev/null +++ b/Source/BPMPanel.cpp @@ -0,0 +1,156 @@ +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Gestion du tempo. + + ============================================================================== +*/ + +#include "BPMPanel.h" + + +BPMPanel::BPMPanel(juce::Colour c) : backgroundColour(c) +{ + // initialisation de l'interface + addComponent(decrement); + addComponent(bpm); + addComponent(increment); + + addComponent(twice); + addComponent(half); + addComponent(set60); + addComponent(set90); + addComponent(set120); + addComponent(set150); + + decrement.setRepeatSpeed(300, 100); // On veux pouvoir laisser le bouton appuyé + increment.setRepeatSpeed(300, 100); + + bpm.setText("72", juce::dontSendNotification); + bpm.getFont().setBold(true); + bpm.setColour(juce::Label::textColourId, juce::Colours::black); + bpm.setJustificationType(juce::Justification::centred); + bpm.setFont(50); +} + +void BPMPanel::addComponent(juce::Component& c) +{ + addAndMakeVisible(c); + c.setColour(juce::TextButton::buttonColourId, backgroundColour); + c.setColour(juce::TextButton::textColourOffId, juce::Colours::black); +} + +void BPMPanel::mouseWheelMove(const juce::MouseEvent&, + const juce::MouseWheelDetails& wheel) +{ + // capture des mouseWheel pour invoquer increment/decrement + float dir = wheel.deltaY * (wheel.isReversed ? -1.0f : 1.0f); + if (dir > 0) + { + increment.onClick(); + } + else + { + decrement.onClick(); + } +} + +void BPMPanel::paint(juce::Graphics& g) +{ + g.fillAll(backgroundColour); +} + +void BPMPanel::resized() +{ + // Layout à la mano avec une première ligne pour les raccourcis + auto area = getLocalBounds(); + int margin = 3; + area.removeFromTop(3*margin); + + { + // première ligne accès rapide aux speeds + int setLinHeigth = 20; + auto setSpeed = area.removeFromTop(setLinHeigth); + int butWidth = 64; + int marginH = (setSpeed.getWidth() - butWidth * 4) / 2; + setSpeed.removeFromLeft(marginH); + set60.setBounds(setSpeed.removeFromLeft(butWidth)); setSpeed.removeFromLeft(margin); + set90.setBounds(setSpeed.removeFromLeft(butWidth)); setSpeed.removeFromLeft(margin); + set120.setBounds(setSpeed.removeFromLeft(butWidth)); setSpeed.removeFromLeft(margin); + set150.setBounds(setSpeed.removeFromLeft(butWidth)); setSpeed.removeFromLeft(margin); + } + + area.removeFromTop(margin); + + // Et une deuxième ligne avec increment/decrement et le tempo courant + { + // deuxième ligne BPM inc + dec + int butHeigth = 20; + int butWidth = 64; + int labeSize = 5 * butHeigth; + int totalWidth = 2 * butWidth + labeSize; + int marginH = (area.getWidth() - totalWidth) / 2; + int marginV = (area.getHeight() - labeSize) / 2; + decrement.setBounds(area.getX() + marginH, area.getY() + marginV + butHeigth, butWidth, 2 * butHeigth); + half.setBounds(area.getX() + marginH, area.getY() + marginV + 3 * butHeigth + margin, butWidth, butHeigth); + + bpm.setBounds(area.getX() + marginH + butWidth, area.getY() + marginV, labeSize, labeSize); + + increment.setBounds(area.getX() + marginH + butWidth + labeSize, area.getY() + marginV + butHeigth, butWidth, 2 * butHeigth); + twice.setBounds(area.getX() + marginH + butWidth + labeSize, area.getY() + marginV + 3 * butHeigth + margin, butWidth, butHeigth); + } +} + +void BPMPanel::init(Metronome & metro) +{ + // On établi les liaisons entre le Metronome et les composants graphique + bpm.setText(juce::String(metro.getBPM()), juce::dontSendNotification); // On récupère la valeur initiale du tempo + increment.onClick = [&, this]() { inc(metro); }; + decrement.onClick = [&, this]() { dec(metro); }; + set60.onClick = [&, this]() { setBPM(metro, 60); }; + set90.onClick = [&, this]() { setBPM(metro, 90); }; + set120.onClick = [&, this]() { setBPM(metro, 120); }; + set150.onClick = [&, this]() { setBPM(metro, 150); }; + half.onClick = [&, this]() { setBPM(metro, metro.getBPM() / 2); }; + twice.onClick = [&, this]() { setBPM(metro, metro.getBPM() * 2); }; +} + +void BPMPanel::inc(Metronome& metro) +{ + // Ajoute 1 au tempo + metro.setBPM(metro.getBPM() + 1); + bpm.setText(juce::String(metro.getBPM()), juce::dontSendNotification); +} + +void BPMPanel::dec(Metronome& metro) +{ + // reduit le tempo de 1 + metro.setBPM(metro.getBPM() - 1); + bpm.setText(juce::String(metro.getBPM()), juce::dontSendNotification); +} +void BPMPanel::setBPM(Metronome& metro, int value) +{ + // défini la nouvelle valeur du tempo + metro.setBPM(value); + bpm.setText(juce::String(metro.getBPM()), juce::dontSendNotification); +} \ No newline at end of file diff --git a/Source/BPMPanel.h b/Source/BPMPanel.h new file mode 100644 index 0000000..265add9 --- /dev/null +++ b/Source/BPMPanel.h @@ -0,0 +1,66 @@ +#pragma once +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Gestion du tempo. + + ============================================================================== +*/ + +#include +#include "Metronome.h" + +struct BPMPanel : public juce::Component +{ + explicit BPMPanel(juce::Colour c); + + // Méthode de surcharge JUCE + void mouseWheelMove(const juce::MouseEvent&, + const juce::MouseWheelDetails& wheel) override; // on prend en charge le mouseWheel pour changer le tempo + + void paint(juce::Graphics& g) override; + + void resized() override; + + // utilitaire graphique + void addComponent(juce::Component& c); + + // méthodes de gestion du tempo + void init(Metronome& metro); + void inc(Metronome& metro); + void dec(Metronome& metro); + void setBPM(Metronome& metro, int value); + + // composants graphiques + juce::Colour backgroundColour; + juce::TextButton increment{ "+" }; + juce::TextButton decrement{ "-" }; + juce::TextButton twice{ "*2" }; + juce::TextButton half{ "/2" }; + juce::TextButton set60{ "60" }; + juce::TextButton set90{ "90" }; + juce::TextButton set120{ "120" }; + juce::TextButton set150{ "150" }; + juce::Label bpm; +}; + diff --git a/Source/Config.cpp b/Source/Config.cpp new file mode 100644 index 0000000..de62bfc --- /dev/null +++ b/Source/Config.cpp @@ -0,0 +1,104 @@ +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Gestion de la sauvegarde de la configuration courante. + + ============================================================================== +*/ + +#include "Config.h" + +// petit singleton +Config* Config::instance = nullptr; + + +Config& Config::Load() +{ + if (instance == nullptr) + instance = new Config(); + + // On cherche le fichier json dans le repertoire courant + juce::File curDir{ juce::File::getSpecialLocation(juce::File::SpecialLocationType::currentExecutableFile).getParentDirectory() }; + juce::File confFile{ curDir.getChildFile("tchick.json") }; + + if (confFile.exists()) + { + // s'il existe, on le charge + auto content = juce::JSON::parse(confFile); + instance->fromVar(content); + } + + return *instance; +} + +void Config::Save(Metronome& metro, OptionsPanel& options) +{ + // On initialise les paramètres + instance->bpm = metro.getBPM(); + instance->measures = metro.getMeasures(); + instance->gain = metro.getGain(); + instance->figure = (int)metro.getFigure(); + instance->sound = options.getSoundName(); + + // on transforme en var + juce::var obj = instance->asVar(); + + // on met à jours le fichier + juce::File curDir{ juce::File::getSpecialLocation(juce::File::SpecialLocationType::currentExecutableFile).getParentDirectory() }; + juce::File confFile{ curDir.getChildFile("tchick.json") }; + juce::FileOutputStream stream(confFile); + + if (stream.openedOk()) + { + // méthode préconisé pour ecraser le fichier existant + stream.setPosition(0); + stream.truncate(); + juce::JSON::writeToStream(stream, obj); + } +} + +juce::var Config::asVar() +{ + // création du var à partir de this + juce::DynamicObject* obj = new juce::DynamicObject(); + juce::NamedValueSet& properties = obj->getProperties(); + properties.set("bpm", bpm); + properties.set("measures", measures); + properties.set("gain", gain); + properties.set("sound", sound); + properties.set("figure", figure); + return juce::var(obj); +} + +void Config::fromVar(juce::var var) +{ + // chargement des paramètres depuis un var + juce::DynamicObject* obj = var.getDynamicObject(); + juce::NamedValueSet& properties = obj->getProperties(); + + if(properties.contains("bpm")) bpm = properties["bpm"]; + if(properties.contains("measures")) measures = properties["measures"]; + if(properties.contains("gain")) gain = properties["gain"]; + if(properties.contains("sound")) sound = properties["sound"]; + if(properties.contains("figure")) figure = properties["figure"]; +} \ No newline at end of file diff --git a/Source/Config.h b/Source/Config.h new file mode 100644 index 0000000..f834305 --- /dev/null +++ b/Source/Config.h @@ -0,0 +1,67 @@ +#pragma once +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Gestion de la sauvegarde de la configuration courante. + + ============================================================================== +*/ + +#include +#include "Metronome.h" +#include "OptionsPanel.h" + + +class Metronome; +struct OptionsPanel; +class Config +{ +public: + ~Config() {}; + + // charge la config depuis le fichier json ou les valeurs par defaut + static Config& Load(); + + // enregistre la config dans le fichier json + static void Save(Metronome& metro, OptionsPanel& options); + + // paramètres sauvegardés + int bpm{ 72 }; // default 72 + int measures{ 4 }; // default 4 + float gain{ 1.0f }; // default 1.0 + juce::String sound{ "" }; // default empty + int figure{ 1 }; // default 1 (noire) + + +private: + // je crois que c'est pas suffisant mais on devrait toujours passer par les méthodes statiques + Config() {}; + + // convertisseur paramètre <-> var + juce::var asVar(); + + void fromVar(juce::var var); + + // seule instance de config + static Config* instance; +}; \ No newline at end of file diff --git a/Source/Figures.h b/Source/Figures.h new file mode 100644 index 0000000..3c6ec4e --- /dev/null +++ b/Source/Figures.h @@ -0,0 +1,43 @@ +#pragma once +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Elements graphiques svg, notament les figures rythmiques. + Versions modifiés de svg Wikimedia + Et bouton play fait à la main + + ============================================================================== +*/ + +#include + +namespace SVGFigures +{ + const juce::String blanche(" "); + const juce::String noire(" "); + const juce::String croches(" "); + const juce::String triolet(" "); + const juce::String doubles(" "); + const juce::String swing(" "); + const juce::String play(" "); +} \ No newline at end of file diff --git a/Source/Main.cpp b/Source/Main.cpp new file mode 100644 index 0000000..a25eb46 --- /dev/null +++ b/Source/Main.cpp @@ -0,0 +1,118 @@ +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +#include +#include "MainComponent.h" + +//============================================================================== +class MetronomeApplication : public juce::JUCEApplication +{ +public: + //============================================================================== + MetronomeApplication() {} + + const juce::String getApplicationName() override { return ProjectInfo::projectName; } + const juce::String getApplicationVersion() override { return ProjectInfo::versionString; } + bool moreThanOneInstanceAllowed() override { return true; } + + //============================================================================== + void initialise (const juce::String&) override + { + // This method is where you should put your application's initialisation code.. + + mainWindow.reset (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 juce::String&) 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 MainComponent class. + */ + class MainWindow : public juce::DocumentWindow + { + public: + MainWindow (juce::String name) + : DocumentWindow (name, + juce::Desktop::getInstance().getDefaultLookAndFeel() + .findColour (juce::ResizableWindow::backgroundColourId), + DocumentWindow::allButtons) + { + setUsingNativeTitleBar (true); + setContentOwned (new MainComponent(Config::Load()), true); // On charge la configuration json et on la passe au constructeur de MainComponent + + #if JUCE_IOS || JUCE_ANDROID + setFullScreen (true); + #else + setResizable (false, false); + centreWithSize (getWidth(), getHeight()); + #endif + + 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. + ((MainComponent*)getContentComponent())->saveConfig(); + 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: + std::unique_ptr mainWindow; +}; + +//============================================================================== +// This macro generates the main() routine that launches the app. +START_JUCE_APPLICATION (MetronomeApplication) diff --git a/Source/MainComponent.cpp b/Source/MainComponent.cpp new file mode 100644 index 0000000..fe2a43a --- /dev/null +++ b/Source/MainComponent.cpp @@ -0,0 +1,143 @@ +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + + + +#include "MainComponent.h" + +//============================================================================== +MainComponent::MainComponent(Config& conf) : + metronome(conf), + measures(juce::Colours::whitesmoke), + bpm(juce::Colours::whitesmoke), + tempo(juce::Colours::whitesmoke), + playButton(juce::Colours::whitesmoke), + options(juce::Colours::whitesmoke, conf) +{ + addAndMakeVisible (measures); + addAndMakeVisible (bpm); + bpm.init(metronome); + addAndMakeVisible (tempo); + tempo.init(metronome); + + addAndMakeVisible(playButton); + playButton.init(metronome); + addAndMakeVisible (options); + options.init(metronome); + + setSize (400, 600); + + // Some platforms require permissions to open input channels so request that here + if (juce::RuntimePermissions::isRequired (juce::RuntimePermissions::recordAudio) + && ! juce::RuntimePermissions::isGranted (juce::RuntimePermissions::recordAudio)) + { + juce::RuntimePermissions::request (juce::RuntimePermissions::recordAudio, + [&] (bool granted) { if (granted) setAudioChannels (2, 2); }); + } + else + { + // Specify the number of input and output channels that we want to open + setAudioChannels (0, 2); + } + + startTimer(20); // timer pour aller relire les eventuels signaux du métronome +} + +MainComponent::~MainComponent() +{ + shutdownAudio(); +} + +//============================================================================== +void MainComponent::prepareToPlay (int , double sampleRate) +{ + metronome.prepareToPlay(sampleRate); // passe le sampleRate au métronome +} + +void MainComponent::getNextAudioBlock (const juce::AudioSourceChannelInfo& bufferToFill) +{ + // netoyage de l'entrée + bufferToFill.clearActiveBufferRegion(); + + if (playButton.playState == PlayState::playing) + { + // boucle de lecture du métronome + metronome.getNextAudioBlock (bufferToFill); + } +} + +void MainComponent::releaseResources() +{ +} + +//============================================================================== +void MainComponent::paint (juce::Graphics& g) +{ + g.fillAll (juce::Colours::lightgrey); +} + +void MainComponent::resized() +{ + // Comme on à séparé tout en composants, on utilise un simple grille en ligne + juce::Grid grid; + using Track = juce::Grid::TrackInfo; + using Fr = juce::Grid::Fr; + grid.templateRows = { Track (Fr (5)), Track (Fr (12)), Track (Fr (8)),Track (Fr (20)), Track (Fr (4)) }; + grid.templateColumns = { Track (Fr (1)) }; + + float margin = 1.0f; + grid.items = { + juce::GridItem (measures).withMargin(juce::GridItem::Margin(0.0f, 0.0f, margin, 0.0f)), + juce::GridItem (bpm).withMargin(juce::GridItem::Margin(margin, 0.0f, margin, 0.0f)), + juce::GridItem (tempo).withMargin(juce::GridItem::Margin(margin, 0.0f, margin, 0.0f)), + juce::GridItem(playButton).withMargin(juce::GridItem::Margin(margin, 0.0f, margin, 0.0f)), + juce::GridItem (options).withMargin(juce::GridItem::Margin(margin, 0.0f, 0.0f, 0.0f)), + }; + + + grid.performLayout (getLocalBounds()); +} + +void MainComponent::timerCallback() +{ + // On regarde si le metronome à des choses à nous dire (changement de mesure) + if (metronome.signal.get() == true) + { + int cur = metronome.getCurrentMeasure(); + metronome.signal.set(false); // on ferme le signal + int meas = metronome.getMeasures(); + cur = cur > 0 ? cur - 1 : cur; + measures.update(meas, cur % meas); + if (cur != lastcur) + { + // On à changé de mesure, on indique au playButton de s'allumer pendant 6 frames + playButton.highlightFrames = 6; + lastcur = cur; + } + } + + playButton.highlight(); // le bouton va se redessiner et decrementer son highlightFrames +} + +void MainComponent::saveConfig() +{ + // sauvegarde la configuration du metronome à la fermeture + Config::Save(metronome, options); +} \ No newline at end of file diff --git a/Source/MainComponent.h b/Source/MainComponent.h new file mode 100644 index 0000000..1feabb3 --- /dev/null +++ b/Source/MainComponent.h @@ -0,0 +1,79 @@ +#pragma once +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + + +#include +#include "MesurePanel.h" +#include "BPMPanel.h" +#include "TempoPanel.h" +#include "PlayPanel.h" +#include "OptionsPanel.h" +#include "Metronome.h" + +//============================================================================== + +/* + This component lives inside our window, and this is where you should put all + your controls and content. +*/ + + + +class MainComponent : private juce::Timer, public juce::AudioAppComponent +{ +public: + //============================================================================== + MainComponent(Config& conf); + ~MainComponent(); + + //============================================================================== + void prepareToPlay (int , double sampleRate) override; + void getNextAudioBlock (const juce::AudioSourceChannelInfo& bufferToFill) override; + void releaseResources() override; + + //============================================================================== + void paint (juce::Graphics& g) override; + void resized() override; + + void saveConfig(); + +private: + MesurePanel measures; + BPMPanel bpm; + PlayPanel playButton; + TempoPanel tempo; + OptionsPanel options; + + Metronome metronome; + + // conserve la dernière mesure pour déclencher le highlight en cas de changement + int lastcur; + + // Utilisation d'un timer pour relire les signaux du metronome + // timer de 20ms, largement suffisant pour un retour graphique sans surcharger le processeur (~50fps) + void timerCallback() override; + + // permet de faire clignoter le bouton play sur le temps + void highlight(); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent) +}; + diff --git a/Source/MesurePanel.cpp b/Source/MesurePanel.cpp new file mode 100644 index 0000000..5ad45b7 --- /dev/null +++ b/Source/MesurePanel.cpp @@ -0,0 +1,133 @@ + +#include "MesurePanel.h" +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Gestion du nombre de temps par mesure. + + ============================================================================== +*/ + +void RoundCBLookAndFeel::drawToggleButton(juce::Graphics& g, juce::ToggleButton& button, + bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) +{ + // dessine un cercle au lieux d'un bouton + auto fontSize = juce::jmin(15.0f, (float)button.getHeight() * 0.75f); + auto tickWidth = fontSize * 1.1f; + + drawTickBox(g, button, 4.0f, ((float)button.getHeight() - tickWidth) * 0.5f, + tickWidth, tickWidth, + button.getToggleState(), + button.isEnabled(), + shouldDrawButtonAsHighlighted, + shouldDrawButtonAsDown); +} + +void RoundCBLookAndFeel::drawTickBox(juce::Graphics& g, juce::Component& component, + float x, float y, float w, float h, + bool ticked, bool isEnabled, + bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) +{ + // dessine un cercle au lieux d'un bouton + juce::ignoreUnused(isEnabled, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown); + + g.setColour(component.findColour(juce::ToggleButton::tickDisabledColourId)); + g.drawEllipse(x, y, w, h, 1.0f); + + if (ticked) + { + g.setColour(component.findColour(juce::ToggleButton::tickColourId)); + g.fillEllipse(x, y, w, h); + } +} + + + +MesurePanel::MesurePanel(juce::Colour c) : backgroundColour(c) +{ + lef.reset(new RoundCBLookAndFeel()); + update(4, 0); +} + +MesurePanel::~MesurePanel() +{ + // evite une fuite mémoire à la fermeture due au L&F + for (auto& tb : buttons) + { + removeChildComponent(tb); + tb->setLookAndFeel(nullptr); + } +} + +void MesurePanel::paint(juce::Graphics& g) +{ + g.fillAll(backgroundColour); +} + +void MesurePanel::update(int nb, int cur) +{ + // Construit autant de bouton qu'il y a de temps + if (buttons.size() != nb) + { + // Si la mesure à changé on reinitialise + for (auto& tb : buttons) + { + removeChildComponent(tb); + tb->setVisible(false); + + } + + buttons.clear(); + for (int i = 0; i < nb; ++i) + { + auto* tb = new juce::ToggleButton(juce::String(i)); + addAndMakeVisible(buttons.add(tb)); + tb->setRadioGroupId(1234); + tb->setColour(juce::ToggleButton::tickDisabledColourId, juce::Colours::black); + tb->setColour(juce::ToggleButton::tickColourId, juce::Colours::black); + tb->setLookAndFeel(lef.get()); + } + } + + // On sélectionne le bouton correpondant au temps courant + for (int i = 0; i < nb; ++i) + { + buttons[i]->setToggleState(i == cur, juce::dontSendNotification); + } + + resized(); +} + +void MesurePanel::resized() +{ + // Layout via une flexbox pour répartir les boutons en ligne + juce::FlexBox fb; + fb.flexWrap = juce::FlexBox::Wrap::wrap; + fb.justifyContent = juce::FlexBox::JustifyContent::center; + fb.alignContent = juce::FlexBox::AlignContent::center; + + for (auto* b : buttons) + fb.items.add(juce::FlexItem(*b).withMinWidth(40.0f).withMinHeight(40.0f)); + + fb.performLayout(getLocalBounds().toFloat()); +} \ No newline at end of file diff --git a/Source/MesurePanel.h b/Source/MesurePanel.h new file mode 100644 index 0000000..61e536f --- /dev/null +++ b/Source/MesurePanel.h @@ -0,0 +1,62 @@ +#pragma once +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Gestion du nombre de temps par mesure. + + ============================================================================== +*/ + +#include + +// Surcharge les boutons pour un rond plein ou vide +struct RoundCBLookAndFeel : public juce::LookAndFeel_V4 +{ + void drawToggleButton(juce::Graphics& g, juce::ToggleButton& button, + bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override; + + void drawTickBox(juce::Graphics& g, juce::Component& component, + float x, float y, float w, float h, + bool ticked, bool isEnabled, + bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override; +}; + +// Panneau d'affichage de la mesure en cours +struct MesurePanel : public juce::Component +{ + explicit MesurePanel(juce::Colour c); + + ~MesurePanel(); + + // Méthode de surcharge JUCE + void paint(juce::Graphics& g) override; + void resized() override; + + // méthodes internes + void update(int nb, int cur); + + // composants graphiques + juce::Colour backgroundColour; + juce::OwnedArray buttons; + std::unique_ptr lef; +}; \ No newline at end of file diff --git a/Source/Metronome.cpp b/Source/Metronome.cpp new file mode 100644 index 0000000..38c2881 --- /dev/null +++ b/Source/Metronome.cpp @@ -0,0 +1,246 @@ +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Moteur de l'application. Gère la lecture des samples Callé sur le bon tempo. + + ============================================================================== +*/ + +#include "Metronome.h" + +Metronome::Metronome(Config& conf) +{ + // on récupère les valeurs de la configuration + bpm.set(conf.bpm); + measures.set(conf.measures); + gain.set(conf.gain); + setFigure(conf.figure); + + // on initialise le lecteur wav + formatManager.registerBasicFormats(); + + // On crée 2 voie sur le synthé + for (auto i = 0; i < 2; ++i) + synth.addVoice(new juce::SamplerVoice()); +} + +Metronome::~Metronome() +{ + // libère les sons + synth.clearSounds(); +} + + +void Metronome::loadSounds(std::string high, std::string low) +{ + // chargement des sons high et low + auto mySamplesHigh = juce::File{high}; + auto mySamplesLow = juce::File{ low }; + + jassert(mySamplesHigh.exists()); + jassert(mySamplesLow.exists()); + synth.clearSounds(); + + juce::BigInteger usedNotes; + usedNotes.setRange(0, 1, true); + auto formatReaderHigh = formatManager.createReaderFor(mySamplesHigh); + synth.addSound(new juce::SamplerSound("High", *formatReaderHigh, usedNotes, 0, 0.0f, 0.0f, 999.0)); + delete formatReaderHigh; + + juce::BigInteger usedNotes2; + usedNotes2.setRange(1, 1, true); + auto formatReaderLow = formatManager.createReaderFor(mySamplesLow); + synth.addSound(new juce::SamplerSound("Low", *formatReaderLow, usedNotes2, 1, 0.0f, 0.0f, 999.0)); + delete formatReaderLow; +} + +void Metronome::prepareToPlay (double sr) +{ + // Appelé avant de démaré la lecture, on récupère la sr et on initialise le reste du moteur + sampleRate = sr; + updateInterval = (int)(60.0 / bpm.get() * sampleRate); + synth.setCurrentPlaybackSampleRate(sampleRate); + initMeasure(); +} + +void Metronome::getNextAudioBlock(juce::AudioSourceChannelInfo const& bufferToFill) +{ + // Méthode invoqué par le moteur audio. Le but est de remplir bufferToFill avec la waveform que l'on souhaite jouer + int const numSamples = bufferToFill.numSamples; + + juce::MidiBuffer midi; + int measCount = measures.get(); + + int measLength = updateInterval * measCount; // nombre de sample total dans une mesure + int start = lastPos; // Le premier index du buffer correspond au lastPos + int stop = lastPos + numSamples; // et la dernière position du buffer + for (auto cur : measStruct) + { + // On cherche Si dans notre mesure on a un click entre start et stop + int nextTick = (int)(cur.measPos * updateInterval); // le measPos est en relatif, on convertit en équivalent samples + if (stop > measLength) + { + // Dans le cas ou stop se situe sur la mesure suivante, on décale le nextTick d'une mesure + nextTick += measLength; + } + + if (nextTick >= start && nextTick < stop) + { + // On à trouvé un tick + if (cur.type != NoteType::mute) + { + // qui est pas mute + // on sélectionne la bone note, la bonne vélocité et on génère un événement midi à nextTick - start + int note = cur.type == NoteType::high ? 0 : 1; + float vel = cur.type == NoteType::lowLow ? 0.2f : 1.0f; + midi.addEvent(juce::MidiMessage::noteOn(1, note, vel), nextTick - start); + } + + // on signale l'interface (pour marquer le temps même s'il est mute) + signal.set(true); + } + } + + // On incrémente lastPos + lastPos = stop; + if (lastPos > measLength) + { + // Et on le remet dans la mesure suivante + lastPos -= measLength; + } + + // On demande au synthé de remplir le buffer + synth.renderNextBlock(*bufferToFill.buffer, + midi, + 0, + bufferToFill.numSamples); + + // On reprend la main sur le buffer pour appliquer le gain manuellement + float mult = gain.get(); + for (auto channel = 0; channel < bufferToFill.buffer->getNumChannels(); ++channel) + { + auto* buffer = bufferToFill.buffer->getWritePointer(channel, bufferToFill.startSample); + + for (auto sample = 0; sample < bufferToFill.numSamples; ++sample) + buffer[sample] = buffer[sample] * mult; + } +} + +void Metronome::reset() +{ + // raz + lastPos = 0; + signal.set(true); +} + +void Metronome::setBPM(int value) +{ + // contraint les BPM entre 10 et 400 + int coerce = juce::jlimit(10, 400, value); + bpm.set(coerce); + + int lastInterval = updateInterval; + updateInterval = (int)(60.0 / bpm.get() * sampleRate); + // En cas de changement de BPM brutal on constate un décalage dans la lecture + // Pour remédier à ca on recalibre le lastPos en proportion du nouvel intervale + lastPos = (int)(lastPos * (float)updateInterval / (float)lastInterval); +} + +int Metronome::getCurrentMeasure() const +{ + // permet à l'UI de savoir sur quel temps de la mesure on se trouve + int numTemps = (lastPos + updateInterval - 1) / updateInterval; // nombre de temps depuis le start + return numTemps; +} + +void Metronome::initMeasure() +{ + // construit la structure de la mesure + measStruct.clear(); + int measCount = measures.get(); + switch (figure.get()) + { + case FigureType::blanche: + // On alterne click/Mute + for (size_t i = 0; i < measCount; ++i) + { + if (i % 2 == 0) + { + measStruct.push_back(MeasureTick((float)i, i == 0 ? NoteType::high : NoteType::low)); + } + else + { + measStruct.push_back(MeasureTick((float)i, NoteType::mute)); + } + } + + break; + case FigureType::noire: + // Un click par temps + for (size_t i = 0; i < measCount; ++i) + { + measStruct.push_back(MeasureTick((float)i, i == 0 ? NoteType::high : NoteType::low)); + } + + break; + case FigureType::croche: + // On alterne click/lowlow + for (size_t i = 0; i < measCount; ++i) + { + measStruct.push_back(MeasureTick((float)i, i == 0 ? NoteType::high : NoteType::low)); + measStruct.push_back(MeasureTick((float)i + 0.5f, NoteType::lowLow)); + } + + break; + case FigureType::triolet: + // On alterne click/lowlow/lowlow + for (size_t i = 0; i < measCount; ++i) + { + measStruct.push_back(MeasureTick((float)i, i == 0 ? NoteType::high : NoteType::low)); + measStruct.push_back(MeasureTick((float)i + 1.f / 3.f, NoteType::lowLow)); + measStruct.push_back(MeasureTick((float)i + 2.f / 3.f, NoteType::lowLow)); + } + break; + case FigureType::doubleCroche: + // On alterne click/lowlow/lowlow/lowlow + for (size_t i = 0; i < measCount; ++i) + { + measStruct.push_back(MeasureTick((float)i, i == 0 ? NoteType::high : NoteType::low)); + measStruct.push_back(MeasureTick((float)i + 0.25f, NoteType::lowLow)); + measStruct.push_back(MeasureTick((float)i + 0.5f, NoteType::lowLow)); + measStruct.push_back(MeasureTick((float)i + 0.75f, NoteType::lowLow)); + } + break; + case FigureType::swing: + // On alterne click/lowlow sur les 2/3 du temps + for (size_t i = 0; i < measCount; ++i) + { + measStruct.push_back(MeasureTick((float)i, i == 0 ? NoteType::high : NoteType::low)); + measStruct.push_back(MeasureTick((float)i + 2.f / 3.f, NoteType::lowLow)); + } + break; + + default: + break; + } +} diff --git a/Source/Metronome.h b/Source/Metronome.h new file mode 100644 index 0000000..d159f55 --- /dev/null +++ b/Source/Metronome.h @@ -0,0 +1,134 @@ +#pragma once +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Moteur de l'application. Gère la lecture des samples Callé sur le bon tempo. + + ============================================================================== +*/ + +#include +#include "Config.h" + +class Config; + +// Défini les 3 niveaux de clic utilisés par le métronome +// high marque le premier temps de la mesure. correspond au sample High*.wav +// low marque les autres temps de la mesure. correspond au sample Low*.wav +// lowlow est utilisé pour les clics intermédiares (croches,...). correspond au sample Low*.wav avec une vélocité réduite +// mute permet de marquer un silence sur le temps lorsqu'on bat la mesure à la blanche +enum class NoteType { high = 0, low = 1, lowLow = 2, mute = 3 }; + +// Les figures rythmiques disponibles : blanche, noire, croche, triolet, double croche +// la figure swing (ou shuffle) est construite sur un triolet avec un click sur le temps et un sur le 2/3 de temps. +// suivant l'interprétation, le swing devrait su situer entre le triolet et la double croche mais c'est moi qui décide. +enum class FigureType { blanche = 0, noire = 1, croche = 2, triolet = 3, doubleCroche = 4, swing = 5 }; + +// structure de base pour définir la structure rythmique de la mesure +struct MeasureTick +{ + // position du click dans la mesure en valeur absolu + // pour une mesure de 5 temps measPos est dans l'intervale [0, 5[ + float measPos; + + // type de click + NoteType type; +}; + +// Bat la mesure +class Metronome +{ +public: + Metronome(Config& configuration); + ~Metronome(); + + juce::Atomic signal; + + // méthodes de gestion du lecteur + void prepareToPlay (double sampleRate); + void getNextAudioBlock (const juce::AudioSourceChannelInfo& bufferToFill); + + // reinitialise le lecteur sur le stop + void reset(); + + // recharge les son high et low + void loadSounds(std::string high, std::string low); + + // accesseurs + int getBPM() const noexcept + { + return bpm.get(); + } + void setBPM(int value); + + int getMeasures() const noexcept + { + return measures.get(); + } + void setMeasures(int value) { + int coerce = juce::jlimit(1, 9, value); // On limite le nombre de mesure à 9 + measures.set(coerce); + initMeasure(); // reconstruit la structure de la mesure + signal.set(true); // signale à la GUI de se metre à jours + } + + int getCurrentMeasure() const; + + void setGain(float value) { + gain.set(value); + } + + float getGain() { + return gain.get(); + } + + void setFigure(int value) { + figure.set((FigureType)value); + initMeasure(); // reconstruit la structure de la mesure + } + + FigureType getFigure() { + return figure.get(); + } + + +private: + // variables réglables depuis l'UI (d'ou le Atomic) + juce::Atomic measures{ 4 }; // nombre de temps par mesure + juce::Atomic bpm{ 72 }; // tempo + juce::Atomic gain{ 1.0f }; // volume sonore + juce::Atomic figure{ FigureType::noire }; // type de figure utilisé pour construire la mesure + + // variables internes + double sampleRate { 0 }; // nombre de sample par secondes + int updateInterval{ 0 }; // nombre de sample entre 2 temps : 60/bpm*sr + int lastPos{ 0 }; // indice du dernier sample traité lors de l'appel getNextAudioBlock. Valeur réinitialisé à chaque mesure modulo la taille de la mesure + std::vector measStruct; // structure de la mesure, contient tout les clicks en fonction du nombre de mesure et de la figure courante + + juce::AudioFormatManager formatManager; // chargement des fichier wav + juce::Synthesiser synth; // la gestion direct du remplissage du buffer via getNextAudioBlock est trop compliqué + // On passe par un Synthé avec un fichier par note, on déclenche la lecture par un evenement midi déclenché précisément + + + void initMeasure(); // reconstruit la structure de la mesure +}; diff --git a/Source/OptionsPanel.cpp b/Source/OptionsPanel.cpp new file mode 100644 index 0000000..70151dd --- /dev/null +++ b/Source/OptionsPanel.cpp @@ -0,0 +1,319 @@ +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Gestion des options figure rythmique et fichier son du tick. + + ============================================================================== +*/ + +#include "OptionsPanel.h" +#include "Figures.h" + +void ClickSounds::init() +{ + // on récupère tout les sous dossiers dans App/Clicks + juce::File curDir{ juce::File::getSpecialLocation(juce::File::SpecialLocationType::currentExecutableFile).getParentDirectory() }; + juce::File clickDir{ curDir.getChildFile("Clicks")}; + auto it = clickDir.findChildFiles(juce::File::findDirectories, false); + for (int i = 0; i < it.size(); ++i) + { + juce::File sub = it[i]; + bool highFile = !sub.findChildFiles(juce::File::TypesOfFileToFind::findFiles, false, "High*.wav").isEmpty(); + bool lowFile = !sub.findChildFiles(juce::File::TypesOfFileToFind::findFiles, false, "Low*.wav").isEmpty(); + if (highFile && lowFile) + { + // On n'ajoute que si on a bien les fichiers High et Low + juce::String path = sub.getFullPathName(); + std::string ss = path.toStdString(); + sounds.push_back(ss); + } + } +} + +std::string ClickSounds::getSoundName(int i) const +{ + // Valeur affiché dans la combo, on récupère le nom du sous dossier + juce::File path{ sounds[i] }; + return path.getFileNameWithoutExtension().toStdString(); +} + +std::string ClickSounds::getSoundPathHigh(int i) const +{ + // Chemin vers le fichier High + juce::File path{ sounds[i] }; + return path.findChildFiles(juce::File::TypesOfFileToFind::findFiles, false, "High*.wav")[0].getFullPathName().toStdString(); +} +std::string ClickSounds::getSoundPathLow(int i) const +{ + // Chemin vers le fichier Low + juce::File path{ sounds[i] }; + return path.findChildFiles(juce::File::TypesOfFileToFind::findFiles, false, "Low*.wav")[0].getFullPathName().toStdString(); +} + +int ClickSounds::getIndex(std::string soundName) const +{ + // récupère l'index du fichier à partir de son nom + // Utilisé pour restaurer la configuration + // Du coup si le son n'est pas trouvé on retourne le premier son + for (int i = 0; i < sounds.size(); ++i) + { + if (getSoundName(i) == soundName) + { + return i; + } + } + + return 0; +} + +void ComboLookAndFeel::drawPopupMenuBackground(juce::Graphics& g, int width, int height) +{ + // Permet de setter le background du PopupMenu + g.fillAll(juce::Colours::whitesmoke); + juce::ignoreUnused(width, height); + +#if ! JUCE_MAC + g.setColour(juce::Colours::darkgrey.withAlpha(0.6f)); + g.drawRect(0, 0, width, height); +#endif +} + +void ComboLookAndFeel::drawPopupMenuItem(juce::Graphics& g, const juce::Rectangle& area, + const bool isSeparator, const bool isActive, + const bool isHighlighted, const bool isTicked, + const bool hasSubMenu, const juce::String& text, + const juce::String& shortcutKeyText, + const juce::Drawable* icon, const juce::Colour* const textColourToUse) +{ + // Permet de setter le background du PopupMenuItem + if (isSeparator) + { + auto r = area.reduced(5, 0); + r.removeFromTop(juce::roundToInt(((float)r.getHeight() * 0.5f) - 0.5f)); + + g.setColour(juce::Colours::darkgrey.withAlpha(0.3f)); + g.fillRect(r.removeFromTop(1)); + } + else + { + auto textColour = (textColourToUse == nullptr ? juce::Colours::darkgrey + : *textColourToUse); + + auto r = area.reduced(1); + + if (isHighlighted && isActive) + { + g.setColour(juce::Colours::lightgrey); + g.fillRect(r); + + g.setColour(juce::Colours::darkgrey); + } + else + { + g.setColour(textColour.withMultipliedAlpha(isActive ? 1.0f : 0.5f)); + } + + r.reduce(juce::jmin(5, area.getWidth() / 20), 0); + + auto font = getPopupMenuFont(); + + auto maxFontHeight = (float)r.getHeight() / 1.3f; + + if (font.getHeight() > maxFontHeight) + font.setHeight(maxFontHeight); + + g.setFont(font); + + auto iconArea = r.removeFromLeft(juce::roundToInt(maxFontHeight)).toFloat(); + + if (icon != nullptr) + { + icon->drawWithin(g, iconArea, juce::RectanglePlacement::centred | juce::RectanglePlacement::onlyReduceInSize, 1.0f); + r.removeFromLeft(juce::roundToInt(maxFontHeight * 0.5f)); + } + else if (isTicked) + { + auto tick = getTickShape(1.0f); + g.fillPath(tick, tick.getTransformToScaleToFit(iconArea.reduced(iconArea.getWidth() / 5, 0).toFloat(), true)); + } + + if (hasSubMenu) + { + auto arrowH = 0.6f * getPopupMenuFont().getAscent(); + + auto x = static_cast (r.removeFromRight((int)arrowH).getX()); + auto halfH = static_cast (r.getCentreY()); + + juce::Path path; + path.startNewSubPath(x, halfH - arrowH * 0.5f); + path.lineTo(x + arrowH * 0.6f, halfH); + path.lineTo(x, halfH + arrowH * 0.5f); + + g.strokePath(path, juce::PathStrokeType(2.0f)); + } + + r.removeFromRight(3); + g.drawFittedText(text, r, juce::Justification::centredLeft, 1); + + if (shortcutKeyText.isNotEmpty()) + { + auto f2 = font; + f2.setHeight(f2.getHeight() * 0.75f); + f2.setHorizontalScale(0.95f); + g.setFont(f2); + + g.drawText(shortcutKeyText, r, juce::Justification::centredRight, true); + } + } +} + + +OptionsPanel::OptionsPanel(juce::Colour c, Config& configuration) : backgroundColour(c) +{ + // initialisation de l'interface + clef.reset(new ComboLookAndFeel()); + addAndMakeVisible(figures); + auto doc = juce::XmlDocument::parse(SVGFigures::noire); // on charge la noire par defaut, va être re-initialisé par la configuration + auto note = juce::Drawable::createFromSVG(*doc); + figures.setImages(note.get()); + figures.setToggleState(false, juce::NotificationType::dontSendNotification); + figures.setColour(juce::TextButton::buttonColourId, juce::Colours::whitesmoke); + figures.setColour(juce::TextButton::textColourOffId, juce::Colours::black); + figures.onClick = [&] + { + // génère le dropdown menu des figures + juce::PopupMenu menu; + + int width = 70; + int height = 48; + menu.addCustomItem(1, std::make_unique(SVGFigures::blanche, width, height, juce::Colours::whitesmoke)); + menu.addCustomItem(4, std::make_unique(SVGFigures::triolet, width, height, juce::Colours::whitesmoke)); + menu.addCustomItem(2, std::make_unique(SVGFigures::noire, width, height, juce::Colours::whitesmoke)); + menu.addCustomItem(5, std::make_unique(SVGFigures::doubles, width, height, juce::Colours::whitesmoke)); + menu.addCustomItem(3, std::make_unique(SVGFigures::croches, width, height, juce::Colours::whitesmoke)); + menu.addCustomItem(6, std::make_unique(SVGFigures::swing, width, height, juce::Colours::whitesmoke)); + + menu.showMenuAsync(juce::PopupMenu::Options{}.withTargetComponent(figures) + .withMinimumNumColumns(3), [&](int resultId) { if(resultId > 0) setFigure(resultId - 1); }); + }; + + addAndMakeVisible(sounds); + sounds.setLookAndFeel(clef.get()); + sounds.setColour(juce::ComboBox::backgroundColourId, juce::Colours::whitesmoke); + sounds.setColour(juce::ComboBox::outlineColourId, juce::Colours::darkgrey); + sounds.setColour(juce::ComboBox::arrowColourId, juce::Colours::darkgrey); + sounds.setColour(juce::ComboBox::textColourId, juce::Colours::darkgrey); + clicksounds.init(); // charge la liste des sons + curSoundID = clicksounds.getIndex(configuration.sound.toStdString()); // récupère le son courant dans la configuration +} + +juce::String OptionsPanel::getSoundName() +{ + // Récupère le nom du son courant pour sauver la config + return clicksounds.getSoundName(sounds.getSelectedId() - 1); +} + +void OptionsPanel::setFigure(int figure) +{ + // MàJ de l'icone de la figure courante + juce::String newSVG; + switch (figure) + { + case 0: + newSVG = SVGFigures::blanche; + break; + case 2: + newSVG = SVGFigures::croches; + break; + case 3: + newSVG = SVGFigures::triolet; + break; + case 4: + newSVG = SVGFigures::doubles; + break; + case 5: + newSVG = SVGFigures::swing; + break; + case 1: + default: + newSVG = SVGFigures::noire; + break; + } + + auto doc = juce::XmlDocument::parse(newSVG); + auto note = juce::Drawable::createFromSVG(*doc); + figures.setImages(note.get()); + setMetroFigure(figure); +} + +OptionsPanel::~OptionsPanel() +{ + // evite une fuite mémoire à la fermeture due au L&F + sounds.setLookAndFeel(nullptr); + figures.setLookAndFeel(nullptr); +} + +void OptionsPanel::paint(juce::Graphics& g) +{ + g.fillAll(backgroundColour); +} + +void OptionsPanel::resized() +{ + // On utilise un layout grille en 2 colonnes + int margin = 3; + juce::Grid grid; + using Track = juce::Grid::TrackInfo; + using Fr = juce::Grid::Fr; + grid.templateRows = { Track(Fr(1)) }; + grid.templateColumns = { Track(Fr(1)), Track(Fr(1)) }; + grid.items = { + juce::GridItem(figures).withMargin(juce::GridItem::Margin(margin)), + juce::GridItem(sounds).withMargin(juce::GridItem::Margin(margin)), + }; + + grid.performLayout(getLocalBounds()); +} + +void OptionsPanel::init(Metronome& metro) +{ + // On établi les liaisons entre le Metronome et les composants graphique + for (int i = 0; i < clicksounds.getSoundCount(); ++i) + { + sounds.addItem(clicksounds.getSoundName(i), i + 1); // La combo n'autorise pas 0 comme Id, d'ou le + 1 + } + + sounds.setSelectedId(curSoundID + 1); // toujours ce + 1 + selectSound(metro); // charge le son courant dans le metronome + sounds.onChange = [&, this]() { selectSound(metro); }; + setMetroFigure = [&](int figure) { metro.setFigure(figure); }; + setFigure((int)metro.getFigure()); +} + +void OptionsPanel::selectSound(Metronome& metro) +{ + // charge le son courant dans le metronome + std::string high = clicksounds.getSoundPathHigh(sounds.getSelectedId() - 1); + std::string low = clicksounds.getSoundPathLow(sounds.getSelectedId() - 1); + metro.loadSounds(high, low); +} \ No newline at end of file diff --git a/Source/OptionsPanel.h b/Source/OptionsPanel.h new file mode 100644 index 0000000..4740756 --- /dev/null +++ b/Source/OptionsPanel.h @@ -0,0 +1,145 @@ +#pragma once +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Gestion des options figure rythmique et fichier son du tick. + + ============================================================================== +*/ + +#include +#include "Metronome.h" +#include "Config.h" + +class Config; +class Metronome; + +// Surcharge les boutons pour afficher l'image de la figure rythmique +struct FigureButton : public juce::PopupMenu::CustomComponent +{ + FigureButton(juce::String image, int widthIn, int heightIn, juce::Colour backgroundIn) + : juce::PopupMenu::CustomComponent(false), + idealWidth(widthIn), + idealHeight(heightIn), + background(backgroundIn) + { + // initialisation de l'interface + addAndMakeVisible(button); + // récupère l'image de la figure + auto doc = juce::XmlDocument::parse(image); + auto note = juce::Drawable::createFromSVG(*doc); + button.setImages(note.get()); + button.setToggleState(false, juce::NotificationType::dontSendNotification); + button.setColour(juce::TextButton::buttonColourId, juce::Colours::whitesmoke); + button.setColour(juce::TextButton::textColourOffId, juce::Colours::black); + button.onClick = [&, this] + { + // notifie la "Combo" + this->triggerMenuItem(); + }; + } + + void getIdealSize(int& width, int& height) override + { + width = idealWidth; + height = idealHeight; + } + + void paint(juce::Graphics& g) override { g.fillAll(background); } + + void resized() override { button.setBounds(getBounds()); } + + // composants graphiques + juce::Colour background; + juce::DrawableButton button{ "Figures", juce::DrawableButton::ImageOnButtonBackground }; + + // taille du bouton + int idealWidth = 0; + int idealHeight = 0; +}; + +// L&F pour la combo des sons, permet de setter le background du Popup +struct ComboLookAndFeel : public juce::LookAndFeel_V4 +{ + void drawPopupMenuBackground(juce::Graphics& g, int width, int height) override; + void drawPopupMenuItem(juce::Graphics& g, const juce::Rectangle& area, + const bool isSeparator, const bool isActive, + const bool isHighlighted, const bool isTicked, + const bool hasSubMenu, const juce::String& text, + const juce::String& shortcutKeyText, + const juce::Drawable* icon, const juce::Colour* const textColourToUse) override; +}; + +// structure dédiée à la gestion des sons +struct ClickSounds +{ + ClickSounds() {}; + + // Charge la liste de sons + void init(); + + // Accesseurs + int getSoundCount() const { return (int)sounds.size(); }; + std::string getSoundName(int i) const; + std::string getSoundPathHigh(int i) const; + std::string getSoundPathLow(int i) const; + + int getIndex(std::string soundName) const; + + // Liste des sons + std::vector sounds; +}; + +// Panneau d'affichage des options +struct OptionsPanel : public juce::Component +{ + explicit OptionsPanel(juce::Colour c, Config& configuration); + ~OptionsPanel(); + + // Méthode de surcharge JUCE + void paint(juce::Graphics& g) override; + void resized() override; + + // méthodes internes + void init(Metronome& metro); + + void selectSound(Metronome& metro); + void setFigure(int figure); + juce::String getSoundName(); + + // composants graphiques + juce::DrawableButton figures{ "Figures", juce::DrawableButton::ImageOnButtonBackground }; + juce::ComboBox sounds; + juce::Colour backgroundColour; + std::unique_ptr clef; + + // variables internes + // liste des sons + ClickSounds clicksounds; + + // pointeur sur la méthode qui permet de setter le metronome + std::function< void(int)> setMetroFigure {nullptr}; + + // permet de stocker l'id du son selectionné dans la configuration entre le constructeur et le init() + int curSoundID; +}; \ No newline at end of file diff --git a/Source/PlayPanel.cpp b/Source/PlayPanel.cpp new file mode 100644 index 0000000..42408ab --- /dev/null +++ b/Source/PlayPanel.cpp @@ -0,0 +1,161 @@ +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Gestion du bouton play et du volume. + + ============================================================================== +*/ + +#include "PlayPanel.h" +#include "Metronome.h" +#include "Figures.h" + +void RoundButtonLookAndFeel::drawButtonBackground(juce::Graphics& g, juce::Button& button, const juce::Colour& backgroundColour, + bool isMouseOverButton, bool isButtonDown) +{ + // version addapté du LookAndFeel_V4 + auto baseColour = backgroundColour.withMultipliedSaturation(button.hasKeyboardFocus(true) ? 1.3f : 0.9f) + .withMultipliedAlpha(button.isEnabled() ? 0.9f : 0.5f); + + if (isButtonDown || isMouseOverButton) + baseColour = baseColour.contrasting(isButtonDown ? 0.2f : 0.1f); + + auto width = (float)button.getWidth() - 1.0f; + auto height = (float)button.getHeight() - 1.0f; + + if (width > 0 && height > 0) + { + // on viens dessiner un cercle + auto rect = button.getLocalBounds(); + float rwidth = rect.getWidth() < rect.getHeight() ? (float)rect.getWidth() - 25.0f : (float)rect.getHeight() - 25.0f; + + g.setGradientFill(juce::ColourGradient::vertical(juce::Colours::lightgrey, 0.0f, + juce::Colours::lightgrey.darker(0.1f), height)); + g.fillEllipse(rect.getCentreX() - rwidth / 2, rect.getCentreY() - rwidth / 2, rwidth, rwidth); + + g.setGradientFill(juce::ColourGradient::vertical(baseColour, 0.0f, + baseColour.darker(0.1f), height)); + + g.drawEllipse(rect.getCentreX() - rwidth / 2, rect.getCentreY() - rwidth / 2, rwidth, rwidth, 4); + } +} + +PlayPanel::PlayPanel(juce::Colour c) : backgroundColour(c) +{ + // initialisation de l'interface + lef.reset(new RoundButtonLookAndFeel()); + + // Le dessin du bouton play est dans un svg + auto doc = juce::XmlDocument::parse(SVGFigures::play); + auto image = juce::Drawable::createFromSVG(*doc); + addComponent(volume); + addComponent(playButton); + playButton.setRadioGroupId(1); + playButton.setImages(image.get()); + playButton.setToggleState(false, juce::NotificationType::dontSendNotification); + playButton.setColour(juce::TextButton::buttonColourId, juce::Colours::lightgreen); + playButton.setColour(juce::TextButton::textColourOffId, juce::Colours::black); + playButton.setLookAndFeel(lef.get()); + volume.setRange(-100, 6); // on prend -100db en min, et on s'autorise à amplifier le sample à +6db + volume.setValue(0); // valeur initiale à 0db + volume.setSliderStyle(juce::Slider::SliderStyle::LinearVertical); + volume.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, true, 0, 0); + volume.setColour(juce::Slider::thumbColourId, backgroundColour); + volume.setColour(juce::Slider::trackColourId, juce::Colours::green); +} + +PlayPanel::~PlayPanel() +{ + // evite une fuite mémoire à la fermeture due au L&F + playButton.setLookAndFeel(nullptr); +} + +void PlayPanel::addComponent(juce::Component& c) +{ + addAndMakeVisible(c); + c.setColour(juce::TextButton::buttonColourId, backgroundColour); + c.setColour(juce::TextButton::textColourOffId, juce::Colours::black); +} + +void PlayPanel::paint(juce::Graphics& g) +{ + g.fillAll(backgroundColour); +} + +void PlayPanel::resized() +{ + // On gêre le placement via une grille 3 collones + // la première colonne est vide et sert de "marge" + juce::Grid vpgrid; + using Track = juce::Grid::TrackInfo; + using Fr = juce::Grid::Fr; + vpgrid.templateRows = { Track(Fr(1)) }; + vpgrid.templateColumns = { Track(Fr(1)), Track(Fr(5)), Track(Fr(1)) }; + + vpgrid.items = { juce::GridItem(), juce::GridItem(playButton), juce::GridItem(volume) }; + vpgrid.performLayout(getLocalBounds()); +} + +void PlayPanel::init(Metronome& metro) +{ + // On établi les liaisons entre le Metronome et les composants graphique + playButton.onClick = [&, this]() { play(metro); }; + volume.setValue(juce::Decibels::gainToDecibels(metro.getGain())); // On récupère la valeur initiale du gain + volume.onValueChange = [&, this] + { + double db = volume.getValue(); + metro.setGain((float)juce::Decibels::decibelsToGain(db)); + }; +} + +void PlayPanel::play(Metronome& metro) +{ + // lance la lecture ou met en pause + playState = playState == PlayState::playing ? PlayState::stopped : PlayState::playing; + if (playState == PlayState::stopped) + { + // en cas de stop, on remet les compteurs à zero sur le metronome + metro.reset(); + } + + // On modifie la couleur du bouton en fonction de l'état + playButton.setColour(juce::TextButton::buttonColourId, playState == PlayState::playing ? juce::Colours::green : juce::Colours::lightgreen); +} + +void PlayPanel::highlight() +{ + // Met le bouton en surbrillance sur le temps + // la variable highlightFrames decompte 6 frames sur un timer de 20ms soit 120ms + if (playState == PlayState::playing) + { + if (highlightFrames > 0) + { + playButton.setColour(juce::TextButton::buttonColourId, juce::Colours::orangered); + highlightFrames--; + } + else + { + playButton.setColour(juce::TextButton::buttonColourId, juce::Colours::green); + } + } +} \ No newline at end of file diff --git a/Source/PlayPanel.h b/Source/PlayPanel.h new file mode 100644 index 0000000..8b8a1df --- /dev/null +++ b/Source/PlayPanel.h @@ -0,0 +1,73 @@ +#pragma once +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Gestion du bouton play et du volume. + + ============================================================================== +*/ +#include +#include "Metronome.h" + +// Etat de lecture +enum class PlayState +{ + playing, + stopped +}; + +// surcharge du look&feel pour dessiner le bouton play en cercle +struct RoundButtonLookAndFeel : public juce::LookAndFeel_V4 +{ + void drawButtonBackground(juce::Graphics& g, juce::Button& button, const juce::Colour& backgroundColour, + bool isMouseOverButton, bool isButtonDown) override; +}; + +// classe principale +struct PlayPanel : public juce::Component +{ + explicit PlayPanel(juce::Colour c); + ~PlayPanel(); + + // Méthode de surcharge JUCE + void paint(juce::Graphics& g) override; + void resized() override; + + // utilitaire graphique + void addComponent(juce::Component& c); + + // méthodes de gestion du lecteur + void init(Metronome& metro); + void play(Metronome& metro); + void highlight(); + + // composants graphiques + juce::Colour backgroundColour; + juce::Slider volume; + juce::DrawableButton playButton { "Play", juce::DrawableButton::ImageOnButtonBackground }; + std::unique_ptr lef; + + // variables internes + int highlightFrames; + PlayState playState{ PlayState::stopped }; +}; \ No newline at end of file diff --git a/Source/TempoPanel.cpp b/Source/TempoPanel.cpp new file mode 100644 index 0000000..6b2f9c4 --- /dev/null +++ b/Source/TempoPanel.cpp @@ -0,0 +1,91 @@ +/* + ============================================================================== + Copyright 2022 Nicolas Chambert + +This program is free software : you can redistribute itand /or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.If not, see < http://www.gnu.org/licenses/>. + + ============================================================================== +*/ + +/* + ============================================================================== + + Gestion du nombre de temps par mesure. + + ============================================================================== +*/ +#include "TempoPanel.h" +#include "Metronome.h" + +TempoPanel::TempoPanel(juce::Colour c) : backgroundColour(c) +{ + // initialisation de l'interface + addComponent(decrement); + addComponent(tempo); + addComponent(increment); + tempo.setText("4", juce::dontSendNotification); // On met une valeur mais elle va être RaZ dans le init() + tempo.getFont().setBold(true); + tempo.setColour(juce::Label::textColourId, juce::Colours::black); + tempo.setJustificationType(juce::Justification::centred); + tempo.setFont(30); +} + +void TempoPanel::addComponent(juce::Component& c) +{ + addAndMakeVisible(c); + c.setColour(juce::TextButton::buttonColourId, backgroundColour); + c.setColour(juce::TextButton::textColourOffId, juce::Colours::black); +} + +void TempoPanel::paint(juce::Graphics& g) +{ + g.fillAll(backgroundColour); +} + +void TempoPanel::resized() +{ + // On gêre le layout à la main + auto area = getLocalBounds(); + int butHeigth = 20; + int butWidth = 48; + int labeSize = 3 * butHeigth; + int totalWidth = 2 * butWidth + labeSize; + int marginH = (area.getWidth() - totalWidth) / 2; + int marginV = (area.getHeight() - labeSize) / 2; + decrement.setBounds(area.getX() + marginH, area.getY() + marginV + butHeigth, butWidth, butHeigth); + tempo.setBounds(area.getX() + marginH + butWidth, area.getY() + marginV, labeSize, labeSize); + increment.setBounds(area.getX() + marginH + butWidth + labeSize, area.getY() + marginV + butHeigth, butWidth, butHeigth); +} + +void TempoPanel::init(Metronome& metro) +{ + // On établi les liaisons entre le Metronome et les composants graphique + tempo.setText(juce::String(metro.getMeasures()), juce::dontSendNotification); + increment.onClick = [&, this]() { inc(metro); }; + decrement.onClick = [&, this]() { dec(metro); }; +} + +void TempoPanel::inc(Metronome& metro) +{ + // incrémente le tempo + metro.setMeasures(metro.getMeasures() + 1); + tempo.setText(juce::String(metro.getMeasures()), juce::dontSendNotification); // MàJ du label +} + +void TempoPanel::dec(Metronome& metro) +{ + // decremente le tempo + metro.setMeasures(metro.getMeasures() - 1); + tempo.setText(juce::String(metro.getMeasures()), juce::dontSendNotification); // MàJ du label +} \ No newline at end of file diff --git a/Source/TempoPanel.h b/Source/TempoPanel.h new file mode 100644 index 0000000..21411d1 --- /dev/null +++ b/Source/TempoPanel.h @@ -0,0 +1,34 @@ +#pragma once +/* + ============================================================================== + + Gestion du nombre de temps par mesure. + + ============================================================================== +*/ + +#include +#include "Metronome.h" + +struct TempoPanel : public juce::Component +{ + explicit TempoPanel(juce::Colour c); + + // Méthode de surcharge JUCE + void paint(juce::Graphics& g) override; + void resized() override; + + // utilitaire graphique + void addComponent(juce::Component& c); + + // méthodes de gestion du tempo + void init(Metronome& metro); + void inc(Metronome& metro); + void dec(Metronome& metro); + + // composants graphiques + juce::Colour backgroundColour; + juce::TextButton increment{ "+" }; + juce::TextButton decrement{ "-" }; + juce::Label tempo; +}; \ No newline at end of file diff --git a/Tchick.jucer b/Tchick.jucer new file mode 100644 index 0000000..a9ad47e --- /dev/null +++ b/Tchick.jucer @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tchick.sln b/Tchick.sln new file mode 100644 index 0000000..cc08196 --- /dev/null +++ b/Tchick.sln @@ -0,0 +1,21 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio Version 17 + +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Tchick - App", "Tchick_App.vcxproj", "{F9D7600C-859C-26DC-FE32-2EB5A98F1734}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F9D7600C-859C-26DC-FE32-2EB5A98F1734}.Debug|x64.ActiveCfg = Debug|x64 + {F9D7600C-859C-26DC-FE32-2EB5A98F1734}.Debug|x64.Build.0 = Debug|x64 + {F9D7600C-859C-26DC-FE32-2EB5A98F1734}.Release|x64.ActiveCfg = Release|x64 + {F9D7600C-859C-26DC-FE32-2EB5A98F1734}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Tchick_App.vcxproj b/Tchick_App.vcxproj new file mode 100644 index 0000000..f96790f --- /dev/null +++ b/Tchick_App.vcxproj @@ -0,0 +1,3235 @@ + + + + + + Debug + x64 + + + Release + x64 + + + + {F9D7600C-859C-26DC-FE32-2EB5A98F1734} + + + + Application + false + false + v143 + 10.0 + + + Application + false + true + v143 + 10.0 + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + .exe + $(SolutionDir)$(Platform)\$(Configuration)\App\ + $(Platform)\$(Configuration)\App\ + Tchick + true + $(SolutionDir)$(Platform)\$(Configuration)\App\ + $(Platform)\$(Configuration)\App\ + Tchick + true + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + + + + Disabled + ProgramDatabase + JuceLibraryCode;JuceLibraryCode\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=1;JUCE_USE_DARK_SPLASH_SCREEN=0;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_JACK=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_B28D=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + true + NotUsing + $(IntDir)\ + $(IntDir)\ + $(IntDir)\Tchick.pdb + Level4 + true + true + stdcpplatest + + + JuceLibraryCode;JuceLibraryCode\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=1;JUCE_USE_DARK_SPLASH_SCREEN=0;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_JACK=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_B28D=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + + + $(OutDir)\Tchick.exe + true + libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) + true + $(IntDir)\Tchick.pdb + Windows + true + + + true + $(IntDir)\Tchick.bsc + + + + xcopy /s /y "$(SolutionDir)Assets\Clicks" "$(OutDir)\Clicks\" + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + + + + Full + JuceLibraryCode;JuceLibraryCode\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=1;JUCE_USE_DARK_SPLASH_SCREEN=0;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_JACK=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_B28D=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + MultiThreadedDLL + true + NotUsing + $(IntDir)\ + $(IntDir)\ + $(IntDir)\Tchick.pdb + Level4 + true + true + stdcpplatest + + + JuceLibraryCode;JuceLibraryCode\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=1;JUCE_USE_DARK_SPLASH_SCREEN=0;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_JACK=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_B28D=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + + + $(OutDir)\Tchick.exe + true + %(IgnoreSpecificDefaultLibraries) + false + $(IntDir)\Tchick.pdb + Windows + true + true + true + UseLinkTimeCodeGeneration + + + true + $(IntDir)\Tchick.bsc + + + + xcopy /s /y "$(SolutionDir)Assets\Clicks" "$(OutDir)\Clicks\" + + + + + + + + + + + + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + + + + /bigobj %(AdditionalOptions) + + + + + + + + + + /bigobj %(AdditionalOptions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tchick_App.vcxproj.filters b/Tchick_App.vcxproj.filters new file mode 100644 index 0000000..f23b26d --- /dev/null +++ b/Tchick_App.vcxproj.filters @@ -0,0 +1,5696 @@ + + + + + + {36882D55-52F7-7E45-022D-951EE44C05AE} + + + {BED2C4DA-3FFF-C70D-776A-4157D052FABC} + + + {C8EC7F5C-4BD4-75B8-D0AD-92CF712D10E5} + + + {310C8C1F-9E8B-0728-D487-024F52B2AE61} + + + {E9AD0E83-CC87-DB72-D552-C8F18F4C64C6} + + + {7DE60269-2087-8D9C-0037-CF2BB5EDE150} + + + {E3B7DAA2-EBFD-3391-D6E1-73F983A2FABC} + + + {C7967784-984A-66A5-5A31-F0E83A7AEF5B} + + + {7042BC6E-6FC9-3653-E6B0-764CA49C6E5F} + + + {EB58F05A-A968-CEBE-40C4-107CDD8F240F} + + + {5FCF559E-451A-CB1E-B177-A5DC5A0005BB} + + + {05CE33FC-868F-AA1A-12B8-79C98E753648} + + + {D78296AF-218E-B17E-7F8B-9D148601188D} + + + {B96EBA26-E668-FFAF-FC53-1EC1337DAF5A} + + + {D8532E5E-469E-5042-EFC8-238241704735} + + + {777B5D1D-9AF0-B22B-8894-034603EE97F5} + + + {8292766D-2459-2E7E-7615-17216318BA93} + + + {9BD56105-DAB4-EBD5-00DD-BD540E98FE88} + + + {10472B2C-9888-D269-F351-0D0AC3BCD16C} + + + {BF23FC10-1D57-2A9B-706F-6DD8A7B593D4} + + + {386862D5-4DCC-A4B3-5642-60A201E303EF} + + + {092EFC17-7C95-7E04-0ACA-0D61A462EE81} + + + {285118C6-8FDA-7DCE-BEF4-FFB2120876C5} + + + {69ED6B61-9B8D-D47E-E4A6-2E9F9A94A75A} + + + {7CDB7CD1-BB96-F593-3C78-1E06182B5839} + + + {B0A708DE-B4CF-196B-14FB-DC8221509B8E} + + + {34F46ADE-EE31-227A-A69E-7732E70145F1} + + + {BB9B3C77-17FB-E994-8B75-88F1727E4655} + + + {C0971D77-2F14-190A-E2AE-89D6285F4D5A} + + + {AABEA333-6524-8891-51C7-6DAEB5700628} + + + {F2D29337-983E-BAD7-7B5C-E0AB3D53D404} + + + {C674B0FB-1FC0-2986-94B1-083845018994} + + + {0AFC1CE8-F6E6-9817-8C21-8432B2A375DA} + + + {0D1AF264-3AC1-78A2-B2A4-AE6171F9194A} + + + {9A5DB854-CFFB-5F88-C566-0E10F994DDB3} + + + {38A5DDC7-416E-548F-39DA-887875FE6B20} + + + {980FE2DB-05D3-5FDA-79DA-067A56F5D19D} + + + {F336DC25-747A-0663-93D6-E3EB9AA0CBF8} + + + {7D78546A-80FC-4DCA-00B9-F191F0AB2179} + + + {9EB3EC7F-2AB7-DDAA-3C05-DF382B728D3F} + + + {6B9FBFDC-1D10-6246-356D-00FF4535CECB} + + + {D6FCFC8E-7136-9109-78C0-91A3EB4C443F} + + + {EBF18AC1-F0ED-937A-2824-4307CE2ADAF7} + + + {5A0F7922-2EFB-6465-57E4-A445B804EFB5} + + + {4EC45416-0E7C-7567-6F75-D0C8CEE7DC4F} + + + {C2985031-0496-55B5-41A8-BAB99E53D89D} + + + {FB4AB426-7009-0036-BB75-E34256AA7C89} + + + {E684D858-09E8-0251-8E86-5657129641E1} + + + {1EF1BF17-F941-243A-04D1-EE617D140CBA} + + + {344DB016-679C-FBD0-3EC6-4570C47522DE} + + + {3D9758A0-9359-1710-87C1-05D475C08B17} + + + {E824435F-FC7B-10BE-5D1A-5DACC51A8836} + + + {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + + + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} + + + {80C72173-A1E1-C3C5-9288-B889CE2EAFEA} + + + {4138B955-AA0B-FA86-DBF9-404CAFFFA866} + + + {2B4166B8-F470-F07C-4F51-D2DAAAECBB18} + + + {9C295115-C0CD-3129-1C4D-FB53299B23FB} + + + {65526A8B-3447-9DF0-FD5D-00D111126027} + + + {A54A1F5C-F32F-F97B-9E8A-69922B770A54} + + + {B90A44F3-B62D-B5C0-81A2-683D2650AEE6} + + + {DAF30656-5915-0E45-C4E4-54439617D525} + + + {9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C} + + + {9C713CBA-A9E2-5F4E-F83C-2CAB8533913C} + + + {63571A07-9AA3-5BB0-1103-0B42A2E6BC9E} + + + {314F43F2-BC8F-B464-EAE7-86B9675454E9} + + + {874C5D0C-6D29-68EE-38BB-26200B56BC89} + + + {86BAA7A7-DC50-35B6-910B-932AEAF257F2} + + + {6B7BE34D-1BC1-C7B9-111F-C55CA8250943} + + + {9B6B6D54-D378-80C2-8CC9-D1D8FB44C2A8} + + + {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + + + {794B64EC-B809-32E3-AD00-4EE6A74802CA} + + + {67BE498C-9E1F-C73A-B99A-387C034CE680} + + + {1A9C8538-959B-25E3-473D-B462C9A9D458} + + + {AA9F594C-DFAF-C0A7-0CCD-9F90E54D3A01} + + + {230BF784-34F4-3BE8-46D4-54E6B67E5E9E} + + + {39F680F3-5161-4D1C-EAD0-3911ED808874} + + + {3197198B-A978-E330-C7FB-07E5CE8236C7} + + + {42F7BE9D-3C8A-AE26-289B-8F355C068036} + + + {7868764A-6572-381A-906C-9C26792A4C29} + + + {03678508-A517-48BB-FB4A-485628C34E08} + + + {07D27C1D-3227-F527-356C-17DA11551A99} + + + {6146D580-99D2-A6C8-5908-30DC355BB6BA} + + + {C67003E8-BEA8-2188-F4B3-A122F4B4FA3F} + + + {09B91E68-1FF4-C7ED-9055-D4D96E66A0BA} + + + {30B3DA63-C1E4-F2EA-CEF0-8035D8CBFF64} + + + {4F24EEED-AA33-AC6C-9A39-72E71CF83EF0} + + + {0F70B1A9-BB50-23F5-2AE7-F95E51A00389} + + + {D4C8DC40-2CD2-04B6-05D0-1E7A88841390} + + + {58BED6AF-DB89-7560-B2B8-D937C1C0825A} + + + {B958F86B-6926-8D9B-2FC6-8BFD4BDC72C9} + + + {DB624F7D-D513-25AC-C13C-B9062EB3BEEE} + + + {89AA9B6C-4029-A34F-C1B0-3B5D8691F4D4} + + + {1A7F541C-B032-9C66-C320-A13B2A8A9866} + + + {4BAB7C18-51AB-0D9D-83CD-9C37F28D2E38} + + + {5523922E-8B0C-A52B-477C-752C09F8197F} + + + {857B6D8B-0ECB-FE9E-D1EB-D5E45E72F057} + + + {BAA582FA-40B7-320E-EE7A-4C3892C7BE72} + + + {632B4C79-AF7D-BFB5-D006-5AE67F607130} + + + {B10E20C2-4583-2B79-60B7-FE4D4B044313} + + + {CFB54F15-8A8A-0505-9B7F-ECA41CEE38E8} + + + {911F0159-A7A8-4A43-3FD4-154F62F4A44B} + + + {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} + + + {3FDCD000-763F-8477-9AF8-70ABA2E91E5E} + + + {0947506F-66FA-EF8D-8A4E-4D48BCDBB226} + + + {E4B6AED3-F54C-3FF2-069F-640BACAE0E08} + + + {D5EADBCC-6A1C-C940-0206-26E49110AF08} + + + {D27DC92D-5BEB-9294-DCD1-81D54E245AD5} + + + {BCD73D20-42B1-6CDB-DE66-B06236A60F47} + + + {20DC13F6-2369-8841-9F0B-D13FA14EEE74} + + + {A302A8DB-120F-9EBB-A3D5-2C29963AA56B} + + + {45489C2A-6E0E-CCDC-6638-0DACEEB63CCA} + + + {F1B90726-DB55-0293-BFAF-C65C7DF5489C} + + + {2C55FD42-0ACD-B0B8-7EAE-EB17F09BAEEC} + + + {B68CD2B2-701F-9AB7-4638-2485D6E06BCF} + + + {B0B7C78E-729E-0FFA-D611-82AE8BC7FE2C} + + + {0A4F7E12-220C-14EF-0026-9C0629FA9C17} + + + {37F49E10-4E62-6D5C-FF70-722D0CA3D97E} + + + {160D9882-0F68-278D-C5F9-8960FD7421D2} + + + {4CED05DA-E0A2-E548-F753-1F2EF299A8E3} + + + {46AE69B8-AD58-4381-6CDE-25C8D75B01D2} + + + {E56CB4FC-32E8-8740-A3BB-B323CD937A99} + + + {4ECDCA0C-BB38-0729-A6B6-2FB0B4D0863B} + + + {294E4CD5-B06F-97D1-04A3-51871CEA507C} + + + {77228F15-BD91-06FF-2C7E-0377D25C2C94} + + + {5CB531E6-BF9A-2C50-056C-EE5A525D28D3} + + + {E4EA47E5-B41C-2A19-1783-7E9104096ECD} + + + {B331BC33-9770-3DB5-73F2-BC2469ECCF7F} + + + {46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC} + + + {D90A8DF7-FBAB-D363-13C0-6707BB22B72B} + + + {8AE77C40-6839-EC37-4515-BD3CC269BCE4} + + + {0EAD99DB-011F-09E5-45A2-365F646EB004} + + + {F57590C6-3B90-1BE1-1006-488BA33E8BD9} + + + {7C319D73-0D93-5842-0874-398D2D3038D5} + + + {2CB4DB0C-DD3B-6195-D822-76EC7A5C88D2} + + + {FE3CB19C-EF43-5CF5-DAF0-09D4E43D0AB9} + + + {C0E5DD5D-F8F1-DD25-67D7-291946AB3828} + + + {FE7E6CD5-C7A0-DB20-4E7E-D6E7F08C4578} + + + {895C2D33-E08D-B1BA-BB36-FC4CA65090C8} + + + {D64A57DB-A956-5519-1929-1D929B56E1B0} + + + {5A99CC24-AC45-7ED6-C11A-B8B86E76D884} + + + {7A131EEC-25A7-22F6-2839-A2194DDF3007} + + + {EA9DB76C-CEF7-6BFC-2070-28B7DF8E8063} + + + {3C206A40-6F1B-E683-ACF1-DEC3703D0140} + + + {DF95D4BF-E18C-125A-5EBB-8993A06E232C} + + + {118946F2-AC24-0F09-62D5-753DF87A60CD} + + + {07329F9B-7D3D-CEB3-C771-714842076140} + + + {08BBBECB-B0D1-7611-37EC-F57E1D0CE2A2} + + + {268E8F2A-980C-BF2F-B161-AACABC9D91F3} + + + {A4D76113-9EDC-DA60-D89B-5BACF7F1C426} + + + {FE955B6B-68AC-AA07-70D8-2413F6DB65C8} + + + {7ED5A90E-41AF-A1EF-659B-37CEEAB9BA61} + + + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + JUCE Modules\juce_audio_basics\buffers + + + JUCE Modules\juce_audio_basics\buffers + + + JUCE Modules\juce_audio_basics\buffers + + + JUCE Modules\juce_audio_basics\buffers + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\synthesisers + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics + + + JUCE Modules\juce_audio_basics + + + JUCE Modules\juce_audio_devices\audio_io + + + JUCE Modules\juce_audio_devices\audio_io + + + JUCE Modules\juce_audio_devices\audio_io + + + JUCE Modules\juce_audio_devices\audio_io + + + JUCE Modules\juce_audio_devices\midi_io + + + JUCE Modules\juce_audio_devices\midi_io + + + JUCE Modules\juce_audio_devices\native\oboe\src\aaudio + + + JUCE Modules\juce_audio_devices\native\oboe\src\aaudio + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\fifo + + + JUCE Modules\juce_audio_devices\native\oboe\src\fifo + + + JUCE Modules\juce_audio_devices\native\oboe\src\fifo + + + JUCE Modules\juce_audio_devices\native\oboe\src\fifo + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\sources + + + JUCE Modules\juce_audio_devices\sources + + + JUCE Modules\juce_audio_devices + + + JUCE Modules\juce_audio_devices + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\sampler + + + JUCE Modules\juce_audio_formats + + + JUCE Modules\juce_audio_formats + + + JUCE Modules\juce_audio_processors\format + + + JUCE Modules\juce_audio_processors\format + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\scanning + + + JUCE Modules\juce_audio_processors\scanning + + + JUCE Modules\juce_audio_processors\scanning + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_utils\audio_cd + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\native + + + JUCE Modules\juce_audio_utils\native + + + JUCE Modules\juce_audio_utils\native + + + JUCE Modules\juce_audio_utils\native + + + JUCE Modules\juce_audio_utils\native + + + JUCE Modules\juce_audio_utils\native + + + JUCE Modules\juce_audio_utils\native + + + JUCE Modules\juce_audio_utils\native + + + JUCE Modules\juce_audio_utils\native + + + JUCE Modules\juce_audio_utils\native + + + JUCE Modules\juce_audio_utils\players + + + JUCE Modules\juce_audio_utils\players + + + JUCE Modules\juce_audio_utils + + + JUCE Modules\juce_audio_utils + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\javascript + + + JUCE Modules\juce_core\javascript + + + JUCE Modules\juce_core\logging + + + JUCE Modules\juce_core\logging + + + JUCE Modules\juce_core\maths + + + JUCE Modules\juce_core\maths + + + JUCE Modules\juce_core\maths + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\misc + + + JUCE Modules\juce_core\misc + + + JUCE Modules\juce_core\misc + + + JUCE Modules\juce_core\misc + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\network + + + JUCE Modules\juce_core\network + + + JUCE Modules\juce_core\network + + + JUCE Modules\juce_core\network + + + JUCE Modules\juce_core\network + + + JUCE Modules\juce_core\network + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\system + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\time + + + JUCE Modules\juce_core\time + + + JUCE Modules\juce_core\time + + + JUCE Modules\juce_core\unit_tests + + + JUCE Modules\juce_core\xml + + + JUCE Modules\juce_core\xml + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip + + + JUCE Modules\juce_core\zip + + + JUCE Modules\juce_core\zip + + + JUCE Modules\juce_core + + + JUCE Modules\juce_core + + + JUCE Modules\juce_data_structures\app_properties + + + JUCE Modules\juce_data_structures\app_properties + + + JUCE Modules\juce_data_structures\undomanager + + + JUCE Modules\juce_data_structures\values + + + JUCE Modules\juce_data_structures\values + + + JUCE Modules\juce_data_structures\values + + + JUCE Modules\juce_data_structures\values + + + JUCE Modules\juce_data_structures\values + + + JUCE Modules\juce_data_structures + + + JUCE Modules\juce_data_structures + + + JUCE Modules\juce_events\broadcasters + + + JUCE Modules\juce_events\broadcasters + + + JUCE Modules\juce_events\broadcasters + + + JUCE Modules\juce_events\interprocess + + + JUCE Modules\juce_events\interprocess + + + JUCE Modules\juce_events\interprocess + + + JUCE Modules\juce_events\interprocess + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\timers + + + JUCE Modules\juce_events\timers + + + JUCE Modules\juce_events + + + JUCE Modules\juce_events + + + JUCE Modules\juce_graphics\colour + + + JUCE Modules\juce_graphics\colour + + + JUCE Modules\juce_graphics\colour + + + JUCE Modules\juce_graphics\colour + + + JUCE Modules\juce_graphics\contexts + + + JUCE Modules\juce_graphics\contexts + + + JUCE Modules\juce_graphics\contexts + + + JUCE Modules\juce_graphics\effects + + + JUCE Modules\juce_graphics\effects + + + JUCE Modules\juce_graphics\fonts + + + JUCE Modules\juce_graphics\fonts + + + JUCE Modules\juce_graphics\fonts + + + JUCE Modules\juce_graphics\fonts + + + JUCE Modules\juce_graphics\fonts + + + JUCE Modules\juce_graphics\fonts + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats + + + JUCE Modules\juce_graphics\image_formats + + + JUCE Modules\juce_graphics\image_formats + + + JUCE Modules\juce_graphics\images + + + JUCE Modules\juce_graphics\images + + + JUCE Modules\juce_graphics\images + + + JUCE Modules\juce_graphics\images + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\placement + + + JUCE Modules\juce_graphics + + + JUCE Modules\juce_graphics + + + JUCE Modules\juce_gui_basics\accessibility + + + JUCE Modules\juce_gui_basics\application + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\commands + + + JUCE Modules\juce_gui_basics\commands + + + JUCE Modules\juce_gui_basics\commands + + + JUCE Modules\juce_gui_basics\commands + + + JUCE Modules\juce_gui_basics\components + + + JUCE Modules\juce_gui_basics\components + + + JUCE Modules\juce_gui_basics\components + + + JUCE Modules\juce_gui_basics\components + + + JUCE Modules\juce_gui_basics\desktop + + + JUCE Modules\juce_gui_basics\desktop + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\lookandfeel + + + JUCE Modules\juce_gui_basics\lookandfeel + + + JUCE Modules\juce_gui_basics\lookandfeel + + + JUCE Modules\juce_gui_basics\lookandfeel + + + JUCE Modules\juce_gui_basics\lookandfeel + + + JUCE Modules\juce_gui_basics\menus + + + JUCE Modules\juce_gui_basics\menus + + + JUCE Modules\juce_gui_basics\menus + + + JUCE Modules\juce_gui_basics\menus + + + JUCE Modules\juce_gui_basics\misc + + + JUCE Modules\juce_gui_basics\misc + + + JUCE Modules\juce_gui_basics\misc + + + JUCE Modules\juce_gui_basics\misc + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\x11 + + + JUCE Modules\juce_gui_basics\native\x11 + + + JUCE Modules\juce_gui_basics\native\x11 + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics + + + JUCE Modules\juce_gui_basics + + + JUCE Modules\juce_gui_extra\code_editor + + + JUCE Modules\juce_gui_extra\code_editor + + + JUCE Modules\juce_gui_extra\code_editor + + + JUCE Modules\juce_gui_extra\code_editor + + + JUCE Modules\juce_gui_extra\code_editor + + + JUCE Modules\juce_gui_extra\documents + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra + + + JUCE Modules\juce_gui_extra + + + JUCE Library Code + + + JUCE Library Code + + + JUCE Library Code + + + JUCE Library Code + + + JUCE Library Code + + + JUCE Library Code + + + JUCE Library Code + + + JUCE Library Code + + + JUCE Library Code + + + JUCE Library Code + + + JUCE Library Code + + + JUCE Library Code + + + JUCE Library Code + + + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + Tchick\Source + + + JUCE Modules\juce_audio_basics\audio_play_head + + + JUCE Modules\juce_audio_basics\buffers + + + JUCE Modules\juce_audio_basics\buffers + + + JUCE Modules\juce_audio_basics\buffers + + + JUCE Modules\juce_audio_basics\buffers + + + JUCE Modules\juce_audio_basics\buffers + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi\ump + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\midi + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\mpe + + + JUCE Modules\juce_audio_basics\native + + + JUCE Modules\juce_audio_basics\native + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\sources + + + JUCE Modules\juce_audio_basics\synthesisers + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics\utilities + + + JUCE Modules\juce_audio_basics + + + JUCE Modules\juce_audio_devices\audio_io + + + JUCE Modules\juce_audio_devices\audio_io + + + JUCE Modules\juce_audio_devices\audio_io + + + JUCE Modules\juce_audio_devices\audio_io + + + JUCE Modules\juce_audio_devices\midi_io\ump + + + JUCE Modules\juce_audio_devices\midi_io\ump + + + JUCE Modules\juce_audio_devices\midi_io + + + JUCE Modules\juce_audio_devices\midi_io + + + JUCE Modules\juce_audio_devices\native\oboe\include\oboe + + + JUCE Modules\juce_audio_devices\native\oboe\include\oboe + + + JUCE Modules\juce_audio_devices\native\oboe\include\oboe + + + JUCE Modules\juce_audio_devices\native\oboe\include\oboe + + + JUCE Modules\juce_audio_devices\native\oboe\include\oboe + + + JUCE Modules\juce_audio_devices\native\oboe\include\oboe + + + JUCE Modules\juce_audio_devices\native\oboe\include\oboe + + + JUCE Modules\juce_audio_devices\native\oboe\include\oboe + + + JUCE Modules\juce_audio_devices\native\oboe\include\oboe + + + JUCE Modules\juce_audio_devices\native\oboe\include\oboe + + + JUCE Modules\juce_audio_devices\native\oboe\include\oboe + + + JUCE Modules\juce_audio_devices\native\oboe\src\aaudio + + + JUCE Modules\juce_audio_devices\native\oboe\src\aaudio + + + JUCE Modules\juce_audio_devices\native\oboe\src\aaudio + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\common + + + JUCE Modules\juce_audio_devices\native\oboe\src\fifo + + + JUCE Modules\juce_audio_devices\native\oboe\src\fifo + + + JUCE Modules\juce_audio_devices\native\oboe\src\fifo + + + JUCE Modules\juce_audio_devices\native\oboe\src\fifo + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native\oboe\src\opensles + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\native + + + JUCE Modules\juce_audio_devices\sources + + + JUCE Modules\juce_audio_devices\sources + + + JUCE Modules\juce_audio_devices + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected + + + JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\coupled + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\coupled + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\floor + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\uncoupled + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\codecs + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\format + + + JUCE Modules\juce_audio_formats\sampler + + + JUCE Modules\juce_audio_formats + + + JUCE Modules\juce_audio_processors\format + + + JUCE Modules\juce_audio_processors\format + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\processors + + + JUCE Modules\juce_audio_processors\scanning + + + JUCE Modules\juce_audio_processors\scanning + + + JUCE Modules\juce_audio_processors\scanning + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_utils\audio_cd + + + JUCE Modules\juce_audio_utils\audio_cd + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\gui + + + JUCE Modules\juce_audio_utils\players + + + JUCE Modules\juce_audio_utils\players + + + JUCE Modules\juce_audio_utils + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\containers + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\javascript + + + JUCE Modules\juce_core\javascript + + + JUCE Modules\juce_core\logging + + + JUCE Modules\juce_core\logging + + + JUCE Modules\juce_core\maths + + + JUCE Modules\juce_core\maths + + + JUCE Modules\juce_core\maths + + + JUCE Modules\juce_core\maths + + + JUCE Modules\juce_core\maths + + + JUCE Modules\juce_core\maths + + + JUCE Modules\juce_core\maths + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\memory + + + JUCE Modules\juce_core\misc + + + JUCE Modules\juce_core\misc + + + JUCE Modules\juce_core\misc + + + JUCE Modules\juce_core\misc + + + JUCE Modules\juce_core\misc + + + JUCE Modules\juce_core\misc + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\native + + + JUCE Modules\juce_core\network + + + JUCE Modules\juce_core\network + + + JUCE Modules\juce_core\network + + + JUCE Modules\juce_core\network + + + JUCE Modules\juce_core\network + + + JUCE Modules\juce_core\network + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\streams + + + JUCE Modules\juce_core\system + + + JUCE Modules\juce_core\system + + + JUCE Modules\juce_core\system + + + JUCE Modules\juce_core\system + + + JUCE Modules\juce_core\system + + + JUCE Modules\juce_core\system + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\text + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\threads + + + JUCE Modules\juce_core\time + + + JUCE Modules\juce_core\time + + + JUCE Modules\juce_core\time + + + JUCE Modules\juce_core\unit_tests + + + JUCE Modules\juce_core\unit_tests + + + JUCE Modules\juce_core\xml + + + JUCE Modules\juce_core\xml + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip\zlib + + + JUCE Modules\juce_core\zip + + + JUCE Modules\juce_core\zip + + + JUCE Modules\juce_core\zip + + + JUCE Modules\juce_core + + + JUCE Modules\juce_data_structures\app_properties + + + JUCE Modules\juce_data_structures\app_properties + + + JUCE Modules\juce_data_structures\undomanager + + + JUCE Modules\juce_data_structures\undomanager + + + JUCE Modules\juce_data_structures\values + + + JUCE Modules\juce_data_structures\values + + + JUCE Modules\juce_data_structures\values + + + JUCE Modules\juce_data_structures\values + + + JUCE Modules\juce_data_structures\values + + + JUCE Modules\juce_data_structures + + + JUCE Modules\juce_events\broadcasters + + + JUCE Modules\juce_events\broadcasters + + + JUCE Modules\juce_events\broadcasters + + + JUCE Modules\juce_events\broadcasters + + + JUCE Modules\juce_events\broadcasters + + + JUCE Modules\juce_events\interprocess + + + JUCE Modules\juce_events\interprocess + + + JUCE Modules\juce_events\interprocess + + + JUCE Modules\juce_events\interprocess + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\messages + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\native + + + JUCE Modules\juce_events\timers + + + JUCE Modules\juce_events\timers + + + JUCE Modules\juce_events + + + JUCE Modules\juce_graphics\colour + + + JUCE Modules\juce_graphics\colour + + + JUCE Modules\juce_graphics\colour + + + JUCE Modules\juce_graphics\colour + + + JUCE Modules\juce_graphics\colour + + + JUCE Modules\juce_graphics\contexts + + + JUCE Modules\juce_graphics\contexts + + + JUCE Modules\juce_graphics\contexts + + + JUCE Modules\juce_graphics\contexts + + + JUCE Modules\juce_graphics\effects + + + JUCE Modules\juce_graphics\effects + + + JUCE Modules\juce_graphics\effects + + + JUCE Modules\juce_graphics\fonts + + + JUCE Modules\juce_graphics\fonts + + + JUCE Modules\juce_graphics\fonts + + + JUCE Modules\juce_graphics\fonts + + + JUCE Modules\juce_graphics\fonts + + + JUCE Modules\juce_graphics\fonts + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\geometry + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + JUCE Modules\juce_graphics\images + + + JUCE Modules\juce_graphics\images + + + JUCE Modules\juce_graphics\images + + + JUCE Modules\juce_graphics\images + + + JUCE Modules\juce_graphics\images + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\native + + + JUCE Modules\juce_graphics\placement + + + JUCE Modules\juce_graphics\placement + + + JUCE Modules\juce_graphics + + + JUCE Modules\juce_gui_basics\accessibility\enums + + + JUCE Modules\juce_gui_basics\accessibility\enums + + + JUCE Modules\juce_gui_basics\accessibility\enums + + + JUCE Modules\juce_gui_basics\accessibility\interfaces + + + JUCE Modules\juce_gui_basics\accessibility\interfaces + + + JUCE Modules\juce_gui_basics\accessibility\interfaces + + + JUCE Modules\juce_gui_basics\accessibility\interfaces + + + JUCE Modules\juce_gui_basics\accessibility + + + JUCE Modules\juce_gui_basics\accessibility + + + JUCE Modules\juce_gui_basics\application + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\buttons + + + JUCE Modules\juce_gui_basics\commands + + + JUCE Modules\juce_gui_basics\commands + + + JUCE Modules\juce_gui_basics\commands + + + JUCE Modules\juce_gui_basics\commands + + + JUCE Modules\juce_gui_basics\commands + + + JUCE Modules\juce_gui_basics\components + + + JUCE Modules\juce_gui_basics\components + + + JUCE Modules\juce_gui_basics\components + + + JUCE Modules\juce_gui_basics\components + + + JUCE Modules\juce_gui_basics\components + + + JUCE Modules\juce_gui_basics\components + + + JUCE Modules\juce_gui_basics\desktop + + + JUCE Modules\juce_gui_basics\desktop + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\drawables + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\filebrowser + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\keyboard + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\layout + + + JUCE Modules\juce_gui_basics\lookandfeel + + + JUCE Modules\juce_gui_basics\lookandfeel + + + JUCE Modules\juce_gui_basics\lookandfeel + + + JUCE Modules\juce_gui_basics\lookandfeel + + + JUCE Modules\juce_gui_basics\lookandfeel + + + JUCE Modules\juce_gui_basics\menus + + + JUCE Modules\juce_gui_basics\menus + + + JUCE Modules\juce_gui_basics\menus + + + JUCE Modules\juce_gui_basics\menus + + + JUCE Modules\juce_gui_basics\misc + + + JUCE Modules\juce_gui_basics\misc + + + JUCE Modules\juce_gui_basics\misc + + + JUCE Modules\juce_gui_basics\misc + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\mouse + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\accessibility + + + JUCE Modules\juce_gui_basics\native\x11 + + + JUCE Modules\juce_gui_basics\native\x11 + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\native + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\positioning + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\properties + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\widgets + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics\windows + + + JUCE Modules\juce_gui_basics + + + JUCE Modules\juce_gui_extra\code_editor + + + JUCE Modules\juce_gui_extra\code_editor + + + JUCE Modules\juce_gui_extra\code_editor + + + JUCE Modules\juce_gui_extra\code_editor + + + JUCE Modules\juce_gui_extra\code_editor + + + JUCE Modules\juce_gui_extra\code_editor + + + JUCE Modules\juce_gui_extra\code_editor + + + JUCE Modules\juce_gui_extra\documents + + + JUCE Modules\juce_gui_extra\embedding + + + JUCE Modules\juce_gui_extra\embedding + + + JUCE Modules\juce_gui_extra\embedding + + + JUCE Modules\juce_gui_extra\embedding + + + JUCE Modules\juce_gui_extra\embedding + + + JUCE Modules\juce_gui_extra\embedding + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\misc + + + JUCE Modules\juce_gui_extra\native + + + JUCE Modules\juce_gui_extra + + + JUCE Library Code + + + + + Tchick\Assets\Clicks\01 SeikoSQ50 + + + Tchick\Assets\Clicks\01 SeikoSQ50 + + + Tchick\Assets\Clicks\02 Stick + + + Tchick\Assets\Clicks\02 Stick + + + Tchick\Assets\Clicks\03 Cowbell + + + Tchick\Assets\Clicks\03 Cowbell + + + Tchick\Assets\Clicks\04 vChip Wood + + + Tchick\Assets\Clicks\04 vChip Wood + + + Tchick\Assets\Clicks\05 vChip Claves + + + Tchick\Assets\Clicks\05 vChip Claves + + + JUCE Modules\juce_audio_devices\native\oboe + + + JUCE Modules\juce_audio_devices\native\oboe + + + JUCE Modules\juce_audio_formats\codecs\flac + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7 + + + JUCE Modules\juce_audio_formats\codecs\oggvorbis + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK + + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK + + + JUCE Modules\juce_core\native\java + + + JUCE Modules\juce_graphics\image_formats\jpglib + + + JUCE Modules\juce_graphics\image_formats\pnglib + + + + + JUCE Library Code + + + diff --git a/Tchick_App.vcxproj.user b/Tchick_App.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/Tchick_App.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/resources.rc b/resources.rc new file mode 100644 index 0000000..3eb165b --- /dev/null +++ b/resources.rc @@ -0,0 +1,31 @@ +#pragma code_page(65001) + +#ifdef JUCE_USER_DEFINED_RC_FILE + #include JUCE_USER_DEFINED_RC_FILE +#else + +#undef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#include + +VS_VERSION_INFO VERSIONINFO +FILEVERSION 1,0,0,0 +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "FileDescription", "Tchick\0" + VALUE "FileVersion", "1.0.0\0" + VALUE "ProductName", "Tchick\0" + VALUE "ProductVersion", "1.0.0\0" + END + END + + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif