modusa 0.3.75__py3-none-any.whl → 0.3.77__py3-none-any.whl

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.
modusa/__init__.py CHANGED
@@ -4,6 +4,6 @@ from modusa.utils import excp, config
4
4
  from modusa.tools import plot_dist, fig
5
5
  #=====
6
6
 
7
- from modusa.tools import play, convert, record
7
+ from modusa.tools import play, convert, record, save
8
8
  from modusa.tools import download
9
9
  from modusa.tools import load, load_ann
modusa/tools/__init__.py CHANGED
@@ -4,6 +4,7 @@ from .audio_player import play
4
4
  from .audio_converter import convert
5
5
  from .youtube_downloader import download
6
6
  from .audio_loader import load
7
+ from .audio_saver import save
7
8
  from .ann_loader import load_ann
8
9
  from .audio_recorder import record
9
10
 
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env python3
2
+
3
+ #---------------------------------
4
+ # Author: Ankit Anand
5
+ # Date: 13/09/25
6
+ # Email: ankit0.anand0@gmail.com
7
+ #---------------------------------
8
+
9
+
10
+ def save(y, sr, out_path):
11
+ """
12
+ Saves an array as an audio file.
13
+
14
+ Parameters
15
+ ----------
16
+ y: ndarray
17
+ - Audio signal array.
18
+ sr: number [> 0]
19
+ - Sampling rate of the audio signal.
20
+ out_path: str
21
+ - Output path of the audio file.
22
+
23
+ Returns
24
+ -------
25
+ None
26
+ """
27
+
28
+ import soundfile as sf
29
+
30
+ sf.write(file=out_path, data=y, samplerate=sr)
modusa/tools/plotter.py CHANGED
@@ -547,7 +547,7 @@ class Fig:
547
547
 
548
548
  Parameters
549
549
  ----------
550
- xys : list[tuple[float, float]]
550
+ xys : list[tuple[float, float]] | tuple[float, float]
551
551
  - List of target points (x, y) for the arrow heads.
552
552
  labels : list[str] | str
553
553
  - List of text labels at the arrow tails.
@@ -572,6 +572,8 @@ class Fig:
572
572
  curr_row = self._get_prev_row() if ax is None else self._axs[ax]
573
573
 
574
574
  # Normalize single values into lists
575
+ if isinstance(xys, tuple):
576
+ xys = [xys]
575
577
  n = len(xys)
576
578
  if isinstance(labels, str):
577
579
  labels = [labels] * n
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modusa
3
- Version: 0.3.75
3
+ Version: 0.3.77
4
4
  Summary: A modular signal analysis python library.
5
5
  Author-Email: Ankit Anand <ankit0.anand0@gmail.com>
6
6
  License: MIT
@@ -1,9 +1,9 @@
1
- modusa-0.3.75.dist-info/METADATA,sha256=Z_3ZBuYSz8nhxDJmE1LKgOqTjgmWMlXvqkwmabr4kQM,1436
2
- modusa-0.3.75.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90
3
- modusa-0.3.75.dist-info/entry_points.txt,sha256=fmKpleVXj6CdaBVL14WoEy6xx7JQCs85jvzwTi3lePM,73
4
- modusa-0.3.75.dist-info/licenses/LICENSE.md,sha256=JTaXAjx5awk76VArKCx5dUW8vmLEWsL_ZlR7-umaHbA,1078
1
+ modusa-0.3.77.dist-info/METADATA,sha256=vGpgS_qXikYxVcrsS4QYqtTAEBnnwtI6cZf38bEhtrg,1436
2
+ modusa-0.3.77.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90
3
+ modusa-0.3.77.dist-info/entry_points.txt,sha256=fmKpleVXj6CdaBVL14WoEy6xx7JQCs85jvzwTi3lePM,73
4
+ modusa-0.3.77.dist-info/licenses/LICENSE.md,sha256=JTaXAjx5awk76VArKCx5dUW8vmLEWsL_ZlR7-umaHbA,1078
5
5
  modusa/.DS_Store,sha256=_gm6qJREwfMi8dE7n5S89_RG46u5t3xHyD-smNhtNoM,6148
6
- modusa/__init__.py,sha256=RMIKAZZ27w1oh2UFMJvZQtQ-SluIQsac_3mSK_LaM30,277
6
+ modusa/__init__.py,sha256=NePOWbyJftN9eKV6VEzS8QBMY5SCym9DzUCrVcVZ7kY,283
7
7
  modusa/config.py,sha256=bTqK4t00FZqERVITrxW_q284aDDJAa9aMSfFknfR-oU,280
8
8
  modusa/decorators.py,sha256=8zeNX_wE37O6Vp0ysR4-WCZaEL8mq8dyCF_I5DHOzks,5905
9
9
  modusa/devtools/generate_docs_source.py,sha256=UDflHsk-Yh9-3YJTVBzKL32y8hcxiRgAlFEBTMiDqwM,3301
@@ -41,16 +41,17 @@ modusa/models/t_ax.py,sha256=ZUhvZPUW1TkdZYuUd6Ucm-vsv0JqtZ9yEe3ab67Ma6w,8022
41
41
  modusa/models/tds.py,sha256=FAGfibjyyE_lkEuQp-vSCuqQnopOjmy_IXqUjRlg9kc,11677
42
42
  modusa/plugins/__init__.py,sha256=r1Bf5mnrVKRIwxboutY1iGzDy4EPQhqpk1kSW7iJj_Q,54
43
43
  modusa/plugins/base.py,sha256=Bh_1Bja7fOymFsCgwhXDbV6ys3D8muNrPwrfDrG_G_A,2382
44
- modusa/tools/__init__.py,sha256=TfIlnbSRVEk8C9YY6H5y0qiaKttFV_X3m6nI2qPYUH0,295
44
+ modusa/tools/__init__.py,sha256=V2Zr75ZsKLQAokWUsxgK2nfuzYR4HLzIRLMHpCnu7_4,325
45
45
  modusa/tools/_plotter_old.py,sha256=KGow7mihA2H1WNq7s5bpivhCgGo2qVIeDaO6iabpsrg,19294
46
46
  modusa/tools/ann_loader.py,sha256=GWiX7v4CxyAECthmtBAaSMMqsjo1YaVfRA9u-CtTTFM,1718
47
47
  modusa/tools/audio_converter.py,sha256=415qBoPm2sBIuBSI7m1XBKm0AbmVmPydIPPr-uO8D3c,1778
48
48
  modusa/tools/audio_loader.py,sha256=LEknkmc09SoUGN80-Uy59sVyeC6_55tD3a6ICbvaqWQ,2768
49
49
  modusa/tools/audio_player.py,sha256=GP04TWW4jBwQBjANkfR_cJtEy7cIhvbu8RTwnf9hD6E,2817
50
50
  modusa/tools/audio_recorder.py,sha256=d2fVt0Sd2tlBdb2WlUs60K4N23zuxM3KUpQqX0ifPi8,2769
51
+ modusa/tools/audio_saver.py,sha256=ldzfr_AydsHTnKbxmBLJblN-hLzTmOlppOm306xI4Ug,510
51
52
  modusa/tools/base.py,sha256=C0ESJ0mIfjjRlAkRbSetNtMoOfS6IrHBjexRp3l_Mh4,1293
52
53
  modusa/tools/math_ops.py,sha256=ZZ7U4DgqT7cOeE7_Lzi_Qq-48WYfwR9_osbZwTmE9eg,8690
53
- modusa/tools/plotter.py,sha256=00sXkQyH_LNroxG_C3LAkvpRQsC3Yk-c8j99g36JzJ8,23583
54
+ modusa/tools/plotter.py,sha256=k5VYIzrSYjUzVKloR_MiPIUw2kavjF3DS4aXyN6N81U,23649
54
55
  modusa/tools/youtube_downloader.py,sha256=hB_X8-7nOHXOlxg6vv3wyhBLoAsWyomrULP6_uCQL7s,1698
55
56
  modusa/utils/.DS_Store,sha256=nLXMwF7QJNuglLI_Gk74F7vl5Dyus2Wd74Mgowijmdo,6148
56
57
  modusa/utils/__init__.py,sha256=1oLL20yLB1GL9IbFiZD8OReDqiCpFr-yetIR6x1cNkI,23
@@ -59,4 +60,4 @@ modusa/utils/excp.py,sha256=L9vhaGjKpv9viJYdmC9n5ndmk2GVbUBuFyZyhAQZmWY,906
59
60
  modusa/utils/logger.py,sha256=K0rsnObeNKCxlNeSnVnJeRhgfmob6riB2uyU7h3dDmA,571
60
61
  modusa/utils/np_func_cat.py,sha256=TyIFgRc6bARRMDnZxlVURO5Z0I-GWhxRONYyIv-Vwxs,1007
61
62
  modusa/utils/plot.py,sha256=s_vNdxvKfwxEngvJPgrF1PcmxZNnNaaXPViHWjyjJ-c,5335
62
- modusa-0.3.75.dist-info/RECORD,,
63
+ modusa-0.3.77.dist-info/RECORD,,