diff --git a/.gitignore b/.gitignore
index 75344bfc..72c64847 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,4 +43,11 @@ Notepad++
.mypy_cache
# Macos
-.DS_Store
\ No newline at end of file
+.DS_Store
+
+# UV
+.venv/
+
+# Temporary test scripts
+test_*.py
+test_*.qml
diff --git a/friture/ControlBar.qml b/friture/ControlBar.qml
index 97f0e98a..029bb6e7 100644
--- a/friture/ControlBar.qml
+++ b/friture/ControlBar.qml
@@ -7,9 +7,10 @@ RowLayout {
objectName: "controlBar"
spacing: 0
- SystemPalette { id: systemPalette; colorGroup: SystemPalette.Active }
-
required property var viewModel
+ required property var main_window_view_model
+
+ readonly property color iconColor: main_window_view_model.window_text_color
ComboBox {
id: widgetSelector
@@ -37,7 +38,7 @@ RowLayout {
id: settingsButton
icon.source: "qrc:/images-src/dock-settings.svg"
ToolTip.text: "Customize the audio widget"
- icon.color: systemPalette.windowText
+ icon.color: controlBar.iconColor
onClicked: viewModel.onSettingsClicked()
}
@@ -45,7 +46,7 @@ RowLayout {
id: movePreviousButton
icon.source: "qrc:/images-src/dock-move-previous.svg"
ToolTip.text: "Move widget to previous slot"
- icon.color: systemPalette.windowText
+ icon.color: controlBar.iconColor
onClicked: viewModel.onMovePreviousClicked()
}
@@ -53,7 +54,7 @@ RowLayout {
id: moveNextButton
icon.source: "qrc:/images-src/dock-move-next.svg"
ToolTip.text: "Move widget to next slot"
- icon.color: systemPalette.windowText
+ icon.color: controlBar.iconColor
onClicked: viewModel.onMoveNextClicked()
}
@@ -61,7 +62,7 @@ RowLayout {
id: closeButton
icon.source: "qrc:/images-src/dock-close.svg"
ToolTip.text: "Close the audio widget"
- icon.color: systemPalette.windowText
+ icon.color: controlBar.iconColor
onClicked: viewModel.onCloseClicked()
}
diff --git a/friture/Dock.qml b/friture/Dock.qml
index 1dfbecf7..9b0f0a18 100644
--- a/friture/Dock.qml
+++ b/friture/Dock.qml
@@ -1,10 +1,12 @@
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.2
+import Friture 1.0
Rectangle {
- SystemPalette { id: systemPalette; colorGroup: SystemPalette.Active }
- color: systemPalette.window
+ required property MainWindowViewModel main_window_view_model
+
+ color: main_window_view_model.window_color
property string fixedFont
@@ -28,4 +30,3 @@ Rectangle {
}
}
}
-
diff --git a/friture/FritureMainWindow.qml b/friture/FritureMainWindow.qml
index acbc6ed7..68131ce4 100644
--- a/friture/FritureMainWindow.qml
+++ b/friture/FritureMainWindow.qml
@@ -3,16 +3,26 @@ import QtQuick.Controls 2.15
import QtQuick.Layouts 1.2
import Friture 1.0
-Rectangle { // eventually move to ApplicationWindow
+Control { // eventually move to ApplicationWindow
id: mainWindow
anchors.fill: parent
+
+ // Explicitly bind the Qt Quick Controls 2 palette to the actual Python QApplication palette!
+ // This perfectly fixes Light/Dark theme rendering and native hover states without custom hardcoded colors.
+ palette.window: main_window_view_model.window_color
+ palette.windowText: main_window_view_model.window_text_color
+ palette.base: main_window_view_model.base_color
+ palette.text: main_window_view_model.text_color
+ palette.button: main_window_view_model.button_color
+ palette.buttonText: main_window_view_model.button_text_color
+
// title: qsTr("Friture") // ApplicationWindow
// icon.source: "qrc:/images-src/window-icon.svg" // ApplicationWindow
required property MainWindowViewModel main_window_view_model
required property string fixedFont
- ColumnLayout { // remove once we use ApplicationWindow
+ contentItem: ColumnLayout { // remove once we use ApplicationWindow
anchors.fill: parent
spacing: 0
diff --git a/friture/analyzer.py b/friture/analyzer.py
index e8452dcc..1db81b64 100755
--- a/friture/analyzer.py
+++ b/friture/analyzer.py
@@ -29,7 +29,7 @@
from PyQt5 import QtCore
# specifically import from PyQt5.QtGui and QWidgets for startup time improvement :
from PyQt5.QtWidgets import QMainWindow, QApplication, QSplashScreen, QWidget
-from PyQt5.QtGui import QPixmap, QFontDatabase
+from PyQt5.QtGui import QPixmap, QFontDatabase, QPalette, QColor
from PyQt5.QtQml import QQmlEngine, qmlRegisterSingletonType, qmlRegisterType
from PyQt5.QtCore import QObject
from PyQt5.QtQuick import QQuickView
@@ -83,6 +83,35 @@
# (and text painting is costly)
SLOW_TIMER_PERIOD_MS = 1000
+def apply_theme(app: QApplication, theme_index: int):
+ if theme_index == 2: # Dark
+ app.setStyle("Fusion")
+ dark_palette = QPalette()
+ dark_palette.setColor(QPalette.Window, QColor(53, 53, 53))
+ dark_palette.setColor(QPalette.WindowText, QtCore.Qt.white)
+ dark_palette.setColor(QPalette.Base, QColor(25, 25, 25))
+ dark_palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
+ dark_palette.setColor(QPalette.ToolTipBase, QtCore.Qt.white)
+ dark_palette.setColor(QPalette.ToolTipText, QtCore.Qt.white)
+ dark_palette.setColor(QPalette.Text, QtCore.Qt.white)
+ dark_palette.setColor(QPalette.Button, QColor(53, 53, 53))
+ dark_palette.setColor(QPalette.ButtonText, QtCore.Qt.white)
+ dark_palette.setColor(QPalette.BrightText, QtCore.Qt.red)
+ dark_palette.setColor(QPalette.Link, QColor(42, 130, 218))
+ dark_palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
+ dark_palette.setColor(QPalette.HighlightedText, QtCore.Qt.black)
+ app.setPalette(dark_palette)
+ if hasattr(app, 'paletteChanged'):
+ app.paletteChanged.emit(dark_palette)
+ elif theme_index == 1: # Light
+ app.setStyle("Fusion")
+ app.setPalette(app.style().standardPalette())
+ if hasattr(app, 'paletteChanged'):
+ app.paletteChanged.emit(app.style().standardPalette())
+ else: # System Default
+ app.setPalette(app.style().standardPalette())
+ if hasattr(app, 'paletteChanged'):
+ app.paletteChanged.emit(app.style().standardPalette())
class Friture(QMainWindow, ):
@@ -162,6 +191,7 @@ def __init__(self):
self.quick_view = QQuickView(self.qml_engine, None)
self.quick_view.setResizeMode(QQuickView.SizeRootObjectToView)
+ self.quick_view.setColor(QApplication.instance().palette().window().color())
self.quick_view.setInitialProperties({
"main_window_view_model": self._main_window_view_model,
"fixedFont": QFontDatabase.systemFont(QFontDatabase.FixedFont).family()
@@ -199,6 +229,7 @@ def __init__(self):
# settings changes
self.settings_dialog.show_playback_changed.connect(self.show_playback_changed)
self.settings_dialog.history_length_changed.connect(self.player.set_history_seconds)
+ self.settings_dialog.theme_changed.connect(self.theme_changed)
# restore the settings and widgets geometries
self.restoreAppState()
@@ -231,6 +262,12 @@ def settings_called(self):
def show_playback_changed(self, show: bool) -> None:
self._main_window_view_model.playback_control_enabled = show
+ def theme_changed(self, theme_index: int) -> None:
+ app = QApplication.instance()
+ apply_theme(app, theme_index)
+ self.quick_view.setColor(app.palette().window().color())
+ self._main_window_view_model.theme_index = theme_index
+
# slot
def about_called(self):
self.about_dialog.show()
@@ -483,6 +520,10 @@ def main():
if "QT_QUICK_CONTROLS_STYLE" not in os.environ:
os.environ["QT_QUICK_CONTROLS_STYLE"] = "Fusion"
+ settings = QtCore.QSettings("Friture", "Friture")
+ theme_index = settings.value("AudioBackend/theme", 0, type=int)
+ apply_theme(app, theme_index)
+
# Splash screen
if not program_arguments.no_splash:
pixmap = QPixmap(":/images/splash.png")
diff --git a/friture/dock.py b/friture/dock.py
index c1dc22e2..5363fc13 100644
--- a/friture/dock.py
+++ b/friture/dock.py
@@ -48,6 +48,7 @@ def __init__(
self.dockmanager: 'DockManager' = parent.dockmanager
self.audiobuffer = parent.audiobuffer
+ self._main_window_view_model = parent._main_window_view_model
self.setObjectName(name)
@@ -67,11 +68,16 @@ def __init__(
component_raise_if_error(dock_component)
context = self.qml_engine.rootContext()
- self.dock_qml = dock_component.createWithInitialProperties({}, context)
+ self.dock_qml = dock_component.createWithInitialProperties(
+ {"main_window_view_model": self._main_window_view_model}, context
+ )
self.dock_qml.setParent(self.qml_engine)
self.dock_qml.setParentItem(self.parent().main_tile_layout) # type: ignore
- initialProperties = {"viewModel": self.controlbar_viewmodel}
+ initialProperties = {
+ "viewModel": self.controlbar_viewmodel,
+ "main_window_view_model": self._main_window_view_model
+ }
component = QQmlComponent(self.qml_engine)
component.loadUrl(qml_url("ControlBar.qml"))
diff --git a/friture/filter.py b/friture/filter.py
index 7d41ffb6..32f11028 100644
--- a/friture/filter.py
+++ b/friture/filter.py
@@ -82,11 +82,14 @@ def octave_filter_bank(forward, feedback, x, zis=None):
# filter for the octave
-def octave_filter_bank_decimation(blow, alow, forward, feedback, x, zis):
+def octave_filter_bank_decimation(blow, alow, forward, feedback, x, zis=None):
# This function filters the waveform x with the array of filters
# specified by the forward and feedback parameters. Each row
# of the forward and feedback parameters are the parameters
# to the Matlab builtin function "filter".
+ if zis is None:
+ zis = octave_filter_bank_decimation_filtic(blow, alow, forward, feedback)
+
bands_per_octave = len(forward)
filter_count = NOCTAVE * bands_per_octave
@@ -102,7 +105,10 @@ def octave_filter_bank_decimation(blow, alow, forward, feedback, x, zis):
for j in range(0, NOCTAVE):
for i in range(0, bands_per_octave)[::-1]:
- filt, zf = pyx_lfilter_float64_1D(forward[i], feedback[i], x_dec, zis[m])
+ filt, zf = pyx_lfilter_float64_1D(array(forward[i], dtype='float64'),
+ array(feedback[i], dtype='float64'),
+ array(x_dec, dtype='float64'),
+ array(zis[m], dtype='float64'))
m += 1
# zf can be reused to restart the filter
zfs += [zf]
diff --git a/friture/filter_design.py b/friture/filter_design.py
index 1cc749aa..0129128c 100644
--- a/friture/filter_design.py
+++ b/friture/filter_design.py
@@ -221,7 +221,7 @@ def main():
low_freq = 20.
impulse = zeros(N)
- impulse[N / 2] = 1
+ impulse[N // 2] = 1
f = 1000.
# impulse = sin(2*pi*f*arange(0, N/fs, 1./fs))
diff --git a/friture/friture_rc.py b/friture/friture_rc.py
index 22dbe58b..4c1bcb42 100644
--- a/friture/friture_rc.py
+++ b/friture/friture_rc.py
@@ -14624,41 +14624,41 @@
\x00\x00\x00\x12\x00\x02\x00\x00\x00\x11\x00\x00\x00\x03\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x11\
\x00\x00\x00\x4c\x00\x01\x00\x00\x00\x01\x00\x00\x0b\xac\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x15\
\x00\x00\x00\x70\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x93\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x15\
\x00\x00\x00\x84\x00\x00\x00\x00\x00\x01\x00\x00\x2c\xa2\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x15\
\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x4e\x77\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x15\
\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x01\x00\x00\x5a\x27\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x15\
\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x01\x00\x00\x64\x42\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x11\
\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x7d\xa9\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x15\
\x00\x00\x01\x0e\x00\x00\x00\x00\x00\x01\x00\x00\xa1\x01\
-\x00\x00\x01\x98\x76\xfb\xfd\x24\
+\x00\x00\x01\x9e\x98\x3f\x1d\x11\
\x00\x00\x01\x40\x00\x01\x00\x00\x00\x01\x00\x00\xa9\x50\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x15\
\x00\x00\x01\x58\x00\x00\x00\x00\x00\x01\x00\x00\xb3\x7f\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x15\
\x00\x00\x01\x7a\x00\x00\x00\x00\x00\x01\x00\x00\xe1\xf1\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x15\
\x00\x00\x01\x98\x00\x01\x00\x00\x00\x01\x00\x01\x06\xa0\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x15\
\x00\x00\x01\xae\x00\x01\x00\x00\x00\x01\x00\x01\x12\xd4\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x15\
\x00\x00\x01\xc8\x00\x00\x00\x00\x00\x01\x00\x01\x18\x43\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x15\
\x00\x00\x01\xf0\x00\x00\x00\x00\x00\x01\x00\x01\x34\xba\
-\x00\x00\x01\x98\x66\x36\x95\x94\
+\x00\x00\x01\x9e\x98\x3f\x1d\x11\
\x00\x00\x02\x12\x00\x00\x00\x00\x00\x01\x00\x01\x3f\x5a\
-\x00\x00\x01\x98\x76\xfb\xfd\x24\
+\x00\x00\x01\x9e\x98\x3f\x1d\x11\
\x00\x00\x02\x3c\x00\x00\x00\x00\x00\x01\x00\x01\x47\xa9\
-\x00\x00\x01\x98\x66\x36\x95\x98\
+\x00\x00\x01\x9e\x98\x3f\x1d\x1d\
"
qt_version = [int(v) for v in QtCore.qVersion().split('.')]
diff --git a/friture/generated_filters.py b/friture/generated_filters.py
index feee38f7..fb277f69 100644
--- a/friture/generated_filters.py
+++ b/friture/generated_filters.py
@@ -7,20 +7,20 @@
"1": [
[
[
- 0.3363108965857415,
- 0.0029152307841421206,
- -0.6666769535463926,
- 0.0029152307841421848,
- 0.3363108965857415
+ 0.3363033496153396,
+ 0.0029084532875080374,
+ -0.6666756805115592,
+ 0.0029084532875078254,
+ 0.33630334961533953
]
],
[
[
1.0,
- 1.5179045779899951,
- 0.6045055666013909,
- 0.3215227493617134,
- 0.2710064035996947
+ 1.517924118988161,
+ 0.6045458099754215,
+ 0.3215432523572021,
+ 0.27100698977533805
]
],
[
@@ -36,174 +36,174 @@
"12": [
[
[
- 0.005448187370533621,
- -0.0010629974182918066,
- 0.0011179842447383624,
- -0.0010629974182918072,
- 0.005448187370533622
+ 0.0054411083339362554,
+ -0.0010605044903814653,
+ 0.001103966397347418,
+ -0.001060504490381464,
+ 0.0054411083339362554
],
[
- 0.0057294989899974655,
- -1.3294967024414546e-05,
- 0.00041627290593000075,
- -1.329496702441709e-05,
- 0.0057294989899974655
+ 0.0057224356709578315,
+ -1.326378894834736e-05,
+ 0.00040255080257864325,
+ -1.3263788948349901e-05,
+ 0.0057224356709578315
],
[
- 0.006044169365567752,
- 0.0010905231079810897,
- -0.0001593708003429464,
- 0.0010905231079810856,
- 0.006044169365567752
+ 0.006037122079595859,
+ 0.0010879658147829262,
+ -0.00017324983879519435,
+ 0.0010879658147829295,
+ 0.006037122079595859
],
[
- 0.006395997270004583,
- 0.0022402651167464202,
- -0.0005869758405958241,
- 0.002240265116746421,
- 0.006395997270004583
+ 0.006388966288126936,
+ 0.002235011871460606,
+ -0.0006015336845885712,
+ 0.0022350118714606097,
+ 0.006388966288126935
],
[
- 0.00678919046884379,
- 0.0034242005535282225,
- -0.0008518641001138878,
- 0.003424200553528224,
- 0.006789190468843789
+ 0.006782176009421191,
+ 0.003416171413771622,
+ -0.0008676765940908338,
+ 0.0034161714137716168,
+ 0.00678217600942119
],
[
- 0.007228405744478006,
- 0.0046263849048229526,
- -0.000951575004289558,
- 0.004626384904822957,
- 0.007228405744478003
+ 0.007221407964232415,
+ 0.00461553734550084,
+ -0.0009692453896590252,
+ 0.004615537345500839,
+ 0.007221407964232417
],
[
- 0.0077187921262151455,
- 0.0058259661540583105,
- -0.0009017980364783889,
- 0.0058259661540583044,
- 0.0077187921262151455
+ 0.007711811110440522,
+ 0.005812306569361682,
+ -0.0009219166702983477,
+ 0.005812306569361687,
+ 0.007711811110440522
],
[
- 0.008266037453436747,
- 0.0069965209582132995,
- -0.0007429596651513413,
- 0.006996520958213299,
- 0.008266037453436747
+ 0.008259073205378777,
+ 0.0069801177162002025,
+ -0.0007660485209492277,
+ 0.006980117716200203,
+ 0.008259073205378775
],
[
- 0.008876418377870737,
- 0.00810549288410933,
- -0.0005467247118580525,
- 0.008105492884109328,
- 0.00887641837787074
+ 0.00886947080727253,
+ 0.008086490693466468,
+ -0.0005731668858570282,
+ 0.00808649069346647,
+ 0.00886947080727253
],
[
- 0.009556853883505606,
- 0.009113836080170704,
- -0.00042115515730946286,
- 0.009113836080170705,
- 0.009556853883505608
+ 0.00954992279433242,
+ 0.009092471186320951,
+ -0.00045111255161878866,
+ 0.00909247118632095,
+ 0.009549922794332416
],
[
- 0.010314962367991136,
- 0.00997600526841957,
- -0.0005126578498169293,
- 0.009976005268419566,
- 0.010314962367991138
+ 0.010308047445366968,
+ 0.009952620665900006,
+ -0.0005459845845076761,
+ 0.00995262066590001,
+ 0.010308047445366968
],
[
- 0.011159122286706945,
- 0.010640475627171676,
- -0.0010022551247777344,
- 0.010640475627171674,
- 0.011159122286706943
+ 0.011152223083119342,
+ 0.010615535045105182,
+ -0.0010384200089815854,
+ 0.010615535045105186,
+ 0.01115222308311934
]
],
[
[
1.0,
- -0.3455757698750249,
- 1.9049040817797995,
- -0.3251452278403145,
- 0.8854545339631857
+ -0.3455760204923311,
+ 1.9049069336379845,
+ -0.32514591119598,
+ 0.8854569601453669
],
[
1.0,
- -0.004329742412907664,
- 1.8673929698533336,
- -0.004059001899883938,
- 0.8790853374726256
+ -0.004329745748625324,
+ 1.867395949370689,
+ -0.00405901094748555,
+ 0.8790878884411579
],
[
1.0,
- 0.355809493563518,
- 1.8910291218906565,
- 0.3322794278490086,
- 0.8723898359431139
+ 0.3558097848028303,
+ 1.8910323304743795,
+ 0.33228021342015646,
+ 0.872392516843686
],
[
1.0,
- 0.7323801563221735,
- 1.9851543102328835,
- 0.6811631208248549,
- 0.8653547212752689
+ 0.732380793294604,
+ 1.9851578823387808,
+ 0.6811648289715944,
+ 0.8653575373024364
],
[
1.0,
- 1.1217603607809497,
- 2.1570676651028116,
- 1.038812348163675,
- 0.8579665785623407
+ 1.121761397550242,
+ 2.157071770475019,
+ 1.0388151114649224,
+ 0.85796953493505
],
[
1.0,
- 1.5189322950483144,
- 2.410497215174818,
- 1.4001843893218722,
- 0.8502119518960387
+ 1.518933787033987,
+ 2.4105020579277125,
+ 1.400188340436046,
+ 0.8502150538291299
],
[
1.0,
- 1.9172347526144586,
- 2.74375546348793,
- 1.7587834241607374,
- 0.8420774207570387
+ 1.9172367542802442,
+ 2.743761276266446,
+ 1.75878868938823,
+ 0.8420806734282995
],
[
1.0,
- 2.308118740748637,
- 3.1476905980234013,
- 2.1064860709639897,
- 0.8335496880481317
+ 2.3081213023385634,
+ 3.1476976292121437,
+ 2.106492761518522,
+ 0.8335530965604896
],
[
1.0,
- 2.6809291154259425,
- 3.60366685221627,
- 2.4334052946619655,
- 0.8246156808779896
+ 2.680932278549196,
+ 3.603675344184917,
+ 2.433413495272498,
+ 0.824619250216382
],
[
1.0,
- 3.0227458676372487,
- 4.0819706301906615,
- 2.7278242875840535,
- 0.8152626652452146
+ 3.0227496595165966,
+ 4.081980787121798,
+ 2.727834042128899,
+ 0.8152664002276861
],
[
1.0,
- 3.318331925085023,
- 4.541231919541632,
- 2.9762423529976565,
- 0.8054783758029627
+ 3.318336351333477,
+ 4.541243864823925,
+ 2.9762536470476726,
+ 0.8054822810255228
],
[
1.0,
- 3.550249863168939,
- 4.929638976240041,
- 3.163586225248753,
- 0.7952511619005473
+ 3.550254899065085,
+ 4.929652702089733,
+ 3.163598965709055,
+ 0.7952552416753291
]
],
[
@@ -252,342 +252,342 @@
"24": [
[
[
- 0.0037098446687558015,
- -0.0011014902648238888,
- 0.004974974185499445,
- -0.0011014902648238875,
- 0.0037098446687558015
+ 0.003702609627159013,
+ -0.0010989062943538518,
+ 0.004960367802425206,
+ -0.0010989062943538522,
+ 0.0037026096271590148
],
[
- 0.0037442760194772297,
- -0.0005684899734384592,
- 0.0048226223636459765,
- -0.0005684899734384589,
- 0.003744276019477229
+ 0.003737046185269829,
+ -0.0005671563724107402,
+ 0.004808201672506836,
+ -0.0005671563724107394,
+ 0.003737046185269828
],
[
- 0.003780786760163355,
- -1.9755798404434962e-05,
- 0.004711881905678835,
- -1.9755798404434542e-05,
- 0.003780786760163355
+ 0.00377356224402717,
+ -1.9709454372453376e-05,
+ 0.004697539319452926,
+ -1.9709454372452956e-05,
+ 0.003773562244027169
],
[
- 0.003819498300633509,
- 0.0005440368442486699,
- 0.004646792750729081,
- 0.0005440368442486697,
- 0.003819498300633509
+ 0.0038122792141830567,
+ 0.0005427606301319766,
+ 0.004632410636968335,
+ 0.0005427606301319756,
+ 0.0038122792141830593
],
[
- 0.003860538925204152,
- 0.0011220263148510649,
- 0.004631236897388352,
- 0.0011220263148510649,
- 0.003860538925204152
+ 0.0038533253808925223,
+ 0.0011193942647162087,
+ 0.004616687917208741,
+ 0.0011193942647162076,
+ 0.003853325380892523
],
[
- 0.0039040441670499014,
- 0.0017131439129835016,
- 0.004668826386882121,
- 0.0017131439129835,
- 0.0039040441670499006
+ 0.0038968362780660228,
+ 0.001709125257985346,
+ 0.004653974095001787,
+ 0.0017091252579853448,
+ 0.0038968362780660223
],
[
- 0.003950157201734613,
- 0.0023160918663751875,
- 0.004762772833885405,
- 0.0023160918663751905,
- 0.003950157201734613
+ 0.003942955081891472,
+ 0.00231065888404079,
+ 0.004747472582891365,
+ 0.0023106588840407912,
+ 0.00394295508189147
],
[
- 0.0039990292607874995,
- 0.00292932026550884,
- 0.004915737899204605,
- 0.0029293202655088398,
- 0.003999029260787498
+ 0.003991833024400751,
+ 0.002922448871159703,
+ 0.004899838092640652,
+ 0.002922448871159705,
+ 0.0039918330244007524
],
[
- 0.004050820066229783,
- 0.003551003116045749,
- 0.005129664680647557,
- 0.0035510031160457495,
- 0.004050820066229783
+ 0.004043629827986288,
+ 0.0035426735103577197,
+ 0.005113008419562192,
+ 0.003542673510357719,
+ 0.004043629827986286
],
[
- 0.0041056982869879044,
- 0.004179013743824133,
- 0.00540559078125582,
- 0.004179013743824133,
- 0.0041056982869879044
+ 0.00409851416180363,
+ 0.004169211118036629,
+ 0.005388017947057764,
+ 0.00416921111803663,
+ 0.00409851416180363
],
[
- 0.00416384201815884,
- 0.004810899861293473,
- 0.005743444830006586,
- 0.004810899861293471,
- 0.00416384201815884
+ 0.0041566641210255845,
+ 0.004799615160854701,
+ 0.00572479464230092,
+ 0.004799615160854704,
+ 0.004156664121025585
],
[
- 0.004225439284124329,
- 0.005443858691077347,
- 0.006141829509722515,
- 0.0054438586910773475,
- 0.0042254392841243275
+ 0.004218267729944693,
+ 0.005431089437583128,
+ 0.006121943590623718,
+ 0.00543108943758313,
+ 0.004218267729944694
],
[
- 0.004290688566539671,
- 0.006074712643113597,
- 0.006597795716078649,
- 0.006074712643113597,
- 0.004290688566539674
+ 0.004283523469949686,
+ 0.00606046381323238,
+ 0.006576521681639655,
+ 0.006060463813232381,
+ 0.004283523469949686
],
[
- 0.00435979935825286,
- 0.006699886157605847,
- 0.00710661434705972,
- 0.006699886157605846,
- 0.004359799358252859
+ 0.0043526408334316905,
+ 0.006684171116245769,
+ 0.0070838099311999955,
+ 0.006684171116245771,
+ 0.004352640833431689
],
[
- 0.004432992744238069,
- 0.007315384457733258,
- 0.007661554406226111,
- 0.007315384457733256,
- 0.00443299274423807
+ 0.00442584090470414,
+ 0.007298225940961537,
+ 0.00763709210216389,
+ 0.007298225940961537,
+ 0.004425840904704139
],
[
- 0.004510502010656045,
- 0.007916775104293922,
- 0.008253678576296681,
- 0.00791677510429392,
- 0.004510502010656045
+ 0.004503356969048996,
+ 0.00789820624542594,
+ 0.00822745075431348,
+ 0.007898206245425943,
+ 0.004503356969048997
],
[
- 0.00459257328317966,
- 0.008499173409327404,
- 0.008871670132195447,
- 0.008499173409327404,
- 0.004592573283179659
+ 0.004585435151027445,
+ 0.008479238799123238,
+ 0.00884359456002379,
+ 0.008479238799123236,
+ 0.004585435151027441
],
[
- 0.004679466195750027,
- 0.009057232946749743,
- 0.009501707924663764,
- 0.009057232946749741,
- 0.004679466195750027
+ 0.004672335083220544,
+ 0.009035989715752233,
+ 0.009471733577543036,
+ 0.009035989715752235,
+ 0.004672335083220545
],
[
- 0.004771454590950996,
- 0.009585142593745799,
- 0.010127409034568078,
- 0.009585142593745799,
- 0.004771454590950994
+ 0.004764330606587514,
+ 0.00956266150143178,
+ 0.0100955220360428,
+ 0.009562661501431783,
+ 0.0047643306065875135
],
[
- 0.004868827253212928,
- 0.010076631744552133,
- 0.0107298613673249,
- 0.010076631744552136,
- 0.004868827253212928
+ 0.0048617105036527055,
+ 0.010052998256119232,
+ 0.010696090849635452,
+ 0.010052998256119232,
+ 0.004861710503652707
],
[
- 0.004971888676076138,
- 0.010524985554303723,
- 0.011287770642718176,
- 0.010524985554303729,
- 0.00497188867607614
+ 0.004964779265751502,
+ 0.010500300881559248,
+ 0.01125219425829016,
+ 0.010500300881559246,
+ 0.004964779265751501
],
[
- 0.005080959864762281,
- 0.01092307228891862,
- 0.011777747566357424,
- 0.01092307228891862,
- 0.005080959864762281
+ 0.005073857895583499,
+ 0.010897454366870639,
+ 0.011740496321440702,
+ 0.010897454366870637,
+ 0.0050738578955835
],
[
- 0.005196379175315515,
- 0.01126338506936376,
- 0.012174760978921107,
- 0.01126338506936376,
- 0.005196379175315515
+ 0.005189284746334766,
+ 0.011236969434750284,
+ 0.012136022999961839,
+ 0.011236969434750286,
+ 0.005189284746334766
],
[
- 0.005318503191588221,
- 0.011538100494075746,
- 0.012452780906908935,
- 0.01153810049407575,
- 0.00531850319158822
+ 0.005311416398643936,
+ 0.011511041026246673,
+ 0.01241280369417367,
+ 0.011511041026246675,
+ 0.005311416398643938
]
],
[
[
1.0,
- -0.3527940594968014,
- 1.9693875272603392,
- -0.34221482451688,
- 0.9409517367141373
+ -0.3527941842716257,
+ 1.9693889416738615,
+ -0.34221518077909596,
+ 0.9409530287667749
],
[
1.0,
- -0.18216050979508885,
- 1.9447237165602855,
- -0.17654041987277513,
- 0.939275922699878
+ -0.18216057616075979,
+ 1.9447251566127672,
+ -0.1765406090985662,
+ 0.9392772501817404
],
[
1.0,
- -0.0063331874444524094,
- 1.934545646619323,
- -0.006132156862573429,
- 0.9375541944008867
+ -0.006333189821311612,
+ 1.9345471232667164,
+ -0.006132163629912375,
+ 0.9375555582085322
],
[
1.0,
- 0.17448498804322346,
- 1.9402056264869356,
- 0.16878671580978263,
- 0.9357853919734934
+ 0.17448505550218374,
+ 1.9402071526466014,
+ 0.1687869075948702,
+ 0.9357867930216013
],
[
1.0,
- 0.36003160308657306,
- 1.963010498175576,
- 0.3479349417138068,
- 0.9339683322385547
+ 0.3600317464806731,
+ 1.963012088867095,
+ 0.3479353487658613,
+ 0.9339697714599987
],
[
1.0,
- 0.5499779130296545,
- 2.0041865332487543,
- 0.5309669460770756,
- 0.9321018085959966
+ 0.5499781386892546,
+ 2.0041882057131337,
+ 0.5309675856620597,
+ 0.9321032869418907
],
[
1.0,
- 0.7439215942314029,
- 2.0648385200198103,
- 0.7174661953192853,
- 0.930184590969224
+ 0.74392190868938,
+ 2.0648402938075288,
+ 0.7174670851649776,
+ 0.9301861094089499
],
[
1.0,
- 0.9413791193224187,
- 2.145902850797162,
- 0.906938268190278,
- 0.9282154257819328
+ 0.9413795292772692,
+ 2.1459047478137965,
+ 0.9069394263732546,
+ 0.9282169853031318
],
[
1.0,
- 1.141777806339264,
- 2.2480946022747323,
- 1.0988036964002577,
- 0.9261930359699481
+ 1.1417783186086101,
+ 2.2480966467712498,
+ 1.0988051412062907,
+ 0.9261946375784936
],
[
1.0,
- 1.3444476124512956,
- 2.3718488491638388,
- 1.292390652149637,
- 0.9241161210309166
+ 1.3444482339144677,
+ 2.371851067656928,
+ 1.292392401904104,
+ 0.9241177657508457
],
[
1.0,
- 1.5486127667986689,
- 2.5172567716939294,
- 1.4869275829235713,
- 0.9219833571148017
+ 1.5486135043269502,
+ 2.5172591928002914,
+ 1.4869296557883078,
+ 0.92198504598822
],
[
1.0,
- 1.7533833650028998,
- 2.6839975213341636,
- 1.6815359206603064,
- 0.9197933971583108
+ 1.7533842253759362,
+ 2.6840001755014358,
+ 1.6815383343931773,
+ 0.9197951312452566
],
[
1.0,
- 1.9577470806281876,
- 2.871267304150812,
- 1.8752230232603018,
- 0.9175448710665493
+ 1.9577480704350139,
+ 2.8712702232671488,
+ 1.8752257949337108,
+ 0.9175466514448232
],
[
1.0,
- 2.160561186671763,
- 3.077707732916177,
- 2.0668755416599707,
- 0.9152363859453709
+ 2.1605623121948447,
+ 3.07771094978049,
+ 2.066878687334504,
+ 0.9152382137103172
],
[
1.0,
- 2.360545123398933,
- 3.3013361881248757,
- 2.255253445563559,
- 0.9128665263880712
+ 2.3605463904796617,
+ 3.301339735760866,
+ 2.255256979913141,
+ 0.9128684026523192
],
[
1.0,
- 2.556273897777094,
- 3.539481708334622,
- 2.4389849855161962,
- 0.9104338548202684
+ 2.5562753116611976,
+ 3.539485619134116,
+ 2.438988921401362,
+ 0.9104357807134231
],
[
1.0,
- 2.7461726545280998,
- 3.788730786063357,
- 2.6165629182641204,
- 0.9079369119070112
+ 2.746174219689572,
+ 3.7887350907486717,
+ 2.616567266250504,
+ 0.9079388885752951
],
[
1.0,
- 2.928512819336991,
- 4.044888348397372,
- 2.786342376027754,
- 0.905374217026339
+ 2.92851453927934,
+ 4.04489307479879,
+ 2.7863471438475633,
+ 0.9053762456321759
],
[
1.0,
- 3.10141028068263,
- 4.302960106616497,
- 2.946540817874176,
- 0.9027442688137435
+ 3.101412157716556,
+ 4.302965278269912,
+ 2.946546009829423,
+ 0.9027463505352856
],
[
1.0,
- 3.2628261473839877,
- 4.557163301280205,
- 3.0952405619189216,
- 0.900045545782185
+ 3.2628281823810266,
+ 4.557168935861959,
+ 3.0952461782264695,
+ 0.9000476818127766
],
[
1.0,
- 3.4105706931042983,
- 4.800973558835779,
- 3.2303944592534473,
- 0.8972765070225422
+ 3.4105728852265575,
+ 4.800979666467094,
+ 3.2304004953336682,
+ 0.8972786985701191
],
[
1.0,
- 3.5423111749420695,
- 5.0272159957243625,
- 3.3498353323499286,
- 0.8944355929895743
+ 3.5423135213489374,
+ 5.02722257719664,
+ 3.349841778062943,
+ 0.8944378412759912
],
[
1.0,
- 3.6555842883297376,
- 5.228208709090527,
- 3.45128985960155,
- 0.8915212263787494
+ 3.6555867838634217,
+ 5.2282157540852525,
+ 3.451296698437719,
+ 0.8915235326390322
],
[
1.0,
- 3.7478140913010014,
- 5.395966202487305,
- 3.532397640127616,
- 0.8885318130994614
+ 3.7478167281539707,
+ 5.395973687889837,
+ 3.5324048483623205,
+ 0.8885341785809783
]
],
[
@@ -672,48 +672,48 @@
"3": [
[
[
- 0.043140032193149457,
- 0.0009913017706948664,
- -0.07667939614588672,
- 0.0009913017706948963,
- 0.04314003219314946
+ 0.04313318029676904,
+ 0.0009889818711902266,
+ -0.07668816037058925,
+ 0.0009889818711902242,
+ 0.04313318029676906
],
[
- 0.06287596977873822,
- 0.0046286568564018115,
- -0.1145356290930384,
- 0.004628656856401808,
- 0.06287596977873819
+ 0.06286900918183483,
+ 0.00461783207041342,
+ -0.11454793886949446,
+ 0.0046178320704134326,
+ 0.06286900918183481
],
[
- 0.09108072445676865,
- 0.007350607974862103,
- -0.1674186233495754,
- 0.007350607974862224,
- 0.09108072445676862
+ 0.09107358397574383,
+ 0.007333432037306018,
+ -0.1674387914905324,
+ 0.007333432037306081,
+ 0.09107358397574382
]
],
[
[
1.0,
- 0.3561130837789026,
- 1.4443960481721407,
- 0.26937000887611384,
- 0.584477620820897
+ 0.3561143609473461,
+ 1.4444084909429913,
+ 0.26937269456792,
+ 0.5844843680220937
],
[
1.0,
- 1.7173260282150693,
- 2.0258851827233904,
- 1.2032241926844989,
- 0.5127005259240065
+ 1.7173338781953773,
+ 2.025906187944451,
+ 1.2032395607401003,
+ 0.5127076520493832
],
[
1.0,
- 2.8395043889825993,
- 3.212304944135884,
- 1.7985192128394694,
- 0.43884589651843153
+ 2.8395208379262433,
+ 3.2123440388454516,
+ 1.7985488228609574,
+ 0.4388529911370751
]
],
[
@@ -735,90 +735,90 @@
"6": [
[
[
- 0.012105688508488586,
- -0.0009797415605366504,
- -0.012937935296941714,
- -0.0009797415605366571,
- 0.012105688508488583
+ 0.012098804535988503,
+ -0.0009774452669669685,
+ -0.012950589760434412,
+ -0.0009774452669669765,
+ 0.012098804535988512
],
[
- 0.014313301761881182,
- 0.0010417989052842998,
- -0.01751498600433224,
- 0.001041798905284295,
- 0.014313301761881178
+ 0.014306445577478724,
+ 0.0010393575248365066,
+ -0.017527312908190797,
+ 0.0010393575248365146,
+ 0.01430644557747873
],
[
- 0.017036388510423252,
- 0.0031974146486836697,
- -0.022308506772127996,
- 0.003197414648683661,
- 0.017036388510423255
+ 0.017029555585410246,
+ 0.0031899229842500664,
+ -0.022322405055845422,
+ 0.003189922984250055,
+ 0.017029555585410246
],
[
- 0.020385588043752862,
- 0.005373759246137571,
- -0.02744337382455276,
- 0.005373759246137564,
- 0.020385588043752866
+ 0.02037877212387702,
+ 0.005361170671951351,
+ -0.027460963708708222,
+ 0.005361170671951344,
+ 0.020378772123877016
],
[
- 0.024491896152489895,
- 0.007388805923494939,
- -0.03335037083741435,
- 0.00738880592349492,
- 0.024491896152489895
+ 0.024485089035415443,
+ 0.00737150051799962,
+ -0.03337337181559836,
+ 0.007371500517999609,
+ 0.024485089035415436
],
[
- 0.02950924778886837,
- 0.008980557013039462,
- -0.040932092208741125,
- 0.008980557013039465,
- 0.02950924778886837
+ 0.029502439152902887,
+ 0.00895952847365931,
+ -0.04096082538845119,
+ 0.008959528473659316,
+ 0.029502439152902894
]
],
[
[
1.0,
- -0.3279673214072805,
- 1.7721184363152322,
- -0.2902216089499693,
- 0.7844913672620322
+ -0.32796781637807093,
+ 1.7721241643869212,
+ -0.2902228499753226,
+ 0.7844956268504282
],
[
1.0,
- 0.3512129030186812,
- 1.7438339316667815,
- 0.3061324386980487,
- 0.7617226485362805
+ 0.3512135026590967,
+ 1.7438403687131991,
+ 0.3061339136845813,
+ 0.7617272752666735
],
[
1.0,
- 1.0864517200453219,
- 1.9744231155784162,
- 0.9310255629390407,
- 0.7370360765300357
+ 1.0864538189891375,
+ 1.974431275215766,
+ 0.93103061916119,
+ 0.7370410799189633
],
[
1.0,
- 1.8420966973795174,
- 2.4943371847553397,
- 1.5485918414914146,
- 0.710394020295732
+ 1.8421007248141257,
+ 2.4943485557930565,
+ 1.5486013248382018,
+ 0.7103994037323602
],
[
1.0,
- 2.5578447237108595,
- 3.2503270745529127,
- 2.1042806922617907,
- 0.681794050106052
+ 2.5578510524526363,
+ 3.2503433901344474,
+ 2.1042952295453325,
+ 0.6817998089551857
],
[
1.0,
- 3.1431296868521974,
- 4.054722532464942,
- 2.5233451852172704,
- 0.6512793373366625
+ 3.143138486535201,
+ 4.054745087164861,
+ 2.523364861043847,
+ 0.651285456779766
]
],
[
@@ -848,34 +848,34 @@
],
"dec": [
[
- 0.011536697475707477,
- 0.03863239409987755,
- 0.10808835129075559,
- 0.20611576754172498,
- 0.32963659619400776,
- 0.42517932605498265,
- 0.4661693965957637,
- 0.4251793260549823,
- 0.3296365961940077,
- 0.20611576754172484,
- 0.10808835129075547,
- 0.03863239409987752,
- 0.011536697475707474
+ 0.011534811665481126,
+ 0.038627771494424645,
+ 0.10807545592262986,
+ 0.20609418525311068,
+ 0.3296026100110363,
+ 0.42513772941992284,
+ 0.46612344317950194,
+ 0.42513772941992223,
+ 0.3296026100110361,
+ 0.20609418525311066,
+ 0.1080754559226299,
+ 0.03862777149442464,
+ 0.011534811665481124
],
[
1.0,
- -2.217799581317487,
- 6.050876867187728,
- -8.921323656714186,
- 13.006330216820826,
- -13.58725771157039,
- 12.99339017045834,
- -9.673218888416496,
- 6.243626997073957,
- -3.1439412347242843,
- 1.2640695988464932,
- -0.35467961675541876,
- 0.060088025064203764
+ -2.217873400831394,
+ 6.050981991249758,
+ -8.921632424234804,
+ 13.006651345546194,
+ -13.587720901137768,
+ 12.993740054076893,
+ -9.673524593593946,
+ 6.243785956633122,
+ -3.144024796921131,
+ 1.2640947109213718,
+ -0.3546857421422574,
+ 0.06008828397902494
]
]
}
diff --git a/friture/main_window_view_model.py b/friture/main_window_view_model.py
index 588bd7bc..8aa9cad8 100644
--- a/friture/main_window_view_model.py
+++ b/friture/main_window_view_model.py
@@ -26,6 +26,7 @@
class MainWindowViewModel(QtCore.QObject):
playback_control_enabled_changed = pyqtSignal(bool)
+ theme_index_changed = pyqtSignal(int)
def __init__(self, parent=None):
super().__init__(parent)
@@ -34,6 +35,7 @@ def __init__(self, parent=None):
self._level_view_model = LevelViewModel(self)
self._playback_control_view_model = PlaybackControlViewModel(self)
self._playback_control_enabled = False
+ self._theme_index = 0 # 0 = System Default, 1 = Light, 2 = Dark
@pyqtProperty(MainToolbarViewModel, constant=True) # type: ignore
def toolbar_view_model(self):
@@ -56,3 +58,43 @@ def set_playback_control_enabled(self, playback_control_enabled: bool) -> None:
self.playback_control_enabled_changed.emit(playback_control_enabled)
playback_control_enabled = pyqtProperty(int, fget=get_playback_control_enabled, fset=set_playback_control_enabled, notify=playback_control_enabled_changed)
+
+ def get_theme_index(self) -> int:
+ return self._theme_index
+
+ def set_theme_index(self, index: int) -> None:
+ if self._theme_index != index:
+ self._theme_index = index
+ self.theme_index_changed.emit(index)
+
+ theme_index = pyqtProperty(int, fget=get_theme_index, fset=set_theme_index, notify=theme_index_changed)
+
+ @pyqtProperty(str, notify=theme_index_changed)
+ def window_color(self) -> str:
+ from PyQt5.QtWidgets import QApplication
+ return QApplication.instance().palette().window().color().name()
+
+ @pyqtProperty(str, notify=theme_index_changed)
+ def window_text_color(self) -> str:
+ from PyQt5.QtWidgets import QApplication
+ return QApplication.instance().palette().windowText().color().name()
+
+ @pyqtProperty(str, notify=theme_index_changed)
+ def base_color(self) -> str:
+ from PyQt5.QtWidgets import QApplication
+ return QApplication.instance().palette().base().color().name()
+
+ @pyqtProperty(str, notify=theme_index_changed)
+ def text_color(self) -> str:
+ from PyQt5.QtWidgets import QApplication
+ return QApplication.instance().palette().text().color().name()
+
+ @pyqtProperty(str, notify=theme_index_changed)
+ def button_color(self) -> str:
+ from PyQt5.QtWidgets import QApplication
+ return QApplication.instance().palette().button().color().name()
+
+ @pyqtProperty(str, notify=theme_index_changed)
+ def button_text_color(self) -> str:
+ from PyQt5.QtWidgets import QApplication
+ return QApplication.instance().palette().buttonText().color().name()
diff --git a/friture/settings.py b/friture/settings.py
index 5c84ec96..3bea4410 100644
--- a/friture/settings.py
+++ b/friture/settings.py
@@ -39,6 +39,7 @@
class Settings_Dialog(QtWidgets.QDialog, Ui_Settings_Dialog):
show_playback_changed = pyqtSignal(bool)
history_length_changed = pyqtSignal(int)
+ theme_changed = pyqtSignal(int)
def __init__(self, parent, toolbar_view_model: MainToolbarViewModel):
QtWidgets.QDialog.__init__(self, parent)
@@ -84,6 +85,7 @@ def __init__(self, parent, toolbar_view_model: MainToolbarViewModel):
self.radioButton_duo.toggled.connect(self.duo_input_type_selected)
self.checkbox_showPlayback.stateChanged.connect(self.show_playback_checkbox_changed)
self.spinBox_historyLength.editingFinished.connect(self.history_length_edit_finished)
+ self.comboBox_theme.currentIndexChanged.connect(self.theme_combo_changed)
@pyqtProperty(bool, notify=show_playback_changed) # type: ignore
def show_playback(self) -> bool:
@@ -182,6 +184,10 @@ def show_playback_checkbox_changed(self, state: int) -> None:
def history_length_edit_finished(self) -> None:
self.history_length_changed.emit(self.spinBox_historyLength.value())
+ # slot
+ def theme_combo_changed(self, index: int) -> None:
+ self.theme_changed.emit(index)
+
# method
def saveState(self, settings):
# for the input device, we search by name instead of index, since
@@ -192,6 +198,7 @@ def saveState(self, settings):
settings.setValue("duoInput", self.inputTypeButtonGroup.checkedId())
settings.setValue("showPlayback", self.checkbox_showPlayback.checkState())
settings.setValue("historyLength", self.spinBox_historyLength.value())
+ settings.setValue("theme", self.comboBox_theme.currentIndex())
# method
def restoreState(self, settings):
@@ -210,3 +217,7 @@ def restoreState(self, settings):
self.spinBox_historyLength.setValue(settings.value("historyLength", 30, type=int))
# need to emit this because setValue doesn't emit editFinished
self.history_length_changed.emit(self.spinBox_historyLength.value())
+
+ theme_index = settings.value("theme", 0, type=int)
+ self.comboBox_theme.setCurrentIndex(theme_index)
+ self.theme_changed.emit(theme_index)
diff --git a/friture/ui_settings.py b/friture/ui_settings.py
index 73d17032..74b809aa 100644
--- a/friture/ui_settings.py
+++ b/friture/ui_settings.py
@@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'ui/settings.ui'
#
-# Created by: PyQt5 UI code generator 5.15.10
+# Created by: PyQt5 UI code generator 5.15.11
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
@@ -75,6 +75,20 @@ def setupUi(self, Settings_Dialog):
self.horizontalLayout.addLayout(self.verticalLayout_4)
self.verticalLayout_6.addLayout(self.horizontalLayout)
self.verticalLayout_5.addWidget(self.inputGroup)
+ self.themeGroup = QtWidgets.QGroupBox(Settings_Dialog)
+ self.themeGroup.setObjectName("themeGroup")
+ self.formLayout_3 = QtWidgets.QFormLayout(self.themeGroup)
+ self.formLayout_3.setObjectName("formLayout_3")
+ self.label_theme = QtWidgets.QLabel(self.themeGroup)
+ self.label_theme.setObjectName("label_theme")
+ self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_theme)
+ self.comboBox_theme = QtWidgets.QComboBox(self.themeGroup)
+ self.comboBox_theme.setObjectName("comboBox_theme")
+ self.comboBox_theme.addItem("")
+ self.comboBox_theme.addItem("")
+ self.comboBox_theme.addItem("")
+ self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.comboBox_theme)
+ self.verticalLayout_5.addWidget(self.themeGroup)
self.playbackGroup = QtWidgets.QGroupBox(Settings_Dialog)
self.playbackGroup.setMinimumSize(QtCore.QSize(0, 0))
self.playbackGroup.setObjectName("playbackGroup")
@@ -113,6 +127,11 @@ def retranslateUi(self, Settings_Dialog):
self.radioButton_duo.setText(_translate("Settings_Dialog", "Two channels"))
self.groupBox_first.setTitle(_translate("Settings_Dialog", "First channel"))
self.groupBox_second.setTitle(_translate("Settings_Dialog", "Second channel"))
+ self.themeGroup.setTitle(_translate("Settings_Dialog", "Appearance"))
+ self.label_theme.setText(_translate("Settings_Dialog", "Theme:"))
+ self.comboBox_theme.setItemText(0, _translate("Settings_Dialog", "System Default"))
+ self.comboBox_theme.setItemText(1, _translate("Settings_Dialog", "Light"))
+ self.comboBox_theme.setItemText(2, _translate("Settings_Dialog", "Dark"))
self.playbackGroup.setTitle(_translate("Settings_Dialog", "Playback"))
self.label_showPlayback.setText(_translate("Settings_Dialog", "Show Playback Controls"))
self.label_historyLength.setText(_translate("Settings_Dialog", "History Length"))
diff --git a/ui/settings.ui b/ui/settings.ui
index a5be73d1..76769b31 100644
--- a/ui/settings.ui
+++ b/ui/settings.ui
@@ -132,6 +132,41 @@
+ -
+
+
+ Appearance
+
+
+
-
+
+
+ Theme:
+
+
+
+ -
+
+
-
+
+ System Default
+
+
+ -
+
+ Light
+
+
+ -
+
+ Dark
+
+
+
+
+
+
+
-
diff --git a/uv.lock b/uv.lock
new file mode 100644
index 00000000..cc715707
--- /dev/null
+++ b/uv.lock
@@ -0,0 +1,511 @@
+version = 1
+revision = 3
+requires-python = ">=3.11"
+
+[[package]]
+name = "altgraph"
+version = "0.17.5"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7e/f8/97fdf103f38fed6792a1601dbc16cc8aac56e7459a9fff08c812d8ae177a/altgraph-0.17.5.tar.gz", hash = "sha256:c87b395dd12fabde9c99573a9749d67da8d29ef9de0125c7f536699b4a9bc9e7", size = 48428, upload-time = "2025-11-21T20:35:50.583Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a9/ba/000a1996d4308bc65120167c21241a3b205464a2e0b58deda26ae8ac21d1/altgraph-0.17.5-py2.py3-none-any.whl", hash = "sha256:f3a22400bce1b0c701683820ac4f3b159cd301acab067c51c653e06961600597", size = 21228, upload-time = "2025-11-21T20:35:49.444Z" },
+]
+
+[[package]]
+name = "cffi"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycparser", marker = "implementation_name != 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" },
+ { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" },
+ { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" },
+ { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" },
+ { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" },
+ { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" },
+ { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" },
+ { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" },
+ { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" },
+ { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" },
+ { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" },
+ { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" },
+ { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" },
+ { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" },
+ { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" },
+ { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" },
+ { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" },
+]
+
+[[package]]
+name = "docutils"
+version = "0.22.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4a/c0/89fe6215b443b919cb98a5002e107cb5026854ed1ccb6b5833e0768419d1/docutils-0.22.2.tar.gz", hash = "sha256:9fdb771707c8784c8f2728b67cb2c691305933d68137ef95a75db5f4dfbc213d", size = 2289092, upload-time = "2025-09-20T17:55:47.994Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/66/dd/f95350e853a4468ec37478414fc04ae2d61dad7a947b3015c3dcc51a09b9/docutils-0.22.2-py3-none-any.whl", hash = "sha256:b0e98d679283fc3bb0ead8a5da7f501baa632654e7056e9c5846842213d674d8", size = 632667, upload-time = "2025-09-20T17:55:43.052Z" },
+]
+
+[[package]]
+name = "friture"
+source = { editable = "." }
+dependencies = [
+ { name = "docutils" },
+ { name = "numpy" },
+ { name = "platformdirs" },
+ { name = "pyinstaller" },
+ { name = "pyqt5" },
+ { name = "pyrr" },
+ { name = "rtmixer" },
+ { name = "sounddevice" },
+]
+
+[package.optional-dependencies]
+dev = [
+ { name = "mypy" },
+ { name = "pyqt5-stubs" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "docutils", specifier = "==0.22.2" },
+ { name = "mypy", marker = "extra == 'dev'", specifier = "==1.18.2" },
+ { name = "numpy", specifier = "==2.3.4" },
+ { name = "platformdirs", specifier = "==4.5.0" },
+ { name = "pyinstaller", specifier = "==6.16.0" },
+ { name = "pyqt5", specifier = "==5.15.11" },
+ { name = "pyqt5-stubs", marker = "extra == 'dev'", specifier = "==5.15.6.0" },
+ { name = "pyrr", specifier = "==0.10.3" },
+ { name = "rtmixer", specifier = "==0.1.7" },
+ { name = "sounddevice", specifier = "==0.5.3" },
+]
+provides-extras = ["dev"]
+
+[[package]]
+name = "macholib"
+version = "1.16.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "altgraph" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/10/2f/97589876ea967487978071c9042518d28b958d87b17dceb7cdc1d881f963/macholib-1.16.4.tar.gz", hash = "sha256:f408c93ab2e995cd2c46e34fe328b130404be143469e41bc366c807448979362", size = 59427, upload-time = "2025-11-22T08:28:38.373Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/d1/a9f36f8ecdf0fb7c9b1e78c8d7af12b8c8754e74851ac7b94a8305540fc7/macholib-1.16.4-py2.py3-none-any.whl", hash = "sha256:da1a3fa8266e30f0ce7e97c6a54eefaae8edd1e5f86f3eb8b95457cae90265ea", size = 38117, upload-time = "2025-11-22T08:28:36.939Z" },
+]
+
+[[package]]
+name = "multipledispatch"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/fe/3e/a62c3b824c7dec33c4a1578bcc842e6c30300051033a4e5975ed86cc2536/multipledispatch-1.0.0.tar.gz", hash = "sha256:5c839915465c68206c3e9c473357908216c28383b425361e5d144594bf85a7e0", size = 12385, upload-time = "2023-06-27T16:45:11.074Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/51/c0/00c9809d8b9346eb238a6bbd5f83e846a4ce4503da94a4c08cb7284c325b/multipledispatch-1.0.0-py3-none-any.whl", hash = "sha256:0c53cd8b077546da4e48869f49b13164bebafd0c2a5afceb6bb6a316e7fb46e4", size = 12818, upload-time = "2023-06-27T16:45:09.418Z" },
+]
+
+[[package]]
+name = "mypy"
+version = "1.18.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mypy-extensions" },
+ { name = "pathspec" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846, upload-time = "2025-09-19T00:11:10.519Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/88/87/cafd3ae563f88f94eec33f35ff722d043e09832ea8530ef149ec1efbaf08/mypy-1.18.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:807d9315ab9d464125aa9fcf6d84fde6e1dc67da0b6f80e7405506b8ac72bc7f", size = 12731198, upload-time = "2025-09-19T00:09:44.857Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/e0/1e96c3d4266a06d4b0197ace5356d67d937d8358e2ee3ffac71faa843724/mypy-1.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341", size = 11817879, upload-time = "2025-09-19T00:09:47.131Z" },
+ { url = "https://files.pythonhosted.org/packages/72/ef/0c9ba89eb03453e76bdac5a78b08260a848c7bfc5d6603634774d9cd9525/mypy-1.18.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d", size = 12427292, upload-time = "2025-09-19T00:10:22.472Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/52/ec4a061dd599eb8179d5411d99775bec2a20542505988f40fc2fee781068/mypy-1.18.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86", size = 13163750, upload-time = "2025-09-19T00:09:51.472Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/5f/2cf2ceb3b36372d51568f2208c021870fe7834cf3186b653ac6446511839/mypy-1.18.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ca30b50a51e7ba93b00422e486cbb124f1c56a535e20eff7b2d6ab72b3b2e37", size = 13351827, upload-time = "2025-09-19T00:09:58.311Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/7d/2697b930179e7277529eaaec1513f8de622818696857f689e4a5432e5e27/mypy-1.18.2-cp311-cp311-win_amd64.whl", hash = "sha256:664dc726e67fa54e14536f6e1224bcfce1d9e5ac02426d2326e2bb4e081d1ce8", size = 9757983, upload-time = "2025-09-19T00:10:09.071Z" },
+ { url = "https://files.pythonhosted.org/packages/07/06/dfdd2bc60c66611dd8335f463818514733bc763e4760dee289dcc33df709/mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", size = 12908273, upload-time = "2025-09-19T00:10:58.321Z" },
+ { url = "https://files.pythonhosted.org/packages/81/14/6a9de6d13a122d5608e1a04130724caf9170333ac5a924e10f670687d3eb/mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", size = 11920910, upload-time = "2025-09-19T00:10:20.043Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/a9/b29de53e42f18e8cc547e38daa9dfa132ffdc64f7250e353f5c8cdd44bee/mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", size = 12465585, upload-time = "2025-09-19T00:10:33.005Z" },
+ { url = "https://files.pythonhosted.org/packages/77/ae/6c3d2c7c61ff21f2bee938c917616c92ebf852f015fb55917fd6e2811db2/mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", size = 13348562, upload-time = "2025-09-19T00:10:11.51Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/31/aec68ab3b4aebdf8f36d191b0685d99faa899ab990753ca0fee60fb99511/mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", size = 13533296, upload-time = "2025-09-19T00:10:06.568Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/83/abcb3ad9478fca3ebeb6a5358bb0b22c95ea42b43b7789c7fb1297ca44f4/mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074", size = 9828828, upload-time = "2025-09-19T00:10:28.203Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728, upload-time = "2025-09-19T00:10:01.33Z" },
+ { url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758, upload-time = "2025-09-19T00:10:42.607Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342, upload-time = "2025-09-19T00:11:00.371Z" },
+ { url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709, upload-time = "2025-09-19T00:11:03.358Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806, upload-time = "2025-09-19T00:10:26.073Z" },
+ { url = "https://files.pythonhosted.org/packages/71/cf/ac0f2c7e9d0ea3c75cd99dff7aec1c9df4a1376537cb90e4c882267ee7e9/mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", size = 9833262, upload-time = "2025-09-19T00:10:40.035Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775, upload-time = "2025-09-19T00:10:03.814Z" },
+ { url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852, upload-time = "2025-09-19T00:10:51.631Z" },
+ { url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242, upload-time = "2025-09-19T00:11:07.955Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683, upload-time = "2025-09-19T00:09:55.572Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749, upload-time = "2025-09-19T00:10:44.827Z" },
+ { url = "https://files.pythonhosted.org/packages/25/bc/cc98767cffd6b2928ba680f3e5bc969c4152bf7c2d83f92f5a504b92b0eb/mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", size = 9982959, upload-time = "2025-09-19T00:10:37.344Z" },
+ { url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367, upload-time = "2025-09-19T00:10:15.489Z" },
+]
+
+[[package]]
+name = "mypy-extensions"
+version = "1.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.3.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b5/f4/098d2270d52b41f1bd7db9fc288aaa0400cb48c2a3e2af6fa365d9720947/numpy-2.3.4.tar.gz", hash = "sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a", size = 20582187, upload-time = "2025-10-15T16:18:11.77Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/60/e7/0e07379944aa8afb49a556a2b54587b828eb41dc9adc56fb7615b678ca53/numpy-2.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e78aecd2800b32e8347ce49316d3eaf04aed849cd5b38e0af39f829a4e59f5eb", size = 21259519, upload-time = "2025-10-15T16:15:19.012Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/cb/5a69293561e8819b09e34ed9e873b9a82b5f2ade23dce4c51dc507f6cfe1/numpy-2.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd09cc5d65bda1e79432859c40978010622112e9194e581e3415a3eccc7f43f", size = 14452796, upload-time = "2025-10-15T16:15:23.094Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/04/ff11611200acd602a1e5129e36cfd25bf01ad8e5cf927baf2e90236eb02e/numpy-2.3.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1b219560ae2c1de48ead517d085bc2d05b9433f8e49d0955c82e8cd37bd7bf36", size = 5381639, upload-time = "2025-10-15T16:15:25.572Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/77/e95c757a6fe7a48d28a009267408e8aa382630cc1ad1db7451b3bc21dbb4/numpy-2.3.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:bafa7d87d4c99752d07815ed7a2c0964f8ab311eb8168f41b910bd01d15b6032", size = 6914296, upload-time = "2025-10-15T16:15:27.079Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/d2/137c7b6841c942124eae921279e5c41b1c34bab0e6fc60c7348e69afd165/numpy-2.3.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36dc13af226aeab72b7abad501d370d606326a0029b9f435eacb3b8c94b8a8b7", size = 14591904, upload-time = "2025-10-15T16:15:29.044Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/32/67e3b0f07b0aba57a078c4ab777a9e8e6bc62f24fb53a2337f75f9691699/numpy-2.3.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7b2f9a18b5ff9824a6af80de4f37f4ec3c2aab05ef08f51c77a093f5b89adda", size = 16939602, upload-time = "2025-10-15T16:15:31.106Z" },
+ { url = "https://files.pythonhosted.org/packages/95/22/9639c30e32c93c4cee3ccdb4b09c2d0fbff4dcd06d36b357da06146530fb/numpy-2.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9984bd645a8db6ca15d850ff996856d8762c51a2239225288f08f9050ca240a0", size = 16372661, upload-time = "2025-10-15T16:15:33.546Z" },
+ { url = "https://files.pythonhosted.org/packages/12/e9/a685079529be2b0156ae0c11b13d6be647743095bb51d46589e95be88086/numpy-2.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:64c5825affc76942973a70acf438a8ab618dbd692b84cd5ec40a0a0509edc09a", size = 18884682, upload-time = "2025-10-15T16:15:36.105Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/85/f6f00d019b0cc741e64b4e00ce865a57b6bed945d1bbeb1ccadbc647959b/numpy-2.3.4-cp311-cp311-win32.whl", hash = "sha256:ed759bf7a70342f7817d88376eb7142fab9fef8320d6019ef87fae05a99874e1", size = 6570076, upload-time = "2025-10-15T16:15:38.225Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/10/f8850982021cb90e2ec31990291f9e830ce7d94eef432b15066e7cbe0bec/numpy-2.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:faba246fb30ea2a526c2e9645f61612341de1a83fb1e0c5edf4ddda5a9c10996", size = 13089358, upload-time = "2025-10-15T16:15:40.404Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/ad/afdd8351385edf0b3445f9e24210a9c3971ef4de8fd85155462fc4321d79/numpy-2.3.4-cp311-cp311-win_arm64.whl", hash = "sha256:4c01835e718bcebe80394fd0ac66c07cbb90147ebbdad3dcecd3f25de2ae7e2c", size = 10462292, upload-time = "2025-10-15T16:15:42.896Z" },
+ { url = "https://files.pythonhosted.org/packages/96/7a/02420400b736f84317e759291b8edaeee9dc921f72b045475a9cbdb26b17/numpy-2.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef1b5a3e808bc40827b5fa2c8196151a4c5abe110e1726949d7abddfe5c7ae11", size = 20957727, upload-time = "2025-10-15T16:15:44.9Z" },
+ { url = "https://files.pythonhosted.org/packages/18/90/a014805d627aa5750f6f0e878172afb6454552da929144b3c07fcae1bb13/numpy-2.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2f91f496a87235c6aaf6d3f3d89b17dba64996abadccb289f48456cff931ca9", size = 14187262, upload-time = "2025-10-15T16:15:47.761Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/e4/0a94b09abe89e500dc748e7515f21a13e30c5c3fe3396e6d4ac108c25fca/numpy-2.3.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f77e5b3d3da652b474cc80a14084927a5e86a5eccf54ca8ca5cbd697bf7f2667", size = 5115992, upload-time = "2025-10-15T16:15:50.144Z" },
+ { url = "https://files.pythonhosted.org/packages/88/dd/db77c75b055c6157cbd4f9c92c4458daef0dd9cbe6d8d2fe7f803cb64c37/numpy-2.3.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ab1c5f5ee40d6e01cbe96de5863e39b215a4d24e7d007cad56c7184fdf4aeef", size = 6648672, upload-time = "2025-10-15T16:15:52.442Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/e6/e31b0d713719610e406c0ea3ae0d90760465b086da8783e2fd835ad59027/numpy-2.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77b84453f3adcb994ddbd0d1c5d11db2d6bda1a2b7fd5ac5bd4649d6f5dc682e", size = 14284156, upload-time = "2025-10-15T16:15:54.351Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/58/30a85127bfee6f108282107caf8e06a1f0cc997cb6b52cdee699276fcce4/numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4121c5beb58a7f9e6dfdee612cb24f4df5cd4db6e8261d7f4d7450a997a65d6a", size = 16641271, upload-time = "2025-10-15T16:15:56.67Z" },
+ { url = "https://files.pythonhosted.org/packages/06/f2/2e06a0f2adf23e3ae29283ad96959267938d0efd20a2e25353b70065bfec/numpy-2.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:65611ecbb00ac9846efe04db15cbe6186f562f6bb7e5e05f077e53a599225d16", size = 16059531, upload-time = "2025-10-15T16:15:59.412Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/e7/b106253c7c0d5dc352b9c8fab91afd76a93950998167fa3e5afe4ef3a18f/numpy-2.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dabc42f9c6577bcc13001b8810d300fe814b4cfbe8a92c873f269484594f9786", size = 18578983, upload-time = "2025-10-15T16:16:01.804Z" },
+ { url = "https://files.pythonhosted.org/packages/73/e3/04ecc41e71462276ee867ccbef26a4448638eadecf1bc56772c9ed6d0255/numpy-2.3.4-cp312-cp312-win32.whl", hash = "sha256:a49d797192a8d950ca59ee2d0337a4d804f713bb5c3c50e8db26d49666e351dc", size = 6291380, upload-time = "2025-10-15T16:16:03.938Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/a8/566578b10d8d0e9955b1b6cd5db4e9d4592dd0026a941ff7994cedda030a/numpy-2.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:985f1e46358f06c2a09921e8921e2c98168ed4ae12ccd6e5e87a4f1857923f32", size = 12787999, upload-time = "2025-10-15T16:16:05.801Z" },
+ { url = "https://files.pythonhosted.org/packages/58/22/9c903a957d0a8071b607f5b1bff0761d6e608b9a965945411f867d515db1/numpy-2.3.4-cp312-cp312-win_arm64.whl", hash = "sha256:4635239814149e06e2cb9db3dd584b2fa64316c96f10656983b8026a82e6e4db", size = 10197412, upload-time = "2025-10-15T16:16:07.854Z" },
+ { url = "https://files.pythonhosted.org/packages/57/7e/b72610cc91edf138bc588df5150957a4937221ca6058b825b4725c27be62/numpy-2.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c090d4860032b857d94144d1a9976b8e36709e40386db289aaf6672de2a81966", size = 20950335, upload-time = "2025-10-15T16:16:10.304Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/46/bdd3370dcea2f95ef14af79dbf81e6927102ddf1cc54adc0024d61252fd9/numpy-2.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a13fc473b6db0be619e45f11f9e81260f7302f8d180c49a22b6e6120022596b3", size = 14179878, upload-time = "2025-10-15T16:16:12.595Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/01/5a67cb785bda60f45415d09c2bc245433f1c68dd82eef9c9002c508b5a65/numpy-2.3.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:3634093d0b428e6c32c3a69b78e554f0cd20ee420dcad5a9f3b2a63762ce4197", size = 5108673, upload-time = "2025-10-15T16:16:14.877Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/cd/8428e23a9fcebd33988f4cb61208fda832800ca03781f471f3727a820704/numpy-2.3.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:043885b4f7e6e232d7df4f51ffdef8c36320ee9d5f227b380ea636722c7ed12e", size = 6641438, upload-time = "2025-10-15T16:16:16.805Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/d1/913fe563820f3c6b079f992458f7331278dcd7ba8427e8e745af37ddb44f/numpy-2.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ee6a571d1e4f0ea6d5f22d6e5fbd6ed1dc2b18542848e1e7301bd190500c9d7", size = 14281290, upload-time = "2025-10-15T16:16:18.764Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/7e/7d306ff7cb143e6d975cfa7eb98a93e73495c4deabb7d1b5ecf09ea0fd69/numpy-2.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc8a63918b04b8571789688b2780ab2b4a33ab44bfe8ccea36d3eba51228c953", size = 16636543, upload-time = "2025-10-15T16:16:21.072Z" },
+ { url = "https://files.pythonhosted.org/packages/47/6a/8cfc486237e56ccfb0db234945552a557ca266f022d281a2f577b98e955c/numpy-2.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40cc556d5abbc54aabe2b1ae287042d7bdb80c08edede19f0c0afb36ae586f37", size = 16056117, upload-time = "2025-10-15T16:16:23.369Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/0e/42cb5e69ea901e06ce24bfcc4b5664a56f950a70efdcf221f30d9615f3f3/numpy-2.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ecb63014bb7f4ce653f8be7f1df8cbc6093a5a2811211770f6606cc92b5a78fd", size = 18577788, upload-time = "2025-10-15T16:16:27.496Z" },
+ { url = "https://files.pythonhosted.org/packages/86/92/41c3d5157d3177559ef0a35da50f0cda7fa071f4ba2306dd36818591a5bc/numpy-2.3.4-cp313-cp313-win32.whl", hash = "sha256:e8370eb6925bb8c1c4264fec52b0384b44f675f191df91cbe0140ec9f0955646", size = 6282620, upload-time = "2025-10-15T16:16:29.811Z" },
+ { url = "https://files.pythonhosted.org/packages/09/97/fd421e8bc50766665ad35536c2bb4ef916533ba1fdd053a62d96cc7c8b95/numpy-2.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:56209416e81a7893036eea03abcb91c130643eb14233b2515c90dcac963fe99d", size = 12784672, upload-time = "2025-10-15T16:16:31.589Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/df/5474fb2f74970ca8eb978093969b125a84cc3d30e47f82191f981f13a8a0/numpy-2.3.4-cp313-cp313-win_arm64.whl", hash = "sha256:a700a4031bc0fd6936e78a752eefb79092cecad2599ea9c8039c548bc097f9bc", size = 10196702, upload-time = "2025-10-15T16:16:33.902Z" },
+ { url = "https://files.pythonhosted.org/packages/11/83/66ac031464ec1767ea3ed48ce40f615eb441072945e98693bec0bcd056cc/numpy-2.3.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:86966db35c4040fdca64f0816a1c1dd8dbd027d90fca5a57e00e1ca4cd41b879", size = 21049003, upload-time = "2025-10-15T16:16:36.101Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/99/5b14e0e686e61371659a1d5bebd04596b1d72227ce36eed121bb0aeab798/numpy-2.3.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:838f045478638b26c375ee96ea89464d38428c69170360b23a1a50fa4baa3562", size = 14302980, upload-time = "2025-10-15T16:16:39.124Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/44/e9486649cd087d9fc6920e3fc3ac2aba10838d10804b1e179fb7cbc4e634/numpy-2.3.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d7315ed1dab0286adca467377c8381cd748f3dc92235f22a7dfc42745644a96a", size = 5231472, upload-time = "2025-10-15T16:16:41.168Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/51/902b24fa8887e5fe2063fd61b1895a476d0bbf46811ab0c7fdf4bd127345/numpy-2.3.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:84f01a4d18b2cc4ade1814a08e5f3c907b079c847051d720fad15ce37aa930b6", size = 6739342, upload-time = "2025-10-15T16:16:43.777Z" },
+ { url = "https://files.pythonhosted.org/packages/34/f1/4de9586d05b1962acdcdb1dc4af6646361a643f8c864cef7c852bf509740/numpy-2.3.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:817e719a868f0dacde4abdfc5c1910b301877970195db9ab6a5e2c4bd5b121f7", size = 14354338, upload-time = "2025-10-15T16:16:46.081Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/06/1c16103b425de7969d5a76bdf5ada0804b476fed05d5f9e17b777f1cbefd/numpy-2.3.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e071da78d92a214212cacea81c6da557cab307f2c34b5f85b628e94803f9c0", size = 16702392, upload-time = "2025-10-15T16:16:48.455Z" },
+ { url = "https://files.pythonhosted.org/packages/34/b2/65f4dc1b89b5322093572b6e55161bb42e3e0487067af73627f795cc9d47/numpy-2.3.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2ec646892819370cf3558f518797f16597b4e4669894a2ba712caccc9da53f1f", size = 16134998, upload-time = "2025-10-15T16:16:51.114Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/11/94ec578896cdb973aaf56425d6c7f2aff4186a5c00fac15ff2ec46998b46/numpy-2.3.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:035796aaaddfe2f9664b9a9372f089cfc88bd795a67bd1bfe15e6e770934cf64", size = 18651574, upload-time = "2025-10-15T16:16:53.429Z" },
+ { url = "https://files.pythonhosted.org/packages/62/b7/7efa763ab33dbccf56dade36938a77345ce8e8192d6b39e470ca25ff3cd0/numpy-2.3.4-cp313-cp313t-win32.whl", hash = "sha256:fea80f4f4cf83b54c3a051f2f727870ee51e22f0248d3114b8e755d160b38cfb", size = 6413135, upload-time = "2025-10-15T16:16:55.992Z" },
+ { url = "https://files.pythonhosted.org/packages/43/70/aba4c38e8400abcc2f345e13d972fb36c26409b3e644366db7649015f291/numpy-2.3.4-cp313-cp313t-win_amd64.whl", hash = "sha256:15eea9f306b98e0be91eb344a94c0e630689ef302e10c2ce5f7e11905c704f9c", size = 12928582, upload-time = "2025-10-15T16:16:57.943Z" },
+ { url = "https://files.pythonhosted.org/packages/67/63/871fad5f0073fc00fbbdd7232962ea1ac40eeaae2bba66c76214f7954236/numpy-2.3.4-cp313-cp313t-win_arm64.whl", hash = "sha256:b6c231c9c2fadbae4011ca5e7e83e12dc4a5072f1a1d85a0a7b3ed754d145a40", size = 10266691, upload-time = "2025-10-15T16:17:00.048Z" },
+ { url = "https://files.pythonhosted.org/packages/72/71/ae6170143c115732470ae3a2d01512870dd16e0953f8a6dc89525696069b/numpy-2.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:81c3e6d8c97295a7360d367f9f8553973651b76907988bb6066376bc2252f24e", size = 20955580, upload-time = "2025-10-15T16:17:02.509Z" },
+ { url = "https://files.pythonhosted.org/packages/af/39/4be9222ffd6ca8a30eda033d5f753276a9c3426c397bb137d8e19dedd200/numpy-2.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7c26b0b2bf58009ed1f38a641f3db4be8d960a417ca96d14e5b06df1506d41ff", size = 14188056, upload-time = "2025-10-15T16:17:04.873Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/3d/d85f6700d0a4aa4f9491030e1021c2b2b7421b2b38d01acd16734a2bfdc7/numpy-2.3.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:62b2198c438058a20b6704351b35a1d7db881812d8512d67a69c9de1f18ca05f", size = 5116555, upload-time = "2025-10-15T16:17:07.499Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/04/82c1467d86f47eee8a19a464c92f90a9bb68ccf14a54c5224d7031241ffb/numpy-2.3.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:9d729d60f8d53a7361707f4b68a9663c968882dd4f09e0d58c044c8bf5faee7b", size = 6643581, upload-time = "2025-10-15T16:17:09.774Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/d3/c79841741b837e293f48bd7db89d0ac7a4f2503b382b78a790ef1dc778a5/numpy-2.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd0c630cf256b0a7fd9d0a11c9413b42fef5101219ce6ed5a09624f5a65392c7", size = 14299186, upload-time = "2025-10-15T16:17:11.937Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/7e/4a14a769741fbf237eec5a12a2cbc7a4c4e061852b6533bcb9e9a796c908/numpy-2.3.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5e081bc082825f8b139f9e9fe42942cb4054524598aaeb177ff476cc76d09d2", size = 16638601, upload-time = "2025-10-15T16:17:14.391Z" },
+ { url = "https://files.pythonhosted.org/packages/93/87/1c1de269f002ff0a41173fe01dcc925f4ecff59264cd8f96cf3b60d12c9b/numpy-2.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15fb27364ed84114438fff8aaf998c9e19adbeba08c0b75409f8c452a8692c52", size = 16074219, upload-time = "2025-10-15T16:17:17.058Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/28/18f72ee77408e40a76d691001ae599e712ca2a47ddd2c4f695b16c65f077/numpy-2.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:85d9fb2d8cd998c84d13a79a09cc0c1091648e848e4e6249b0ccd7f6b487fa26", size = 18576702, upload-time = "2025-10-15T16:17:19.379Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/76/95650169b465ececa8cf4b2e8f6df255d4bf662775e797ade2025cc51ae6/numpy-2.3.4-cp314-cp314-win32.whl", hash = "sha256:e73d63fd04e3a9d6bc187f5455d81abfad05660b212c8804bf3b407e984cd2bc", size = 6337136, upload-time = "2025-10-15T16:17:22.886Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/89/a231a5c43ede5d6f77ba4a91e915a87dea4aeea76560ba4d2bf185c683f0/numpy-2.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:3da3491cee49cf16157e70f607c03a217ea6647b1cea4819c4f48e53d49139b9", size = 12920542, upload-time = "2025-10-15T16:17:24.783Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/0c/ae9434a888f717c5ed2ff2393b3f344f0ff6f1c793519fa0c540461dc530/numpy-2.3.4-cp314-cp314-win_arm64.whl", hash = "sha256:6d9cd732068e8288dbe2717177320723ccec4fb064123f0caf9bbd90ab5be868", size = 10480213, upload-time = "2025-10-15T16:17:26.935Z" },
+ { url = "https://files.pythonhosted.org/packages/83/4b/c4a5f0841f92536f6b9592694a5b5f68c9ab37b775ff342649eadf9055d3/numpy-2.3.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:22758999b256b595cf0b1d102b133bb61866ba5ceecf15f759623b64c020c9ec", size = 21052280, upload-time = "2025-10-15T16:17:29.638Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/80/90308845fc93b984d2cc96d83e2324ce8ad1fd6efea81b324cba4b673854/numpy-2.3.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9cb177bc55b010b19798dc5497d540dea67fd13a8d9e882b2dae71de0cf09eb3", size = 14302930, upload-time = "2025-10-15T16:17:32.384Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/4e/07439f22f2a3b247cec4d63a713faae55e1141a36e77fb212881f7cda3fb/numpy-2.3.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0f2bcc76f1e05e5ab58893407c63d90b2029908fa41f9f1cc51eecce936c3365", size = 5231504, upload-time = "2025-10-15T16:17:34.515Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/de/1e11f2547e2fe3d00482b19721855348b94ada8359aef5d40dd57bfae9df/numpy-2.3.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dc20bde86802df2ed8397a08d793da0ad7a5fd4ea3ac85d757bf5dd4ad7c252", size = 6739405, upload-time = "2025-10-15T16:17:36.128Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/40/8cd57393a26cebe2e923005db5134a946c62fa56a1087dc7c478f3e30837/numpy-2.3.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e199c087e2aa71c8f9ce1cb7a8e10677dc12457e7cc1be4798632da37c3e86e", size = 14354866, upload-time = "2025-10-15T16:17:38.884Z" },
+ { url = "https://files.pythonhosted.org/packages/93/39/5b3510f023f96874ee6fea2e40dfa99313a00bf3ab779f3c92978f34aace/numpy-2.3.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85597b2d25ddf655495e2363fe044b0ae999b75bc4d630dc0d886484b03a5eb0", size = 16703296, upload-time = "2025-10-15T16:17:41.564Z" },
+ { url = "https://files.pythonhosted.org/packages/41/0d/19bb163617c8045209c1996c4e427bccbc4bbff1e2c711f39203c8ddbb4a/numpy-2.3.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04a69abe45b49c5955923cf2c407843d1c85013b424ae8a560bba16c92fe44a0", size = 16136046, upload-time = "2025-10-15T16:17:43.901Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/c1/6dba12fdf68b02a21ac411c9df19afa66bed2540f467150ca64d246b463d/numpy-2.3.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e1708fac43ef8b419c975926ce1eaf793b0c13b7356cfab6ab0dc34c0a02ac0f", size = 18652691, upload-time = "2025-10-15T16:17:46.247Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/73/f85056701dbbbb910c51d846c58d29fd46b30eecd2b6ba760fc8b8a1641b/numpy-2.3.4-cp314-cp314t-win32.whl", hash = "sha256:863e3b5f4d9915aaf1b8ec79ae560ad21f0b8d5e3adc31e73126491bb86dee1d", size = 6485782, upload-time = "2025-10-15T16:17:48.872Z" },
+ { url = "https://files.pythonhosted.org/packages/17/90/28fa6f9865181cb817c2471ee65678afa8a7e2a1fb16141473d5fa6bacc3/numpy-2.3.4-cp314-cp314t-win_amd64.whl", hash = "sha256:962064de37b9aef801d33bc579690f8bfe6c5e70e29b61783f60bcba838a14d6", size = 13113301, upload-time = "2025-10-15T16:17:50.938Z" },
+ { url = "https://files.pythonhosted.org/packages/54/23/08c002201a8e7e1f9afba93b97deceb813252d9cfd0d3351caed123dcf97/numpy-2.3.4-cp314-cp314t-win_arm64.whl", hash = "sha256:8b5a9a39c45d852b62693d9b3f3e0fe052541f804296ff401a72a1b60edafb29", size = 10547532, upload-time = "2025-10-15T16:17:53.48Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/b6/64898f51a86ec88ca1257a59c1d7fd077b60082a119affefcdf1dd0df8ca/numpy-2.3.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6e274603039f924c0fe5cb73438fa9246699c78a6df1bd3decef9ae592ae1c05", size = 21131552, upload-time = "2025-10-15T16:17:55.845Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/4c/f135dc6ebe2b6a3c77f4e4838fa63d350f85c99462012306ada1bd4bc460/numpy-2.3.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d149aee5c72176d9ddbc6803aef9c0f6d2ceeea7626574fc68518da5476fa346", size = 14377796, upload-time = "2025-10-15T16:17:58.308Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/a4/f33f9c23fcc13dd8412fc8614559b5b797e0aba9d8e01dfa8bae10c84004/numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:6d34ed9db9e6395bb6cd33286035f73a59b058169733a9db9f85e650b88df37e", size = 5306904, upload-time = "2025-10-15T16:18:00.596Z" },
+ { url = "https://files.pythonhosted.org/packages/28/af/c44097f25f834360f9fb960fa082863e0bad14a42f36527b2a121abdec56/numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:fdebe771ca06bb8d6abce84e51dca9f7921fe6ad34a0c914541b063e9a68928b", size = 6819682, upload-time = "2025-10-15T16:18:02.32Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/8c/cd283b54c3c2b77e188f63e23039844f56b23bba1712318288c13fe86baf/numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e92defe6c08211eb77902253b14fe5b480ebc5112bc741fd5e9cd0608f847", size = 14422300, upload-time = "2025-10-15T16:18:04.271Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/f0/8404db5098d92446b3e3695cf41c6f0ecb703d701cb0b7566ee2177f2eee/numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13b9062e4f5c7ee5c7e5be96f29ba71bc5a37fed3d1d77c37390ae00724d296d", size = 16760806, upload-time = "2025-10-15T16:18:06.668Z" },
+ { url = "https://files.pythonhosted.org/packages/95/8e/2844c3959ce9a63acc7c8e50881133d86666f0420bcde695e115ced0920f/numpy-2.3.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81b3a59793523e552c4a96109dde028aa4448ae06ccac5a76ff6532a85558a7f", size = 12973130, upload-time = "2025-10-15T16:18:09.397Z" },
+]
+
+[[package]]
+name = "pa-ringbuffer"
+version = "0.1.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b5/9f/31956899bd842747e12b554e04055a6745cfc3e104eaf40a29e6413028da/pa-ringbuffer-0.1.4.tar.gz", hash = "sha256:0878054e979e7b4fafcbcf6273a87e1ed2c50dad44c29fc557d72b7b3a04cf42", size = 7752, upload-time = "2020-08-27T08:57:44.73Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fd/36/61306052b7ab56f52d76976676041d64a8d554173a2f1c89508e1434ee7f/pa_ringbuffer-0.1.4-py2.py3-none-any.whl", hash = "sha256:a4cb24883645696e021c309bfe13904617bf551491d6f0ab9f9ec70ff33d6a04", size = 6889, upload-time = "2020-08-27T08:57:43.207Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pathspec"
+version = "1.1.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" },
+]
+
+[[package]]
+name = "pefile"
+version = "2023.2.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/78/c5/3b3c62223f72e2360737fd2a57c30e5b2adecd85e70276879609a7403334/pefile-2023.2.7.tar.gz", hash = "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc", size = 74854, upload-time = "2023-02-07T12:23:55.958Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/55/26/d0ad8b448476d0a1e8d3ea5622dc77b916db84c6aa3cb1e1c0965af948fc/pefile-2023.2.7-py3-none-any.whl", hash = "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6", size = 71791, upload-time = "2023-02-07T12:28:36.678Z" },
+]
+
+[[package]]
+name = "platformdirs"
+version = "4.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" },
+]
+
+[[package]]
+name = "pycparser"
+version = "3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" },
+]
+
+[[package]]
+name = "pyinstaller"
+version = "6.16.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "altgraph" },
+ { name = "macholib", marker = "sys_platform == 'darwin'" },
+ { name = "packaging" },
+ { name = "pefile", marker = "sys_platform == 'win32'" },
+ { name = "pyinstaller-hooks-contrib" },
+ { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" },
+ { name = "setuptools" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/94/94/1f62e95e4a28b64cfbb5b922ef3046f968b47170d37a1e1a029f56ac9cb4/pyinstaller-6.16.0.tar.gz", hash = "sha256:53559fe1e041a234f2b4dcc3288ea8bdd57f7cad8a6644e422c27bb407f3edef", size = 4008473, upload-time = "2025-09-13T20:07:01.733Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/0a/c42ce6e5d3de287f2e9432a074fb209f1fb72a86a72f3903849fdb5e4829/pyinstaller-6.16.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:7fd1c785219a87ca747c21fa92f561b0d2926a7edc06d0a0fe37f3736e00bd7a", size = 1027899, upload-time = "2025-09-13T20:05:59.2Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/d0/f18fedde32835d5a758f464c75924e2154065625f09d5456c3c303527654/pyinstaller-6.16.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:b756ddb9007b8141c5476b553351f9d97559b8af5d07f9460869bfae02be26b0", size = 727990, upload-time = "2025-09-13T20:06:03.583Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/db/c8bb47514ce857b24bf9294cf1ff74844b6a489fa0ab4ef6f923288c4e38/pyinstaller-6.16.0-py3-none-manylinux2014_i686.whl", hash = "sha256:0a48f55b85ff60f83169e10050f2759019cf1d06773ad1c4da3a411cd8751058", size = 739238, upload-time = "2025-09-13T20:06:07.69Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/3e/451dc784a8fcca0fe9f9b6b802d58555364a95b60f253613a2c83fc6b023/pyinstaller-6.16.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:73ba72e04fcece92e32518bbb1e1fb5ac2892677943dfdff38e01a06e8742851", size = 737142, upload-time = "2025-09-13T20:06:11.732Z" },
+ { url = "https://files.pythonhosted.org/packages/71/37/2f457479ef8fa2821cdb448acee2421dfb19fbe908bf5499d1930c164084/pyinstaller-6.16.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:b1752488248f7899281b17ca3238eefb5410521291371a686a4f5830f29f52b3", size = 734133, upload-time = "2025-09-13T20:06:15.477Z" },
+ { url = "https://files.pythonhosted.org/packages/63/c4/0f7daac4d062a4d1ac2571d8a8b9b5d6812094fcd914d139af591ca5e1ba/pyinstaller-6.16.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ba618a61627ee674d6d68e5de084ba17c707b59a4f2a856084b3999bdffbd3f0", size = 733817, upload-time = "2025-09-13T20:06:19.683Z" },
+ { url = "https://files.pythonhosted.org/packages/11/e4/b6127265b42bef883e8873d850becadf748bc5652e5a7029b059328f3c31/pyinstaller-6.16.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:c8b7ef536711617e12fef4673806198872033fa06fa92326ad7fd1d84a9fa454", size = 732912, upload-time = "2025-09-13T20:06:23.46Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/00/c6663107bdf814b2916e71563beabd09f693c47712213bc228994cb2cc65/pyinstaller-6.16.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:d1ebf84d02c51fed19b82a8abb4df536923abd55bb684d694e1356e4ae2a0ce5", size = 732773, upload-time = "2025-09-13T20:06:27.352Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/14/cabe9bc5f60b95d2e70e7d045ab94b0015ff8f6c8b16e2142d3597e30749/pyinstaller-6.16.0-py3-none-win32.whl", hash = "sha256:6d5f8617f3650ff9ef893e2ab4ddbf3c0d23d0c602ef74b5df8fbef4607840c8", size = 1313878, upload-time = "2025-09-13T20:06:33.234Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/99/2005efbc297e7813c1d6f18484aa94a1a81ce87b6a5b497c563681f4c4ea/pyinstaller-6.16.0-py3-none-win_amd64.whl", hash = "sha256:bc10eb1a787f99fea613509f55b902fbd2d8b73ff5f51ff245ea29a481d97d41", size = 1374706, upload-time = "2025-09-13T20:06:39.95Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/f4/4dfcf69b86d60fcaae05a42bbff1616d48a91e71726e5ed795d773dae9b3/pyinstaller-6.16.0-py3-none-win_arm64.whl", hash = "sha256:d0af8a401de792c233c32c44b16d065ca9ab8262ee0c906835c12bdebc992a64", size = 1315923, upload-time = "2025-09-13T20:06:45.846Z" },
+]
+
+[[package]]
+name = "pyinstaller-hooks-contrib"
+version = "2026.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "packaging" },
+ { name = "setuptools" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/1a/67/f4452d68793fb15beba4f19ef39a38a8822f0da7452b503c400d5a21f5c1/pyinstaller_hooks_contrib-2026.5.tar.gz", hash = "sha256:f066dfca8f7c45ff6336c9cf9fe25b4e48bfeb322a1aa24faaedfb8a8d1b0b08", size = 173689, upload-time = "2026-05-04T22:36:55.124Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f6/5c/fd465d11da4d12b50d7eb5d2ee2ceb780d8d049dbb489f3828d131e387af/pyinstaller_hooks_contrib-2026.5-py3-none-any.whl", hash = "sha256:ea1535783fbdac4626351709e83f3ea80b681d3a4745763ebb407b5e27342eb9", size = 457314, upload-time = "2026-05-04T22:36:53.598Z" },
+]
+
+[[package]]
+name = "pyqt5"
+version = "5.15.11"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyqt5-qt5" },
+ { name = "pyqt5-sip" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0e/07/c9ed0bd428df6f87183fca565a79fee19fa7c88c7f00a7f011ab4379e77a/PyQt5-5.15.11.tar.gz", hash = "sha256:fda45743ebb4a27b4b1a51c6d8ef455c4c1b5d610c90d2934c7802b5c1557c52", size = 3216775, upload-time = "2024-07-19T08:39:57.756Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/11/64/42ec1b0bd72d87f87bde6ceb6869f444d91a2d601f2e67cd05febc0346a1/PyQt5-5.15.11-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c8b03dd9380bb13c804f0bdb0f4956067f281785b5e12303d529f0462f9afdc2", size = 6579776, upload-time = "2024-07-19T08:39:19.775Z" },
+ { url = "https://files.pythonhosted.org/packages/49/f5/3fb696f4683ea45d68b7e77302eff173493ac81e43d63adb60fa760b9f91/PyQt5-5.15.11-cp38-abi3-macosx_11_0_x86_64.whl", hash = "sha256:6cd75628f6e732b1ffcfe709ab833a0716c0445d7aec8046a48d5843352becb6", size = 7016415, upload-time = "2024-07-19T08:39:32.977Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/8c/4065950f9d013c4b2e588fe33cf04e564c2322842d84dbcbce5ba1dc28b0/PyQt5-5.15.11-cp38-abi3-manylinux_2_17_x86_64.whl", hash = "sha256:cd672a6738d1ae33ef7d9efa8e6cb0a1525ecf53ec86da80a9e1b6ec38c8d0f1", size = 8188103, upload-time = "2024-07-19T08:39:40.561Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/f0/ae5a5b4f9b826b29ea4be841b2f2d951bcf5ae1d802f3732b145b57c5355/PyQt5-5.15.11-cp38-abi3-win32.whl", hash = "sha256:76be0322ceda5deecd1708a8d628e698089a1cea80d1a49d242a6d579a40babd", size = 5433308, upload-time = "2024-07-19T08:39:46.932Z" },
+ { url = "https://files.pythonhosted.org/packages/56/d5/68eb9f3d19ce65df01b6c7b7a577ad3bbc9ab3a5dd3491a4756e71838ec9/PyQt5-5.15.11-cp38-abi3-win_amd64.whl", hash = "sha256:bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517", size = 6865864, upload-time = "2024-07-19T08:39:53.572Z" },
+]
+
+[[package]]
+name = "pyqt5-qt5"
+version = "5.15.19"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/06/af/c0e00d353cad261ee9ccd5f6039b7ef4e09a1cb9a22c6a4b233854f6fa30/pyqt5_qt5-5.15.19-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:cac6b78e4805848c25979a0622660251070781b6b4f810688a960cb44d1ae5a2", size = 39777655, upload-time = "2026-05-21T09:12:43.94Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/d0/fd4876b90bbadaa92444ff452ab78d9ba839014a6d303e77d29c0c591631/pyqt5_qt5-5.15.19-py3-none-macosx_11_0_arm64.whl", hash = "sha256:66fa299dcdea1f430edbd6f6ca3dcb20430f19c508d13e3aa851d19034b7be7e", size = 36838788, upload-time = "2026-05-21T09:12:59.334Z" },
+ { url = "https://files.pythonhosted.org/packages/de/a0/dd9889ed9bf100d6d8b9d608b2689dc2a7f871f9489a0c563a8cf78c329f/pyqt5_qt5-5.15.19-py3-none-manylinux2014_x86_64.whl", hash = "sha256:31421d9c31fb29a8faee4b8b3c32658fb51a9e8c4c708075121162fa44faf80e", size = 60933242, upload-time = "2026-05-21T09:13:16.308Z" },
+]
+
+[[package]]
+name = "pyqt5-sip"
+version = "12.18.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/31/5ef342de9faee0f3801088946ae103db9b9eaeba3d6a64fefd5ce74df244/pyqt5_sip-12.18.0.tar.gz", hash = "sha256:71c37db75a0664325de149f43e2a712ec5fa1f90429a21dafbca005cb6767f94", size = 104143, upload-time = "2026-01-13T15:53:19.576Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/59/3dd29bcfde479ac241f618235bf7d76e65e47afdcd91743554d490ae0d19/pyqt5_sip-12.18.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13c32e9025d0ab5fe960ef64dcb4c6f7ec26156ddce2cf2f195600aa26e8f9fe", size = 122724, upload-time = "2026-01-13T15:52:49.875Z" },
+ { url = "https://files.pythonhosted.org/packages/87/c4/ac4deee3249d3ceb703103acbbf76d89f3782fa7ad2ca5a15fcb5bcf5c73/pyqt5_sip-12.18.0-cp311-cp311-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:dd855149c724634eb1f92d10e04e1be0751068a8521d5f9f06e5c2dbe32fd89f", size = 327560, upload-time = "2026-01-13T15:52:53.584Z" },
+ { url = "https://files.pythonhosted.org/packages/79/53/64373ba9311288b0ea6b5ab375d9c9743a41ac93df7137655498c95a08e5/pyqt5_sip-12.18.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:521729e4ce44db555005f4e6987c4a5164d45ea03f5a7d08519813d4776acd15", size = 277067, upload-time = "2026-01-13T15:52:51.22Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/dd/4026bba8355ceaba222db0369fe4a480d55aa61d3f14dbe1458886ccc032/pyqt5_sip-12.18.0-cp311-cp311-win32.whl", hash = "sha256:c738949863d88b78f86f28e13151989ca3b1a302934811af41856dc8a27838bd", size = 49323, upload-time = "2026-01-13T15:52:55.859Z" },
+ { url = "https://files.pythonhosted.org/packages/41/35/39e549ca7f7c9fbb025912a5db7f55f3b9c22d7f9718f41c2e7a17c806e9/pyqt5_sip-12.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac0be1a8ce145ed78c7e8d45243749405bee7e3a87e9810b0542bca010c50bd7", size = 58795, upload-time = "2026-01-13T15:52:54.995Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/61/6d78d702016ac23d2b97634a3b6a831c3f7735f0552a1c8b058db96005d1/pyqt5_sip-12.18.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b29e4cda24748e59e5bd1bdad4812091a86b4b5b08c38b7f781eb55a5166f2b7", size = 124614, upload-time = "2026-01-13T15:52:57.59Z" },
+ { url = "https://files.pythonhosted.org/packages/19/bf/8f3efa10ddd3e76c1253865340ab7c2960ef96681d732b1f666c77430612/pyqt5_sip-12.18.0-cp312-cp312-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:163c2bba5e637c2222ec17d82a2c5aa158184a191923eb7d137cf4cfa0399529", size = 339412, upload-time = "2026-01-13T15:53:00.563Z" },
+ { url = "https://files.pythonhosted.org/packages/72/48/f1bcf6729d01bae6729cd790b22fd579dbe34014e8be031e6f10c5b9b2aa/pyqt5_sip-12.18.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ead5e0a64ad852ac60797989d8444a6a5bd834768536b04a07b40b2937d922f6", size = 282376, upload-time = "2026-01-13T15:52:59.172Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/b7/d84c764ac9f1366be561255ec9bd88ee224fefdbdb349aee250f3003f0ca/pyqt5_sip-12.18.0-cp312-cp312-win32.whl", hash = "sha256:993fe3ed9a62a92e770f32d5344e3df56c2cacf1471f01b7feaf04818a2df1c4", size = 49523, upload-time = "2026-01-13T15:53:03.068Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/e7/ef87178d5afa5f63be38556dc0df8af89f9bf74f2555f4dab6824c0fd150/pyqt5_sip-12.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:9b689e02e400abd1ce0a30cd6eae8eceabcf1bbba0395cb5c86e64ba74351d68", size = 58001, upload-time = "2026-01-13T15:53:02.15Z" },
+ { url = "https://files.pythonhosted.org/packages/79/67/8d43d0fea10ff48ddecc8534aead8b855dc80df80653b8b1bf9e1f993063/pyqt5_sip-12.18.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9254e5dd7676b76503ba20edcc919e7ac4a97b6c70a6fb2f9dba9e13b4c60509", size = 124605, upload-time = "2026-01-13T15:53:04.991Z" },
+ { url = "https://files.pythonhosted.org/packages/48/2a/b08bc8efeb49c50c6cdac11417dc2c8eaefcac2f0a6382eae7b26dc0f232/pyqt5_sip-12.18.0-cp313-cp313-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c969631ada7293a81e1012b2264a62d69a91995b517586489dfe24421b87b9af", size = 339918, upload-time = "2026-01-13T15:53:08.502Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/99/24f82437b2f073cf39296b7c731b6a8bc0f5207911fdd93841a0ea9abe42/pyqt5_sip-12.18.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d84ac384a63285132e67762c87681191c25e28a1df7560287ec3889d9eb223b5", size = 282088, upload-time = "2026-01-13T15:53:06.632Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/27/20d3924943df34361fae9c6a0489ae89d0b07571693245c61678d185e4a4/pyqt5_sip-12.18.0-cp313-cp313-win32.whl", hash = "sha256:95bba4670ecf5cba73958b85aa2087c17838a402ed251c38e68060c7665c998b", size = 49501, upload-time = "2026-01-13T15:53:11.159Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/36/e251623c12968730730512a9e5150430e36246afbe64894610190b896f61/pyqt5_sip-12.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:aac4adc37df2f2ac1dc259409be1900f07332d140a12c9db7c84112cef64ff59", size = 58076, upload-time = "2026-01-13T15:53:09.928Z" },
+ { url = "https://files.pythonhosted.org/packages/37/3a/b46a0116b1aacbb6156b2957eb5cb928c94b49f4626eb2540ca8d16ee757/pyqt5_sip-12.18.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8372ec8704bfd5e09942d0d055a1657eb4f702f4b30847a5e59df0496f99d67f", size = 124594, upload-time = "2026-01-13T15:53:13.159Z" },
+ { url = "https://files.pythonhosted.org/packages/58/63/df3037f11391c25c5b0ab233d22e58b8f056cb1ce16d7ecadb844421ce75/pyqt5_sip-12.18.0-cp314-cp314-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fdb45c7cd2af7eccd7370b994d432bfc7965079f845392760724f26771bb59dc", size = 339056, upload-time = "2026-01-13T15:53:16.558Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/e7/4f96b84520b8f8b7502682fd43f68f63ca6572b5858f56e5f61c76a54fe2/pyqt5_sip-12.18.0-cp314-cp314-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:92abe984becbde768954d6d0951f56d80a9868d2fd9e738e61fc944f0ff83dd6", size = 282439, upload-time = "2026-01-13T15:53:14.856Z" },
+ { url = "https://files.pythonhosted.org/packages/79/8e/ccdf20d373ceba83e1d1b7f818505c375208ffde4a96376dc7dbe592406c/pyqt5_sip-12.18.0-cp314-cp314-win32.whl", hash = "sha256:bd9e3c6f81346f1b08d6db02305cdee20c009b43aa083d44ee2de47a7da0e123", size = 50713, upload-time = "2026-01-13T15:53:18.634Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/21/8486ed45977be615ec5371b24b47298b1cb0e1a455b419eddd0215078dba/pyqt5_sip-12.18.0-cp314-cp314-win_amd64.whl", hash = "sha256:6d948f1be619c645cd3bda54952bfdc1aef7c79242dccea6a6858748e61114b9", size = 59622, upload-time = "2026-01-13T15:53:17.714Z" },
+]
+
+[[package]]
+name = "pyqt5-stubs"
+version = "5.15.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e7/5b/f96312e01661dff7320366fc948f7597d3e3e28ff7116e9e77dbf41ab937/PyQt5-stubs-5.15.6.0.tar.gz", hash = "sha256:91270ac23ebf38a1dc04cd97aa852cd08af82dc839100e5395af1447e3e99707", size = 395647, upload-time = "2022-04-23T09:53:56.785Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/33/d5/9b8482ed572be40d51c3fcbb87451e446e56b5e19487cd60340b8ef51eb4/PyQt5_stubs-5.15.6.0-py3-none-any.whl", hash = "sha256:7fb8177c72489a8911f021b7bd7c33f12c87f6dba92dcef3fdcdb5d9400f0f3f", size = 433328, upload-time = "2022-04-23T09:53:52.107Z" },
+]
+
+[[package]]
+name = "pyrr"
+version = "0.10.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "multipledispatch" },
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e5/7f/2af23f61340972116e4efabc3ac6e02c8bad7f7315b3002c278092963f17/pyrr-0.10.3.tar.gz", hash = "sha256:3c0f7b20326e71f706a610d58f2190fff73af01eef60c19cb188b186f0ec7e1d", size = 64845, upload-time = "2019-04-18T14:53:45.739Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/80/d4/09bb74e93f9f677eadcf9ddb92681755f75e0f354a1b904f1913e32ca1b2/pyrr-0.10.3-py3-none-any.whl", hash = "sha256:d8af23fb9bb29262405845e1c98f7339fbba5e49323b98528bd01160a75c65ac", size = 46790, upload-time = "2019-04-18T14:53:43.719Z" },
+]
+
+[[package]]
+name = "pywin32-ctypes"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" },
+]
+
+[[package]]
+name = "rtmixer"
+version = "0.1.7"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi" },
+ { name = "pa-ringbuffer" },
+ { name = "sounddevice" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e6/e3/69c3b6620ba84cd0faa420c28d6b9ad01d2b59e19dbe91c20ff9301fae5f/rtmixer-0.1.7.tar.gz", hash = "sha256:4427855f76b86d39f1238dfd5b1955378ace464e405c47da1089bcae65884e1c", size = 21196, upload-time = "2024-07-02T16:51:40.305Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/aa/62c3b8873eb83f5cc13ad089afa182e78ca84dbf522c9e4df97f6632e64d/rtmixer-0.1.7-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ff2348bf949286335ca4d377165dee559180598a3bf45445a14be429a4e19b51", size = 15161, upload-time = "2024-07-02T16:51:07.588Z" },
+ { url = "https://files.pythonhosted.org/packages/28/0e/79d30df0c494b41640172eeb0598b86760e34562c3dab62bd15481401d2b/rtmixer-0.1.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:b9fee08ea57259716d6cda0c1afa20e42f86d45af6a4c3a227f9638b508c19a4", size = 14896, upload-time = "2024-07-02T16:51:09.225Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/f5/f61d06cf6c9a7573177dcb7bc4180fe66bc00ae719f593f903e1fb076d42/rtmixer-0.1.7-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b81bad76ead007227be87d1498679e9230786518a3739230edbe58905b02201c", size = 39600, upload-time = "2024-07-02T16:51:10.901Z" },
+ { url = "https://files.pythonhosted.org/packages/50/2f/f12cbc160a8f4ce0510446f1b73c5cc743b985d52cb9a56f38840796c03b/rtmixer-0.1.7-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f65b19ce4767f8d75332e93de023abd419755c6730b85009b17236adf0cc602", size = 39712, upload-time = "2024-07-02T16:51:12.274Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/ec/b997ee3e45c56cb78fcfd2e6ac888a276bc8ff376e1c8d696449bf9e5d7e/rtmixer-0.1.7-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91962552354f71b965fe71ec33907ee50041618abd6d24b781cfe283d94e4648", size = 36746, upload-time = "2024-07-02T16:51:13.716Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/ca/e9f14f064ed63d72fcb8f0c8c2494629d7acbf4c900fbb851a30e202e84c/rtmixer-0.1.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5e9a833e4c58f4dd16da1ec4c11329a3f0f577b05f336c02490ef319c284d1be", size = 39454, upload-time = "2024-07-02T16:51:14.691Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/a4/6232f10baf309cba29a9882a15ce5807b5acbe173d8eccbb89f9894124ea/rtmixer-0.1.7-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:d66bb004ec20d1f0aa648eb340d9e2ae8c8b8fcd3ba2b4b40efbf019f2b3a03a", size = 37424, upload-time = "2024-07-02T16:51:15.908Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/38/f47be5da2f9ff0ecb28880f1ae28eeb44f75ff6f1216073d2442930e5be6/rtmixer-0.1.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7407db948b52205f7f2fe79bfbbc1454cb2fd53201f2744cc899a743332881f2", size = 39518, upload-time = "2024-07-02T16:51:18.091Z" },
+ { url = "https://files.pythonhosted.org/packages/85/61/abbf2d8c5406580e3a3f4646a42b914bfd6036b900a22f88214081b287fc/rtmixer-0.1.7-cp38-abi3-win_amd64.whl", hash = "sha256:e734b1330e58deb7f91020261d8f9e8032dd5123429506578f67960b05a2264a", size = 17537, upload-time = "2024-07-02T16:51:19.058Z" },
+]
+
+[[package]]
+name = "setuptools"
+version = "82.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" },
+]
+
+[[package]]
+name = "sounddevice"
+version = "0.5.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/4e/4f/28e734898b870db15b6474453f19813d3c81b91c806d9e6f867bd6e4dd03/sounddevice-0.5.3.tar.gz", hash = "sha256:cbac2b60198fbab84533697e7c4904cc895ec69d5fb3973556c9eb74a4629b2c", size = 53465, upload-time = "2025-10-19T13:23:57.922Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/73/e7/9020e9f0f3df00432728f4c4044387468a743e3d9a4f91123d77be10010e/sounddevice-0.5.3-py3-none-any.whl", hash = "sha256:ea7738baa0a9f9fef7390f649e41c9f2c8ada776180e56c2ffd217133c92a806", size = 32670, upload-time = "2025-10-19T13:23:51.779Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/39/714118f8413e0e353436914f2b976665161f1be2b6483ac15a8f61484c14/sounddevice-0.5.3-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:278dc4451fff70934a176df048b77d80d7ce1623a6ec9db8b34b806f3112f9c2", size = 108306, upload-time = "2025-10-19T13:23:53.277Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/74/52186e3e5c833d00273f7949a9383adff93692c6e02406bf359cb4d3e921/sounddevice-0.5.3-py3-none-win32.whl", hash = "sha256:845d6927bcf14e84be5292a61ab3359cf8e6b9145819ec6f3ac2619ff089a69c", size = 312882, upload-time = "2025-10-19T13:23:54.829Z" },
+ { url = "https://files.pythonhosted.org/packages/66/c7/16123d054aef6d445176c9122bfbe73c11087589b2413cab22aff5a7839a/sounddevice-0.5.3-py3-none-win_amd64.whl", hash = "sha256:f55ad20082efc2bdec06928e974fbcae07bc6c405409ae1334cefe7d377eb687", size = 364025, upload-time = "2025-10-19T13:23:56.362Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.15.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
+]