-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcompromax_gui.py
117 lines (96 loc) · 4.47 KB
/
compromax_gui.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
from pathlib import Path
import sys
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT, FigureCanvasQTAgg
from matplotlib.figure import Figure
from PySide2 import QtWidgets, QtCore
from PySide2.QtGui import QIcon
import matplotlib.pyplot as plt
import numpy as np
import compromaximize
import utils
VISUAL_SAMPLES = 2000
class MainCompromaximizer(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.sig = np.zeros((2, 2000))
self.result = np.zeros((2, 2000))
self._visual_sig = np.zeros((2, VISUAL_SAMPLES))
self._visual_result = np.zeros((2, VISUAL_SAMPLES))
self.fn_signal = Path("")
self.fs = 48000
self.limit_gain = 20
self.window_duration = 0.1
self.compromax = compromaximize.Compromaximizer(self.limit_gain)
self.setWindowTitle("Compromaximizer")
app_icon = QIcon("assets/compromax64.png")
self.setWindowIcon(app_icon)
self._main = QtWidgets.QWidget()
self.setCentralWidget(self._main)
container_layout = QtWidgets.QVBoxLayout(self._main)
# top bar
layout_filename = QtWidgets.QHBoxLayout()
self._textedit_filename = QtWidgets.QLineEdit("Dateiname?")
self._button_open_file = QtWidgets.QPushButton("Open...")
self._button_open_file.clicked.connect(self._open_file)
# plot
self._figure = Figure()
self._figure.set_tight_layout(dict(pad=0.3))
self._axes: plt.Axes = self._figure.add_subplot(111)
self._canvas = FigureCanvasQTAgg(self._figure)
self._navigation_toolbar = NavigationToolbar2QT(self._canvas, self)
# bottom bar
layout_output = QtWidgets.QHBoxLayout()
self._slider_max_gain = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self._slider_max_gain.setMinimum(1)
self._slider_max_gain.setMaximum(100)
self._slider_max_gain.setValue(self.limit_gain)
self._slider_max_gain.valueChanged.connect(self._slider_max_gain_value_changed)
self._slider_max_gain.sliderReleased.connect(self._slider_max_gain_slider_released)
self._label_max_gain = QtWidgets.QLabel()
self._slider_max_gain_value_changed()
self._button_save = QtWidgets.QPushButton("Save...")
self._button_save.clicked.connect(self._save_file)
# integrate into layout
container_layout.addLayout(layout_filename)
layout_filename.addWidget(self._textedit_filename)
layout_filename.addWidget(self._button_open_file)
container_layout.addWidget(self._canvas)
container_layout.addWidget(self._navigation_toolbar)
container_layout.addLayout(layout_output)
layout_output.addWidget(self._slider_max_gain)
layout_output.addWidget(self._label_max_gain)
layout_output.addWidget(self._button_save)
def _slider_max_gain_value_changed(self):
self.limit_gain = self._slider_max_gain.value()
self._label_max_gain.setText(f"Maximum gain: {self.limit_gain:4}")
self.compromax.limit_gain = self.limit_gain
def _slider_max_gain_slider_released(self):
self.result = self.compromax.process(self.sig, self.fs, self.window_duration)
self.update_plot()
def _open_file(self):
fn_signal, _ = QtWidgets.QFileDialog.getOpenFileName(filter="*.wav")
if fn_signal != "":
self.fn_signal = Path(fn_signal)
self._textedit_filename.setText(fn_signal)
self.sig, self.fs = utils.load_soundfile(fn_signal)
self._slider_max_gain_slider_released()
def _save_file(self):
pn_out = self.fn_signal.parent
fn_out = pn_out / (self.fn_signal.stem + f"_comp{self.limit_gain}.wav")
fn_signal_out, _ = QtWidgets.QFileDialog.getSaveFileName(filter="*.wav", dir=str(fn_out))
if fn_signal_out != "":
utils.write_soundfile(fn_signal_out, self.result.T, self.fs)
def update_plot(self):
self._axes.clear()
indices = np.floor(np.linspace(0, self.sig.shape[1], VISUAL_SAMPLES, endpoint=False)).astype(np.int)
self._visual_result = self.result[:, indices]
self._visual_sig = self.sig[:, indices]
stacked = np.vstack((self._visual_result, self._visual_sig)).T
self._axes.plot(stacked)
self._figure.canvas.draw()
self._figure.canvas.flush_events()
if __name__ == '__main__':
qapp = QtWidgets.QApplication(sys.argv)
main = MainCompromaximizer()
main.show()
sys.exit(qapp.exec_())