audio-spectrogram 0.1.0a1__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/PKG-INFO +4 -2
  2. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/README.md +1 -1
  3. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/pyproject.toml +4 -0
  4. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/app/application.py +1 -0
  5. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/app/control_panel_handler.py +2 -0
  6. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/app/plot_handler.py +8 -10
  7. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/app/widgets/control_panel_widget.py +14 -2
  8. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram.egg-info/PKG-INFO +4 -2
  9. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/.github/dependabot.yml +0 -0
  10. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/.github/release.yml +0 -0
  11. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/.github/workflows/ci.yml +0 -0
  12. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/.gitignore +0 -0
  13. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/.pre-commit-config.yaml +0 -0
  14. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/.python-version +0 -0
  15. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/.vscode/launch.json +0 -0
  16. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/LICENSE +0 -0
  17. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/doc/GUI.png +0 -0
  18. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/setup.cfg +0 -0
  19. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/__init__.py +0 -0
  20. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/__main__.py +0 -0
  21. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/app/__init__.py +0 -0
  22. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/app/qapplication.py +0 -0
  23. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/app/spectrogram.py +0 -0
  24. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/app/widgets/__init__.py +0 -0
  25. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/app/widgets/combobox.py +0 -0
  26. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/app/widgets/main_window.py +0 -0
  27. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/app/widgets/plot_widget.py +0 -0
  28. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/app/widgets/power_of_two_spinbox.py +0 -0
  29. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram/util.py +0 -0
  30. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram.egg-info/SOURCES.txt +0 -0
  31. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram.egg-info/dependency_links.txt +0 -0
  32. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram.egg-info/entry_points.txt +0 -0
  33. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram.egg-info/requires.txt +0 -0
  34. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/src/audio_spectrogram.egg-info/top_level.txt +0 -0
  35. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/tox.ini +0 -0
  36. {audio_spectrogram-0.1.0a1 → audio_spectrogram-0.2.0}/uv.lock +0 -0
@@ -1,9 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: audio-spectrogram
3
- Version: 0.1.0a1
3
+ Version: 0.2.0
4
4
  Summary: Audio spectrogram app based on PySide6
5
5
  Author-email: Artur Drogunow <Artur.Drogunow@zf.com>
6
6
  License: GPL-3.0-or-later
7
+ Project-URL: Issues, https://github.com/zariiii9003/audio_spectrogram/issues
8
+ Project-URL: Source, https://github.com/zariiii9003/audio_spectrogram
7
9
  Keywords: Audio,Microphone,FFT,STFT,Spectrogram,Sonogram
8
10
  Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
9
11
  Classifier: Operating System :: OS Independent
@@ -32,7 +34,7 @@ Dynamic: license-file
32
34
 
33
35
  *Audio Spectrogram* is a small python GUI application to analyze the frequency content of your microphone input.
34
36
 
35
- <img src="doc/GUI.png" width="683" alt="GUI Screenshot" />
37
+ <img src="https://raw.githubusercontent.com/zariiii9003/audio_spectrogram/refs/heads/master/doc/GUI.png" width="683" alt="GUI Screenshot" />
36
38
 
37
39
  ## Usage
38
40
 
@@ -7,7 +7,7 @@
7
7
 
8
8
  *Audio Spectrogram* is a small python GUI application to analyze the frequency content of your microphone input.
9
9
 
10
- <img src="doc/GUI.png" width="683" alt="GUI Screenshot" />
10
+ <img src="https://raw.githubusercontent.com/zariiii9003/audio_spectrogram/refs/heads/master/doc/GUI.png" width="683" alt="GUI Screenshot" />
11
11
 
12
12
  ## Usage
13
13
 
@@ -41,6 +41,10 @@ audio-spectrogram-console = "audio_spectrogram.__main__:main"
41
41
  [project.gui-scripts]
42
42
  audio-spectrogram = "audio_spectrogram.__main__:main"
43
43
 
44
+ [project.urls]
45
+ Issues = "https://github.com/zariiii9003/audio_spectrogram/issues"
46
+ Source = "https://github.com/zariiii9003/audio_spectrogram"
47
+
44
48
  [tool.setuptools.packages.find]
45
49
  where = ["src"]
46
50
 
@@ -35,6 +35,7 @@ class Application(QObject):
35
35
  def on_capture_start(self, settings: Settings) -> None:
36
36
  LOGGER.info("%s.%s(%s)", self.__class__.__name__, self.on_capture_start.__name__, settings)
37
37
  self.plot_handler.start(
38
+ recorded_length=settings.recorded_length_s,
38
39
  sample_rate=settings.sample_rate,
39
40
  window_size=settings.window_size,
40
41
  hop_size=settings.hop_size,
@@ -15,6 +15,7 @@ from .widgets.control_panel_widget import ControlPanelWidget
15
15
 
16
16
  @dataclass
17
17
  class Settings:
18
+ recorded_length_s: int # seconds
18
19
  sample_rate: int
19
20
  window_size: int
20
21
  hop_size: int
@@ -114,6 +115,7 @@ class ControlPanelHandler(QObject):
114
115
  self.control_panel_widget.set_state(connected=True)
115
116
  self.start.emit(
116
117
  Settings(
118
+ recorded_length_s=self.control_panel_widget.recorded_length(),
117
119
  sample_rate=sample_rate,
118
120
  window_size=self.control_panel_widget.window_size(),
119
121
  hop_size=self.control_panel_widget.hop_size(),
@@ -17,7 +17,6 @@ class PlotHandler(QObject):
17
17
 
18
18
  # variables
19
19
  self.configured = False
20
- self.recording_duration: float = 20.0 # seconds
21
20
  self.time_plot_length: int = 1
22
21
  self.time_plot_x: npt.NDArray[np.float32] = np.zeros(self.time_plot_length).astype(np.float32)
23
22
  self.time_plot_y: npt.NDArray[np.float32] = np.zeros(self.time_plot_length).astype(np.float32)
@@ -40,20 +39,19 @@ class PlotHandler(QObject):
40
39
  def _connect_signals(self) -> None:
41
40
  pass
42
41
 
43
- def start(self, sample_rate: int, window_size: int, hop_size: int) -> None:
42
+ def start(self, recorded_length: int, sample_rate: int, window_size: int, hop_size: int) -> None:
44
43
  LOGGER.info(
45
- "%s.%s(sample_rate=%d, window_size=%d, hop_size=%d)",
44
+ "%s.%s(recorded_length=%d, sample_rate=%d, window_size=%d, hop_size=%d)",
46
45
  self.__class__.__name__,
47
46
  self.start.__name__,
47
+ recorded_length,
48
48
  sample_rate,
49
49
  window_size,
50
50
  hop_size,
51
51
  )
52
52
  # configure timeseries
53
- self.time_plot_length = round(self.recording_duration * sample_rate)
54
- self.time_plot_x = np.linspace(-self.recording_duration, 0, self.time_plot_length).astype(
55
- np.float32
56
- )
53
+ self.time_plot_length = recorded_length * sample_rate
54
+ self.time_plot_x = np.linspace(-recorded_length, 0, self.time_plot_length).astype(np.float32)
57
55
  self.time_plot_y = np.zeros(self.time_plot_length).astype(np.float32)
58
56
  self.plot_widget.time_plot_item.setData(x=self.time_plot_x, y=self.time_plot_y)
59
57
  self.plot_widget.time_plot.setXRange(-0.1, 0)
@@ -62,13 +60,13 @@ class PlotHandler(QObject):
62
60
  self.spec_plot_data = SpectrogramData(
63
61
  window_size=window_size,
64
62
  hop_size=hop_size,
65
- frame_count=round(self.recording_duration * sample_rate / hop_size),
63
+ frame_count=round(recorded_length * sample_rate / hop_size),
66
64
  )
67
65
  self.plot_widget.spec_plot_item.setImage(self.spec_plot_data.image, autoLevels=False)
68
66
  self.plot_widget.spec_plot_item.setRect(
69
- -self.recording_duration,
67
+ -recorded_length,
70
68
  0,
71
- self.recording_duration,
69
+ recorded_length,
72
70
  sample_rate / 2,
73
71
  )
74
72
  self.plot_widget.spec_plot.setYRange(0, sample_rate / 2)
@@ -11,6 +11,9 @@ from PySide6.QtWidgets import (
11
11
  QHBoxLayout,
12
12
  QLabel,
13
13
  QPushButton,
14
+ QSizePolicy,
15
+ QSpacerItem,
16
+ QSpinBox,
14
17
  QVBoxLayout,
15
18
  )
16
19
 
@@ -28,6 +31,7 @@ class ControlPanelWidget(QGroupBox):
28
31
  self.device_cb = ComboBoxWithSignal()
29
32
  self.sample_rate_cb = ComboBoxWithSignal()
30
33
  self.window_size_sb = PowerOfTwoSpinBox()
34
+ self.recorded_length_sb = QSpinBox(minimum=1, value=20)
31
35
  self.overlap_cb = QComboBox()
32
36
  self.start_btn = QPushButton("Start")
33
37
  self.stop_btn = QPushButton("Stop")
@@ -61,16 +65,20 @@ class ControlPanelWidget(QGroupBox):
61
65
  hbox1 = QHBoxLayout()
62
66
  hbox1.addWidget(QLabel("Capture device"), 0)
63
67
  hbox1.addWidget(self.device_cb, 1)
64
- hbox1.addWidget(QLabel("Sample rate"), 0)
68
+ hbox1.addWidget(QLabel("Sample rate [Hz]"), 0)
65
69
  hbox1.addWidget(self.sample_rate_cb, 0)
66
70
  vbox.addLayout(hbox1)
67
71
 
68
72
  hbox2 = QHBoxLayout()
73
+ hbox2.addWidget(QLabel("Recording length [s]"), 0)
74
+ hbox2.addWidget(self.recorded_length_sb, 0)
69
75
  hbox2.addWidget(QLabel("FFT window size"), 0)
70
76
  hbox2.addWidget(self.window_size_sb, 0)
71
77
  hbox2.addWidget(QLabel("Overlap"), 0)
72
78
  hbox2.addWidget(self.overlap_cb, 0)
73
- hbox2.addStretch(1)
79
+ hbox2.addSpacerItem(
80
+ QSpacerItem(50, 0, hData=QSizePolicy.Policy.MinimumExpanding, vData=QSizePolicy.Policy.Fixed)
81
+ )
74
82
  hbox2.addWidget(self.start_btn, 0)
75
83
  hbox2.addWidget(self.stop_btn, 0)
76
84
  vbox.addLayout(hbox2)
@@ -114,11 +122,15 @@ class ControlPanelWidget(QGroupBox):
114
122
  def set_state(self, *, connected: bool) -> None:
115
123
  self.device_cb.setEnabled(not connected)
116
124
  self.sample_rate_cb.setEnabled(not connected)
125
+ self.recorded_length_sb.setEnabled(not connected)
117
126
  self.window_size_sb.setEnabled(not connected)
118
127
  self.overlap_cb.setEnabled(not connected)
119
128
  self.start_btn.setEnabled(not connected)
120
129
  self.stop_btn.setEnabled(connected)
121
130
 
131
+ def recorded_length(self) -> int:
132
+ return self.recorded_length_sb.value()
133
+
122
134
  def sample_rate(self) -> int:
123
135
  return int(self.sample_rate_cb.currentText())
124
136
 
@@ -1,9 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: audio-spectrogram
3
- Version: 0.1.0a1
3
+ Version: 0.2.0
4
4
  Summary: Audio spectrogram app based on PySide6
5
5
  Author-email: Artur Drogunow <Artur.Drogunow@zf.com>
6
6
  License: GPL-3.0-or-later
7
+ Project-URL: Issues, https://github.com/zariiii9003/audio_spectrogram/issues
8
+ Project-URL: Source, https://github.com/zariiii9003/audio_spectrogram
7
9
  Keywords: Audio,Microphone,FFT,STFT,Spectrogram,Sonogram
8
10
  Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
9
11
  Classifier: Operating System :: OS Independent
@@ -32,7 +34,7 @@ Dynamic: license-file
32
34
 
33
35
  *Audio Spectrogram* is a small python GUI application to analyze the frequency content of your microphone input.
34
36
 
35
- <img src="doc/GUI.png" width="683" alt="GUI Screenshot" />
37
+ <img src="https://raw.githubusercontent.com/zariiii9003/audio_spectrogram/refs/heads/master/doc/GUI.png" width="683" alt="GUI Screenshot" />
36
38
 
37
39
  ## Usage
38
40