StemRoller: desktop stem separator, Android stems player, and server daemons

- stemroller/: PySide6/QML desktop app and player for separating music into stems
- android/: Plex music player that plays per-stem mixes, with Android Auto support,
  a graphic + parametric (Equalizer APO-style) EQ, and offline downloads
- server/: stemserve (serves stems to the app) and stemd (separates the library on
  the server's GPU, with "Stem Now" priority requests)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClericalErrorandClaude Opus 5.5 committed 2026-10-14 21:17:17 -07:00
1 parent 716c5499ff
commit 1845f03c41
184 files changed
+24648

No files matched your search

@@ -0,0 +1,59 @@
import QtQuick
// A ribbon command: large (icon over a label) or small (icon beside a label).
Item {
id: b
property string icon: ""
property string text: ""
property bool big: false
property bool checkable: false
property bool checked: false
property bool dropdown: false
property string tip: ""
signal clicked()
implicitWidth: big ? Math.max(44, lbl.implicitWidth + 12) : (icon ? 22 : 6) + (text ? lbl.implicitWidth + 8 : 0) + (dropdown ? 12 : 0)
implicitHeight: big ? 66 : 22
opacity: enabled ? 1 : 0.4
Rectangle {
anchors.fill: parent
color: b.checked ? X.checked : ma.pressed ? X.pressed : ma.containsMouse ? X.hover : "transparent"
border.color: b.checked ? X.checkedBorder : "transparent"
}
Ico {
id: ic
visible: b.icon !== ""
name: b.icon
size: b.big ? 32 : 16
x: b.big ? (parent.width - width) / 2 : 3
y: b.big ? 4 : 3
}
T {
id: lbl
text: b.text
font.pixelSize: X.fsUi
x: b.big ? (parent.width - width) / 2 : (b.icon ? 23 : 4)
y: b.big ? 38 : 0
height: b.big ? implicitHeight : parent.height
width: b.big ? Math.min(implicitWidth, 90) : implicitWidth
horizontalAlignment: Text.AlignHCenter
wrapMode: b.big ? Text.WordWrap : Text.NoWrap
maximumLineCount: 2
elide: Text.ElideNone
lineHeight: 0.95
}
Ico {
visible: b.dropdown
name: "dropdown"
size: 10
x: b.big ? (parent.width - width) / 2 : parent.width - 12
y: b.big ? parent.height - 13 : 6
}
MouseArea {
id: ma
anchors.fill: parent
hoverEnabled: true
onClicked: b.clicked()
}
Tip { target: ma; text: b.tip || b.text }
}