SmartGuitarAmp

Guitar plugin made with JUCE that uses neural networks to emulate a tube amplifier
Log | Files | Refs | Submodules | README

commit 0a3ea07e0360de0c7e82a07a9649b4520d86ad5b
parent 7f90cae50e4b16c3d064ce196d95a60d38d47adc
Author: Keith <[email protected]>
Date:   Mon, 29 Aug 2022 18:16:47 -0500

Initial changes

Diffstat:
A.github/workflows/cmake.yml | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.gitmodules | 12++++++++++++
ACMakeLists.txt | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aaax_builds.sh | 115+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainstallers/linux/build_deb.sh | 39+++++++++++++++++++++++++++++++++++++++
Ainstallers/mac/Intro.txt | 1+
Ainstallers/mac/SmartPedal.pkgproj | 2573+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainstallers/mac/build_mac_installer.sh | 38++++++++++++++++++++++++++++++++++++++
Ainstallers/windows/SmartAmpl_Install_Script.iss | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainstallers/windows/build_win_installer.sh | 20++++++++++++++++++++
Amac_builds.sh | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/CMakeLists.txt | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/JUCE | 1+
Amodules/cmake/SubprojectVersion.cmake | 20++++++++++++++++++++
Amodules/cmake/WarningFlags.cmake | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/eigen | 1+
Dplugins/SmartAmp/SmartAmp.jucer | 134-------------------------------------------------------------------------------
Dplugins/SmartAmp/Source/.vscode/settings.json | 37-------------------------------------
Dplugins/SmartAmp/Source/PluginEditor.cpp | 401-------------------------------------------------------------------------------
Dplugins/SmartAmp/Source/PluginEditor.h | 76----------------------------------------------------------------------------
Dplugins/SmartAmp/Source/PluginProcessor.cpp | 297-------------------------------------------------------------------------------
Dplugins/SmartAmp/Source/PluginProcessor.h | 108-------------------------------------------------------------------------------
Aresources/logo.png | 0
Rplugins/SmartAmp/Source/Activations.cpp -> src/Activations.cpp | 0
Rplugins/SmartAmp/Source/Activations.h -> src/Activations.h | 0
Asrc/CMakeLists.txt | 24++++++++++++++++++++++++
Rplugins/SmartAmp/Source/Convolution.cpp -> src/Convolution.cpp | 0
Rplugins/SmartAmp/Source/Convolution.h -> src/Convolution.h | 0
Rplugins/SmartAmp/Source/ConvolutionLayer.cpp -> src/ConvolutionLayer.cpp | 0
Rplugins/SmartAmp/Source/ConvolutionLayer.h -> src/ConvolutionLayer.h | 0
Rplugins/SmartAmp/Source/ConvolutionStack.cpp -> src/ConvolutionStack.cpp | 0
Rplugins/SmartAmp/Source/ConvolutionStack.h -> src/ConvolutionStack.h | 0
Rplugins/SmartAmp/Source/Eq4Band.cpp -> src/Eq4Band.cpp | 0
Rplugins/SmartAmp/Source/Eq4Band.h -> src/Eq4Band.h | 0
Asrc/PluginEditor.cpp | 346+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PluginEditor.h | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PluginProcessor.cpp | 318+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PluginProcessor.h | 150+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rplugins/SmartAmp/Source/WaveNet.cpp -> src/WaveNet.cpp | 0
Rplugins/SmartAmp/Source/WaveNet.h -> src/WaveNet.h | 0
Rplugins/SmartAmp/Source/WaveNetLoader.cpp -> src/WaveNetLoader.cpp | 0
Rplugins/SmartAmp/Source/WaveNetLoader.h -> src/WaveNetLoader.h | 0
Rplugins/SmartAmp/Source/myLookAndFeel.cpp -> src/myLookAndFeel.cpp | 0
Rplugins/SmartAmp/Source/myLookAndFeel.h -> src/myLookAndFeel.h | 0
Avalidate.sh | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Awin_builds.sh | 48++++++++++++++++++++++++++++++++++++++++++++++++
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&#10;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(&ampSilverKnobLAF); - 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(&ampSilverKnobLAF); - 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(&ampSilverKnobLAF); - 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(&ampSilverKnobLAF); - 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(&ampSilverKnobLAF); - 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(&ampSilverKnobLAF); - 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(&ampSilverKnobLAF); - 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(&ampSilverKnobLAF); - 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(&ampSilverKnobLAF); - 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(&ampSilverKnobLAF); - 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 == &ampOnButton) { - ampOnButtonClicked(); - } else if (button == &ampCleanLeadButton) { - 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 == &ampCleanGainKnob) - processor.set_ampCleanDrive(slider->getValue()); - else if (slider == &ampLeadGainKnob) - processor.set_ampLeadDrive(slider->getValue()); - else if (slider == &ampMasterKnob) - processor.set_ampMaster(slider->getValue()); - else if (slider == &ampCleanBassKnob || slider == &ampCleanMidKnob || slider == &ampCleanTrebleKnob) { - 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 == &ampLeadBassKnob || slider == &ampLeadMidKnob || slider == &ampLeadTrebleKnob) { - 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 == &ampPresenceKnob) { - 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(&ampSilverKnobLAF); + 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(&ampSilverKnobLAF); + 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(&ampSilverKnobLAF); + 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(&ampSilverKnobLAF); + 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(&ampSilverKnobLAF); + 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(&ampSilverKnobLAF); + 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(&ampSilverKnobLAF); + 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(&ampSilverKnobLAF); + 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(&ampSilverKnobLAF); + 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(&ampSilverKnobLAF); + 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 == &ampOnButton) { + ampOnButtonClicked(); + } else if (button == &ampCleanLeadButton) { + 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 == &ampLeadBassKnob || slider == &ampLeadMidKnob || slider == &ampLeadTrebleKnob) { + 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 == &ampPresenceKnob) { + 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 +)