commit 0a3ea07e0360de0c7e82a07a9649b4520d86ad5b
parent 7f90cae50e4b16c3d064ce196d95a60d38d47adc
Author: Keith <[email protected]>
Date: Mon, 29 Aug 2022 18:16:47 -0500
Initial changes
Diffstat:
46 files changed, 4285 insertions(+), 1053 deletions(-)
diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml
@@ -0,0 +1,73 @@
+name: CI
+
+on:
+ push:
+ branches:
+ - main
+ - develop
+ pull_request:
+ branches:
+ - main
+ - develop
+
+ workflow_dispatch:
+
+jobs:
+ build_and_test:
+ if: contains(toJson(github.event.commits), '***NO_CI***') == false && contains(toJson(github.event.commits), '[ci skip]') == false && contains(toJson(github.event.commits), '[skip ci]') == false
+ name: Test plugin on ${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false # show all errors for each platform (vs. cancel jobs on error)
+ matrix:
+ os: [ubuntu-latest, windows-2019, macOS-latest]
+
+ steps:
+ - name: Install Linux Deps
+ if: runner.os == 'Linux'
+ run: |
+ sudo apt-get update
+ sudo apt install libasound2-dev libcurl4-openssl-dev libx11-dev libxinerama-dev libxext-dev libfreetype6-dev libwebkit2gtk-4.0-dev libglu1-mesa-dev libjack-jackd2-dev lv2-dev
+ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9
+ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 9
+ - name: Get latest CMake
+ uses: lukka/get-cmake@latest
+
+ - name: Checkout code
+ uses: actions/checkout@v2
+ with:
+ submodules: recursive
+
+ - name: Configure
+ shell: bash
+ run: cmake -Bbuild
+
+ - name: Build
+ shell: bash
+ run: cmake --build build --config Release --parallel 4
+
+ # Failing validation, fix
+ #- name: Validate
+ # if: runner.os == 'Windows'
+ # run: bash validate.sh
+
+ - name: Upload Linux Artifact GitHub Action
+ if: runner.os == 'Linux'
+ uses: actions/upload-artifact@v2
+ with:
+ name: linux-assets
+ path: /home/runner/work/TS-M1N3/TS-M1N3/build/TS-M1N3_artefacts
+
+ - name: Upload Mac Artifact GitHub Action
+ if: runner.os == 'macOS'
+ uses: actions/upload-artifact@v2
+ with:
+ name: mac-assets
+ path: /Users/runner/work/TS-M1N3/TS-M1N3/build/TS-M1N3_artefacts
+
+ - name: Upload Windows Artifact GitHub Action
+ if: runner.os == 'Windows'
+ uses: actions/upload-artifact@v2
+ with:
+ name: win-assets
+ path: D:/a/TS-M1N3/TS-M1N3/build/TS-M1N3_artefacts
diff --git a/.gitmodules b/.gitmodules
@@ -0,0 +1,12 @@
+[submodule "modules/JUCE"]
+ path = modules/JUCE
+ url = https://github.com/juce-framework/JUCE.git
+[submodule "modules/chowdsp_utils"]
+ path = modules/chowdsp_utils
+ url = https://github.com/Chowdhury-DSP/chowdsp_utils
+[submodule "modules/libsamplerate"]
+ path = modules/libsamplerate
+ url = https://github.com/libsndfile/libsamplerate
+[submodule "modules/eigen"]
+ path = modules/eigen
+ url = https://gitlab.com/libeigen/eigen.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
@@ -0,0 +1,58 @@
+cmake_minimum_required(VERSION 3.15)
+set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "Minimum OS X deployment target")
+project(SmartAmp VERSION 1.3)
+
+set(CMAKE_CXX_STANDARD 17)
+
+add_subdirectory(modules)
+include_directories(modules)
+
+juce_set_aax_sdk_path(C:/SDKs/AAX_SDK/)
+
+set(JUCE_FORMATS AU VST3)
+
+# Build LV2 only on Linux
+if(UNIX AND NOT APPLE)
+ message(STATUS "Building LV2 plugin format")
+ list(APPEND JUCE_FORMATS LV2)
+endif()
+
+# Build AAX if SDK target exists
+if(TARGET juce_aax_sdk)
+ message(STATUS "Building AAX plugin format")
+ list(APPEND JUCE_FORMATS AAX)
+endif()
+
+juce_add_plugin(SmartAmp
+ COMPANY_NAME GuitarML
+ PLUGIN_MANUFACTURER_CODE GtML
+ PLUGIN_CODE Npi3
+ FORMATS ${JUCE_FORMATS}
+ ProductName "SmartAmp"
+ LV2_URI https://github.com/GuitarML/SmartAmp
+ ICON_BIG resources/logo.png
+ MICROPHONE_PERMISSION_ENABLED TRUE
+)
+
+# create JUCE header
+juce_generate_juce_header(SmartAmp)
+
+# add sources
+add_subdirectory(src)
+include_directories(src)
+add_subdirectory(resources)
+
+target_compile_definitions(SmartAmp
+ PUBLIC
+ JUCE_DISPLAY_SPLASH_SCREEN=0
+ JUCE_REPORT_APP_USAGE=0
+ JUCE_WEB_BROWSER=0
+ JUCE_USE_CURL=0
+ JUCE_VST3_CAN_REPLACE_VST2=0
+ JUCE_MODAL_LOOPS_PERMITTED=1
+)
+
+target_link_libraries(SmartAmp PUBLIC
+ juce_plugin_modules
+)
+
diff --git a/aax_builds.sh b/aax_builds.sh
@@ -0,0 +1,115 @@
+#!/bin/bash
+
+# exit on failure
+set -e
+
+# need to run in sudo mode on Mac
+if [[ "$OSTYPE" == "darwin"* ]]; then
+ if [ "$EUID" -ne 0 ]; then
+ echo "This script must be run in sudo mode! Exiting..."
+ exit 1
+ fi
+fi
+
+if [[ "$*" = *debug* ]]; then
+ echo "Making DEBUG build"
+ build_config="Debug"
+else
+ echo "Making RELEASE build"
+ build_config="Release"
+fi
+
+# clean up old builds
+if [[ $* = *clean* ]]; then
+ echo "Cleaning previous build..."
+ rm -rf build-aax/
+fi
+
+sed_cmakelist()
+{
+ sed_args="$1"
+
+ if [[ "$OSTYPE" == "darwin"* ]]; then
+ sed -i '' "$sed_args" CMakeLists.txt
+ else
+ sed -i -e "$sed_args" CMakeLists.txt
+ fi
+}
+
+# set up OS-dependent variables
+if [[ "$OSTYPE" == "darwin"* ]]; then
+ echo "Building for MAC"
+ AAX_PATH=~/Developer/AAX_SDK/
+ ilok_pass=$(more ~/Developer/ilok_pass)
+ aax_target_dir="/Library/Application Support/Avid/Audio/Plug-Ins"
+ TEAM_ID=$(more ~/Developer/mac_id)
+ TARGET_DIR="Mac"
+
+else # Windows
+ echo "Building for WINDOWS"
+ AAX_PATH=C:/SDKs/AAX_SDK/
+ ilok_pass=$(cat /c/SDKs/ilok_pass)
+ aax_target_dir="/c/Program Files/Common Files/Avid/Audio/Plug-Ins"
+ TARGET_DIR="Win64"
+fi
+
+# set up build AAX
+#sed_cmakelist "s~# juce_set_aax_sdk_path.*~juce_set_aax_sdk_path(${AAX_PATH})~"
+
+# cmake new builds
+if [[ "$OSTYPE" == "darwin"* ]]; then
+ cmake -Bbuild-aax -GXcode -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY="Developer ID Application" \
+ -DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM="$TEAM_ID" \
+ -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_STYLE="Manual" \
+ -D"CMAKE_OSX_ARCHITECTURES=x86_64" \
+ -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_INJECT_BASE_ENTITLEMENTS=NO \
+ -DCMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS="--timestamp" \
+ -DMACOS_RELEASE=ON
+
+ cmake --build build-aax --config $build_config --target SmartAmp_AAX | xcpretty
+
+else # Windows
+ cmake -Bbuild-aax -G"Visual Studio 16 2019" -A x64
+ cmake --build build-aax --config $build_config --parallel $(nproc) --target SmartAmp_AAX
+fi
+
+# sign with PACE
+aax_location=build-aax/SmartAmp_artefacts/$build_config/AAX/SmartAmp.aaxplugin
+wcguid="" # Update
+if [[ "$OSTYPE" == "darwin"* ]]; then
+ /Applications/PACEAntiPiracy/Eden/Fusion/Current/bin/wraptool sign --verbose \
+ --account keyth72 \
+ --password "$ilok_pass" \
+ --wcguid $wcguid \
+ --dsig1-compat off \
+ --signid "Developer ID Application: Keith Bloemer" \
+ --in $aax_location \
+ --out $aax_location
+
+ /Applications/PACEAntiPiracy/Eden/Fusion/Current/bin/wraptool verify --verbose --in $aax_location
+
+else # Windows
+ wraptool sign --verbose \
+ --account keyth72 \
+ --password "$ilok_pass" \
+ --wcguid $wcguid \
+ --keyfile /c/SDKs/keith_aax_cert.p12 \
+ --keypassword "$ilok_pass" \
+ --in $aax_location \
+ --out $aax_location
+
+ wraptool verify --verbose --in $aax_location/Contents/x64/SmartAmp.aaxplugin
+fi
+
+# reset AAX SDK field...
+#sed_cmakelist "s~juce_set_aax_sdk_path.*~# juce_set_aax_sdk_path(NONE)~"
+
+rm -rf "$aax_target_dir/SmartAmp.aaxplugin"
+cp -R "$aax_location" "$aax_target_dir/SmartAmp.aaxplugin"
+
+if [[ "$*" = *deploy* ]]; then
+ set +e
+
+ ssh "[email protected]" "rm -r ~/aax_builds/${TARGET_DIR}/SmartAmp.aaxplugin"
+ scp -r "$aax_location" "[email protected]:~/aax_builds/${TARGET_DIR}/"
+fi
diff --git a/installers/linux/build_deb.sh b/installers/linux/build_deb.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+# This script builds a .deb package for installing the VST3, and LV2 plugins on Linux
+
+# Set the app name and version here
+app_name=SmartAmp
+version=1.3
+
+
+# 1. Create the package directory structure and control file
+
+mkdir -p $app_name"/DEBIAN"
+
+printf "Package: $app_name\n\
+Version: $version\n\
+Section: custom\n\
+Priority: optional\n\
+Architecture: all\n\
+Essential: no\n\
+Installed-Size: 16480128\n\
+Maintainer: GuitarML\n\
+Description: GuitarML Plugin Debian Package (VST3, LV2)\n" > $app_name"/DEBIAN/control"
+
+
+# 2. Copy VST3 and LV2 plugins to the package directory (assumes project is already built)
+
+mkdir -p $app_name/usr/local/lib/vst3/
+echo "Copying ../../build/"$app_name"_artefacts/Release/VST3/"$app_name".vst3"
+cp -r "../../build/"$app_name"_artefacts/Release/VST3/"$app_name".vst3" $app_name"/usr/local/lib/vst3/"
+
+mkdir -p $app_name/usr/local/lib/lv2/
+echo "Copying ../../build/"$app_name"_artefacts/Release/LV2/"$app_name".lv2"
+cp -r "../../build/"$app_name"_artefacts/Release/LV2/"$app_name".lv2" $app_name"/usr/local/lib/lv2/"
+
+
+# 3. Build the .deb package and rename
+
+dpkg-deb --build $app_name
+
+mv $app_name.deb $app_name-Linux-x64-$version.deb
diff --git a/installers/mac/Intro.txt b/installers/mac/Intro.txt
@@ -0,0 +1 @@
+This application will install the SmartAmp audio plugin version ##APPVERSION## to your computer.
diff --git a/installers/mac/SmartPedal.pkgproj b/installers/mac/SmartPedal.pkgproj
@@ -0,0 +1,2573 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>PACKAGES</key>
+ <array>
+ <dict>
+ <key>MUST-CLOSE-APPLICATION-ITEMS</key>
+ <array/>
+ <key>MUST-CLOSE-APPLICATIONS</key>
+ <false/>
+ <key>PACKAGE_FILES</key>
+ <dict>
+ <key>DEFAULT_INSTALL_LOCATION</key>
+ <string>/</string>
+ <key>HIERARCHY</key>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Applications</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Application Support</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>BUNDLE_CAN_DOWNGRADE</key>
+ <false/>
+ <key>BUNDLE_POSTINSTALL_PATH</key>
+ <dict>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <key>BUNDLE_PREINSTALL_PATH</key>
+ <dict>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>../../bin/Mac/SmartAmp.component</string>
+ <key>PATH_TYPE</key>
+ <integer>1</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>3</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Components</string>
+ <key>PATH_TYPE</key>
+ <integer>2</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>2</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Plug-Ins</string>
+ <key>PATH_TYPE</key>
+ <integer>2</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>2</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Audio</string>
+ <key>PATH_TYPE</key>
+ <integer>2</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>2</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Automator</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Documentation</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Extensions</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Filesystems</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Frameworks</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Input Methods</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Internet Plug-Ins</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>LaunchAgents</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>LaunchDaemons</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>PreferencePanes</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Preferences</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Printers</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>PrivilegedHelperTools</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>1005</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>QuickLook</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>QuickTime</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Screen Savers</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Scripts</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Services</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Widgets</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Library</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Shared</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>1023</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Users</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>/</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <key>PAYLOAD_TYPE</key>
+ <integer>0</integer>
+ <key>PRESERVE_EXTENDED_ATTRIBUTES</key>
+ <false/>
+ <key>SHOW_INVISIBLE</key>
+ <false/>
+ <key>SPLIT_FORKS</key>
+ <true/>
+ <key>TREAT_MISSING_FILES_AS_WARNING</key>
+ <false/>
+ <key>VERSION</key>
+ <integer>5</integer>
+ </dict>
+ <key>PACKAGE_SCRIPTS</key>
+ <dict>
+ <key>POSTINSTALL_PATH</key>
+ <dict>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <key>PREINSTALL_PATH</key>
+ <dict>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <key>RESOURCES</key>
+ <array/>
+ </dict>
+ <key>PACKAGE_SETTINGS</key>
+ <dict>
+ <key>AUTHENTICATION</key>
+ <integer>1</integer>
+ <key>CONCLUSION_ACTION</key>
+ <integer>0</integer>
+ <key>FOLLOW_SYMBOLIC_LINKS</key>
+ <false/>
+ <key>IDENTIFIER</key>
+ <string>com.GuitarML.SmartAmp.SmartAmpAU</string>
+ <key>LOCATION</key>
+ <integer>0</integer>
+ <key>NAME</key>
+ <string>AU</string>
+ <key>OVERWRITE_PERMISSIONS</key>
+ <false/>
+ <key>PAYLOAD_SIZE</key>
+ <integer>-1</integer>
+ <key>REFERENCE_PATH</key>
+ <string></string>
+ <key>RELOCATABLE</key>
+ <false/>
+ <key>USE_HFS+_COMPRESSION</key>
+ <false/>
+ <key>VERSION</key>
+ <string>##APPVERSION##</string>
+ </dict>
+ <key>TYPE</key>
+ <integer>0</integer>
+ <key>UUID</key>
+ <string>69EED16E-B119-4D35-B464-12717823DE0E</string>
+ </dict>
+ <dict>
+ <key>MUST-CLOSE-APPLICATION-ITEMS</key>
+ <array/>
+ <key>MUST-CLOSE-APPLICATIONS</key>
+ <false/>
+ <key>PACKAGE_FILES</key>
+ <dict>
+ <key>DEFAULT_INSTALL_LOCATION</key>
+ <string>/</string>
+ <key>HIERARCHY</key>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Applications</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Application Support</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>BUNDLE_CAN_DOWNGRADE</key>
+ <false/>
+ <key>BUNDLE_POSTINSTALL_PATH</key>
+ <dict>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <key>BUNDLE_PREINSTALL_PATH</key>
+ <dict>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>../../bin/Mac/SmartAmp.vst3</string>
+ <key>PATH_TYPE</key>
+ <integer>1</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>3</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>VST3</string>
+ <key>PATH_TYPE</key>
+ <integer>2</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>2</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Plug-Ins</string>
+ <key>PATH_TYPE</key>
+ <integer>2</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>2</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Audio</string>
+ <key>PATH_TYPE</key>
+ <integer>2</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>2</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Automator</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Documentation</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Extensions</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Filesystems</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Frameworks</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Input Methods</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Internet Plug-Ins</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>LaunchAgents</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>LaunchDaemons</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>PreferencePanes</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Preferences</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Printers</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>PrivilegedHelperTools</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>1005</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>QuickLook</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>QuickTime</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Screen Savers</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Scripts</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Services</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Widgets</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Library</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Shared</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>1023</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Users</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>/</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <key>PAYLOAD_TYPE</key>
+ <integer>0</integer>
+ <key>PRESERVE_EXTENDED_ATTRIBUTES</key>
+ <false/>
+ <key>SHOW_INVISIBLE</key>
+ <false/>
+ <key>SPLIT_FORKS</key>
+ <true/>
+ <key>TREAT_MISSING_FILES_AS_WARNING</key>
+ <false/>
+ <key>VERSION</key>
+ <integer>5</integer>
+ </dict>
+ <key>PACKAGE_SETTINGS</key>
+ <dict>
+ <key>AUTHENTICATION</key>
+ <integer>1</integer>
+ <key>CONCLUSION_ACTION</key>
+ <integer>0</integer>
+ <key>FOLLOW_SYMBOLIC_LINKS</key>
+ <false/>
+ <key>IDENTIFIER</key>
+ <string>com.GuitarML.SmartAmp.SmartAmpVST3</string>
+ <key>LOCATION</key>
+ <integer>0</integer>
+ <key>NAME</key>
+ <string>VST3</string>
+ <key>OVERWRITE_PERMISSIONS</key>
+ <false/>
+ <key>PAYLOAD_SIZE</key>
+ <integer>-1</integer>
+ <key>REFERENCE_PATH</key>
+ <string></string>
+ <key>RELOCATABLE</key>
+ <false/>
+ <key>USE_HFS+_COMPRESSION</key>
+ <false/>
+ <key>VERSION</key>
+ <string>##APPVERSION##</string>
+ </dict>
+ <key>TYPE</key>
+ <integer>0</integer>
+ <key>UUID</key>
+ <string>17D06D06-18AD-4175-AA45-047F4984BE1A</string>
+ </dict>
+ <dict>
+ <key>MUST-CLOSE-APPLICATION-ITEMS</key>
+ <array/>
+ <key>MUST-CLOSE-APPLICATIONS</key>
+ <false/>
+ <key>PACKAGE_FILES</key>
+ <dict>
+ <key>DEFAULT_INSTALL_LOCATION</key>
+ <string>/</string>
+ <key>HIERARCHY</key>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>BUNDLE_CAN_DOWNGRADE</key>
+ <false/>
+ <key>BUNDLE_POSTINSTALL_PATH</key>
+ <dict>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <key>BUNDLE_PREINSTALL_PATH</key>
+ <dict>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>../../bin/Mac/SmartAmp.app</string>
+ <key>PATH_TYPE</key>
+ <integer>1</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>3</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Applications</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Application Support</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Automator</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Documentation</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Extensions</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Filesystems</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Frameworks</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Input Methods</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Internet Plug-Ins</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>LaunchAgents</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>LaunchDaemons</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>PreferencePanes</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Preferences</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Printers</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>PrivilegedHelperTools</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>1005</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>QuickLook</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>QuickTime</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Screen Savers</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Scripts</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Services</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Widgets</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Library</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Shared</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>1023</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Users</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>/</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <key>PAYLOAD_TYPE</key>
+ <integer>0</integer>
+ <key>PRESERVE_EXTENDED_ATTRIBUTES</key>
+ <false/>
+ <key>SHOW_INVISIBLE</key>
+ <false/>
+ <key>SPLIT_FORKS</key>
+ <true/>
+ <key>TREAT_MISSING_FILES_AS_WARNING</key>
+ <false/>
+ <key>VERSION</key>
+ <integer>5</integer>
+ </dict>
+ <key>PACKAGE_SETTINGS</key>
+ <dict>
+ <key>AUTHENTICATION</key>
+ <integer>1</integer>
+ <key>CONCLUSION_ACTION</key>
+ <integer>0</integer>
+ <key>FOLLOW_SYMBOLIC_LINKS</key>
+ <false/>
+ <key>IDENTIFIER</key>
+ <string>com.GuitarML.SmartAmp</string>
+ <key>LOCATION</key>
+ <integer>0</integer>
+ <key>NAME</key>
+ <string>Standalone</string>
+ <key>OVERWRITE_PERMISSIONS</key>
+ <false/>
+ <key>PAYLOAD_SIZE</key>
+ <integer>-1</integer>
+ <key>REFERENCE_PATH</key>
+ <string></string>
+ <key>RELOCATABLE</key>
+ <false/>
+ <key>USE_HFS+_COMPRESSION</key>
+ <false/>
+ <key>VERSION</key>
+ <string>##APPVERSION##</string>
+ </dict>
+ <key>TYPE</key>
+ <integer>0</integer>
+ <key>UUID</key>
+ <string>54266BE4-CE88-4033-9C8D-248D3D38D1E1</string>
+ </dict>
+ <dict>
+ <key>MUST-CLOSE-APPLICATION-ITEMS</key>
+ <array/>
+ <key>MUST-CLOSE-APPLICATIONS</key>
+ <false/>
+ <key>PACKAGE_FILES</key>
+ <dict>
+ <key>DEFAULT_INSTALL_LOCATION</key>
+ <string>/Library/Application Support/Avid/Audio/Plug-Ins</string>
+ <key>HIERARCHY</key>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Applications</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>BUNDLE_CAN_DOWNGRADE</key>
+ <false/>
+ <key>BUNDLE_POSTINSTALL_PATH</key>
+ <dict>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <key>BUNDLE_PREINSTALL_PATH</key>
+ <dict>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>../../build-aax/SmartAmp_artefacts/Release/AAX/SmartAmp.aaxplugin</string>
+ <key>PATH_TYPE</key>
+ <integer>1</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>3</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Plug-Ins</string>
+ <key>PATH_TYPE</key>
+ <integer>2</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>2</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Audio</string>
+ <key>PATH_TYPE</key>
+ <integer>2</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>2</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Avid</string>
+ <key>PATH_TYPE</key>
+ <integer>2</integer>
+ <key>PERMISSIONS</key>
+ <integer>509</integer>
+ <key>TYPE</key>
+ <integer>2</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Application Support</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Automator</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Documentation</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Extensions</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Filesystems</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Frameworks</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Input Methods</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Internet Plug-Ins</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>LaunchAgents</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>LaunchDaemons</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>PreferencePanes</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Preferences</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Printers</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>PrivilegedHelperTools</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>1005</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>QuickLook</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>QuickTime</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Screen Savers</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Scripts</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Services</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Widgets</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Library</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>Shared</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>1023</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>80</integer>
+ <key>PATH</key>
+ <string>Users</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GID</key>
+ <integer>0</integer>
+ <key>PATH</key>
+ <string>/</string>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ <key>PERMISSIONS</key>
+ <integer>493</integer>
+ <key>TYPE</key>
+ <integer>1</integer>
+ <key>UID</key>
+ <integer>0</integer>
+ </dict>
+ <key>PAYLOAD_TYPE</key>
+ <integer>0</integer>
+ <key>PRESERVE_EXTENDED_ATTRIBUTES</key>
+ <false/>
+ <key>SHOW_INVISIBLE</key>
+ <false/>
+ <key>SPLIT_FORKS</key>
+ <true/>
+ <key>TREAT_MISSING_FILES_AS_WARNING</key>
+ <false/>
+ <key>VERSION</key>
+ <integer>5</integer>
+ </dict>
+ <key>PACKAGE_SCRIPTS</key>
+ <dict>
+ <key>POSTINSTALL_PATH</key>
+ <dict>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <key>PREINSTALL_PATH</key>
+ <dict>
+ <key>PATH_TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <key>RESOURCES</key>
+ <array/>
+ </dict>
+ <key>PACKAGE_SETTINGS</key>
+ <dict>
+ <key>AUTHENTICATION</key>
+ <integer>1</integer>
+ <key>CONCLUSION_ACTION</key>
+ <integer>0</integer>
+ <key>FOLLOW_SYMBOLIC_LINKS</key>
+ <false/>
+ <key>IDENTIFIER</key>
+ <string>com.GuitarML.SmartAmp.SmartAmpAAX</string>
+ <key>LOCATION</key>
+ <integer>0</integer>
+ <key>NAME</key>
+ <string>AAX</string>
+ <key>OVERWRITE_PERMISSIONS</key>
+ <false/>
+ <key>PAYLOAD_SIZE</key>
+ <integer>-1</integer>
+ <key>REFERENCE_PATH</key>
+ <string></string>
+ <key>RELOCATABLE</key>
+ <false/>
+ <key>USE_HFS+_COMPRESSION</key>
+ <false/>
+ <key>VERSION</key>
+ <string>##APPVERSION##</string>
+ </dict>
+ <key>TYPE</key>
+ <integer>0</integer>
+ <key>UUID</key>
+ <string>67DBD464-3B62-45EF-964B-549829FB1466</string>
+ </dict>
+ </array>
+ <key>PROJECT</key>
+ <dict>
+ <key>PROJECT_COMMENTS</key>
+ <dict>
+ <key>NOTES</key>
+ <data>
+ </data>
+ </dict>
+ <key>PROJECT_PRESENTATION</key>
+ <dict>
+ <key>BACKGROUND</key>
+ <dict>
+ <key>APPAREANCES</key>
+ <dict>
+ <key>DARK_AQUA</key>
+ <dict/>
+ <key>LIGHT_AQUA</key>
+ <dict/>
+ </dict>
+ <key>SHARED_SETTINGS_FOR_ALL_APPAREANCES</key>
+ <true/>
+ </dict>
+ <key>INSTALLATION TYPE</key>
+ <dict>
+ <key>HIERARCHIES</key>
+ <dict>
+ <key>INSTALLER</key>
+ <dict>
+ <key>LIST</key>
+ <array>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>DESCRIPTION</key>
+ <array/>
+ <key>OPTIONS</key>
+ <dict>
+ <key>HIDDEN</key>
+ <false/>
+ <key>STATE</key>
+ <integer>1</integer>
+ </dict>
+ <key>PACKAGE_UUID</key>
+ <string>69EED16E-B119-4D35-B464-12717823DE0E</string>
+ <key>TITLE</key>
+ <array/>
+ <key>TYPE</key>
+ <integer>0</integer>
+ <key>UUID</key>
+ <string>32A671B5-085A-4D25-9B73-CA9157DA33C8</string>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>DESCRIPTION</key>
+ <array/>
+ <key>OPTIONS</key>
+ <dict>
+ <key>HIDDEN</key>
+ <false/>
+ <key>STATE</key>
+ <integer>1</integer>
+ </dict>
+ <key>PACKAGE_UUID</key>
+ <string>17D06D06-18AD-4175-AA45-047F4984BE1A</string>
+ <key>TITLE</key>
+ <array/>
+ <key>TYPE</key>
+ <integer>0</integer>
+ <key>UUID</key>
+ <string>6B0DDE9A-47F8-4615-BC79-4C475F3E41F7</string>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>DESCRIPTION</key>
+ <array/>
+ <key>OPTIONS</key>
+ <dict>
+ <key>HIDDEN</key>
+ <false/>
+ <key>STATE</key>
+ <integer>1</integer>
+ </dict>
+ <key>PACKAGE_UUID</key>
+ <string>54266BE4-CE88-4033-9C8D-248D3D38D1E1</string>
+ <key>TITLE</key>
+ <array/>
+ <key>TYPE</key>
+ <integer>0</integer>
+ <key>UUID</key>
+ <string>7BA12230-EFE4-49DA-B02C-EAB67D03EF2D</string>
+ </dict>
+ <dict>
+ <key>CHILDREN</key>
+ <array/>
+ <key>DESCRIPTION</key>
+ <array/>
+ <key>OPTIONS</key>
+ <dict>
+ <key>HIDDEN</key>
+ <false/>
+ <key>STATE</key>
+ <integer>1</integer>
+ </dict>
+ <key>PACKAGE_UUID</key>
+ <string>67DBD464-3B62-45EF-964B-549829FB1466</string>
+ <key>TITLE</key>
+ <array/>
+ <key>TYPE</key>
+ <integer>0</integer>
+ <key>UUID</key>
+ <string>2BBC047A-58AB-4D9C-AFC1-F8BF00186CE3</string>
+ </dict>
+ </array>
+ <key>REMOVED</key>
+ <dict/>
+ </dict>
+ </dict>
+ <key>MODE</key>
+ <integer>2</integer>
+ </dict>
+ <key>INSTALLATION_STEPS</key>
+ <array>
+ <dict>
+ <key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
+ <string>ICPresentationViewIntroductionController</string>
+ <key>INSTALLER_PLUGIN</key>
+ <string>Introduction</string>
+ <key>LIST_TITLE_KEY</key>
+ <string>InstallerSectionTitle</string>
+ </dict>
+ <dict>
+ <key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
+ <string>ICPresentationViewReadMeController</string>
+ <key>INSTALLER_PLUGIN</key>
+ <string>ReadMe</string>
+ <key>LIST_TITLE_KEY</key>
+ <string>InstallerSectionTitle</string>
+ </dict>
+ <dict>
+ <key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
+ <string>ICPresentationViewLicenseController</string>
+ <key>INSTALLER_PLUGIN</key>
+ <string>License</string>
+ <key>LIST_TITLE_KEY</key>
+ <string>InstallerSectionTitle</string>
+ </dict>
+ <dict>
+ <key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
+ <string>ICPresentationViewDestinationSelectController</string>
+ <key>INSTALLER_PLUGIN</key>
+ <string>TargetSelect</string>
+ <key>LIST_TITLE_KEY</key>
+ <string>InstallerSectionTitle</string>
+ </dict>
+ <dict>
+ <key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
+ <string>ICPresentationViewInstallationTypeController</string>
+ <key>INSTALLER_PLUGIN</key>
+ <string>PackageSelection</string>
+ <key>LIST_TITLE_KEY</key>
+ <string>InstallerSectionTitle</string>
+ </dict>
+ <dict>
+ <key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
+ <string>ICPresentationViewInstallationController</string>
+ <key>INSTALLER_PLUGIN</key>
+ <string>Install</string>
+ <key>LIST_TITLE_KEY</key>
+ <string>InstallerSectionTitle</string>
+ </dict>
+ <dict>
+ <key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
+ <string>ICPresentationViewSummaryController</string>
+ <key>INSTALLER_PLUGIN</key>
+ <string>Summary</string>
+ <key>LIST_TITLE_KEY</key>
+ <string>InstallerSectionTitle</string>
+ </dict>
+ </array>
+ <key>INTRODUCTION</key>
+ <dict>
+ <key>LOCALIZATIONS</key>
+ <array>
+ <dict>
+ <key>LANGUAGE</key>
+ <string>English</string>
+ <key>VALUE</key>
+ <dict>
+ <key>PATH</key>
+ <string>Intro.txt</string>
+ <key>PATH_TYPE</key>
+ <integer>3</integer>
+ </dict>
+ </dict>
+ </array>
+ </dict>
+ <key>LICENSE</key>
+ <dict>
+ <key>LOCALIZATIONS</key>
+ <array>
+ <dict>
+ <key>LANGUAGE</key>
+ <string>English</string>
+ <key>VALUE</key>
+ <dict>
+ <key>PATH</key>
+ <string>LICENSE.txt</string>
+ <key>PATH_TYPE</key>
+ <integer>3</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>MODE</key>
+ <integer>0</integer>
+ </dict>
+ <key>README</key>
+ <dict>
+ <key>LOCALIZATIONS</key>
+ <array/>
+ </dict>
+ <key>TITLE</key>
+ <dict>
+ <key>LOCALIZATIONS</key>
+ <array>
+ <dict>
+ <key>LANGUAGE</key>
+ <string>English</string>
+ <key>VALUE</key>
+ <string>SmartAmp</string>
+ </dict>
+ </array>
+ </dict>
+ </dict>
+ <key>PROJECT_REQUIREMENTS</key>
+ <dict>
+ <key>LIST</key>
+ <array/>
+ <key>RESOURCES</key>
+ <array/>
+ <key>ROOT_VOLUME_ONLY</key>
+ <true/>
+ </dict>
+ <key>PROJECT_SETTINGS</key>
+ <dict>
+ <key>BUILD_FORMAT</key>
+ <integer>0</integer>
+ <key>BUILD_PATH</key>
+ <dict>
+ <key>PATH</key>
+ <string>../../build</string>
+ <key>PATH_TYPE</key>
+ <integer>1</integer>
+ </dict>
+ <key>EXCLUDED_FILES</key>
+ <array>
+ <dict>
+ <key>PATTERNS_ARRAY</key>
+ <array>
+ <dict>
+ <key>REGULAR_EXPRESSION</key>
+ <false/>
+ <key>STRING</key>
+ <string>.DS_Store</string>
+ <key>TYPE</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>PROTECTED</key>
+ <true/>
+ <key>PROXY_NAME</key>
+ <string>Remove .DS_Store files</string>
+ <key>PROXY_TOOLTIP</key>
+ <string>Remove ".DS_Store" files created by the Finder.</string>
+ <key>STATE</key>
+ <true/>
+ </dict>
+ <dict>
+ <key>PATTERNS_ARRAY</key>
+ <array>
+ <dict>
+ <key>REGULAR_EXPRESSION</key>
+ <false/>
+ <key>STRING</key>
+ <string>.pbdevelopment</string>
+ <key>TYPE</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>PROTECTED</key>
+ <true/>
+ <key>PROXY_NAME</key>
+ <string>Remove .pbdevelopment files</string>
+ <key>PROXY_TOOLTIP</key>
+ <string>Remove ".pbdevelopment" files created by ProjectBuilder or Xcode.</string>
+ <key>STATE</key>
+ <true/>
+ </dict>
+ <dict>
+ <key>PATTERNS_ARRAY</key>
+ <array>
+ <dict>
+ <key>REGULAR_EXPRESSION</key>
+ <false/>
+ <key>STRING</key>
+ <string>CVS</string>
+ <key>TYPE</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>REGULAR_EXPRESSION</key>
+ <false/>
+ <key>STRING</key>
+ <string>.cvsignore</string>
+ <key>TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>REGULAR_EXPRESSION</key>
+ <false/>
+ <key>STRING</key>
+ <string>.cvspass</string>
+ <key>TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>REGULAR_EXPRESSION</key>
+ <false/>
+ <key>STRING</key>
+ <string>.svn</string>
+ <key>TYPE</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>REGULAR_EXPRESSION</key>
+ <false/>
+ <key>STRING</key>
+ <string>.git</string>
+ <key>TYPE</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>REGULAR_EXPRESSION</key>
+ <false/>
+ <key>STRING</key>
+ <string>.gitignore</string>
+ <key>TYPE</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>PROTECTED</key>
+ <true/>
+ <key>PROXY_NAME</key>
+ <string>Remove SCM metadata</string>
+ <key>PROXY_TOOLTIP</key>
+ <string>Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems.</string>
+ <key>STATE</key>
+ <true/>
+ </dict>
+ <dict>
+ <key>PATTERNS_ARRAY</key>
+ <array>
+ <dict>
+ <key>REGULAR_EXPRESSION</key>
+ <false/>
+ <key>STRING</key>
+ <string>classes.nib</string>
+ <key>TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>REGULAR_EXPRESSION</key>
+ <false/>
+ <key>STRING</key>
+ <string>designable.db</string>
+ <key>TYPE</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>REGULAR_EXPRESSION</key>
+ <false/>
+ <key>STRING</key>
+ <string>info.nib</string>
+ <key>TYPE</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>PROTECTED</key>
+ <true/>
+ <key>PROXY_NAME</key>
+ <string>Optimize nib files</string>
+ <key>PROXY_TOOLTIP</key>
+ <string>Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles.</string>
+ <key>STATE</key>
+ <true/>
+ </dict>
+ <dict>
+ <key>PATTERNS_ARRAY</key>
+ <array>
+ <dict>
+ <key>REGULAR_EXPRESSION</key>
+ <false/>
+ <key>STRING</key>
+ <string>Resources Disabled</string>
+ <key>TYPE</key>
+ <integer>1</integer>
+ </dict>
+ </array>
+ <key>PROTECTED</key>
+ <true/>
+ <key>PROXY_NAME</key>
+ <string>Remove Resources Disabled folders</string>
+ <key>PROXY_TOOLTIP</key>
+ <string>Remove "Resources Disabled" folders.</string>
+ <key>STATE</key>
+ <true/>
+ </dict>
+ <dict>
+ <key>SEPARATOR</key>
+ <true/>
+ </dict>
+ </array>
+ <key>NAME</key>
+ <string>SmartAmp</string>
+ <key>PAYLOAD_ONLY</key>
+ <false/>
+ <key>TREAT_MISSING_PRESENTATION_DOCUMENTS_AS_WARNING</key>
+ <false/>
+ </dict>
+ </dict>
+ <key>TYPE</key>
+ <integer>0</integer>
+ <key>VERSION</key>
+ <integer>2</integer>
+</dict>
+</plist>
diff --git a/installers/mac/build_mac_installer.sh b/installers/mac/build_mac_installer.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+script_file=SmartAmp.pkgproj
+
+app_version=$(cut -f 2 -d '=' <<< "$(grep 'CMAKE_PROJECT_VERSION:STATIC' ../../build/CMakeCache.txt)")
+echo "Setting app version: $app_version..."
+sed -i '' "s/##APPVERSION##/${app_version}/g" $script_file
+sed -i '' "s/##APPVERSION##/${app_version}/g" Intro.txt
+
+echo "Copying License..."
+cp ../../LICENSE.txt LICENSE.txt
+
+# build installer
+echo Building...
+/usr/local/bin/packagesbuild $script_file
+
+# reset version number
+sed -i '' "s/${app_version}/##APPVERSION##/g" $script_file
+sed -i '' "s/${app_version}/##APPVERSION##/g" Intro.txt
+
+# clean up license file
+rm LICENSE.txt
+
+# sign the installer package
+echo "Signing installer package..."
+TEAM_ID=$(more ~/Developer/mac_id)
+pkg_dir=SmartAmp_Installer_Packaged
+rm -Rf $pkg_dir
+mkdir $pkg_dir
+productsign -s "$TEAM_ID" ../../build/SmartAmp.pkg $pkg_dir/SmartAmp-signed.pkg
+
+echo "Notarizing installer package..."
+INSTALLER_PASS=$(more ~/Developer/mac_installer_pass)
+npx notarize-cli --file $pkg_dir/SmartAmp-signed.pkg --bundle-id com.GuitarML.SmartAmp --asc-provider "$TEAM_ID" --username [email protected] --password "$INSTALLER_PASS"
+
+echo "Building disk image..."
+vol_name=Install_SmartAmp-$app_version
+hdiutil create "$vol_name.dmg" -fs HFS+ -srcfolder $pkg_dir -format UDZO -volname "$vol_name"
diff --git a/installers/windows/SmartAmpl_Install_Script.iss b/installers/windows/SmartAmpl_Install_Script.iss
@@ -0,0 +1,133 @@
+#define MyAppPublisher "GuitarML"
+#define MyAppURL "https://guitarml.com"
+#define MyAppName "SmartAmp"
+
+[Setup]
+AppName=SmartAmp
+AppVersion=##APPVERSION##
+AppPublisher={#MyAppPublisher}
+AppPublisherURL={#MyAppURL}
+AppSupportURL={#MyAppURL}
+AppUpdatesURL={#MyAppURL}
+DisableProgramGroupPage=yes
+DisableWelcomePage=no
+DisableDirPage=yes
+DefaultDirName={commoncf64}
+DefaultGroupName=SmartAmp
+OutputBaseFilename="SmartAmp-Win-##APPVERSION##"
+OutputDir=.
+LicenseFile=../../LICENSE.txt
+SetupIconFile=../../resources/guitarml.ico
+UninstallDisplayIcon=../../resources/SmartAmp.ico
+UninstallFilesDir={commoncf64}\GuitarML\{#MyAppName}
+Compression=lzma
+SolidCompression=yes
+
+[Types]
+Name: "full"; Description: "Full installation"
+Name: "custom"; Description: "Custom installation"; Flags: iscustom
+
+[Components]
+Name: "VST3_64"; Description: "VST3 Plugin 64-bit"; Types: full
+Name: "AAX"; Description: "AAX Plugin"; Types: full
+
+[Files]
+Source: "../../bin/Win64/SmartAmp.vst3"; DestDir: "{code:GetDir|VST3_64}"; Components: VST3_64; Flags: ignoreversion recursesubdirs createallsubdirs
+Source: "../../build-aax/SmartAmp_artefacts/Release/AAX/SmartAmp.aaxplugin"; DestDir: "{code:GetDir|AAX}"; Components: AAX; Flags: ignoreversion recursesubdirs createallsubdirs
+
+[Code]
+var
+ AAXDirPage: TInputDirWizardPage;
+ Vst3_64DirPage: TinputDirWizardPage;
+
+procedure InitializeWizard;
+begin
+ Log('Initializing extra pages')
+ //AAX Dir Page
+ AAXDirPage := CreateInputDirPage(wpSelectComponents,
+ 'Select AAX Install Location', 'Where would you like to install the AAX plugin?',
+ 'AAX plugin will be installed in the following folder.'#13#10#13#10 +
+ 'To continue, click Next. If you would like to select a different folder, click Browse.',
+ False, 'New Folder');
+
+ AAXDirPage.add('');
+ AAXDirPage.values[0] := ExpandConstant('{commoncf64}\Avid\Audio\Plug-Ins');
+
+ //VST3 64-bit Dir Page
+ Vst3_64DirPage := CreateInputDirPage(AAXDirPage.ID,
+ 'Select Install Location for VST3 64-bit', 'Where would you like to install the plugin?',
+ 'VST3 64-bit plugin will be installed in the following folder.'#13#10#13#10 +
+ 'To continue, click Next. If you would like to select a different folder, click Browse.',
+ False, 'New Folder');
+
+ Vst3_64DirPage.add('');
+ Vst3_64DirPage.values[0] := ExpandConstant('{commoncf64}\VST3');
+
+
+end;
+
+function IsSelected(Param: String) : Boolean;
+begin
+ if not (Pos(Param, WizardSelectedComponents(False)) = 0) then // WizardSelectedComponents(False)) then
+ Result := True
+end;
+
+function ShouldSkipPage(PageID: Integer): Boolean;
+begin
+ { Skip pages that shouldn't be shown }
+ Result := False;
+
+ if (PageID = AAXDirPage.ID) then
+ begin
+ Result := True;
+ Log('Selected 1: ' + WizardSelectedComponents(False));
+
+ if IsSelected ('aax') then
+ begin
+ Log('Not Skipping page');
+ Result := False;
+ end
+ end
+
+ else if (PageID = Vst3_64DirPage.ID) then
+ begin
+ Result := True;
+ Log('Selected 2: ' + WizardSelectedComponents(False));
+
+ if IsSelected ('vst3_64') then
+ begin
+ Log('Not Skipping');
+ Result := False;
+ end
+ end
+
+
+end;
+
+function GetDir(Param: String) : String;
+begin
+ if (Param = 'AAX') then
+ Result := AAXDirPage.values[0]
+ else if (Param = 'VST3_64') then
+ Result := Vst3_64DirPage.values[0]
+end;
+
+function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
+ MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
+var
+ S: String;
+begin
+ { Fill the 'Ready Memo' with the normal settings and the custom settings }
+ S := '';
+ S := S + MemoTypeInfo + NewLine + NewLine;
+ S := S + MemoComponentsInfo + NewLine + NewLine;
+ S := S + 'Destination Location:' + NewLine;
+
+ if IsSelected('aax') then
+ S := S + Space + GetDir('AAX') + ' (AAX)' + NewLine;
+
+ if IsSelected('vst3_64') then
+ S := S + Space + GetDir('VST3_64') + ' (VST3 64-bit)' + NewLine;
+
+ Result := S;
+end;
diff --git a/installers/windows/build_win_installer.sh b/installers/windows/build_win_installer.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+script_file=SmartAmp_Install_Script.iss
+
+app_version=$(cut -f 2 -d '=' <<< "$(grep 'CMAKE_PROJECT_VERSION:STATIC' ../../build/CMakeCache.txt)")
+echo "Setting app version: $app_version..."
+sed -i "s/##APPVERSION##/${app_version}/g" $script_file
+
+# build installer
+echo Building...
+$"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" $script_file
+
+# reset version number
+sed -i "s/${app_version}/##APPVERSION##/g" $script_file
+
+exec="SmartPedal-Win-$app_version.exe"
+direc=$PWD
+
+
+echo SUCCESS
diff --git a/mac_builds.sh b/mac_builds.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+
+# exit on failure
+set -e
+
+# clean up old builds
+rm -Rf build/
+rm -Rf bin/*Mac*
+
+
+# cmake new builds
+TEAM_ID=$(more ~/Developer/mac_id)
+cmake -Bbuild -DMACOS_RELEASE=ON -GXcode -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY="Developer ID Application" \
+ -DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM="$TEAM_ID" \
+ -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_STYLE="Manual" \
+ -D"CMAKE_OSX_ARCHITECTURES=arm64;x86_64" \
+ -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_INJECT_BASE_ENTITLEMENTS=NO \
+ -DCMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS="--timestamp" \
+ -DMACOS_RELEASE=ON
+cmake --build build --config Release -j8 | xcpretty
+
+# copy builds to bin
+mkdir -p bin/Mac
+declare -a plugins=("SmartAmp")
+for plugin in "${plugins[@]}"; do
+ cp -R build/${plugin}_artefacts/Release/VST3/${plugin}.vst3 bin/Mac/${plugin}.vst3
+ cp -R build/${plugin}_artefacts/Release/AU/${plugin}.component bin/Mac/${plugin}.component
+done
+
+
+# run auval
+echo "Running AU validation..."
+rm -Rf ~/Library/Audio/Plug-Ins/Components/${plugin}.component
+cp -R build/${plugin}_artefacts/Release/AU/${plugin}.component ~/Library/Audio/Plug-Ins/Components
+manu=$(cut -f 6 -d ' ' <<< "$(grep 'PLUGIN_MANUFACTURER_CODE' CMakeLists.txt)")
+code=$(cut -f 6 -d ' ' <<< "$(grep 'PLUGIN_CODE' CMakeLists.txt)")
+
+set +e
+auval_result=$(auval -v aufx "$code" "$manu")
+auval_code="$?"
+echo "AUVAL code: $auval_code"
+
+if [ "$auval_code" != 0 ]; then
+ echo "$auval_result"
+ echo "auval FAIL!!!"
+ #exit 1
+else
+ echo "auval PASSED"
+fi
+
+# zip builds
+echo "Zipping builds..."
+VERSION=$(cut -f 2 -d '=' <<< "$(grep 'CMAKE_PROJECT_VERSION:STATIC' build/CMakeCache.txt)")
+(
+ cd bin
+ rm -f "SmartAmp-Mac-${VERSION}.zip"
+ zip -r "SmartAmp-Mac-${VERSION}.zip" Mac
+)
+
+# create installer
+echo "Creating installer..."
+(
+ cd installers/mac
+ bash build_mac_installer.sh
+)
diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt
@@ -0,0 +1,62 @@
+add_subdirectory(JUCE)
+
+include(cmake/SubprojectVersion.cmake)
+subproject_version(JUCE juce_version)
+message(STATUS "VERSION for JUCE: ${juce_version}")
+
+# Link to libsamplerate
+set(BUILD_TESTING OFF CACHE BOOL "Don't build libsamplerate tests!")
+#add_subdirectory(libsamplerate)
+#subproject_version(libsamplerate libsamplerate_version)
+#message(STATUS "VERSION for libsamplerate: ${libsamplerate_version}")
+
+
+include(cmake/WarningFlags.cmake)
+add_library(juce_plugin_modules STATIC)
+#add_subdirectory(chowdsp_utils)
+add_subdirectory(eigen)
+
+target_link_libraries(juce_plugin_modules
+ PRIVATE
+ BinaryData
+ juce::juce_audio_utils
+ juce::juce_audio_plugin_client
+ juce::juce_dsp
+ eigen
+ #samplerate
+ #chowdsp_dsp
+ PUBLIC
+ juce::juce_recommended_config_flags
+ juce::juce_recommended_lto_flags
+ warning_flags
+)
+
+target_compile_definitions(juce_plugin_modules
+ PUBLIC
+ JUCE_DISPLAY_SPLASH_SCREEN=0
+ JUCE_REPORT_APP_USAGE=0
+ JUCE_WEB_BROWSER=0
+ JUCE_USE_CURL=0
+ JUCE_VST3_CAN_REPLACE_VST2=0
+ JucePlugin_Manufacturer="GuitarML"
+ JucePlugin_VersionString="${CMAKE_PROJECT_VERSION}"
+ JucePlugin_Name="${CMAKE_PROJECT_NAME}"
+ #CHOWDSP_USE_LIBSAMPLERATE=1
+ INTERFACE
+ $<TARGET_PROPERTY:juce_plugin_modules,COMPILE_DEFINITIONS>
+)
+
+target_include_directories(juce_plugin_modules
+ PUBLIC
+ eigen/Eigen
+ #libsamplerate/include
+ INTERFACE
+ $<TARGET_PROPERTY:juce_plugin_modules,INCLUDE_DIRECTORIES>
+)
+
+set_target_properties(juce_plugin_modules PROPERTIES
+ POSITION_INDEPENDENT_CODE TRUE
+ VISIBILITY_INLINES_HIDDEN TRUE
+ C_VISBILITY_PRESET hidden
+ CXX_VISIBILITY_PRESET hidden
+)
diff --git a/modules/JUCE b/modules/JUCE
@@ -0,0 +1 @@
+Subproject commit 965d0ca4be178c4a0000b116d460e15c30311992
diff --git a/modules/cmake/SubprojectVersion.cmake b/modules/cmake/SubprojectVersion.cmake
@@ -0,0 +1,20 @@
+# subproject_version(<subproject-name> <result-variable>)
+#
+# Extract version of a sub-project, which was previously included with add_subdirectory().
+function(subproject_version subproject_name VERSION_VAR)
+ # Read CMakeLists.txt for subproject and extract project() call(s) from it.
+ file(STRINGS "${${subproject_name}_SOURCE_DIR}/CMakeLists.txt" project_calls REGEX "[ \t]*project\\(")
+ # For every project() call try to extract its VERSION option
+ foreach(project_call ${project_calls})
+ string(REGEX MATCH "VERSION[ ]+([^ )]+)" version_param "${project_call}")
+ if(version_param)
+ set(version_value "${CMAKE_MATCH_1}")
+ endif()
+ endforeach()
+ if(version_value)
+ set(${VERSION_VAR} "${version_value}" PARENT_SCOPE)
+ else()
+ message("WARNING: Cannot extract version for subproject '${subproject_name}'")
+ endif()
+
+endfunction(subproject_version)
diff --git a/modules/cmake/WarningFlags.cmake b/modules/cmake/WarningFlags.cmake
@@ -0,0 +1,49 @@
+add_library(warning_flags INTERFACE)
+
+if((CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") OR (CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC"))
+ target_compile_options(warning_flags INTERFACE
+ /W4 # base warning level
+ #/wd4458 # declaration hides class member (from Foley's GUI Magic)
+ /wd4505 # since VS2019 doesn't handle [[ maybe_unused ]] for static functions (RTNeural::debug_print)
+ /wd4244 # for XSIMD
+ )
+elseif((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang"))
+ target_compile_options(warning_flags INTERFACE
+ -Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized
+ -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion
+ -Wconditional-uninitialized -Woverloaded-virtual -Wreorder
+ -Wconstant-conversion -Wsign-conversion -Wunused-private-field
+ -Wbool-conversion -Wno-extra-semi -Wunreachable-code
+ -Wzero-as-null-pointer-constant -Wcast-align
+ -Wno-inconsistent-missing-destructor-override -Wshift-sign-overflow
+ -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers
+ -Wno-ignored-qualifiers -Wpedantic -Wno-pessimizing-move
+ # These lines suppress some custom warnings.
+ # Comment them out to be more strict.
+ -Wno-shadow-field-in-constructor
+ # Supress warnings from xsimd
+ -Wno-cast-align -Wno-shadow -Wno-implicit-int-conversion
+ -Wno-zero-as-null-pointer-constant -Wno-sign-conversion
+ # Needed for ARM processor, OSX versions below 10.14
+ -fno-aligned-allocation
+ )
+elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ target_compile_options(warning_flags INTERFACE
+ -Wall -Wextra -Wstrict-aliasing -Wuninitialized -Wunused-parameter
+ -Wsign-compare -Woverloaded-virtual -Wreorder -Wunreachable-code
+ -Wzero-as-null-pointer-constant -Wcast-align -Wno-implicit-fallthrough
+ -Wno-maybe-uninitialized -Wno-missing-field-initializers -Wno-pedantic
+ -Wno-ignored-qualifiers -Wno-unused-function -Wno-pessimizing-move
+ # From LV2 Wrapper
+ -Wno-parentheses -Wno-deprecated-declarations -Wno-redundant-decls
+ # For XSIMD
+ -Wno-zero-as-null-pointer-constant
+ # These lines suppress some custom warnings.
+ # Comment them out to be more strict.
+ -Wno-redundant-move
+ )
+
+ if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "7.0.0")
+ target_compile_options(warning_flags INTERFACE "-Wno-strict-overflow")
+ endif()
+endif()
diff --git a/modules/eigen b/modules/eigen
@@ -0,0 +1 @@
+Subproject commit bd393e15c3d8dfa5423652c75921e026bcab83c5
diff --git a/plugins/SmartAmp/SmartAmp.jucer b/plugins/SmartAmp/SmartAmp.jucer
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<JUCERPROJECT id="ym7AY5" name="SmartAmp" projectType="audioplug" pluginAUMainType="'aufx'"
- companyName="GuitarML" headerPath="$(HOME)/eigen/" displaySplashScreen="1"
- jucerFormatVersion="1" pluginCode="sa1" maxBinaryFileSize="20971520">
- <MAINGROUP id="ZrSGof" name="SmartAmp">
- <GROUP id="{0250E2E8-A733-0AA7-0A08-97085228CF87}" name="Resources">
- <FILE id="fzEsS4" name="amp_clean.jpg" compile="0" resource="1" file="../../resources/amp_clean.jpg"/>
- <FILE id="MUKtMi" name="amp_lead.jpg" compile="0" resource="1" file="../../resources/amp_lead.jpg"/>
- <FILE id="ZHwe69" name="amp_off.jpg" compile="0" resource="1" file="../../resources/amp_off.jpg"/>
- <FILE id="XoWq0R" name="bluej_clean_p0088.json" compile="0" resource="1"
- file="../../models/bluej_clean_p0088.json"/>
- <FILE id="ov9ufS" name="bluej_fullD_p0153.json" compile="0" resource="1"
- file="../../models/bluej_fullD_p0153.json"/>
- <FILE id="jmOgHo" name="knob_silver.png" compile="0" resource="1" file="../../resources/knob_silver.png"/>
- <FILE id="Kaw2lp" name="led_blue_off.png" compile="0" resource="1"
- file="../../resources/led_blue_off.png"/>
- <FILE id="Y8qZzL" name="led_blue_on.png" compile="0" resource="1" file="../../resources/led_blue_on.png"/>
- <FILE id="wxluia" name="led_blue_on_off.png" compile="0" resource="1"
- file="../../resources/led_blue_on_off.png"/>
- <FILE id="dGDile" name="led_red_off.png" compile="0" resource="1" file="../../resources/led_red_off.png"/>
- <FILE id="lXezWE" name="led_red_on.png" compile="0" resource="1" file="../../resources/led_red_on.png"/>
- <FILE id="kv1E0Y" name="power_switch_down.png" compile="0" resource="1"
- file="../../resources/power_switch_down.png"/>
- <FILE id="dmRdj4" name="power_switch_up.png" compile="0" resource="1"
- file="../../resources/power_switch_up.png"/>
- </GROUP>
- <GROUP id="{0C30E6D7-5E80-A33B-74CB-A4BA09196080}" name="Source">
- <FILE id="nHO9o4" name="Activations.cpp" compile="1" resource="0" file="Source/Activations.cpp"/>
- <FILE id="pB2Uy9" name="Activations.h" compile="0" resource="0" file="Source/Activations.h"/>
- <FILE id="HFxIGS" name="Convolution.cpp" compile="1" resource="0" file="Source/Convolution.cpp"/>
- <FILE id="ykCs7c" name="Convolution.h" compile="0" resource="0" file="Source/Convolution.h"/>
- <FILE id="OEMCNQ" name="ConvolutionLayer.cpp" compile="1" resource="0"
- file="Source/ConvolutionLayer.cpp"/>
- <FILE id="mCupON" name="ConvolutionLayer.h" compile="0" resource="0"
- file="Source/ConvolutionLayer.h"/>
- <FILE id="RBB3Df" name="ConvolutionStack.cpp" compile="1" resource="0"
- file="Source/ConvolutionStack.cpp"/>
- <FILE id="QiS3tw" name="ConvolutionStack.h" compile="0" resource="0"
- file="Source/ConvolutionStack.h"/>
- <FILE id="cc0yTU" name="Eq4Band.cpp" compile="1" resource="0" file="Source/Eq4Band.cpp"/>
- <FILE id="V8n6fV" name="Eq4Band.h" compile="0" resource="0" file="Source/Eq4Band.h"/>
- <FILE id="v2KZQA" name="myLookAndFeel.cpp" compile="1" resource="0"
- file="Source/myLookAndFeel.cpp"/>
- <FILE id="IK3E75" name="myLookAndFeel.h" compile="0" resource="0" file="Source/myLookAndFeel.h"/>
- <FILE id="yPpxqN" name="PluginEditor.cpp" compile="1" resource="0"
- file="Source/PluginEditor.cpp"/>
- <FILE id="wc9ORq" name="PluginEditor.h" compile="0" resource="0" file="Source/PluginEditor.h"/>
- <FILE id="FXtuA5" name="PluginProcessor.cpp" compile="1" resource="0"
- file="Source/PluginProcessor.cpp"/>
- <FILE id="fdQhKJ" name="PluginProcessor.h" compile="0" resource="0"
- file="Source/PluginProcessor.h"/>
- <FILE id="BZWjtW" name="WaveNet.cpp" compile="1" resource="0" file="Source/WaveNet.cpp"/>
- <FILE id="ZND1h7" name="WaveNet.h" compile="0" resource="0" file="Source/WaveNet.h"/>
- <FILE id="b1IRpO" name="WaveNetLoader.cpp" compile="1" resource="0"
- file="Source/WaveNetLoader.cpp"/>
- <FILE id="DKQUas" name="WaveNetLoader.h" compile="0" resource="0" file="Source/WaveNetLoader.h"/>
- </GROUP>
- </MAINGROUP>
- <EXPORTFORMATS>
- <XCODE_MAC targetFolder="Builds/MacOSX">
- <CONFIGURATIONS>
- <CONFIGURATION isDebug="1" name="Debug" targetName="SmartAmp"/>
- <CONFIGURATION isDebug="0" name="Release" targetName="SmartAmp"/>
- </CONFIGURATIONS>
- <MODULEPATHS>
- <MODULEPATH id="juce_audio_basics" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_audio_devices" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_audio_formats" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_audio_plugin_client" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_audio_processors" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_audio_utils" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_core" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_cryptography" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_data_structures" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_events" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_graphics" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_gui_basics" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_gui_extra" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_opengl" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_video" path="../../JUCE/modules"/>
- <MODULEPATH id="juce_dsp" path="../../JUCE/modules"/>
- </MODULEPATHS>
- </XCODE_MAC>
- <VS2019 targetFolder="Builds/VisualStudio2019">
- <CONFIGURATIONS>
- <CONFIGURATION isDebug="1" name="Debug" targetName="SmartAmp"/>
- <CONFIGURATION isDebug="0" name="Release" targetName="SmartAmp" headerPath="C:\Users\rache\Desktop\dev\eigen-3.3.7 C:\Users\KBloemer\Desktop\Archive\eigen-3.3.9\eigen-3.3.9"/>
- </CONFIGURATIONS>
- <MODULEPATHS>
- <MODULEPATH id="juce_video"/>
- <MODULEPATH id="juce_opengl"/>
- <MODULEPATH id="juce_gui_extra"/>
- <MODULEPATH id="juce_gui_basics"/>
- <MODULEPATH id="juce_graphics"/>
- <MODULEPATH id="juce_events"/>
- <MODULEPATH id="juce_dsp"/>
- <MODULEPATH id="juce_data_structures"/>
- <MODULEPATH id="juce_cryptography"/>
- <MODULEPATH id="juce_core"/>
- <MODULEPATH id="juce_audio_utils"/>
- <MODULEPATH id="juce_audio_processors"/>
- <MODULEPATH id="juce_audio_plugin_client"/>
- <MODULEPATH id="juce_audio_formats"/>
- <MODULEPATH id="juce_audio_devices"/>
- <MODULEPATH id="juce_audio_basics"/>
- </MODULEPATHS>
- </VS2019>
- </EXPORTFORMATS>
- <MODULES>
- <MODULE id="juce_audio_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_audio_devices" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_audio_formats" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_audio_plugin_client" showAllCode="1" useLocalCopy="0"
- useGlobalPath="1"/>
- <MODULE id="juce_audio_processors" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_audio_utils" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_core" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_cryptography" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_data_structures" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_dsp" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_events" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_graphics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_gui_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_gui_extra" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_opengl" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- <MODULE id="juce_video" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
- </MODULES>
- <LIVE_SETTINGS>
- <OSX/>
- <WINDOWS/>
- </LIVE_SETTINGS>
- <JUCEOPTIONS JUCE_VST3_CAN_REPLACE_VST2="0" JUCE_STRICT_REFCOUNTEDPOINTER="1"/>
-</JUCERPROJECT>
diff --git a/plugins/SmartAmp/Source/.vscode/settings.json b/plugins/SmartAmp/Source/.vscode/settings.json
@@ -1,36 +0,0 @@
-{
- "files.associations": {
- "initializer_list": "cpp",
- "xstring": "cpp",
- "xutility": "cpp",
- "cmath": "cpp",
- "cstddef": "cpp",
- "cstdint": "cpp",
- "cstdio": "cpp",
- "cstdlib": "cpp",
- "cstring": "cpp",
- "cwchar": "cpp",
- "exception": "cpp",
- "ios": "cpp",
- "iosfwd": "cpp",
- "istream": "cpp",
- "limits": "cpp",
- "new": "cpp",
- "ostream": "cpp",
- "stdexcept": "cpp",
- "streambuf": "cpp",
- "string": "cpp",
- "system_error": "cpp",
- "type_traits": "cpp",
- "typeinfo": "cpp",
- "utility": "cpp",
- "xfacet": "cpp",
- "xiosbase": "cpp",
- "xlocale": "cpp",
- "xlocinfo": "cpp",
- "xlocnum": "cpp",
- "xmemory0": "cpp",
- "xstddef": "cpp",
- "xtr1common": "cpp"
- }
-}
-\ No newline at end of file
diff --git a/plugins/SmartAmp/Source/PluginEditor.cpp b/plugins/SmartAmp/Source/PluginEditor.cpp
@@ -1,401 +0,0 @@
-/*
- ==============================================================================
-
- This file was auto-generated!
-
- It contains the basic framework code for a JUCE plugin editor.
-
- ==============================================================================
-*/
-
-#include "PluginProcessor.h"
-#include "PluginEditor.h"
-
-//==============================================================================
-WaveNetVaAudioProcessorEditor::WaveNetVaAudioProcessorEditor (WaveNetVaAudioProcessor& p)
- : AudioProcessorEditor (&p), processor (p)
-{
- // Make sure that before the constructor has finished, you've set the
- // editor's size to whatever you need it to
-
- // Set Widget Graphics
- ampSilverKnobLAF.setLookAndFeel(ImageCache::getFromMemory(BinaryData::knob_silver_png, BinaryData::knob_silver_pngSize));
-
- ampOnButton.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- addAndMakeVisible(ampOnButton);
- ampOnButton.addListener(this);
-
- addAndMakeVisible(loadButton);
- loadButton.setButtonText("Load Tone");
- loadButton.addListener(this);
-
- addAndMakeVisible(modelLabel);
- modelLabel.setText(processor.loaded_tone_name, juce::NotificationType::dontSendNotification);
- modelLabel.setJustificationType(juce::Justification::left);
- modelLabel.setColour(juce::Label::textColourId, juce::Colours::black);
-
- ampCleanLeadButton.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- addAndMakeVisible(ampCleanLeadButton);
- ampCleanLeadButton.addListener(this);
-
- ampLED.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::led_blue_on_png, BinaryData::led_blue_on_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::led_blue_on_png, BinaryData::led_blue_on_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- addAndMakeVisible(ampLED);
-
- addAndMakeVisible(ampPresenceKnob);
- ampPresenceKnob.setLookAndFeel(&SilverKnobLAF);
- ampPresenceKnob.addListener(this);
- //ampPresenceKnob.setSkewFactorFromMidPoint(1000.0); // Not working because of custom lookAndFeel class
- ampPresenceKnob.setRange(-10.0, 10.0);
- ampPresenceKnob.setValue(processor.ampPresenceKnobState);
- ampPresenceKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
- ampPresenceKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 75, 20);
- ampPresenceKnob.setNumDecimalPlacesToDisplay(1);
- ampPresenceKnob.setDoubleClickReturnValue(true, 0.0);
-
- addAndMakeVisible(ampCleanBassKnob);
- ampCleanBassKnob.setLookAndFeel(&SilverKnobLAF);
- ampCleanBassKnob.addListener(this);
- ampCleanBassKnob.setRange(-8.0, 8.0);
- ampCleanBassKnob.setValue(processor.ampCleanBassKnobState);
- ampCleanBassKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
- ampCleanBassKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
- ampCleanBassKnob.setNumDecimalPlacesToDisplay(1);
- ampCleanBassKnob.setDoubleClickReturnValue(true, 0.0);
-
- addAndMakeVisible(ampCleanMidKnob);
- ampCleanMidKnob.setLookAndFeel(&SilverKnobLAF);
- ampCleanMidKnob.addListener(this);
- ampCleanMidKnob.setRange(-8.0, 8.0);
- ampCleanMidKnob.setValue(processor.ampCleanMidKnobState);
- ampCleanMidKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
- ampCleanMidKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
- ampCleanMidKnob.setNumDecimalPlacesToDisplay(1);
- ampCleanMidKnob.setDoubleClickReturnValue(true, 0.0);
-
- addAndMakeVisible(ampCleanTrebleKnob);
- ampCleanTrebleKnob.setLookAndFeel(&SilverKnobLAF);
- ampCleanTrebleKnob.addListener(this);
- ampCleanTrebleKnob.setRange(-8.0, 8.0);
- ampCleanTrebleKnob.setValue(processor.ampCleanTrebleKnobState);
- ampCleanTrebleKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
- ampCleanTrebleKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
- ampCleanTrebleKnob.setNumDecimalPlacesToDisplay(1);
- ampCleanTrebleKnob.setDoubleClickReturnValue(true, 0.0);
-
- addAndMakeVisible(ampCleanGainKnob);
- ampCleanGainKnob.setLookAndFeel(&SilverKnobLAF);
- ampCleanGainKnob.addListener(this);
- ampCleanGainKnob.setRange(0.0, 20.0);
- ampCleanGainKnob.setValue(processor.ampCleanGainKnobState);
- ampCleanGainKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
- ampCleanGainKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
- ampCleanGainKnob.setNumDecimalPlacesToDisplay(1);
- ampCleanGainKnob.setDoubleClickReturnValue(true, 10.0);
-
- addAndMakeVisible(ampLeadBassKnob);
- ampLeadBassKnob.setLookAndFeel(&SilverKnobLAF);
- ampLeadBassKnob.addListener(this);
- ampLeadBassKnob.setRange(-8.0, 8.0);
- ampLeadBassKnob.setValue(processor.ampLeadBassKnobState);
- ampLeadBassKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
- ampLeadBassKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
- ampLeadBassKnob.setNumDecimalPlacesToDisplay(1);
- ampLeadBassKnob.setDoubleClickReturnValue(true, 0.0);
-
- addAndMakeVisible(ampLeadMidKnob);
- ampLeadMidKnob.setLookAndFeel(&SilverKnobLAF);
- ampLeadMidKnob.addListener(this);
- ampLeadMidKnob.setRange(-8.0, 8.0);
- ampLeadMidKnob.setValue(processor.ampLeadMidKnobState);
- ampLeadMidKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
- ampLeadMidKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
- ampLeadMidKnob.setNumDecimalPlacesToDisplay(1);
- ampLeadMidKnob.setDoubleClickReturnValue(true, 0.0);
-
- addAndMakeVisible(ampLeadTrebleKnob);
- ampLeadTrebleKnob.setLookAndFeel(&SilverKnobLAF);
- ampLeadTrebleKnob.addListener(this);
- ampLeadTrebleKnob.setRange(-8.0, 8.0);
- ampLeadTrebleKnob.setValue(processor.ampLeadTrebleKnobState);
- ampLeadTrebleKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
- ampLeadTrebleKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
- ampLeadTrebleKnob.setNumDecimalPlacesToDisplay(1);
- ampLeadTrebleKnob.setDoubleClickReturnValue(true, 0.0);
-
- addAndMakeVisible(ampLeadGainKnob);
- ampLeadGainKnob.setLookAndFeel(&SilverKnobLAF);
- ampLeadGainKnob.addListener(this);
- ampLeadGainKnob.setRange(0.0, 20.0);
- ampLeadGainKnob.setValue(processor.ampLeadGainKnobState);
- ampLeadGainKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
- ampLeadGainKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
- ampLeadGainKnob.setNumDecimalPlacesToDisplay(1);
- ampLeadGainKnob.setDoubleClickReturnValue(true, 10.0);
-
- addAndMakeVisible(ampMasterKnob);
- ampMasterKnob.setLookAndFeel(&SilverKnobLAF);
- ampMasterKnob.addListener(this);
- ampMasterKnob.setRange(-24.0, 0.0);
- ampMasterKnob.setValue(processor.ampMasterKnobState);
- ampMasterKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
- ampMasterKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20 );
- ampMasterKnob.setNumDecimalPlacesToDisplay(1);
- ampMasterKnob.setDoubleClickReturnValue(true, -12.0);
-
- // Size of plugin GUI
- setSize (1085, 660);
-
- // Load the preset wavenet json model from the project resources
- if (processor.custom_tone == 0) {
- processor.loadConfigAmp();
- } else {
- processor.loadConfig(processor.loaded_tone);
- }
-}
-
-WaveNetVaAudioProcessorEditor::~WaveNetVaAudioProcessorEditor()
-{
-}
-
-//==============================================================================
-void WaveNetVaAudioProcessorEditor::paint (Graphics& g)
-{
- // (Our component is opaque, so we must completely fill the background with a solid colour)
- //g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId));
- if ( current_background == 1 && processor.amp_state == 1 && processor.amp_lead == 1 ) {
- // Redraw only the clipped part of the background image
- juce::Rectangle<int> ClipRect = g.getClipBounds();
- g.drawImage(background_clean, ClipRect.getX(), ClipRect.getY(), ClipRect.getWidth(), ClipRect.getHeight(), ClipRect.getX(), ClipRect.getY(), ClipRect.getWidth(), ClipRect.getHeight());
-
- } else if (current_background == 1 && processor.amp_state == 1 && processor.amp_lead == 0) {
- // Redraw only the clipped part of the background image
- juce::Rectangle<int> ClipRect = g.getClipBounds();
- g.drawImage(background_lead, ClipRect.getX(), ClipRect.getY(), ClipRect.getWidth(), ClipRect.getHeight(), ClipRect.getX(), ClipRect.getY(), ClipRect.getWidth(), ClipRect.getHeight());
-
- } else {
- // Redraw only the clipped part of the background image
- juce::Rectangle<int> ClipRect = g.getClipBounds();
- g.drawImage(background_off, ClipRect.getX(), ClipRect.getY(), ClipRect.getWidth(), ClipRect.getHeight(), ClipRect.getX(), ClipRect.getY(), ClipRect.getWidth(), ClipRect.getHeight());
-
- }
- //g.drawImageAt(background, 0, 0);
-
- //g.setColour (Colours::white);
- //g.setFont (15.0f);
-
- // Should really override the ToggleButton class, but being lazy here
- // Set On/Off amp graphic
- if (processor.amp_state == 0) {
- ampOnButton.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::power_switch_down_png, BinaryData::power_switch_down_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::power_switch_down_png, BinaryData::power_switch_down_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- ampLED.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::led_blue_off_png, BinaryData::led_blue_off_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::led_blue_off_png, BinaryData::led_blue_off_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- }
- else {
- ampOnButton.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- ampLED.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::led_blue_on_png, BinaryData::led_blue_on_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::led_blue_on_png, BinaryData::led_blue_on_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- }
- // Set clean/lead switch graphic
- if (processor.amp_lead == 0) {
- ampCleanLeadButton.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::power_switch_down_png, BinaryData::power_switch_down_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::power_switch_down_png, BinaryData::power_switch_down_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- }
- else {
- ampCleanLeadButton.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- }
-}
-
-void WaveNetVaAudioProcessorEditor::resized()
-{
- // This is generally where you'll want to lay out the positions of any
- // subcomponents in your editor..
-
- loadButton.setBounds(50, 40, 125, 25);
- modelLabel.setBounds(50, 65, 400, 25);
- // Amp Widgets
- ampPresenceKnob.setBounds(97, 495, 75, 105);
- ampCleanBassKnob.setBounds(197, 495, 75, 105);
- ampCleanMidKnob.setBounds(280, 495, 75, 105);
- ampCleanTrebleKnob.setBounds(378, 495, 75, 105);
- ampCleanGainKnob.setBounds(456, 495, 75, 105);
- ampLeadBassKnob.setBounds(553, 495, 75, 105);
- ampLeadMidKnob.setBounds(636, 495, 75, 105);
- ampLeadTrebleKnob.setBounds(726, 495, 75, 105);
- ampLeadGainKnob.setBounds(806, 495, 75, 105);
- ampMasterKnob.setBounds(903, 495, 75, 105);
-
- ampOnButton.setBounds(9, 495, 35, 45);
- ampCleanLeadButton.setBounds(959, 495, 15, 25);
-
- ampLED.setBounds(975, 160, 15, 25);
-}
-
-void WaveNetVaAudioProcessorEditor::loadButtonClicked()
-{
- FileChooser chooser("Select a .json tone...",
- {},
- "*.json");
- if (chooser.browseForFileToOpen())
- {
- File file = chooser.getResult();
- processor.loadConfig(file);
- fname = file.getFileName();
- modelLabel.setText(fname, juce::NotificationType::dontSendNotification);
- processor.loaded_tone = file;
- processor.loaded_tone_name = fname;
- processor.custom_tone = 1;
- }
-}
-
-void WaveNetVaAudioProcessorEditor::buttonClicked(juce::Button* button)
-{
- if (button == &OnButton) {
- ampOnButtonClicked();
- } else if (button == &CleanLeadButton) {
- ampCleanLeadButtonClicked();
- } else if (button == &loadButton) {
- loadButtonClicked();
- }
-}
-
-
-void WaveNetVaAudioProcessorEditor::ampOnButtonClicked() {
- if (processor.amp_state == 0) {
- processor.amp_state = 1;
- }
- else {
- processor.amp_state = 0;
- }
- resetImages();
- repaint();
-}
-
-void WaveNetVaAudioProcessorEditor::ampCleanLeadButtonClicked() {
- if (processor.amp_lead == 0) {
- processor.amp_lead = 1;
- processor.loadConfigAmp();
- processor.set_ampEQ(ampCleanBassKnob.getValue(), ampCleanMidKnob.getValue(), ampCleanTrebleKnob.getValue(), ampPresenceKnob.getValue());
- }
- else if (processor.amp_lead == 1) {
- processor.amp_lead = 0;
- processor.loadConfigAmp();
- processor.set_ampEQ(ampLeadBassKnob.getValue(), ampLeadMidKnob.getValue(), ampLeadTrebleKnob.getValue(), ampPresenceKnob.getValue());
- }
- modelLabel.setText("", juce::NotificationType::dontSendNotification);
- processor.loaded_tone_name = "";
- processor.custom_tone = 0;
-
- resetImages();
- repaint();
-}
-
-void WaveNetVaAudioProcessorEditor::sliderValueChanged(Slider* slider)
-{
- // Amp
- if (slider == &CleanGainKnob)
- processor.set_ampCleanDrive(slider->getValue());
- else if (slider == &LeadGainKnob)
- processor.set_ampLeadDrive(slider->getValue());
- else if (slider == &MasterKnob)
- processor.set_ampMaster(slider->getValue());
- else if (slider == &CleanBassKnob || slider == &CleanMidKnob || slider == &CleanTrebleKnob) {
- if (processor.amp_lead == 1)
- processor.set_ampEQ(ampCleanBassKnob.getValue(), ampCleanMidKnob.getValue(), ampCleanTrebleKnob.getValue(), ampPresenceKnob.getValue());
- // Set knob states for saving positions when closing/reopening GUI
- processor.ampCleanBassKnobState = ampCleanBassKnob.getValue();
- processor.ampCleanMidKnobState = ampCleanMidKnob.getValue();
- processor.ampCleanTrebleKnobState = ampCleanTrebleKnob.getValue();
- }
- else if (slider == &LeadBassKnob || slider == &LeadMidKnob || slider == &LeadTrebleKnob) {
- if (processor.amp_lead == 0)
- processor.set_ampEQ(ampLeadBassKnob.getValue(), ampLeadMidKnob.getValue(), ampLeadTrebleKnob.getValue(), ampPresenceKnob.getValue());
- // Set knob states for saving positions when closing/reopening GUI
- processor.ampLeadBassKnobState = ampLeadBassKnob.getValue();
- processor.ampLeadMidKnobState = ampLeadMidKnob.getValue();
- processor.ampLeadTrebleKnobState = ampLeadTrebleKnob.getValue();
- }
- else if (slider == &PresenceKnob) {
- if (processor.amp_lead == 1)
- processor.set_ampEQ(ampCleanBassKnob.getValue(), ampCleanMidKnob.getValue(), ampCleanTrebleKnob.getValue(), ampPresenceKnob.getValue());
- else if (processor.amp_lead == 0)
- processor.set_ampEQ(ampLeadBassKnob.getValue(), ampLeadMidKnob.getValue(), ampLeadTrebleKnob.getValue(), ampPresenceKnob.getValue());
- }
-
-}
-
-void WaveNetVaAudioProcessorEditor::resetImages()
-{
- // Set On/Off amp graphic
- if (processor.amp_state == 0) {
- ampOnButton.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::power_switch_down_png, BinaryData::power_switch_down_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::power_switch_down_png, BinaryData::power_switch_down_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- ampLED.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::led_blue_off_png, BinaryData::led_blue_off_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::led_blue_off_png, BinaryData::led_blue_off_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- }
- else {
- ampOnButton.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- ampLED.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::led_blue_on_png, BinaryData::led_blue_on_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::led_blue_on_png, BinaryData::led_blue_on_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- }
- // Set clean/lead switch graphic
- if (processor.amp_lead == 0) {
- ampCleanLeadButton.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::power_switch_down_png, BinaryData::power_switch_down_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::power_switch_down_png, BinaryData::power_switch_down_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- }
- else {
- ampCleanLeadButton.setImages(true, true, true,
- ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
- Image(), 1.0, Colours::transparentWhite,
- ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
- 0.0);
- }
-}
diff --git a/plugins/SmartAmp/Source/PluginEditor.h b/plugins/SmartAmp/Source/PluginEditor.h
@@ -1,76 +0,0 @@
-/*
- ==============================================================================
-
- This file was auto-generated!
-
- It contains the basic framework code for a JUCE plugin editor.
-
- ==============================================================================
-*/
-
-#pragma once
-
-#include "../JuceLibraryCode/JuceHeader.h"
-#include "PluginProcessor.h"
-#include "myLookAndFeel.h"
-
-//==============================================================================
-/**
-*/
-class WaveNetVaAudioProcessorEditor : public AudioProcessorEditor,
- private Button::Listener,
- private Slider::Listener
-
-{
-public:
- WaveNetVaAudioProcessorEditor (WaveNetVaAudioProcessor&);
- ~WaveNetVaAudioProcessorEditor();
-
- //==============================================================================
- void paint (Graphics&) override;
- void resized() override;
-
-
-
-private:
- // This reference is provided as a quick way for your editor to
- // access the processor object that created it.
- WaveNetVaAudioProcessor& processor;
-
- // Amp Widgets
- Slider ampPresenceKnob;
- Slider ampCleanBassKnob;
- Slider ampCleanMidKnob;
- Slider ampCleanTrebleKnob;
- Slider ampCleanGainKnob;
- Slider ampLeadBassKnob;
- Slider ampLeadMidKnob;
- Slider ampLeadTrebleKnob;
- Slider ampLeadGainKnob;
- Slider ampMasterKnob;
- ImageButton ampOnButton;
- ImageButton ampCleanLeadButton;
- ImageButton ampLED;
-
-
- // LookandFeels
- myLookAndFeel ampSilverKnobLAF;
-
- //Image background;
- Image background_clean = ImageCache::getFromMemory(BinaryData::amp_clean_jpg, BinaryData::amp_clean_jpgSize);
- Image background_lead = ImageCache::getFromMemory(BinaryData::amp_lead_jpg, BinaryData::amp_lead_jpgSize);
- Image background_off = ImageCache::getFromMemory(BinaryData::amp_off_jpg, BinaryData::amp_off_jpgSize);
- int current_background = 1;
-
- TextButton loadButton;
- Label modelLabel;
- juce::String fname;
- virtual void buttonClicked(Button* button) override;
- void loadButtonClicked();
- virtual void sliderValueChanged(Slider* slider) override;
- void ampOnButtonClicked();
- void ampCleanLeadButtonClicked();
- void resetImages();
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WaveNetVaAudioProcessorEditor)
-};
diff --git a/plugins/SmartAmp/Source/PluginProcessor.cpp b/plugins/SmartAmp/Source/PluginProcessor.cpp
@@ -1,297 +0,0 @@
-/*
- ==============================================================================
-
- This file was auto-generated!
-
- It contains the basic framework code for a JUCE plugin processor.
-
- ==============================================================================
-*/
-
-#include "PluginProcessor.h"
-#include "PluginEditor.h"
-
-//==============================================================================
-WaveNetVaAudioProcessor::WaveNetVaAudioProcessor()
-#ifndef JucePlugin_PreferredChannelConfigurations
- : AudioProcessor(BusesProperties()
-#if ! JucePlugin_IsMidiEffect
-#if ! JucePlugin_IsSynth
- .withInput("Input", AudioChannelSet::stereo(), true)
-#endif
- .withOutput("Output", AudioChannelSet::stereo(), true)
-#endif
- ),
- waveNet(1, 1, 1, 1, "linear", { 1 })
-
-#endif
-{
-}
-
-WaveNetVaAudioProcessor::~WaveNetVaAudioProcessor()
-{
-}
-
-//==============================================================================
-const String WaveNetVaAudioProcessor::getName() const
-{
- return JucePlugin_Name;
-}
-
-bool WaveNetVaAudioProcessor::acceptsMidi() const
-{
- #if JucePlugin_WantsMidiInput
- return true;
- #else
- return false;
- #endif
-}
-
-bool WaveNetVaAudioProcessor::producesMidi() const
-{
- #if JucePlugin_ProducesMidiOutput
- return true;
- #else
- return false;
- #endif
-}
-
-bool WaveNetVaAudioProcessor::isMidiEffect() const
-{
- #if JucePlugin_IsMidiEffect
- return true;
- #else
- return false;
- #endif
-}
-
-double WaveNetVaAudioProcessor::getTailLengthSeconds() const
-{
- return 0.0;
-}
-
-int WaveNetVaAudioProcessor::getNumPrograms()
-{
- return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs,
- // so this should be at least 1, even if you're not really implementing programs.
-}
-
-int WaveNetVaAudioProcessor::getCurrentProgram()
-{
- return 0;
-}
-
-void WaveNetVaAudioProcessor::setCurrentProgram (int index)
-{
-}
-
-const String WaveNetVaAudioProcessor::getProgramName (int index)
-{
- return {};
-}
-
-void WaveNetVaAudioProcessor::changeProgramName (int index, const String& newName)
-{
-}
-
-//==============================================================================
-void WaveNetVaAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock)
-{
- // Use this method as the place to do any pre-playback
- // initialisation that you need..
- waveNet.prepareToPlay(samplesPerBlock);
-}
-
-void WaveNetVaAudioProcessor::releaseResources()
-{
- // When playback stops, you can use this as an opportunity to free up any
- // spare memory, etc.
-}
-
-#ifndef JucePlugin_PreferredChannelConfigurations
-bool WaveNetVaAudioProcessor::isBusesLayoutSupported (const BusesLayout& layouts) const
-{
- #if JucePlugin_IsMidiEffect
- ignoreUnused (layouts);
- return true;
- #else
- // This is the place where you check if the layout is supported.
- // In this template code we only support mono or stereo.
- if (layouts.getMainOutputChannelSet() != AudioChannelSet::mono()
- && layouts.getMainOutputChannelSet() != AudioChannelSet::stereo())
- return false;
-
- // This checks if the input layout matches the output layout
- #if ! JucePlugin_IsSynth
- if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet())
- return false;
- #endif
-
- return true;
- #endif
-}
-#endif
-
-void WaveNetVaAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer& midiMessages)
-{
- ScopedNoDenormals noDenormals;
-
- // Setup Audio Data
- const int numSamples = buffer.getNumSamples();
- const int numInputChannels = getTotalNumInputChannels();
-
-
- // Amp =============================================================================
- if (amp_state == 1) {
- // EQ TODO before or after wavenet? (Presence; Bass, Mid, Treble for both channels)
- eq4band.process(buffer, midiMessages, numSamples, numInputChannels);
-
- if (amp_lead == 1) {// if clean channel eq/gain
-
- buffer.applyGain(ampCleanDrive);
-
- }
- else {// else lead channel eq/gain
-
- buffer.applyGain(ampLeadDrive);
-
- }
-
- // Wavenet, load json for waveNet2 based on lead/clean switch
- waveNet.process(buffer.getArrayOfReadPointers(), buffer.getArrayOfWritePointers(), buffer.getNumSamples());
-
- // Master Volume
- buffer.applyGain(ampMaster);
-
- // Apply levelAdjust from model param (for adjusting quiet or loud models)
- if ( waveNet.levelAdjust != 0.0 ) {
- buffer.applyGain(waveNet.levelAdjust);
- }
-
- }
-
- for (int ch = 1; ch < buffer.getNumChannels(); ++ch)
- buffer.copyFrom(ch, 0, buffer, 0, 0, buffer.getNumSamples());
-}
-
-//==============================================================================
-bool WaveNetVaAudioProcessor::hasEditor() const
-{
- return true; // (change this to false if you choose to not supply an editor)
-}
-
-AudioProcessorEditor* WaveNetVaAudioProcessor::createEditor()
-{
- return new WaveNetVaAudioProcessorEditor (*this);
-}
-
-//==============================================================================
-void WaveNetVaAudioProcessor::getStateInformation (MemoryBlock& destData)
-{
- // You should use this method to store your parameters in the memory block.
- // You could do that either as raw data, or use the XML or ValueTree classes
- // as intermediaries to make it easy to save and load complex data.
-}
-
-void WaveNetVaAudioProcessor::setStateInformation (const void* data, int sizeInBytes)
-{
- // You should use this method to restore your parameters from this memory block,
- // whose contents will have been created by the getStateInformation() call.
-}
-
-
-void WaveNetVaAudioProcessor::loadConfigAmp()
-{
- // Load Second Wavenet
- this->suspendProcessing(true);
-
- if (amp_lead == 0) { // if lead on
- WaveNetLoader loader2(BinaryData::bluej_fullD_p0153_json);
- float levelAdjust = loader2.levelAdjust;
- int numChannels2 = loader2.numChannels;
- int inputChannels2 = loader2.inputChannels;
- int outputChannels2 = loader2.outputChannels;
- int filterWidth2 = loader2.filterWidth;
- std::vector<int> dilations2 = loader2.dilations;
- std::string activation2 = loader2.activation;
- waveNet.setParams(inputChannels2, outputChannels2, numChannels2, filterWidth2, activation2,
- dilations2, levelAdjust);
- loader2.loadVariables(waveNet);
- } else { // else if clean on
- WaveNetLoader loader2(BinaryData::bluej_clean_p0088_json);
- float levelAdjust = loader2.levelAdjust;
- int numChannels2 = loader2.numChannels;
- int inputChannels2 = loader2.inputChannels;
- int outputChannels2 = loader2.outputChannels;
- int filterWidth2 = loader2.filterWidth;
- std::vector<int> dilations2 = loader2.dilations;
- std::string activation2 = loader2.activation;
- waveNet.setParams(inputChannels2, outputChannels2, numChannels2, filterWidth2, activation2,
- dilations2, levelAdjust);
- loader2.loadVariables(waveNet);
- }
-
- this->suspendProcessing(false);
-}
-
-void WaveNetVaAudioProcessor::loadConfig(File configFile)
-{
- this->suspendProcessing(true);
- WaveNetLoader loader(dummyVar, configFile);
- float levelAdjust = loader.levelAdjust;
- int numChannels = loader.numChannels;
- int inputChannels = loader.inputChannels;
- int outputChannels = loader.outputChannels;
- int filterWidth = loader.filterWidth;
- std::vector<int> dilations = loader.dilations;
- std::string activation = loader.activation;
- waveNet.setParams(inputChannels, outputChannels, numChannels, filterWidth, activation,
- dilations, levelAdjust);
- loader.loadVariables(waveNet);
- this->suspendProcessing(false);
-}
-
-float WaveNetVaAudioProcessor::convertLogScale(float in_value, float x_min, float x_max, float y_min, float y_max)
-{
- float b = log(y_max / y_min) / (x_max - x_min);
- float a = y_max / exp(b * x_max);
- float converted_value = a * exp(b * in_value);
- return converted_value;
-}
-
-void WaveNetVaAudioProcessor::set_ampCleanDrive(float db_ampCleanDrive)
-{
- ampCleanDrive = decibelToLinear(db_ampCleanDrive);
- ampCleanGainKnobState = db_ampCleanDrive;
-}
-
-void WaveNetVaAudioProcessor::set_ampLeadDrive(float db_ampLeadDrive)
-{
- ampLeadDrive = decibelToLinear(db_ampLeadDrive);
- ampLeadGainKnobState = db_ampLeadDrive;
-}
-
-void WaveNetVaAudioProcessor::set_ampMaster(float db_ampMaster)
-{
- ampMaster = decibelToLinear(db_ampMaster);
- ampMasterKnobState = db_ampMaster;
-}
-
-void WaveNetVaAudioProcessor::set_ampEQ(float bass_slider, float mid_slider, float treble_slider, float presence_slider)
-{
- eq4band.setParameters(bass_slider, mid_slider, treble_slider, presence_slider);
-
- ampPresenceKnobState = presence_slider;
-}
-
-float WaveNetVaAudioProcessor::decibelToLinear(float dbValue)
-{
- return powf(10.0, dbValue/20.0);
-}
-
-//==============================================================================
-// This creates new instances of the plugin..
-AudioProcessor* JUCE_CALLTYPE createPluginFilter()
-{
- return new WaveNetVaAudioProcessor();
-}
diff --git a/plugins/SmartAmp/Source/PluginProcessor.h b/plugins/SmartAmp/Source/PluginProcessor.h
@@ -1,108 +0,0 @@
-/*
- ==============================================================================
-
- This file was auto-generated!
-
- It contains the basic framework code for a JUCE plugin processor.
-
- ==============================================================================
-*/
-
-#pragma once
-
-#include "../JuceLibraryCode/JuceHeader.h"
-#include "WaveNet.h"
-#include "WaveNetLoader.h"
-#include "Eq4Band.h"
-
-//==============================================================================
-/**
-*/
-class WaveNetVaAudioProcessor : public AudioProcessor
-{
-public:
- //==============================================================================
- WaveNetVaAudioProcessor();
- ~WaveNetVaAudioProcessor();
-
- //==============================================================================
- void prepareToPlay (double sampleRate, int samplesPerBlock) override;
- void releaseResources() override;
-
- #ifndef JucePlugin_PreferredChannelConfigurations
- bool isBusesLayoutSupported (const BusesLayout& layouts) const override;
- #endif
-
- void processBlock (AudioBuffer<float>&, MidiBuffer&) override;
-
- //==============================================================================
- AudioProcessorEditor* createEditor() override;
- bool hasEditor() const override;
-
- //==============================================================================
- const String getName() const override;
-
- bool acceptsMidi() const override;
- bool producesMidi() const override;
- bool isMidiEffect() const override;
- double getTailLengthSeconds() const override;
-
- //==============================================================================
- int getNumPrograms() override;
- int getCurrentProgram() override;
- void setCurrentProgram (int index) override;
- const String getProgramName (int index) override;
- void changeProgramName (int index, const String& newName) override;
-
- //==============================================================================
- void getStateInformation (MemoryBlock& destData) override;
- void setStateInformation (const void* data, int sizeInBytes) override;
-
- void loadConfigAmp();
- void loadConfig(File configFile);
-
- // Overdrive Pedal
- float convertLogScale(float in_value, float x_min, float x_max, float y_min, float y_max);
-
- // Amp
- void set_ampCleanDrive(float db_ampCleanDrive);
- void set_ampLeadDrive(float db_ampLeadDrive);
- void set_ampMaster(float db_ampMaster);
- void set_ampEQ(float bass_slider, float mid_slider, float treble_slider, float presence_slider);
-
- float decibelToLinear(float dbValue);
-
- // Pedal/amp states
- int amp_state = 1; // 0 = off, 1 = on
- int amp_lead = 1; // 1 = clean, 0 = lead
- int custom_tone = 0; // 0 = custom tone loaded, 1 = default channel tone
- File loaded_tone;
- juce::String loaded_tone_name;
-
- // Amp knob states
- float ampPresenceKnobState = 0.0;
- float ampCleanBassKnobState = 0.0;
- float ampCleanMidKnobState = 0.0;
- float ampCleanTrebleKnobState = 0.0;
- float ampCleanGainKnobState = 10.0;
- float ampLeadBassKnobState = 0.0;
- float ampLeadMidKnobState = 0.0;
- float ampLeadTrebleKnobState = 0.0;
- float ampLeadGainKnobState = 10.0;
- float ampMasterKnobState = -12.0;
-
-private:
- WaveNet waveNet; // Amp Clean Channel / Lead Channel
- Eq4Band eq4band; // Amp EQ
-
-
- // Amp
- float ampCleanDrive = 1.0;
- float ampLeadDrive = 1.0;
- float ampMaster = 1.0;
-
- var dummyVar;
-
- //==============================================================================
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WaveNetVaAudioProcessor)
-};
diff --git a/resources/logo.png b/resources/logo.png
Binary files differ.
diff --git a/plugins/SmartAmp/Source/Activations.cpp b/src/Activations.cpp
diff --git a/plugins/SmartAmp/Source/Activations.h b/src/Activations.h
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
@@ -0,0 +1,24 @@
+#add_subdirectory(headless)
+
+target_sources(SmartAmp PRIVATE
+ Activations.cpp
+ Activations.h
+ Convolution.cpp
+ Convolution.h
+ ConvolutionLayer.cpp
+ ConvolutionLayer.h
+ ConvolutionStack.cpp
+ ConvolutionStack.h
+ myLookAndFeel.cpp
+ myLookAndFeel.h
+ PluginEditor.cpp
+ PluginEditor.h
+ PluginProcessor.cpp
+ PluginProcessor.h
+ WaveNet.cpp
+ WaveNet.h
+ WaveNetLoader.cpp
+ WaveNetLoader.h
+)
+
+#target_precompile_headers(SmartAmp PRIVATE pch.h)
diff --git a/plugins/SmartAmp/Source/Convolution.cpp b/src/Convolution.cpp
diff --git a/plugins/SmartAmp/Source/Convolution.h b/src/Convolution.h
diff --git a/plugins/SmartAmp/Source/ConvolutionLayer.cpp b/src/ConvolutionLayer.cpp
diff --git a/plugins/SmartAmp/Source/ConvolutionLayer.h b/src/ConvolutionLayer.h
diff --git a/plugins/SmartAmp/Source/ConvolutionStack.cpp b/src/ConvolutionStack.cpp
diff --git a/plugins/SmartAmp/Source/ConvolutionStack.h b/src/ConvolutionStack.h
diff --git a/plugins/SmartAmp/Source/Eq4Band.cpp b/src/Eq4Band.cpp
diff --git a/plugins/SmartAmp/Source/Eq4Band.h b/src/Eq4Band.h
diff --git a/src/PluginEditor.cpp b/src/PluginEditor.cpp
@@ -0,0 +1,346 @@
+/*
+ ==============================================================================
+
+ This file was auto-generated!
+
+ It contains the basic framework code for a JUCE plugin editor.
+
+ ==============================================================================
+*/
+
+#include "PluginProcessor.h"
+#include "PluginEditor.h"
+
+//==============================================================================
+WaveNetVaAudioProcessorEditor::WaveNetVaAudioProcessorEditor (WaveNetVaAudioProcessor& p)
+ : AudioProcessorEditor (&p), processor (p)
+{
+ // Make sure that before the constructor has finished, you've set the
+ // editor's size to whatever you need it to
+
+ // Set Widget Graphics
+ ampSilverKnobLAF.setLookAndFeel(ImageCache::getFromMemory(BinaryData::knob_silver_png, BinaryData::knob_silver_pngSize));
+
+ ampOnButton.setImages(true, true, true,
+ ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
+ Image(), 1.0, Colours::transparentWhite,
+ ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
+ 0.0);
+ addAndMakeVisible(ampOnButton);
+ ampOnButton.addListener(this);
+
+ //addAndMakeVisible(loadButton);
+ //loadButton.setButtonText("Load Tone");
+ //loadButton.addListener(this);
+
+ //addAndMakeVisible(modelLabel);
+ //modelLabel.setText(processor.loaded_tone_name, juce::NotificationType::dontSendNotification);
+ //modelLabel.setJustificationType(juce::Justification::left);
+ //modelLabel.setColour(juce::Label::textColourId, juce::Colours::black);
+
+ ampCleanLeadButton.setImages(true, true, true,
+ ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
+ Image(), 1.0, Colours::transparentWhite,
+ ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
+ 0.0);
+ addAndMakeVisible(ampCleanLeadButton);
+ ampCleanLeadButton.addListener(this);
+
+ ampLED.setImages(true, true, true,
+ ImageCache::getFromMemory(BinaryData::led_blue_on_png, BinaryData::led_blue_on_pngSize), 1.0, Colours::transparentWhite,
+ Image(), 1.0, Colours::transparentWhite,
+ ImageCache::getFromMemory(BinaryData::led_blue_on_png, BinaryData::led_blue_on_pngSize), 1.0, Colours::transparentWhite,
+ 0.0);
+ addAndMakeVisible(ampLED);
+
+ presenceSliderAttach = std::make_unique<AudioProcessorValueTreeState::SliderAttachment>(processor.treeState, PRESENCE_ID, ampPresenceKnob);
+ addAndMakeVisible(ampPresenceKnob);
+ ampPresenceKnob.setLookAndFeel(&SilverKnobLAF);
+ ampPresenceKnob.addListener(this);
+ //ampPresenceKnob.setSkewFactorFromMidPoint(1000.0); // Not working because of custom lookAndFeel class
+ //ampPresenceKnob.setRange(-10.0, 10.0);
+ //ampPresenceKnob.setValue(processor.ampPresenceKnobState);
+ ampPresenceKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
+ ampPresenceKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 75, 20);
+ //ampPresenceKnob.setNumDecimalPlacesToDisplay(1);
+ ampPresenceKnob.setDoubleClickReturnValue(true, 0.0);
+
+ cleanBassSliderAttach = std::make_unique<AudioProcessorValueTreeState::SliderAttachment>(processor.treeState, CLEAN_BASS_ID, ampCleanBassKnob);
+ addAndMakeVisible(ampCleanBassKnob);
+ ampCleanBassKnob.setLookAndFeel(&SilverKnobLAF);
+ ampCleanBassKnob.addListener(this);
+ //ampCleanBassKnob.setRange(-8.0, 8.0);
+ //ampCleanBassKnob.setValue(processor.ampCleanBassKnobState);
+ ampCleanBassKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
+ ampCleanBassKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
+ //ampCleanBassKnob.setNumDecimalPlacesToDisplay(1);
+ ampCleanBassKnob.setDoubleClickReturnValue(true, 0.0);
+
+ cleanMidSliderAttach = std::make_unique<AudioProcessorValueTreeState::SliderAttachment>(processor.treeState, CLEAN_MID_ID, ampCleanMidKnob);
+ addAndMakeVisible(ampCleanMidKnob);
+ ampCleanMidKnob.setLookAndFeel(&SilverKnobLAF);
+ ampCleanMidKnob.addListener(this);
+ //ampCleanMidKnob.setRange(-8.0, 8.0);
+ //ampCleanMidKnob.setValue(processor.ampCleanMidKnobState);
+ ampCleanMidKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
+ ampCleanMidKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
+ //ampCleanMidKnob.setNumDecimalPlacesToDisplay(1);
+ ampCleanMidKnob.setDoubleClickReturnValue(true, 0.0);
+
+ cleanTrebleSliderAttach = std::make_unique<AudioProcessorValueTreeState::SliderAttachment>(processor.treeState, CLEAN_TREBLE_ID, ampCleanTrebleKnob);
+ addAndMakeVisible(ampCleanTrebleKnob);
+ ampCleanTrebleKnob.setLookAndFeel(&SilverKnobLAF);
+ ampCleanTrebleKnob.addListener(this);
+ //ampCleanTrebleKnob.setRange(-8.0, 8.0);
+ //ampCleanTrebleKnob.setValue(processor.ampCleanTrebleKnobState);
+ ampCleanTrebleKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
+ ampCleanTrebleKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
+ //ampCleanTrebleKnob.setNumDecimalPlacesToDisplay(1);
+ ampCleanTrebleKnob.setDoubleClickReturnValue(true, 0.0);
+
+ cleanGainSliderAttach = std::make_unique<AudioProcessorValueTreeState::SliderAttachment>(processor.treeState, CLEAN_GAIN_ID, ampCleanGainKnob);
+ addAndMakeVisible(ampCleanGainKnob);
+ ampCleanGainKnob.setLookAndFeel(&SilverKnobLAF);
+ ampCleanGainKnob.addListener(this);
+ //ampCleanGainKnob.setRange(0.0, 20.0);
+ //ampCleanGainKnob.setValue(processor.ampCleanGainKnobState);
+ ampCleanGainKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
+ ampCleanGainKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
+ //ampCleanGainKnob.setNumDecimalPlacesToDisplay(1);
+ ampCleanGainKnob.setDoubleClickReturnValue(true, 0.5);
+
+ leadBassSliderAttach = std::make_unique<AudioProcessorValueTreeState::SliderAttachment>(processor.treeState, LEAD_BASS_ID, ampLeadBassKnob);
+ addAndMakeVisible(ampLeadBassKnob);
+ ampLeadBassKnob.setLookAndFeel(&SilverKnobLAF);
+ ampLeadBassKnob.addListener(this);
+ //ampLeadBassKnob.setRange(-8.0, 8.0);
+ //ampLeadBassKnob.setValue(processor.ampLeadBassKnobState);
+ ampLeadBassKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
+ ampLeadBassKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
+ //ampLeadBassKnob.setNumDecimalPlacesToDisplay(1);
+ ampLeadBassKnob.setDoubleClickReturnValue(true, 0.0);
+
+ leadMidSliderAttach = std::make_unique<AudioProcessorValueTreeState::SliderAttachment>(processor.treeState, LEAD_MID_ID, ampLeadMidKnob);
+ addAndMakeVisible(ampLeadMidKnob);
+ ampLeadMidKnob.setLookAndFeel(&SilverKnobLAF);
+ ampLeadMidKnob.addListener(this);
+ //ampLeadMidKnob.setRange(-8.0, 8.0);
+ //ampLeadMidKnob.setValue(processor.ampLeadMidKnobState);
+ ampLeadMidKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
+ ampLeadMidKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
+ //ampLeadMidKnob.setNumDecimalPlacesToDisplay(1);
+ ampLeadMidKnob.setDoubleClickReturnValue(true, 0.0);
+
+ leadTrebleSliderAttach = std::make_unique<AudioProcessorValueTreeState::SliderAttachment>(processor.treeState, LEAD_TREBLE_ID, ampLeadTrebleKnob);
+ addAndMakeVisible(ampLeadTrebleKnob);
+ ampLeadTrebleKnob.setLookAndFeel(&SilverKnobLAF);
+ ampLeadTrebleKnob.addListener(this);
+ //ampLeadTrebleKnob.setRange(-8.0, 8.0);
+ //ampLeadTrebleKnob.setValue(processor.ampLeadTrebleKnobState);
+ ampLeadTrebleKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
+ ampLeadTrebleKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
+ //ampLeadTrebleKnob.setNumDecimalPlacesToDisplay(1);
+ ampLeadTrebleKnob.setDoubleClickReturnValue(true, 0.0);
+
+ leadGainSliderAttach = std::make_unique<AudioProcessorValueTreeState::SliderAttachment>(processor.treeState, LEAD_GAIN_ID, ampLeadGainKnob);
+ addAndMakeVisible(ampLeadGainKnob);
+ ampLeadGainKnob.setLookAndFeel(&SilverKnobLAF);
+ ampLeadGainKnob.addListener(this);
+ //ampLeadGainKnob.setRange(0.0, 20.0);
+ //ampLeadGainKnob.setValue(processor.ampLeadGainKnobState);
+ ampLeadGainKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
+ ampLeadGainKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20);
+ //ampLeadGainKnob.setNumDecimalPlacesToDisplay(1);
+ ampLeadGainKnob.setDoubleClickReturnValue(true, 0.5);
+
+ ampMasterSliderAttach = std::make_unique<AudioProcessorValueTreeState::SliderAttachment>(processor.treeState, MASTER_ID, ampMasterKnob);
+ addAndMakeVisible(ampMasterKnob);
+ ampMasterKnob.setLookAndFeel(&SilverKnobLAF);
+ ampMasterKnob.addListener(this);
+ //ampMasterKnob.setRange(-24.0, 0.0);
+ //ampMasterKnob.setValue(processor.ampMasterKnobState);
+ ampMasterKnob.setSliderStyle(juce::Slider::SliderStyle::RotaryVerticalDrag);
+ //ampMasterKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20 );
+ ampMasterKnob.setNumDecimalPlacesToDisplay(1);
+ ampMasterKnob.setDoubleClickReturnValue(true, 0.5);
+
+ // Size of plugin GUI
+ setSize (1085, 660);
+
+ // Load the preset wavenet json model from the project resources
+ //if (processor.custom_tone == 0) {
+ processor.loadConfigAmp();
+ //} else {
+ // processor.loadConfig(processor.loaded_tone);
+ //}
+ resetImages();
+}
+
+WaveNetVaAudioProcessorEditor::~WaveNetVaAudioProcessorEditor()
+{
+}
+
+//==============================================================================
+void WaveNetVaAudioProcessorEditor::paint (Graphics& g)
+{
+
+ // Workaround for graphics on Windows builds (clipping code doesn't work correctly on Windows)
+ #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
+ g.drawImageAt(background_clean, 0, 0); // Debug Line: Redraw entire background image
+ #else
+ // Redraw only the clipped part of the background image
+ juce::Rectangle<int> ClipRect = g.getClipBounds();
+ g.drawImage(background_clean, ClipRect.getX(), ClipRect.getY(), ClipRect.getWidth(), ClipRect.getHeight(), ClipRect.getX(), ClipRect.getY(), ClipRect.getWidth(), ClipRect.getHeight());
+ #endif
+
+}
+
+void WaveNetVaAudioProcessorEditor::resized()
+{
+ // This is generally where you'll want to lay out the positions of any
+ // subcomponents in your editor..
+
+ loadButton.setBounds(50, 40, 125, 25);
+ modelLabel.setBounds(50, 65, 400, 25);
+ // Amp Widgets
+ ampPresenceKnob.setBounds(97, 495, 75, 105);
+ ampCleanBassKnob.setBounds(197, 495, 75, 105);
+ ampCleanMidKnob.setBounds(280, 495, 75, 105);
+ ampCleanTrebleKnob.setBounds(378, 495, 75, 105);
+ ampCleanGainKnob.setBounds(456, 495, 75, 105);
+ ampLeadBassKnob.setBounds(553, 495, 75, 105);
+ ampLeadMidKnob.setBounds(636, 495, 75, 105);
+ ampLeadTrebleKnob.setBounds(726, 495, 75, 105);
+ ampLeadGainKnob.setBounds(806, 495, 75, 105);
+ ampMasterKnob.setBounds(903, 495, 75, 105);
+
+ ampOnButton.setBounds(9, 495, 35, 45);
+ ampCleanLeadButton.setBounds(959, 495, 15, 25);
+
+ ampLED.setBounds(975, 160, 15, 25);
+}
+
+/*
+void WaveNetVaAudioProcessorEditor::loadButtonClicked()
+{
+ FileChooser chooser("Select a .json tone...",
+ {},
+ "*.json");
+ if (chooser.browseForFileToOpen())
+ {
+ File file = chooser.getResult();
+ processor.loadConfig(file);
+ fname = file.getFileName();
+ modelLabel.setText(fname, juce::NotificationType::dontSendNotification);
+ processor.loaded_tone = file;
+ processor.loaded_tone_name = fname;
+ processor.custom_tone = 1;
+ }
+}
+
+void WaveNetVaAudioProcessorEditor::buttonClicked(juce::Button* button)
+{
+ if (button == &OnButton) {
+ ampOnButtonClicked();
+ } else if (button == &CleanLeadButton) {
+ ampCleanLeadButtonClicked();
+ } else if (button == &loadButton) {
+ loadButtonClicked();
+ }
+}
+*/
+
+void WaveNetVaAudioProcessorEditor::ampOnButtonClicked() {
+ if (processor.amp_state == 0) {
+ processor.amp_state = 1;
+ }
+ else {
+ processor.amp_state = 0;
+ }
+ resetImages();
+ repaint();
+}
+
+void WaveNetVaAudioProcessorEditor::ampCleanLeadButtonClicked() {
+ if (processor.amp_lead == 0) {
+ processor.amp_lead = 1;
+ processor.loadConfigAmp();
+ processor.set_ampEQ(ampCleanBassKnob.getValue(), ampCleanMidKnob.getValue(), ampCleanTrebleKnob.getValue(), ampPresenceKnob.getValue());
+ }
+ else if (processor.amp_lead == 1) {
+ processor.amp_lead = 0;
+ processor.loadConfigAmp();
+ processor.set_ampEQ(ampLeadBassKnob.getValue(), ampLeadMidKnob.getValue(), ampLeadTrebleKnob.getValue(), ampPresenceKnob.getValue());
+ }
+ modelLabel.setText("", juce::NotificationType::dontSendNotification);
+ processor.loaded_tone_name = "";
+ processor.custom_tone = 0;
+
+ resetImages();
+ repaint();
+}
+
+void WaveNetVaAudioProcessorEditor::sliderValueChanged(Slider* slider)
+{
+ // Amp
+
+ if (slider == &LeadBassKnob || slider == &LeadMidKnob || slider == &LeadTrebleKnob) {
+ if (processor.amp_lead == 0)
+ processor.set_ampEQ(ampLeadBassKnob.getValue(), ampLeadMidKnob.getValue(), ampLeadTrebleKnob.getValue(), ampPresenceKnob.getValue());
+ // Set knob states for saving positions when closing/reopening GUI
+ processor.ampLeadBassKnobState = ampLeadBassKnob.getValue();
+ processor.ampLeadMidKnobState = ampLeadMidKnob.getValue();
+ processor.ampLeadTrebleKnobState = ampLeadTrebleKnob.getValue();
+ }
+ else if (slider == &PresenceKnob) {
+ if (processor.amp_lead == 1)
+ processor.set_ampEQ(ampCleanBassKnob.getValue(), ampCleanMidKnob.getValue(), ampCleanTrebleKnob.getValue(), ampPresenceKnob.getValue());
+ else if (processor.amp_lead == 0)
+ processor.set_ampEQ(ampLeadBassKnob.getValue(), ampLeadMidKnob.getValue(), ampLeadTrebleKnob.getValue(), ampPresenceKnob.getValue());
+ }
+
+}
+
+void WaveNetVaAudioProcessorEditor::resetImages()
+{
+ // Set On/Off amp graphic
+ if (processor.amp_state == 0) {
+ ampOnButton.setImages(true, true, true,
+ ImageCache::getFromMemory(BinaryData::power_switch_down_png, BinaryData::power_switch_down_pngSize), 1.0, Colours::transparentWhite,
+ Image(), 1.0, Colours::transparentWhite,
+ ImageCache::getFromMemory(BinaryData::power_switch_down_png, BinaryData::power_switch_down_pngSize), 1.0, Colours::transparentWhite,
+ 0.0);
+ ampLED.setImages(true, true, true,
+ ImageCache::getFromMemory(BinaryData::led_blue_off_png, BinaryData::led_blue_off_pngSize), 1.0, Colours::transparentWhite,
+ Image(), 1.0, Colours::transparentWhite,
+ ImageCache::getFromMemory(BinaryData::led_blue_off_png, BinaryData::led_blue_off_pngSize), 1.0, Colours::transparentWhite,
+ 0.0);
+ }
+ else {
+ ampOnButton.setImages(true, true, true,
+ ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
+ Image(), 1.0, Colours::transparentWhite,
+ ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
+ 0.0);
+ ampLED.setImages(true, true, true,
+ ImageCache::getFromMemory(BinaryData::led_blue_on_png, BinaryData::led_blue_on_pngSize), 1.0, Colours::transparentWhite,
+ Image(), 1.0, Colours::transparentWhite,
+ ImageCache::getFromMemory(BinaryData::led_blue_on_png, BinaryData::led_blue_on_pngSize), 1.0, Colours::transparentWhite,
+ 0.0);
+ }
+ // Set clean/lead switch graphic
+ if (processor.amp_lead == 0) {
+ ampCleanLeadButton.setImages(true, true, true,
+ ImageCache::getFromMemory(BinaryData::power_switch_down_png, BinaryData::power_switch_down_pngSize), 1.0, Colours::transparentWhite,
+ Image(), 1.0, Colours::transparentWhite,
+ ImageCache::getFromMemory(BinaryData::power_switch_down_png, BinaryData::power_switch_down_pngSize), 1.0, Colours::transparentWhite,
+ 0.0);
+ }
+ else {
+ ampCleanLeadButton.setImages(true, true, true,
+ ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
+ Image(), 1.0, Colours::transparentWhite,
+ ImageCache::getFromMemory(BinaryData::power_switch_up_png, BinaryData::power_switch_up_pngSize), 1.0, Colours::transparentWhite,
+ 0.0);
+ }
+}
diff --git a/src/PluginEditor.h b/src/PluginEditor.h
@@ -0,0 +1,88 @@
+/*
+ ==============================================================================
+
+ This file was auto-generated!
+
+ It contains the basic framework code for a JUCE plugin editor.
+
+ ==============================================================================
+*/
+
+#pragma once
+
+#include "../JuceLibraryCode/JuceHeader.h"
+#include "PluginProcessor.h"
+#include "myLookAndFeel.h"
+
+//==============================================================================
+/**
+*/
+class WaveNetVaAudioProcessorEditor : public AudioProcessorEditor,
+ private Button::Listener,
+ private Slider::Listener
+
+{
+public:
+ WaveNetVaAudioProcessorEditor (WaveNetVaAudioProcessor&);
+ ~WaveNetVaAudioProcessorEditor();
+
+ //==============================================================================
+ void paint (Graphics&) override;
+ void resized() override;
+
+
+
+private:
+ // This reference is provided as a quick way for your editor to
+ // access the processor object that created it.
+ WaveNetVaAudioProcessor& processor;
+
+ // Amp Widgets
+ Slider ampPresenceKnob;
+ Slider ampCleanBassKnob;
+ Slider ampCleanMidKnob;
+ Slider ampCleanTrebleKnob;
+ Slider ampCleanGainKnob;
+ Slider ampLeadBassKnob;
+ Slider ampLeadMidKnob;
+ Slider ampLeadTrebleKnob;
+ Slider ampLeadGainKnob;
+ Slider ampMasterKnob;
+ ImageButton ampOnButton;
+ ImageButton ampCleanLeadButton;
+ ImageButton ampLED;
+
+
+ // LookandFeels
+ myLookAndFeel ampSilverKnobLAF;
+
+ //Image background;
+ Image background_clean = ImageCache::getFromMemory(BinaryData::amp_clean_jpg, BinaryData::amp_clean_jpgSize);
+ Image background_lead = ImageCache::getFromMemory(BinaryData::amp_lead_jpg, BinaryData::amp_lead_jpgSize);
+ Image background_off = ImageCache::getFromMemory(BinaryData::amp_off_jpg, BinaryData::amp_off_jpgSize);
+ int current_background = 1;
+
+ TextButton loadButton;
+ Label modelLabel;
+ juce::String fname;
+ virtual void buttonClicked(Button* button) override;
+ //void loadButtonClicked();
+ virtual void sliderValueChanged(Slider* slider) override;
+ void ampOnButtonClicked();
+ void ampCleanLeadButtonClicked();
+ void resetImages();
+
+public:
+ std::unique_ptr <AudioProcessorValueTreeState::SliderAttachment> cleanGainSliderAttach;
+ std::unique_ptr <AudioProcessorValueTreeState::SliderAttachment> cleanBassSliderAttach;
+ std::unique_ptr <AudioProcessorValueTreeState::SliderAttachment> cleanMidSliderAttach;
+ std::unique_ptr <AudioProcessorValueTreeState::SliderAttachment> cleanTrebleSliderAttach;
+ std::unique_ptr <AudioProcessorValueTreeState::SliderAttachment> leadGainSliderAttach;
+ std::unique_ptr <AudioProcessorValueTreeState::SliderAttachment> leadBassSliderAttach;
+ std::unique_ptr <AudioProcessorValueTreeState::SliderAttachment> leadMidSliderAttach;
+ std::unique_ptr <AudioProcessorValueTreeState::SliderAttachment> leadTrebleSliderAttach;
+ std::unique_ptr <AudioProcessorValueTreeState::SliderAttachment> presenceSliderAttach;
+ std::unique_ptr <AudioProcessorValueTreeState::SliderAttachment> masterSliderAttach;
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(WaveNetVaAudioProcessorEditor)
+};
diff --git a/src/PluginProcessor.cpp b/src/PluginProcessor.cpp
@@ -0,0 +1,318 @@
+/*
+ ==============================================================================
+
+ This file was auto-generated!
+
+ It contains the basic framework code for a JUCE plugin processor.
+
+ ==============================================================================
+*/
+
+#include "PluginProcessor.h"
+#include "PluginEditor.h"
+
+//==============================================================================
+WaveNetVaAudioProcessor::WaveNetVaAudioProcessor()
+#ifndef JucePlugin_PreferredChannelConfigurations
+ : AudioProcessor(BusesProperties()
+#if ! JucePlugin_IsMidiEffect
+#if ! JucePlugin_IsSynth
+ .withInput("Input", AudioChannelSet::stereo(), true)
+#endif
+ .withOutput("Output", AudioChannelSet::stereo(), true)
+#endif
+ ),
+ waveNet(1, 1, 1, 1, "linear", { 1 }),
+ treeState(*this, nullptr, "PARAMETER", { std::make_unique<AudioParameterFloat>(CLEAN_GAIN_ID, CLEAN_GAIN_NAME, NormalisableRange<float>(0.0f, 1.0f, 0.01f), 0.5f),
+ std::make_unique<AudioParameterFloat>(CLEAN_BASS_ID, CLEAN_BASS_NAME, NormalisableRange<float>(-8.0f, 8.0f, 0.01f), 0.0f),
+ std::make_unique<AudioParameterFloat>(CLEAN_MID_ID, CLEAN_MID_NAME, NormalisableRange<float>(-8.0f, 8.0f, 0.01f), 0.0f),
+ std::make_unique<AudioParameterFloat>(CLEAN_TREBLE_ID, CLEAN_TREBLE_NAME, NormalisableRange<float>(-8.0f, 8.0f, 0.01f), 0.0f),
+
+ std::make_unique<AudioParameterFloat>(LEAD_GAIN_ID, LEAD_GAIN_NAME, NormalisableRange<float>(-10.0f, 10.0f, 0.01f), 0.0f),
+ std::make_unique<AudioParameterFloat>(LEAD_BASS_ID, LEAD_BASS_NAME, NormalisableRange<float>(-8.0f, 8.0f, 0.01f), 0.0f),
+ std::make_unique<AudioParameterFloat>(LEAD_MID_ID, LEAD_MID_NAME, NormalisableRange<float>(-8.0f, 8.0f, 0.01f), 0.0f),
+ std::make_unique<AudioParameterFloat>(LEAD_TREBLE_ID, LEAD_TREBLE_NAME, NormalisableRange<float>(-8.0f, 8.0f, 0.01f), 0.0f),
+
+ std::make_unique<AudioParameterFloat>(PRESENCE_ID, PRESENCE_NAME, NormalisableRange<float>(-8.0f, 8.0f, 0.01f), 0.0f),
+ std::make_unique<AudioParameterFloat>(MASTER_ID, MASTER_NAME, NormalisableRange<float>(0.0f, 1.0f, 0.01f), 0.5f) })
+
+#endif
+{
+ cleanBassParam = treeState.getRawParameterValue (CLEAN_BASS_ID);
+ cleanMidParam = treeState.getRawParameterValue (CLEAN_MID_ID);
+ cleanTrebleParam = treeState.getRawParameterValue (CLEAN_TREBLE_ID);
+ cleanGainParam = treeState.getRawParameterValue (CLEAN_GAIN_ID);
+ leadGainParam = treeState.getRawParameterValue (LEAD_GAIN_ID);
+ leadBassParam = treeState.getRawParameterValue (LEAD_BASS_ID);
+ leadMidParam = treeState.getRawParameterValue (LEAD_MID_ID);
+ leadTrebleParam = treeState.getRawParameterValue (LEAD_TREBLE_ID);
+ presenceParam = treeState.getRawParameterValue (PRESENCE_ID);
+ masterParam = treeState.getRawParameterValue (MASTER_ID);
+}
+
+WaveNetVaAudioProcessor::~WaveNetVaAudioProcessor()
+{
+}
+
+//==============================================================================
+const String WaveNetVaAudioProcessor::getName() const
+{
+ return JucePlugin_Name;
+}
+
+bool WaveNetVaAudioProcessor::acceptsMidi() const
+{
+ #if JucePlugin_WantsMidiInput
+ return true;
+ #else
+ return false;
+ #endif
+}
+
+bool WaveNetVaAudioProcessor::producesMidi() const
+{
+ #if JucePlugin_ProducesMidiOutput
+ return true;
+ #else
+ return false;
+ #endif
+}
+
+bool WaveNetVaAudioProcessor::isMidiEffect() const
+{
+ #if JucePlugin_IsMidiEffect
+ return true;
+ #else
+ return false;
+ #endif
+}
+
+double WaveNetVaAudioProcessor::getTailLengthSeconds() const
+{
+ return 0.0;
+}
+
+int WaveNetVaAudioProcessor::getNumPrograms()
+{
+ return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs,
+ // so this should be at least 1, even if you're not really implementing programs.
+}
+
+int WaveNetVaAudioProcessor::getCurrentProgram()
+{
+ return 0;
+}
+
+void WaveNetVaAudioProcessor::setCurrentProgram (int index)
+{
+}
+
+const String WaveNetVaAudioProcessor::getProgramName (int index)
+{
+ return {};
+}
+
+void WaveNetVaAudioProcessor::changeProgramName (int index, const String& newName)
+{
+}
+
+//==============================================================================
+void WaveNetVaAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock)
+{
+ // Use this method as the place to do any pre-playback
+ // initialisation that you need..
+ waveNet.prepareToPlay(samplesPerBlock);
+}
+
+void WaveNetVaAudioProcessor::releaseResources()
+{
+ // When playback stops, you can use this as an opportunity to free up any
+ // spare memory, etc.
+}
+
+#ifndef JucePlugin_PreferredChannelConfigurations
+bool WaveNetVaAudioProcessor::isBusesLayoutSupported (const BusesLayout& layouts) const
+{
+ #if JucePlugin_IsMidiEffect
+ ignoreUnused (layouts);
+ return true;
+ #else
+ // This is the place where you check if the layout is supported.
+ // In this template code we only support mono or stereo.
+ if (layouts.getMainOutputChannelSet() != AudioChannelSet::mono()
+ && layouts.getMainOutputChannelSet() != AudioChannelSet::stereo())
+ return false;
+
+ // This checks if the input layout matches the output layout
+ #if ! JucePlugin_IsSynth
+ if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet())
+ return false;
+ #endif
+
+ return true;
+ #endif
+}
+#endif
+
+void WaveNetVaAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer& midiMessages)
+{
+ ScopedNoDenormals noDenormals;
+
+ // Setup Audio Data
+ const int numSamples = buffer.getNumSamples();
+ const int numInputChannels = getTotalNumInputChannels();
+
+
+ // Amp =============================================================================
+ if (amp_state == 1) {
+
+ if (amp_lead == 1) {// if clean channel eq/gain
+ buffer.applyGain(ampCleanDrive);
+ }
+ else {// else lead channel eq/gain
+ buffer.applyGain(ampLeadDrive);
+ }
+
+ // Wavenet, load json for waveNet2 based on lead/clean switch
+ waveNet.process(buffer.getArrayOfReadPointers(), buffer.getArrayOfWritePointers(), buffer.getNumSamples());
+
+ eq4band.process(buffer, midiMessages, numSamples, numInputChannels);
+
+ // Master Volume
+ buffer.applyGain(ampMaster);
+
+ // Apply levelAdjust from model param (for adjusting quiet or loud models)
+ //if ( waveNet.levelAdjust != 0.0 ) {
+ // buffer.applyGain(waveNet.levelAdjust);
+ //}
+
+ }
+
+ for (int ch = 1; ch < buffer.getNumChannels(); ++ch)
+ buffer.copyFrom(ch, 0, buffer, 0, 0, buffer.getNumSamples());
+}
+
+//==============================================================================
+bool WaveNetVaAudioProcessor::hasEditor() const
+{
+ return true; // (change this to false if you choose to not supply an editor)
+}
+
+AudioProcessorEditor* WaveNetVaAudioProcessor::createEditor()
+{
+ return new WaveNetVaAudioProcessorEditor (*this);
+}
+
+//==============================================================================
+void WaveNetVaAudioProcessor::getStateInformation (MemoryBlock& destData)
+{
+ // You should use this method to store your parameters in the memory block.
+ // You could do that either as raw data, or use the XML or ValueTree classes
+ // as intermediaries to make it easy to save and load complex data.
+ auto state = treeState.copyState();
+ std::unique_ptr<XmlElement> xml (state.createXml());
+ xml->setAttribute ("amp_state", amp_state);
+ xml->setAttribute ("amp_lead", amp_lead);
+ copyXmlToBinary (*xml, destData);
+}
+
+void WaveNetVaAudioProcessor::setStateInformation (const void* data, int sizeInBytes)
+{
+ // You should use this method to restore your parameters from this memory block,
+ // whose contents will have been created by the getStateInformation() call.
+
+ std::unique_ptr<juce::XmlElement> xmlState (getXmlFromBinary (data, sizeInBytes));
+
+ if (xmlState.get() != nullptr)
+ {
+ if (xmlState->hasTagName (treeState.state.getType()))
+ {
+ treeState.replaceState (juce::ValueTree::fromXml (*xmlState));
+ amp_state = xmlState->getBoolAttribute ("amp_state");
+ amp_lead = xmlState->getBoolAttribute ("amp_lead");
+ if (auto* editor = dynamic_cast<WaveNetVaAudioProcessorEditor*> (getActiveEditor()))
+ editor->resetImages();
+ }
+ }
+}
+
+
+void WaveNetVaAudioProcessor::loadConfigAmp()
+{
+ // Load Second Wavenet
+ this->suspendProcessing(true);
+
+ if (amp_lead == 0) { // if lead on
+ WaveNetLoader loader2(BinaryData::bluej_fullD_p0153_json);
+ float levelAdjust = loader2.levelAdjust;
+ int numChannels2 = loader2.numChannels;
+ int inputChannels2 = loader2.inputChannels;
+ int outputChannels2 = loader2.outputChannels;
+ int filterWidth2 = loader2.filterWidth;
+ std::vector<int> dilations2 = loader2.dilations;
+ std::string activation2 = loader2.activation;
+ waveNet.setParams(inputChannels2, outputChannels2, numChannels2, filterWidth2, activation2,
+ dilations2, levelAdjust);
+ loader2.loadVariables(waveNet);
+ } else { // else if clean on
+ WaveNetLoader loader2(BinaryData::bluej_clean_p0088_json);
+ float levelAdjust = loader2.levelAdjust;
+ int numChannels2 = loader2.numChannels;
+ int inputChannels2 = loader2.inputChannels;
+ int outputChannels2 = loader2.outputChannels;
+ int filterWidth2 = loader2.filterWidth;
+ std::vector<int> dilations2 = loader2.dilations;
+ std::string activation2 = loader2.activation;
+ waveNet.setParams(inputChannels2, outputChannels2, numChannels2, filterWidth2, activation2,
+ dilations2, levelAdjust);
+ loader2.loadVariables(waveNet);
+ }
+
+ this->suspendProcessing(false);
+}
+
+/*
+float WaveNetVaAudioProcessor::convertLogScale(float in_value, float x_min, float x_max, float y_min, float y_max)
+{
+ float b = log(y_max / y_min) / (x_max - x_min);
+ float a = y_max / exp(b * x_max);
+ float converted_value = a * exp(b * in_value);
+ return converted_value;
+}
+
+void WaveNetVaAudioProcessor::set_ampCleanDrive(float db_ampCleanDrive)
+{
+ ampCleanDrive = decibelToLinear(db_ampCleanDrive);
+ ampCleanGainKnobState = db_ampCleanDrive;
+}
+
+void WaveNetVaAudioProcessor::set_ampLeadDrive(float db_ampLeadDrive)
+{
+ ampLeadDrive = decibelToLinear(db_ampLeadDrive);
+ ampLeadGainKnobState = db_ampLeadDrive;
+}
+
+void WaveNetVaAudioProcessor::set_ampMaster(float db_ampMaster)
+{
+ ampMaster = decibelToLinear(db_ampMaster);
+ ampMasterKnobState = db_ampMaster;
+}
+*/
+void WaveNetVaAudioProcessor::set_ampEQ(float bass_slider, float mid_slider, float treble_slider, float presence_slider)
+{
+ eq4band.setParameters(bass_slider, mid_slider, treble_slider, presence_slider);
+
+ ampPresenceKnobState = presence_slider;
+}
+
+//float WaveNetVaAudioProcessor::decibelToLinear(float dbValue)
+//{
+// return powf(10.0, dbValue/20.0);
+//}
+
+//==============================================================================
+// This creates new instances of the plugin..
+AudioProcessor* JUCE_CALLTYPE createPluginFilter()
+{
+ return new WaveNetVaAudioProcessor();
+}
diff --git a/src/PluginProcessor.h b/src/PluginProcessor.h
@@ -0,0 +1,150 @@
+/*
+ ==============================================================================
+
+ This file was auto-generated!
+
+ It contains the basic framework code for a JUCE plugin processor.
+
+ ==============================================================================
+*/
+
+#pragma once
+
+#include "../JuceLibraryCode/JuceHeader.h"
+#include "WaveNet.h"
+#include "WaveNetLoader.h"
+#include "Eq4Band.h"
+
+#define CLEAN_GAIN_ID "cleangain"
+#define CLEAN_GAIN_NAME "CleanGain"
+#define CLEAN_BASS_ID "cleanbass"
+#define CLEAN_BASS_NAME "CleanBass"
+#define CLEAN_MID_ID "cleanmid"
+#define CLEAN_MID_NAME "CleanMid"
+#define CLEAN_TREBLE_ID "cleantreble"
+#define CLEAN_TREBLE_NAME "CleanTreble"
+
+#define LEAD_GAIN_ID "leadgain"
+#define LEAD_GAIN_NAME "LeadGain"
+#define LEAD_BASS_ID "leadbass"
+#define LEAD_BASS_NAME "LeadBass"
+#define LEAD_MID_ID "leadmid"
+#define LEAD_MID_NAME "LeadMid"
+#define LEAD_TREBLE_ID "leadtreble"
+#define LEAD_TREBLE_NAME "LeadTreble"
+
+#define PRESENCE_ID "presence"
+#define PRESENCE_NAME "Presence"
+#define MASTER_ID "master"
+#define MASTER_NAME "Master"
+
+
+
+//==============================================================================
+/**
+*/
+class WaveNetVaAudioProcessor : public AudioProcessor
+{
+public:
+ //==============================================================================
+ WaveNetVaAudioProcessor();
+ ~WaveNetVaAudioProcessor();
+
+ //==============================================================================
+ void prepareToPlay (double sampleRate, int samplesPerBlock) override;
+ void releaseResources() override;
+
+ #ifndef JucePlugin_PreferredChannelConfigurations
+ bool isBusesLayoutSupported (const BusesLayout& layouts) const override;
+ #endif
+
+ void processBlock (AudioBuffer<float>&, MidiBuffer&) override;
+
+ //==============================================================================
+ AudioProcessorEditor* createEditor() override;
+ bool hasEditor() const override;
+
+ //==============================================================================
+ const String getName() const override;
+
+ bool acceptsMidi() const override;
+ bool producesMidi() const override;
+ bool isMidiEffect() const override;
+ double getTailLengthSeconds() const override;
+
+ //==============================================================================
+ int getNumPrograms() override;
+ int getCurrentProgram() override;
+ void setCurrentProgram (int index) override;
+ const String getProgramName (int index) override;
+ void changeProgramName (int index, const String& newName) override;
+
+ //==============================================================================
+ void getStateInformation (MemoryBlock& destData) override;
+ void setStateInformation (const void* data, int sizeInBytes) override;
+
+ void loadConfigAmp();
+ //void loadConfig(File configFile);
+
+ // Overdrive Pedal
+ //float convertLogScale(float in_value, float x_min, float x_max, float y_min, float y_max);
+
+ // Amp
+ //void set_ampCleanDrive(float db_ampCleanDrive);
+ //void set_ampLeadDrive(float db_ampLeadDrive);
+ //void set_ampMaster(float db_ampMaster);
+ void set_ampEQ(float bass_slider, float mid_slider, float treble_slider, float presence_slider);
+
+ //float decibelToLinear(float dbValue);
+
+ // Pedal/amp states
+ int amp_state = 1; // 0 = off, 1 = on
+ int amp_lead = 1; // 1 = clean, 0 = lead
+ int custom_tone = 0; // 0 = custom tone loaded, 1 = default channel tone
+ File loaded_tone;
+ juce::String loaded_tone_name;
+
+ AudioProcessorValueTreeState treeState;
+
+ // Amp knob states
+ //float ampPresenceKnobState = 0.0;
+ //float ampCleanBassKnobState = 0.0;
+ //float ampCleanMidKnobState = 0.0;
+ //float ampCleanTrebleKnobState = 0.0;
+ //float ampCleanGainKnobState = 10.0;
+ //float ampLeadBassKnobState = 0.0;
+ //float ampLeadMidKnobState = 0.0;
+ //float ampLeadTrebleKnobState = 0.0;
+ //float ampLeadGainKnobState = 10.0;
+ //float ampMasterKnobState = -12.0;
+
+private:
+ WaveNet waveNet; // Amp Clean Channel / Lead Channel
+ Eq4Band eq4band; // Amp EQ
+
+ std::atomic<float>* presenceParam = nullptr;
+ std::atomic<float>* cleanBassParam = nullptr;
+ std::atomic<float>* cleanMidParam = nullptr;
+ std::atomic<float>* cleanTrebleParam = nullptr;
+ std::atomic<float>* cleanGainParam = nullptr;
+ std::atomic<float>* leadGainParam = nullptr;
+ std::atomic<float>* leadBassParam = nullptr;
+ std::atomic<float>* leadMidParam = nullptr;
+ std::atomic<float>* leadTrebleParam = nullptr;
+ std::atomic<float>* masterParam = nullptr;
+
+
+ float previousGainValue = 0.5;
+ float previousMasterValue = 0.5;
+
+
+ // Amp
+ //float ampCleanDrive = 1.0;
+ //float ampLeadDrive = 1.0;
+ //float ampMaster = 1.0;
+
+ var dummyVar;
+
+ //==============================================================================
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WaveNetVaAudioProcessor)
+};
diff --git a/plugins/SmartAmp/Source/WaveNet.cpp b/src/WaveNet.cpp
diff --git a/plugins/SmartAmp/Source/WaveNet.h b/src/WaveNet.h
diff --git a/plugins/SmartAmp/Source/WaveNetLoader.cpp b/src/WaveNetLoader.cpp
diff --git a/plugins/SmartAmp/Source/WaveNetLoader.h b/src/WaveNetLoader.h
diff --git a/plugins/SmartAmp/Source/myLookAndFeel.cpp b/src/myLookAndFeel.cpp
diff --git a/plugins/SmartAmp/Source/myLookAndFeel.h b/src/myLookAndFeel.h
diff --git a/validate.sh b/validate.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+
+# install functions
+install_pluginval_linux()
+{
+ curl -L "https://github.com/Tracktion/pluginval/releases/download/latest_release/pluginval_Linux.zip" -o pluginval.zip
+ unzip pluginval > /dev/null
+ echo "./pluginval"
+}
+
+install_pluginval_mac()
+{
+ curl -L "https://github.com/Tracktion/pluginval/releases/download/latest_release/pluginval_macOS.zip" -o pluginval.zip
+ unzip pluginval > /dev/null
+ echo "pluginval.app/Contents/MacOS/pluginval"
+}
+
+install_pluginval_win()
+{
+ powershell -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest https://github.com/Tracktion/pluginval/releases/download/latest_release/pluginval_Windows.zip -OutFile pluginval.zip"
+ powershell -Command "Expand-Archive pluginval.zip -DestinationPath ."
+ echo "./pluginval.exe"
+}
+
+# install
+if [[ "$OSTYPE" == "linux-gnu"* ]]; then
+ pluginval=$(install_pluginval_linux)
+ plugin="Plugin/build/TS-M1N3_artefacts/Release/VST3/TS-M1N3.vst3"
+elif [[ "$OSTYPE" == "darwin"* ]]; then
+ pluginval=$(install_pluginval_mac)
+ plugin="Plugin/build/TS-M1N3_artefacts/VST3/TS-M1N3.vst3"
+else
+ pluginval=$(install_pluginval_win)
+ plugin="Plugin/build/TS-M1N3_artefacts/Release/VST3/TS-M1N3.vst3"
+fi
+
+echo "Pluginval installed at ${pluginval}"
+echo "Validating ${plugin}"
+
+n_tries=0
+result=1
+until [ "$n_tries" -ge 4 ] || [ "$result" -eq 0 ]
+do
+ $pluginval --strictness-level 8 --timeout-ms 90000 --validate-in-process --skip-gui-tests --validate $plugin
+ result=$?
+ n_tries=$((n_tries+1))
+done
+
+# clean up
+rm -Rf pluginval*
+exit $result
diff --git a/win_builds.sh b/win_builds.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+build64(){
+ #cmake -Bbuild -G"Visual Studio 15 2017 Win64"
+ cmake -Bbuild -G "Visual Studio 16 2019" -A x64
+ cmake --build build --config Release -j4
+}
+
+# exit on failure
+set -e
+
+# clean up old builds
+rm -Rf build/
+rm -Rf bin/*Win64*
+
+# set up VST and ASIO paths
+sed -i -e "9s/#//" CMakeLists.txt
+sed -i -e "10s/#//" CMakeLists.txt
+sed -i -e '16s/#//' CMakeLists.txt
+
+# cmake new builds
+build64 &
+wait
+
+# copy builds to bin
+mkdir -p bin/Win64
+declare -a plugins=("SmartAmp")
+for plugin in "${plugins[@]}"; do
+ cp -R build/${plugin}_artefacts/Release/VST3/${plugin}.vst3 bin/Win64/${plugin}.vst3
+done
+
+# reset CMakeLists.txt
+#git restore CMakeLists.txt
+
+# zip builds
+VERSION=$(cut -f 2 -d '=' <<< "$(grep 'CMAKE_PROJECT_VERSION:STATIC' build/CMakeCache.txt)")
+(
+ cd bin
+ rm -f "SmartAmp-Win64-${VERSION}.zip"
+ tar -a -c -f "SmartAmp-Win64-${VERSION}.zip" Win64
+)
+
+# create installer
+echo "Creating installer..."
+(
+ cd installers/windows
+ bash build_win_installer.sh
+)