diff --git a/.gitignore b/.gitignore index b7e2626..378eac2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ -*.*~ -*.o - +build diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..cf81e47 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,10 @@ +build-job: + stage: build + image: ubuntu:22.04 + script: + - apt-get update + - apt-get install -y git cmake g++ freeglut3-dev qt6-base-dev + - mkdir -p build + - cd build + - cmake .. + - cmake --build . diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..4bdb307 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,93 @@ +cmake_minimum_required(VERSION 3.16) +project(samplebrain VERSION 1.0 LANGUAGES C CXX) + +include(Dependencies.cmake) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +# Set up AUTOMOC and some sensible defaults for runtime execution +# When using Qt 6.3, you can replace the code block below with +# qt_standard_project_setup() +set(CMAKE_AUTOMOC ON) +include(GNUInstallDirs) +set(CMAKE_AUTOUIC ON) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS Core) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Gui Widgets) + +qt_add_executable(samplebrain WIN32 MACOSX_BUNDLE + app/MainWindow.cpp app/MainWindow.h + app/SettingsDialog.cpp app/SettingsDialog.h + app/audio_thread.cpp + app/feedback.cpp + app/process_thread.cpp + app/qtmain.cpp + app/sound_items.cpp + brain/src/aquila/filter/MelFilter.cpp + brain/src/aquila/filter/MelFilterBank.cpp + brain/src/aquila/transform/Dct.cpp + brain/src/block.cpp + brain/src/block_stream.cpp + brain/src/brain.cpp + brain/src/fft.cpp + brain/src/mfcc.cpp + brain/src/renderer.cpp + brain/src/search_params.cpp + brain/src/spiralcore/OSC_server.cpp + brain/src/spiralcore/allocator.cpp + brain/src/spiralcore/audio.cpp + brain/src/spiralcore/command_ring_buffer.cpp + brain/src/spiralcore/portaudio_client.cpp + brain/src/spiralcore/ring_buffer.cpp + brain/src/spiralcore/sample.cpp + brain/src/spiralcore/stream.cpp + brain/src/status.cpp + brain/src/window.cpp + gui/samplebrain.ui + gui/settings.ui +) +target_include_directories(samplebrain PRIVATE + . + brain/src +) + +target_link_libraries(samplebrain PRIVATE + Qt::Core + Qt::Gui + Qt::Widgets + fftw3 + lo_shared + portaudio + sndfile +) + +# Resources: +set(samplebrain_resource_files + "app/images/at.png" + "app/images/pause.png" + "app/images/play.png" + "app/images/record.png" + "app/images/settings.png" + "app/images/stop.png" +) + +qt_add_resources(samplebrain "samplebrain" + PREFIX + "/images" + BASE + "app" + FILES + ${samplebrain_resource_files} +) + +install(TARGETS samplebrain + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) + +# Consider using qt_generate_deploy_app_script() for app deployment if +# the project can use Qt 6.3. In that case rerun qmake2cmake with +# --min-qt-version=6.3. diff --git a/Dependencies.cmake b/Dependencies.cmake new file mode 100644 index 0000000..848c56a --- /dev/null +++ b/Dependencies.cmake @@ -0,0 +1,49 @@ +################################################################################ +# FetchContent +################################################################################ + +include(FetchContent) + +################################################################################ +# fftw3 +################################################################################ + +FetchContent_Declare( + fftw3 + URL http://fftw.org/fftw-3.3.10.tar.gz + URL_HASH MD5=8ccbf6a5ea78a16dbc3e1306e234cc5c) +FetchContent_MakeAvailable(fftw3) + +include_directories(${fftw3_SOURCE_DIR}/api) + +################################################################################ +# liblo +################################################################################ + +FetchContent_Declare( + liblo + URL http://downloads.sourceforge.net/liblo/liblo-0.31.tar.gz + URL_HASH MD5=14378c1e74c58e777fbb4fcf33ac5315) +FetchContent_MakeAvailable(liblo) + +add_subdirectory(${liblo_SOURCE_DIR}/cmake) + +################################################################################ +# PortAudio +################################################################################ + +FetchContent_Declare( + portaudio + URL http://files.portaudio.com/archives/pa_stable_v190700_20210406.tgz + URL_HASH MD5=ad319249932c6794b551d954b8844402) +FetchContent_MakeAvailable(portaudio) + +################################################################################ +# libsndfile +################################################################################ + +FetchContent_Declare( + libsndfile + GIT_REPOSITORY https://github.com/libsndfile/libsndfile + GIT_TAG 1.1.0) +FetchContent_MakeAvailable(libsndfile) diff --git a/building.md b/building.md index f6d80c4..90c068e 100644 --- a/building.md +++ b/building.md @@ -1,8 +1,8 @@ # Building from source ## Linux (Ubuntu) -Install libraries for the sample engine (use brew on mac, MinGW on win): +Install cmake: - $ sudo apt install libsndfile1-dev portaudio19-dev liblo-dev libfftw3-dev + $ sudo apt install cmake Install dependencies for the interface: @@ -16,15 +16,14 @@ Build & run it: $ mkdir build $ cd build - $ qmake .. - $ make - $ sudo make install - $ samplebrain + $ cmake .. + $ cmake --build . + $ ./samplebrain ## Mac -Install libraries for sample engine: +Install cmake: - $ brew install fftw portaudio liblo libsndfile + $ brew install cmake Install dependencies for the interface: @@ -35,10 +34,10 @@ Build & run it: $ mkdir build $ cd build - $ qmake .. - $ make + $ cmake .. + $ cmake --build . -`samplebrain.app` should then be in the app folder for you to run. +`samplebrain.app` should then be in the build folder for you to run. # Mac build additions diff --git a/samplebrain.pro b/samplebrain.pro deleted file mode 100644 index 8b047df..0000000 --- a/samplebrain.pro +++ /dev/null @@ -1,71 +0,0 @@ -###################################################################### -# Automatically generated by qmake (2.01a) Sun Jul 5 17:49:45 2015 -###################################################################### - -TEMPLATE = app -TARGET = samplebrain -DEPENDPATH += . 2 -INCLUDEPATH += . 2 - -QT += core gui widgets - -# Input -HEADERS += app/MainWindow.h \ - app/SettingsDialog.h - -FORMS += gui/samplebrain.ui \ - gui/settings.ui - -SOURCES += app/MainWindow.cpp \ - app/SettingsDialog.cpp \ - app/sound_items.cpp \ - app/audio_thread.cpp \ - app/process_thread.cpp \ - app/feedback.cpp \ - app/qtmain.cpp \ - brain/src/block.cpp \ - brain/src/brain.cpp \ - brain/src/fft.cpp \ - brain/src/mfcc.cpp \ - brain/src/renderer.cpp \ - brain/src/search_params.cpp \ - brain/src/status.cpp \ - brain/src/window.cpp \ - brain/src/block_stream.cpp \ - brain/src/aquila/filter/MelFilterBank.cpp \ - brain/src/aquila/filter/MelFilter.cpp \ - brain/src/aquila/transform/Dct.cpp \ - brain/src/spiralcore/sample.cpp \ - brain/src/spiralcore/ring_buffer.cpp \ - brain/src/spiralcore/command_ring_buffer.cpp \ - brain/src/spiralcore/portaudio_client.cpp \ - brain/src/spiralcore/audio.cpp \ - brain/src/spiralcore/OSC_server.cpp \ - brain/src/spiralcore/allocator.cpp \ - brain/src/spiralcore/stream.cpp - -INCLUDEPATH += brain/src -INCLUDEPATH += /usr/local/include -INCLUDEPATH += /opt/homebrew/include -LIBS += -L.. -L/usr/local/lib -L/opt/homebrew/lib -lportaudio -lfftw3 -lsndfile -llo -ldl -lpthread -lm - -QMAKE_CXXFLAGS += -O3 -Wall -Wno-unused -std=c++11 - -# assets -RESOURCES = app/samplebrain.qrc -ICON = desktop/samplebrain.icns - -PREFIX = $$(PREFIX) -isEmpty(PREFIX) { - PREFIX = /usr -} - -unix:desktopfile.path = $$PREFIX/share/applications/ -unix:desktopfile.files = desktop/samplebrain.desktop -unix:iconfile.path = $$PREFIX/share/icons/hicolor/scalable/apps -unix:iconfile.files = desktop/samplebrain.svg -unix:metainfofile.path = $$PREFIX/share/metainfo -unix:metainfofile.files = desktop/org.thentrythis.Samplebrain.metainfo.xml - -target.path = $$PREFIX/bin -INSTALLS += target desktopfile iconfile metainfofile