From 03c97c4eb7acd8d95c1d09cc55d9d423db28704f Mon Sep 17 00:00:00 2001 From: Densyakun Date: Fri, 3 Apr 2026 16:55:52 +0900 Subject: [PATCH 1/5] Add support for libgig and update build scripts --- .vscode/settings.json | 1 + CMakeLists.txt | 9 ++++++ build_lmms.bat | 46 +++++++++++++++++++++++++++++++ gig_command.txt | Bin 0 -> 1432258 bytes link_debug.txt | 0 plugins/GigPlayer/CMakeLists.txt | 6 ++-- plugins/GigPlayer/GigPlayer.cpp | 11 ++++---- plugins/TapTempo/TapTempo.cpp | 1 + plugins/TapTempo/TapTempo.h | 1 + src/CMakeLists.txt | 17 +++++++++++- vcpkg.json | 8 ++++++ 11 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 build_lmms.bat create mode 100644 gig_command.txt create mode 100644 link_debug.txt diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 69fb2a50d8b..46e0259dd63 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -540,6 +540,15 @@ ENDIF(WANT_SF2) # check for libgig If(WANT_GIG) PKG_CHECK_MODULES(GIG gig) + IF(NOT GIG_FOUND) + FIND_PATH(GIG_INCLUDE_DIRS NAMES libgig/gig.h) + FIND_LIBRARY(GIG_LIBRARIES NAMES libgig gig) + FIND_LIBRARY(AKAI_LIBRARIES NAMES libakai akai) + IF(GIG_INCLUDE_DIRS AND GIG_LIBRARIES) + SET(GIG_FOUND TRUE) + LIST(APPEND GIG_LIBRARIES ${AKAI_LIBRARIES}) + ENDIF() + ENDIF() IF(GIG_FOUND) SET(LMMS_HAVE_GIG TRUE) SET(STATUS_GIG "OK") diff --git a/build_lmms.bat b/build_lmms.bat new file mode 100644 index 00000000000..5646216c8d2 --- /dev/null +++ b/build_lmms.bat @@ -0,0 +1,46 @@ +@echo off +REM LMMS Build Script - Final Absolute Version + +set VCVARS_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat" +if not exist %VCVARS_PATH% set VCVARS_PATH="C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" + +set VCPKG_PATH="c:\Users\user\Documents\vcpkg\scripts\buildsystems\vcpkg.cmake" +set QT_PATH="c:\Users\user\Documents\Qt5\5.15.2\msvc2019_64" + +if not exist build mkdir build +cd build + +REM Get absolute paths for library forcing (Corrected libgig path) +set "VCPKG_INST_BASE=%CD%\vcpkg_installed\x64-windows" + +echo --- Loading MSVC Environment --- +call %VCVARS_PATH% + +echo --- Configuring with Forced GIG Paths --- +cmake .. -G Ninja ^ + -DCMAKE_TOOLCHAIN_FILE=%VCPKG_PATH% ^ + -DVCPKG_TARGET_TRIPLET="x64-windows" ^ + -DCMAKE_PREFIX_PATH=%QT_PATH% ^ + -DWANT_QT6=OFF ^ + -DWANT_VST_32=OFF ^ + -DWANT_GIG=ON ^ + -DGIG_INCLUDE_DIRS="%VCPKG_INST_BASE%\include\libgig" ^ + -DGIG_LIBRARIES="%VCPKG_INST_BASE%\lib\libgig.lib;%VCPKG_INST_BASE%\lib\libakai.lib;winmm.lib" ^ + -DGIG_FOUND=TRUE ^ + -DLMMS_HAVE_GIG=TRUE ^ + -DCMAKE_BUILD_TYPE=RelWithDebInfo ^ + -DCMAKE_INSTALL_PREFIX=install + +echo --- Rapid Build --- +cmake --build . -j8 + +echo --- Organizing Plugins --- +cmake --build . --target install + +echo --- Finalizing DLLs --- +cd install +"%QT_PATH:"=%\bin\windeployqt.exe" --no-compiler-runtime --no-translations --no-opengl-sw lmms.exe +copy /y ..\vcpkg_installed\x64-windows\bin\*.dll . + +echo --- All Done! --- +echo Full build with GigPlayer: build\install\lmms.exe diff --git a/gig_command.txt b/gig_command.txt new file mode 100644 index 0000000000000000000000000000000000000000..d31cf3ea1d153ab434238bc0bdc9a93a6f85a322 GIT binary patch literal 1432258 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 +#include #include #include #include @@ -519,7 +520,7 @@ void GigInstrument::loadSample( GigSample& sample, SampleFrame* sampleData, f_cn } unsigned long allocationsize = samples * sample.sample->FrameSize; - int8_t buffer[allocationsize]; + std::vector buffer(allocationsize); // Load the sample in different ways depending on if we're looping or not if( loop == true && ( sample.pos >= loopStart || sample.pos + samples > loopStart ) ) @@ -564,14 +565,14 @@ void GigInstrument::loadSample( GigSample& sample, SampleFrame* sampleData, f_cn { sample.sample->SetPos( sample.pos ); - unsigned long size = sample.sample->Read( &buffer, samples ) * sample.sample->FrameSize; - std::memset( (int8_t*) &buffer + size, 0, allocationsize - size ); + unsigned long size = sample.sample->Read( buffer.data(), samples ) * sample.sample->FrameSize; + std::memset( buffer.data() + size, 0, allocationsize - size ); } // Convert from 16 or 24 bit into 32-bit float if( sample.sample->BitDepth == 24 ) // 24 bit { - auto pInt = reinterpret_cast(&buffer); + auto pInt = reinterpret_cast(buffer.data()); for( f_cnt_t i = 0; i < samples; ++i ) { @@ -603,7 +604,7 @@ void GigInstrument::loadSample( GigSample& sample, SampleFrame* sampleData, f_cn } else // 16 bit { - auto pInt = reinterpret_cast(&buffer); + auto pInt = reinterpret_cast(buffer.data()); for( f_cnt_t i = 0; i < samples; ++i ) { diff --git a/plugins/TapTempo/TapTempo.cpp b/plugins/TapTempo/TapTempo.cpp index e498156f145..06a2558e434 100644 --- a/plugins/TapTempo/TapTempo.cpp +++ b/plugins/TapTempo/TapTempo.cpp @@ -24,6 +24,7 @@ #include "TapTempo.h" +#include #include #include "SamplePlayHandle.h" diff --git a/plugins/TapTempo/TapTempo.h b/plugins/TapTempo/TapTempo.h index 7c033b3c568..406ce635d7e 100644 --- a/plugins/TapTempo/TapTempo.h +++ b/plugins/TapTempo/TapTempo.h @@ -25,6 +25,7 @@ #ifndef LMMS_TAP_TEMPO_H #define LMMS_TAP_TEMPO_H +#include #include #include "TapTempoView.h" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e7378af9ce3..d7e3ccc96b7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -142,7 +142,8 @@ ENDIF() SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${LMMS_RCC_OUT} lmmsconfig.h lmms.1.gz") IF(LMMS_BUILD_WIN32) - SET(EXTRA_LIBRARIES "winmm") + # Hardcoded for current environment due to find_library failure with Ninja + SET(EXTRA_LIBRARIES "C:/Program Files (x86)/Windows Kits/10/Lib/10.0.26100.0/um/x64/WinMM.Lib") ENDIF() IF(LMMS_BUILD_APPLE) @@ -218,3 +219,17 @@ IF(NOT WIN32 AND NOT LMMS_BUILD_APPLE) ENDIF() INSTALL(TARGETS lmms RUNTIME DESTINATION "${BIN_DIR}") + +IF(WIN32) + GET_TARGET_PROPERTY(QT_BIN_DIR Qt5::Core LOCATION) + GET_FILENAME_COMPONENT(QT_BIN_DIR "${QT_BIN_DIR}" DIRECTORY) + ADD_CUSTOM_COMMAND(TARGET lmms POST_BUILD + COMMAND "${QT_BIN_DIR}/windeployqt.exe" + --no-compiler-runtime + --no-translations + --no-opengl-sw + --no-system-d3d-compiler + "${CMAKE_BINARY_DIR}/lmms.exe" + COMMENT "Running windeployqt to bundle dependencies" + ) +ENDIF() diff --git a/vcpkg.json b/vcpkg.json index cda8d9f24f8..4ab09fc3570 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -68,6 +68,14 @@ { "name": "zlib", "default-features": false + }, + { + "name": "libgig", + "default-features": false + }, + { + "name": "pkgconf", + "default-features": false } ] } From 9dda22a562bccd0b15389b92cf653178841e4c8f Mon Sep 17 00:00:00 2001 From: Densyakun Date: Fri, 3 Apr 2026 17:52:35 +0900 Subject: [PATCH 2/5] Send the correct time to the VST while playing --- plugins/VstBase/RemoteVstPlugin.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins/VstBase/RemoteVstPlugin.cpp b/plugins/VstBase/RemoteVstPlugin.cpp index 7343078ea89..7cb19b6f80c 100644 --- a/plugins/VstBase/RemoteVstPlugin.cpp +++ b/plugins/VstBase/RemoteVstPlugin.cpp @@ -1120,7 +1120,16 @@ void RemoteVstPlugin::process( const SampleFrame* _in, SampleFrame* _out ) unlockShm(); - m_currentSamplePos += bufferSize(); + const auto syncData = __plugin->getVstSyncData(); + if (syncData && syncData->isPlaying) + { + __plugin->m_currentSamplePos = syncData->ppqPos + * syncData->sampleRate * 60.0 / syncData->bpm; + } + else + { + // TODO Synchronize m_currentSamplePos with the bar and beat + } } From d633378737634ed5a048a2a9b6a00b9cfc913cc1 Mon Sep 17 00:00:00 2001 From: Densyakun Date: Mon, 8 Jun 2026 18:08:40 +0000 Subject: [PATCH 3/5] Fix MinGW cross-compilation build issues - Fix WinMM linking: use 'winmm' for MinGW, keep hardcoded path for MSVC - Skip windeployqt POST_BUILD when cross-compiling - Pass VCPKG_APPLOCAL_DEPS flags to RemoteVstPlugin32 ExternalProject - Add missing target_link_directories for GigPlayer - Remove libgig from vcpkg (incompatible with MinGW, use PPA package) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- plugins/GigPlayer/CMakeLists.txt | 1 + plugins/VstBase/RemoteVstPlugin32.cmake | 2 ++ src/CMakeLists.txt | 10 +++++++--- vcpkg.json | 4 ---- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/plugins/GigPlayer/CMakeLists.txt b/plugins/GigPlayer/CMakeLists.txt index be24afe162c..34ca18631ee 100644 --- a/plugins/GigPlayer/CMakeLists.txt +++ b/plugins/GigPlayer/CMakeLists.txt @@ -13,5 +13,6 @@ if(LMMS_HAVE_GIG) MOCFILES GigPlayer.h PatchesDialog.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png" ) + target_link_directories(gigplayer PRIVATE ${GIG_LIBRARY_DIRS}) target_link_libraries(gigplayer ${GIG_LIBRARIES} SampleRate::samplerate) endif(LMMS_HAVE_GIG) diff --git a/plugins/VstBase/RemoteVstPlugin32.cmake b/plugins/VstBase/RemoteVstPlugin32.cmake index 5afb7db8123..e6fab595843 100644 --- a/plugins/VstBase/RemoteVstPlugin32.cmake +++ b/plugins/VstBase/RemoteVstPlugin32.cmake @@ -45,6 +45,8 @@ ELSEIF(CMAKE_TOOLCHAIN_FILE_32) "${EXTERNALPROJECT_CMAKE_ARGS}" "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH_32}" "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE_32}" + "-DVCPKG_APPLOCAL_DEPS=${VCPKG_APPLOCAL_DEPS}" + "-DX_VCPKG_APPLOCAL_DEPS_INSTALL=${X_VCPKG_APPLOCAL_DEPS_INSTALL}" ) INSTALL_EXTERNAL_PROJECT(RemoteVstPlugin32) ELSE() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d7e3ccc96b7..dd570a6abfc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -142,8 +142,12 @@ ENDIF() SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${LMMS_RCC_OUT} lmmsconfig.h lmms.1.gz") IF(LMMS_BUILD_WIN32) - # Hardcoded for current environment due to find_library failure with Ninja - SET(EXTRA_LIBRARIES "C:/Program Files (x86)/Windows Kits/10/Lib/10.0.26100.0/um/x64/WinMM.Lib") + IF(MSVC) + # Hardcoded for current environment due to find_library failure with Ninja + SET(EXTRA_LIBRARIES "C:/Program Files (x86)/Windows Kits/10/Lib/10.0.26100.0/um/x64/WinMM.Lib") + ELSE() + SET(EXTRA_LIBRARIES "winmm") + ENDIF() ENDIF() IF(LMMS_BUILD_APPLE) @@ -220,7 +224,7 @@ ENDIF() INSTALL(TARGETS lmms RUNTIME DESTINATION "${BIN_DIR}") -IF(WIN32) +IF(WIN32 AND NOT CMAKE_CROSSCOMPILING) GET_TARGET_PROPERTY(QT_BIN_DIR Qt5::Core LOCATION) GET_FILENAME_COMPONENT(QT_BIN_DIR "${QT_BIN_DIR}" DIRECTORY) ADD_CUSTOM_COMMAND(TARGET lmms POST_BUILD diff --git a/vcpkg.json b/vcpkg.json index 4ab09fc3570..878d037aa95 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -69,10 +69,6 @@ "name": "zlib", "default-features": false }, - { - "name": "libgig", - "default-features": false - }, { "name": "pkgconf", "default-features": false From 4f94775fd34f38a25b8ded8d6288c1842e7a4244 Mon Sep 17 00:00:00 2001 From: Densyakun Date: Mon, 8 Jun 2026 18:08:49 +0000 Subject: [PATCH 4/5] Fix VST time information sync for stop, seek, and piano roll playback Three bugs fixed: 1. Stop position not reflected to VST: When playback stops and returns to the start position, the VST plugin now sees the updated position. Previously, samplePos was only updated during playback. 2. Position changes while stopped: When the user moves the playback cursor without playing, the VST sync position is now updated via a connection to Timeline::positionJumped. 3. Piano roll (MidiClip) playback: playMidiClip() now calls setPlaybackState(true) like playSong() and playPattern() do. Additionally, samplePos in audioMasterGetTime is now derived from the computed ppqPos for consistency, rather than from the stale m_currentSamplePos that was only updated during process(). Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- plugins/VstBase/RemoteVstPlugin.cpp | 11 +++++------ src/core/Song.cpp | 13 +++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/plugins/VstBase/RemoteVstPlugin.cpp b/plugins/VstBase/RemoteVstPlugin.cpp index 7cb19b6f80c..c0e8996b496 100644 --- a/plugins/VstBase/RemoteVstPlugin.cpp +++ b/plugins/VstBase/RemoteVstPlugin.cpp @@ -1121,15 +1121,11 @@ void RemoteVstPlugin::process( const SampleFrame* _in, SampleFrame* _out ) unlockShm(); const auto syncData = __plugin->getVstSyncData(); - if (syncData && syncData->isPlaying) + if (syncData) { __plugin->m_currentSamplePos = syncData->ppqPos * syncData->sampleRate * 60.0 / syncData->bpm; } - else - { - // TODO Synchronize m_currentSamplePos with the bar and beat - } } @@ -1885,7 +1881,6 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode, assert(syncData != nullptr); memset( &_timeInfo, 0, sizeof( _timeInfo ) ); - _timeInfo.samplePos = __plugin->m_currentSamplePos; _timeInfo.sampleRate = syncData->sampleRate; _timeInfo.flags = 0; _timeInfo.tempo = syncData->bpm; @@ -1919,6 +1914,10 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode, // _timeInfo.ppqPos = syncData->ppqPos; _timeInfo.flags |= kVstPpqPosValid; + // Derive samplePos from the computed ppqPos for consistency + _timeInfo.samplePos = _timeInfo.ppqPos + * syncData->sampleRate * 60.0 / syncData->bpm; + if (syncData->isPlaying) { _timeInfo.flags |= kVstTransportPlaying; diff --git a/src/core/Song.cpp b/src/core/Song.cpp index 1d3a7bc291e..e3bca207643 100644 --- a/src/core/Song.cpp +++ b/src/core/Song.cpp @@ -129,6 +129,17 @@ Song::Song() : }; connect(&m_timelines[i], &Timeline::positionJumped, this, onPositionJumped); + + // Update VST sync position when the user changes position while not playing + connect(&m_timelines[i], &Timeline::positionJumped, this, [this, playMode = static_cast(i)] { + if (!m_playing) + { + const auto& tl = getTimeline(playMode); + m_vstSyncController.setAbsolutePosition( + tl.ticks() + tl.frameOffset() / static_cast(Engine::framesPerTick())); + m_vstSyncController.setPlaybackJumped(true); + } + }); } // Inform VST plugins if the user moved the play head @@ -575,6 +586,8 @@ void Song::playMidiClip( const MidiClip* midiClipToPlay, bool loop ) m_paused = false; } + m_vstSyncController.setPlaybackState( true ); + savePlayStartPosition(); emit playbackStateChanged(); From 5658f449f8e9fb7fa416c6f1bea5964f05b71e62 Mon Sep 17 00:00:00 2001 From: Densyakun Date: Thu, 11 Jun 2026 11:59:58 +0000 Subject: [PATCH 5/5] Fix ppqPos returning 0 when not playing When audioMasterGetTime is called while stopped and the position hasn't changed, neither the position-update branch nor the interpolation branch fires, leaving ppqPos at 0 (from memset). Add an else branch that preserves lastppqPos so the VST always sees the correct position regardless of playback state. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- plugins/VstBase/RemoteVstPlugin.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/VstBase/RemoteVstPlugin.cpp b/plugins/VstBase/RemoteVstPlugin.cpp index c0e8996b496..3355bc8d919 100644 --- a/plugins/VstBase/RemoteVstPlugin.cpp +++ b/plugins/VstBase/RemoteVstPlugin.cpp @@ -1911,7 +1911,10 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode, / syncData->sampleRate; _timeInfo.ppqPos = __plugin->m_sync.lastppqPos; } -// _timeInfo.ppqPos = syncData->ppqPos; + else + { + _timeInfo.ppqPos = __plugin->m_sync.lastppqPos; + } _timeInfo.flags |= kVstPpqPosValid; // Derive samplePos from the computed ppqPos for consistency