cmake_minimum_required(VERSION 3.22)
project(TeaVoxPlus VERSION 0.5.0 LANGUAGES C CXX OBJC OBJCXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING "Minimum macOS")
set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "Target architecture")
set(JUCE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../dependencies/JUCE" CACHE PATH "JUCE source")
add_subdirectory("${JUCE_ROOT}" "${CMAKE_BINARY_DIR}/JUCE" EXCLUDE_FROM_ALL)
juce_add_plugin(TeaVox
    COMPANY_NAME "Methane Co: Project Imitatio Dei"
    BUNDLE_ID "audio.teavox.plus"
    PLUGIN_MANUFACTURER_CODE TeaA
    PLUGIN_CODE Tvxp
    FORMATS VST3 AU Standalone
    PRODUCT_NAME "TeaVox+"
    DESCRIPTION "Methane Co: Project Imitatio Dei - TeaVox+ vocal chain"
    IS_SYNTH FALSE
    NEEDS_MIDI_INPUT TRUE
    NEEDS_MIDI_OUTPUT FALSE
    EDITOR_WANTS_KEYBOARD_FOCUS FALSE
    MICROPHONE_PERMISSION_ENABLED TRUE
    MICROPHONE_PERMISSION_TEXT "Methane Co: Project Imitatio Dei uses your microphone for live vocals and note recording."
    COPY_PLUGIN_AFTER_BUILD FALSE
    VST3_CATEGORIES Fx Dynamics Distortion PitchShift
    AU_MAIN_TYPE kAudioUnitType_MusicEffect)
target_sources(TeaVox PRIVATE
    Source/PluginProcessor.cpp Source/PluginEditor.cpp
    Source/PitchEngine.cpp Source/TeaDSP.cpp Source/TeaEffects.cpp Source/TeaEQ.cpp Source/MidiController.cpp
    ../TeaGate/Source/GateEngine.cpp ../TeaMIDI/Source/MidiEngine.cpp)
target_include_directories(TeaVox PUBLIC Source)
set_target_properties(TeaVox PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN YES)
target_compile_definitions(TeaVox PUBLIC
    JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0 JUCE_VST3_CAN_REPLACE_VST2=0
    JUCE_PLUGINHOST_VST3=1 JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS=0)
target_link_libraries(TeaVox PRIVATE juce::juce_audio_utils juce::juce_dsp
    PUBLIC juce::juce_recommended_config_flags juce::juce_recommended_warning_flags)
juce_add_console_app(TeaVoxTests PRODUCT_NAME "TeaVoxTests")
target_sources(TeaVoxTests PRIVATE Tests/PluginTests.cpp)
if(APPLE)
    target_link_options(TeaVoxTests PRIVATE "-Wl,-exported_symbol,_main")
endif()
target_link_libraries(TeaVoxTests PRIVATE TeaVox)
target_include_directories(TeaVoxTests PRIVATE "${JUCE_ROOT}/modules")
target_compile_definitions(TeaVoxTests PRIVATE JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1)
juce_add_console_app(TeaVoxNativeHost PRODUCT_NAME "TeaVoxNativeHost")
target_sources(TeaVoxNativeHost PRIVATE Tests/NativeHost.cpp)
if(APPLE)
    target_link_options(TeaVoxNativeHost PRIVATE "-Wl,-exported_symbol,_main")
endif()
target_link_libraries(TeaVoxNativeHost PRIVATE TeaVox)
target_include_directories(TeaVoxNativeHost PRIVATE "${JUCE_ROOT}/modules")
target_compile_definitions(TeaVoxNativeHost PRIVATE JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1)
add_executable(PitchTests Tests/PitchTests.cpp Source/PitchEngine.cpp)
target_include_directories(PitchTests PRIVATE Source)
add_executable(DynamicsTests Tests/DynamicsTests.cpp Source/TeaDSP.cpp)
target_include_directories(DynamicsTests PRIVATE Source)
add_executable(EffectsTests Tests/EffectsTests.cpp Source/TeaEffects.cpp)
target_include_directories(EffectsTests PRIVATE Source)
add_executable(EQTests Tests/EQTests.cpp Source/TeaEQ.cpp)
target_include_directories(EQTests PRIVATE Source)
enable_testing()
add_test(NAME pitch COMMAND PitchTests)
add_test(NAME dynamics COMMAND DynamicsTests)
add_test(NAME processor COMMAND TeaVoxTests)
add_test(NAME effects COMMAND EffectsTests)
add_test(NAME eq COMMAND EQTests)
set_tests_properties(pitch dynamics processor effects eq PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")

add_executable(GateTests ../TeaGate/Tests/GateTests.cpp ../TeaGate/Source/GateEngine.cpp)
target_include_directories(GateTests PRIVATE ../TeaGate/Source)
add_executable(MidiTests ../TeaMIDI/Tests/MidiTests.cpp ../TeaMIDI/Source/MidiEngine.cpp Source/PitchEngine.cpp)
target_include_directories(MidiTests PRIVATE ../TeaMIDI/Source Source)
juce_add_console_app(MidiControllerTests PRODUCT_NAME "MidiControllerTests")
target_sources(MidiControllerTests PRIVATE Tests/MidiControllerTests.cpp)
target_link_libraries(MidiControllerTests PRIVATE TeaVox)
target_include_directories(MidiControllerTests PRIVATE "${JUCE_ROOT}/modules")
target_compile_definitions(MidiControllerTests PRIVATE JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1)
add_test(NAME gate COMMAND GateTests)
add_test(NAME midi COMMAND MidiTests)
add_test(NAME midi_controller COMMAND MidiControllerTests)
set_tests_properties(gate midi midi_controller PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")

# TeaMIDI is a separate voice-to-notes recorder with its own plugin identity.
juce_add_plugin(TeaMIDIPlugin
    VERSION 0.2.0
    COMPANY_NAME "Methane Co: Project Imitatio Dei"
    BUNDLE_ID "audio.teavox.teamidi"
    PLUGIN_MANUFACTURER_CODE TeaA
    PLUGIN_CODE Tmid
    FORMATS VST3 AU Standalone
    PRODUCT_NAME "TeaMIDI"
    DESCRIPTION "Methane Co: Project Imitatio Dei - TeaMIDI voice-to-MIDI recorder"
    IS_SYNTH FALSE
    NEEDS_MIDI_INPUT FALSE
    NEEDS_MIDI_OUTPUT TRUE
    EDITOR_WANTS_KEYBOARD_FOCUS FALSE
    MICROPHONE_PERMISSION_ENABLED TRUE
    MICROPHONE_PERMISSION_TEXT "Methane Co: Project Imitatio Dei uses your microphone for live vocals and note recording."
    COPY_PLUGIN_AFTER_BUILD FALSE
    VST3_CATEGORIES Fx PitchShift
    AU_MAIN_TYPE kAudioUnitType_MusicEffect)
target_sources(TeaMIDIPlugin PRIVATE
    ../TeaMIDI/Source/TeaMIDIProcessor.cpp
    ../TeaMIDI/Source/TeaMIDIEditor.cpp
    ../TeaMIDI/Source/MidiEngine.cpp Source/PitchEngine.cpp)
target_include_directories(TeaMIDIPlugin PUBLIC ../TeaMIDI/Source)
set_target_properties(TeaMIDIPlugin PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN YES)
target_compile_definitions(TeaMIDIPlugin PUBLIC
    JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0 JUCE_VST3_CAN_REPLACE_VST2=0
    JUCE_PLUGINHOST_VST3=1 JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS=0)
target_link_libraries(TeaMIDIPlugin PRIVATE juce::juce_audio_utils juce::juce_dsp
    PUBLIC juce::juce_recommended_config_flags juce::juce_recommended_warning_flags)
juce_add_console_app(TeaMIDIRecordingTests PRODUCT_NAME "TeaMIDIRecordingTests")
target_sources(TeaMIDIRecordingTests PRIVATE ../TeaMIDI/Tests/RecordingTests.cpp)
target_link_libraries(TeaMIDIRecordingTests PRIVATE TeaMIDIPlugin)
target_include_directories(TeaMIDIRecordingTests PRIVATE "${JUCE_ROOT}/modules")
target_compile_definitions(TeaMIDIRecordingTests PRIVATE JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1)
if(APPLE)
    target_link_options(TeaMIDIRecordingTests PRIVATE "-Wl,-exported_symbol,_main")
endif()
add_test(NAME midi_recording COMMAND TeaMIDIRecordingTests)
set_tests_properties(midi_recording PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../TeaMIDI")

juce_add_console_app(TeaMIDIWorkflowTests PRODUCT_NAME "TeaMIDIWorkflowTests")
target_sources(TeaMIDIWorkflowTests PRIVATE ../TeaMIDI/Tests/WorkflowTests.cpp)
target_link_libraries(TeaMIDIWorkflowTests PRIVATE TeaMIDIPlugin)
target_include_directories(TeaMIDIWorkflowTests PRIVATE "${JUCE_ROOT}/modules")
target_compile_definitions(TeaMIDIWorkflowTests PRIVATE JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1)
if(APPLE)
    target_link_options(TeaMIDIWorkflowTests PRIVATE "-Wl,-exported_symbol,_main")
endif()
add_test(NAME midi_workflow COMMAND TeaMIDIWorkflowTests)
set_tests_properties(midi_workflow PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../TeaMIDI")

add_executable(MidiStabilityTests ../TeaMIDI/Tests/StabilityTests.cpp ../TeaMIDI/Source/MidiEngine.cpp Source/PitchEngine.cpp)
target_include_directories(MidiStabilityTests PRIVATE ../TeaMIDI/Source Source)
add_test(NAME midi_stability COMMAND MidiStabilityTests)
set_tests_properties(midi_stability PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../TeaMIDI")
