modusa 0.4.26__tar.gz → 0.4.28__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 (61) hide show
  1. {modusa-0.4.26 → modusa-0.4.28}/PKG-INFO +1 -1
  2. {modusa-0.4.26 → modusa-0.4.28}/pyproject.toml +1 -1
  3. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/__init__.py +3 -1
  4. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/tools/__init__.py +3 -1
  5. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/tools/plotter.py +2 -2
  6. modusa-0.4.28/src/modusa/tools/synth.py +53 -0
  7. {modusa-0.4.26 → modusa-0.4.28}/LICENSE.md +0 -0
  8. {modusa-0.4.26 → modusa-0.4.28}/README.md +0 -0
  9. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/config.py +0 -0
  10. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/decorators.py +0 -0
  11. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/devtools/generate_docs_source.py +0 -0
  12. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/devtools/generate_template.py +0 -0
  13. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/devtools/list_authors.py +0 -0
  14. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/devtools/list_plugins.py +0 -0
  15. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/devtools/main.py +0 -0
  16. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/devtools/templates/generator.py +0 -0
  17. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/devtools/templates/io.py +0 -0
  18. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/devtools/templates/model.py +0 -0
  19. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/devtools/templates/plugin.py +0 -0
  20. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/devtools/templates/test.py +0 -0
  21. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/devtools/templates/tool.py +0 -0
  22. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/fonts/NotoSansDevanagari-Regular.ttf +0 -0
  23. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/generators/__init__.py +0 -0
  24. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/generators/audio.py +0 -0
  25. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/generators/audio_waveforms.py +0 -0
  26. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/generators/base.py +0 -0
  27. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/generators/ftds.py +0 -0
  28. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/generators/s1d.py +0 -0
  29. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/generators/s2d.py +0 -0
  30. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/generators/s_ax.py +0 -0
  31. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/generators/t_ax.py +0 -0
  32. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/generators/tds.py +0 -0
  33. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/images/icon.png +0 -0
  34. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/models/__init__.py +0 -0
  35. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/models/audio.py +0 -0
  36. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/models/base.py +0 -0
  37. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/models/data.py +0 -0
  38. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/models/ftds.py +0 -0
  39. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/models/s1d.py +0 -0
  40. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/models/s2d.py +0 -0
  41. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/models/s_ax.py +0 -0
  42. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/models/t_ax.py +0 -0
  43. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/models/tds.py +0 -0
  44. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/plugins/__init__.py +0 -0
  45. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/plugins/base.py +0 -0
  46. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/tools/_plotter_old.py +0 -0
  47. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/tools/ann_loader.py +0 -0
  48. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/tools/audio_converter.py +0 -0
  49. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/tools/audio_loader.py +0 -0
  50. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/tools/audio_player.py +0 -0
  51. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/tools/audio_recorder.py +0 -0
  52. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/tools/audio_saver.py +0 -0
  53. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/tools/base.py +0 -0
  54. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/tools/math_ops.py +0 -0
  55. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/tools/youtube_downloader.py +0 -0
  56. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/utils/__init__.py +0 -0
  57. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/utils/config.py +0 -0
  58. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/utils/excp.py +0 -0
  59. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/utils/logger.py +0 -0
  60. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/utils/np_func_cat.py +0 -0
  61. {modusa-0.4.26 → modusa-0.4.28}/src/modusa/utils/plot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modusa
3
- Version: 0.4.26
3
+ Version: 0.4.28
4
4
  Summary: A modular signal analysis python library.
5
5
  Author-Email: Ankit Anand <ankit0.anand0@gmail.com>
6
6
  License: MIT
@@ -16,7 +16,7 @@ dependencies = [
16
16
  ]
17
17
  requires-python = ">=3.11"
18
18
  readme = "README.md"
19
- version = "0.4.26"
19
+ version = "0.4.28"
20
20
 
21
21
  [project.license]
22
22
  text = "MIT"
@@ -8,4 +8,6 @@ from modusa.tools import play, convert, record, save
8
8
  from modusa.tools import download
9
9
  from modusa.tools import load, load_ann
10
10
 
11
- __version__ = "0.4.26"
11
+ from modusa.tools import synth_f0
12
+
13
+ __version__ = "0.4.28"
@@ -9,4 +9,6 @@ from .ann_loader import load_ann
9
9
  from .audio_recorder import record
10
10
 
11
11
  from .plotter import Fig as fig
12
- from .plotter import dist_plot, hill_plot, plot
12
+ from .plotter import dist_plot, hill_plot, plot
13
+
14
+ from .synth import synth_f0
@@ -539,7 +539,7 @@ class Fig:
539
539
  text_obj = curr_row[0].text(
540
540
  (start + end) / 2, text_yloc, tag,
541
541
  ha='center', va='center',
542
- fontsize=10, color="black", fontweight='bold', zorder=10, clip_on=True
542
+ fontsize=9, color="black", zorder=10, clip_on=True
543
543
  )
544
544
 
545
545
  text_obj.set_clip_path(rect)
@@ -556,7 +556,7 @@ class Fig:
556
556
  text_obj = curr_row[0].text(
557
557
  (start + end) / 2, text_yloc, tag,
558
558
  ha='center', va='center',
559
- fontsize=10, color="black", fontweight='bold', zorder=10, clip_on=True
559
+ fontsize=9, color="black", zorder=10, clip_on=True
560
560
  )
561
561
 
562
562
  text_obj.set_clip_path(rect)
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env python3
2
+
3
+ #---------------------------------
4
+ # Author: Ankit Anand
5
+ # Date: 22/10/25
6
+ # Email: ankit0.anand0@gmail.com
7
+ #---------------------------------
8
+
9
+ def synth_f0(f0, f0t, sr, nharm=0):
10
+ """
11
+ Synthesize f0 contour so that you can
12
+ hear it back.
13
+
14
+ Parameters
15
+ ----------
16
+ f0: ndarray
17
+ - Fundamental frequency (f0) contour in Hz.
18
+ f0t: ndarray
19
+ - Timestamps in seconds
20
+ sr: int
21
+ - Sampling rate in Hz for the synthesized audio.
22
+ nharm: int
23
+ - Number of harmonics
24
+ - Default: 0 => Only fundamental frequency (No harmonics)
25
+
26
+ Returns
27
+ -------
28
+ ndarray
29
+ - Syntesized audio.
30
+ sr
31
+ - Sampling rate of the synthesized audio
32
+ """
33
+
34
+ # Create new time axis
35
+ t = np.arange(0, f0t[-1], 1 / sr)
36
+
37
+ # Interpolate the f0 to match the sampling time points
38
+ f0_interp = np.interp(t, f0t, f0)
39
+
40
+ # Compute phase by integrating frequency over time
41
+ phase = 2 * np.pi * np.cumsum(f0_interp) / sr
42
+
43
+ # Start with fundamental
44
+ y = np.sin(phase)
45
+
46
+ # Add harmonics if requested
47
+ for n in range(2, nharm + 2): # from 2nd to (nharm+1)th harmonic
48
+ y += np.sin(n * phase) / n**2 # dividing by n to reduce harmonic amplitude
49
+
50
+ # Normalize output to avoid clipping
51
+ y /= np.max(np.abs(y))
52
+
53
+ return y, sr
File without changes
File without changes
File without changes