diff --git a/.github/workflows/all.yml b/.github/workflows/all.yml
new file mode 100644
index 0000000..4ac062d
--- /dev/null
+++ b/.github/workflows/all.yml
@@ -0,0 +1,209 @@
+name: Python package
+
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ branches: [ "main" ]
+
+jobs:
+ build-ubuntu:
+ runs-on: ubuntu-22.04
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - { python-version: "3.9", pythonLibPath: "/opt/python/cp39-cp39/lib", pythonInclude: "/opt/python/cp39-cp39/include/python3.9", cibwbuild: "cp39-manylinux_x86_64"}
+ - { python-version: "3.10", pythonLibPath: "/opt/python/cp310-cp310/lib", pythonInclude: "/opt/python/cp310-cp310/include/python3.10", cibwbuild: "cp310-manylinux_x86_64"}
+ - { python-version: "3.11", pythonLibPath: "/opt/python/cp311-cp311/lib", pythonInclude: "/opt/python/cp311-cp311/include/python3.11", cibwbuild: "cp311-manylinux_x86_64"}
+ - { python-version: "3.12", pythonLibPath: "/opt/python/cp312-cp312/lib", pythonInclude: "/opt/python/cp312-cp312/include/python3.12", cibwbuild: "cp312-manylinux_x86_64"}
+ - { python-version: "3.13", pythonLibPath: "/opt/python/cp313-cp313/lib", pythonInclude: "/opt/python/cp313-cp313/include/python3.13", cibwbuild: "cp313-manylinux_x86_64"}
+ # - { python-version: "3.9", pythonLibPath: "/opt/python/cp39-cp39/lib", pythonInclude: "/opt/python/cp39-cp39/include/python3.9", cibwbuild: "cp39-manylinux_aarch64"}
+ # - { python-version: "3.10", pythonLibPath: "/opt/python/cp310-cp310/lib", pythonInclude: "/opt/python/cp310-cp310/include/python3.10", cibwbuild: "cp310-manylinux_aarch64"}
+ # - { python-version: "3.11", pythonLibPath: "/opt/python/cp311-cp311/lib", pythonInclude: "/opt/python/cp311-cp311/include/python3.11", cibwbuild: "cp311-manylinux_aarch64"}
+ # - { python-version: "3.12", pythonLibPath: "/opt/python/cp312-cp312/lib", pythonInclude: "/opt/python/cp312-cp312/include/python3.12", cibwbuild: "cp312-manylinux_aarch64"}
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up QEMU for aarch64 on Linux
+ if: runner.os == 'Linux'
+ uses: docker/setup-qemu-action@v3
+ with:
+ platforms: all
+
+ - name: Build wheels
+ uses: pypa/cibuildwheel@v2.20.0
+ env:
+ CIBW_PLATFORM: linux
+ CIBW_BUILD: ${{ matrix.cibwbuild }}
+ CIBW_BUILD_VERBOSITY: 3
+ CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014
+ CIBW_MANYLINUX_AARCH64_IMAGE: manylinux2014
+ CIBW_BEFORE_BUILD_LINUX:
+ export LIBDIR=${{ matrix.pythonLibPath }} && export PYTHONLIBPATH=${{ matrix.pythonLibPath }} && export PYTHONINCLUDEPATH=${{ matrix.pythonInclude }} && sh -v build_linux.sh
+ CIBW_REPAIR_WHEEL_COMMAND_LINUX: pip install auditwheel-symbols && (auditwheel repair -w {dest_dir} {wheel} || auditwheel-symbols --manylinux 2014 {wheel})
+ CIBW_TEST_REQUIRES: -r test-requirements.txt
+ CIBW_TEST_COMMAND: "rm -rf vita/*.so* && cd {project}/tests && python -m pytest -v ."
+ CIBW_ARCHS: auto64
+ CIBW_ARCHS_LINUX: auto64 aarch64 # On an Linux Intel runner with qemu installed, build Intel and ARM wheels
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: artifact-${{ matrix.cibwbuild}}
+ path: ./wheelhouse/*.whl
+
+ build-macos:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - { os: macos-13, build: cp39-macosx_x86_64, python-version: "3.9", ARCHS: "x86_64" }
+ - { os: macos-13, build: cp310-macosx_x86_64, python-version: "3.10", ARCHS: "x86_64" }
+ - { os: macos-13, build: cp311-macosx_x86_64, python-version: "3.11", ARCHS: "x86_64" }
+ - { os: macos-13, build: cp312-macosx_x86_64, python-version: "3.12", ARCHS: "x86_64" }
+ - { os: macos-13, build: cp313-macosx_x86_64, python-version: "3.13", ARCHS: "x86_64" }
+ - { os: macos-14, build: cp39-macosx_arm64, python-version: "3.9", ARCHS: "arm64" }
+ - { os: macos-14, build: cp310-macosx_arm64, python-version: "3.10", ARCHS: "arm64" }
+ - { os: macos-14, build: cp311-macosx_arm64, python-version: "3.11", ARCHS: "arm64" }
+ - { os: macos-14, build: cp312-macosx_arm64, python-version: "3.12", ARCHS: "arm64" }
+ - { os: macos-14, build: cp313-macosx_arm64, python-version: "3.13", ARCHS: "arm64" }
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Get CMake
+ uses: lukka/get-cmake@latest
+
+ - name: Build wheels ${{ matrix.python-version }}
+ uses: pypa/cibuildwheel@v2.20.0
+ env:
+ # note that the Projucer project refers to PYTHONMAJOR and pythonLocation, so they must be set here
+ PYTHONMAJOR: ${{ matrix.python-version }}
+ MACOSX_DEPLOYMENT_TARGET: 11.0
+ CIBW_BUILD_VERBOSITY: 1
+ CIBW_BEFORE_BUILD: export pythonLocation=$(python${{matrix.python-version}}-config --prefix) && sh -v build_macos.sh
+ CIBW_TEST_REQUIRES: -r test-requirements.txt
+ CIBW_TEST_COMMAND: "cd {project}/tests; python -m pytest -v ."
+ CIBW_BUILD: ${{matrix.build}}
+ CIBW_ARCHS: auto64
+ CIBW_ARCHS_MACOS: ${{matrix.ARCHS}}
+ CIBW_ENVIRONMENT_MACOS: ARCHS="${{matrix.ARCHS}}"
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: artifact-macos-${{ matrix.build}}
+ path: ./wheelhouse/*.whl
+
+ build-windows:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ # fail-fast: false
+ matrix:
+ include:
+ - { os: windows-2022, python-version: "3.9", CIBW-BUILD: "cp39*"}
+ - { os: windows-2022, python-version: "3.10", CIBW-BUILD: "cp310*"}
+ - { os: windows-2022, python-version: "3.11", CIBW-BUILD: "cp311*"}
+ - { os: windows-2022, python-version: "3.12", CIBW-BUILD: "cp312*"}
+ - { os: windows-2022, python-version: "3.13", CIBW-BUILD: "cp313*"}
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Setup Python ${{ matrix.python-version }}
+ uses: actions/setup-python@v5
+ with:
+ python-version: ${{ matrix.python-version }}
+
+ - name: Add msbuild to PATH
+ uses: microsoft/setup-msbuild@v2
+
+ - name: Get CMake
+ uses: lukka/get-cmake@latest
+
+ - name: Build Nanobind
+ run: |
+ cd third_party/nanobind
+ git submodule update --init --recursive
+ cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
+ cmake --build build --config Release
+
+ - name: Build Windows
+ run: |
+ msbuild headless/builds/VisualStudio2022/Vita.sln /property:Configuration=Release
+
+ - name: Install cibuildwheel
+ run: python -m pip install cibuildwheel
+
+ - name: Build Wheels
+ run: |
+ python -m cibuildwheel --output-dir wheelhouse
+ env:
+ PYTHONMAJOR: ${{ matrix.python-version }}
+ CIBW_BUILD_VERBOSITY: 1
+ CIBW_TEST_REQUIRES: -r test-requirements.txt
+ CIBW_TEST_COMMAND: "cd /D {project}\\tests && python -m pytest -v ."
+ CIBW_ARCHS: auto64
+ CIBW_BUILD: ${{matrix.CIBW-BUILD}}
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: artifact-windows-${{ matrix.python-version}}
+ path: ./wheelhouse/*.whl
+
+ # build_docs:
+ # permissions:
+ # contents: write
+ # runs-on: ubuntu-latest
+ # needs: test
+ # steps:
+ # - name: Checkout code
+ # uses: actions/checkout@v4
+
+ # - name: Set up Python
+ # uses: actions/setup-python@v5
+ # with:
+ # python-version: 3.11
+
+ # - name: Install dependencies
+ # run: |
+ # sudo apt-get install libsndfile-dev
+ # python -m pip install --upgrade pip
+ # pip install pytest
+ # pip install furo
+
+ # - name: Build Docs
+ # run: |
+ # cd docs
+ # make html
+
+ # - name: Deploy Docs to GitHub Pages
+ # uses: peaceiris/actions-gh-pages@v4
+ # with:
+ # github_token: ${{ secrets.GITHUB_TOKEN }}
+ # publish_dir: ./docs/build/html
+
+ upload-pypi:
+ needs: [build-windows, build-ubuntu, build-macos]
+ runs-on: ubuntu-latest
+ name: "Upload wheels to PyPI"
+ if: github.event_name == 'release' && github.event.action == 'published'
+ steps:
+ - uses: actions/download-artifact@v4
+ with:
+ pattern: artifact-*
+ merge-multiple: true
+ path: dist
+
+ - uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ user: __token__
+ password: ${{ secrets.PYPI_API_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 55bb1b8..33fd251 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,35 +1,41 @@
-.DS_Store
-.DS_Store?
-VTune\ Profiler\ Results
-cmake-build*
-*.swp
-*.Trashes
-xcuserdata
-xcshareddata
-*.xcworkspace
-build
-.clang_complete
-.vs
-.ycm_extra_conf.py*
-*.pbxuser
-*.perspective
-*.perspectivev3
-*.sdf
-*.suo
-*.psess
-*.vsp
-*.tlog
-*.user
+# Prerequisites
+*.d
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+*.smod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
*.app
-*.opendb
-*.opensdf
-*.component
-*.VST
-*.lv2
-*.vst
-*.VST3
-*.vst3
-*.tar.gz
-Debug
-Profile
-Release
+
+.DS_STORE
+build
+dataset
+.vs
+.egg
+*.egg-info*
+vita/LICENSE
+dist
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..ee8e6e2
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1 @@
+graft vita # copy everything
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 7bdebaf..f11159e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,17 +1,20 @@
+PYTHONINCLUDEPATH := $(shell python3.10 -c "import sysconfig; print(sysconfig.get_path('include'))")
+
+PYTHONLIBPATH := $(shell python3.10 -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))")
ifndef CONFIG
CONFIG=Release
endif
ifndef LIBDIR
- LIBDIR=/usr/lib/
+ # LIBDIR=/usr/lib/
+ LIBDIR=$(shell python3.10 -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))")
endif
BUILD_DATE="$(shell date +'%Y %m %d %H %M')"
PAID := 1
-
VERSION := $(shell sh -c 'grep -oh -m 1 "VERSION=[0-9\.]*" standalone/builds/linux/Makefile | cut -d "=" -f 2')
MACHINE := $(shell sh -c 'uname -m 2> /dev/null || echo not')
@@ -106,19 +109,25 @@ effects_vst3:
$(MAKE) -C effects/builds/linux_vst VST3 CONFIG=$(CONFIG) AR=gcc-ar SIMDFLAGS="$(SIMDFLAGS)" GLFLAGS="$(GLFLAGS)" BUILD_DATE=$(BUILD_DATE)
headless_server:
- $(MAKE) -C headless/builds/linux CONFIG=$(CONFIG) SIMDFLAGS="$(SIMDFLAGS)" GLFLAGS="$(GLFLAGS)" BUILD_DATE=$(BUILD_DATE)
+ cd headless/builds/linux
+ ldconfig
+ cd ../../..
+ $(MAKE) VERBOSE=1 -C headless/builds/linux CONFIG=$(CONFIG) SIMDFLAGS="$(SIMDFLAGS)" GLFLAGS="$(GLFLAGS)" BUILD_DATE=$(BUILD_DATE) LIBS="-lstdc++fs" LDFLAGS="-L$(PYTHONLIBPATH)" CXXFLAGS="-I$(PYTHONINCLUDEPATH)"
+ cp headless/builds/linux/build/libvita.so tests/vita.so
+ strip --strip-unneeded tests/vita.so
+ cp tests/vita.so vita/vita.so
test:
$(MAKE) -C tests/builds/linux CONFIG=$(CONFIG) SIMDFLAGS="$(SIMDFLAGS)" GLFLAGS="$(GLFLAGS)" BUILD_DATE=$(BUILD_DATE)
clean:
- $(MAKE) clean -C standalone/builds/linux CONFIG=$(CONFIG)
- $(MAKE) clean -C plugin/builds/linux_vst CONFIG=$(CONFIG)
- $(MAKE) clean -C plugin/builds/linux_lv2 CONFIG=$(CONFIG)
- $(MAKE) clean -C effects/builds/linux_vst CONFIG=$(CONFIG)
- $(MAKE) clean -C effects/builds/linux_lv2 CONFIG=$(CONFIG)
+ # $(MAKE) clean -C standalone/builds/linux CONFIG=$(CONFIG)
+ # $(MAKE) clean -C plugin/builds/linux_vst CONFIG=$(CONFIG)
+ # $(MAKE) clean -C plugin/builds/linux_lv2 CONFIG=$(CONFIG)
+ # $(MAKE) clean -C effects/builds/linux_vst CONFIG=$(CONFIG)
+ # $(MAKE) clean -C effects/builds/linux_lv2 CONFIG=$(CONFIG)
$(MAKE) clean -C headless/builds/linux CONFIG=$(CONFIG)
- $(MAKE) clean -C tests/builds/linux CONFIG=$(CONFIG)
+ # $(MAKE) clean -C tests/builds/linux CONFIG=$(CONFIG)
install_standalone: standalone install_icons
install -d $(BIN) $(MAN) $(CHANGES) $(DESKTOP)
diff --git a/README.md b/README.md
index 34c4de8..7711ebf 100644
--- a/README.md
+++ b/README.md
@@ -1,23 +1,82 @@
-# Vital
-Vital is a spectral warping wavetable synthesizer. This is the source.
+# Vita
-This repository is updated on a delay after binary releases.
+Vita is a Python module for interacting with the [Vital Synthesizer](https://github.com/mtytel/vital). **It is not an official product related to Vital**.
-## Code Licensing
+## Installation
+
+Vita is supported on Linux, macOS, and Windows. Install with `pip`:
+
+```bash
+pip install vita
+```
+
+## Example
+
+```python
+from scipy.io import wavfile
+import vita
+
+SAMPLE_RATE = 44_100
+
+bpm = 120.0
+note_dur = 1.0
+render_dur = 3.0
+pitch = 36 # integer
+velocity = 0.7 # [0.0 to 1.0]
+
+synth = vita.Synth()
+# The initial preset is loaded by default.
+
+synth.set_bpm(bpm)
+
+# Let's make a custom modulation using
+# the available modulation sources and destinations.
+# These lists are constant.
+print("potential sources:", vita.get_modulation_sources())
+print("potential destinations:", vita.get_modulation_destinations())
+
+# "lfo_1" and "filter_1_cutoff" are potential sources and destinations.
+assert synth.connect_modulation("lfo_1", "filter_1_cutoff")
+
+controls = synth.get_controls()
+controls["modulation_1_amount"].set(1.0)
+controls["filter_1_on"].set(1.0)
+controls["lfo_1_tempo"].set(vita.constants.SyncedFrequency.k1_16)
+
+# Render audio to numpy array shaped (2, NUM_SAMPLES)
+audio = synth.render(pitch, velocity, note_dur, render_dur)
+
+wavfile.write("generated_preset.wav", SAMPLE_RATE, audio.T)
+
+# Dump current state to JSON text
+preset_path = "generated_preset.vital"
+
+json_text = synth.to_json()
+with open(preset_path, "w") as f:
+ f.write(json_text)
+
+# Load JSON text
+with open(preset_path, "r") as f:
+ json_text = f.read()
+ assert synth.load_json(json_text)
+
+# Or load directly from file
+assert synth.load_preset(preset_path)
+
+# Load the initial preset, which also clears modulations
+synth.load_init_preset()
+# Or just clear modulations.
+synth.clear_modulations()
+```
+
+### Issues
+
+If you find any issues with the code, report them at https://github.com/DBraun/Vita.
+
+### Code Licensing
If you are making a proprietary or closed source app and would like to use Vital's source code, contact licensing@vital.audio for non GPLv3 licensing options.
-## Installing
-Create an account and download Vital at [vital.audio](https://vital.audio)
-
-## Issues
-Report bugs (e.g.non-code and non-compiling issues) to https://forum.vital.audio
-
-Feel free to report issues on building/compiling here but note that I'm not prioritizing them.
-
-## Pull requests
-I will not take any pull requests.
-
-## What can you do with the source
+### What can you do with the source
The source code is licensed under the GPLv3. If you download the source or create builds you must comply with that license.
### Things you can't do with this source
diff --git a/build_linux.sh b/build_linux.sh
new file mode 100644
index 0000000..02d6dac
--- /dev/null
+++ b/build_linux.sh
@@ -0,0 +1,18 @@
+echo "PYTHONLIBPATH: $PYTHONLIBPATH"
+echo "PYTHONINCLUDEPATH: $PYTHONINCLUDEPATH"
+echo "LIBDIR: $LIBDIR"
+
+yum install -y \
+libsndfile \
+libsndfile-devel
+
+echo "Build Nanobind"
+cd third_party/nanobind
+git submodule update --init --recursive
+cmake -S . -B build -DCMAKE_POSITION_INDEPENDENT_CODE=ON
+cmake --build build
+cd ../..
+
+make headless_server
+
+echo "build_linux.sh is done!"
diff --git a/build_macos.sh b/build_macos.sh
new file mode 100644
index 0000000..dd1c67d
--- /dev/null
+++ b/build_macos.sh
@@ -0,0 +1,42 @@
+if [ -z "$PYTHONMAJOR" ]; then
+ echo "Build failed. You must set the environment variable PYTHONMAJOR to a value such as 3.11"
+ exit 1
+fi
+
+if [ -z "$pythonLocation" ]; then
+ echo "Build failed. You must set the environment variable pythonLocation to a value such as /Library/Frameworks/Python.framework/Versions/3.11"
+ exit 1
+fi
+
+# if [[ $(uname -m) == 'arm64' ]]; then
+# export ARCHS="arm64"
+# export CFLAGS="-arch arm64"
+# export ARCHFLAGS="-arch arm64"
+# else
+# export ARCHS="x86_64"
+# export CFLAGS="-arch x86_64"
+# export ARCHFLAGS="-arch x86_64"
+# fi
+
+# build Nanobind
+cd third_party/nanobind
+git submodule update --init --recursive
+cmake -S . -B build
+cmake --build build
+cd ../..
+
+# build macOS release
+xcodebuild ONLY_ACTIVE_ARCH=NO -configuration Release -project headless/builds/osx/Vita.xcodeproj/ CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
+mv headless/builds/osx/build/Release/vita.so.dylib headless/builds/osx/build/Release/vita.so
+
+rm tests/vita.so
+cp headless/builds/osx/build/Release/vita.so tests/vita.so
+
+# # To make a wheel locally:
+# pip install setuptools wheel build delocate
+# python3 -m build --wheel
+# delocate-listdeps dist/vita-0.0.1-cp311-cp311-macosx_10_15_universal2.whl
+# delocate-wheel --require-archs x86_64 -w repaired_wheel dist/vita-0.0.1-cp311-cp311-macosx_10_15_universal2.whl
+# pip install repaired_wheel/vita-0.0.1-cp311-cp311-macosx_10_15_universal2.whl
+# cd tests
+# python -m pytest -s .
\ No newline at end of file
diff --git a/headless/JuceLibraryCode/AppConfig.h b/headless/JuceLibraryCode/AppConfig.h
index 1a32ef6..e3caf8c 100644
--- a/headless/JuceLibraryCode/AppConfig.h
+++ b/headless/JuceLibraryCode/AppConfig.h
@@ -20,30 +20,7 @@
// [END_USER_CODE_SECTION]
-/*
- ==============================================================================
-
- In accordance with the terms of the JUCE 6 End-Use License Agreement, the
- JUCE Code in SECTION A cannot be removed, changed or otherwise rendered
- ineffective unless you have a JUCE Indie or Pro license, or are using JUCE
- under the GPL v3 license.
-
- End User License Agreement: www.juce.com/juce-6-licence
-
- ==============================================================================
-*/
-
-// BEGIN SECTION A
-
-#ifndef JUCE_DISPLAY_SPLASH_SCREEN
- #define JUCE_DISPLAY_SPLASH_SCREEN 0
-#endif
-
-// END SECTION A
-
-#define JUCE_USE_DARK_SPLASH_SCREEN 1
-
-#define JUCE_PROJUCER_VERSION 0x60005
+#define JUCE_PROJUCER_VERSION 0x80004
//==============================================================================
#define JUCE_MODULE_AVAILABLE_juce_audio_basics 1
@@ -102,7 +79,7 @@
#endif
#ifndef JUCE_USE_CURL
- #define JUCE_USE_CURL 1
+ #define JUCE_USE_CURL 0
#endif
#ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY
@@ -160,6 +137,6 @@
#if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)
#define JUCE_STANDALONE_APPLICATION JucePlugin_Build_Standalone
#else
- #define JUCE_STANDALONE_APPLICATION 1
+ #define JUCE_STANDALONE_APPLICATION 0
#endif
#endif
diff --git a/headless/JuceLibraryCode/JuceHeader.h b/headless/JuceLibraryCode/JuceHeader.h
index d5144e5..d146b63 100644
--- a/headless/JuceLibraryCode/JuceHeader.h
+++ b/headless/JuceLibraryCode/JuceHeader.h
@@ -26,7 +26,7 @@
/** If you've hit this error then the version of the Projucer that was used to generate this project is
older than the version of the JUCE modules being included. To fix this error, re-save your project
using the latest version of the Projucer or, if you aren't using the Projucer to manage your project,
- remove the JUCE_PROJUCER_VERSION define from the AppConfig.h file.
+ remove the JUCE_PROJUCER_VERSION define.
*/
#error "This project was last saved using an outdated version of the Projucer! Re-save this project with the latest version to fix this error."
#endif
@@ -40,8 +40,8 @@
#if ! JUCE_DONT_DECLARE_PROJECTINFO
namespace ProjectInfo
{
- const char* const projectName = "Vital";
- const char* const companyName = "Matt Tytel";
+ const char* const projectName = "Vita";
+ const char* const companyName = "";
const char* const versionString = "99999.9.9";
const int versionNumber = 0x869f0909;
}
diff --git a/headless/builds/VisualStudio2022/Vita.sln b/headless/builds/VisualStudio2022/Vita.sln
new file mode 100644
index 0000000..5efb03a
--- /dev/null
+++ b/headless/builds/VisualStudio2022/Vita.sln
@@ -0,0 +1,21 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio Version 17
+
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Vita - Dynamic Library", "Vita_DynamicLibrary.vcxproj", "{41660EB1-C0C6-734A-3560-3AAEEFA3048B}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {41660EB1-C0C6-734A-3560-3AAEEFA3048B}.Debug|x64.ActiveCfg = Debug|x64
+ {41660EB1-C0C6-734A-3560-3AAEEFA3048B}.Debug|x64.Build.0 = Debug|x64
+ {41660EB1-C0C6-734A-3560-3AAEEFA3048B}.Release|x64.ActiveCfg = Release|x64
+ {41660EB1-C0C6-734A-3560-3AAEEFA3048B}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/headless/builds/VisualStudio2022/Vita_DynamicLibrary.vcxproj b/headless/builds/VisualStudio2022/Vita_DynamicLibrary.vcxproj
new file mode 100644
index 0000000..b8e629a
--- /dev/null
+++ b/headless/builds/VisualStudio2022/Vita_DynamicLibrary.vcxproj
@@ -0,0 +1,1687 @@
+
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ {41660EB1-C0C6-734A-3560-3AAEEFA3048B}
+
+
+
+ DynamicLibrary
+ false
+ false
+ v143
+ 10.0
+
+
+ DynamicLibrary
+ false
+ true
+ v143
+ 10.0
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ .dll
+ $(SolutionDir)$(Platform)\$(Configuration)\Dynamic Library\
+ $(Platform)\$(Configuration)\Dynamic Library\
+ vita
+ true
+ $(LibraryPath);$(pythonLocation)\libs;..\..\..\third_party\nanobind\build\tests\Debug
+ $(SolutionDir)$(Platform)\$(Configuration)\Dynamic Library\
+ $(Platform)\$(Configuration)\Dynamic Library\
+ vita
+ true
+ $(LibraryPath);$(pythonLocation)\libs;..\..\..\third_party\nanobind\build\tests\Release
+
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+ true
+ true
+ Win32
+
+
+
+ Disabled
+ ProgramDatabase
+ ..\..\JuceLibraryCode;..\..\..\third_party\JUCE\modules;$(pythonLocation)/include;../../../src/common;../../../src/common/wavetable;../../../src/interface/editor_components;../../../src/interface/editor_sections;../../../src/interface/look_and_feel;../../../src/interface/wavetable;../../../src/interface/wavetable/editors;../../../src/interface/wavetable/overlays;../../../src/standalone;../../../src/synthesis/synth_engine;../../../src/synthesis/effects;../../../src/synthesis/filters;../../../src/synthesis/framework;../../../src/synthesis/lookups;../../../src/synthesis/modulators;../../../src/synthesis/modules;../../../src/synthesis/producers;../../../src/synthesis/utilities;../../../third_party;../../../third_party/nanobind/include;%(AdditionalIncludeDirectories)
+ _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;HEADLESS=1;NO_AUTH=1;__SSE2__;JUCER_VS2022_4DBD785E=1;JUCE_APP_VERSION=99999.9.9;JUCE_APP_VERSION_HEX=0x869f0909;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;_LIB;%(PreprocessorDefinitions)
+ MultiThreadedDebugDLL
+ true
+ NotUsing
+ $(IntDir)\
+ $(IntDir)\
+ $(IntDir)\vita.pdb
+ Level4
+ true
+ true
+ stdcpp17
+
+
+ ..\..\JuceLibraryCode;..\..\..\third_party\JUCE\modules;$(pythonLocation)/include;../../../src/common;../../../src/common/wavetable;../../../src/interface/editor_components;../../../src/interface/editor_sections;../../../src/interface/look_and_feel;../../../src/interface/wavetable;../../../src/interface/wavetable/editors;../../../src/interface/wavetable/overlays;../../../src/standalone;../../../src/synthesis/synth_engine;../../../src/synthesis/effects;../../../src/synthesis/filters;../../../src/synthesis/framework;../../../src/synthesis/lookups;../../../src/synthesis/modulators;../../../src/synthesis/modules;../../../src/synthesis/producers;../../../src/synthesis/utilities;../../../third_party;../../../third_party/nanobind/include;%(AdditionalIncludeDirectories)
+ _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;HEADLESS=1;NO_AUTH=1;__SSE2__;JUCER_VS2022_4DBD785E=1;JUCE_APP_VERSION=99999.9.9;JUCE_APP_VERSION_HEX=0x869f0909;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;_LIB;%(PreprocessorDefinitions)
+
+
+ $(OutDir)\vita.dll
+ true
+ libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries)
+ true
+ $(IntDir)\vita.pdb
+ Windows
+ $(pythonLocation)\libs;..\..\..\third_party\nanobind\build\tests\Debug;%(AdditionalLibraryDirectories)
+ true
+ nanobind-static.lib;%(AdditionalDependencies)
+
+
+ true
+ $(IntDir)\vita.bsc
+
+
+ nanobind-static.lib;%(AdditionalDependencies)
+ $(pythonLocation)\libs;..\..\..\third_party\nanobind\build\tests\Debug;%(AdditionalLibraryDirectories)
+
+
+ copy "x64\Debug\Dynamic Library\vita.dll" "$(pythonLocation)\vita.pyd";
+
+
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+ true
+ true
+ Win32
+
+
+
+ Full
+ ..\..\JuceLibraryCode;..\..\..\third_party\JUCE\modules;$(pythonLocation)/include;../../../src/common;../../../src/common/wavetable;../../../src/interface/editor_components;../../../src/interface/editor_sections;../../../src/interface/look_and_feel;../../../src/interface/wavetable;../../../src/interface/wavetable/editors;../../../src/interface/wavetable/overlays;../../../src/standalone;../../../src/synthesis/synth_engine;../../../src/synthesis/effects;../../../src/synthesis/filters;../../../src/synthesis/framework;../../../src/synthesis/lookups;../../../src/synthesis/modulators;../../../src/synthesis/modules;../../../src/synthesis/producers;../../../src/synthesis/utilities;../../../third_party;../../../third_party/nanobind/include;%(AdditionalIncludeDirectories)
+ _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;HEADLESS=1;NO_AUTH=1;__SSE2__;JUCER_VS2022_4DBD785E=1;JUCE_APP_VERSION=99999.9.9;JUCE_APP_VERSION_HEX=0x869f0909;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;_LIB;%(PreprocessorDefinitions)
+ MultiThreadedDLL
+ true
+ NotUsing
+ $(IntDir)\
+ $(IntDir)\
+ $(IntDir)\vita.pdb
+ Level4
+ true
+ true
+ stdcpp17
+
+
+ ..\..\JuceLibraryCode;..\..\..\third_party\JUCE\modules;$(pythonLocation)/include;../../../src/common;../../../src/common/wavetable;../../../src/interface/editor_components;../../../src/interface/editor_sections;../../../src/interface/look_and_feel;../../../src/interface/wavetable;../../../src/interface/wavetable/editors;../../../src/interface/wavetable/overlays;../../../src/standalone;../../../src/synthesis/synth_engine;../../../src/synthesis/effects;../../../src/synthesis/filters;../../../src/synthesis/framework;../../../src/synthesis/lookups;../../../src/synthesis/modulators;../../../src/synthesis/modules;../../../src/synthesis/producers;../../../src/synthesis/utilities;../../../third_party;../../../third_party/nanobind/include;%(AdditionalIncludeDirectories)
+ _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;HEADLESS=1;NO_AUTH=1;__SSE2__;JUCER_VS2022_4DBD785E=1;JUCE_APP_VERSION=99999.9.9;JUCE_APP_VERSION_HEX=0x869f0909;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;_LIB;%(PreprocessorDefinitions)
+
+
+ $(OutDir)\vita.dll
+ true
+ %(IgnoreSpecificDefaultLibraries)
+ false
+ $(IntDir)\vita.pdb
+ Windows
+ true
+ true
+ $(pythonLocation)\libs;..\..\..\third_party\nanobind\build\tests\Release;%(AdditionalLibraryDirectories)
+ true
+ UseLinkTimeCodeGeneration
+ nanobind-static.lib;%(AdditionalDependencies)
+
+
+ true
+ $(IntDir)\vita.bsc
+
+
+ nanobind-static.lib;%(AdditionalDependencies)
+ $(pythonLocation)\libs;..\..\..\third_party\nanobind\build\tests\Release;%(AdditionalLibraryDirectories)
+
+
+ copy "x64\Release\Dynamic Library\vita.dll" "$(pythonLocation)\vita.pyd";
+
+
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ 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)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/headless/builds/VisualStudio2022/Vita_DynamicLibrary.vcxproj.filters b/headless/builds/VisualStudio2022/Vita_DynamicLibrary.vcxproj.filters
new file mode 100644
index 0000000..fe826de
--- /dev/null
+++ b/headless/builds/VisualStudio2022/Vita_DynamicLibrary.vcxproj.filters
@@ -0,0 +1,2765 @@
+
+
+
+
+
+ {4CD52E01-FBB3-304C-19ED-164ABB1B97D6}
+
+
+ {2AC61782-7790-17EE-3F52-7328A7A749E2}
+
+
+ {CF0682CE-0216-2744-2D69-647F50EAA2EC}
+
+
+ {630C932C-21AB-53FF-1096-A3BB0A937C6A}
+
+
+ {20AD5EBE-4CCE-3AE1-5859-EB3B4AE0E1E9}
+
+
+ {B9D151CF-20AF-F5CC-68EB-B781C6FB3067}
+
+
+ {F659C53E-B82E-F847-914A-3ECCD15EF040}
+
+
+ {5416D0B7-6A9F-838A-BD98-885F6B569E42}
+
+
+ {9319730C-374F-1A38-C4F8-A40F1A5E4DDD}
+
+
+ {D2F3C111-A961-2C00-B386-3CCB1574CAE9}
+
+
+ {5137BA6D-0D5C-58B8-7099-2CB375FFB2B4}
+
+
+ {E7E24610-1B63-5A05-9028-7CEFDED16EAD}
+
+
+ {091E6078-EA29-856A-5251-3A1375D2A382}
+
+
+ {75F855D2-E300-5A4B-A4E9-CC4A78E802BE}
+
+
+ {217B5B23-32CC-A045-9FC7-4961A2D06756}
+
+
+ {EB58F05A-A968-CEBE-40C4-107CDD8F240F}
+
+
+ {5FCF559E-451A-CB1E-B177-A5DC5A0005BB}
+
+
+ {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}
+
+
+ {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}
+
+
+ {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}
+
+
+ {53CF03D3-988B-CD28-9130-CE08FDCEF7E9}
+
+
+ {29C6FE02-507E-F3FE-16CD-74D84842C1EA}
+
+
+ {8001BD68-125B-E392-8D3B-1F9C9520A65A}
+
+
+ {EDC17061-CFA0-8EA0-0ADA-90F31C2FB0F2}
+
+
+ {B813BD14-6565-2525-9AC3-E3AA48EDDA85}
+
+
+ {DDF4BA73-8578-406D-21F8-06B9BC70BFEA}
+
+
+ {73374573-0194-9A6E-461A-A81EEB511C26}
+
+
+ {5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E}
+
+
+ {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}
+
+
+ {FE955B6B-68AC-AA07-70D8-2413F6DB65C8}
+
+
+ {7ED5A90E-41AF-A1EF-659B-37CEEAB9BA61}
+
+
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\headless
+
+
+ Vita\src\headless
+
+
+ Vita\src\synthesis\effects
+
+
+ Vita\src\synthesis\effects
+
+
+ Vita\src\synthesis\effects
+
+
+ Vita\src\synthesis\effects
+
+
+ Vita\src\synthesis\effects
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\lookups
+
+
+ Vita\src\synthesis\lookups
+
+
+ Vita\src\synthesis\modulators
+
+
+ Vita\src\synthesis\modulators
+
+
+ Vita\src\synthesis\modulators
+
+
+ Vita\src\synthesis\modulators
+
+
+ Vita\src\synthesis\modulators
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\producers
+
+
+ Vita\src\synthesis\producers
+
+
+ Vita\src\synthesis\utilities
+
+
+ Vita\src\synthesis\utilities
+
+
+ Vita\src\synthesis\utilities
+
+
+ Vita\src\synthesis\utilities
+
+
+ Vita\src\synthesis\utilities
+
+
+ Vita\src\unity_build
+
+
+ Vita\src\unity_build
+
+
+ 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
+
+
+ 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
+
+
+ JUCE Modules\juce_audio_basics
+
+
+ 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\sampler
+
+
+ JUCE Modules\juce_audio_formats
+
+
+ JUCE Modules\juce_audio_formats
+
+
+ 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\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\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_dsp\containers
+
+
+ JUCE Modules\juce_dsp\containers
+
+
+ JUCE Modules\juce_dsp\containers
+
+
+ JUCE Modules\juce_dsp\filter_design
+
+
+ JUCE Modules\juce_dsp\frequency
+
+
+ JUCE Modules\juce_dsp\frequency
+
+
+ JUCE Modules\juce_dsp\frequency
+
+
+ JUCE Modules\juce_dsp\frequency
+
+
+ JUCE Modules\juce_dsp\frequency
+
+
+ JUCE Modules\juce_dsp\maths
+
+
+ JUCE Modules\juce_dsp\maths
+
+
+ JUCE Modules\juce_dsp\maths
+
+
+ JUCE Modules\juce_dsp\maths
+
+
+ JUCE Modules\juce_dsp\maths
+
+
+ JUCE Modules\juce_dsp\native
+
+
+ JUCE Modules\juce_dsp\native
+
+
+ JUCE Modules\juce_dsp\native
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp
+
+
+ JUCE Modules\juce_dsp
+
+
+ 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\timers
+
+
+ JUCE Modules\juce_events\timers
+
+
+ JUCE Modules\juce_events
+
+
+ JUCE Modules\juce_events
+
+
+ JUCE Library Code
+
+
+ JUCE Library Code
+
+
+ JUCE Library Code
+
+
+ JUCE Library Code
+
+
+ JUCE Library Code
+
+
+ JUCE Library Code
+
+
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common\wavetable
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\common
+
+
+ Vita\src\synthesis\effects
+
+
+ Vita\src\synthesis\effects
+
+
+ Vita\src\synthesis\effects
+
+
+ Vita\src\synthesis\effects
+
+
+ Vita\src\synthesis\effects
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\filters
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\framework
+
+
+ Vita\src\synthesis\lookups
+
+
+ Vita\src\synthesis\lookups
+
+
+ Vita\src\synthesis\lookups
+
+
+ Vita\src\synthesis\lookups
+
+
+ Vita\src\synthesis\modulators
+
+
+ Vita\src\synthesis\modulators
+
+
+ Vita\src\synthesis\modulators
+
+
+ Vita\src\synthesis\modulators
+
+
+ Vita\src\synthesis\modulators
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\modules
+
+
+ Vita\src\synthesis\producers
+
+
+ Vita\src\synthesis\producers
+
+
+ Vita\src\synthesis\utilities
+
+
+ Vita\src\synthesis\utilities
+
+
+ Vita\src\synthesis\utilities
+
+
+ Vita\src\synthesis\utilities
+
+
+ Vita\src\synthesis\utilities
+
+
+ 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
+
+
+ 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\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_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\sampler
+
+
+ JUCE Modules\juce_audio_formats
+
+
+ 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\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\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\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\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_dsp\containers
+
+
+ JUCE Modules\juce_dsp\containers
+
+
+ JUCE Modules\juce_dsp\containers
+
+
+ JUCE Modules\juce_dsp\containers
+
+
+ JUCE Modules\juce_dsp\filter_design
+
+
+ JUCE Modules\juce_dsp\frequency
+
+
+ JUCE Modules\juce_dsp\frequency
+
+
+ JUCE Modules\juce_dsp\frequency
+
+
+ JUCE Modules\juce_dsp\maths
+
+
+ JUCE Modules\juce_dsp\maths
+
+
+ JUCE Modules\juce_dsp\maths
+
+
+ JUCE Modules\juce_dsp\maths
+
+
+ JUCE Modules\juce_dsp\maths
+
+
+ JUCE Modules\juce_dsp\maths
+
+
+ JUCE Modules\juce_dsp\maths
+
+
+ JUCE Modules\juce_dsp\native
+
+
+ JUCE Modules\juce_dsp\native
+
+
+ JUCE Modules\juce_dsp\native
+
+
+ JUCE Modules\juce_dsp\native
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\processors
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp\widgets
+
+
+ JUCE Modules\juce_dsp
+
+
+ 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\timers
+
+
+ JUCE Modules\juce_events\timers
+
+
+ JUCE Modules\juce_events
+
+
+ JUCE Library Code
+
+
+ JUCE Library Code
+
+
+
+
+ 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_core\native\java
+
+
+
+
+ JUCE Library Code
+
+
+
diff --git a/headless/builds/VisualStudio2022/resources.rc b/headless/builds/VisualStudio2022/resources.rc
new file mode 100644
index 0000000..31aba90
--- /dev/null
+++ b/headless/builds/VisualStudio2022/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 99999,9,9,0
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+ VALUE "FileDescription", "Vita\0"
+ VALUE "FileVersion", "99999.9.9\0"
+ VALUE "ProductName", "Vita\0"
+ VALUE "ProductVersion", "99999.9.9\0"
+ END
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
+
+#endif
diff --git a/headless/builds/linux/Makefile b/headless/builds/linux/Makefile
index 99e4ded..db836f7 100644
--- a/headless/builds/linux/Makefile
+++ b/headless/builds/linux/Makefile
@@ -11,6 +11,10 @@ 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
@@ -35,15 +39,17 @@ ifeq ($(CONFIG),Debug)
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DBUILD_DATE=$(BUILD_DATE)" "-DJUCE_JACK_CLIENT_NAME=\"Vital\"" "-DJUCE_ALSA_MIDI_INPUT_NAME=\"Vital\"" "-DJUCE_ALSA_MIDI_OUTPUT_NAME=\"Vital\"" "-DJUCE_USE_XRANDR=0" "-DJUCE_DSP_USE_SHARED_FFTW=1" "-DHEADLESS=1" "-DNO_AUTH=1" "-DJUCER_LINUX_MAKE_6B3E762A=1" "-DJUCE_APP_VERSION=99999.9.9" "-DJUCE_APP_VERSION_HEX=0x869f0909" $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../third_party/JUCE/modules -I../../../src/common -I../../../src/common/wavetable -I../../../src/interface/editor_components -I../../../src/interface/editor_sections -I../../../src/interface/look_and_feel -I../../../src/interface/wavetable -I../../../src/interface/wavetable/editors -I../../../src/interface/wavetable/overlays -I../../../src/standalone -I../../../src/synthesis/synth_engine -I../../../src/synthesis/effects -I../../../src/synthesis/filters -I../../../src/synthesis/framework -I../../../src/synthesis/lookups -I../../../src/synthesis/modulators -I../../../src/synthesis/modules -I../../../src/synthesis/producers -I../../../src/synthesis/utilities -I../../../third_party $(CPPFLAGS)
- JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
- JUCE_TARGET_APP := vital
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DBUILD_DATE=$(BUILD_DATE)" "-DJUCE_JACK_CLIENT_NAME=\"Vita\"" "-DJUCE_ALSA_MIDI_INPUT_NAME=\"Vita\"" "-DJUCE_ALSA_MIDI_OUTPUT_NAME=\"Vita\"" "-DJUCE_USE_XRANDR=0" "-DJUCE_DSP_USE_SHARED_FFTW=1" "-DHEADLESS=1" "-DNO_AUTH=1" "-DJUCER_LINUX_MAKE_6B3E762A=1" "-DJUCE_APP_VERSION=99999.9.9" "-DJUCE_APP_VERSION_HEX=0x869f0909" -pthread -I../../JuceLibraryCode -I../../../third_party/JUCE/modules -I../../../src/common -I../../../src/common/wavetable -I../../../src/interface/editor_components -I../../../src/interface/editor_sections -I../../../src/interface/look_and_feel -I../../../src/interface/wavetable -I../../../src/interface/wavetable/editors -I../../../src/interface/wavetable/overlays -I../../../src/standalone -I../../../src/synthesis/synth_engine -I../../../src/synthesis/effects -I../../../src/synthesis/filters -I../../../src/synthesis/framework -I../../../src/synthesis/lookups -I../../../src/synthesis/modulators -I../../../src/synthesis/modules -I../../../src/synthesis/producers -I../../../src/synthesis/utilities -I../../../third_party -I../../../third_party/nanobind/include $(CPPFLAGS)
+ JUCE_CPPFLAGS_DYNAMIC_LIBRARY := "-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_CFLAGS_DYNAMIC_LIBRARY := -fPIC -fvisibility=hidden
+ JUCE_LDFLAGS_DYNAMIC_LIBRARY := -shared
+ JUCE_TARGET_DYNAMIC_LIBRARY := libvita.so
- JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 -ffast-math ${SIMDFLAGS} ${GLFLAGS} -ftree-vectorize -ftree-slp-vectorize -funroll-loops $(CFLAGS)
- JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs libcurl) -fvisibility=hidden -ffast-math ${SIMDFLAGS} ${GLFLAGS} -ftree-vectorize -ftree-slp-vectorize -lcurl -lrt -ldl -lpthread $(LDFLAGS)
+ JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -fPIC -g -ggdb -O0 -ffast-math ${SIMDFLAGS} ${GLFLAGS} -ftree-vectorize -ftree-slp-vectorize -funroll-loops -fPIC $(CFLAGS)
+ JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++17 $(CXXFLAGS)
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ -L../../../third_party/nanobind/build/tests -fvisibility=hidden -ffast-math ${SIMDFLAGS} ${GLFLAGS} -ftree-vectorize -ftree-slp-vectorize -lrt -ldl -lpthread -lnanobind-static $(LDFLAGS)
- CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)
+ CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(JUCE_TARGET_DYNAMIC_LIBRARY) $(JUCE_OBJDIR)
endif
ifeq ($(CONFIG),Release)
@@ -56,19 +62,21 @@ ifeq ($(CONFIG),Release)
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DBUILD_DATE=$(BUILD_DATE)" "-DJUCE_JACK_CLIENT_NAME=\"Vital\"" "-DJUCE_ALSA_MIDI_INPUT_NAME=\"Vital\"" "-DJUCE_ALSA_MIDI_OUTPUT_NAME=\"Vital\"" "-DJUCE_USE_XRANDR=0" "-DJUCE_DSP_USE_SHARED_FFTW=1" "-DHEADLESS=1" "-DNO_AUTH=1" "-DJUCER_LINUX_MAKE_6B3E762A=1" "-DJUCE_APP_VERSION=99999.9.9" "-DJUCE_APP_VERSION_HEX=0x869f0909" $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../third_party/JUCE/modules -I../../../src/common -I../../../src/common/wavetable -I../../../src/interface/editor_components -I../../../src/interface/editor_sections -I../../../src/interface/look_and_feel -I../../../src/interface/wavetable -I../../../src/interface/wavetable/editors -I../../../src/interface/wavetable/overlays -I../../../src/standalone -I../../../src/synthesis/synth_engine -I../../../src/synthesis/effects -I../../../src/synthesis/filters -I../../../src/synthesis/framework -I../../../src/synthesis/lookups -I../../../src/synthesis/modulators -I../../../src/synthesis/modules -I../../../src/synthesis/producers -I../../../src/synthesis/utilities -I../../../third_party $(CPPFLAGS)
- JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
- JUCE_TARGET_APP := vital
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DBUILD_DATE=$(BUILD_DATE)" "-DJUCE_JACK_CLIENT_NAME=\"Vita\"" "-DJUCE_ALSA_MIDI_INPUT_NAME=\"Vita\"" "-DJUCE_ALSA_MIDI_OUTPUT_NAME=\"Vita\"" "-DJUCE_USE_XRANDR=0" "-DJUCE_DSP_USE_SHARED_FFTW=1" "-DHEADLESS=1" "-DNO_AUTH=1" "-DJUCER_LINUX_MAKE_6B3E762A=1" "-DJUCE_APP_VERSION=99999.9.9" "-DJUCE_APP_VERSION_HEX=0x869f0909" -pthread -I../../JuceLibraryCode -I../../../third_party/JUCE/modules -I../../../src/common -I../../../src/common/wavetable -I../../../src/interface/editor_components -I../../../src/interface/editor_sections -I../../../src/interface/look_and_feel -I../../../src/interface/wavetable -I../../../src/interface/wavetable/editors -I../../../src/interface/wavetable/overlays -I../../../src/standalone -I../../../src/synthesis/synth_engine -I../../../src/synthesis/effects -I../../../src/synthesis/filters -I../../../src/synthesis/framework -I../../../src/synthesis/lookups -I../../../src/synthesis/modulators -I../../../src/synthesis/modules -I../../../src/synthesis/producers -I../../../src/synthesis/utilities -I../../../third_party -I../../../third_party/nanobind/include $(CPPFLAGS)
+ JUCE_CPPFLAGS_DYNAMIC_LIBRARY := "-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_CFLAGS_DYNAMIC_LIBRARY := -fPIC -fvisibility=hidden
+ JUCE_LDFLAGS_DYNAMIC_LIBRARY := -shared
+ JUCE_TARGET_DYNAMIC_LIBRARY := libvita.so
- JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -Ofast -flto -ffast-math ${SIMDFLAGS} ${GLFLAGS} -ftree-vectorize -ftree-slp-vectorize -funroll-loops $(CFLAGS)
- JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs libcurl) -fvisibility=hidden -flto -ffast-math ${SIMDFLAGS} ${GLFLAGS} -ftree-vectorize -ftree-slp-vectorize -lcurl -lrt -ldl -lpthread $(LDFLAGS)
+ JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -fPIC -Ofast -flto -ffast-math ${SIMDFLAGS} ${GLFLAGS} -ftree-vectorize -ftree-slp-vectorize -funroll-loops -fPIC $(CFLAGS)
+ JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++17 $(CXXFLAGS)
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ -L../../../third_party/nanobind/build/tests -fvisibility=hidden -flto -ffast-math ${SIMDFLAGS} ${GLFLAGS} -ftree-vectorize -ftree-slp-vectorize -lrt -ldl -lpthread -lnanobind-static $(LDFLAGS)
- CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)
+ CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(JUCE_TARGET_DYNAMIC_LIBRARY) $(JUCE_OBJDIR)
endif
-OBJECTS_APP := \
- $(JUCE_OBJDIR)/main_f0db04ea.o \
+OBJECTS_DYNAMIC_LIBRARY := \
+ $(JUCE_OBJDIR)/bindings_c58fd13f.o \
$(JUCE_OBJDIR)/common_24cbed85.o \
$(JUCE_OBJDIR)/synthesis_1ee447c4.o \
$(JUCE_OBJDIR)/include_juce_audio_basics_8a4e984a.o \
@@ -80,68 +88,76 @@ OBJECTS_APP := \
.PHONY: clean all strip
-all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)
+all : $(JUCE_OUTDIR)/$(JUCE_TARGET_DYNAMIC_LIBRARY)
-$(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 libcurl
- @echo Linking "Vital - App"
+$(JUCE_OUTDIR)/$(JUCE_TARGET_DYNAMIC_LIBRARY) : $(OBJECTS_DYNAMIC_LIBRARY) $(JUCE_OBJDIR)/execinfo.cmd $(RESOURCES)
+ @echo Linking "Vita - Dynamic Library"
-$(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)
+ $(V_AT)$(CXX) -o $(JUCE_OUTDIR)/$(JUCE_TARGET_DYNAMIC_LIBRARY) $(OBJECTS_DYNAMIC_LIBRARY) $(JUCE_LDFLAGS) $(shell cat $(JUCE_OBJDIR)/execinfo.cmd) $(JUCE_LDFLAGS_DYNAMIC_LIBRARY) $(RESOURCES) $(TARGET_ARCH)
-$(JUCE_OBJDIR)/main_f0db04ea.o: ../../../src/headless/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)/bindings_c58fd13f.o: ../../../src/headless/bindings.cpp
+ -$(V_AT)mkdir -p $(@D)
+ @echo "Compiling bindings.cpp"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_DYNAMIC_LIBRARY) $(JUCE_CFLAGS_DYNAMIC_LIBRARY) -o "$@" -c "$<"
$(JUCE_OBJDIR)/common_24cbed85.o: ../../../src/unity_build/common.cpp
- -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ -$(V_AT)mkdir -p $(@D)
@echo "Compiling common.cpp"
- $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_DYNAMIC_LIBRARY) $(JUCE_CFLAGS_DYNAMIC_LIBRARY) -o "$@" -c "$<"
$(JUCE_OBJDIR)/synthesis_1ee447c4.o: ../../../src/unity_build/synthesis.cpp
- -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ -$(V_AT)mkdir -p $(@D)
@echo "Compiling synthesis.cpp"
- $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_DYNAMIC_LIBRARY) $(JUCE_CFLAGS_DYNAMIC_LIBRARY) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_audio_basics_8a4e984a.o: ../../JuceLibraryCode/include_juce_audio_basics.cpp
- -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ -$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_audio_basics.cpp"
- $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_DYNAMIC_LIBRARY) $(JUCE_CFLAGS_DYNAMIC_LIBRARY) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o: ../../JuceLibraryCode/include_juce_audio_formats.cpp
- -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ -$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_audio_formats.cpp"
- $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_DYNAMIC_LIBRARY) $(JUCE_CFLAGS_DYNAMIC_LIBRARY) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_core_f26d17db.o: ../../JuceLibraryCode/include_juce_core.cpp
- -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ -$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_core.cpp"
- $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_DYNAMIC_LIBRARY) $(JUCE_CFLAGS_DYNAMIC_LIBRARY) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_data_structures_7471b1e3.o: ../../JuceLibraryCode/include_juce_data_structures.cpp
- -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ -$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_data_structures.cpp"
- $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_DYNAMIC_LIBRARY) $(JUCE_CFLAGS_DYNAMIC_LIBRARY) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_dsp_aeb2060f.o: ../../JuceLibraryCode/include_juce_dsp.cpp
- -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ -$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_dsp.cpp"
- $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_DYNAMIC_LIBRARY) $(JUCE_CFLAGS_DYNAMIC_LIBRARY) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_events_fd7d695.o: ../../JuceLibraryCode/include_juce_events.cpp
- -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ -$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_events.cpp"
- $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_DYNAMIC_LIBRARY) $(JUCE_CFLAGS_DYNAMIC_LIBRARY) -o "$@" -c "$<"
+
+$(JUCE_OBJDIR)/execinfo.cmd:
+ -$(V_AT)mkdir -p $(@D)
+ -@if [ -z "$(V_AT)" ]; then echo "Checking if we need to link libexecinfo"; fi
+ $(V_AT)printf "int main() { return 0; }" | $(CXX) -x c++ -o $(@D)/execinfo.x -lexecinfo - >/dev/null 2>&1 && printf -- "-lexecinfo" > "$@" || touch "$@"
+
+$(JUCE_OBJDIR)/cxxfs.cmd:
+ -$(V_AT)mkdir -p $(@D)
+ -@if [ -z "$(V_AT)" ]; then echo "Checking if we need to link stdc++fs"; fi
+ $(V_AT)printf "int main() { return 0; }" | $(CXX) -x c++ -o $(@D)/cxxfs.x -lstdc++fs - >/dev/null 2>&1 && printf -- "-lstdc++fs" > "$@" || touch "$@"
clean:
- @echo Cleaning Vital
+ @echo Cleaning Vita
$(V_AT)$(CLEANCMD)
strip:
- @echo Stripping Vital
- -$(V_AT)$(STRIP) --strip-unneeded $(JUCE_OUTDIR)/$(TARGET)
+ @echo Stripping Vita
+ -$(V_AT)$(STRIP) --strip-unneeded $(JUCE_OUTDIR)/$(JUCE_TARGET_DYNAMIC_LIBRARY)
--include $(OBJECTS_APP:%.o=%.d)
+-include $(OBJECTS_DYNAMIC_LIBRARY:%.o=%.d)
diff --git a/headless/builds/osx/Vita.xcodeproj/project.pbxproj b/headless/builds/osx/Vita.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..66f8ad9
--- /dev/null
+++ b/headless/builds/osx/Vita.xcodeproj/project.pbxproj
@@ -0,0 +1,1001 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0C3BFC7DBEA7B14713E49772 /* IOKit.framework */ = {isa = PBXBuildFile; fileRef = 72E03A78D80650173EA0CA1E; };
+ 1D38713E044E4966AD971F06 /* RecentFilesMenuTemplate.nib */ = {isa = PBXBuildFile; fileRef = C4C772D9C3F472259A2210E3; };
+ 20169C80427D9D5214FDBED5 /* include_juce_dsp.mm */ = {isa = PBXBuildFile; fileRef = B353A80BF55BDA9DC00631B9; };
+ 293F7694B7C33204D09D2191 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = 151FC9EEA4B744DACDB42CC0; };
+ 3174D9720114D8A4520BA60B /* CoreMIDI.framework */ = {isa = PBXBuildFile; fileRef = 6C33D4AA95D3CE36C5FB875A; };
+ 40DB5EBCF2594A9514167E9C /* include_juce_core.mm */ = {isa = PBXBuildFile; fileRef = F8E035506B4257624F2AE9D2; };
+ 467CC0084730F18E04AA4E90 /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = 5677A18F3721228155DE5893; };
+ 5049560055EDA9EC3DD36178 /* bindings.cpp */ = {isa = PBXBuildFile; fileRef = 0E48CA7AAEFE35D9A1D169AA; };
+ 6648E3304493CE6F4A77F814 /* common.cpp */ = {isa = PBXBuildFile; fileRef = D29839FD9D798968891B1645; };
+ 9742BF4DD8C91343C3278747 /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 960B92C3C44FA4F1846C6985; };
+ 9973331B571A72B7F6DB5B14 /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = E26755374577FFB5E707A9F5; };
+ 999D73CBF2FF2D4FC0532C59 /* CoreAudio.framework */ = {isa = PBXBuildFile; fileRef = 2B5EF20D0BE840557CE1160D; };
+ AA326DFAC7E3A606439D0B5E /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 399573306D5863E703547480; };
+ ABBF69F3CCC630DB34EFB83B /* synthesis.cpp */ = {isa = PBXBuildFile; fileRef = 6041A9C77D57EF87FBDF4C46; };
+ B0056FE606707EBBED0D5895 /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 85DC44CAD92B20F1C8E6B28D; };
+ CBDEF0B7ACD825C1ACFC3687 /* QuartzCore.framework */ = {isa = PBXBuildFile; fileRef = EA170B8B6946E4F4B51585CC; };
+ D9B3CB93D9D920AA5FF6FC2A /* Dynamic Library */ = {isa = PBXBuildFile; fileRef = 5D399CECFA881A128860CF82; };
+ E37ACD5E5421E480AE2C9DF6 /* include_juce_audio_formats.mm */ = {isa = PBXBuildFile; fileRef = 5D5ED2636412E0A240088B97; };
+ F0D572BBDDE3E1941291482F /* Cocoa.framework */ = {isa = PBXBuildFile; fileRef = 8D0FFA8F5E1C6730D9A5E2AA; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 0005F194EED9FBFCC430D31F /* wave_source.cpp */ /* wave_source.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wave_source.cpp; path = ../../../src/common/wavetable/wave_source.cpp; sourceTree = SOURCE_ROOT; };
+ 0229A4F7B30927BFB27FF116 /* sample_source.h */ /* sample_source.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sample_source.h; path = ../../../src/synthesis/producers/sample_source.h; sourceTree = SOURCE_ROOT; };
+ 026B14D7F898B13DFF5995B3 /* synth_constants.h */ /* synth_constants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = synth_constants.h; path = ../../../src/common/synth_constants.h; sourceTree = SOURCE_ROOT; };
+ 027DC9E907D41AB65ED41A19 /* distortion_module.h */ /* distortion_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = distortion_module.h; path = ../../../src/synthesis/modules/distortion_module.h; sourceTree = SOURCE_ROOT; };
+ 041BEB88DA227F6FD6010E21 /* comb_filter.h */ /* comb_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = comb_filter.h; path = ../../../src/synthesis/filters/comb_filter.h; sourceTree = SOURCE_ROOT; };
+ 06CE1616CB7CCAF571D22284 /* reverb_module.h */ /* reverb_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = reverb_module.h; path = ../../../src/synthesis/modules/reverb_module.h; sourceTree = SOURCE_ROOT; };
+ 0D69DABA32F1C6C06701E978 /* distortion.cpp */ /* distortion.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = distortion.cpp; path = ../../../src/synthesis/effects/distortion.cpp; sourceTree = SOURCE_ROOT; };
+ 0D8C00B71C8E1132F95B5A08 /* smooth_value.cpp */ /* smooth_value.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = smooth_value.cpp; path = ../../../src/synthesis/utilities/smooth_value.cpp; sourceTree = SOURCE_ROOT; };
+ 0E48CA7AAEFE35D9A1D169AA /* bindings.cpp */ /* bindings.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = bindings.cpp; path = ../../../src/headless/bindings.cpp; sourceTree = SOURCE_ROOT; };
+ 0F1B29C31A277E6BB55D535B /* wavetable_group.cpp */ /* wavetable_group.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wavetable_group.cpp; path = ../../../src/common/wavetable/wavetable_group.cpp; sourceTree = SOURCE_ROOT; };
+ 0FCCB2C421909685A85FCE92 /* linkwitz_riley_filter.cpp */ /* linkwitz_riley_filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = linkwitz_riley_filter.cpp; path = ../../../src/synthesis/filters/linkwitz_riley_filter.cpp; sourceTree = SOURCE_ROOT; };
+ 11A2FA52D15D54B47378BFCB /* border_bounds_constrainer.cpp */ /* border_bounds_constrainer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = border_bounds_constrainer.cpp; path = ../../../src/common/border_bounds_constrainer.cpp; sourceTree = SOURCE_ROOT; };
+ 1486262161F4FEFB7CFE23C3 /* ladder_filter.h */ /* ladder_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ladder_filter.h; path = ../../../src/synthesis/filters/ladder_filter.h; sourceTree = SOURCE_ROOT; };
+ 151FC9EEA4B744DACDB42CC0 /* Foundation.framework */ /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 15AAA1ACF5A84443DE6A8C65 /* trigger_random.cpp */ /* trigger_random.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = trigger_random.cpp; path = ../../../src/synthesis/modulators/trigger_random.cpp; sourceTree = SOURCE_ROOT; };
+ 16CE62C4EA921F92531CD038 /* synth_oscillator.h */ /* synth_oscillator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = synth_oscillator.h; path = ../../../src/synthesis/producers/synth_oscillator.h; sourceTree = SOURCE_ROOT; };
+ 180F7E8DE8D231336DE6C106 /* compressor.cpp */ /* compressor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = compressor.cpp; path = ../../../src/synthesis/effects/compressor.cpp; sourceTree = SOURCE_ROOT; };
+ 18CFC8CF695AF8D867DFF71E /* frequency_filter_modifier.h */ /* frequency_filter_modifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = frequency_filter_modifier.h; path = ../../../src/common/wavetable/frequency_filter_modifier.h; sourceTree = SOURCE_ROOT; };
+ 1908D634F0667AE39D808E42 /* dc_filter.cpp */ /* dc_filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = dc_filter.cpp; path = ../../../src/synthesis/filters/dc_filter.cpp; sourceTree = SOURCE_ROOT; };
+ 1D2AC22DCF3EC1E94B0EC157 /* modulation_connection_processor.cpp */ /* modulation_connection_processor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = modulation_connection_processor.cpp; path = ../../../src/synthesis/modules/modulation_connection_processor.cpp; sourceTree = SOURCE_ROOT; };
+ 1ECE119271F8DBB4B472CEDC /* phaser_filter.h */ /* phaser_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = phaser_filter.h; path = ../../../src/synthesis/filters/phaser_filter.h; sourceTree = SOURCE_ROOT; };
+ 1FB8F41C7E6443B77B20D58E /* file_source.h */ /* file_source.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = file_source.h; path = ../../../src/common/wavetable/file_source.h; sourceTree = SOURCE_ROOT; };
+ 222B0210054AE2788B85543A /* lfo_module.cpp */ /* lfo_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = lfo_module.cpp; path = ../../../src/synthesis/modules/lfo_module.cpp; sourceTree = SOURCE_ROOT; };
+ 2447DD05D3E85277371C3DDC /* formant_module.h */ /* formant_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = formant_module.h; path = ../../../src/synthesis/modules/formant_module.h; sourceTree = SOURCE_ROOT; };
+ 247AF363F7BB6F07F42B3250 /* juce_audio_basics */ /* juce_audio_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_basics; path = ../../../third_party/JUCE/modules/juce_audio_basics; sourceTree = SOURCE_ROOT; };
+ 255F09B020C78BC53F0590F7 /* filters_module.cpp */ /* filters_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = filters_module.cpp; path = ../../../src/synthesis/modules/filters_module.cpp; sourceTree = SOURCE_ROOT; };
+ 27BF9E58229A475FCDBB75EC /* pitch_detector.h */ /* pitch_detector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pitch_detector.h; path = ../../../src/common/wavetable/pitch_detector.h; sourceTree = SOURCE_ROOT; };
+ 28B417B92CD8580382F1EEA6 /* formant_filter.h */ /* formant_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = formant_filter.h; path = ../../../src/synthesis/filters/formant_filter.h; sourceTree = SOURCE_ROOT; };
+ 29AF9491F2B0E09F26B2A9D0 /* wavetable_component.cpp */ /* wavetable_component.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wavetable_component.cpp; path = ../../../src/common/wavetable/wavetable_component.cpp; sourceTree = SOURCE_ROOT; };
+ 29DFC38FD142918CAC4ADFE2 /* phaser.h */ /* phaser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = phaser.h; path = ../../../src/synthesis/effects/phaser.h; sourceTree = SOURCE_ROOT; };
+ 2A26BBD2FAE20C114163C725 /* iir_halfband_decimator.h */ /* iir_halfband_decimator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = iir_halfband_decimator.h; path = ../../../src/synthesis/filters/iir_halfband_decimator.h; sourceTree = SOURCE_ROOT; };
+ 2B2DAF77E529EF609CE07E03 /* load_save.cpp */ /* load_save.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = load_save.cpp; path = ../../../src/common/load_save.cpp; sourceTree = SOURCE_ROOT; };
+ 2B5EF20D0BE840557CE1160D /* CoreAudio.framework */ /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+ 2C97D1FA0BABE40459BE1EBF /* envelope_module.cpp */ /* envelope_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = envelope_module.cpp; path = ../../../src/synthesis/modules/envelope_module.cpp; sourceTree = SOURCE_ROOT; };
+ 303FB7B5273832AB2FEC4C3F /* AppConfig.h */ /* AppConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = SOURCE_ROOT; };
+ 33C08F59D16676B1560BBADB /* utils.cpp */ /* utils.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = utils.cpp; path = ../../../src/synthesis/framework/utils.cpp; sourceTree = SOURCE_ROOT; };
+ 34CD153211F9D24FFBE81A73 /* wave_frame.h */ /* wave_frame.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wave_frame.h; path = ../../../src/synthesis/lookups/wave_frame.h; sourceTree = SOURCE_ROOT; };
+ 356529F5991F089F551E8DE8 /* wave_frame.cpp */ /* wave_frame.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wave_frame.cpp; path = ../../../src/synthesis/lookups/wave_frame.cpp; sourceTree = SOURCE_ROOT; };
+ 35980235BE17DD3DEDE403B2 /* reverb.cpp */ /* reverb.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = reverb.cpp; path = ../../../src/synthesis/effects/reverb.cpp; sourceTree = SOURCE_ROOT; };
+ 367B71B23DAE6BF0404FE44C /* legato_filter.cpp */ /* legato_filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = legato_filter.cpp; path = ../../../src/synthesis/utilities/legato_filter.cpp; sourceTree = SOURCE_ROOT; };
+ 36BE804913B09BDAC067418B /* wave_line_source.h */ /* wave_line_source.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wave_line_source.h; path = ../../../src/common/wavetable/wave_line_source.h; sourceTree = SOURCE_ROOT; };
+ 380086076605F9AB4AD11D18 /* smooth_value.h */ /* smooth_value.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = smooth_value.h; path = ../../../src/synthesis/utilities/smooth_value.h; sourceTree = SOURCE_ROOT; };
+ 399573306D5863E703547480 /* Accelerate.framework */ /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ 3A8ABF3A9FC81D189934CCBE /* compressor_module.h */ /* compressor_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = compressor_module.h; path = ../../../src/synthesis/modules/compressor_module.h; sourceTree = SOURCE_ROOT; };
+ 3AB88E385538AB2ABBB58002 /* synth_base.h */ /* synth_base.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = synth_base.h; path = ../../../src/common/synth_base.h; sourceTree = SOURCE_ROOT; };
+ 3B44F005D91349F841DF1FE8 /* peak_meter.cpp */ /* peak_meter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = peak_meter.cpp; path = ../../../src/synthesis/utilities/peak_meter.cpp; sourceTree = SOURCE_ROOT; };
+ 3BDE1AE3C34779FF04C5FF59 /* note_handler.h */ /* note_handler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = note_handler.h; path = ../../../src/synthesis/framework/note_handler.h; sourceTree = SOURCE_ROOT; };
+ 3E156A83D9BE7445A4C3C91D /* value.h */ /* value.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = value.h; path = ../../../src/synthesis/framework/value.h; sourceTree = SOURCE_ROOT; };
+ 3EC26E273A12B9F57D27EBBF /* portamento_slope.h */ /* portamento_slope.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = portamento_slope.h; path = ../../../src/synthesis/utilities/portamento_slope.h; sourceTree = SOURCE_ROOT; };
+ 41D3334EB54B7564EEF518AD /* filter_module.cpp */ /* filter_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = filter_module.cpp; path = ../../../src/synthesis/modules/filter_module.cpp; sourceTree = SOURCE_ROOT; };
+ 4405ABB56F60ED6A1FC9C4CD /* common.h */ /* common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../../../src/synthesis/framework/common.h; sourceTree = SOURCE_ROOT; };
+ 466E0F5634B209AB318E8B2C /* matrix.h */ /* matrix.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = matrix.h; path = ../../../src/synthesis/framework/matrix.h; sourceTree = SOURCE_ROOT; };
+ 477448E534D21338A3EFE83E /* line_generator.cpp */ /* line_generator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = line_generator.cpp; path = ../../../src/common/line_generator.cpp; sourceTree = SOURCE_ROOT; };
+ 4789B3203A38D4838842A7BD /* reorderable_effect_chain.cpp */ /* reorderable_effect_chain.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = reorderable_effect_chain.cpp; path = ../../../src/synthesis/modules/reorderable_effect_chain.cpp; sourceTree = SOURCE_ROOT; };
+ 48906981B4DC648AF2B6B610 /* shepard_tone_source.h */ /* shepard_tone_source.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = shepard_tone_source.h; path = ../../../src/common/wavetable/shepard_tone_source.h; sourceTree = SOURCE_ROOT; };
+ 4B9C410E42B2E4BB5BD61048 /* peak_meter.h */ /* peak_meter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = peak_meter.h; path = ../../../src/synthesis/utilities/peak_meter.h; sourceTree = SOURCE_ROOT; };
+ 4BC1CAFD710CEFE8F60C2305 /* legato_filter.h */ /* legato_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = legato_filter.h; path = ../../../src/synthesis/utilities/legato_filter.h; sourceTree = SOURCE_ROOT; };
+ 5252B9AA7BD8F256E8474296 /* processor.h */ /* processor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = processor.h; path = ../../../src/synthesis/framework/processor.h; sourceTree = SOURCE_ROOT; };
+ 52931313598477293E1E772F /* synth_types.cpp */ /* synth_types.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = synth_types.cpp; path = ../../../src/common/synth_types.cpp; sourceTree = SOURCE_ROOT; };
+ 52DFF6EF74914B02D96ACDF6 /* feedback.cpp */ /* feedback.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = feedback.cpp; path = ../../../src/synthesis/framework/feedback.cpp; sourceTree = SOURCE_ROOT; };
+ 5312C5E5970C909685D1ED22 /* lfo_module.h */ /* lfo_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lfo_module.h; path = ../../../src/synthesis/modules/lfo_module.h; sourceTree = SOURCE_ROOT; };
+ 53742E45041BDFDC42CEE78D /* wavetable_component.h */ /* wavetable_component.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wavetable_component.h; path = ../../../src/common/wavetable/wavetable_component.h; sourceTree = SOURCE_ROOT; };
+ 541D2F1F6732BF4D228D2FD4 /* feedback.h */ /* feedback.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = feedback.h; path = ../../../src/synthesis/framework/feedback.h; sourceTree = SOURCE_ROOT; };
+ 560D9D2096486815935BA930 /* processor_router.h */ /* processor_router.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = processor_router.h; path = ../../../src/synthesis/framework/processor_router.h; sourceTree = SOURCE_ROOT; };
+ 5677A18F3721228155DE5893 /* include_juce_data_structures.mm */ /* include_juce_data_structures.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_data_structures.mm; path = ../../JuceLibraryCode/include_juce_data_structures.mm; sourceTree = SOURCE_ROOT; };
+ 569E1076EB32443964FB1CBF /* line_map.cpp */ /* line_map.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = line_map.cpp; path = ../../../src/synthesis/modulators/line_map.cpp; sourceTree = SOURCE_ROOT; };
+ 57214B9A4EC0CA1FEA6DFBC8 /* phaser.cpp */ /* phaser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = phaser.cpp; path = ../../../src/synthesis/effects/phaser.cpp; sourceTree = SOURCE_ROOT; };
+ 5A5619D731DCB942B255BC94 /* comb_module.cpp */ /* comb_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = comb_module.cpp; path = ../../../src/synthesis/modules/comb_module.cpp; sourceTree = SOURCE_ROOT; };
+ 5B65E136ABE6B0F2A0C7E2F9 /* modulation_connection_processor.h */ /* modulation_connection_processor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = modulation_connection_processor.h; path = ../../../src/synthesis/modules/modulation_connection_processor.h; sourceTree = SOURCE_ROOT; };
+ 5CD3F890876C90DE3727C499 /* portamento_slope.cpp */ /* portamento_slope.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = portamento_slope.cpp; path = ../../../src/synthesis/utilities/portamento_slope.cpp; sourceTree = SOURCE_ROOT; };
+ 5D399CECFA881A128860CF82 /* Dynamic Library */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = vita.so.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 5D5ED2636412E0A240088B97 /* include_juce_audio_formats.mm */ /* include_juce_audio_formats.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_formats.mm; path = ../../JuceLibraryCode/include_juce_audio_formats.mm; sourceTree = SOURCE_ROOT; };
+ 5D972F1246A6C93274AFBF6C /* formant_module.cpp */ /* formant_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = formant_module.cpp; path = ../../../src/synthesis/modules/formant_module.cpp; sourceTree = SOURCE_ROOT; };
+ 5E9A49BFFEE384E0AA24E67F /* juce_data_structures */ /* juce_data_structures */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_data_structures; path = ../../../third_party/JUCE/modules/juce_data_structures; sourceTree = SOURCE_ROOT; };
+ 5EC9F2BBF33A53731E4C84A7 /* frequency_filter_modifier.cpp */ /* frequency_filter_modifier.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = frequency_filter_modifier.cpp; path = ../../../src/common/wavetable/frequency_filter_modifier.cpp; sourceTree = SOURCE_ROOT; };
+ 6041A9C77D57EF87FBDF4C46 /* synthesis.cpp */ /* synthesis.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = synthesis.cpp; path = ../../../src/unity_build/synthesis.cpp; sourceTree = SOURCE_ROOT; };
+ 6198335FD2B2C61191F9FDA5 /* ladder_filter.cpp */ /* ladder_filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ladder_filter.cpp; path = ../../../src/synthesis/filters/ladder_filter.cpp; sourceTree = SOURCE_ROOT; };
+ 6239E43B766890B87481632F /* flanger_module.h */ /* flanger_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = flanger_module.h; path = ../../../src/synthesis/modules/flanger_module.h; sourceTree = SOURCE_ROOT; };
+ 62BF67FC1BAA877C027FA2F1 /* one_pole_filter.h */ /* one_pole_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = one_pole_filter.h; path = ../../../src/synthesis/filters/one_pole_filter.h; sourceTree = SOURCE_ROOT; };
+ 62F16E4A2DBDA19BA6140FD8 /* poly_values.h */ /* poly_values.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = poly_values.h; path = ../../../src/synthesis/framework/poly_values.h; sourceTree = SOURCE_ROOT; };
+ 6635D2510EC0ADF4D11B8D01 /* synth_parameters.cpp */ /* synth_parameters.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = synth_parameters.cpp; path = ../../../src/common/synth_parameters.cpp; sourceTree = SOURCE_ROOT; };
+ 66372DA103FF4A556C878649 /* processor.cpp */ /* processor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = processor.cpp; path = ../../../src/synthesis/framework/processor.cpp; sourceTree = SOURCE_ROOT; };
+ 66D35449B829AAA516A3B3EE /* filter_module.h */ /* filter_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = filter_module.h; path = ../../../src/synthesis/modules/filter_module.h; sourceTree = SOURCE_ROOT; };
+ 6768FE919CC4D66C78D51F64 /* wavetable_creator.h */ /* wavetable_creator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wavetable_creator.h; path = ../../../src/common/wavetable/wavetable_creator.h; sourceTree = SOURCE_ROOT; };
+ 67D07D0D56CAC479531F872D /* decimator.cpp */ /* decimator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = decimator.cpp; path = ../../../src/synthesis/filters/decimator.cpp; sourceTree = SOURCE_ROOT; };
+ 68D27C77681B950238514276 /* wavetable_group.h */ /* wavetable_group.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wavetable_group.h; path = ../../../src/common/wavetable/wavetable_group.h; sourceTree = SOURCE_ROOT; };
+ 69BE0BA589BA563463D9F9B0 /* phaser_filter.cpp */ /* phaser_filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = phaser_filter.cpp; path = ../../../src/synthesis/filters/phaser_filter.cpp; sourceTree = SOURCE_ROOT; };
+ 6A47BA3FB7B862ADD1E9185A /* distortion.h */ /* distortion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = distortion.h; path = ../../../src/synthesis/effects/distortion.h; sourceTree = SOURCE_ROOT; };
+ 6AAA210E07CF6CC16A5B1026 /* synth_lfo.cpp */ /* synth_lfo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = synth_lfo.cpp; path = ../../../src/synthesis/modulators/synth_lfo.cpp; sourceTree = SOURCE_ROOT; };
+ 6ABF9910B2BC112F9FDA1D81 /* chorus_module.cpp */ /* chorus_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = chorus_module.cpp; path = ../../../src/synthesis/modules/chorus_module.cpp; sourceTree = SOURCE_ROOT; };
+ 6C33D4AA95D3CE36C5FB875A /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+ 6E8D821026D7EE8B0908DC78 /* envelope_module.h */ /* envelope_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = envelope_module.h; path = ../../../src/synthesis/modules/envelope_module.h; sourceTree = SOURCE_ROOT; };
+ 6FCE542B01C79855D2121C1B /* synth_gui_interface.cpp */ /* synth_gui_interface.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = synth_gui_interface.cpp; path = ../../../src/common/synth_gui_interface.cpp; sourceTree = SOURCE_ROOT; };
+ 712F3C6AA18B57E36E396999 /* operators.h */ /* operators.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = operators.h; path = ../../../src/synthesis/framework/operators.h; sourceTree = SOURCE_ROOT; };
+ 7264AAD574AC720EDCC3EFA0 /* wave_warp_modifier.cpp */ /* wave_warp_modifier.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wave_warp_modifier.cpp; path = ../../../src/common/wavetable/wave_warp_modifier.cpp; sourceTree = SOURCE_ROOT; };
+ 72E03A78D80650173EA0CA1E /* IOKit.framework */ /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+ 73070D4A3F45AD1A39E2F9A0 /* JuceHeader.h */ /* JuceHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = SOURCE_ROOT; };
+ 73C17D14BD0F1250B3FAF66C /* synth_module.cpp */ /* synth_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = synth_module.cpp; path = ../../../src/synthesis/framework/synth_module.cpp; sourceTree = SOURCE_ROOT; };
+ 77EAA2E95009AD411FDA7654 /* synth_lfo.h */ /* synth_lfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = synth_lfo.h; path = ../../../src/synthesis/modulators/synth_lfo.h; sourceTree = SOURCE_ROOT; };
+ 786BA85AF93546A959B66E83 /* processor_router.cpp */ /* processor_router.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = processor_router.cpp; path = ../../../src/synthesis/framework/processor_router.cpp; sourceTree = SOURCE_ROOT; };
+ 788CAE8CE69ABCD365D32906 /* memory.h */ /* memory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = memory.h; path = ../../../src/synthesis/lookups/memory.h; sourceTree = SOURCE_ROOT; };
+ 7914CA03E625DA6C2D2F17DE /* synth_oscillator.cpp */ /* synth_oscillator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = synth_oscillator.cpp; path = ../../../src/synthesis/producers/synth_oscillator.cpp; sourceTree = SOURCE_ROOT; };
+ 7A68D46ED33B01D9C6D4336A /* equalizer_module.cpp */ /* equalizer_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = equalizer_module.cpp; path = ../../../src/synthesis/modules/equalizer_module.cpp; sourceTree = SOURCE_ROOT; };
+ 7EE4116D0A34BF683817830D /* diode_filter.h */ /* diode_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = diode_filter.h; path = ../../../src/synthesis/filters/diode_filter.h; sourceTree = SOURCE_ROOT; };
+ 7EFA42C122F3B3B1F51CCFEF /* formant_filter.cpp */ /* formant_filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = formant_filter.cpp; path = ../../../src/synthesis/filters/formant_filter.cpp; sourceTree = SOURCE_ROOT; };
+ 81E07CC614444EA1D2C6A622 /* formant_manager.cpp */ /* formant_manager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = formant_manager.cpp; path = ../../../src/synthesis/filters/formant_manager.cpp; sourceTree = SOURCE_ROOT; };
+ 82020CC4A48AC0E0BD1AF0F5 /* line_generator.h */ /* line_generator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = line_generator.h; path = ../../../src/common/line_generator.h; sourceTree = SOURCE_ROOT; };
+ 82A4DB0391326CA1187FCD64 /* synth_filter.cpp */ /* synth_filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = synth_filter.cpp; path = ../../../src/synthesis/filters/synth_filter.cpp; sourceTree = SOURCE_ROOT; };
+ 840EF494D6B5644BCF60437A /* sallen_key_filter.cpp */ /* sallen_key_filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = sallen_key_filter.cpp; path = ../../../src/synthesis/filters/sallen_key_filter.cpp; sourceTree = SOURCE_ROOT; };
+ 844B68DF292BBEEFD4C46467 /* wavetable_creator.cpp */ /* wavetable_creator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wavetable_creator.cpp; path = ../../../src/common/wavetable/wavetable_creator.cpp; sourceTree = SOURCE_ROOT; };
+ 85DC44CAD92B20F1C8E6B28D /* include_juce_events.mm */ /* include_juce_events.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_events.mm; path = ../../JuceLibraryCode/include_juce_events.mm; sourceTree = SOURCE_ROOT; };
+ 8672FE8164575BF3CBC3CD7D /* chorus_module.h */ /* chorus_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = chorus_module.h; path = ../../../src/synthesis/modules/chorus_module.h; sourceTree = SOURCE_ROOT; };
+ 871B963BCB85E581E7E058C8 /* compressor_module.cpp */ /* compressor_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = compressor_module.cpp; path = ../../../src/synthesis/modules/compressor_module.cpp; sourceTree = SOURCE_ROOT; };
+ 8845FB50B2C667B7F0589436 /* producers_module.cpp */ /* producers_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = producers_module.cpp; path = ../../../src/synthesis/modules/producers_module.cpp; sourceTree = SOURCE_ROOT; };
+ 88B1EF6629FE92F6D5608247 /* poly_utils.h */ /* poly_utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = poly_utils.h; path = ../../../src/synthesis/framework/poly_utils.h; sourceTree = SOURCE_ROOT; };
+ 8AF0B0CEE02CC7F68265AABF /* voice_handler.cpp */ /* voice_handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = voice_handler.cpp; path = ../../../src/synthesis/framework/voice_handler.cpp; sourceTree = SOURCE_ROOT; };
+ 8D0FFA8F5E1C6730D9A5E2AA /* Cocoa.framework */ /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ 90F11B4FC94F6BCD15AEF50A /* wave_window_modifier.cpp */ /* wave_window_modifier.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wave_window_modifier.cpp; path = ../../../src/common/wavetable/wave_window_modifier.cpp; sourceTree = SOURCE_ROOT; };
+ 93987B9A410C6D9A75DA7BCE /* shepard_tone_source.cpp */ /* shepard_tone_source.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = shepard_tone_source.cpp; path = ../../../src/common/wavetable/shepard_tone_source.cpp; sourceTree = SOURCE_ROOT; };
+ 94A79414F5710BE9F7CE0F25 /* formant_manager.h */ /* formant_manager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = formant_manager.h; path = ../../../src/synthesis/filters/formant_manager.h; sourceTree = SOURCE_ROOT; };
+ 9605B68D1CE1587805167EB2 /* dc_filter.h */ /* dc_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = dc_filter.h; path = ../../../src/synthesis/filters/dc_filter.h; sourceTree = SOURCE_ROOT; };
+ 960B92C3C44FA4F1846C6985 /* include_juce_audio_basics.mm */ /* include_juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_basics.mm; path = ../../JuceLibraryCode/include_juce_audio_basics.mm; sourceTree = SOURCE_ROOT; };
+ 96EB57DF51524AB7C4F989F3 /* startup.h */ /* startup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = startup.h; path = ../../../src/common/startup.h; sourceTree = SOURCE_ROOT; };
+ 97B53B766DADE0947971965B /* comb_module.h */ /* comb_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = comb_module.h; path = ../../../src/synthesis/modules/comb_module.h; sourceTree = SOURCE_ROOT; };
+ 97CB5BF3D13161B7508BF63F /* tuning.h */ /* tuning.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = tuning.h; path = ../../../src/common/tuning.h; sourceTree = SOURCE_ROOT; };
+ 98002A5C5184EB034F8061CF /* operators.cpp */ /* operators.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = operators.cpp; path = ../../../src/synthesis/framework/operators.cpp; sourceTree = SOURCE_ROOT; };
+ 989E76CBBD4D928F7904C486 /* decimator.h */ /* decimator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = decimator.h; path = ../../../src/synthesis/filters/decimator.h; sourceTree = SOURCE_ROOT; };
+ 9A4AE579197CA85CB6DC2E00 /* dirty_filter.h */ /* dirty_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = dirty_filter.h; path = ../../../src/synthesis/filters/dirty_filter.h; sourceTree = SOURCE_ROOT; };
+ 9AC7DBC44623EE8AD521F82A /* border_bounds_constrainer.h */ /* border_bounds_constrainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = border_bounds_constrainer.h; path = ../../../src/common/border_bounds_constrainer.h; sourceTree = SOURCE_ROOT; };
+ 9B598D297253DFCB95003019 /* wavetable_component_factory.cpp */ /* wavetable_component_factory.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wavetable_component_factory.cpp; path = ../../../src/common/wavetable/wavetable_component_factory.cpp; sourceTree = SOURCE_ROOT; };
+ 9C02A5DAAEF2EE5E2817EAF4 /* fir_halfband_decimator.h */ /* fir_halfband_decimator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fir_halfband_decimator.h; path = ../../../src/synthesis/filters/fir_halfband_decimator.h; sourceTree = SOURCE_ROOT; };
+ 9C94D9A01C651D7AEDFEB445 /* compressor.h */ /* compressor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = compressor.h; path = ../../../src/synthesis/effects/compressor.h; sourceTree = SOURCE_ROOT; };
+ 9D6B18E54421CC6D0F32DE59 /* envelope.cpp */ /* envelope.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = envelope.cpp; path = ../../../src/synthesis/modulators/envelope.cpp; sourceTree = SOURCE_ROOT; };
+ A29CD8B14F3A763D2925B935 /* linkwitz_riley_filter.h */ /* linkwitz_riley_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = linkwitz_riley_filter.h; path = ../../../src/synthesis/filters/linkwitz_riley_filter.h; sourceTree = SOURCE_ROOT; };
+ A2BB4D231753056CD4EF4B0D /* wavetable_keyframe.cpp */ /* wavetable_keyframe.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wavetable_keyframe.cpp; path = ../../../src/common/wavetable/wavetable_keyframe.cpp; sourceTree = SOURCE_ROOT; };
+ A3061EAE1063442BAEE785E0 /* wave_window_modifier.h */ /* wave_window_modifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wave_window_modifier.h; path = ../../../src/common/wavetable/wave_window_modifier.h; sourceTree = SOURCE_ROOT; };
+ A46F7AA5D7AA93E8DFBD5B5A /* delay.cpp */ /* delay.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = delay.cpp; path = ../../../src/synthesis/effects/delay.cpp; sourceTree = SOURCE_ROOT; };
+ A52ADDED22FAC0B16C094DC0 /* reorderable_effect_chain.h */ /* reorderable_effect_chain.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = reorderable_effect_chain.h; path = ../../../src/synthesis/modules/reorderable_effect_chain.h; sourceTree = SOURCE_ROOT; };
+ A530C477C1D1BD4BB33F6BBF /* wave_warp_modifier.h */ /* wave_warp_modifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wave_warp_modifier.h; path = ../../../src/common/wavetable/wave_warp_modifier.h; sourceTree = SOURCE_ROOT; };
+ A94B379E551E1D8B55078B45 /* utils.h */ /* utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../src/synthesis/framework/utils.h; sourceTree = SOURCE_ROOT; };
+ AADC8D92259BF7FA870AD5C2 /* phase_modifier.h */ /* phase_modifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = phase_modifier.h; path = ../../../src/common/wavetable/phase_modifier.h; sourceTree = SOURCE_ROOT; };
+ AB079907889060B891C4E778 /* load_save.h */ /* load_save.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = load_save.h; path = ../../../src/common/load_save.h; sourceTree = SOURCE_ROOT; };
+ ABCEE9650391F86C7446301B /* oscillator_module.cpp */ /* oscillator_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = oscillator_module.cpp; path = ../../../src/synthesis/modules/oscillator_module.cpp; sourceTree = SOURCE_ROOT; };
+ ABFBA3DC34FBA54614A997AF /* tuning.cpp */ /* tuning.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = tuning.cpp; path = ../../../src/common/tuning.cpp; sourceTree = SOURCE_ROOT; };
+ AC84FA84E37CE376E6B0F143 /* sample_source.cpp */ /* sample_source.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = sample_source.cpp; path = ../../../src/synthesis/producers/sample_source.cpp; sourceTree = SOURCE_ROOT; };
+ AD71CC8EDB3A5DA12769BD4C /* filters_module.h */ /* filters_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = filters_module.h; path = ../../../src/synthesis/modules/filters_module.h; sourceTree = SOURCE_ROOT; };
+ ADCE1E0456C809693F709DED /* digital_svf.h */ /* digital_svf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = digital_svf.h; path = ../../../src/synthesis/filters/digital_svf.h; sourceTree = SOURCE_ROOT; };
+ ADD3C3586CD547FDDF114521 /* trigger_random.h */ /* trigger_random.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = trigger_random.h; path = ../../../src/synthesis/modulators/trigger_random.h; sourceTree = SOURCE_ROOT; };
+ ADD69B20B4B503BE6D380D73 /* wavetable_keyframe.h */ /* wavetable_keyframe.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wavetable_keyframe.h; path = ../../../src/common/wavetable/wavetable_keyframe.h; sourceTree = SOURCE_ROOT; };
+ ADE922B304FB5EAD8919EC10 /* random_lfo.cpp */ /* random_lfo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = random_lfo.cpp; path = ../../../src/synthesis/modulators/random_lfo.cpp; sourceTree = SOURCE_ROOT; };
+ AECBC83AC89D73A996841BEE /* synth_base.cpp */ /* synth_base.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = synth_base.cpp; path = ../../../src/common/synth_base.cpp; sourceTree = SOURCE_ROOT; };
+ AF84D54469EDBFBE9582CDCD /* reverb.h */ /* reverb.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = reverb.h; path = ../../../src/synthesis/effects/reverb.h; sourceTree = SOURCE_ROOT; };
+ B076A46B90BE1176BA64711E /* synth_module.h */ /* synth_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = synth_module.h; path = ../../../src/synthesis/framework/synth_module.h; sourceTree = SOURCE_ROOT; };
+ B353A80BF55BDA9DC00631B9 /* include_juce_dsp.mm */ /* include_juce_dsp.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_dsp.mm; path = ../../JuceLibraryCode/include_juce_dsp.mm; sourceTree = SOURCE_ROOT; };
+ B4A2F94BF7F9E1116627036D /* futils.h */ /* futils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = futils.h; path = ../../../src/synthesis/framework/futils.h; sourceTree = SOURCE_ROOT; };
+ B63B9D1D4CE12A3ED7D04C99 /* synth_filter.h */ /* synth_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = synth_filter.h; path = ../../../src/synthesis/filters/synth_filter.h; sourceTree = SOURCE_ROOT; };
+ B6D332113CEBB4575D39D759 /* phase_modifier.cpp */ /* phase_modifier.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = phase_modifier.cpp; path = ../../../src/common/wavetable/phase_modifier.cpp; sourceTree = SOURCE_ROOT; };
+ B80414B88358846B3606B00C /* slew_limit_modifier.h */ /* slew_limit_modifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = slew_limit_modifier.h; path = ../../../src/common/wavetable/slew_limit_modifier.h; sourceTree = SOURCE_ROOT; };
+ B86F940A4DC9D65727AE8F74 /* wavetable.cpp */ /* wavetable.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wavetable.cpp; path = ../../../src/synthesis/lookups/wavetable.cpp; sourceTree = SOURCE_ROOT; };
+ B91D19815CCF9FC9C9138696 /* wave_source.h */ /* wave_source.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wave_source.h; path = ../../../src/common/wavetable/wave_source.h; sourceTree = SOURCE_ROOT; };
+ B94E92C3BD0E5092613758F5 /* comb_filter.cpp */ /* comb_filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = comb_filter.cpp; path = ../../../src/synthesis/filters/comb_filter.cpp; sourceTree = SOURCE_ROOT; };
+ BC00B3AA990BC8A815F6CABA /* flanger_module.cpp */ /* flanger_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = flanger_module.cpp; path = ../../../src/synthesis/modules/flanger_module.cpp; sourceTree = SOURCE_ROOT; };
+ BD2838DB936BE9629B2BB8EB /* dirty_filter.cpp */ /* dirty_filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = dirty_filter.cpp; path = ../../../src/synthesis/filters/dirty_filter.cpp; sourceTree = SOURCE_ROOT; };
+ BE82BDB84D073A63AFD5FC8F /* oscillator_module.h */ /* oscillator_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = oscillator_module.h; path = ../../../src/synthesis/modules/oscillator_module.h; sourceTree = SOURCE_ROOT; };
+ BEB2199B9D0E8CE967C2D058 /* file_source.cpp */ /* file_source.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = file_source.cpp; path = ../../../src/common/wavetable/file_source.cpp; sourceTree = SOURCE_ROOT; };
+ C0DCC332BFD3273034E4D1CA /* lookup_table.h */ /* lookup_table.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lookup_table.h; path = ../../../src/synthesis/lookups/lookup_table.h; sourceTree = SOURCE_ROOT; };
+ C1000D0B43F6979A9D8FCE89 /* slew_limit_modifier.cpp */ /* slew_limit_modifier.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = slew_limit_modifier.cpp; path = ../../../src/common/wavetable/slew_limit_modifier.cpp; sourceTree = SOURCE_ROOT; };
+ C1C8F627AE476E76259E230D /* fir_halfband_decimator.cpp */ /* fir_halfband_decimator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = fir_halfband_decimator.cpp; path = ../../../src/synthesis/filters/fir_halfband_decimator.cpp; sourceTree = SOURCE_ROOT; };
+ C1FB9104FAA342756EFBC9B3 /* wave_line_source.cpp */ /* wave_line_source.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wave_line_source.cpp; path = ../../../src/common/wavetable/wave_line_source.cpp; sourceTree = SOURCE_ROOT; };
+ C4C772D9C3F472259A2210E3 /* RecentFilesMenuTemplate.nib */ /* RecentFilesMenuTemplate.nib */ = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = SOURCE_ROOT; };
+ C737EC23A7C3EDF0B3ACA9A6 /* iir_halfband_decimator.cpp */ /* iir_halfband_decimator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = iir_halfband_decimator.cpp; path = ../../../src/synthesis/filters/iir_halfband_decimator.cpp; sourceTree = SOURCE_ROOT; };
+ C822B9D3273ACBF5ACC5171B /* phaser_module.h */ /* phaser_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = phaser_module.h; path = ../../../src/synthesis/modules/phaser_module.h; sourceTree = SOURCE_ROOT; };
+ CA472B975FCFA1B7A5D7FA9A /* synth_gui_interface.h */ /* synth_gui_interface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = synth_gui_interface.h; path = ../../../src/common/synth_gui_interface.h; sourceTree = SOURCE_ROOT; };
+ CA98FDA2AD5552AFD96D3ACD /* midi_manager.h */ /* midi_manager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = midi_manager.h; path = ../../../src/common/midi_manager.h; sourceTree = SOURCE_ROOT; };
+ CB31E332452A8DC1D679BAD1 /* juce_dsp */ /* juce_dsp */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_dsp; path = ../../../third_party/JUCE/modules/juce_dsp; sourceTree = SOURCE_ROOT; };
+ CC5B0CD752876A88DFAB9019 /* line_map.h */ /* line_map.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = line_map.h; path = ../../../src/synthesis/modulators/line_map.h; sourceTree = SOURCE_ROOT; };
+ CD51BC31E5B1EDF354D13B9C /* circular_queue.h */ /* circular_queue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = circular_queue.h; path = ../../../src/synthesis/framework/circular_queue.h; sourceTree = SOURCE_ROOT; };
+ CDBAD016788D25C1CACEEEBB /* reverb_module.cpp */ /* reverb_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = reverb_module.cpp; path = ../../../src/synthesis/modules/reverb_module.cpp; sourceTree = SOURCE_ROOT; };
+ D0258E93F451A1A44636A6A4 /* startup.cpp */ /* startup.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = startup.cpp; path = ../../../src/common/startup.cpp; sourceTree = SOURCE_ROOT; };
+ D29839FD9D798968891B1645 /* common.cpp */ /* common.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = common.cpp; path = ../../../src/unity_build/common.cpp; sourceTree = SOURCE_ROOT; };
+ D50A174551A897AA6A46B407 /* juce_events */ /* juce_events */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_events; path = ../../../third_party/JUCE/modules/juce_events; sourceTree = SOURCE_ROOT; };
+ D5E152239EBD7DF6BD15BDC1 /* wave_fold_modifier.h */ /* wave_fold_modifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wave_fold_modifier.h; path = ../../../src/common/wavetable/wave_fold_modifier.h; sourceTree = SOURCE_ROOT; };
+ D6A5FB9992FDD44AE6B51E7E /* envelope.h */ /* envelope.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = envelope.h; path = ../../../src/synthesis/modulators/envelope.h; sourceTree = SOURCE_ROOT; };
+ D863CE538160FEA99CA9C8D7 /* distortion_module.cpp */ /* distortion_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = distortion_module.cpp; path = ../../../src/synthesis/modules/distortion_module.cpp; sourceTree = SOURCE_ROOT; };
+ D9C446A6BC87D703E5EA9273 /* main.cpp */ /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = ../../../src/headless/main.cpp; sourceTree = SOURCE_ROOT; };
+ DA012E86B5E6710EC610418E /* synth_parameters.h */ /* synth_parameters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = synth_parameters.h; path = ../../../src/common/synth_parameters.h; sourceTree = SOURCE_ROOT; };
+ DA0CE9B957F77D30E335D3ED /* diode_filter.cpp */ /* diode_filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = diode_filter.cpp; path = ../../../src/synthesis/filters/diode_filter.cpp; sourceTree = SOURCE_ROOT; };
+ DBBD4944810610A4964E7E5A /* sample_module.h */ /* sample_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sample_module.h; path = ../../../src/synthesis/modules/sample_module.h; sourceTree = SOURCE_ROOT; };
+ DC57E782579540CE3AA6D1D0 /* wave_fold_modifier.cpp */ /* wave_fold_modifier.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wave_fold_modifier.cpp; path = ../../../src/common/wavetable/wave_fold_modifier.cpp; sourceTree = SOURCE_ROOT; };
+ DF87B75C77094C0A121EED55 /* juce_core */ /* juce_core */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_core; path = ../../../third_party/JUCE/modules/juce_core; sourceTree = SOURCE_ROOT; };
+ E13842D977D9936CC80AF573 /* digital_svf.cpp */ /* digital_svf.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = digital_svf.cpp; path = ../../../src/synthesis/filters/digital_svf.cpp; sourceTree = SOURCE_ROOT; };
+ E26755374577FFB5E707A9F5 /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ E3098C6B760546D26E2ABCD5 /* producers_module.h */ /* producers_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = producers_module.h; path = ../../../src/synthesis/modules/producers_module.h; sourceTree = SOURCE_ROOT; };
+ E371DD8330B58C88E5139FE0 /* delay_module.cpp */ /* delay_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = delay_module.cpp; path = ../../../src/synthesis/modules/delay_module.cpp; sourceTree = SOURCE_ROOT; };
+ E57A9040BE469501B290F16F /* value_switch.h */ /* value_switch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = value_switch.h; path = ../../../src/synthesis/utilities/value_switch.h; sourceTree = SOURCE_ROOT; };
+ E7E13531198D59DBBA4C662B /* delay_module.h */ /* delay_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = delay_module.h; path = ../../../src/synthesis/modules/delay_module.h; sourceTree = SOURCE_ROOT; };
+ E8CBC1255D1B332842BBBE78 /* value.cpp */ /* value.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = value.cpp; path = ../../../src/synthesis/framework/value.cpp; sourceTree = SOURCE_ROOT; };
+ E9AEB39A1020F39CCDF2180C /* fourier_transform.h */ /* fourier_transform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fourier_transform.h; path = ../../../src/common/fourier_transform.h; sourceTree = SOURCE_ROOT; };
+ EA170B8B6946E4F4B51585CC /* QuartzCore.framework */ /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ EA9AA304032965F31C2DB5C9 /* wavetable_component_factory.h */ /* wavetable_component_factory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wavetable_component_factory.h; path = ../../../src/common/wavetable/wavetable_component_factory.h; sourceTree = SOURCE_ROOT; };
+ EAEEAF1CD6023241A9EBF43F /* random_lfo.h */ /* random_lfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = random_lfo.h; path = ../../../src/synthesis/modulators/random_lfo.h; sourceTree = SOURCE_ROOT; };
+ EB19450676F7CB7FADD8B51F /* delay.h */ /* delay.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = delay.h; path = ../../../src/synthesis/effects/delay.h; sourceTree = SOURCE_ROOT; };
+ ED57BDBF2CBD3A69B38469A1 /* random_lfo_module.h */ /* random_lfo_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = random_lfo_module.h; path = ../../../src/synthesis/modules/random_lfo_module.h; sourceTree = SOURCE_ROOT; };
+ EF2EAED6C57743013D7A4649 /* value_switch.cpp */ /* value_switch.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = value_switch.cpp; path = ../../../src/synthesis/utilities/value_switch.cpp; sourceTree = SOURCE_ROOT; };
+ F2E2D01D1EE314415B99ADAD /* juce_audio_formats */ /* juce_audio_formats */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_formats; path = ../../../third_party/JUCE/modules/juce_audio_formats; sourceTree = SOURCE_ROOT; };
+ F3CA742A33C411CABA1474E5 /* random_lfo_module.cpp */ /* random_lfo_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = random_lfo_module.cpp; path = ../../../src/synthesis/modules/random_lfo_module.cpp; sourceTree = SOURCE_ROOT; };
+ F42F2E34269BB03E30D5C7FC /* pitch_detector.cpp */ /* pitch_detector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = pitch_detector.cpp; path = ../../../src/common/wavetable/pitch_detector.cpp; sourceTree = SOURCE_ROOT; };
+ F516DB15733061FA2656F285 /* midi_manager.cpp */ /* midi_manager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_manager.cpp; path = ../../../src/common/midi_manager.cpp; sourceTree = SOURCE_ROOT; };
+ F7573476A217B5295788FBA9 /* sallen_key_filter.h */ /* sallen_key_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sallen_key_filter.h; path = ../../../src/synthesis/filters/sallen_key_filter.h; sourceTree = SOURCE_ROOT; };
+ F7EEE1FF6CC8B7A619066F65 /* voice_handler.h */ /* voice_handler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = voice_handler.h; path = ../../../src/synthesis/framework/voice_handler.h; sourceTree = SOURCE_ROOT; };
+ F8E035506B4257624F2AE9D2 /* include_juce_core.mm */ /* include_juce_core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_core.mm; path = ../../JuceLibraryCode/include_juce_core.mm; sourceTree = SOURCE_ROOT; };
+ FA85952C8D7AF09E40C50A59 /* phaser_module.cpp */ /* phaser_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = phaser_module.cpp; path = ../../../src/synthesis/modules/phaser_module.cpp; sourceTree = SOURCE_ROOT; };
+ FA9400F633B5A60EDBD0C0AE /* wavetable.h */ /* wavetable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wavetable.h; path = ../../../src/synthesis/lookups/wavetable.h; sourceTree = SOURCE_ROOT; };
+ FD2D54F9796DC6AD8B44B1BA /* equalizer_module.h */ /* equalizer_module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = equalizer_module.h; path = ../../../src/synthesis/modules/equalizer_module.h; sourceTree = SOURCE_ROOT; };
+ FDE2800978CBA61215FB4B8D /* sample_module.cpp */ /* sample_module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = sample_module.cpp; path = ../../../src/synthesis/modules/sample_module.cpp; sourceTree = SOURCE_ROOT; };
+ FEEFF87BE139E30CAC0E2A93 /* synth_types.h */ /* synth_types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = synth_types.h; path = ../../../src/common/synth_types.h; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 988A250A0CE0C87F29A83A17 = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AA326DFAC7E3A606439D0B5E,
+ 9973331B571A72B7F6DB5B14,
+ F0D572BBDDE3E1941291482F,
+ 999D73CBF2FF2D4FC0532C59,
+ 3174D9720114D8A4520BA60B,
+ 293F7694B7C33204D09D2191,
+ 0C3BFC7DBEA7B14713E49772,
+ CBDEF0B7ACD825C1ACFC3687,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 22FE8F4953DBB1955B71409A /* src */ = {
+ isa = PBXGroup;
+ children = (
+ F5CDFCDF7EAC498A8513CA6C,
+ 492D18BA00091CB3409F073C,
+ 4109231EA4DAB9114CDCCF7E,
+ 62AF778C4EA1F7988E7AE660,
+ );
+ name = src;
+ sourceTree = "";
+ };
+ 2497ED9FF1A76F720BDB0193 /* utilities */ = {
+ isa = PBXGroup;
+ children = (
+ 367B71B23DAE6BF0404FE44C,
+ 4BC1CAFD710CEFE8F60C2305,
+ 3B44F005D91349F841DF1FE8,
+ 4B9C410E42B2E4BB5BD61048,
+ 5CD3F890876C90DE3727C499,
+ 3EC26E273A12B9F57D27EBBF,
+ 0D8C00B71C8E1132F95B5A08,
+ 380086076605F9AB4AD11D18,
+ EF2EAED6C57743013D7A4649,
+ E57A9040BE469501B290F16F,
+ );
+ name = utilities;
+ sourceTree = "";
+ };
+ 349DEAAA969296B2D8B716CB /* lookups */ = {
+ isa = PBXGroup;
+ children = (
+ C0DCC332BFD3273034E4D1CA,
+ 788CAE8CE69ABCD365D32906,
+ 356529F5991F089F551E8DE8,
+ 34CD153211F9D24FFBE81A73,
+ B86F940A4DC9D65727AE8F74,
+ FA9400F633B5A60EDBD0C0AE,
+ );
+ name = lookups;
+ sourceTree = "";
+ };
+ 3B303607580354EA7311BBA3 /* modulators */ = {
+ isa = PBXGroup;
+ children = (
+ 9D6B18E54421CC6D0F32DE59,
+ D6A5FB9992FDD44AE6B51E7E,
+ 569E1076EB32443964FB1CBF,
+ CC5B0CD752876A88DFAB9019,
+ ADE922B304FB5EAD8919EC10,
+ EAEEAF1CD6023241A9EBF43F,
+ 6AAA210E07CF6CC16A5B1026,
+ 77EAA2E95009AD411FDA7654,
+ 15AAA1ACF5A84443DE6A8C65,
+ ADD3C3586CD547FDDF114521,
+ );
+ name = modulators;
+ sourceTree = "";
+ };
+ 3E5217AC1636710C79F08B31 /* effects */ = {
+ isa = PBXGroup;
+ children = (
+ 180F7E8DE8D231336DE6C106,
+ 9C94D9A01C651D7AEDFEB445,
+ A46F7AA5D7AA93E8DFBD5B5A,
+ EB19450676F7CB7FADD8B51F,
+ 0D69DABA32F1C6C06701E978,
+ 6A47BA3FB7B862ADD1E9185A,
+ 57214B9A4EC0CA1FEA6DFBC8,
+ 29DFC38FD142918CAC4ADFE2,
+ 35980235BE17DD3DEDE403B2,
+ AF84D54469EDBFBE9582CDCD,
+ );
+ name = effects;
+ sourceTree = "";
+ };
+ 4109231EA4DAB9114CDCCF7E /* synthesis */ = {
+ isa = PBXGroup;
+ children = (
+ 3E5217AC1636710C79F08B31,
+ B27E2B7E5B8306F353B90601,
+ E17BE649952CD5666C1AE4D6,
+ 349DEAAA969296B2D8B716CB,
+ 3B303607580354EA7311BBA3,
+ 7558EDB646165101938363CD,
+ DD4BDF136754CD6AC8F34188,
+ 2497ED9FF1A76F720BDB0193,
+ );
+ name = synthesis;
+ sourceTree = "";
+ };
+ 422E5F33E78823B5E110C006 /* JUCE Modules */ = {
+ isa = PBXGroup;
+ children = (
+ 247AF363F7BB6F07F42B3250,
+ F2E2D01D1EE314415B99ADAD,
+ DF87B75C77094C0A121EED55,
+ 5E9A49BFFEE384E0AA24E67F,
+ CB31E332452A8DC1D679BAD1,
+ D50A174551A897AA6A46B407,
+ );
+ name = "JUCE Modules";
+ sourceTree = "";
+ };
+ 492D18BA00091CB3409F073C /* headless */ = {
+ isa = PBXGroup;
+ children = (
+ 0E48CA7AAEFE35D9A1D169AA,
+ D9C446A6BC87D703E5EA9273,
+ );
+ name = headless;
+ sourceTree = "";
+ };
+ 62AF778C4EA1F7988E7AE660 /* unity_build */ = {
+ isa = PBXGroup;
+ children = (
+ D29839FD9D798968891B1645,
+ 6041A9C77D57EF87FBDF4C46,
+ );
+ name = unity_build;
+ sourceTree = "";
+ };
+ 667548BE990C9AFB45B785C4 /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ E6F55E099A03EDB1F990708E,
+ 422E5F33E78823B5E110C006,
+ E84590C6B6AC15CD59A65DCC,
+ B3B22BD613B6765236444EE1,
+ 901406C9B1F149B0C0B43289,
+ CE69B81244E05FBF06EBB0CA,
+ );
+ name = Source;
+ sourceTree = "";
+ };
+ 7558EDB646165101938363CD /* modules */ = {
+ isa = PBXGroup;
+ children = (
+ 6ABF9910B2BC112F9FDA1D81,
+ 8672FE8164575BF3CBC3CD7D,
+ 5A5619D731DCB942B255BC94,
+ 97B53B766DADE0947971965B,
+ 871B963BCB85E581E7E058C8,
+ 3A8ABF3A9FC81D189934CCBE,
+ E371DD8330B58C88E5139FE0,
+ E7E13531198D59DBBA4C662B,
+ D863CE538160FEA99CA9C8D7,
+ 027DC9E907D41AB65ED41A19,
+ 2C97D1FA0BABE40459BE1EBF,
+ 6E8D821026D7EE8B0908DC78,
+ 7A68D46ED33B01D9C6D4336A,
+ FD2D54F9796DC6AD8B44B1BA,
+ 41D3334EB54B7564EEF518AD,
+ 66D35449B829AAA516A3B3EE,
+ 255F09B020C78BC53F0590F7,
+ AD71CC8EDB3A5DA12769BD4C,
+ BC00B3AA990BC8A815F6CABA,
+ 6239E43B766890B87481632F,
+ 5D972F1246A6C93274AFBF6C,
+ 2447DD05D3E85277371C3DDC,
+ 222B0210054AE2788B85543A,
+ 5312C5E5970C909685D1ED22,
+ 1D2AC22DCF3EC1E94B0EC157,
+ 5B65E136ABE6B0F2A0C7E2F9,
+ ABCEE9650391F86C7446301B,
+ BE82BDB84D073A63AFD5FC8F,
+ FA85952C8D7AF09E40C50A59,
+ C822B9D3273ACBF5ACC5171B,
+ 8845FB50B2C667B7F0589436,
+ E3098C6B760546D26E2ABCD5,
+ F3CA742A33C411CABA1474E5,
+ ED57BDBF2CBD3A69B38469A1,
+ 4789B3203A38D4838842A7BD,
+ A52ADDED22FAC0B16C094DC0,
+ CDBAD016788D25C1CACEEEBB,
+ 06CE1616CB7CCAF571D22284,
+ FDE2800978CBA61215FB4B8D,
+ DBBD4944810610A4964E7E5A,
+ );
+ name = modules;
+ sourceTree = "";
+ };
+ 901406C9B1F149B0C0B43289 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 399573306D5863E703547480,
+ E26755374577FFB5E707A9F5,
+ 8D0FFA8F5E1C6730D9A5E2AA,
+ 2B5EF20D0BE840557CE1160D,
+ 6C33D4AA95D3CE36C5FB875A,
+ 151FC9EEA4B744DACDB42CC0,
+ 72E03A78D80650173EA0CA1E,
+ EA170B8B6946E4F4B51585CC,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ B27E2B7E5B8306F353B90601 /* filters */ = {
+ isa = PBXGroup;
+ children = (
+ B94E92C3BD0E5092613758F5,
+ 041BEB88DA227F6FD6010E21,
+ 1908D634F0667AE39D808E42,
+ 9605B68D1CE1587805167EB2,
+ 67D07D0D56CAC479531F872D,
+ 989E76CBBD4D928F7904C486,
+ E13842D977D9936CC80AF573,
+ ADCE1E0456C809693F709DED,
+ DA0CE9B957F77D30E335D3ED,
+ 7EE4116D0A34BF683817830D,
+ BD2838DB936BE9629B2BB8EB,
+ 9A4AE579197CA85CB6DC2E00,
+ C1C8F627AE476E76259E230D,
+ 9C02A5DAAEF2EE5E2817EAF4,
+ 7EFA42C122F3B3B1F51CCFEF,
+ 28B417B92CD8580382F1EEA6,
+ 81E07CC614444EA1D2C6A622,
+ 94A79414F5710BE9F7CE0F25,
+ C737EC23A7C3EDF0B3ACA9A6,
+ 2A26BBD2FAE20C114163C725,
+ 6198335FD2B2C61191F9FDA5,
+ 1486262161F4FEFB7CFE23C3,
+ 0FCCB2C421909685A85FCE92,
+ A29CD8B14F3A763D2925B935,
+ 62BF67FC1BAA877C027FA2F1,
+ 69BE0BA589BA563463D9F9B0,
+ 1ECE119271F8DBB4B472CEDC,
+ 840EF494D6B5644BCF60437A,
+ F7573476A217B5295788FBA9,
+ 82A4DB0391326CA1187FCD64,
+ B63B9D1D4CE12A3ED7D04C99,
+ );
+ name = filters;
+ sourceTree = "";
+ };
+ B3B22BD613B6765236444EE1 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ C4C772D9C3F472259A2210E3,
+ );
+ name = Resources;
+ sourceTree = "";
+ };
+ CE69B81244E05FBF06EBB0CA /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 5D399CECFA881A128860CF82,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ DD4BDF136754CD6AC8F34188 /* producers */ = {
+ isa = PBXGroup;
+ children = (
+ AC84FA84E37CE376E6B0F143,
+ 0229A4F7B30927BFB27FF116,
+ 7914CA03E625DA6C2D2F17DE,
+ 16CE62C4EA921F92531CD038,
+ );
+ name = producers;
+ sourceTree = "";
+ };
+ E05B1D929DDE764C0036CF5D /* wavetable */ = {
+ isa = PBXGroup;
+ children = (
+ BEB2199B9D0E8CE967C2D058,
+ 1FB8F41C7E6443B77B20D58E,
+ 5EC9F2BBF33A53731E4C84A7,
+ 18CFC8CF695AF8D867DFF71E,
+ B6D332113CEBB4575D39D759,
+ AADC8D92259BF7FA870AD5C2,
+ F42F2E34269BB03E30D5C7FC,
+ 27BF9E58229A475FCDBB75EC,
+ 93987B9A410C6D9A75DA7BCE,
+ 48906981B4DC648AF2B6B610,
+ C1000D0B43F6979A9D8FCE89,
+ B80414B88358846B3606B00C,
+ DC57E782579540CE3AA6D1D0,
+ D5E152239EBD7DF6BD15BDC1,
+ C1FB9104FAA342756EFBC9B3,
+ 36BE804913B09BDAC067418B,
+ 0005F194EED9FBFCC430D31F,
+ B91D19815CCF9FC9C9138696,
+ 7264AAD574AC720EDCC3EFA0,
+ A530C477C1D1BD4BB33F6BBF,
+ 90F11B4FC94F6BCD15AEF50A,
+ A3061EAE1063442BAEE785E0,
+ 29AF9491F2B0E09F26B2A9D0,
+ 53742E45041BDFDC42CEE78D,
+ 9B598D297253DFCB95003019,
+ EA9AA304032965F31C2DB5C9,
+ 844B68DF292BBEEFD4C46467,
+ 6768FE919CC4D66C78D51F64,
+ 0F1B29C31A277E6BB55D535B,
+ 68D27C77681B950238514276,
+ A2BB4D231753056CD4EF4B0D,
+ ADD69B20B4B503BE6D380D73,
+ );
+ name = wavetable;
+ sourceTree = "";
+ };
+ E17BE649952CD5666C1AE4D6 /* framework */ = {
+ isa = PBXGroup;
+ children = (
+ CD51BC31E5B1EDF354D13B9C,
+ 4405ABB56F60ED6A1FC9C4CD,
+ 52DFF6EF74914B02D96ACDF6,
+ 541D2F1F6732BF4D228D2FD4,
+ B4A2F94BF7F9E1116627036D,
+ 466E0F5634B209AB318E8B2C,
+ 3BDE1AE3C34779FF04C5FF59,
+ 98002A5C5184EB034F8061CF,
+ 712F3C6AA18B57E36E396999,
+ 88B1EF6629FE92F6D5608247,
+ 62F16E4A2DBDA19BA6140FD8,
+ 66372DA103FF4A556C878649,
+ 5252B9AA7BD8F256E8474296,
+ 786BA85AF93546A959B66E83,
+ 560D9D2096486815935BA930,
+ 73C17D14BD0F1250B3FAF66C,
+ B076A46B90BE1176BA64711E,
+ 33C08F59D16676B1560BBADB,
+ A94B379E551E1D8B55078B45,
+ E8CBC1255D1B332842BBBE78,
+ 3E156A83D9BE7445A4C3C91D,
+ 8AF0B0CEE02CC7F68265AABF,
+ F7EEE1FF6CC8B7A619066F65,
+ );
+ name = framework;
+ sourceTree = "";
+ };
+ E6F55E099A03EDB1F990708E /* Vita */ = {
+ isa = PBXGroup;
+ children = (
+ 22FE8F4953DBB1955B71409A,
+ );
+ name = Vita;
+ sourceTree = "";
+ };
+ E84590C6B6AC15CD59A65DCC /* JUCE Library Code */ = {
+ isa = PBXGroup;
+ children = (
+ 303FB7B5273832AB2FEC4C3F,
+ 960B92C3C44FA4F1846C6985,
+ 5D5ED2636412E0A240088B97,
+ F8E035506B4257624F2AE9D2,
+ 5677A18F3721228155DE5893,
+ B353A80BF55BDA9DC00631B9,
+ 85DC44CAD92B20F1C8E6B28D,
+ 73070D4A3F45AD1A39E2F9A0,
+ );
+ name = "JUCE Library Code";
+ sourceTree = "";
+ };
+ F5CDFCDF7EAC498A8513CA6C /* common */ = {
+ isa = PBXGroup;
+ children = (
+ E05B1D929DDE764C0036CF5D,
+ 11A2FA52D15D54B47378BFCB,
+ 9AC7DBC44623EE8AD521F82A,
+ E9AEB39A1020F39CCDF2180C,
+ 477448E534D21338A3EFE83E,
+ 82020CC4A48AC0E0BD1AF0F5,
+ 2B2DAF77E529EF609CE07E03,
+ AB079907889060B891C4E778,
+ F516DB15733061FA2656F285,
+ CA98FDA2AD5552AFD96D3ACD,
+ D0258E93F451A1A44636A6A4,
+ 96EB57DF51524AB7C4F989F3,
+ AECBC83AC89D73A996841BEE,
+ 3AB88E385538AB2ABBB58002,
+ 026B14D7F898B13DFF5995B3,
+ 6FCE542B01C79855D2121C1B,
+ CA472B975FCFA1B7A5D7FA9A,
+ 6635D2510EC0ADF4D11B8D01,
+ DA012E86B5E6710EC610418E,
+ 52931313598477293E1E772F,
+ FEEFF87BE139E30CAC0E2A93,
+ ABFBA3DC34FBA54614A997AF,
+ 97CB5BF3D13161B7508BF63F,
+ );
+ name = common;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 6596692BA7830705EC53F8D6 /* Vita - Dynamic Library */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 963B9D8C698685845CF3E827;
+ buildPhases = (
+ 920C754F585A1ECB70977D63,
+ B40F6AA3E574DBA0F6B5BA71,
+ 988A250A0CE0C87F29A83A17,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Vita - Dynamic Library";
+ productName = Vita;
+ productReference = 5D399CECFA881A128860CF82;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ F9CC39989FE65ABEACC63708 = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = YES;
+ LastUpgradeCheck = 1340;
+ ORGANIZATIONNAME = "";
+ };
+ buildConfigurationList = 0F75D88975ECE1C0FF2075E2;
+ compatibilityVersion = "Xcode 3.2";
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 667548BE990C9AFB45B785C4;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 6596692BA7830705EC53F8D6,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 920C754F585A1ECB70977D63 = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 1D38713E044E4966AD971F06,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ B40F6AA3E574DBA0F6B5BA71 = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 5049560055EDA9EC3DD36178,
+ 6648E3304493CE6F4A77F814,
+ ABBF69F3CCC630DB34EFB83B,
+ 9742BF4DD8C91343C3278747,
+ E37ACD5E5421E480AE2C9DF6,
+ 40DB5EBCF2594A9514167E9C,
+ 467CC0084730F18E04AA4E90,
+ 20169C80427D9D5214FDBED5,
+ B0056FE606707EBBED0D5895,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 578CB384E3858CEE6BCF7CCE /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = NO;
+ GCC_C_LANGUAGE_STANDARD = c11;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
+ GCC_WARN_MISSING_PARENTHESES = YES;
+ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_CODE_SIGN_FLAGS = --timestamp;
+ PRODUCT_NAME = "vita.so";
+ SDKROOT = macosx;
+ WARNING_CFLAGS = "-Wreorder";
+ ZERO_LINK = NO;
+ };
+ name = Debug;
+ };
+ 8E583243B67667A546D57AF2 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = NO;
+ GCC_C_LANGUAGE_STANDARD = c11;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
+ GCC_WARN_MISSING_PARENTHESES = YES;
+ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ OTHER_CODE_SIGN_FLAGS = --timestamp;
+ PRODUCT_NAME = "vita.so";
+ SDKROOT = macosx;
+ WARNING_CFLAGS = "-Wreorder";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D23E9F1ED24B53D3F39C993 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_CXX_LANGUAGE_STANDARD = "c++17";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_LINK_OBJC_RUNTIME = NO;
+ COMBINE_HIDPI_IMAGES = YES;
+ CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)";
+ COPY_PHASE_STRIP = NO;
+ EXCLUDED_ARCHS = "i386 arm64e";
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "_DEBUG=1",
+ "DEBUG=1",
+ "HEADLESS=1",
+ "NO_AUTH=1",
+ "JUCER_XCODE_MAC_E4F0A9CA=1",
+ "JUCE_APP_VERSION=99999.9.9",
+ "JUCE_APP_VERSION_HEX=0x869f0909",
+ "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",
+ );
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(SRCROOT)/../../JuceLibraryCode",
+ "$(SRCROOT)/../../../third_party/JUCE/modules",
+ "$(pythonLocation)/include/python$(PYTHONMAJOR)",
+ "$(SRCROOT)/../../../src/common",
+ "$(SRCROOT)/../../../src/common/wavetable",
+ "$(SRCROOT)/../../../src/interface/editor_components",
+ "$(SRCROOT)/../../../src/interface/editor_sections",
+ "$(SRCROOT)/../../../src/interface/look_and_feel",
+ "$(SRCROOT)/../../../src/interface/wavetable",
+ "$(SRCROOT)/../../../src/interface/wavetable/editors",
+ "$(SRCROOT)/../../../src/interface/wavetable/overlays",
+ "$(SRCROOT)/../../../src/standalone",
+ "$(SRCROOT)/../../../src/synthesis/synth_engine",
+ "$(SRCROOT)/../../../src/synthesis/effects",
+ "$(SRCROOT)/../../../src/synthesis/filters",
+ "$(SRCROOT)/../../../src/synthesis/framework",
+ "$(SRCROOT)/../../../src/synthesis/lookups",
+ "$(SRCROOT)/../../../src/synthesis/modulators",
+ "$(SRCROOT)/../../../src/synthesis/modules",
+ "$(SRCROOT)/../../../src/synthesis/producers",
+ "$(SRCROOT)/../../../src/synthesis/utilities",
+ "$(SRCROOT)/../../../third_party",
+ "$(SRCROOT)/../../../third_party/nanobind/include",
+ "$(inherited)",
+ );
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(pythonLocation)/lib\"",
+ "\"../../../third_party/nanobind/build/tests\"",
+ "\"../../../third_party/libfaust/darwin-x64/Release/lib\"",
+ "\"../../../third_party/libsamplerate/build_release/src\"",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 11.0;
+ MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../third_party/JUCE/modules $(pythonLocation)/include/python$(PYTHONMAJOR) $(SRCROOT)/../../../src/common $(SRCROOT)/../../../src/common/wavetable $(SRCROOT)/../../../src/interface/editor_components $(SRCROOT)/../../../src/interface/editor_sections $(SRCROOT)/../../../src/interface/look_and_feel $(SRCROOT)/../../../src/interface/wavetable $(SRCROOT)/../../../src/interface/wavetable/editors $(SRCROOT)/../../../src/interface/wavetable/overlays $(SRCROOT)/../../../src/standalone $(SRCROOT)/../../../src/synthesis/synth_engine $(SRCROOT)/../../../src/synthesis/effects $(SRCROOT)/../../../src/synthesis/filters $(SRCROOT)/../../../src/synthesis/framework $(SRCROOT)/../../../src/synthesis/lookups $(SRCROOT)/../../../src/synthesis/modulators $(SRCROOT)/../../../src/synthesis/modules $(SRCROOT)/../../../src/synthesis/producers $(SRCROOT)/../../../src/synthesis/utilities $(SRCROOT)/../../../third_party $(SRCROOT)/../../../third_party/nanobind/include";
+ OTHER_CFLAGS = "-fPIC";
+ OTHER_CPLUSPLUSFLAGS = "-fPIC";
+ OTHER_LDFLAGS = "-lnanobind-static -shared -Wl,-undefined,dynamic_lookup";
+ PRODUCT_BUNDLE_IDENTIFIER = design.dirt.Vita;
+ PRODUCT_NAME = "vita.so";
+ USE_HEADERMAP = NO;
+ VALID_ARCHS = "arm64 x86_64";
+ };
+ name = Debug;
+ };
+ BA99DDD341149651BC9361D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_CXX_LANGUAGE_STANDARD = "c++17";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_LINK_OBJC_RUNTIME = NO;
+ COMBINE_HIDPI_IMAGES = YES;
+ CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)";
+ DEAD_CODE_STRIPPING = YES;
+ EXCLUDED_ARCHS = "i386 arm64e";
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_OPTIMIZATION_LEVEL = fast;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "_NDEBUG=1",
+ "NDEBUG=1",
+ "HEADLESS=1",
+ "NO_AUTH=1",
+ "JUCER_XCODE_MAC_E4F0A9CA=1",
+ "JUCE_APP_VERSION=99999.9.9",
+ "JUCE_APP_VERSION_HEX=0x869f0909",
+ "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",
+ );
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(SRCROOT)/../../JuceLibraryCode",
+ "$(SRCROOT)/../../../third_party/JUCE/modules",
+ "$(pythonLocation)/include/python$(PYTHONMAJOR)",
+ "$(SRCROOT)/../../../src/common",
+ "$(SRCROOT)/../../../src/common/wavetable",
+ "$(SRCROOT)/../../../src/interface/editor_components",
+ "$(SRCROOT)/../../../src/interface/editor_sections",
+ "$(SRCROOT)/../../../src/interface/look_and_feel",
+ "$(SRCROOT)/../../../src/interface/wavetable",
+ "$(SRCROOT)/../../../src/interface/wavetable/editors",
+ "$(SRCROOT)/../../../src/interface/wavetable/overlays",
+ "$(SRCROOT)/../../../src/standalone",
+ "$(SRCROOT)/../../../src/synthesis/synth_engine",
+ "$(SRCROOT)/../../../src/synthesis/effects",
+ "$(SRCROOT)/../../../src/synthesis/filters",
+ "$(SRCROOT)/../../../src/synthesis/framework",
+ "$(SRCROOT)/../../../src/synthesis/lookups",
+ "$(SRCROOT)/../../../src/synthesis/modulators",
+ "$(SRCROOT)/../../../src/synthesis/modules",
+ "$(SRCROOT)/../../../src/synthesis/producers",
+ "$(SRCROOT)/../../../src/synthesis/utilities",
+ "$(SRCROOT)/../../../third_party",
+ "$(SRCROOT)/../../../third_party/nanobind/include",
+ "$(inherited)",
+ );
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(pythonLocation)/lib\"",
+ "\"../../../third_party/nanobind/build/tests\"",
+ "\"../../../third_party/libfaust/darwin-x64/Release/lib\"",
+ "\"../../../third_party/libsamplerate/build_release/src\"",
+ );
+ LLVM_LTO = YES;
+ MACOSX_DEPLOYMENT_TARGET = 11.0;
+ MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../third_party/JUCE/modules $(pythonLocation)/include/python$(PYTHONMAJOR) $(SRCROOT)/../../../src/common $(SRCROOT)/../../../src/common/wavetable $(SRCROOT)/../../../src/interface/editor_components $(SRCROOT)/../../../src/interface/editor_sections $(SRCROOT)/../../../src/interface/look_and_feel $(SRCROOT)/../../../src/interface/wavetable $(SRCROOT)/../../../src/interface/wavetable/editors $(SRCROOT)/../../../src/interface/wavetable/overlays $(SRCROOT)/../../../src/standalone $(SRCROOT)/../../../src/synthesis/synth_engine $(SRCROOT)/../../../src/synthesis/effects $(SRCROOT)/../../../src/synthesis/filters $(SRCROOT)/../../../src/synthesis/framework $(SRCROOT)/../../../src/synthesis/lookups $(SRCROOT)/../../../src/synthesis/modulators $(SRCROOT)/../../../src/synthesis/modules $(SRCROOT)/../../../src/synthesis/producers $(SRCROOT)/../../../src/synthesis/utilities $(SRCROOT)/../../../third_party $(SRCROOT)/../../../third_party/nanobind/include";
+ OTHER_CFLAGS = "-fPIC";
+ OTHER_CPLUSPLUSFLAGS = "-fPIC";
+ OTHER_LDFLAGS = "-lnanobind-static -shared -Wl,-undefined,dynamic_lookup";
+ PRODUCT_BUNDLE_IDENTIFIER = design.dirt.Vita;
+ PRODUCT_NAME = "vita.so";
+ USE_HEADERMAP = NO;
+ VALID_ARCHS = "arm64 x86_64";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 0F75D88975ECE1C0FF2075E2 = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 578CB384E3858CEE6BCF7CCE,
+ 8E583243B67667A546D57AF2,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Debug;
+ };
+ 963B9D8C698685845CF3E827 = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D23E9F1ED24B53D3F39C993,
+ BA99DDD341149651BC9361D1,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Debug;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = F9CC39989FE65ABEACC63708 /* Project object */;
+}
diff --git a/headless/vita.jucer b/headless/vita.jucer
new file mode 100644
index 0000000..e57f0cc
--- /dev/null
+++ b/headless/vita.jucer
@@ -0,0 +1,411 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..9787c3b
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..7be2076
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,119 @@
+#! /usr/bin/env python
+
+# NOTE: You can test building wheels locally with
+# `python -m build --wheel`
+# Then in the `dist` directory, `pip install vita`
+
+import setuptools
+from setuptools import setup, Extension
+from setuptools.dist import Distribution
+import os
+import os.path
+from pathlib import Path
+import shutil
+import platform
+import glob
+
+
+this_dir = os.path.abspath(os.path.dirname(__file__))
+
+def get_VITA_VERSION():
+ with open('vita/version.py', 'r') as f:
+ text = f.read()
+ version = text.split("=")[-1].strip().replace('"', "")
+ return version
+
+VITA_VERSION = get_VITA_VERSION()
+
+
+class BinaryDistribution(Distribution):
+ """Distribution which always forces a binary package with platform name"""
+ def has_ext_modules(foo):
+ return True
+
+
+ext_modules = []
+package_data = []
+
+shutil.copy('LICENSE', 'vita')
+
+if platform.system() == "Windows":
+
+ build_folder = os.path.join(this_dir, "headless", "builds", "VisualStudio2022", "x64", "Release", "Dynamic Library")
+ shutil.copy(os.path.join(build_folder, 'vita.dll'), os.path.join('vita', 'vita.pyd'))
+
+ package_data += ['vita/vita.pyd']
+
+elif platform.system() == "Linux":
+
+ files = ['vita/vita.so']
+ for file in files:
+ filepath = os.path.abspath(file)
+ assert os.path.isfile(filepath), ValueError("File not found: " + filepath)
+ print('Using compiled files: ', str(files))
+
+ package_data += files
+
+elif platform.system() == "Darwin":
+
+ build_folder = os.path.join(this_dir, "headless", "builds", "osx", "build", "Release")
+
+ shutil.copy(os.path.join(build_folder, 'vita.so'), os.path.join('vita', 'vita.so'))
+
+ package_data += ['vita/vita.so']
+
+else:
+ raise NotImplementedError(
+ f"setup.py hasn't been implemented for platform: {platform}."
+ )
+
+package_data.append('vita/LICENSE')
+
+# Every item in package_data should be inside the vita directory.
+# Then we make the paths relative to this directory.
+package_data = [os.path.relpath(os.path.abspath(a), os.path.join(this_dir, "vita")).replace('\\', '/') for a in package_data]
+print('package_data: ', package_data)
+long_description = (Path(__file__).parent / "README.md").read_text()
+
+setup(
+ name='vita',
+ url='https://github.com/DBraun/Vita',
+ project_urls={
+ 'Documentation': 'https://dirt.design/Vita',
+ 'Source': 'https://github.com/DBraun/Vita',
+ },
+ version=VITA_VERSION,
+ author='David Braun',
+ author_email='braun@ccrma.stanford.edu',
+ description='Python bindings for the Vital synthesizer',
+ long_description=long_description,
+ long_description_content_type='text/markdown',
+ classifiers=[
+ "Development Status :: 3 - Alpha",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
+ "Operating System :: MacOS",
+ "Operating System :: Microsoft :: Windows",
+ "Operating System :: POSIX :: Linux",
+ "Programming Language :: C++",
+ "Programming Language :: Python",
+ "Topic :: Multimedia :: Sound/Audio",
+ "Programming Language :: Python :: 3.9",
+ "Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
+ ],
+ keywords='audio music sound synthesizer',
+ python_requires=">=3.9",
+ install_requires=[],
+ packages=setuptools.find_packages(),
+ py_modules=['vita'],
+ include_package_data=True,
+ package_data={
+ "": package_data
+ },
+ zip_safe=False,
+ distclass=BinaryDistribution,
+ ext_modules=ext_modules
+)
diff --git a/src/common/synth_base.cpp b/src/common/synth_base.cpp
index 80c64f0..c2fc096 100644
--- a/src/common/synth_base.cpp
+++ b/src/common/synth_base.cpp
@@ -26,6 +26,10 @@
#include "synth_parameters.h"
#include "utils.h"
+#include
+#include
+#include
+
SynthBase::SynthBase() : expired_(false) {
expired_ = LoadSave::isExpired();
self_reference_ = std::make_shared();
@@ -190,6 +194,22 @@ bool SynthBase::connectModulation(const std::string& source, const std::string&
return create;
}
+bool SynthBase::pyConnectModulation(const std::string& source, const std::string& destination) {
+ vital::ModulationConnection* connection = getConnection(source, destination);
+ bool create = connection == nullptr;
+ if (create)
+ connection = getModulationBank().createConnection(source, destination);
+
+ if (connection) {
+ connectModulation(connection);
+
+ LineGenerator* map_generator = connection->modulation_processor->lineMapGenerator();
+ map_generator->initLinear(); // todo: allow more options via kwarg
+ }
+
+ return create;
+}
+
void SynthBase::disconnectModulation(vital::ModulationConnection* connection) {
if (mod_connections_.count(connection) == 0)
return;
@@ -380,7 +400,53 @@ bool SynthBase::loadFromFile(File preset, std::string& error) {
return true;
}
-void SynthBase::renderAudioToFile(File file, float seconds, float bpm, std::vector notes, bool render_images) {
+bool SynthBase::pyLoadFromFile(std::string path) {
+ try {
+ File jsonFile(path);
+ std::string error;
+ bool result = loadFromFile(jsonFile, error);
+ if (!result) {
+ std::cerr << "Error: " << error << std::endl;
+ }
+ return result;
+ } catch (const std::exception& e) {
+ std::cerr << "Error: " << e.what() << '\n';
+ }
+ return false;
+}
+
+bool SynthBase::loadFromString(std::string json_text) {
+ std::string error;
+ try {
+ json parsed_json_state = json::parse(json_text, nullptr);
+ if (!loadFromJson(parsed_json_state)) {
+ error = "Preset was created with a newer version.";
+ return false;
+ }
+
+ //active_file_ = preset; // todo:
+ } catch (const json::exception& e) {
+ error = "Preset file is corrupted.";
+ return false;
+ }
+
+ //setPresetName(preset.getFileNameWithoutExtension()); // todo:
+
+ SynthGuiInterface* gui_interface = getGuiInterface();
+ if (gui_interface) {
+ gui_interface->updateFullGui();
+ gui_interface->notifyFresh();
+ }
+
+ return true;
+}
+
+void SynthBase::pySetBPM(float bpm) {
+ // todo: this is hopefully safe as a public method just for headless mode.
+ engine_->setBpm(bpm);
+};
+
+void SynthBase::renderAudioToFile(File file, std::vector notes, float velocity, float note_dur, float render_dur, bool render_images) {
static constexpr int kSampleRate = 44100;
static constexpr int kPreProcessSamples = 44100;
static constexpr int kFadeSamples = 200;
@@ -390,13 +456,14 @@ void SynthBase::renderAudioToFile(File file, float seconds, float bpm, std::vect
static constexpr int kImageWidth = 500;
static constexpr int kImageHeight = 250;
static constexpr int kOscilloscopeResolution = 512;
- static constexpr float kFadeRatio = 0.3f;
ScopedLock lock(getCriticalSection());
+ engine_->allSoundsOff(); // note: dbraun added this
+
processModulationChanges();
engine_->setSampleRate(kSampleRate);
- engine_->setBpm(bpm);
+// engine_->setBpm(bpm);
engine_->updateAllModulationSwitches();
double sample_time = 1.0 / getSampleRate();
@@ -409,15 +476,15 @@ void SynthBase::renderAudioToFile(File file, float seconds, float bpm, std::vect
}
for (int note : notes)
- engine_->noteOn(note, 0.7f, 0, 0);
+ engine_->noteOn(note, velocity, 0, 0);
file.deleteFile();
std::unique_ptr file_stream = file.createOutputStream();
WavAudioFormat wav_format;
std::unique_ptr writer(wav_format.createWriterFor(file_stream.get(), kSampleRate, 2, 16, {}, 0));
- int on_samples = seconds * kSampleRate;
- int total_samples = on_samples + seconds * kSampleRate * kFadeRatio;
+ int on_samples = note_dur * kSampleRate;
+ int total_samples = render_dur * kSampleRate;
std::unique_ptr left_buffer = std::make_unique(kBufferSize);
std::unique_ptr right_buffer = std::make_unique(kBufferSize);
float* buffers[2] = { left_buffer.get(), right_buffer.get() };
@@ -505,6 +572,87 @@ void SynthBase::renderAudioToFile(File file, float seconds, float bpm, std::vect
file_stream.release();
}
+nb::ndarray, nb::numpy> SynthBase::renderAudioToNumpy(const int& midi_note, float velocity, float note_dur, float render_dur) {
+ static constexpr int kSampleRate = 44100;
+ static constexpr int kFadeSamples = 200;
+ static constexpr int kBufferSize = 64;
+ static constexpr int kPreProcessSamples = 256; // note: dbraun decreased this from 44100.
+
+ ScopedLock lock(getCriticalSection());
+
+ engine_->allSoundsOff(); // note: dbraun added this
+
+ processModulationChanges();
+ engine_->setSampleRate(kSampleRate);
+ engine_->updateAllModulationSwitches();
+
+ // Preprocess modulation
+ double sample_time = 1.0 / getSampleRate();
+ double current_time = -kPreProcessSamples * sample_time;
+
+ for (int samples = 0; samples < kPreProcessSamples; samples += kBufferSize) {
+ engine_->correctToTime(current_time);
+ current_time += kBufferSize * sample_time;
+ engine_->process(kBufferSize);
+ }
+
+ engine_->noteOn(midi_note, velocity, 0, 0);
+
+ int on_samples = note_dur * kSampleRate;
+ int total_samples = render_dur * kSampleRate;
+ const vital::mono_float* engine_output =
+ (const vital::mono_float*)engine_->output(0)->buffer;
+
+ size_t total_frames =
+ static_cast(total_samples * 2); // stereo: 2 channels
+
+ auto* data = new float[total_frames](); // Zero-initialized
+ auto capsule = nb::capsule(
+ data, [](void* p) noexcept { delete[] static_cast(p); });
+
+ int baseSample = 0;
+
+ for (int samples = 0; samples < total_samples; samples += kBufferSize) {
+ engine_->correctToTime(current_time);
+ current_time += kBufferSize * sample_time;
+ engine_->process(kBufferSize);
+ updateMemoryOutput(kBufferSize, engine_->output(0)->buffer);
+
+ if (on_samples > samples && on_samples <= samples + kBufferSize) {
+ engine_->noteOff(midi_note, 0.5f, 0, 0);
+ }
+
+ for (int i = 0; i < kBufferSize; ++i) {
+ vital::mono_float t = (total_samples - samples) / (1.0f * kFadeSamples);
+ t = vital::utils::min(t, 1.0f);
+ baseSample = samples + i;
+ if (baseSample < total_samples) {
+ data[samples + i] = t * engine_output[vital::poly_float::kSize * i];
+ data[samples + i + total_samples] =
+ t * engine_output[vital::poly_float::kSize * i + 1];
+ }
+ }
+ }
+
+ // Return the data as a NumPy array
+ return nb::ndarray, nb::numpy>(
+ data, {2, static_cast(total_samples)}, capsule);
+}
+
+bool SynthBase::renderAudioToFile2(const std::string& output_path, const int& midi_note, float velocity, float note_dur, float render_dur) {
+ File output_file(output_path);
+ if (!output_file.hasWriteAccess()) {
+ std::cout << "Error: Don't have permission to write output file." << newLine;
+ return false;
+ }
+ bool render_images = false;
+ std::vector midi_notes = {midi_note};
+
+ renderAudioToFile(output_file, midi_notes, velocity, note_dur, render_dur, render_images);
+ return true;
+}
+
+
void SynthBase::renderAudioForResynthesis(float* data, int samples, int note) {
static constexpr int kPreProcessSamples = 44100;
static constexpr int kBufferSize = 64;
diff --git a/src/common/synth_base.h b/src/common/synth_base.h
index 246c14b..5c4fe83 100644
--- a/src/common/synth_base.h
+++ b/src/common/synth_base.h
@@ -28,6 +28,14 @@
#include
#include
+#include
+#include
+
+#include
+
+namespace nb = nanobind;
+
+
namespace vital {
class SoundEngine;
struct Output;
@@ -58,6 +66,7 @@ class SynthBase : public MidiManager::Listener {
void valueChangedExternal(const std::string& name, vital::mono_float value);
void valueChangedInternal(const std::string& name, vital::mono_float value);
bool connectModulation(const std::string& source, const std::string& destination);
+ bool pyConnectModulation(const std::string& source, const std::string& destination);
void connectModulation(vital::ModulationConnection* connection);
void disconnectModulation(const std::string& source, const std::string& destination);
void disconnectModulation(vital::ModulationConnection* connection);
@@ -83,7 +92,12 @@ class SynthBase : public MidiManager::Listener {
void loadTuningFile(const File& file);
void loadInitPreset();
bool loadFromFile(File preset, std::string& error);
- void renderAudioToFile(File file, float seconds, float bpm, std::vector notes, bool render_images);
+ bool pyLoadFromFile(std::string path);
+ std::string pyToJson() { return saveToJson().dump(); }
+ bool loadFromString(std::string json_text);
+ void renderAudioToFile(File file, std::vector notes, float velocity, float note_dur, float render_dur, bool render_images);
+ bool renderAudioToFile2(const std::string& output_path, const int& midi_note, float velocity, float note_dur, float render_dur);
+ nb::ndarray, nb::numpy> renderAudioToNumpy(const int& midi_note, float velocity, float note_dur, float render_dur);
void renderAudioForResynthesis(float* data, int samples, int note);
bool saveToFile(File preset);
bool saveToActiveFile();
@@ -123,6 +137,8 @@ class SynthBase : public MidiManager::Listener {
virtual const CriticalSection& getCriticalSection() = 0;
virtual void pauseProcessing(bool pause) = 0;
Tuning* getTuning() { return &tuning_; }
+
+ void pySetBPM(float bpm);
struct ValueChangedCallback : public CallbackMessage {
ValueChangedCallback(std::shared_ptr listener, std::string name, vital::mono_float val) :
diff --git a/src/headless/bindings.cpp b/src/headless/bindings.cpp
new file mode 100644
index 0000000..9cac6df
--- /dev/null
+++ b/src/headless/bindings.cpp
@@ -0,0 +1,434 @@
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "compressor.h"
+#include "processor_router.h"
+#include "random_lfo.h"
+#include "sound_engine.h"
+#include "synth_base.h"
+#include "synth_filter.h"
+#include "synth_lfo.h"
+#include "synth_oscillator.h"
+#include "value.h"
+#include "voice_handler.h"
+#include "wave_frame.h"
+
+namespace nb = nanobind;
+using namespace vital;
+
+
+class ModulationDestinationListCache {
+ private:
+ static std::vector cached_list;
+ static bool initialized;
+
+ static void initialize() {
+ if (!initialized) {
+ SoundEngine engine;
+ vital::input_map &mono_destination_map =
+ engine.getMonoModulationDestinations();
+ for (auto &destination_iter : mono_destination_map) {
+ cached_list.push_back(destination_iter.first);
+ }
+ initialized = true;
+ }
+ }
+
+ public:
+ static const std::vector &get() {
+ initialize();
+ return cached_list;
+ }
+};
+
+class ModulationSourceListCache {
+ private:
+ static std::vector cached_list;
+ static bool initialized;
+
+ static void initialize() {
+ if (!initialized) {
+ SoundEngine engine;
+ vital::output_map &source_map = engine.getModulationSources();
+ for (auto &source_iter : source_map) {
+ cached_list.push_back(source_iter.first);
+ }
+ initialized = true;
+ }
+ }
+
+ public:
+ static const std::vector &get() {
+ initialize();
+ return cached_list;
+ }
+};
+
+// Initialize static members
+std::vector ModulationDestinationListCache::cached_list;
+bool ModulationDestinationListCache::initialized = false;
+std::vector ModulationSourceListCache::cached_list;
+bool ModulationSourceListCache::initialized = false;
+
+
+nb::list get_modulation_destinations() {
+ const auto &cpp_list = ModulationDestinationListCache::get();
+ nb::list result;
+
+ for (const auto &str : cpp_list) {
+ result.append(str);
+ }
+
+ return result;
+}
+
+
+nb::list get_modulation_sources() {
+ const auto &cpp_list = ModulationSourceListCache::get();
+ nb::list result;
+
+ for (const auto &str : cpp_list) {
+ result.append(str);
+ }
+
+ return result;
+}
+
+
+NB_MODULE(vita, m) {
+
+ m.def("get_modulation_sources", &get_modulation_sources,
+ "Returns a list of allowed modulation sources.");
+
+ m.def("get_modulation_destinations", &get_modulation_destinations,
+ "Returns a list of allowed modulation destinations");
+
+ auto m_constants = m.def_submodule("constants", "Submodule containing constants and enums");
+
+ // Expose Enums
+ nb::enum_(m_constants, "SourceDestination")
+ .value("Filter1", constants::SourceDestination::kFilter1)
+ .value("Filter2", constants::SourceDestination::kFilter2)
+ .value("DualFilters", constants::SourceDestination::kDualFilters)
+ .value("Effects", constants::SourceDestination::kEffects)
+ .value("DirectOut", constants::SourceDestination::kDirectOut)
+ .def("__int__", [](constants::SourceDestination self) {
+ return static_cast(self);
+ });
+
+ nb::enum_(m_constants, "Effect")
+ .value("Chorus", constants::Effect::kChorus)
+ .value("Compressor", constants::Effect::kCompressor)
+ .value("Delay", constants::Effect::kDelay)
+ .value("Distortion", constants::Effect::kDistortion)
+ .value("Eq", constants::Effect::kEq)
+ .value("FilterFx", constants::Effect::kFilterFx)
+ .value("Flanger", constants::Effect::kFlanger)
+ .value("Phaser", constants::Effect::kPhaser)
+ .value("Reverb", constants::Effect::kReverb)
+ .def("__int__",
+ [](constants::Effect self) { return static_cast(self); });
+
+ nb::enum_(m_constants, "FilterModel")
+ .value("Analog", constants::FilterModel::kAnalog)
+ .value("Dirty", constants::FilterModel::kDirty)
+ .value("Ladder", constants::FilterModel::kLadder)
+ .value("Digital", constants::FilterModel::kDigital)
+ .value("Diode", constants::FilterModel::kDiode)
+ .value("Formant", constants::FilterModel::kFormant)
+ .value("Comb", constants::FilterModel::kComb)
+ .value("Phase", constants::FilterModel::kPhase)
+ .def("__int__", [](constants::FilterModel self) {
+ return static_cast(self);
+ });
+
+ nb::enum_(m_constants, "RetriggerStyle")
+ .value("Free", constants::RetriggerStyle::kFree)
+ .value("Retrigger", constants::RetriggerStyle::kRetrigger)
+ .value("SyncToPlayHead", constants::RetriggerStyle::kSyncToPlayHead)
+ .def("__int__", [](constants::RetriggerStyle self) {
+ return static_cast(self);
+ });
+
+ nb::enum_(m_constants, "SpectralMorph")
+ .value("NoSpectralMorph", SynthOscillator::SpectralMorph::kNoSpectralMorph)
+ .value("Vocode", SynthOscillator::SpectralMorph::kVocode)
+ .value("FormScale", SynthOscillator::SpectralMorph::kFormScale)
+ .value("HarmonicScale", SynthOscillator::SpectralMorph::kHarmonicScale)
+ .value("InharmonicScale", SynthOscillator::SpectralMorph::kInharmonicScale)
+ .value("Smear", SynthOscillator::SpectralMorph::kSmear)
+ .value("RandomAmplitudes", SynthOscillator::SpectralMorph::kRandomAmplitudes)
+ .value("LowPass", SynthOscillator::SpectralMorph::kLowPass)
+ .value("HighPass", SynthOscillator::SpectralMorph::kHighPass)
+ .value("PhaseDisperse", SynthOscillator::SpectralMorph::kPhaseDisperse)
+ .value("ShepardTone", SynthOscillator::SpectralMorph::kShepardTone)
+ .value("Skew", SynthOscillator::SpectralMorph::kSkew)
+ .def("__int__", [](SynthOscillator::SpectralMorph self) {
+ return static_cast(self);
+ });
+
+ nb::enum_(m_constants, "DistortionType")
+ .value("None", SynthOscillator::DistortionType::kNone)
+ .value("Sync", SynthOscillator::DistortionType::kSync)
+ .value("Formant", SynthOscillator::DistortionType::kFormant)
+ .value("Quantize", SynthOscillator::DistortionType::kQuantize)
+ .value("Bend", SynthOscillator::DistortionType::kBend)
+ .value("Squeeze", SynthOscillator::DistortionType::kSqueeze)
+ .value("PulseWidth", SynthOscillator::DistortionType::kPulseWidth)
+ .value("FmOscillatorA", SynthOscillator::DistortionType::kFmOscillatorA)
+ .value("FmOscillatorB", SynthOscillator::DistortionType::kFmOscillatorB)
+ .value("FmSample", SynthOscillator::DistortionType::kFmSample)
+ .value("RmOscillatorA", SynthOscillator::DistortionType::kRmOscillatorA)
+ .value("RmOscillatorB", SynthOscillator::DistortionType::kRmOscillatorB)
+ .value("RmSample", SynthOscillator::DistortionType::kRmSample)
+ .def("__int__", [](SynthOscillator::DistortionType self) {
+ return static_cast(self);
+ });
+
+ nb::enum_(m_constants, "UnisonStackType")
+ .value("Normal", SynthOscillator::UnisonStackType::kNormal)
+ .value("CenterDropOctave", SynthOscillator::UnisonStackType::kCenterDropOctave)
+ .value("CenterDropOctave2", SynthOscillator::UnisonStackType::kCenterDropOctave2)
+ .value("Octave", SynthOscillator::UnisonStackType::kOctave)
+ .value("Octave2", SynthOscillator::UnisonStackType::kOctave2)
+ .value("PowerChord", SynthOscillator::UnisonStackType::kPowerChord)
+ .value("PowerChord2", SynthOscillator::UnisonStackType::kPowerChord2)
+ .value("MajorChord", SynthOscillator::UnisonStackType::kMajorChord)
+ .value("MinorChord", SynthOscillator::UnisonStackType::kMinorChord)
+ .value("HarmonicSeries", SynthOscillator::UnisonStackType::kHarmonicSeries)
+ .value("OddHarmonicSeries",
+ SynthOscillator::UnisonStackType::kOddHarmonicSeries)
+ .def("__int__", [](SynthOscillator::UnisonStackType self) {
+ return static_cast(self);
+ });
+
+ nb::enum_(m_constants, "RandomLFOStyle")
+ .value("Perlin", RandomLfo::RandomType::kPerlin)
+ .value("SampleAndHold", RandomLfo::RandomType::kSampleAndHold)
+ .value("SinInterpolate", RandomLfo::RandomType::kSinInterpolate)
+ .value("LorenzAttractor", RandomLfo::RandomType::kLorenzAttractor)
+ .def("__int__",
+ [](RandomLfo::RandomType self) { return static_cast(self); });
+
+ nb::enum_(m_constants, "VoicePriority")
+ .value("Newest", VoiceHandler::VoicePriority::kNewest)
+ .value("Oldest", VoiceHandler::VoicePriority::kOldest)
+ .value("Highest", VoiceHandler::VoicePriority::kHighest)
+ .value("Lowest", VoiceHandler::VoicePriority::kLowest)
+ .value("RoundRobin", VoiceHandler::VoicePriority::kRoundRobin)
+ .def("__int__", [](VoiceHandler::VoicePriority self) {
+ return static_cast(self);
+ });
+
+ nb::enum_(m_constants, "VoiceOverride")
+ .value("Kill",VoiceHandler::VoiceOverride::kKill)
+ .value("Steal", VoiceHandler::VoiceOverride::kSteal)
+ .def("__int__", [](VoiceHandler::VoiceOverride self) {
+ return static_cast(self);
+ });
+
+ nb::enum_(m_constants, "WaveShape")
+ .value("Sin", PredefinedWaveFrames::kSin)
+ .value("SaturatedSin", PredefinedWaveFrames::kSaturatedSin)
+ .value("Triangle", PredefinedWaveFrames::kTriangle)
+ .value("Square", PredefinedWaveFrames::kSquare)
+ .value("Pulse", PredefinedWaveFrames::kPulse)
+ .value("Saw", PredefinedWaveFrames::kSaw)
+ .def("__int__", [](PredefinedWaveFrames::Shape self) {
+ return static_cast(self);
+ });
+
+ nb::enum_(m_constants, "SynthLFOSyncType")
+ .value("Trigger", SynthLfo::SyncType::kTrigger)
+ .value("Sync", SynthLfo::SyncType::kSync)
+ .value("Envelope", SynthLfo::SyncType::kEnvelope)
+ .value("SustainEnvelope", SynthLfo::SyncType::kSustainEnvelope)
+ .value("LoopPoint", SynthLfo::SyncType::kLoopPoint)
+ .value("LoopHold", SynthLfo::SyncType::kLoopHold)
+ .def("__int__",
+ [](SynthLfo::SyncType self) { return static_cast(self); });
+
+ nb::enum_(m_constants, "CompressorBandOption")
+ .value("Multiband", MultibandCompressor::BandOptions::kMultiband)
+ .value("LowBand", MultibandCompressor::BandOptions::kLowBand)
+ .value("HighBand", MultibandCompressor::BandOptions::kHighBand)
+ .value("SingleBand", MultibandCompressor::BandOptions::kSingleBand)
+ .def("__int__", [](MultibandCompressor::BandOptions self) {
+ return static_cast(self);
+ });
+
+ nb::enum_(m_constants, "SynthFilterStyle")
+ .value("k12Db", SynthFilter::Style::k12Db)
+ .value("k24Db", SynthFilter::Style::k24Db)
+ .value("NotchPassSwap", SynthFilter::Style::kNotchPassSwap)
+ .value("DualNotchBand", SynthFilter::Style::kDualNotchBand)
+ .value("BandPeakNotch", SynthFilter::Style::kBandPeakNotch)
+ .value("Shelving", SynthFilter::Style::kShelving)
+ .def("__int__",
+ [](SynthFilter::Style self) { return static_cast(self); });
+
+// https://github.com/mtytel/vital/blob/636ca0ef517a4db087a6a08a6a8a5e704e21f836/src/interface/look_and_feel/synth_strings.h#L174
+ enum SyncedFrequencyName {
+ k32_1,
+ k16_1,
+ k8_1,
+ k4_1,
+ k2_1,
+ k1_1,
+ k1_2,
+ k1_4,
+ k1_8,
+ k1_16,
+ k1_32,
+ k1_64
+ };
+
+ nb::enum_(m_constants, "SyncedFrequency")
+ .value("k32_1", SyncedFrequencyName::k32_1)
+ .value("k16_1", SyncedFrequencyName::k16_1)
+ .value("k8_1", SyncedFrequencyName::k8_1)
+ .value("k4_1", SyncedFrequencyName::k4_1)
+ .value("k2_1", SyncedFrequencyName::k2_1)
+ .value("k1_1", SyncedFrequencyName::k1_1)
+ .value("k1_2", SyncedFrequencyName::k1_2)
+ .value("k1_4", SyncedFrequencyName::k1_4)
+ .value("k1_8", SyncedFrequencyName::k1_8)
+ .value("k1_16", SyncedFrequencyName::k1_16)
+ .value("k1_32", SyncedFrequencyName::k1_32)
+ .value("k1_64", SyncedFrequencyName::k1_64)
+ .def("__int__",
+ [](SyncedFrequencyName self) { return static_cast(self); });
+
+// https://github.com/mtytel/vital/blob/636ca0ef517a4db087a6a08a6a8a5e704e21f836/src/synthesis/modulators/synth_lfo.h#L58C1-L65C9
+ enum SyncOption {
+ kTime,
+ kTempo,
+ kDottedTempo,
+ kTripletTempo,
+ kKeytrack,
+ };
+
+ nb::enum_(m_constants, "SynthLFOSyncOption")
+ .value("Time", SyncOption::kTime)
+ .value("Tempo", SyncOption::kTempo)
+ .value("DottedTempo", SyncOption::kDottedTempo)
+ .value("TripletTempo", SyncOption::kTripletTempo)
+ .value("Keytrack", SyncOption::kKeytrack)
+ .def("__int__", [](SyncOption self) { return static_cast(self); });
+
+ // Binding for poly_float
+ nb::class_(m, "poly_float")
+ .def(nb::init_implicit());
+
+ // Expose the ProcessorRouter class
+ nb::class_(m, "ProcessorRouter")
+ .def(nb::init(),
+ nb::arg("num_inputs") = 0,
+ nb::arg("num_outputs") = 0,
+ nb::arg("control_rate") = false);
+
+ nb::class_(m, "Value")
+ .def(nb::init(),
+ nb::arg("value") = 0.0f,
+ nb::arg("control_rate") = false)
+ .def("process", &vital::Value::process, nb::arg("num_samples"))
+ .def("set_oversample_amount", &vital::Value::setOversampleAmount, nb::arg("oversample"))
+ .def("value", &vital::Value::value)
+ // Handle floating point values (both float and double)
+ .def("set", [](vital::Value &self, double value) {
+ self.set(poly_float(static_cast(value)));
+ }, nb::arg("value"))
+ // Handle enum values
+ .def("set", [](vital::Value &self, SyncedFrequencyName value) {
+ self.set(poly_float(static_cast(static_cast(value))));
+ }, nb::arg("value"))
+ // Handle integer values
+ .def("set", [](vital::Value &self, int value) {
+ self.set(poly_float(static_cast(value)));
+ }, nb::arg("value"))
+ .def("__repr__", [](const vital::Value &v) {
+ return "";
+ });
+
+ nb::class_(m, "CRValue")
+ .def(nb::init(),
+ nb::arg("value") = 0.0f)
+ .def("process", &vital::cr::Value::process, nb::arg("num_samples"))
+ // Add the same method overloads for CRValue
+ .def("set", [](vital::cr::Value &self, double value) {
+ self.set(poly_float(static_cast(value)));
+ }, nb::arg("value"))
+ .def("set", [](vital::cr::Value &self, SyncedFrequencyName value) {
+ self.set(poly_float(static_cast(static_cast(value))));
+ }, nb::arg("value"))
+ .def("set", [](vital::cr::Value &self, int value) {
+ self.set(poly_float(static_cast(value)));
+ }, nb::arg("value"))
+ .def("__repr__", [](const vital::cr::Value &v) {
+ return "";
+ });
+
+ // Expose the SynthBase class, specifying ProcessorRouter as its base
+ nb::class_(m, "Synth")
+ .def(nb::init<>()) // Ensure there's a default constructor or adjust
+ // accordingly
+ // Bind the first overload of connectModulation
+ .def("connect_modulation",
+ nb::overload_cast(
+ &HeadlessSynth::pyConnectModulation),
+ nb::arg("source"), nb::arg("destination"),
+ "Connects a modulation source to a destination by name.")
+
+ .def("disconnect_modulation",
+ nb::overload_cast(
+ &HeadlessSynth::disconnectModulation),
+ nb::arg("source"), nb::arg("destination"),
+ "Disconnects a modulation source from a destination by name.")
+
+ .def("set_bpm", &HeadlessSynth::pySetBPM, nb::arg("bpm"))
+
+ .def("render_file", &HeadlessSynth::renderAudioToFile2,
+ nb::arg("output_path"), nb::arg("midi_note"),
+ nb::arg("midi_velocity"), nb::arg("note_dur"),
+ nb::arg("render_dur"),
+ "Renders audio to a file.\n\n"
+ "Parameters:\n"
+ " output_path (str): Path to the output audio file.\n"
+ " midi_note (int): MIDI note to render.\n"
+ " midi_velocity (float): Velocity of the note [0-1].\n"
+ " note_dur (float): Length of the note sustain in seconds.\n"
+ " render_dur (float): Length of the audio render in seconds.\n"
+ "\n"
+ "Returns:\n"
+ " bool: True if rendering was successful, False otherwise.")
+
+ .def("render", &HeadlessSynth::renderAudioToNumpy, nb::arg("midi_note"),
+ nb::arg("midi_velocity"), nb::arg("note_dur"),
+ nb::arg("render_dur"),
+ "Renders audio to a file.\n\n"
+ "Parameters:\n"
+ " midi_note (int): MIDI note to render.\n"
+ " midi_velocity (float): Velocity of the note [0-1].\n"
+ " note_dur (float): Length of the note sustain in seconds.\n"
+ " render_dur (float): Length of the audio render in seconds.\n"
+ "\n"
+ "Returns:\n"
+ " bool: True if rendering was successful, False otherwise.")
+
+ .def("load_json", &HeadlessSynth::loadFromString, nb::arg("json"))
+
+ .def("to_json", &HeadlessSynth::pyToJson)
+
+ .def("load_preset", &HeadlessSynth::pyLoadFromFile, nb::arg("filepath"))
+
+ .def("load_init_preset", &HeadlessSynth::loadInitPreset, "Load the initial preset.")
+
+ .def("clear_modulations", &HeadlessSynth::clearModulations)
+ .def("get_controls", &HeadlessSynth::getControls, nb::rv_policy::reference);
+}
diff --git a/test-requirements.txt b/test-requirements.txt
new file mode 100644
index 0000000..6b49ac2
--- /dev/null
+++ b/test-requirements.txt
@@ -0,0 +1,4 @@
+numpy
+scipy
+librosa
+pytest
diff --git a/tests/.gitignore b/tests/.gitignore
new file mode 100644
index 0000000..046a22d
--- /dev/null
+++ b/tests/.gitignore
@@ -0,0 +1,3 @@
+tmp_*
+generated_preset*
+*.pyc
diff --git a/tests/test_render.py b/tests/test_render.py
new file mode 100644
index 0000000..00f0bfd
--- /dev/null
+++ b/tests/test_render.py
@@ -0,0 +1,65 @@
+from scipy.io import wavfile
+
+import vita
+from vita.constants import (
+ SourceDestination,
+ Effect,
+ FilterModel,
+ RetriggerStyle,
+ SpectralMorph,
+ DistortionType,
+ UnisonStackType,
+ RandomLFOStyle,
+ SynthFilterStyle,
+ WaveShape,
+ CompressorBandOption,
+ VoiceOverride,
+ VoicePriority,
+ SynthLFOSyncOption,
+ SynthLFOSyncType,
+ SyncedFrequency,
+)
+
+SAMPLE_RATE = 44_100
+
+
+def test_render(bpm=120.0, note_dur=1.0, render_dur=3.0, pitch=36, velocity=0.7):
+
+ synth = vita.Synth()
+ # The initial preset is laoded by default.
+
+ synth.set_bpm(bpm)
+
+ assert vita.get_modulation_sources()
+ assert vita.get_modulation_destinations()
+
+ # Custom synthesizer settings
+ assert synth.connect_modulation("lfo_1", "filter_1_cutoff")
+ controls = synth.get_controls()
+ controls["modulation_1_amount"].set(1.0)
+ controls["filter_1_on"].set(1.0)
+ controls["lfo_1_tempo"].set(SyncedFrequency.k1_16)
+
+ # Render audio to numpy array shaped (2, NUM_SAMPLES)
+ audio = synth.render(pitch, velocity, note_dur, render_dur)
+
+ wavfile.write("generated_preset.wav", SAMPLE_RATE, audio.T)
+
+ # Dump current state to json text
+ json_text = synth.to_json()
+ preset_path = "generated_preset.vital"
+ with open(preset_path, "w") as f:
+ f.write(json_text)
+
+ # Load JSON text
+ with open(preset_path, "r") as f:
+ json_text = f.read()
+ assert synth.load_json(json_text)
+
+ # Or load directly from file:
+ assert synth.load_preset(preset_path)
+
+ # Load the initial preset, which also clears modulations
+ synth.load_init_preset()
+ # Or just clear modulations.
+ synth.clear_modulations()
diff --git a/vita/__init__.py b/vita/__init__.py
new file mode 100644
index 0000000..df6e175
--- /dev/null
+++ b/vita/__init__.py
@@ -0,0 +1,2 @@
+from .vita import *
+from .version import *
diff --git a/vita/constants/__init__.py b/vita/constants/__init__.py
new file mode 100644
index 0000000..93e9a87
--- /dev/null
+++ b/vita/constants/__init__.py
@@ -0,0 +1 @@
+from ..vita.constants import *
diff --git a/vita/version.py b/vita/version.py
new file mode 100644
index 0000000..f102a9c
--- /dev/null
+++ b/vita/version.py
@@ -0,0 +1 @@
+__version__ = "0.0.1"