diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9cffcf34..98c3face 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,11 @@
In this document, Ctrl means Command (⌘) on Mac.
+### 2.6.3 (2025-03-26)
+- Fix failure to launch on Windows 7.
+- Rack Pro
+ - Audio Unit: Fix crash when controlling multiple parameters with *VCV MIDI Map*.
+
### 2.6.2 (2025-03-17)
- Fix incorrect audio driver being loaded from patches made in Rack ≤2.6.0.
- Fix Mac installer creating duplicate app bundle.
diff --git a/Info.plist b/Info.plist
index 52c26b06..673aa958 100644
--- a/Info.plist
+++ b/Info.plist
@@ -7,12 +7,12 @@
CFBundleNameVCV Rack 2 Free
CFBundleDisplayNameVCV Rack 2 Free
CFBundleIdentifiercom.vcvrack.rack2
- CFBundleVersion{VERSION}
+ CFBundleVersion{RACK_VERSION}
CFBundlePackageTypeAPPL
CFBundleSignatureRACK
CFBundleExecutableRack
CFBundleIconFileicon
- CFBundleShortVersionString{VERSION}
+ CFBundleShortVersionString{RACK_VERSION}
NSHumanReadableCopyrightCopyright © VCV
NSPrincipalClassNSApplication
NSHighResolutionCapable
diff --git a/Makefile b/Makefile
index 1d6accc6..2699aee2 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
RACK_DIR ?= .
-EDITION := Free
-VERSION_MAJOR := 2
-VERSION ?= $(patsubst v%,%,$(shell git describe --tags --match "v$(VERSION_MAJOR).*"))
+RACK_EDITION := Free
+RACK_VERSION_MAJOR := 2
+RACK_VERSION ?= $(patsubst v%,%,$(shell git describe --tags --match "v$(RACK_VERSION_MAJOR).*"))
FLAGS += -Iinclude -Idep/include
@@ -17,7 +17,7 @@ SOURCES += dep/tinyexpr/tinyexpr.c
SOURCES += $(wildcard src/*.c src/*/*.c)
SOURCES += $(wildcard src/*.cpp src/*/*.cpp)
-build/src/common.cpp.o: FLAGS += -D_APP_VERSION=$(VERSION)
+build/src/common.cpp.o: FLAGS += -D_RACK_VERSION=$(RACK_VERSION)
build/dep/tinyexpr/tinyexpr.c.o: FLAGS += -DTE_POW_FROM_RIGHT -DTE_NAT_LOG
FLAGS += -fPIC
@@ -164,17 +164,17 @@ endif
# The following targets are not supported for public use
-DIST_NAME = Rack$(EDITION)-$(VERSION)-$(ARCH_NAME)
+DIST_NAME = Rack$(RACK_EDITION)-$(RACK_VERSION)-$(ARCH_NAME)
ifdef ARCH_MAC
- DIST_BUNDLE := VCV Rack $(VERSION_MAJOR) $(EDITION).app
+ DIST_BUNDLE := VCV Rack $(RACK_VERSION_MAJOR) $(RACK_EDITION).app
else
- DIST_DIR := Rack$(VERSION_MAJOR)$(EDITION)
+ DIST_DIR := Rack$(RACK_VERSION_MAJOR)$(RACK_EDITION)
endif
DIST_MD := $(wildcard *.md)
DIST_HTML := $(patsubst %.md, build/%.html, $(DIST_MD))
DIST_RES := res cacert.pem Core.json template.vcv LICENSE-GPLv3.txt $(DIST_HTML) translations
DIST_SDK_DIR := Rack-SDK
-DIST_SDK = Rack-SDK-$(VERSION)-$(ARCH_NAME).zip
+DIST_SDK = Rack-SDK-$(RACK_VERSION)-$(ARCH_NAME).zip
FUNDAMENTAL_VERSION ?= 2.6.1
FUNDAMENTAL_FILENAME := Fundamental-$(FUNDAMENTAL_VERSION)-$(ARCH_NAME).vcvplugin
@@ -211,7 +211,7 @@ ifdef ARCH_MAC
otool -L dist/"$(DIST_BUNDLE)"/Contents/MacOS/$(STANDALONE_TARGET)
# Copy resources
cp Info.plist dist/"$(DIST_BUNDLE)"/Contents/
- $(SED) 's/{VERSION}/$(VERSION)/g' dist/"$(DIST_BUNDLE)"/Contents/Info.plist
+ $(SED) 's/{RACK_VERSION}/$(RACK_VERSION)/g' dist/"$(DIST_BUNDLE)"/Contents/Info.plist
cp -R icon.icns dist/"$(DIST_BUNDLE)"/Contents/Resources/
cp -R $(DIST_RES) dist/"$(DIST_BUNDLE)"/Contents/Resources/
cp "$(FUNDAMENTAL_FILENAME)" dist/"$(DIST_BUNDLE)"/Contents/Resources/
@@ -273,7 +273,7 @@ endif
ifdef ARCH_WIN
# Make NSIS installer
# pacman -S mingw-w64-x86_64-nsis
- makensis -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION=$(VERSION) "-XOutFile dist/$(DIST_NAME).exe" installer.nsi
+ makensis -DRACK_VERSION_MAJOR=$(RACK_VERSION_MAJOR) -DRACK_VERSION=$(RACK_VERSION) "-XOutFile dist/$(DIST_NAME).exe" installer.nsi
endif
diff --git a/dep/Makefile b/dep/Makefile
index 58e20b33..f016299e 100755
--- a/dep/Makefile
+++ b/dep/Makefile
@@ -104,16 +104,16 @@ $(glfw): | glfw
$(MAKE) -C glfw/build
$(MAKE) -C glfw/build install
-jansson-2.14:
- $(WGET) "https://github.com/akheron/jansson/releases/download/v2.14/jansson-2.14.tar.gz" || $(WGET) "http://www.digip.org/jansson/releases/jansson-2.14.tar.gz"
- $(SHA256) jansson-2.14.tar.gz 5798d010e41cf8d76b66236cfb2f2543c8d082181d16bc3085ab49538d4b9929
- $(UNTAR) jansson-2.14.tar.gz
- rm jansson-2.14.tar.gz
+jansson-2.12:
+ $(WGET) "https://github.com/akheron/jansson/releases/download/v2.12/jansson-2.12.tar.gz" || $(WGET) "http://www.digip.org/jansson/releases/jansson-2.12.tar.gz"
+ $(SHA256) jansson-2.12.tar.gz 5f8dec765048efac5d919aded51b26a32a05397ea207aa769ff6b53c7027d2c9
+ $(UNTAR) jansson-2.12.tar.gz
+ rm jansson-2.12.tar.gz
-$(jansson): | jansson-2.14
- cd jansson-2.14 && $(CONFIGURE)
- $(MAKE) -C jansson-2.14
- $(MAKE) -C jansson-2.14 install
+$(jansson): | jansson-2.12
+ cd jansson-2.12 && $(CONFIGURE)
+ $(MAKE) -C jansson-2.12
+ $(MAKE) -C jansson-2.12 install
openssl-3.3.2:
$(WGET) "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz"
@@ -144,32 +144,32 @@ $(libcurl): | $(openssl) curl-8.10.0
$(MAKE) -C curl-8.10.0
$(MAKE) -C curl-8.10.0 install
-zstd-1.5.7:
- $(WGET) "https://github.com/facebook/zstd/releases/download/v1.5.7/zstd-1.5.7.tar.gz"
- $(SHA256) zstd-1.5.7.tar.gz eb33e51f49a15e023950cd7825ca74a4a2b43db8354825ac24fc1b7ee09e6fa3
+zstd-1.5.6:
+ $(WGET) "https://github.com/facebook/zstd/releases/download/v1.5.6/zstd-1.5.6.tar.gz"
+ $(SHA256) zstd-1.5.6.tar.gz 8c29e06cf42aacc1eafc4077ae2ec6c6fcb96a626157e0593d5e82a34fd403c1
# HACK This tar archive creates a symlink "untar" to "tar" before tar exists. This is okay on UNIX but not on Windows where symlinks are copies of files. So create a fake "tar" so the unarchiving works.
- mkdir -p zstd-1.5.7/tests/cli-tests/bin
- touch zstd-1.5.7/tests/cli-tests/bin/zstd
- $(UNTAR) zstd-1.5.7.tar.gz
- rm zstd-1.5.7.tar.gz
-
-$(zstd): | zstd-1.5.7
- cd zstd-1.5.7/build/cmake && $(CMAKE) -DZSTD_BUILD_PROGRAMS=OFF -DZSTD_BUILD_SHARED=OFF -DZSTD_BUILD_STATIC=ON -DZSTD_BUILD_TESTS=OFF -DZSTD_MULTITHREAD_SUPPORT=OFF .
- $(MAKE) -C zstd-1.5.7/build/cmake
- $(MAKE) -C zstd-1.5.7/build/cmake install
-
-libarchive-3.7.8:
- $(WGET) "https://github.com/libarchive/libarchive/releases/download/v3.7.8/libarchive-3.7.8.tar.gz" || $(WGET) "https://libarchive.org/downloads/libarchive-3.7.8.tar.gz"
- $(SHA256) libarchive-3.7.8.tar.gz a123d87b1bd8adb19e8c187da17ae2d957c7f9596e741b929e6b9ceefea5ad0f
- $(UNTAR) libarchive-3.7.8.tar.gz
- rm libarchive-3.7.8.tar.gz
-
-$(libarchive): | $(zstd) libarchive-3.7.8
+ mkdir -p zstd-1.5.6/tests/cli-tests/bin
+ touch zstd-1.5.6/tests/cli-tests/bin/zstd
+ $(UNTAR) zstd-1.5.6.tar.gz
+ rm zstd-1.5.6.tar.gz
+
+$(zstd): | zstd-1.5.6
+ cd zstd-1.5.6/build/cmake && $(CMAKE) -DZSTD_BUILD_PROGRAMS=OFF -DZSTD_BUILD_SHARED=OFF -DZSTD_BUILD_STATIC=ON -DZSTD_BUILD_TESTS=OFF -DZSTD_MULTITHREAD_SUPPORT=OFF .
+ $(MAKE) -C zstd-1.5.6/build/cmake
+ $(MAKE) -C zstd-1.5.6/build/cmake install
+
+libarchive-3.7.7:
+ $(WGET) "https://github.com/libarchive/libarchive/releases/download/v3.7.7/libarchive-3.7.7.tar.gz" || $(WGET) "https://libarchive.org/downloads/libarchive-3.7.7.tar.gz"
+ $(SHA256) libarchive-3.7.7.tar.gz 4cc540a3e9a1eebdefa1045d2e4184831100667e6d7d5b315bb1cbc951f8ddff
+ $(UNTAR) libarchive-3.7.7.tar.gz
+ rm libarchive-3.7.7.tar.gz
+
+$(libarchive): | $(zstd) libarchive-3.7.7
#cd libarchive-3.7.7 && $(CONFIGURE) --enable-shared=no --enable-static=yes --disable-bsdtar --disable-bsdcat --disable-bsdcpio --disable-posix-regex-lib --disable-xattr --disable-acl --without-zlib --without-bz2lib --without-libb2 --without-iconv --without-lz4 --without-lzma --without-cng --without-openssl --without-xml2 --without-expat
- cd libarchive-3.7.8 && mkdir -p build
- cd libarchive-3.7.8/build && $(CMAKE) -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=OFF -DENABLE_ACL=OFF -DENABLE_BZip2=OFF -DENABLE_CAT=OFF -DENABLE_CNG=OFF -DENABLE_COVERAGE=OFF -DENABLE_CPIO=OFF -DENABLE_EXPAT=OFF -DENABLE_ICONV=OFF -DENABLE_LIBB2=OFF -DENABLE_LIBXML2=OFF -DENABLE_LZ4=OFF -DENABLE_LZMA=OFF -DENABLE_LZO=OFF -DENABLE_MBEDTLS=OFF -DENABLE_NETTLE=OFF -DENABLE_OPENSSL=OFF -DENABLE_TAR=OFF -DENABLE_TEST=OFF -DENABLE_UNZIP=OFF -DENABLE_WERROR=OFF -DENABLE_XATTR=OFF -DENABLE_ZLIB=OFF -DENABLE_ZSTD=ON -DZSTD_INCLUDE_DIR:PATH=$(DEP_PATH)/include -DZSTD_LIBRARY=$(DEP_PATH)/lib/libzstd.a ..
- $(MAKE) -C libarchive-3.7.8/build
- $(MAKE) -C libarchive-3.7.8/build install
+ cd libarchive-3.7.7 && mkdir -p build
+ cd libarchive-3.7.7/build && $(CMAKE) -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=OFF -DENABLE_ACL=OFF -DENABLE_BZip2=OFF -DENABLE_CAT=OFF -DENABLE_CNG=OFF -DENABLE_COVERAGE=OFF -DENABLE_CPIO=OFF -DENABLE_EXPAT=OFF -DENABLE_ICONV=OFF -DENABLE_LIBB2=OFF -DENABLE_LIBXML2=OFF -DENABLE_LZ4=OFF -DENABLE_LZMA=OFF -DENABLE_LZO=OFF -DENABLE_MBEDTLS=OFF -DENABLE_NETTLE=OFF -DENABLE_OPENSSL=OFF -DENABLE_TAR=OFF -DENABLE_TEST=OFF -DENABLE_UNZIP=OFF -DENABLE_WERROR=OFF -DENABLE_XATTR=OFF -DENABLE_ZLIB=OFF -DENABLE_ZSTD=ON -DWINDOWS_VERSION="WIN7" -DZSTD_INCLUDE_DIR:PATH=$(DEP_PATH)/include -DZSTD_LIBRARY=$(DEP_PATH)/lib/libzstd.a ..
+ $(MAKE) -C libarchive-3.7.7/build
+ $(MAKE) -C libarchive-3.7.7/build install
$(libspeexdsp): | speexdsp
cd speexdsp && ./autogen.sh
@@ -177,18 +177,16 @@ $(libspeexdsp): | speexdsp
$(MAKE) -C speexdsp
$(MAKE) -C speexdsp install
-libsamplerate-0.2.2:
- $(WGET) "https://github.com/libsndfile/libsamplerate/releases/download/0.2.2/libsamplerate-0.2.2.tar.xz"
- $(SHA256) libsamplerate-0.2.2.tar.xz 3258da280511d24b49d6b08615bbe824d0cacc9842b0e4caf11c52cf2b043893
- $(UNTAR) libsamplerate-0.2.2.tar.xz
- rm libsamplerate-0.2.2.tar.xz
+libsamplerate-0.1.9:
+ $(WGET) "https://github.com/libsndfile/libsamplerate/releases/download/0.1.9/libsamplerate-0.1.9.tar.gz" || $(WGET) "http://www.mega-nerd.com/SRC/libsamplerate-0.1.9.tar.gz"
+ $(SHA256) libsamplerate-0.1.9.tar.gz 0a7eb168e2f21353fb6d84da152e4512126f7dc48ccb0be80578c565413444c1
+ $(UNTAR) libsamplerate-0.1.9.tar.gz
+ rm libsamplerate-0.1.9.tar.gz
-$(libsamplerate): | libsamplerate-0.2.2
- cd libsamplerate-0.2.2 && mkdir build
- cd libsamplerate-0.2.2/build && $(CMAKE) -DCMAKE_BUILD_TYPE=Release ..
- cd libsamplerate-0.2.2/build && $(MAKE) install
- cd libsamplerate-0.2.2/build && $(CMAKE) -DBUILD_SHARED_LIBS=ON ..
- cd libsamplerate-0.2.2/build && $(MAKE) install
+$(libsamplerate): | libsamplerate-0.1.9
+ cd libsamplerate-0.1.9 && $(CONFIGURE) --disable-fftw --disable-sndfile
+ $(MAKE) -C libsamplerate-0.1.9
+ $(MAKE) -C libsamplerate-0.1.9 install
RTMIDI_FLAGS += --enable-shared=no
ifdef ARCH_LIN
@@ -215,10 +213,14 @@ ifdef ARCH_MAC
RTAUDIO_FLAGS += -DRTAUDIO_API_CORE=ON -DRTAUDIO_API_PULSE=OFF -DRTAUDIO_API_JACK=OFF
endif
ifdef ARCH_WIN
-RTAUDIO_FLAGS += -DRTAUDIO_API_DS=OFF -DRTAUDIO_API_WASAPI=ON
+RTAUDIO_FLAGS += -DRTAUDIO_API_DS=ON -DRTAUDIO_API_WASAPI=ON
# ASIO is proprietary software owned by Steinberg, so distributing it with your own VCV Rack build would violate Rack's GPLv3 license.
# However, since VCV owns the copyright of all GPL'd code in the Rack package, we include ASIO in the Windows build for convenience to our users.
+ifdef RTAUDIO_ASIO
RTAUDIO_FLAGS += -DRTAUDIO_API_ASIO=ON
+else
+RTAUDIO_FLAGS += -DRTAUDIO_API_ASIO=OFF
+endif
endif
# RtAudio on Windows and Mac uses these macros to enable UTF-8 device names
@@ -267,7 +269,7 @@ $(simde): simde/simde
# Helpers
-src: glew-2.1.0 glfw jansson-2.14 libsamplerate-0.2.2 openssl-3.3.2 curl-8.10.0 zstd-1.5.7 libarchive-3.7.8 rtaudio nanovg nanosvg oui-blendish osdialog
+src: glew-2.1.0 glfw jansson-2.12 libsamplerate-0.1.9 openssl-3.3.2 curl-8.10.0 zstd-1.5.6 libarchive-3.7.7 rtaudio nanovg nanosvg oui-blendish osdialog
clean:
git clean -fdx
diff --git a/installer.nsi b/installer.nsi
index 1c28be6a..748b4967 100644
--- a/installer.nsi
+++ b/installer.nsi
@@ -1,10 +1,10 @@
!include "MUI2.nsh"
-!define NAME_FULL "VCV Rack Free ${VERSION}"
-!define NAME "VCV Rack ${VERSION_MAJOR} Free"
-!define RACK_DIR "Rack${VERSION_MAJOR}Free"
-!define INSTALL_REG "Software\VCV\Rack${VERSION_MAJOR}Free"
-!define UNINSTALL_REG "Software\Microsoft\Windows\CurrentVersion\Uninstall\VCVRack${VERSION_MAJOR}Free"
+!define NAME_FULL "VCV Rack Free ${RACK_VERSION}"
+!define NAME "VCV Rack ${RACK_VERSION_MAJOR} Free"
+!define RACK_DIR "Rack${RACK_VERSION_MAJOR}Free"
+!define INSTALL_REG "Software\VCV\Rack${RACK_VERSION_MAJOR}Free"
+!define UNINSTALL_REG "Software\Microsoft\Windows\CurrentVersion\Uninstall\VCVRack${RACK_VERSION_MAJOR}Free"
Name "${NAME_FULL}"
Unicode True
@@ -94,7 +94,7 @@ Section "${NAME}" INSTALL_SECTION
; Write uninstaller info
WriteRegStr HKLM "${UNINSTALL_REG}" "DisplayName" "${NAME}"
WriteRegStr HKLM "${UNINSTALL_REG}" "DisplayIcon" '"$INSTDIR\Rack.exe"'
- WriteRegStr HKLM "${UNINSTALL_REG}" "DisplayVersion" "${VERSION}"
+ WriteRegStr HKLM "${UNINSTALL_REG}" "DisplayVersion" "${RACK_VERSION}"
WriteRegStr HKLM "${UNINSTALL_REG}" "UninstallString" '"$INSTDIR\Uninstall.exe"'
WriteRegStr HKLM "${UNINSTALL_REG}" "QuietUninstallString" '"$INSTDIR\Uninstall.exe" /S'
WriteRegStr HKLM "${UNINSTALL_REG}" "InstallLocation" '"$INSTDIR"'
@@ -115,10 +115,6 @@ Section "${NAME}" INSTALL_SECTION
; Create shortcuts
CreateShortcut "$DESKTOP\${NAME}.lnk" "$INSTDIR\Rack.exe"
CreateShortcut "$SMPROGRAMS\${NAME}.lnk" "$INSTDIR\Rack.exe"
-
- ; Add allowed app to Controlled Folder Access
- ExpandEnvStrings $0 "%COMSPEC%"
- ExecShellWait "" '"$0"' "/C powershell -ExecutionPolicy Bypass -WindowStyle Hidden $\"Add-MpPreference -ControlledFolderAccessAllowedApplications '$INSTDIR\Rack.exe'$\"" SW_HIDE
SectionEnd
diff --git a/src/app/MenuBar.cpp b/src/app/MenuBar.cpp
index 04072baf..092e1d22 100644
--- a/src/app/MenuBar.cpp
+++ b/src/app/MenuBar.cpp
@@ -422,10 +422,19 @@ struct ViewButton : MenuButton {
}
}));
- menu->addChild(createIndexPtrSubmenuItem(string::translate("MenuBar.view.pixelRatio"), {
- string::translate("MenuBar.view.pixelRatio.auto"),
- "100%", "200%", "300%"
- }, &settings::pixelRatio));
+ static const std::vector pixelRatios = {0, 1, 1.5, 2, 2.5, 3};
+ std::vector pixelRatioLabels;
+ for (float pixelRatio : pixelRatios) {
+ pixelRatioLabels.push_back(pixelRatio == 0.f ? string::translate("MenuBar.view.pixelRatio.auto") : string::f("%0.f%%", pixelRatio * 100.f));
+ }
+ menu->addChild(createIndexSubmenuItem(string::translate("MenuBar.view.pixelRatio"), pixelRatioLabels, [=]() -> size_t {
+ auto it = std::find(pixelRatios.begin(), pixelRatios.end(), settings::pixelRatio);
+ if (it == pixelRatios.end())
+ return -1;
+ return it - pixelRatios.begin();
+ }, [=](size_t i) {
+ settings::pixelRatio = pixelRatios[i];
+ }));
ZoomSlider* zoomSlider = new ZoomSlider;
zoomSlider->box.size.x = 250.0;
diff --git a/src/common.cpp b/src/common.cpp
index d763e7d4..a6812c80 100644
--- a/src/common.cpp
+++ b/src/common.cpp
@@ -19,7 +19,7 @@ const std::string APP_NAME = "VCV Rack";
const std::string APP_EDITION = "Pro";
const std::string APP_EDITION_NAME = "[SR's Build]";
const std::string APP_VERSION_MAJOR = "2";
-const std::string APP_VERSION = TOSTRING(_APP_VERSION);
+const std::string APP_VERSION = TOSTRING(_RACK_VERSION);
#if defined ARCH_WIN
const std::string APP_OS = "win";
const std::string APP_OS_NAME = "Windows";
diff --git a/src/core/MIDIMap.cpp b/src/core/MIDIMap.cpp
index 70f7431a..4bed567f 100644
--- a/src/core/MIDIMap.cpp
+++ b/src/core/MIDIMap.cpp
@@ -115,16 +115,23 @@ struct MIDIMap : Module {
if (values[cc] < 0)
continue;
float value = values[cc] / 127.f;
- // Detect behavior from MIDI buttons.
+
+ // Detect MIDI CC buttons
if (smooth && std::fabs(valueFilters[id].out - value) < 1.f) {
// Smooth value with filter
- valueFilters[id].process(args.sampleTime * divider.getDivision(), value);
+ value = valueFilters[id].process(args.sampleTime * divider.getDivision(), value);
}
else {
- // Jump value
+ // Jump filter value, don't filter
valueFilters[id].out = value;
}
- paramQuantity->setScaledValue(valueFilters[id].out);
+
+ // Scale and snap value based on ParamQuantity
+ value = paramQuantity->fromScaled(value);
+ if (paramQuantity->snapEnabled)
+ value = std::round(value);
+ // Set param value without Engine smoothing, since it is already filtered.
+ APP->engine->setParamValue(module, paramId, value);
}
}