diff --git a/CMakeLists.txt b/CMakeLists.txt index dfbfbba..472a8aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,14 +13,14 @@ if (WIN32) # windows 11 x86_64 set_target_properties(RtAudio::rtaudio PROPERTIES IMPORTED_LOCATION "${RtAudio_ROOT}/bin/rtaudio.dll" IMPORTED_IMPLIB "${RtAudio_ROOT}/lib/rtaudio.lib" - INTERFACE_INCLUDE_DIRECTORIES "${RtAudio_ROOT}/include/rtaudio" + INTERFACE_INCLUDE_DIRECTORIES "${RtAudio_ROOT}/include" ) add_library(RtMidi::rtmidi SHARED IMPORTED) set_target_properties(RtMidi::rtmidi PROPERTIES IMPORTED_LOCATION "${RtMidi_ROOT}/bin/rtmidi.dll" IMPORTED_IMPLIB "${RtMidi_ROOT}/lib/rtmidi.lib" - INTERFACE_INCLUDE_DIRECTORIES "${RtMidi_ROOT}/include/rtmidi" + INTERFACE_INCLUDE_DIRECTORIES "${RtMidi_ROOT}/include" ) add_library(yaml-cpp SHARED IMPORTED) @@ -31,14 +31,13 @@ if (WIN32) # windows 11 x86_64 ) else() # debian 12 x86_64 - #find_package(PkgConfig REQUIRED) - #pkg_check_modules(RTAUDIO REQUIRED rtaudio) - #pkg_check_modules(RTMIDI REQUIRED rtmidi) - #pkg_check_modules(YAMLCPP REQUIRED yaml-cpp) - find_package(rtaudio) - find_package(rtmidi) - find_package(yaml-cpp) + find_package(RtAudio REQUIRED) + find_package(RtMidi REQUIRED) + find_package(yaml-cpp REQUIRED) + + get_target_property(RTMIDI_INCLUDES RtMidi::rtmidi INTERFACE_INCLUDE_DIRECTORIES) + message(STATUS "RtMidi includes: ${RTMIDI_INCLUDES}") endif() @@ -95,20 +94,17 @@ target_include_directories(metabolus PRIVATE ${CMAKE_SOURCE_DIR}/src/ui/widgets ) +# some extra cross platform business if (WIN32) - target_compile_options(metabolus PUBLIC "/Zc:__cplusplus") - - target_link_libraries(metabolus - PRIVATE - RtAudio::rtaudio - RtMidi::rtmidi - yaml-cpp - Qt6::Widgets - ) - -else() - target_include_directories(metabolus PRIVATE ${RTAUDIO_INCLUDE_DIRS} ${RTMIDI_INCLUDE_DIRS} ${YAMLCPP_INCLUDE_DIRS}) - target_link_libraries(metabolus PRIVATE Qt6::Widgets ${RTAUDIO_LIBRARIES} ${RTMIDI_LIBRARIES} ${YAMLCPP_LIBARIES}) +else() target_compile_options(metabolus PRIVATE ${RTAUDIO_CFLAGS_OTHER}) endif() + +target_link_libraries(metabolus + PRIVATE + RtAudio::rtaudio + RtMidi::rtmidi + yaml-cpp + Qt6::Widgets +) diff --git a/scripts/build.sh b/scripts/build.sh index f9cb0f1..2df08c2 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -1,4 +1,16 @@ -cmake -S . -B build -G Ninja \ - -DCMAKE_PREFIX_PATH=build/lib +PROJECT_ROOT=${PWD} +BUILD_DIR=${PROJECT_ROOT}/build +LIB_ROOT=${BUILD_DIR}/lib + +# libraries +RTAUDIO_ROOT=${LIB_ROOT}/rtaudio +RTMIDI_ROOT=${LIB_ROOT}/rtmidi +YAMLCPP_ROOT=${LIB_ROOT}/yaml-cpp + +cmake -S . -B ${BUILD_DIR} -G Ninja \ + -DRtAudio_DIR="${RTAUDIO_ROOT}/share/rtaudio" \ + -DRtMidi_DIR="${RTMIDI_ROOT}/share/rtmidi" \ + -Dyaml-cpp_DIR="${YAMLCPP_ROOT}/lib/cmake/yaml-cpp" + cmake --build build diff --git a/scripts/install_dependencies.sh b/scripts/install_dependencies.sh index c4dd991..e4b99c2 100755 --- a/scripts/install_dependencies.sh +++ b/scripts/install_dependencies.sh @@ -23,6 +23,7 @@ mkdir ${BUILD_LIB_DIR}/rtmidi -p cd ${PROJECT_ROOT}/lib/rtmidi cmake -S . -B build -G Ninja \ -DRTMIDI_BUILD_SHARED_LIBS=ON \ + -DRTMIDI_API_ALSA=ON \ -DCMAKE_BUILD_TYPE=Release cmake --build build cmake --install build --prefix ${BUILD_LIB_DIR}/rtmidi diff --git a/src/MidiController.cpp b/src/MidiController.cpp index e2aee4e..9cccfcd 100644 --- a/src/MidiController.cpp +++ b/src/MidiController.cpp @@ -6,7 +6,7 @@ MidiController::MidiController(NoteQueue& queue) : noteQueue_(queue) { try { - midiIn_ = std::make_unique(); + midiIn_ = std::make_unique(RtMidi::LINUX_ALSA); midiIn_->ignoreTypes(false, false, false); } catch (RtMidiError& e) { std::cout << "RtMidi init failed: " << e.getMessage() << std::endl; @@ -18,14 +18,23 @@ MidiController::~MidiController() { close(); } -// this dont work too well but whatever +// open the first for thats successful bool MidiController::openDefaultPort() { if (!midiIn_) return false; if (midiIn_->getPortCount() == 0) { std::cout << "No MIDI input ports available" << std::endl; return false; } - return openPort(0); + + uint32_t portCount = midiIn_->getPortCount(); + std::cout << "Available MidiIn ports: " << portCount << std::endl; + for (int i = 0; i < portCount; i++) { + std::cout << "#" << i << " : " << midiIn_->getPortName(i) << std::endl; + + if(openPort(i)) return true; + } + + return false; } bool MidiController::openPort(unsigned int index) { @@ -37,6 +46,7 @@ bool MidiController::openPort(unsigned int index) { std::cout << "Opened MIDI port: " << midiIn_->getPortName(index) << std::endl; return true; } catch (RtMidiError& e) { + std::cout << "Midi Port error" << std::endl; std::cerr << e.getMessage() << std::endl; return false; } diff --git a/src/MidiController.h b/src/MidiController.h index dccad7e..11d7b78 100644 --- a/src/MidiController.h +++ b/src/MidiController.h @@ -1,7 +1,7 @@ #pragma once -#include +#include #include #include "NoteQueue.h" #include diff --git a/src/ui/MainWindow.cpp b/src/ui/MainWindow.cpp index 4867b8e..7fcb343 100644 --- a/src/ui/MainWindow.cpp +++ b/src/ui/MainWindow.cpp @@ -115,7 +115,8 @@ MainWindow::MainWindow(QWidget *parent) : // midi #ifndef _WIN32 - midi_.openPort(1); // TODO: error check + //midi_.openDefaultPort(); // TODO: error check + midi_.openPort(1); #endif }