Merge branch 'master' into feature/recording-stage-one

This commit is contained in:
Johannes Lorenz
2025-06-20 16:26:21 +02:00
347 changed files with 3843 additions and 1931 deletions

View File

@@ -339,7 +339,7 @@ jobs:
CCACHE_MAXSIZE: 500M
msvc:
name: msvc-x64
runs-on: windows-2019
runs-on: windows-2022
env:
CCACHE_MAXSIZE: 0
CCACHE_NOCOMPRESS: 1
@@ -421,3 +421,68 @@ jobs:
ccache --show-stats --verbose
env:
CCACHE_MAXSIZE: 500MB
msys2:
name: windows-arm64
runs-on: windows-11-arm
defaults:
run:
shell: msys2 {0}
env:
CMAKE_OPTS: >-
-DCMAKE_BUILD_TYPE=RelWithDebInfo
-DUSE_COMPILE_CACHE=ON
-DCPACK_NSIS_EXECUTABLE=/clang64/bin/makensis.exe
CCACHE_MAXSIZE: 0
CCACHE_NOCOMPRESS: 1
MAKEFLAGS: -j2
steps:
- name: Check out
uses: actions/checkout@v3
with:
fetch-depth: 0
submodules: recursive
- name: Cache msys2 dependencies
id: cache-deps
uses: actions/cache@v3
with:
key: windows-arm64-${{ hashFiles('.github/workflows/deps-msys2-clangarm64.txt') }}
restore-keys: |
windows-arm64-
path: \msys64\var\cache\pacman\pkg
- name: Install msys2
uses: msys2/setup-msys2@v2
with:
msystem: CLANGARM64
update: true
- name: Install dependencies
run: pacman --needed --noconfirm -S - < .github/workflows/deps-msys2-clangarm64.txt
- name: Cache ccache data
uses: actions/cache@v3
with:
key: ccache-${{ github.job }}-${{ github.ref }}-${{ github.run_id }}
restore-keys: |
ccache-${{ github.job }}-${{ github.ref }}-
ccache-${{ github.job }}-
path: ~\AppData\Local\ccache
- name: Configure
run: |
/clang64/bin/ccache.exe --zero-stats
cmake -B build $CMAKE_OPTS
- name: Build
run: cmake --build build
- name: Package
run: cmake --build build --target package
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: windows-arm64
path: build\lmms-*.exe
- name: Trim ccache and print statistics
run: |
/clang64/bin/ccache.exe --cleanup
echo "[ccache config]"
/clang64/bin/ccache.exe --show-config
echo "[ccache stats]"
/clang64/bin/ccache.exe --show-stats --verbose
env:
CCACHE_MAXSIZE: 500MB

View File

@@ -0,0 +1,25 @@
base
base-devel
filesystem
git
mingw-w64-clang-aarch64-SDL2
mingw-w64-clang-aarch64-ccache
mingw-w64-clang-aarch64-clang
mingw-w64-clang-aarch64-cmake
mingw-w64-clang-aarch64-fftw
mingw-w64-clang-aarch64-fltk
mingw-w64-clang-aarch64-fluidsynth
mingw-w64-clang-aarch64-libgig
mingw-w64-clang-aarch64-libsamplerate
mingw-w64-clang-aarch64-libsndfile
mingw-w64-clang-aarch64-lilv
mingw-w64-clang-aarch64-lv2
mingw-w64-clang-aarch64-qt5-base
mingw-w64-clang-aarch64-qt5-svg
mingw-w64-clang-aarch64-suil
mingw-w64-clang-aarch64-stk
mingw-w64-clang-x86_64-nsis
mingw-w64-clang-x86_64-ccache
msys2-runtime
perl-List-MoreUtils
perl-XML-Parser

2
.gitignore vendored
View File

@@ -10,3 +10,5 @@
/plugins/ZynAddSubFx/zynaddsubfx/doc/gen/Makefile
/data/locale/*.qm
Brewfile.lock.json
/.cache/
compile_commands.json

View File

@@ -1,4 +1,5 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.13)
SET(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Set the given policy to NEW. If it does not exist, it will not be set. If it
# is already set to NEW (most likely due to predating the minimum required CMake
@@ -633,11 +634,20 @@ ENDIF()
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DLMMS_DEBUG")
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DLMMS_DEBUG")
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
add_compile_definitions(NDEBUG)
SET(STATUS_ASSERTIONS "Disabled")
else()
remove_definitions(-DNDEBUG)
SET(STATUS_ASSERTIONS "Enabled")
endif()
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.16")
set(NOOP_COMMAND "${CMAKE_COMMAND}" "-E" "true")
else()
set(NOOP_COMMAND "${CMAKE_COMMAND}" "-E" "echo")
endif()
if(STRIP)
# TODO CMake 3.19: Now that CONFIG generator expressions support testing for
# multiple configurations, combine the OR into a single CONFIG expression.
@@ -864,6 +874,7 @@ MESSAGE(
"* Debug using UBSanitizer : ${STATUS_DEBUG_UBSAN}\n"
"* Debug packaging commands : ${STATUS_DEBUG_CPACK}\n"
"* Profile using GNU profiler : ${STATUS_GPROF}\n"
"* Debug assertions : ${STATUS_ASSERTIONS}\n"
)
MESSAGE(

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 B

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 833 B

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

After

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 B

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 B

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 B

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 B

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 844 B

After

Width:  |  Height:  |  Size: 844 B

View File

@@ -30,9 +30,8 @@ lmms--gui--AutomationEditor {
qproperty-barLineColor: #808080;
qproperty-graphColor: rgba(153, 175, 255, 200);
qproperty-scaleColor: qlineargradient(spread:reflect,
x1:0, y1:0.5, x2:1, y2:0.5,
stop:0 #333, stop:1 #202020);
qproperty-scaleColor: qlineargradient(spread:reflect, x1:0, y1:0.5, x2:1, y2:0.5,
stop:0 #333, stop:1 #202020);
qproperty-ghostNoteColor: rgba(248, 248, 255, 125);
qproperty-detuningNoteColor: rgba(248, 11, 11, 125);
@@ -69,7 +68,8 @@ QTextEdit, QLineEdit:focus, QComboBox:focus, QSpinBox:focus, QDoubleSpinBox:focu
QToolTip {
border-radius: 4px;
background: qlineargradient(spread:reflect, x1:0.5, y1:0.5, x2:0.5, y2:0, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(50, 50, 50, 220));
background: qlineargradient(spread:reflect, x1:0.5, y1:0.5, x2:0.5, y2:0,
stop:0 rgba(0, 0, 0, 255), stop:1 rgba(50, 50, 50, 220));
opacity: 175;
border: 1.0px solid rgba(0,0,0,255);
color: #4afd85;
@@ -77,7 +77,8 @@ QToolTip {
lmms--gui--TextFloat, lmms--gui--SimpleTextFloat {
border-radius: 4px;
background: qlineargradient(spread:reflect, x1:0.5, y1:0.5, x2:0.5, y2:0, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(50, 50, 50, 220));
background: qlineargradient(spread:reflect, x1:0.5, y1:0.5, x2:0.5, y2:0,
stop:0 rgba(0, 0, 0, 255), stop:1 rgba(50, 50, 50, 220));
opacity: 175;
border: 1.0px solid rgba(0,0,0,255);
color: #4afd85;
@@ -248,45 +249,39 @@ QScrollBar::add-page:vertical:pressed, QScrollBar::sub-page:vertical:pressed {
/* scrollbar: handles (sliders) */
QScrollBar::handle:horizontal {
background: qlineargradient(spread:reflect,
x1:0.5, y1:0, x2:0.5, y2:1,
stop:0 #969696, stop:0.5 #c9c9c9, stop:1 #aaa);
background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1,
stop:0 #969696, stop:0.5 #c9c9c9, stop:1 #aaa);
border: 1px outset #888;
border-radius: 2px;
min-width: 24px;
}
QScrollBar::handle:horizontal:hover {
background: qlineargradient(spread:reflect,
x1:0.5, y1:0, x2:0.5, y2:1,
stop:0 #969696, stop:0.5 #f0f0f0, stop:1 #aaa);
background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1,
stop:0 #969696, stop:0.5 #f0f0f0, stop:1 #aaa);
}
QScrollBar::handle:horizontal:pressed {
background: qlineargradient(spread:reflect,
x1:0.5, y1:0, x2:0.5, y2:1,
stop:0 #747474, stop:1 #c9c9c9);
background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1,
stop:0 #747474, stop:1 #c9c9c9);
}
QScrollBar::handle:vertical {
background: qlineargradient(spread:reflect,
x1:0, y1:0.5, x2:1, y2:0.5,
stop:0 #969696, stop:0.5 #c9c9c9, stop:1 #aaa);
background: qlineargradient(spread:reflect, x1:0, y1:0.5, x2:1, y2:0.5,
stop:0 #969696, stop:0.5 #c9c9c9, stop:1 #aaa);
border: 1px outset #888;
border-radius: 2px;
min-height: 24px;
}
QScrollBar::handle:vertical:hover {
background: qlineargradient(spread:reflect,
x1:0, y1:0.5, x2:1, y2:0.5,
stop:0 #969696, stop:0.5 #f0f0f0, stop:1 #aaa);
background: qlineargradient(spread:reflect, x1:0, y1:0.5, x2:1, y2:0.5,
stop:0 #969696, stop:0.5 #f0f0f0, stop:1 #aaa);
}
QScrollBar::handle:vertical:pressed {
background: qlineargradient(spread:reflect,
x1:0, y1:0.5, x2:1, y2:0.5,
stop:0 #747474, stop:1 #c9c9c9);
background: qlineargradient(spread:reflect, x1:0, y1:0.5, x2:1, y2:0.5,
stop:0 #747474, stop:1 #c9c9c9);
}
QScrollBar::handle:horizontal:disabled, QScrollBar::handle:vertical:disabled {
@@ -298,7 +293,8 @@ QScrollBar::handle:horizontal:disabled, QScrollBar::handle:vertical:disabled {
/* arrow buttons */
QScrollBar::add-line, QScrollBar::sub-line {
background: qradialgradient(cx:0.3, cy:0.3, radius:0.8, fx:0.3, fy:0.3, stop:0 #c9c9c9, stop:1 #969696 );
background: qradialgradient(cx:0.3, cy:0.3, radius:0.8, fx:0.3, fy:0.3,
stop:0 #c9c9c9, stop:1 #969696 );
border-radius: 1px;
border: 1px solid #131313;
subcontrol-origin: margin;
@@ -310,11 +306,13 @@ QScrollBar::add-line:vertical { subcontrol-position: bottom; height: 12px;}
QScrollBar::sub-line:vertical { subcontrol-position: top; height: 12px;}
QScrollBar::add-line:hover, QScrollBar::sub-line:hover {
background: qradialgradient(cx:0.3, cy:0.3, radius:0.8, fx:0.3, fy:0.3, stop:0 #e0e0e0, stop:0.5 #c9c9c9, stop:1 #969696 );
background: qradialgradient(cx:0.3, cy:0.3, radius:0.8, fx:0.3, fy:0.3,
stop:0 #e0e0e0, stop:0.5 #c9c9c9, stop:1 #969696 );
}
QScrollBar::add-line:pressed, QScrollBar::sub-line:pressed {
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #969696, stop:0.5 #c9c9c9, stop:1 #969696 );
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #969696,
stop:0.5 #c9c9c9, stop:1 #969696 );
}
QScrollBar::add-line:disabled, QScrollBar::sub-line:disabled {
@@ -356,8 +354,10 @@ lmms--gui--TrackView > QWidget {
/* track background config */
lmms--gui--TrackContentWidget {
/* colors */
qproperty-darkerColor: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(50, 50, 50), stop:0.33 rgb(20, 20, 20), stop:1 rgb(15, 15, 15));
qproperty-lighterColor: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(50, 50, 50), stop:0.33 rgb(40, 40, 40), stop:1 rgb(30, 30, 30));
qproperty-darkerColor: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 rgb(50, 50, 50), stop:0.33 rgb(20, 20, 20), stop:1 rgb(15, 15, 15));
qproperty-lighterColor: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 rgb(50, 50, 50), stop:0.33 rgb(40, 40, 40), stop:1 rgb(30, 30, 30));
qproperty-coarseGridColor: rgba(0, 0, 0, 160);
qproperty-fineGridColor: rgba(0, 0, 0, 80);
qproperty-horizontalColor: rgba(0, 0, 0, 160);
@@ -376,32 +376,61 @@ lmms--gui--TrackContentWidget {
/* gear button in tracks */
/* 20px = 1px border + 2px padding + 14px icon + 2px padding + 1px border */
QPushButton#btn-mute,
QPushButton#btn-mute-inv:checked,
QPushButton#btn-solo,
lmms--gui--TrackOperationsWidget QPushButton {
max-height: 26px;
max-width: 26px;
min-height: 26px;
min-width: 26px;
background: none;
border: none;
min-height: 14;
max-height: 14;
min-width: 14;
max-width: 14;
padding: 2;
border: 1 solid #0f1621;
border-top: 1 solid #18202b;
border-bottom: 1 solid #02060f;
border-radius: 4;
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 255, 255, 20%), stop:0.1 rgba(255, 255, 255, 2%), stop:0.9 rgba(0, 0, 0, 2%), stop:1 rgba(0, 0, 0, 40%));
}
lmms--gui--TrackOperationsWidget QPushButton::menu-indicator {
image: url("resources:trackop.png");
subcontrol-origin: padding;
subcontrol-position: center;
position: relative;
top: 1px;
image: none;
}
lmms--gui--TrackOperationsWidget QPushButton::menu-indicator:hover {
image: url("resources:trackop_h.png");
lmms--gui--TrackOperationsWidget QPushButton {
image: url("resources:gear.svg");
}
lmms--gui--TrackOperationsWidget QPushButton::menu-indicator:pressed,
lmms--gui--TrackOperationsWidget QPushButton::menu-indicator:checked {
image: url("resources:trackop_c.png");
position: relative;
top: 2px;
QPushButton#btn-mute,
QPushButton#btn-mute-inv:checked {
image: url("resources:speaker.svg");
}
QPushButton#btn-solo {
image: url("resources:headphones.svg");
}
QPushButton#btn-mute:hover,
QPushButton#btn-solo:hover,
lmms--gui--TrackOperationsWidget QPushButton:hover {
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 255, 255, 25%), stop:0.1 rgba(255, 255, 255, 7%), stop:0.9 transparent, stop:1 rgba(0, 0, 0, 35%));
}
lmms--gui--TrackOperationsWidget QPushButton:pressed {
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(0, 0, 0, 25%), stop:0.1 transparent, stop:0.8 rgba(0, 0, 0, 15%), stop:1 rgba(0, 0, 0, 35%));
}
QPushButton#btn-mute-inv,
QPushButton#btn-mute:checked {
image: url("resources:speaker_slash.svg");
border: 1 solid #890120;
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #e2515b, stop:0.1 #d40237, stop:0.9 #d40237, stop:1 #900122);
}
QPushButton#btn-solo:checked {
border: 1 solid #055f89;
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #5aa8d9, stop:0.1 #2696d1, stop:0.9 #2696d1, stop:1 #16638c);
}
/* actually has no effect yet so disabled */
@@ -544,7 +573,8 @@ QToolButton:pressed {
}
QToolButton:checked {
background: qradialgradient(cx:0.3, cy:0.3, radius:0.8, fx:0.3, fy:0.3, stop:0 #e0e0e0, stop:0.8 #c9c9c9, stop:1 #c0c0c0 );
background: qradialgradient(cx:0.3, cy:0.3, radius:0.8, fx:0.3, fy:0.3,
stop:0 #e0e0e0, stop:0.8 #c9c9c9, stop:1 #c0c0c0 );
padding: 2px 1px 0px 1px;
color: black;
}
@@ -578,7 +608,8 @@ lmms--gui--TrackLabelButton {
}
lmms--gui--TrackLabelButton:hover {
background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:0.5, stop:0 #5b6571, stop:0.75 #7b838d, stop:1 #7b838d );
background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:0.5,
stop:0 #5b6571, stop:0.75 #7b838d, stop:1 #7b838d );
color: white;
border: 1px solid rgba(0,0,0,64);
padding: 1px 0px;
@@ -586,7 +617,8 @@ lmms--gui--TrackLabelButton:hover {
}
lmms--gui--TrackLabelButton:pressed {
background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #49515b, stop:0.3 #5b6571, stop:1 #6b7581 );
background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1,
stop:0 #49515b, stop:0.3 #5b6571, stop:1 #6b7581 );
color: white;
border: 1px solid rgba(0,0,0,64);
padding: 2px 0px 0px;
@@ -594,7 +626,8 @@ lmms--gui--TrackLabelButton:pressed {
}
lmms--gui--TrackLabelButton:checked {
background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #49515b, stop:0.3 #5b6571, stop:1 #6b7581 );
background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1,
stop:0 #49515b, stop:0.3 #5b6571, stop:1 #6b7581 );
color: white;
border: 1px solid rgba(0,0,0,128);
padding: 2px 0px 0px;
@@ -602,17 +635,19 @@ lmms--gui--TrackLabelButton:checked {
}
lmms--gui--TrackLabelButton:checked:hover {
background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:0.5, stop:0 #5b6571, stop:0.75 #7b838d, stop:1 #7b838d );
background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:0.5,
stop:0 #5b6571, stop:0.75 #7b838d, stop:1 #7b838d );
}
lmms--gui--TrackLabelButton:checked:pressed {
background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #49515b, stop:0.3 #5b6571, stop:1 #6b7581 );
background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1,
stop:0 #49515b, stop:0.3 #5b6571, stop:1 #6b7581 );
}
/* sidebar, sidebar buttons */
lmms--gui--SideBar {
background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop: 0 #98a2a7, stop: 1.0 #5b646f);
background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #98a2a7, stop:1 #5b646f);
}
lmms--gui--SideBar QToolButton {
@@ -649,8 +684,7 @@ lmms--gui--ControllerRackView QPushButton {
lmms--gui--MixerChannelView {
background: #5b6571;
color: #e0e0e0;
qproperty-backgroundActive: qlineargradient(spread:reflect, x1:0, y1:0, x2:1, y2:0,
stop:0 #7b838d, stop:1 #6b7581 );
qproperty-backgroundActive: #7d8691;
qproperty-strokeOuterActive: rgb( 0, 0, 0 );
qproperty-strokeOuterInactive: rgba( 0, 0, 0, 50 );
qproperty-strokeInnerActive: rgba( 255, 255, 255, 100 );
@@ -684,16 +718,14 @@ lmms--gui--TimeLineWidget {
min-height: 1.5em;
max-height: 1.5em;
background-color: qlineargradient( x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #8796a7, stop: 1.0 #3e454e );
background-color: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop:0 #8796a7, stop:1 #3e454e );
qproperty-inactiveLoopColor: rgba( 52, 63, 53, 64 );
qproperty-inactiveLoopBrush: rgba( 255, 255, 255, 32 );
qproperty-inactiveLoopInnerColor: rgba( 255, 255, 255, 32 );
qproperty-inactiveLoopHandleColor: rgba( 192, 192, 192, 100 );
qproperty-activeLoopColor: rgba( 52, 63, 53, 255 );
qproperty-activeLoopBrush: qlineargradient( x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #378d59, stop: 1.0 #297e36 );
qproperty-activeLoopBrush: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop:0 #378d59, stop:1 #297e36 );
qproperty-activeLoopInnerColor: rgba( 74, 155, 100, 255 );
qproperty-activeLoopHandleColor: rgba( 192, 192, 192, 200 );
@@ -729,6 +761,7 @@ lmms--gui--ClipView {
qproperty-textBackgroundColor: rgba(0, 0, 0, 75);
qproperty-textShadowColor: rgb( 0, 0, 0 );
qproperty-gradient: true; /* boolean property, set true to have a gradient */
qproperty-markerColor: rgb(0, 0, 0);
/* finger tip offset of cursor */
qproperty-mouseHotspotHand: 3px 3px;
qproperty-mouseHotspotKnife: 0px 0px;
@@ -766,10 +799,8 @@ lmms--gui--PatternClipView {
/* Subwindows in MDI-Area */
lmms--gui--SubWindow {
color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #4b525c, stop: 1.0 #31363d);
qproperty-activeColor: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #33383e, stop: 1.0 #1a1c20);
color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #4b525c, stop:1 #31363d);
qproperty-activeColor: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #33383e, stop:1 #1a1c20);
qproperty-textShadowColor: rgb( 0, 0, 0 );
qproperty-borderColor: rgb( 0, 0, 0 );
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

View File

@@ -0,0 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" width="23" height="30">
<defs>
<linearGradient id="a">
<stop offset="0" stop-color="#1c1f24"/>
<stop offset="1" stop-color="#2c3138"/>
</linearGradient>
<linearGradient id="b">
<stop offset="0" stop-color="#08a342"/>
<stop offset="1" stop-color="#0bd556"/>
</linearGradient>
<linearGradient xlink:href="#a" id="c" x1="16" x2="16" y1="27.5" y2="4.5" gradientTransform="matrix(.52168 0 0 1.04337 3.15242 -2.19516)" gradientUnits="userSpaceOnUse"/>
<linearGradient xlink:href="#b" id="d" x1="4" x2="16" y1="8" y2="8" gradientTransform="translate(4.16667 11.33333) scale(.45833)" gradientUnits="userSpaceOnUse" spreadMethod="reflect"/>
</defs>
<rect width="12" height="24" x="5.5" y="2.5" fill="url(#c)" stroke="#000" stroke-linecap="round" rx="2.065" ry="2.065"/>
<path stroke="url(#d)" stroke-width="2" d="M6 15h11"/>
<path fill="#fff" d="M7.56445 3C6.6888 3 6 3.6888 6 4.56445v1C6 4.6888 6.6888 4 7.56445 4h7.8711C16.3112 4 17 4.6888 17 5.56445v-1C17 3.6888 16.3112 3 15.43555 3h-7.8711z" opacity=".1"/>
<path fill="#000" d="M7.56445 26C6.6888 26 6 25.3112 6 24.43555v-1C6 24.3112 6.6888 25 7.56445 25h7.8711C16.3112 25 17 24.3112 17 23.43555v1C17 25.3112 16.3112 26 15.43555 26Z" opacity=".3"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xml:space="preserve" width="18" height="18" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata>
<rdf:RDF>
<cc:Work>
<cc:license rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:creator>
<cc:Agent>
<dc:title>Fawn Sannar</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<path fill="#fff" d="M 8.0270042,0 C 7.4980619,0 7.0727071,0.42536378 7.0727071,0.95430605 V 1.2056263 h -0.00879 A 2.5096571,2.5096571 0 0 1 6.7317557,2.4604548 2.5096571,2.5096571 0 0 1 3.3046852,3.3795958 L 3.088521,3.2548175 C 2.6304487,2.9903509 2.0489568,3.146479 1.7844812,3.6045513 L 0.74934417,5.3954217 C 0.48487753,5.853494 0.64100562,6.4367405 1.0990779,6.7012162 l 0.2179369,0.1265329 -0.00352,0.00527 a 2.5096571,2.5096571 0 0 1 0.9226683,0.9121314 2.5096571,2.5096571 0 0 1 -0.884012,3.4077155 l -0.2530749,0.14587 c -0.45807228,0.264475 -0.61420037,0.845967 -0.34973373,1.30404 l 1.03515503,1.792616 c 0.2644576,0.458072 0.8459585,0.614209 1.3040308,0.349733 l 0.2214462,-0.128296 a 2.5096571,2.5096571 0 0 1 0.00175,-0.0017 2.5096571,2.5096571 0 0 1 1.2530739,-0.333924 2.5096571,2.5096571 0 0 1 2.5078934,2.493857 v 0.268884 c 0,0.528943 0.4253638,0.956061 0.9543061,0.956061 h 2.0685381 c 0.528942,0 0.95606,-0.427118 0.95606,-0.956061 V 16.78911 h 0.02987 a 2.5096571,2.5096571 0 0 1 0.30756,-1.256592 2.5096571,2.5096571 0 0 1 2.052718,-1.253074 2.5096571,2.5096571 0 0 1 1.323368,0.311068 l 0.268894,0.154661 c 0.458081,0.264476 1.039564,0.108339 1.30404,-0.349733 l 1.035155,-1.792616 c 0.264457,-0.458073 0.108338,-1.039565 -0.349743,-1.30404 l -0.221446,-0.128288 0.01582,-0.02812 A 2.5096571,2.5096571 0 0 1 15.884635,10.247783 2.5096571,2.5096571 0 0 1 16.749301,6.8593868 L 17.023468,6.7012162 C 17.48154,6.4367405 17.637677,5.853494 17.373202,5.3954217 L 16.338065,3.6045513 C 16.073598,3.146479 15.492106,2.9903509 15.034025,3.2548175 l -0.216164,0.1247783 -0.0053,-0.00878 A 2.5096571,2.5096571 0 0 1 13.555995,3.7117561 2.5096571,2.5096571 0 0 1 11.051611,1.2442826 V 0.95430605 C 11.051611,0.42536378 10.624493,0 10.095551,0 Z M 9.2115297,5.8541149 A 3.1493764,3.1493764 0 0 1 11.787981,7.4252938 3.1493764,3.1493764 0 0 1 10.636838,11.727567 3.1493764,3.1493764 0 0 1 6.3345653,10.574661 3.1493764,3.1493764 0 0 1 7.487462,6.2723881 3.1493764,3.1493764 0 0 1 9.2115387,5.8541059 Z" />
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xml:space="preserve"
width="14"
height="14"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs1" />
<title
id="title1">LMMS solo button (inactive)</title>
<metadata
id="metadata1">
<rdf:RDF>
<cc:Work>
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:title>LMMS solo button (inactive)</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Rebecca Noel Ati, Stakeout Punch</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /></cc:License></rdf:RDF>
</metadata>
<path
id="headphones"
fill="#fff"
d="m 7,1.0000248 c -1.472525,0.00403 -2.993968,0.4818935 -4.136604,1.5 C 1.72076,3.5181313 1,5.0872298 1,7.000025 c 0,1.60032 0,3.357065 0,5 0,0.5 0.5,1 1,1 h 2 c 0.5,0 1,-0.5 1,-1 v -3 c 0,-0.5 -0.5,-1 -1,-1 H 3 c 0,-0.5 0,-0.5 0,-1 C 3,5.5885998 3.513729,4.6525728 4.246094,4.0000248 4.978458,3.3474773 5.972523,3.0028343 7,3.0000248 8.027475,2.9972148 9.03517,3.3544188 9.765625,4.0039313 10.490632,4.6486008 10.992038,5.5905738 11,7.000025 v 1 h -1 c -0.5,0 -1,0.5 -1,1 v 3 c 0,0.5 0.5,1 1,1 h 2 c 0.5,0 1,-0.5 1,-1 v -5 C 12.992284,5.0891328 12.265582,3.5121893 11.127288,2.5000248 9.982744,1.4823023 8.472523,0.9959983 7,1.0000248 Z"
style="fill:#ffffff;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xml:space="preserve" width="20" height="20" version="1.1"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title>LMMS mute button (active)</title>
<metadata>
<rdf:RDF>
<cc:Work>
<cc:license rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:title>LMMS mute button (active)</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Rebecca Noel Ati, Stakeout Punch</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<rect width="19" height="19" x=".5" y=".5" fill="#d40237"
stroke="#890120" stroke-linecap="round" stroke-linejoin="bevel"
ry="2.065" id="button" />
<path id="highlight" fill="#fff" opacity=".1"
d="M2.56445 1C1.6888 1 1 1.6888 1 2.56445V3c0-.554.446-1 1-1h16c.554 0 1 .446 1 1v-.43555C19 1.6888 18.3112 1 17.43555 1Z" />
<path id="shadow" fill="#000" opacity=".1"
d="M2.56445 19C1.6888 19 1 18.3112 1 17.43555V17c0 .554.446 1 1 1h16c.554 0 1-.446 1-1v.43555C19 18.3112 18.3112 19 17.43555 19Z" />
<path id="speaker-cut" fill="#fff"
d="m 5,4.0000001 -0.5,0.5 -0.5,0.5 1.95508,1.95508 L 10,11 l 1,1 1,1 1,1 1,1 1,1 0.5,-0.5 L 16,15 14.9336,13.9336 C 15.89052,12.66885 16.36719,11.34907 16.36719,10 16.36719,8.2666701 15.58249,6.5825001 14,5.0000001 l -1,1 c 1.4175,1.4175 2,2.73334 2,3.9999999 0,0.94192 -0.32225,1.9118 -1.07031,2.9297 L 12.94336,11.94336 C 13.42336,11.30872 13.70312,10.6884 13.70312,10 13.70312,8.9389001 13.04125,8.0412501 12,7.0000001 l -1,1 c 0.95875,0.95876 1.375,1.56111 1.375,1.9999999 0,0.2501 -0.13605,0.5534 -0.4297,0.94531 L 10,9.0000101 v -5 H 9.5 c -0.5,0 -0.5,0 -1,0.5 l -1.5,1.5 z m -1,3 c -0.5,0 -1,0.44021 -1,1 V 12 c 0,0.5 0.5,1 1,1 h 1.5 c 0.5,0 0.5,0 1,0.5 l 2,2 C 9,16 9,16 9.5,16 H 10 v -3 z" />
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xml:space="preserve" width="20" height="20" version="1.1"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title>LMMS mute button (inactive)</title>
<metadata>
<rdf:RDF>
<cc:Work>
<cc:license rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:title>LMMS mute button (inactive)</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Rebecca Noel Ati, Stakeout Punch</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<rect width="19" height="19" x=".5" y=".5" fill="transparent"
stroke="#000" stroke-linecap="round" stroke-linejoin="bevel"
stroke-opacity="0.5" ry="2.065" id="button" />
<path id="highlight" fill="#fff" opacity=".1"
d="M2.56445 1C1.6888 1 1 1.6888 1 2.56445V3c0-.554.446-1 1-1h16c.554 0 1 .446 1 1v-.43555C19 1.6888 18.3112 1 17.43555 1Z" />
<path id="shadow" fill="#000" opacity=".1"
d="M2.56445 19C1.6888 19 1 18.3112 1 17.43555V17c0 .554.446 1 1 1h16c.554 0 1-.446 1-1v.43555C19 18.3112 18.3112 19 17.43555 19Z" />
<path id="speaker" fill="#fff"
d="m 9.3339845,4.0000002 c -0.341797,0.00684 -0.3964845,0.0625 -0.8339845,0.5 l -2,2 c -0.5,0.5 -0.5,0.5 -1,0.5 H 4 c -0.5,0 -1,0.440207 -1,1 V 12 c 0,0.5 0.5,1 1,1 h 1.5 c 0.5,0 0.5,0 1,0.5 l 2,2 C 9,16 9,16 9.5,16 H 10 V 4.0000002 H 9.5 c -0.0625,0 -0.1172,-9.765e-4 -0.1660155,0 z m 4.6660155,1 -1,1 C 14.417505,7.4175047 15,8.7333337 15,10 c 0,1.266665 -0.582495,2.582495 -2,4 l 1,1 c 1.582495,-1.582495 2.367188,-3.266665 2.367188,-5 0,-1.7333348 -0.784693,-3.4175038 -2.367188,-4.9999998 z m -2,2 -1,1 c 0.95875,0.958755 1.375,1.56111 1.375,1.9999998 0,0.4389 -0.41625,1.04125 -1.375,2 l 1,1 c 1.04125,-1.04125 1.703125,-1.938885 1.703125,-3 C 13.703125,8.9388902 13.04125,8.0412492 12,7.0000002 Z" />
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xml:space="preserve" width="20" height="20" version="1.1"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title>LMMS solo button (active)</title>
<metadata>
<rdf:RDF>
<cc:Work>
<cc:license rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:title>LMMS solo button (active)</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Rebecca Noel Ati, Stakeout Punch</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<rect width="19" height="19" x=".5" y=".5" fill="#2696d1"
stroke="#055f89" stroke-linecap="round" stroke-linejoin="bevel"
ry="2.065" id="button" />
<path id="highlight" fill="#fff" opacity=".1"
d="M2.56445 1C1.6888 1 1 1.6888 1 2.56445V3c0-.554.446-1 1-1h16c.554 0 1 .446 1 1v-.43555C19 1.6888 18.3112 1 17.43555 1Z" />
<path id="shadow" fill="#000" opacity=".1"
d="M2.56445 19C1.6888 19 1 18.3112 1 17.43555V17c0 .554.446 1 1 1h16c.554 0 1-.446 1-1v.43555C19 18.3112 18.3112 19 17.43555 19Z" />
<path id="headphones" fill="#fff"
d="m 10,4.0000248 c -1.472525,0.00403 -2.993968,0.4818935 -4.136604,1.5 C 4.72076,6.5181313 4,8.0872298 4,10.000025 c 0,1.60032 0,3.357065 0,5 0,0.5 0.5,1 1,1 h 2 c 0.5,0 1,-0.5 1,-1 v -3 c 0,-0.5 -0.5,-1 -1,-1 H 6 c 0,-0.5 0,-0.5 0,-1 0,-1.4114252 0.513729,-2.3474522 1.246094,-3.0000002 0.732364,-0.6525475 1.726429,-0.9971905 2.753906,-1 1.027475,-0.00281 2.03517,0.354394 2.765625,1.0039065 C 13.490632,7.6486008 13.992038,8.5905738 14,10.000025 v 1 h -1 c -0.5,0 -1,0.5 -1,1 v 3 c 0,0.5 0.5,1 1,1 h 2 c 0.5,0 1,-0.5 1,-1 v -5 C 15.992284,8.0891328 15.265582,6.5121893 14.127288,5.5000248 12.982744,4.4823023 11.472523,3.9959983 10,4.0000248 Z" />
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xml:space="preserve" width="20" height="20" version="1.1"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title>LMMS solo button (inactive)</title>
<metadata>
<rdf:RDF>
<cc:Work>
<cc:license rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:title>LMMS solo button (inactive)</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Rebecca Noel Ati, Stakeout Punch</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<rect width="19" height="19" x=".5" y=".5" fill="transparent"
stroke="#000" stroke-linecap="round" stroke-linejoin="bevel"
stroke-opacity="0.5" ry="2.065" id="button" />
<path id="highlight" fill="#fff" opacity=".1"
d="M2.56445 1C1.6888 1 1 1.6888 1 2.56445V3c0-.554.446-1 1-1h16c.554 0 1 .446 1 1v-.43555C19 1.6888 18.3112 1 17.43555 1Z" />
<path id="shadow" fill="#000" opacity=".1"
d="M2.56445 19C1.6888 19 1 18.3112 1 17.43555V17c0 .554.446 1 1 1h16c.554 0 1-.446 1-1v.43555C19 18.3112 18.3112 19 17.43555 19Z" />
<path id="headphones" fill="#fff"
d="m 10,4.0000248 c -1.472525,0.00403 -2.993968,0.4818935 -4.136604,1.5 C 4.72076,6.5181313 4,8.0872298 4,10.000025 c 0,1.60032 0,3.357065 0,5 0,0.5 0.5,1 1,1 h 2 c 0.5,0 1,-0.5 1,-1 v -3 c 0,-0.5 -0.5,-1 -1,-1 H 6 c 0,-0.5 0,-0.5 0,-1 0,-1.4114252 0.513729,-2.3474522 1.246094,-3.0000002 0.732364,-0.6525475 1.726429,-0.9971905 2.753906,-1 1.027475,-0.00281 2.03517,0.354394 2.765625,1.0039065 C 13.490632,7.6486008 13.992038,8.5905738 14,10.000025 v 1 h -1 c -0.5,0 -1,0.5 -1,1 v 3 c 0,0.5 0.5,1 1,1 h 2 c 0.5,0 1,-0.5 1,-1 v -5 C 15.992284,8.0891328 15.265582,6.5121893 14.127288,5.5000248 12.982744,4.4823023 11.472523,3.9959983 10,4.0000248 Z" />
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xml:space="preserve"
width="14"
height="14"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title
>LMMS mute button (inactive)</title>
<metadata
id="metadata1">
<rdf:RDF>
<cc:Work>
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:title>LMMS mute button (inactive)</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Rebecca Noel Ati, Stakeout Punch</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /></cc:License></rdf:RDF>
</metadata>
<path
id="speaker"
fill="#fff"
d="M 6.3339845,1.000434 C 5.9921875,1.007274 5.9375,1.062934 5.5,1.500434 l -2,2 c -0.5,0.5 -0.5,0.5 -1,0.5 H 1 c -0.5,0 -1,0.440207 -1,1 v 3.9999998 c 0,0.5 0.5,1.0000002 1,1.0000002 h 1.5 c 0.5,0 0.5,0 1,0.5 l 2,2 c 0.5,0.5 0.5,0.5 1,0.5 H 7 v -12 H 6.5 c -0.0625,0 -0.1172,-9.765e-4 -0.1660155,0 z m 4.6660155,1 -1,1 c 1.417505,1.4175045 2,2.7333335 2,3.9999998 0,1.266665 -0.582495,2.582495 -2,4.0000002 l 1,1 C 12.582495,10.417939 13.367188,8.7337688 13.367188,7.0004338 13.367188,5.267099 12.582495,3.58293 11,2.000434 Z m -2,2 -1,1 c 0.95875,0.958755 1.375,1.56111 1.375,1.9999998 0,0.4389 -0.41625,1.04125 -1.375,2 L 9,10.000434 C 10.04125,8.9591838 10.703125,8.0615488 10.703125,7.0004338 10.703125,5.939324 10.04125,5.041683 9,4.000434 Z"
style="fill:#ffffff;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xml:space="preserve"
width="14"
height="14"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs1" />
<title
id="title1">LMMS mute button (active)</title>
<metadata
id="metadata1">
<rdf:RDF>
<cc:Work>
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:title>LMMS mute button (active)</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Rebecca Noel Ati, Stakeout Punch</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /></cc:License></rdf:RDF>
</metadata>
<path
id="speaker-cut"
fill="#fff"
d="M 2,1 1.5,1.5 1,2 2.95508,3.95508 7,7.9999999 l 1,1 1,1 L 10,11 l 1,1 1,1 0.5,-0.5 L 13,12 11.9336,10.9336 C 12.89052,9.6688499 13.36719,8.3490699 13.36719,6.9999999 13.36719,5.26667 12.58249,3.5825 11,2 l -1,1 c 1.4175,1.4175 2,2.73334 2,3.9999999 0,0.94192 -0.32225,1.9118 -1.07031,2.9297 l -0.98633,-0.98634 c 0.48,-0.63464 0.75976,-1.25496 0.75976,-1.94336 C 10.70312,5.9389 10.04125,5.04125 9,4 L 8,5 c 0.95875,0.95876 1.375,1.56111 1.375,1.9999999 0,0.2501 -0.13605,0.5534 -0.4297,0.94531 L 7,6.00001 v -5 H 6.5 c -0.5,0 -0.5,0 -1,0.5 l -1.5,1.5 z M 1,4 C 0.5,4 0,4.44021 0,5 v 3.9999999 c 0,0.5 0.5,1 1,1 h 1.5 c 0.5,0 0.5,0 1,0.5000001 l 2,2 C 6,13 6,13 6.5,13 H 7 V 9.9999999 Z"
style="fill:#ffffff;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 264 B

View File

@@ -387,6 +387,24 @@ lmms--gui--TrackView > QWidget {
}
QPushButton#btn {
color: #d1d8e4;
padding: 2 4;
border: 1 solid #000;
border-radius: 3;
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 255, 255, 20%), stop:0.1 rgba(255, 255, 255, 4%), stop:0.9 rgba(0, 0, 0, 4%), stop:1 rgba(0, 0, 0, 40%));
}
QPushButton#btn:hover {
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 255, 255, 25%), stop:0.1 rgba(255, 255, 255, 7%), stop:0.9 rgba(255, 255, 255, 4%), stop:1 rgba(0, 0, 0, 35%));
}
QPushButton#btn:pressed,
QPushButton#btn:checked {
color: #02ee89;
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(0, 0, 0, 25%), stop:0.1 transparent, stop:0.9 rgba(0, 0, 0, 15%), stop:1 rgba(0, 0, 0, 35%));
}
/* autoscroll, loop, stop behaviour toggle buttons */
/* track background config */
@@ -412,30 +430,64 @@ lmms--gui--TrackContentWidget {
/* gear button in tracks */
/* 20px = 1px border + 2px padding + 14px icon + 2px padding + 1px border */
QPushButton#btn-mute,
QPushButton#btn-mute-inv:checked,
QPushButton#btn-solo,
lmms--gui--TrackOperationsWidget QPushButton {
max-height: 26px;
max-width: 26px;
min-height: 26px;
min-width: 26px;
background: none;
border: none;
min-height: 14;
max-height: 14;
min-width: 14;
max-width: 14;
padding: 2;
border: 1 solid #0f1621;
border-top: 1 solid #18202b;
border-bottom: 1 solid #02060f;
border-radius: 2;
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 255, 255, 20%), stop:0.1 rgba(255, 255, 255, 2%), stop:0.9 rgba(0, 0, 0, 2%), stop:1 rgba(0, 0, 0, 40%));
}
lmms--gui--TrackOperationsWidget QPushButton::menu-indicator {
image: url("resources:trackop.png");
subcontrol-origin: padding;
subcontrol-position: center;
position: relative;
top: 1px;
image: none;
}
lmms--gui--TrackOperationsWidget QPushButton::menu-indicator:pressed,
lmms--gui--TrackOperationsWidget QPushButton::menu-indicator:checked {
image: url("resources:trackop.png");
position: relative;
top: 2px;
lmms--gui--TrackOperationsWidget QPushButton {
image: url("resources:gear.svg");
}
QPushButton#btn-mute,
QPushButton#btn-mute-inv:checked {
image: url("resources:speaker.svg");
}
QPushButton#btn-solo {
image: url("resources:headphones.svg");
}
QPushButton#btn-mute:hover,
QPushButton#btn-solo:hover,
lmms--gui--TrackOperationsWidget QPushButton:hover {
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 255, 255, 25%), stop:0.1 rgba(255, 255, 255, 7%), stop:0.9 transparent, stop:1 rgba(0, 0, 0, 35%));
}
lmms--gui--TrackOperationsWidget QPushButton:pressed {
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(0, 0, 0, 25%), stop:0.1 transparent, stop:0.8 rgba(0, 0, 0, 15%), stop:1 rgba(0, 0, 0, 35%));
}
QPushButton#btn-mute-inv,
QPushButton#btn-mute:checked {
image: url("resources:speaker_slash.svg");
border: 1 solid #890120;
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #e2515b, stop:0.1 #d40237, stop:0.9 #d40237, stop:1 #900122);
}
QPushButton#btn-solo:checked {
border: 1 solid #055f89;
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #5aa8d9, stop:0.1 #2696d1, stop:0.9 #2696d1, stop:1 #16638c);
}
/* font sizes */
lmms--gui--Sf2InstrumentView > QLabel {
@@ -770,6 +822,7 @@ lmms--gui--ClipView {
qproperty-textBackgroundColor: rgba(0, 0, 0, 75);
qproperty-textShadowColor: rgba(0,0,0,200);
qproperty-gradient: false; /* boolean property, set true to have a gradient */
qproperty-markerColor: rgb(0, 0, 0);
/* finger tip offset of cursor */
qproperty-mouseHotspotHand: 7px 2px;
qproperty-mouseHotspotKnife: 0px 0px;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 B

276
include/AudioBufferView.h Normal file
View File

@@ -0,0 +1,276 @@
/*
* AudioBufferView.h - Non-owning views for interleaved and
* non-interleaved (planar) buffers
*
* Copyright (c) 2025 Dalton Messmer <messmer.dalton/at/gmail.com>
*
* This file is part of LMMS - https://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#ifndef LMMS_AUDIO_BUFFER_VIEW_H
#define LMMS_AUDIO_BUFFER_VIEW_H
#include <cassert>
#include <span>
#include <type_traits>
#include "LmmsTypes.h"
namespace lmms
{
//! Use when the number of channels is not known at compile time
inline constexpr auto DynamicChannelCount = static_cast<proc_ch_t>(-1);
namespace detail {
// For static channel count
template<typename SampleT, proc_ch_t channelCount>
class BufferViewData
{
public:
constexpr BufferViewData() = default;
constexpr BufferViewData(const BufferViewData&) = default;
constexpr BufferViewData(SampleT* data, proc_ch_t channels, f_cnt_t frames) noexcept
: m_data{data}
, m_frames{frames}
{
assert(channels == channelCount);
}
constexpr BufferViewData(SampleT* data, f_cnt_t frames) noexcept
: m_data{data}
, m_frames{frames}
{
}
constexpr auto data() const noexcept -> SampleT* { return m_data; }
constexpr auto channels() const noexcept -> proc_ch_t { return channelCount; }
constexpr auto frames() const noexcept -> f_cnt_t { return m_frames; }
protected:
SampleT* m_data = nullptr;
f_cnt_t m_frames = 0;
};
// For dynamic channel count
template<typename SampleT>
class BufferViewData<SampleT, DynamicChannelCount>
{
public:
constexpr BufferViewData() = default;
constexpr BufferViewData(const BufferViewData&) = default;
constexpr BufferViewData(SampleT* data, proc_ch_t channels, f_cnt_t frames) noexcept
: m_data{data}
, m_channels{channels}
, m_frames{frames}
{
assert(channels != DynamicChannelCount);
}
constexpr auto data() const noexcept -> SampleT* { return m_data; }
constexpr auto channels() const noexcept -> proc_ch_t { return m_channels; }
constexpr auto frames() const noexcept -> f_cnt_t { return m_frames; }
protected:
SampleT* m_data = nullptr;
proc_ch_t m_channels = 0;
f_cnt_t m_frames = 0;
};
} // namespace detail
/**
* Non-owning view for multi-channel interleaved audio data
*
* TODO C++23: Use std::mdspan?
*/
template<typename SampleT, proc_ch_t channelCount = DynamicChannelCount>
class InterleavedBufferView : public detail::BufferViewData<SampleT, channelCount>
{
using Base = detail::BufferViewData<SampleT, channelCount>;
public:
using Base::Base;
//! Contruct const from mutable (static channel count)
template<typename T = SampleT> requires (std::is_const_v<T> && channelCount != DynamicChannelCount)
constexpr InterleavedBufferView(InterleavedBufferView<std::remove_const_t<T>, channelCount> other) noexcept
: Base{other.data(), other.frames()}
{
}
//! Contruct const from mutable (dynamic channel count)
template<typename T = SampleT> requires (std::is_const_v<T> && channelCount == DynamicChannelCount)
constexpr InterleavedBufferView(InterleavedBufferView<std::remove_const_t<T>, channelCount> other) noexcept
: Base{other.data(), other.channels(), other.frames()}
{
}
//! Construct dynamic channel count from static
template<proc_ch_t otherChannels>
requires (channelCount == DynamicChannelCount && otherChannels != DynamicChannelCount)
constexpr InterleavedBufferView(InterleavedBufferView<SampleT, otherChannels> other) noexcept
: Base{other.data(), otherChannels, other.frames()}
{
}
constexpr auto empty() const noexcept -> bool
{
return !this->m_data || this->channels() == 0 || this->m_frames == 0;
}
//! @return the frame at the given index
constexpr auto frame(f_cnt_t index) const noexcept
{
if constexpr (channelCount == DynamicChannelCount)
{
return std::span<SampleT>{framePtr(index), this->channels()};
}
else
{
return std::span<SampleT, channelCount>{framePtr(index), this->channels()};
}
}
/**
* @return pointer to the frame at the given index.
* The size of the frame is `channels()`.
*/
constexpr auto framePtr(f_cnt_t index) const noexcept -> SampleT*
{
assert(index < this->m_frames);
return this->m_data + index * this->channels();
}
/**
* @return pointer to the frame at the given index.
* The size of the frame is `channels()`.
*/
constexpr auto operator[](f_cnt_t index) const noexcept -> SampleT*
{
return framePtr(index);
}
};
// Check that the std::span-like space optimization works
static_assert(sizeof(InterleavedBufferView<float>) > sizeof(InterleavedBufferView<float, 2>));
static_assert(sizeof(InterleavedBufferView<float, 2>) == sizeof(void*) + sizeof(f_cnt_t));
/**
* Non-owning view for multi-channel non-interleaved audio data
*
* The data type is `SampleT* const*` which is a 2D array accessed as data[channel][frame index]
* where each channel's buffer contains `frames()` frames.
*
* TODO C++23: Use std::mdspan?
*/
template<typename SampleT, proc_ch_t channelCount = DynamicChannelCount>
class PlanarBufferView : public detail::BufferViewData<SampleT* const, channelCount>
{
using Base = detail::BufferViewData<SampleT* const, channelCount>;
public:
using Base::Base;
//! Contruct const from mutable (static channel count)
template<typename T = SampleT> requires (std::is_const_v<T> && channelCount != DynamicChannelCount)
constexpr PlanarBufferView(PlanarBufferView<std::remove_const_t<T>, channelCount> other) noexcept
: Base{other.data(), other.frames()}
{
}
//! Contruct const from mutable (dynamic channel count)
template<typename T = SampleT> requires (std::is_const_v<T> && channelCount == DynamicChannelCount)
constexpr PlanarBufferView(PlanarBufferView<std::remove_const_t<T>, channelCount> other) noexcept
: Base{other.data(), other.channels(), other.frames()}
{
}
//! Construct dynamic channel count from static
template<proc_ch_t otherChannels>
requires (channelCount == DynamicChannelCount && otherChannels != DynamicChannelCount)
constexpr PlanarBufferView(PlanarBufferView<SampleT, otherChannels> other) noexcept
: Base{other.data(), otherChannels, other.frames()}
{
}
constexpr auto empty() const noexcept -> bool
{
return !this->m_data || this->channels() == 0 || this->m_frames == 0;
}
//! @return the buffer of the given channel
constexpr auto buffer(proc_ch_t channel) const noexcept -> std::span<SampleT>
{
return {bufferPtr(channel), this->m_frames};
}
//! @return the buffer of the given channel
template<proc_ch_t channel> requires (channelCount != DynamicChannelCount)
constexpr auto buffer() const noexcept -> std::span<SampleT>
{
return {bufferPtr<channel>(), this->m_frames};
}
/**
* @return pointer to the buffer of the given channel.
* The size of the buffer is `frames()`.
*/
constexpr auto bufferPtr(proc_ch_t channel) const noexcept -> SampleT*
{
assert(channel < this->channels());
assert(this->m_data != nullptr);
return this->m_data[channel];
}
/**
* @return pointer to the buffer of the given channel.
* The size of the buffer is `frames()`.
*/
template<proc_ch_t channel> requires (channelCount != DynamicChannelCount)
constexpr auto bufferPtr() const noexcept -> SampleT*
{
static_assert(channel < channelCount);
assert(this->m_data != nullptr);
return this->m_data[channel];
}
/**
* @return pointer to the buffer of a given channel.
* The size of the buffer is `frames()`.
*/
constexpr auto operator[](proc_ch_t channel) const noexcept -> SampleT*
{
return bufferPtr(channel);
}
};
// Check that the std::span-like space optimization works
static_assert(sizeof(PlanarBufferView<float>) > sizeof(PlanarBufferView<float, 2>));
static_assert(sizeof(PlanarBufferView<float, 2>) == sizeof(void**) + sizeof(f_cnt_t));
} // namespace lmms
#endif // LMMS_AUDIO_BUFFER_VIEW_H

View File

@@ -28,7 +28,7 @@
#include <QMutex>
#include <samplerate.h>
#include "lmms_basics.h"
#include "LmmsTypes.h"
class QThread;

View File

@@ -34,7 +34,7 @@
#include <vector>
#include "AudioDevice.h"
#include "lmms_basics.h"
#include "LmmsTypes.h"
#include "SampleFrame.h"
#include "LocklessList.h"
#include "FifoBuffer.h"
@@ -50,7 +50,6 @@ class MidiClient;
class AudioBusHandle;
class AudioEngineWorkerThread;
constexpr fpp_t MINIMUM_BUFFER_SIZE = 32;
constexpr fpp_t DEFAULT_BUFFER_SIZE = 256;
constexpr fpp_t MAXIMUM_BUFFER_SIZE = 4096;
@@ -61,6 +60,8 @@ constexpr int BYTES_PER_FRAME = sizeof(SampleFrame);
constexpr float OUTPUT_SAMPLE_MULTIPLIER = 32767.0f;
constexpr auto SUPPORTED_SAMPLERATES = std::array{44100, 48000, 88200, 96000, 192000};
class LMMS_EXPORT AudioEngine : public QObject
{
Q_OBJECT

View File

@@ -29,7 +29,7 @@
#include <atomic>
#include <QFile>
#include "lmms_basics.h"
#include "LmmsTypes.h"
#include "MicroTimer.h"
namespace lmms

View File

@@ -53,11 +53,6 @@ namespace lmms
class MidiJack;
namespace gui
{
class LcdSpinBox;
}
class AudioJack : public QObject, public AudioDevice
{
@@ -82,13 +77,10 @@ public:
{
public:
setupWidget(QWidget* parent);
~setupWidget() override;
void saveSettings() override;
private:
QLineEdit* m_clientName;
gui::LcdSpinBox* m_channels;
};
private slots:
@@ -96,6 +88,7 @@ private slots:
private:
bool initJackClient();
void resizeInputBuffer(jack_nframes_t nframes);
void startProcessing() override;
void stopProcessing() override;
@@ -116,7 +109,9 @@ private:
std::atomic<MidiJack*> m_midiClient;
std::vector<jack_port_t*> m_outputPorts;
std::vector<jack_port_t*> m_inputPorts;
jack_default_audio_sample_t** m_tempOutBufs;
std::vector<SampleFrame> m_inputFrameBuffer;
SampleFrame* m_outBuf;
f_cnt_t m_framesDoneInCurBuf;

View File

@@ -68,7 +68,6 @@ public:
using TimemapIterator = timeMap::const_iterator;
AutomationClip( AutomationTrack * _auto_track );
AutomationClip( const AutomationClip & _clip_to_copy );
~AutomationClip() override = default;
bool addObject( AutomatableModel * _obj, bool _search_dup = true );
@@ -90,7 +89,7 @@ public:
void setTension( QString _new_tension );
TimePos timeMapLength() const;
void updateLength();
void updateLength() override;
TimePos putValue(
const TimePos & time,
@@ -196,12 +195,22 @@ public:
static int quantization() { return s_quantization; }
static void setQuantization(int q) { s_quantization = q; }
AutomationClip* clone() override
{
return new AutomationClip(*this);
}
void clearObjects() { m_objects.clear(); }
public slots:
void clear();
void objectDestroyed( lmms::jo_id_t );
void flipY( int min, int max );
void flipY();
void flipX( int length = -1 );
void flipX(int start = -1, int end = -1);
protected:
AutomationClip( const AutomationClip & _clip_to_copy );
private:
void cleanObjects();

View File

@@ -75,6 +75,8 @@ private:
QStaticText m_staticTextName;
void scaleTimemapToFit( float oldMin, float oldMax );
bool isResizableBeforeStart() override { return false; }
} ;

View File

@@ -37,7 +37,7 @@
#include "MidiClip.h"
#include "SampleClip.h"
#include "TimePos.h"
#include "lmms_basics.h"
#include "LmmsTypes.h"
#include "SampleThumbnail.h"
class QPainter;
@@ -74,6 +74,7 @@ class AutomationEditor : public QWidget, public JournallingObject
Q_PROPERTY(QColor ghostNoteColor MEMBER m_ghostNoteColor)
Q_PROPERTY(QColor detuningNoteColor MEMBER m_detuningNoteColor)
Q_PROPERTY(QColor ghostSampleColor MEMBER m_ghostSampleColor)
Q_PROPERTY(QColor outOfBoundsShade MEMBER m_outOfBoundsShade)
public:
void setCurrentClip(AutomationClip * new_clip);
void setGhostMidiClip(MidiClip* newMidiClip);
@@ -291,6 +292,7 @@ private:
QColor m_ghostNoteColor;
QColor m_detuningNoteColor;
QColor m_ghostSampleColor;
QColor m_outOfBoundsShade;
SampleThumbnail m_sampleThumbnail;

View File

@@ -31,7 +31,7 @@ class QString;
#include "lmms_export.h"
#include "interpolation.h"
#include "lmms_basics.h"
#include "LmmsTypes.h"
#include "lmms_math.h"
#include "Engine.h"
#include "AudioEngine.h"

View File

@@ -36,7 +36,9 @@
#include <cmath>
#include <numbers>
#include "lmms_basics.h"
#include "lmms_constants.h"
#include "LmmsTypes.h"
namespace lmms
{
@@ -207,7 +209,7 @@ public:
inline float update( float s, ch_cnt_t ch )
{
if (std::abs(s) < 1.0e-10f && std::abs(m_z1[ch]) < 1.0e-10f) { return 0.0f; }
if (std::abs(s) < F_EPSILON && std::abs(m_z1[ch]) < F_EPSILON) { return 0.0f; }
return m_z1[ch] = s * m_a0 + m_z1[ch] * m_b1;
}
@@ -593,7 +595,7 @@ public:
case FilterType::Formantfilter:
case FilterType::FastFormant:
{
if (std::abs(_in0) < 1.0e-10f && std::abs(m_vflast[0][_chnl]) < 1.0e-10f) { return 0.0f; } // performance hack - skip processing when the numbers get too small
if (std::abs(_in0) < F_EPSILON && std::abs(m_vflast[0][_chnl]) < F_EPSILON) { return 0.0f; } // performance hack - skip processing when the numbers get too small
const int os = m_type == FilterType::FastFormant ? 1 : 4; // no oversampling for fast formant
for( int o = 0; o < os; ++o )

View File

@@ -27,7 +27,7 @@
#define LMMS_BUFFER_MANAGER_H
#include "lmms_export.h"
#include "lmms_basics.h"
#include "LmmsTypes.h"
namespace lmms
{

View File

@@ -31,7 +31,7 @@
#include <QPixmap>
#include <QWidget>
#include "lmms_basics.h"
#include "LmmsTypes.h"
namespace lmms::gui

View File

@@ -100,12 +100,28 @@ public:
* resized by clicking and dragging its edge.
*
*/
inline void setAutoResize( const bool r )
inline void setResizable( const bool r )
{
m_resizable = r;
}
inline const bool getResizable() const
{
return m_resizable;
}
/*! \brief Set whether a clip has been resized yet by the user or the knife tool.
*
* If a clip has been resized previously, it will not automatically
* resize when editing it.
*
*/
void setAutoResize(const bool r)
{
m_autoResize = r;
}
inline const bool getAutoResize() const
bool getAutoResize() const
{
return m_autoResize;
}
@@ -115,6 +131,7 @@ public:
virtual void movePosition( const TimePos & pos );
virtual void changeLength( const TimePos & length );
virtual void updateLength() {};
virtual gui::ClipView * createView( gui::TrackView * tv ) = 0;
@@ -137,6 +154,12 @@ public:
// Will copy the state of a clip to another clip
static void copyStateTo( Clip *src, Clip *dst );
/**
* Creates a copy of this clip
* @return pointer to the new clip object
*/
virtual Clip* clone() = 0;
public slots:
void toggleMute();
@@ -147,6 +170,8 @@ signals:
void destroyedClip();
void colorChanged();
protected:
Clip(const Clip& other);
private:
Track * m_track;
@@ -158,7 +183,8 @@ private:
BoolModel m_mutedModel;
BoolModel m_soloModel;
bool m_autoResize;
bool m_resizable = true;
bool m_autoResize = true;
bool m_selectViewOnCreate;

View File

@@ -63,6 +63,7 @@ class ClipView : public selectableObject, public ModelView
Q_PROPERTY( QColor textShadowColor READ textShadowColor WRITE setTextShadowColor )
Q_PROPERTY( QColor patternClipBackground READ patternClipBackground WRITE setPatternClipBackground )
Q_PROPERTY( bool gradient READ gradient WRITE setGradient )
Q_PROPERTY(QColor markerColor READ markerColor WRITE setMarkerColor)
// We have to use a QSize here because using QPoint isn't supported.
// width -> x, height -> y
Q_PROPERTY( QSize mouseHotspotHand MEMBER m_mouseHotspotHand )
@@ -94,6 +95,7 @@ public:
QColor textBackgroundColor() const;
QColor textShadowColor() const;
QColor patternClipBackground() const;
QColor markerColor() const;
bool gradient() const;
void setMutedColor( const QColor & c );
void setMutedBackgroundColor( const QColor & c );
@@ -103,6 +105,7 @@ public:
void setTextShadowColor( const QColor & c );
void setPatternClipBackground(const QColor& c);
void setGradient( const bool & b );
void setMarkerColor(const QColor& c);
// access needsUpdate member variable
bool needsUpdate();
@@ -121,10 +124,8 @@ public:
// some metadata to be written to the clipboard.
static void remove( QVector<ClipView *> clipvs );
static void toggleMute( QVector<ClipView *> clipvs );
static void mergeClips(QVector<ClipView*> clipvs);
// Returns true if selection can be merged and false if not
static bool canMergeSelection(QVector<ClipView*> clipvs);
void toggleSelectedAutoResize();
QColor getColorForDisplay( QColor );
@@ -147,8 +148,7 @@ protected:
Cut,
Copy,
Paste,
Mute,
Merge
Mute
};
TrackView * m_trackView;
@@ -176,7 +176,7 @@ protected:
}
bool unquantizedModHeld( QMouseEvent * me );
TimePos quantizeSplitPos( TimePos, bool shiftMode );
TimePos quantizeSplitPos(TimePos);
float pixelsPerBar();
@@ -224,6 +224,7 @@ private:
QColor m_textShadowColor;
QColor m_patternClipBackground;
bool m_gradient;
QColor m_markerColor;
QSize m_mouseHotspotHand; // QSize must be used because QPoint
QSize m_mouseHotspotKnife; // isn't supported by property system
QCursor m_cursorHand;
@@ -244,8 +245,24 @@ private:
TimePos draggedClipPos( QMouseEvent * me );
int knifeMarkerPos( QMouseEvent * me );
void setColor(const std::optional<QColor>& color);
//! Return true iff the clip could be split. Currently only implemented for samples
virtual bool splitClip( const TimePos pos ){ return false; };
//! Returns whether the user can left-resize this clip so that the start of the clip bounds is before the start of the clip content.
virtual bool isResizableBeforeStart() { return true; };
/**
* Split this Clip into two clips
* @param pos the position of the split, relative to the start of the clip
* @return true if the clip could be split
*/
bool splitClip(const TimePos pos);
/**
* Destructively split this Clip into two clips. If the clip type does not implement this feature, it will default to normal splitting.
* @param pos the position of the split, relative to the start of the clip
* @return true if the clip could be split
*/
virtual bool destructiveSplitClip(const TimePos pos)
{
return splitClip(pos);
}
void updateCursor(QMouseEvent * me);
} ;

View File

@@ -45,6 +45,7 @@ public:
bool isDefaultConstructed = false ) :
IntModel( 0, 0, 0, parent, displayName, isDefaultConstructed )
{
setJournalling(false);
}
void addItem( QString item, std::unique_ptr<PixmapLoader> loader = nullptr );

View File

@@ -214,6 +214,8 @@ public:
return m_recentlyOpenedProjects;
}
const QStringList& favoriteItems() { return m_favoriteItems; }
QString localeDir() const
{
return m_dataDir + LOCALE_PATH;
@@ -240,6 +242,10 @@ public:
void addRecentlyOpenedProject(const QString & _file);
void addFavoriteItem(const QString& item);
void removeFavoriteItem(const QString& item);
bool isFavoriteItem(const QString& item);
QString value(const QString& cls, const QString& attribute, const QString& defaultVal = "") const;
void setValue(const QString & cls, const QString & attribute,
@@ -265,6 +271,7 @@ public:
signals:
void valueChanged( QString cls, QString attribute, QString value );
void favoritesChanged();
private:
static ConfigManager * s_instanceOfMe;
@@ -299,6 +306,7 @@ private:
QString m_version;
unsigned int m_configVersion;
QStringList m_recentlyOpenedProjects;
QStringList m_favoriteItems;
using stringPairVector = std::vector<QPair<QString, QString>>;
using settingsMap = QMap<QString, stringPairVector>;

View File

@@ -29,7 +29,6 @@
#include <QCloseEvent>
#include "SerializingObject.h"
#include "lmms_basics.h"
class QPushButton;

View File

@@ -80,7 +80,7 @@ public:
FloatModel* model() override;
AutomatableModelView* modelView() override;
KnobControl(QWidget* parent = nullptr);
KnobControl(const QString& text, QWidget* parent = nullptr);
~KnobControl() override = default;
};

View File

@@ -36,9 +36,7 @@ class LMMS_EXPORT CustomTextKnob : public Knob
protected:
inline void setHintText( const QString & _txt_before, const QString & _txt_after ) {} // inaccessible
public:
CustomTextKnob( KnobType _knob_num, QWidget * _parent = nullptr, const QString & _name = QString(), const QString & _value_text = QString() );
CustomTextKnob( QWidget * _parent = nullptr, const QString & _name = QString(), const QString & _value_text = QString() ); //!< default ctor
CustomTextKnob( KnobType _knob_num, const QString& label, QWidget * _parent = nullptr, const QString & _name = QString(), const QString & _value_text = QString() );
CustomTextKnob( const Knob& other ) = delete;

View File

@@ -28,7 +28,7 @@
#include <cmath>
#include "lmms_basics.h"
#include "LmmsTypes.h"
namespace lmms
{

View File

@@ -39,6 +39,10 @@ public:
InlineAutomation()
{
}
DetuningHelper(const DetuningHelper& _copy) :
InlineAutomation(_copy)
{
}
~DetuningHelper() override = default;

View File

@@ -28,7 +28,7 @@
#include <stdint.h>
#include "lmms_basics.h"
#include "LmmsTypes.h"
class QString;

View File

@@ -28,7 +28,7 @@
#include <numbers>
#include "lmms_math.h"
#include "lmms_basics.h"
#include "LmmsTypes.h"
#include "SampleFrame.h"
namespace lmms::DspEffectLibrary

View File

@@ -57,6 +57,13 @@ protected:
DropToolBar * addDropToolBar(QWidget * parent, Qt::ToolBarArea whereToAdd, QString const & windowTitle);
void closeEvent(QCloseEvent * event) override;
void keyPressEvent(QKeyEvent *ke) override;
public slots:
//! Called by pressing the space key. Plays or stops.
void togglePlayStop();
//! Called by pressing shift+space. Toggles pause state.
void togglePause();
protected slots:
virtual void play() {}
virtual void record() {}
@@ -65,12 +72,6 @@ protected slots:
virtual void stop() {}
private slots:
/// Called by pressing the space key. Plays or stops.
void togglePlayStop();
/// Called by pressing shift+space. Toggles pause state.
void togglePause();
void toggleMaximize();
signals:

View File

@@ -30,7 +30,6 @@
#include "EffectChain.h"
#include "ModelView.h"
#include "lmms_basics.h"
class QScrollArea;
class QVBoxLayout;

View File

@@ -30,7 +30,7 @@
#include "lmmsconfig.h"
#include "lmms_export.h"
#include "lmms_basics.h"
#include "LmmsTypes.h"
namespace lmms
{

View File

@@ -32,7 +32,7 @@
#include "AutomatableModel.h"
#include "SampleBuffer.h"
#include "TempoSyncKnobModel.h"
#include "lmms_basics.h"
#include "LmmsTypes.h"
namespace lmms
{

View File

@@ -171,6 +171,7 @@ private:
QElapsedTimer m_lastPeakTimer_R;
QPixmap m_knob {embed::getIconPixmap("fader_knob")};
QSize m_knobSize;
/**
* @brief Stores the offset to the knob center when the user drags the fader knob

View File

@@ -61,19 +61,22 @@ class FileBrowser : public SideBarWidget
{
Q_OBJECT
public:
enum class Type
{
Normal,
Favorites
};
/**
Create a file browser side bar widget
@param directories '*'-separated list of directories to search for.
If a directory of factory files should be in the list it
must be the last one (for the factory files delimiter to work)
@param filter Filter as used in QDir::match
@param recurse *to be documented*
*/
FileBrowser( const QString & directories, const QString & filter,
const QString & title, const QPixmap & pm,
QWidget * parent, bool dirs_as_items = false,
const QString& userDir = "",
const QString& factoryDir = "");
Create a file browser side bar widget
@param directories '*'-separated list of directories to search for.
If a directory of factory files should be in the list it
must be the last one (for the factory files delimiter to work)
@param filter Filter as used in QDir::match
@param recurse *to be documented*
*/
FileBrowser(Type type, const QString& directories, const QString& filter, const QString& title, const QPixmap& pm,
QWidget* parent, bool dirs_as_items = false, const QString& userDir = "", const QString& factoryDir = "");
~FileBrowser() override = default;
@@ -90,6 +93,7 @@ public:
};
return s_excludedPaths;
}
static QDir::Filters dirFilters() { return QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot | QDir::Hidden; }
static QDir::SortFlags sortFlags() { return QDir::LocaleAware | QDir::DirsFirst | QDir::Name | QDir::IgnoreCase; }
@@ -101,7 +105,7 @@ private slots:
private:
void keyPressEvent( QKeyEvent * ke ) override;
void addItems( const QString & path );
void addItems(const QString & path);
void saveDirectoriesStates();
void restoreDirectoriesStates();
@@ -117,6 +121,7 @@ private:
FileBrowserTreeWidget * m_searchTreeWidget;
QLineEdit * m_filterEdit;
Type m_type;
std::shared_ptr<FileSearch> m_currentSearch;
QProgressBar* m_searchIndicator = nullptr;
@@ -216,8 +221,7 @@ public:
{
path += QDir::separator();
}
return( QDir::cleanPath( path + text( 0 ) ) +
QDir::separator() );
return QDir::cleanPath(path + text(0));
}
inline void addDirectory( const QString & dir )

View File

@@ -22,12 +22,12 @@
*
*/
#ifndef LMMS_FILE_REVEALER_H
#define LMMS_FILE_REVEALER_H
#ifndef LMMS_GUI_FILE_REVEALER_H
#define LMMS_GUI_FILE_REVEALER_H
#include <QFileInfo>
namespace lmms {
namespace lmms::gui {
/**
* @class FileRevealer
@@ -73,5 +73,6 @@ protected:
static bool supportsArg(const QString& command, const QString& arg);
};
} // namespace lmms
#endif // LMMS_FILE_REVEALER_H
} // namespace lmms::gui
#endif // LMMS_GUI_FILE_REVEALER_H

View File

@@ -22,8 +22,8 @@
*
*/
#ifndef LMMS_FONT_HELPER_H
#define LMMS_FONT_HELPER_H
#ifndef LMMS_GUI_FONT_HELPER_H
#define LMMS_GUI_FONT_HELPER_H
#include <QApplication>
#include <QFont>
@@ -44,4 +44,4 @@ inline QFont adjustedToPixelSize(QFont font, int size)
} // namespace lmms::gui
#endif // LMMS_FONT_HELPER_H
#endif // LMMS_GUI_FONT_HELPER_H

View File

@@ -32,7 +32,7 @@
#include "Model.h"
#include "ModelView.h"
#include "lmms_basics.h"
#include "LmmsTypes.h"
namespace lmms
{

View File

@@ -26,6 +26,7 @@
#define LMMS_GUI_GUI_APPLICATION_H
#include <QObject>
#include <QSocketNotifier>
#include "lmms_export.h"
#include "lmmsconfig.h"
@@ -53,10 +54,14 @@ public:
~GuiApplication() override;
static GuiApplication* instance();
static void sigintHandler(int);
static bool isWayland();
#ifdef LMMS_BUILD_WIN32
static QFont getWin32SystemFont();
#endif
void createSocketNotifier();
MainWindow* mainWindow() { return m_mainWindow; }
MixerView* mixerView() { return m_mixerView; }
SongEditorWindow* songEditor() { return m_songEditor; }
@@ -67,11 +72,15 @@ public:
AutomationEditorWindow* automationEditor() { return m_automationEditor; }
ControllerRackView* getControllerRackView() { return m_controllerRackView; }
//! File descriptors for unix socketpair, used to receive SIGINT
static inline int s_sigintFd[2];
public slots:
void displayInitProgress(const QString &msg);
private slots:
void childDestroyed(QObject *obj);
void sigintOccurred();
private:
static GuiApplication* s_instance;
@@ -86,6 +95,7 @@ private:
MicrotunerConfig* m_microtunerConfig;
ControllerRackView* m_controllerRackView;
QLabel* m_loadingProgressLabel;
QSocketNotifier* m_sigintNotifier;
};
// Short-hand function

View File

@@ -27,27 +27,28 @@
#include "AutomationNode.h"
#include "AutomationClip.h"
#include "shared_object.h"
namespace lmms
{
class InlineAutomation : public FloatModel, public sharedObject
class InlineAutomation : public FloatModel
{
public:
InlineAutomation() :
FloatModel(),
sharedObject(),
m_autoClip( nullptr )
FloatModel()
{
}
InlineAutomation(const InlineAutomation& _copy) :
FloatModel(_copy.value(), _copy.minValue(), _copy.maxValue(), _copy.step<float>()),
m_autoClip(_copy.m_autoClip->clone())
{
m_autoClip->clearObjects();
m_autoClip->addObject(this);
}
~InlineAutomation() override
{
if( m_autoClip )
{
delete m_autoClip;
}
}
virtual float defaultValue() const = 0;
@@ -81,10 +82,10 @@ public:
{
if( m_autoClip == nullptr )
{
m_autoClip = new AutomationClip( nullptr );
m_autoClip = std::make_unique<AutomationClip>(nullptr);
m_autoClip->addObject( this );
}
return m_autoClip;
return m_autoClip.get();
}
void saveSettings( QDomDocument & _doc, QDomElement & _parent ) override;
@@ -92,7 +93,7 @@ public:
private:
AutomationClip * m_autoClip;
std::unique_ptr<AutomationClip> m_autoClip;
} ;

View File

@@ -30,7 +30,7 @@
#include "Flags.h"
#include "lmms_export.h"
#include "lmms_basics.h"
#include "LmmsTypes.h"
#include "Plugin.h"
#include "TimePos.h"

View File

@@ -27,8 +27,8 @@
#include <QWidget>
#include "AutomatableButton.h"
#include "ModelView.h"
#include "PixmapButton.h"
#include "SerializingObject.h"
#include "PluginView.h"
@@ -148,8 +148,8 @@ private:
Knob * m_volumeKnob;
Knob * m_panningKnob;
Knob * m_pitchKnob;
PixmapButton *m_muteBtn;
PixmapButton *m_soloBtn;
AutomatableButton* m_muteBtn;
AutomatableButton* m_soloBtn;
QLabel * m_pitchLabel;
LcdSpinBox* m_pitchRangeSpinBox;
QLabel * m_pitchRangeLabel;

View File

@@ -27,7 +27,7 @@
#include <QStack>
#include "lmms_basics.h"
#include "LmmsTypes.h"
#include "SerializingObject.h"
namespace lmms

View File

@@ -77,11 +77,65 @@ class LMMS_EXPORT Knob : public FloatModelEditorBase
void onKnobNumUpdated(); //!< to be called when you updated @a m_knobNum
public:
/**
* @brief Determines how the label of the knob is rendered.
*
* Labels can be rendered using the font that is set for the knob or using a
* font with a fixed size which is determined by SMALL_FONT_SIZE.
*/
enum class LabelRendering
{
/**
* @brief Renders the label using the font that is set for the widget.
*
* The space that's needed for the label is determined using the font metrics of the knob's font.
*/
WidgetFont,
/**
* @brief Renders the labels in legacy mode. This uses a fixed font size and does not adhere
* to the font size that's set for the widget's font.
*
* @deprecated Do not use this mode in new code as it is considered deprecated and might be removed in the future.
*/
LegacyFixedFontSize
};
/**
* @brief Construct a Knob with the given style and no label.
*
* @param _knob_num Style of the knob
* @param _parent Parent widget
* @param _name Object name of the widget
*/
Knob( KnobType _knob_num, QWidget * _parent = nullptr, const QString & _name = QString() );
/**
* @brief Construct a Knob with the given style and label text.
*
* @param knobNum Style of the knob
* @param labelText Text for the label
* @param parent Parent widget
* @param labelRendering Determines if the label uses the widget font or a font with a fixed size of 12 pixels (LegacyFixedFontSize). The default is to use the widget font.
* @param name Object name of the widget
*/
Knob(KnobType knobNum, const QString& labelText, QWidget* parent = nullptr, LabelRendering labelRendering = LabelRendering::WidgetFont, const QString& name = QString());
/**
* @brief Constructs a knob with a label font in the pixel size.
*
* @param knobNum Style of the knob
* @param labelText Text for the label
* @param labelPixelSize Pixel size for the label
* @param parent Parent widget
* @param name Object name of the widget
*/
Knob(KnobType knobNum, const QString& labelText, int labelPixelSize, QWidget* parent, const QString& name = QString());
Knob( QWidget * _parent = nullptr, const QString & _name = QString() ); //!< default ctor
Knob( const Knob& other ) = delete;
void setLabel( const QString & txt );
void setHtmlLabel( const QString &htmltxt );
void setTotalAngle( float angle );
@@ -113,15 +167,44 @@ public:
protected:
void paintEvent( QPaintEvent * _me ) override;
void setLabel(const QString& txt);
void paintEvent(QPaintEvent*) override;
void changeEvent(QEvent * ev) override;
/*!
* Affects how the label of the knob is rendered.
*
* The default mode returns false. The height of the label text is taken into account when a new fixed
* size is computed for the Knob. When the label text is painted the descent of the font is used to
* compute the base line. The default mode returns false.
*
* Enabling fixed font size rendering mode leads to the following behavior:
* * The height of the label is not taken into account when the new fixed height of the Knob is computed.
* Instead a fixed size of 10 is added for the label.
* * When the knob is painted the baseline of the font is always set to 2 pixels away from the lower side
* of the Knob's rectangle.
* * The label is always rendered with a size of SMALL_FONT_SIZE.
*/
bool fixedFontSizeLabelRendering() const { return m_fixedFontSizeLabelRendering; }
/*!
* Set the button to legacy rendering mode which uses a fixed font size and that does not take the size
* of the widget's font into account.
*
* This can be thought of as a legacy mode which reinstates the old behavior of the knob.
*
* @see fixedFontSizeLabelRendering().
*/
void setFixedFontSizeLabelRendering();
private:
QLineF calculateLine( const QPointF & _mid, float _radius,
float _innerRadius = 1) const;
void drawKnob( QPainter * _p );
void drawLabel(QPainter& p);
bool updateAngle();
int angleFromValue( float value, float minValue, float maxValue, float totalAngle ) const
@@ -129,7 +212,10 @@ private:
return static_cast<int>( ( value - 0.5 * ( minValue + maxValue ) ) / ( maxValue - minValue ) * m_totalAngle ) % 360;
}
void updateFixedSize();
QString m_label;
bool m_fixedFontSizeLabelRendering = false;
bool m_isHtmlLabel;
QTextDocument* m_tdRenderer;

View File

@@ -36,7 +36,7 @@
#include "lmms_export.h"
#include "lmms_basics.h"
#include "LmmsTypes.h"
namespace lmms

View File

@@ -31,8 +31,8 @@
#include "AutomatableModel.h"
#include "Controller.h"
#include "ControllerDialog.h"
#include "SampleBuffer.h"
#include "TempoSyncKnobModel.h"
#include "Oscillator.h"
namespace lmms
{

View File

@@ -1,8 +1,8 @@
/*
* debug.h - header file to be included for debugging purposes
*
* Copyright (c) 2004-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* LmmsCommonMacros.h - defines some common macros used in the codebase
*
* Copyright (c) 2025 Roshan M R (Ross Maxx) <mrroshan127/at/gmail/dot/com>
*
* This file is part of LMMS - https://lmms.io
*
* This program is free software; you can redistribute it and/or
@@ -22,20 +22,15 @@
*
*/
#ifndef LMMS_DEBUG_H
#define LMMS_DEBUG_H
#ifndef LMMS_COMMON_MACROS_H
#define LMMS_COMMON_MACROS_H
#include "lmmsconfig.h"
namespace lmms
{
// Define standard macro NDEBUG when building without debug flag to make sure asserts become no-ops.
#ifndef LMMS_DEBUG
#ifndef NDEBUG
#define NDEBUG
#endif
#endif // LMMS_DEBUG
#define LMMS_STRINGIFY(s) LMMS_STR(s) // a macro used to stringify the plugin name
#define LMMS_STR(PN) #PN
#include <cassert>
#include <cstdio>
} // namespace lmms
#endif // LMMS_DEBUG_H
#endif // LMMS_COMMON_MACROS_H

View File

@@ -1,5 +1,5 @@
/*
* lmms_basics.h - typedefs for common types that are used in the whole app
* LmmsTypes.h - typedefs for common types that are used in the whole app
*
* Copyright (c) 2004-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
@@ -26,48 +26,31 @@
#define LMMS_TYPES_H
#include <cstddef>
#include "lmmsconfig.h"
#include <cstdint>
namespace lmms
{
using bar_t = int32_t;
using tick_t = int32_t;
using volume_t = uint8_t;
using panning_t = int8_t;
using bar_t = std::int32_t;
using tick_t = std::int32_t;
using volume_t = std::uint8_t;
using panning_t = std::int8_t;
using sample_t = float; // standard sample-type
using int_sample_t = int16_t; // 16-bit-int-sample
using sample_t = float; // standard sample-type
using int_sample_t = std::int16_t; // 16-bit-int-sample
using sample_rate_t = uint32_t; // sample-rate
using fpp_t = size_t; // frames per period (0-16384)
using f_cnt_t = size_t; // standard frame-count
using ch_cnt_t = uint8_t; // channel-count (0-DEFAULT_CHANNELS)
using bpm_t = uint16_t; // tempo (MIN_BPM to MAX_BPM)
using bitrate_t = uint16_t; // bitrate in kbps
using mix_ch_t = uint16_t; // Mixer-channel (0 to MAX_CHANNEL)
using sample_rate_t = std::uint32_t; // sample-rate
using fpp_t = std::size_t; // frames per period (0-16384)
using f_cnt_t = std::size_t; // standard frame-count
using ch_cnt_t = std::uint8_t; // channel-count (0-DEFAULT_CHANNELS)
using bpm_t = std::uint16_t; // tempo (MIN_BPM to MAX_BPM)
using bitrate_t = std::uint16_t; // bitrate in kbps
using mix_ch_t = std::uint16_t; // Mixer-channel (0 to MAX_CHANNEL)
using track_ch_t = std::uint16_t; // track channel index/count (0-256)
using proc_ch_t = std::uint16_t; // audio processor channel index/count
using jo_id_t = uint32_t; // (unique) ID of a journalling object
constexpr ch_cnt_t DEFAULT_CHANNELS = 2;
constexpr char LADSPA_PATH_SEPERATOR =
#ifdef LMMS_BUILD_WIN32
';';
#else
':';
#endif
#define LMMS_STRINGIFY(s) LMMS_STR(s)
#define LMMS_STR(PN) #PN
using jo_id_t = std::uint32_t; // (unique) ID of a journalling object
} // namespace lmms

View File

@@ -30,7 +30,7 @@
#include <ringbuffer/ringbuffer.h>
#include "lmms_basics.h"
#include "LmmsTypes.h"
namespace lmms
{

View File

@@ -34,7 +34,7 @@
#include <vector>
#include "Flags.h"
#include "lmms_basics.h"
#include "LmmsTypes.h"
#include "PluginIssue.h"

View File

@@ -46,6 +46,7 @@ class ConfigManager;
namespace gui
{
class FileBrowser;
class PluginView;
class SubWindow;
class ToolButton;

View File

@@ -25,8 +25,6 @@
#ifndef LMMS_MIDI_H
#define LMMS_MIDI_H
#include "lmms_basics.h"
namespace lmms
{

View File

@@ -53,12 +53,11 @@ public:
} ;
MidiClip( InstrumentTrack* instrumentTrack );
MidiClip( const MidiClip& other );
~MidiClip() override;
void init();
void updateLength();
void updateLength() override;
// note management
Note * addNote( const Note & _new_note, const bool _quant_pos = true );
@@ -79,6 +78,9 @@ public:
Note * addStepNote( int step );
void setStep( int step, bool enabled );
//! Horizontally flip the positions of the given notes.
void reverseNotes(const NoteVector& notes);
// Split the list of notes on the given position
void splitNotes(const NoteVector& notes, TimePos pos);
@@ -114,6 +116,11 @@ public:
gui::ClipView * createView( gui::TrackView * _tv ) override;
MidiClip* clone() override
{
return new MidiClip(*this);
}
using Model::dataChanged;
@@ -124,6 +131,7 @@ public slots:
void clear();
protected:
MidiClip( const MidiClip& other );
void updatePatternTrack();
protected slots:

View File

@@ -63,6 +63,11 @@ public:
QColor const & getMutedNoteBorderColor() const { return m_mutedNoteBorderColor; }
void setMutedNoteBorderColor(QColor const & color) { m_mutedNoteBorderColor = color; }
// Returns true if selection can be merged and false if not
static bool canMergeSelection(QVector<ClipView*> clipvs);
static void mergeClips(QVector<ClipView*> clipvs);
static void bulkClearNotesOutOfBounds(QVector<ClipView*> clipvs);
public slots:
lmms::MidiClip* getMidiClip();
void update() override;
@@ -76,6 +81,7 @@ protected slots:
void resetName();
void changeName();
void transposeSelection();
void clearNotesOutOfBounds();
protected:
@@ -103,6 +109,10 @@ private:
QStaticText m_staticTextName;
bool m_legacySEPattern;
bool isResizableBeforeStart() override { return false; }
bool destructiveSplitClip(const TimePos pos) override;
} ;

View File

@@ -25,7 +25,7 @@
#ifndef LMMS_MIX_HELPERS_H
#define LMMS_MIX_HELPERS_H
#include "lmms_basics.h"
#include "LmmsTypes.h"
namespace lmms
{

View File

@@ -61,7 +61,7 @@ public:
void contextMenuEvent(QContextMenuEvent*) override;
void mousePressEvent(QMouseEvent*) override;
void mouseDoubleClickEvent(QMouseEvent*) override;
bool eventFilter(QObject* dist, QEvent* event) override;
void keyPressEvent(QKeyEvent* ke) override;
void reset();
int channelIndex() const { return m_channelIndex; }
@@ -115,8 +115,8 @@ private:
QLineEdit* m_renameLineEdit;
QGraphicsView* m_renameLineEditView;
QLabel* m_sendArrow;
PixmapButton* m_muteButton;
PixmapButton* m_soloButton;
AutomatableButton* m_muteButton;
AutomatableButton* m_soloButton;
PeakIndicator* m_peakIndicator = nullptr;
Fader* m_fader;
EffectRackView* m_effectRackView;

View File

@@ -26,6 +26,7 @@
#ifndef LMMS_NOTE_H
#define LMMS_NOTE_H
#include <memory>
#include <optional>
#include <vector>
@@ -103,10 +104,15 @@ public:
int key = DefaultKey,
volume_t volume = DefaultVolume,
panning_t panning = DefaultPanning,
DetuningHelper * detuning = nullptr );
std::shared_ptr<DetuningHelper> detuning = nullptr);
Note( const Note & note );
~Note() override;
Note& operator=(const Note& note);
//! Performs a deep copy and returns an owning raw pointer
Note* clone() const;
// Note types
enum class Type
{
@@ -234,10 +240,8 @@ public:
static TimePos quantized( const TimePos & m, const int qGrid );
DetuningHelper * detuning() const
{
return m_detuning;
}
const std::shared_ptr<DetuningHelper>& detuning() const { return m_detuning; }
bool hasDetuningInfo() const;
bool withinRange(int tickStart, int tickEnd) const;
@@ -262,7 +266,7 @@ private:
panning_t m_panning;
TimePos m_length;
TimePos m_pos;
DetuningHelper * m_detuning;
std::shared_ptr<DetuningHelper> m_detuning;
Type m_type = Type::Regular;
};

View File

@@ -34,7 +34,6 @@
#include "Engine.h"
#include "lmms_math.h"
#include "lmmsconfig.h"
#include "AudioEngine.h"
#include "OscillatorConstants.h"
#include "SampleBuffer.h"

View File

@@ -28,7 +28,7 @@
#include <array>
#include "lmms_basics.h"
#include "LmmsTypes.h"
namespace lmms::OscillatorConstants
{

View File

@@ -28,7 +28,7 @@
#include <QWidget>
#include <QPixmap>
#include "lmms_basics.h"
#include "LmmsTypes.h"
namespace lmms
{

View File

@@ -26,7 +26,7 @@
#ifndef LMMS_OUTPUT_SETTINGS_H
#define LMMS_OUTPUT_SETTINGS_H
#include "lmms_basics.h"
#include "LmmsTypes.h"
namespace lmms
{

View File

@@ -31,8 +31,8 @@
namespace lmms::PathUtil
{
enum class Base { Absolute, ProjectDir, FactorySample, UserSample, UserVST, Preset,
UserLADSPA, DefaultLADSPA, UserSoundfont, DefaultSoundfont, UserGIG, DefaultGIG,
enum class Base { Absolute, ProjectDir, FactoryProjects, FactorySample, UserSample, UserVST, Preset,
FactoryPresets, UserLADSPA, DefaultLADSPA, UserSoundfont, DefaultSoundfont, UserGIG, DefaultGIG,
LocalDir };
//! Return the directory associated with a given base as a QString

View File

@@ -51,6 +51,11 @@ public:
gui::ClipView * createView( gui::TrackView * _tv ) override;
PatternClip* clone() override
{
return new PatternClip(*this);
}
private:
friend class PatternClipView;
} ;

Some files were not shown because too many files have changed in this diff Show More