tuning_frequency: float = 440.0,
signal_fading_duration: float = 0.05,
note_fading_duration: float = 0.01,
- sonification_duration: int = None,
+ sonification_duration: float = None,
normalize: bool = True,
fs: int = 22050) -> np.ndarray:
"""Sonifies a piano-roll with additive synthesis.
@@ -125,8 +125,8 @@ Source code for libsoni.core.pianoroll
tuning_frequency: float, default = 440.0
Tuning frequency, in Hertz.
- sonification_duration: int, default = None
- Determines duration of sonification, in samples.
+ sonification_duration: float, default = None
+ Determines duration of sonification, in seconds.
signal_fading_duration: float, default = 0.05
Determines duration of fade-in and fade-out at beginning and end of the final sonification, in seconds.
@@ -174,7 +174,7 @@ Source code for libsoni.core.pianoroll
[docs]def sonify_pianoroll_clicks(pianoroll_df: pd.DataFrame,
tuning_frequency: float = 440.0,
-
sonification_duration: int = None,
+
sonification_duration: float = None,
signal_fading_duration: float = 0.05,
normalize: bool = True,
fs: int = 22050) -> np.ndarray:
@@ -192,8 +192,8 @@
Source code for libsoni.core.pianoroll
tuning_frequency: float, default = 440.0
Tuning Frequency, in Hertz
- sonification_duration: int, default = None
- Determines duration of sonification, in samples.
+ sonification_duration: float, default = None
+ Determines duration of sonification, in seconds.
signal_fading_duration: float, default = 0.05
Determines duration of fade-in and fade-out at beginning and end of the final sonification, in seconds.
@@ -235,7 +235,7 @@ Source code for libsoni.core.pianoroll
[docs]def sonify_pianoroll_sample(pianoroll_df: pd.DataFrame,
sample: np.ndarray = None,
reference_pitch: int = 69,
-
sonification_duration: int = None,
+
sonification_duration: float = None,
signal_fading_duration: float = 0.05,
note_fading_duration: float = 0.01,
normalize: bool = True,
@@ -256,8 +256,8 @@
Source code for libsoni.core.pianoroll
reference_pitch: int, default = 69
Original pitch of the sample.
- sonification_duration: int, default = None
- Determines duration of sonification, in samples.
+ sonification_duration: float, default = None
+ Determines duration of sonification, in seconds.
signal_fading_duration: float, default = 0.05
Determines duration of fade-in and fade-out at beginning and end of the final sonification, in seconds.
@@ -306,7 +306,7 @@ Source code for libsoni.core.pianoroll
mod_rate_relative: float = 0.0,
mod_amp: float = 0.0,
tuning_frequency: float = 440.0,
- sonification_duration: int = None,
+ sonification_duration: float = None,
signal_fading_duration: float = 0.05,
note_fading_duration: float = 0.01,
normalize: bool = True,
@@ -331,8 +331,8 @@ Source code for libsoni.core.pianoroll
tuning_frequency: float, default = 440.0
Tuning frequency in Hertz.
- sonification_duration: int, default = None
- Determines duration of sonification, in samples.
+ sonification_duration: float, default = None
+ Determines duration of sonification, in seconds.
signal_fading_duration: float, default = 0.05
Determines duration of fade-in and fade-out at beginning and end of the final sonification, in seconds.
@@ -376,27 +376,29 @@ Source code for libsoni.core.pianoroll
return pianoroll_sonification
-def __init_pianoroll_sonification(pianoroll_df,
- fs,
- sonification_duration):
+def __init_pianoroll_sonification(pianoroll_df: pd.DataFrame,
+ fs: int,
+ sonification_duration: float = None):
+
pianoroll_df = format_df(pianoroll_df)
num_samples = int(pianoroll_df['end'].max() * fs)
- if sonification_duration is not None:
- # if sonification_duration equals num_samples, do nothing
- if sonification_duration == num_samples:
- pass
+ if sonification_duration is None:
+ sonification_duration = pianoroll_df['end'].max()
+ sonification_duration_samples = int(sonification_duration * fs)
+ print(sonification_duration)
- # if sonification_duration is less than num_samples, crop the arrays
- elif sonification_duration < num_samples:
- pianoroll_df = pianoroll_df[pianoroll_df['start'] < sonification_duration]
- pianoroll_df['end'] = pianoroll_df[pianoroll_df['end'] > sonification_duration] = sonification_duration
- pianoroll_df['duration'] = pianoroll_df['end'] - pianoroll_df['start']
+ # if sonification_duration is less than num_samples, crop the arrays
+ if sonification_duration_samples < num_samples:
+ pianoroll_df = pianoroll_df[pianoroll_df['start'] < sonification_duration]
+ pianoroll_df.loc[pianoroll_df['end'] > sonification_duration, 'end'] = sonification_duration
- num_samples = sonification_duration
+ pianoroll_df['duration'] = pianoroll_df['end'] - pianoroll_df['start']
- pianoroll_sonification = np.zeros(num_samples)
+ num_samples = sonification_duration_samples
+ pianoroll_sonification = np.zeros(num_samples)
+ print(pianoroll_df)
return pianoroll_df, pianoroll_sonification
diff --git a/docs/build/html/core/pianoroll.html b/docs/build/html/core/pianoroll.html
index 8844c1d..5d5ca10 100644
--- a/docs/build/html/core/pianoroll.html
+++ b/docs/build/html/core/pianoroll.html
@@ -99,7 +99,7 @@
Piano-Roll (libsoni.core.pianoroll)
-
-libsoni.core.pianoroll.sonify_pianoroll_additive_synthesis(pianoroll_df: DataFrame, partials: ndarray = array([1]), partials_amplitudes: ndarray | None = None, partials_phase_offsets: ndarray | None = None, tuning_frequency: float = 440.0, signal_fading_duration: float = 0.05, note_fading_duration: float = 0.01, sonification_duration: int | None = None, normalize: bool = True, fs: int = 22050) → ndarray[source]
+libsoni.core.pianoroll.sonify_pianoroll_additive_synthesis(pianoroll_df: DataFrame, partials: ndarray = array([1]), partials_amplitudes: ndarray | None = None, partials_phase_offsets: ndarray | None = None, tuning_frequency: float = 440.0, signal_fading_duration: float = 0.05, note_fading_duration: float = 0.01, sonification_duration: float | None = None, normalize: bool = True, fs: int = 22050) → ndarray[source]
Sonifies a piano-roll with additive synthesis.
The DataFrame representation is assumed to contain row-wise pitch events described by start, duration or end
and the corresponding pitch.
@@ -119,7 +119,7 @@
partials_phase_offsets (np.ndarray, default = None) – Array containing the phase offsets for partials.
When not defined, the phase offsets for all partials are set to 0.
tuning_frequency (float, default = 440.0) – Tuning frequency, in Hertz.
-sonification_duration (int, default = None) – Determines duration of sonification, in samples.
+sonification_duration (float, default = None) – Determines duration of sonification, in seconds.
signal_fading_duration (float, default = 0.05) – Determines duration of fade-in and fade-out at beginning and end of the final sonification, in seconds.
note_fading_duration (float, default = 0.01) – Determines duration of fade-in and fade-out at beginning and end of each note event, in seconds.
normalize (bool, default = True) – Determines if output signal is normalized to [-1,1].
@@ -134,7 +134,7 @@
-
-libsoni.core.pianoroll.sonify_pianoroll_clicks(pianoroll_df: DataFrame, tuning_frequency: float = 440.0, sonification_duration: int | None = None, signal_fading_duration: float = 0.05, normalize: bool = True, fs: int = 22050) → ndarray[source]
+libsoni.core.pianoroll.sonify_pianoroll_clicks(pianoroll_df: DataFrame, tuning_frequency: float = 440.0, sonification_duration: float | None = None, signal_fading_duration: float = 0.05, normalize: bool = True, fs: int = 22050) → ndarray[source]
Sonifies a piano-roll with clicks.
The DataFrame representation is assumed to contain row-wise pitch events described by start, duration or end
and the corresponding pitch.
@@ -144,7 +144,7 @@
pianoroll_df (pd.DataFrame) – Dataframe containing pitch-event information.
tuning_frequency (float, default = 440.0) – Tuning Frequency, in Hertz
-sonification_duration (int, default = None) – Determines duration of sonification, in samples.
+sonification_duration (float, default = None) – Determines duration of sonification, in seconds.
signal_fading_duration (float, default = 0.05) – Determines duration of fade-in and fade-out at beginning and end of the final sonification, in seconds.
normalize (bool, default = True) – Determines if output signal is normalized to [-1,1].
fs (int, default = 22050) – Sampling rate, in samples per seconds.
@@ -158,7 +158,7 @@
-
-libsoni.core.pianoroll.sonify_pianoroll_fm_synthesis(pianoroll_df: DataFrame, mod_rate_relative: float = 0.0, mod_amp: float = 0.0, tuning_frequency: float = 440.0, sonification_duration: int | None = None, signal_fading_duration: float = 0.05, note_fading_duration: float = 0.01, normalize: bool = True, fs: int = 22050) → ndarray[source]
+libsoni.core.pianoroll.sonify_pianoroll_fm_synthesis(pianoroll_df: DataFrame, mod_rate_relative: float = 0.0, mod_amp: float = 0.0, tuning_frequency: float = 440.0, sonification_duration: float | None = None, signal_fading_duration: float = 0.05, note_fading_duration: float = 0.01, normalize: bool = True, fs: int = 22050) → ndarray[source]
Sonifies a piano-roll with frequency modulation (FM) synthesis.
The DataFrame representation is assumed to contain row-wise pitch events described by start, duration or end
and the corresponding pitch. The sonification is based on FM synthesis, where parameters mod_rate_relative and
@@ -170,7 +170,7 @@
mod_rate_relative (float, default = 0.0) – Determines the modulation frequency as multiple or fraction of the frequency for the given pitch.
mod_amp (float, default = 0.0) – Determines the amount of modulation in the generated signal.
tuning_frequency (float, default = 440.0) – Tuning frequency in Hertz.
-sonification_duration (int, default = None) – Determines duration of sonification, in samples.
+sonification_duration (float, default = None) – Determines duration of sonification, in seconds.
signal_fading_duration (float, default = 0.05) – Determines duration of fade-in and fade-out at beginning and end of the final sonification, in seconds.
note_fading_duration (float, default = 0.01) – Determines duration of fade-in and fade-out at beginning and end of each note event, in seconds.
normalize (bool, default = True) – Determines if output signal is normalized to [-1,1].
@@ -185,7 +185,7 @@
-
-libsoni.core.pianoroll.sonify_pianoroll_sample(pianoroll_df: DataFrame, sample: ndarray | None = None, reference_pitch: int = 69, sonification_duration: int | None = None, signal_fading_duration: float = 0.05, note_fading_duration: float = 0.01, normalize: bool = True, fs: int = 22050) → ndarray[source]
+libsoni.core.pianoroll.sonify_pianoroll_sample(pianoroll_df: DataFrame, sample: ndarray | None = None, reference_pitch: int = 69, sonification_duration: float | None = None, signal_fading_duration: float = 0.05, note_fading_duration: float = 0.01, normalize: bool = True, fs: int = 22050) → ndarray[source]
Sonifies a piano-roll based on custom audio samples.
The DataFrame representation is assumed to contain row-wise pitch events described by start, duration or end
and the corresponding pitch. For sonification, warped versions of the given sample are used.
@@ -195,7 +195,7 @@
pianoroll_df (pd.DataFrame) – Dataframe containing pitch-event information.
sample (np.ndarray) – Sample to use for sonification.
reference_pitch (int, default = 69) – Original pitch of the sample.
-sonification_duration (int, default = None) – Determines duration of sonification, in samples.
+sonification_duration (float, default = None) – Determines duration of sonification, in seconds.
signal_fading_duration (float, default = 0.05) – Determines duration of fade-in and fade-out at beginning and end of the final sonification, in seconds.
note_fading_duration (float, default = 0.01) – Determines duration of fade-in and fade-out at beginning and end of each note event, in seconds.
normalize (bool, default = True) – Determines if output signal is normalized to [-1,1].
diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js
index 45578dd..dbe7844 100644
--- a/docs/build/html/searchindex.js
+++ b/docs/build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["core/chroma", "core/f0", "core/index", "core/methods", "core/pianoroll", "core/spectrogram", "core/tse", "genindex", "index", "py-modindex", "utils"], "filenames": ["core/chroma.rst", "core/f0.rst", "core/index.rst", "core/methods.rst", "core/pianoroll.rst", "core/spectrogram.rst", "core/tse.rst", "genindex.rst", "index.rst", "py-modindex.rst", "utils.rst"], "titles": ["Chroma (libsoni.core.chroma)", "F0 (libsoni.core.f0)", "Core Features (libsoni.core)", "Methods (libsoni.core.methods)", "Piano-Roll (libsoni.core.pianoroll)", "Spectrogram (libsoni.core.spectrogram)", "TSE (libsoni.core.tse)", "Index", "libsoni: A Python Toolbox for Sonifying Music Annotations and Feature Representations", "Module Index", "Utils (libsoni.util.utils)"], "terms": {"sonify_chroma_vector": 0, "chroma_vector": 0, "ndarrai": [0, 1, 3, 4, 5, 6, 10], "pitch_rang": [0, 3], "tupl": [0, 3, 6, 10], "int": [0, 1, 3, 4, 5, 6, 10], "20": [0, 3], "108": [0, 3], "filter": [0, 3], "bool": [0, 1, 3, 4, 5, 6, 10], "fals": [0, 3, 10], "f_center": [0, 3], "float": [0, 1, 3, 4, 5, 6, 10], "440": [0, 3, 4, 10], "0": [0, 1, 3, 4, 5, 6, 10], "octave_cutoff": [0, 3], "1": [0, 1, 3, 4, 5, 6, 10], "tuning_frequ": [0, 3, 4, 10], "fading_dur": [0, 1, 3, 5, 6, 10], "05": [0, 1, 3, 4, 5, 6], "sonification_dur": [0, 1, 4, 5, 6], "none": [0, 1, 3, 4, 5, 6, 10], "normal": [0, 1, 4, 5, 6, 10], "true": [0, 1, 4, 5, 6, 10], "f": [0, 1, 3, 4, 5, 6, 10], "22050": [0, 1, 3, 4, 5, 6, 10], "sourc": [0, 1, 3, 4, 5, 6, 8, 10], "sonifi": [0, 1, 4, 5, 6], "vector": 0, "us": [0, 1, 3, 4, 5, 6, 10], "sound": [0, 1, 3, 4, 6, 8], "synthesi": [0, 3, 4, 8], "base": [0, 1, 4, 10], "shepard": [0, 3], "tone": [0, 3, 10], "The": [0, 1, 3, 4], "can": [0, 1, 3, 4], "chang": [0, 3], "either": [0, 3], "option": [0, 3], "specifi": [0, 3], "pitch": [0, 3, 4, 6, 10], "rang": [0, 3], "both": [0, 3, 10], "also": [0, 3, 8], "combin": [0, 3], "shape": [0, 1, 3, 4], "spectrum": [0, 3], "like": [0, 3], "bell": [0, 3], "curv": [0, 3], "center": [0, 3], "around": [0, 3], "frequenc": [0, 1, 3, 4, 5, 10], "while": [0, 1, 3, 4], "octav": [0, 3], "cutoff": [0, 3], "determin": [0, 1, 3, 4, 5, 6], "which": [0, 3], "amplitud": [0, 1, 3, 4, 6], "correspond": [0, 3, 4, 6, 10], "sinusoid": [0, 3, 5], "i": [0, 1, 3, 4, 5, 6, 8, 10], "5": [0, 1, 3, 4, 10], "paramet": [0, 1, 3, 4, 5, 6, 10], "np": [0, 1, 3, 4, 5, 6, 10], "default": [0, 1, 3, 4, 5, 6, 10], "encount": [0, 3], "enabl": [0, 3, 8], "hertz": [0, 3, 4, 5, 10], "width": [0, 3], "tune": [0, 3, 4, 10], "durat": [0, 1, 3, 4, 5, 6, 10], "sonif": [0, 1, 3, 4, 5, 6, 8, 10], "sampl": [0, 1, 3, 4, 5, 6, 10], "fade": [0, 1, 3, 4, 5, 6, 10], "out": [0, 1, 3, 4, 5, 6, 10], "begin": [0, 1, 4, 5, 6], "end": [0, 1, 4, 5, 6, 10], "second": [0, 1, 3, 4, 5, 6, 10], "output": [0, 1, 4, 5, 6, 10], "signal": [0, 1, 3, 4, 5, 6, 10], "rate": [0, 1, 3, 4, 5, 6, 10], "per": [0, 1, 3, 4, 5, 6, 10], "return": [0, 1, 3, 4, 5, 6, 10], "chroma_sonif": 0, "sonify_chromagram": 0, "chromagram": 0, "h": 0, "hop": 0, "size": 0, "stft": 0, "calcul": [0, 10], "For": [0, 4, 10], "magnitud": 0, "reach": 0, "half": 0, "center_frequ": 0, "twice": [0, 1, 3, 4], "sonify_f0": 1, "time_f0": 1, "gain": [1, 3, 10], "partial": [1, 3, 4], "arrai": [1, 3, 4, 5, 6], "partials_amplitud": [1, 3, 4], "partials_phase_offset": [1, 3, 4], "trajectori": 1, "given": [1, 3, 4, 6, 10], "2d": 1, "numpi": [1, 4, 6], "must": 1, "contain": [1, 3, 4, 5, 10], "time": [1, 5, 6, 10], "posit": [1, 6], "associ": 1, "instantan": [1, 3], "phase": [1, 3, 4], "inform": [1, 4, 10], "summat": 1, "valu": [1, 10], "f0valu": [], "desir": [1, 3, 4, 10], "fundament": [1, 3, 4], "an": [1, 3, 4, 8, 10], "lead": [1, 3, 4], "onli": [1, 3, 4, 8], "2": [1, 3, 4], "caus": [1, 3, 4], "first": [1, 3, 4], "have": [1, 3, 4], "ha": [1, 3, 4], "If": 1, "all": [1, 3, 4], "ar": [1, 3, 4], "set": [1, 3, 4, 10], "offset": [1, 3, 4, 6], "when": [1, 3, 4], "defin": [1, 3, 4], "f0_sonif": 1, "generate_click": 3, "69": [3, 4, 6, 10], "click_fading_dur": [3, 6], "gener": [3, 4, 8, 10], "click": [3, 4, 6, 10], "color": [3, 10], "generate_shepard_ton": 3, "pitch_class": 3, "class": 3, "01": [3, 4, 10], "shepard_ton": 3, "generate_sinusoid": 3, "generate_tone_additive_synthesi": 3, "addit": [3, 4], "custom": [3, 4, 6], "generated_ton": 3, "generate_tone_fm_synthesi": 3, "modulation_rate_rel": 3, "modulation_amplitud": 3, "modul": [3, 4, 10], "synthes": 3, "multipl": [3, 4, 6], "fraction": [3, 4], "amount": [3, 4, 10], "generate_tone_instantaneous_phas": 3, "frequency_vector": 3, "gain_vector": 3, "wise": [3, 4], "generate_tone_wavet": 3, "wavet": 3, "depend": 3, "resampl": 3, "sonify_pianoroll_additive_synthesi": 4, "pianoroll_df": [4, 10], "datafram": [4, 10], "signal_fading_dur": 4, "note_fading_dur": 4, "represent": [4, 10], "assum": 4, "row": 4, "event": [4, 6, 8, 10], "describ": 4, "start": 4, "where": 4, "pd": [4, 10], "final": 4, "each": [4, 10], "note": 4, "pianoroll_sonif": 4, "sonify_pianoroll_click": 4, "colour": 4, "waveform": [4, 6, 10], "form": [4, 6], "1d": [4, 6], "sonify_pianoroll_fm_synthesi": 4, "mod_rate_rel": 4, "mod_amp": 4, "sonify_pianoroll_sampl": 4, "reference_pitch": [4, 10], "warp": [4, 6, 10], "version": [4, 6, 10], "origin": [4, 10], "sonify_spectrogram": 5, "frequency_coeffici": 5, "time_coeffici": 5, "coeffici": [5, 6], "spectrogram_sonif": 5, "sonify_tse_click": 6, "time_posit": 6, "click_pitch": 6, "25": 6, "click_amplitud": 6, "offset_rel": 6, "rel": 6, "indic": 6, "max": [6, 10], "tse_sonif": 6, "sonify_tse_multiple_click": 6, "times_pitch": 6, "list": 6, "thi": [6, 10], "function": [6, 8, 10], "creat": 6, "differ": 6, "compris": 6, "audio": [4, 6, 10], "sonify_tse_multiple_sampl": 6, "times_sampl": 6, "sonify_tse_sampl": 6, "python": [], "packag": 10, "variou": [], "found": [], "music": [], "retriev": [], "applic": 8, "mainli": [], "consist": [], "dedic": [], "specif": 8, "input": 10, "e": 6, "g": 6, "chroma": [], "itself": [], "envelope_sign": [], "attack_tim": [], "decay_tim": [], "sustain_level": [], "release_tim": [], "44100": [], "envelop": [], "length": [], "too": [], "short": [], "regard": [], "adsr": [], "zero": 10, "enveloped_sign": [], "fade_sign": 10, "normalized_sign": 10, "mix_sonification_and_origin": 10, "original_audio": 10, "gain_lin_sonif": 10, "gain_lin_original_audio": 10, "pan": 10, "take": 10, "mix": 10, "stereo": 10, "linear": 10, "control": 10, "mean": 10, "left": 10, "right": 10, "channel": 10, "same": 10, "mixed_audio": 10, "normalize_sign": 10, "pitch_to_frequ": 10, "refer": 10, "visualize_pianorol": 10, "df": [], "xlabel": 10, "str": 10, "ylabel": 10, "titl": 10, "fmp_1": 10, "velocity_alpha": 10, "figsiz": 10, "12": 10, "4": 10, "ax": 10, "dpi": 10, "72": 10, "plot": [], "pianorol": [], "visual": 10, "inspir": [], "from": 10, "fmp": [], "notebook": [], "c1": [], "c1s2_csv": [], "ipynb": [], "score": [], "label": 10, "x": 10, "axi": 10, "y": 10, "sever": [], "string": [], "fmp_colormap": [], "matplotlib": 10, "colormap": 10, "3": [], "dict": [], "assign": [], "veloc": 10, "alpha": [], "rectangl": [], "height": [], "inch": [], "instanc": 10, "dot": [], "fig": 10, "figur": 10, "wa": [], "warp_sampl": 10, "target_pitch": 10, "target_duration_sec": 10, "provid": 10, "get": 10, "shift": 10, "librosa": 10, "effect": 10, "pitch_shift": 10, "tempor": 10, "align": 10, "shorter": 10, "than": 10, "crop": 10, "els": 10, "longer": 10, "pad": 10, "target": 10, "fading_sec": [], "avoid": 10, "warped_sampl": 10, "sonify_chunk": [], "arg": [], "sonify_spectrogram_multi": 5, "num_process": 5, "multiprocess": 5, "effici": [5, 8], "number": [5, 10], "process": [5, 8], "open": 8, "tailor": 8, "annot": [], "By": 8, "emploi": 8, "explicit": 8, "easi": 8, "understand": 8, "techniqu": 8, "offer": 8, "trigger": 8, "spectral": 8, "harmon": 8, "tonal": 8, "melod": 8, "rhythmic": 8, "aspect": 8, "unlik": 8, "exist": 8, "softwar": 8, "librari": 8, "focus": 8, "creativ": 8, "design": 8, "meet": 8, "need": 8, "research": 8, "educ": 8, "It": 8, "aim": 8, "simplifi": 8, "explor": 8, "promot": 8, "more": 8, "intuit": 8, "approach": 8, "data": 8, "analysi": 8, "user": 8, "interact": 8, "acoust": 8, "meaning": 8, "wai": 8, "As": 8, "result": 8, "improv": 8, "analyt": 8, "capabl": 8, "scientist": 8, "up": 8, "new": 8, "avenu": 8, "innov": 8, "discoveri": 8, "furthermor": [], "well": [], "document": [], "stand": [], "alon": [], "cover": [], "essenti": [], "build": [], "block": [], "crucial": [], "appli": [], "easili": [], "extend": [], "method": [], "addition": [], "includ": [], "jupyt": [], "illustr": [], "code": [], "exampl": [], "demonstr": [], "deepen": [], "within": [], "scenario": [], "mir": 8, "fm": 4, "metronom": 6, "smooth_weight": 10, "weight": 10, "fading_sampl": 10, "smooth": 10, "weights_smooth": 10, "panda": 10, "core": 10, "frame": 10, "type": 10, "home": 10, "yiitoz": 10, "miniconda3": 10, "env": 10, "lib": 10, "python3": 10, "8": 10, "site": 10, "__init__": 10, "py": 10, "piano": 10, "roll": 10, "format": 10, "text": 10, "see": 10, "http": 10, "github": 10, "com": 10, "meinardmuel": 10, "libfmp": 10, "rectangular": 10, "region": 10, "object": 10, "resolut": 10}, "objects": {"libsoni.core": [[0, 0, 0, "-", "chroma"], [1, 0, 0, "-", "f0"], [3, 0, 0, "-", "methods"], [4, 0, 0, "-", "pianoroll"], [5, 0, 0, "-", "spectrogram"], [6, 0, 0, "-", "tse"]], "libsoni.core.chroma": [[0, 1, 1, "", "sonify_chroma_vector"], [0, 1, 1, "", "sonify_chromagram"]], "libsoni.core.f0": [[1, 1, 1, "", "sonify_f0"]], "libsoni.core.methods": [[3, 1, 1, "", "generate_click"], [3, 1, 1, "", "generate_shepard_tone"], [3, 1, 1, "", "generate_sinusoid"], [3, 1, 1, "", "generate_tone_additive_synthesis"], [3, 1, 1, "", "generate_tone_fm_synthesis"], [3, 1, 1, "", "generate_tone_instantaneous_phase"], [3, 1, 1, "", "generate_tone_wavetable"]], "libsoni.core.pianoroll": [[4, 1, 1, "", "sonify_pianoroll_additive_synthesis"], [4, 1, 1, "", "sonify_pianoroll_clicks"], [4, 1, 1, "", "sonify_pianoroll_fm_synthesis"], [4, 1, 1, "", "sonify_pianoroll_sample"]], "libsoni.core.spectrogram": [[5, 1, 1, "", "sonify_spectrogram"], [5, 1, 1, "", "sonify_spectrogram_multi"]], "libsoni.core.tse": [[6, 1, 1, "", "sonify_tse_clicks"], [6, 1, 1, "", "sonify_tse_multiple_clicks"], [6, 1, 1, "", "sonify_tse_multiple_samples"], [6, 1, 1, "", "sonify_tse_sample"]], "libsoni.util": [[10, 0, 0, "-", "utils"]], "libsoni.util.utils": [[10, 1, 1, "", "fade_signal"], [10, 1, 1, "", "mix_sonification_and_original"], [10, 1, 1, "", "normalize_signal"], [10, 1, 1, "", "pitch_to_frequency"], [10, 1, 1, "", "smooth_weights"], [10, 1, 1, "", "visualize_pianoroll"], [10, 1, 1, "", "warp_sample"]]}, "objtypes": {"0": "py:module", "1": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"]}, "titleterms": {"chroma": 0, "libsoni": [0, 1, 2, 3, 4, 5, 6, 8, 10], "core": [0, 1, 2, 3, 4, 5, 6], "f0": 1, "featur": [2, 8], "method": 3, "pianorol": 4, "spectrum": [], "spectrogram": 5, "tse": 6, "index": [7, 9], "A": 8, "mir": [], "sonif": [], "toolbox": 8, "modul": 9, "util": 10, "piano": 4, "roll": 4, "python": 8, "sonifi": 8, "music": 8, "annot": 8, "represent": 8}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx.ext.intersphinx": 1, "sphinx": 58}, "alltitles": {"Index": [[7, "index"]], "Module Index": [[9, "module-index"]], "Core Features (libsoni.core)": [[2, "core-features-libsoni-core"]], "Chroma (libsoni.core.chroma)": [[0, "module-libsoni.core.chroma"]], "F0 (libsoni.core.f0)": [[1, "module-libsoni.core.f0"]], "Methods (libsoni.core.methods)": [[3, "module-libsoni.core.methods"]], "Piano-Roll (libsoni.core.pianoroll)": [[4, "module-libsoni.core.pianoroll"]], "Spectrogram (libsoni.core.spectrogram)": [[5, "module-libsoni.core.spectrogram"]], "TSE (libsoni.core.tse)": [[6, "module-libsoni.core.tse"]], "libsoni: A Python Toolbox for Sonifying Music Annotations and Feature Representations": [[8, "libsoni-a-python-toolbox-for-sonifying-music-annotations-and-feature-representations"]], "Utils (libsoni.util.utils)": [[10, "module-libsoni.util.utils"]]}, "indexentries": {"libsoni.core.chroma": [[0, "module-libsoni.core.chroma"]], "module": [[0, "module-libsoni.core.chroma"], [1, "module-libsoni.core.f0"], [3, "module-libsoni.core.methods"], [4, "module-libsoni.core.pianoroll"], [5, "module-libsoni.core.spectrogram"], [6, "module-libsoni.core.tse"], [10, "module-libsoni.util.utils"]], "sonify_chroma_vector() (in module libsoni.core.chroma)": [[0, "libsoni.core.chroma.sonify_chroma_vector"]], "sonify_chromagram() (in module libsoni.core.chroma)": [[0, "libsoni.core.chroma.sonify_chromagram"]], "libsoni.core.f0": [[1, "module-libsoni.core.f0"]], "sonify_f0() (in module libsoni.core.f0)": [[1, "libsoni.core.f0.sonify_f0"]], "generate_click() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_click"]], "generate_shepard_tone() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_shepard_tone"]], "generate_sinusoid() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_sinusoid"]], "generate_tone_additive_synthesis() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_tone_additive_synthesis"]], "generate_tone_fm_synthesis() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_tone_fm_synthesis"]], "generate_tone_instantaneous_phase() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_tone_instantaneous_phase"]], "generate_tone_wavetable() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_tone_wavetable"]], "libsoni.core.methods": [[3, "module-libsoni.core.methods"]], "libsoni.core.pianoroll": [[4, "module-libsoni.core.pianoroll"]], "sonify_pianoroll_additive_synthesis() (in module libsoni.core.pianoroll)": [[4, "libsoni.core.pianoroll.sonify_pianoroll_additive_synthesis"]], "sonify_pianoroll_clicks() (in module libsoni.core.pianoroll)": [[4, "libsoni.core.pianoroll.sonify_pianoroll_clicks"]], "sonify_pianoroll_fm_synthesis() (in module libsoni.core.pianoroll)": [[4, "libsoni.core.pianoroll.sonify_pianoroll_fm_synthesis"]], "sonify_pianoroll_sample() (in module libsoni.core.pianoroll)": [[4, "libsoni.core.pianoroll.sonify_pianoroll_sample"]], "libsoni.core.spectrogram": [[5, "module-libsoni.core.spectrogram"]], "sonify_spectrogram() (in module libsoni.core.spectrogram)": [[5, "libsoni.core.spectrogram.sonify_spectrogram"]], "sonify_spectrogram_multi() (in module libsoni.core.spectrogram)": [[5, "libsoni.core.spectrogram.sonify_spectrogram_multi"]], "libsoni.core.tse": [[6, "module-libsoni.core.tse"]], "sonify_tse_clicks() (in module libsoni.core.tse)": [[6, "libsoni.core.tse.sonify_tse_clicks"]], "sonify_tse_multiple_clicks() (in module libsoni.core.tse)": [[6, "libsoni.core.tse.sonify_tse_multiple_clicks"]], "sonify_tse_multiple_samples() (in module libsoni.core.tse)": [[6, "libsoni.core.tse.sonify_tse_multiple_samples"]], "sonify_tse_sample() (in module libsoni.core.tse)": [[6, "libsoni.core.tse.sonify_tse_sample"]], "fade_signal() (in module libsoni.util.utils)": [[10, "libsoni.util.utils.fade_signal"]], "libsoni.util.utils": [[10, "module-libsoni.util.utils"]], "mix_sonification_and_original() (in module libsoni.util.utils)": [[10, "libsoni.util.utils.mix_sonification_and_original"]], "normalize_signal() (in module libsoni.util.utils)": [[10, "libsoni.util.utils.normalize_signal"]], "pitch_to_frequency() (in module libsoni.util.utils)": [[10, "libsoni.util.utils.pitch_to_frequency"]], "smooth_weights() (in module libsoni.util.utils)": [[10, "libsoni.util.utils.smooth_weights"]], "visualize_pianoroll() (in module libsoni.util.utils)": [[10, "libsoni.util.utils.visualize_pianoroll"]], "warp_sample() (in module libsoni.util.utils)": [[10, "libsoni.util.utils.warp_sample"]]}})
\ No newline at end of file
+Search.setIndex({"docnames": ["core/chroma", "core/f0", "core/index", "core/methods", "core/pianoroll", "core/spectrogram", "core/tse", "genindex", "index", "py-modindex", "utils"], "filenames": ["core/chroma.rst", "core/f0.rst", "core/index.rst", "core/methods.rst", "core/pianoroll.rst", "core/spectrogram.rst", "core/tse.rst", "genindex.rst", "index.rst", "py-modindex.rst", "utils.rst"], "titles": ["Chroma (libsoni.core.chroma)", "F0 (libsoni.core.f0)", "Core Features (libsoni.core)", "Methods (libsoni.core.methods)", "Piano-Roll (libsoni.core.pianoroll)", "Spectrogram (libsoni.core.spectrogram)", "TSE (libsoni.core.tse)", "Index", "libsoni: A Python Toolbox for Sonifying Music Annotations and Feature Representations", "Module Index", "Utils (libsoni.util.utils)"], "terms": {"sonify_chroma_vector": 0, "chroma_vector": 0, "ndarrai": [0, 1, 3, 4, 5, 6, 10], "pitch_rang": [0, 3], "tupl": [0, 3, 6, 10], "int": [0, 1, 3, 4, 5, 6, 10], "20": [0, 3], "108": [0, 3], "filter": [0, 3], "bool": [0, 1, 3, 4, 5, 6, 10], "fals": [0, 3, 10], "f_center": [0, 3], "float": [0, 1, 3, 4, 5, 6, 10], "440": [0, 3, 4, 10], "0": [0, 1, 3, 4, 5, 6, 10], "octave_cutoff": [0, 3], "1": [0, 1, 3, 4, 5, 6, 10], "tuning_frequ": [0, 3, 4, 10], "fading_dur": [0, 1, 3, 5, 6, 10], "05": [0, 1, 3, 4, 5, 6], "sonification_dur": [0, 1, 4, 5, 6], "none": [0, 1, 3, 4, 5, 6, 10], "normal": [0, 1, 4, 5, 6, 10], "true": [0, 1, 4, 5, 6, 10], "f": [0, 1, 3, 4, 5, 6, 10], "22050": [0, 1, 3, 4, 5, 6, 10], "sourc": [0, 1, 3, 4, 5, 6, 8, 10], "sonifi": [0, 1, 4, 5, 6], "vector": 0, "us": [0, 1, 3, 4, 5, 6, 10], "sound": [0, 1, 3, 4, 6, 8], "synthesi": [0, 3, 4, 8], "base": [0, 1, 4, 10], "shepard": [0, 3], "tone": [0, 3, 10], "The": [0, 1, 3, 4], "can": [0, 1, 3, 4], "chang": [0, 3], "either": [0, 3], "option": [0, 3], "specifi": [0, 3], "pitch": [0, 3, 4, 6, 10], "rang": [0, 3], "both": [0, 3, 10], "also": [0, 3, 8], "combin": [0, 3], "shape": [0, 1, 3, 4], "spectrum": [0, 3], "like": [0, 3], "bell": [0, 3], "curv": [0, 3], "center": [0, 3], "around": [0, 3], "frequenc": [0, 1, 3, 4, 5, 10], "while": [0, 1, 3, 4], "octav": [0, 3], "cutoff": [0, 3], "determin": [0, 1, 3, 4, 5, 6], "which": [0, 3], "amplitud": [0, 1, 3, 4, 6], "correspond": [0, 3, 4, 6, 10], "sinusoid": [0, 3, 5], "i": [0, 1, 3, 4, 5, 6, 8, 10], "5": [0, 1, 3, 4, 10], "paramet": [0, 1, 3, 4, 5, 6, 10], "np": [0, 1, 3, 4, 5, 6, 10], "default": [0, 1, 3, 4, 5, 6, 10], "encount": [0, 3], "enabl": [0, 3, 8], "hertz": [0, 3, 4, 5, 10], "width": [0, 3], "tune": [0, 3, 4, 10], "durat": [0, 1, 3, 4, 5, 6, 10], "sonif": [0, 1, 3, 4, 5, 6, 8, 10], "sampl": [0, 1, 3, 4, 5, 6, 10], "fade": [0, 1, 3, 4, 5, 6, 10], "out": [0, 1, 3, 4, 5, 6, 10], "begin": [0, 1, 4, 5, 6], "end": [0, 1, 4, 5, 6, 10], "second": [0, 1, 3, 4, 5, 6, 10], "output": [0, 1, 4, 5, 6, 10], "signal": [0, 1, 3, 4, 5, 6, 10], "rate": [0, 1, 3, 4, 5, 6, 10], "per": [0, 1, 3, 4, 5, 6, 10], "return": [0, 1, 3, 4, 5, 6, 10], "chroma_sonif": 0, "sonify_chromagram": 0, "chromagram": 0, "h": 0, "hop": 0, "size": 0, "stft": 0, "calcul": [0, 10], "For": [0, 4, 10], "magnitud": 0, "reach": 0, "half": 0, "center_frequ": 0, "twice": [0, 1, 3, 4], "sonify_f0": 1, "time_f0": 1, "gain": [1, 3, 10], "partial": [1, 3, 4], "arrai": [1, 3, 4, 5, 6], "partials_amplitud": [1, 3, 4], "partials_phase_offset": [1, 3, 4], "trajectori": 1, "given": [1, 3, 4, 6, 10], "2d": 1, "numpi": [1, 4, 6], "must": 1, "contain": [1, 3, 4, 5, 10], "time": [1, 5, 6, 10], "posit": [1, 6], "associ": 1, "instantan": [1, 3], "phase": [1, 3, 4], "inform": [1, 4, 10], "summat": 1, "valu": [1, 10], "f0valu": [], "desir": [1, 3, 4, 10], "fundament": [1, 3, 4], "an": [1, 3, 4, 8, 10], "lead": [1, 3, 4], "onli": [1, 3, 4, 8], "2": [1, 3, 4], "caus": [1, 3, 4], "first": [1, 3, 4], "have": [1, 3, 4], "ha": [1, 3, 4], "If": 1, "all": [1, 3, 4], "ar": [1, 3, 4], "set": [1, 3, 4, 10], "offset": [1, 3, 4, 6], "when": [1, 3, 4], "defin": [1, 3, 4], "f0_sonif": 1, "generate_click": 3, "69": [3, 4, 6, 10], "click_fading_dur": [3, 6], "gener": [3, 4, 8, 10], "click": [3, 4, 6, 10], "color": [3, 10], "generate_shepard_ton": 3, "pitch_class": 3, "class": 3, "01": [3, 4, 10], "shepard_ton": 3, "generate_sinusoid": 3, "generate_tone_additive_synthesi": 3, "addit": [3, 4], "custom": [3, 4, 6], "generated_ton": 3, "generate_tone_fm_synthesi": 3, "modulation_rate_rel": 3, "modulation_amplitud": 3, "modul": [3, 4, 10], "synthes": 3, "multipl": [3, 4, 6], "fraction": [3, 4], "amount": [3, 4, 10], "generate_tone_instantaneous_phas": 3, "frequency_vector": 3, "gain_vector": 3, "wise": [3, 4], "generate_tone_wavet": 3, "wavet": 3, "depend": 3, "resampl": 3, "sonify_pianoroll_additive_synthesi": 4, "pianoroll_df": [4, 10], "datafram": [4, 10], "signal_fading_dur": 4, "note_fading_dur": 4, "represent": [4, 10], "assum": 4, "row": 4, "event": [4, 6, 8, 10], "describ": 4, "start": 4, "where": 4, "pd": [4, 10], "final": 4, "each": [4, 10], "note": 4, "pianoroll_sonif": 4, "sonify_pianoroll_click": 4, "colour": 4, "waveform": [4, 6, 10], "form": [4, 6], "1d": [4, 6], "sonify_pianoroll_fm_synthesi": 4, "mod_rate_rel": 4, "mod_amp": 4, "sonify_pianoroll_sampl": 4, "reference_pitch": [4, 10], "warp": [4, 6, 10], "version": [4, 6, 10], "origin": [4, 10], "sonify_spectrogram": 5, "frequency_coeffici": 5, "time_coeffici": 5, "coeffici": [5, 6], "spectrogram_sonif": 5, "sonify_tse_click": 6, "time_posit": 6, "click_pitch": 6, "25": 6, "click_amplitud": 6, "offset_rel": 6, "rel": 6, "indic": 6, "max": [6, 10], "tse_sonif": 6, "sonify_tse_multiple_click": 6, "times_pitch": 6, "list": 6, "thi": [6, 10], "function": [6, 8, 10], "creat": 6, "differ": 6, "compris": 6, "audio": [4, 6, 10], "sonify_tse_multiple_sampl": 6, "times_sampl": 6, "sonify_tse_sampl": 6, "python": [], "packag": 10, "variou": [], "found": [], "music": [], "retriev": [], "applic": 8, "mainli": [], "consist": [], "dedic": [], "specif": 8, "input": 10, "e": 6, "g": 6, "chroma": [], "itself": [], "envelope_sign": [], "attack_tim": [], "decay_tim": [], "sustain_level": [], "release_tim": [], "44100": [], "envelop": [], "length": [], "too": [], "short": [], "regard": [], "adsr": [], "zero": 10, "enveloped_sign": [], "fade_sign": 10, "normalized_sign": 10, "mix_sonification_and_origin": 10, "original_audio": 10, "gain_lin_sonif": 10, "gain_lin_original_audio": 10, "pan": 10, "take": 10, "mix": 10, "stereo": 10, "linear": 10, "control": 10, "mean": 10, "left": 10, "right": 10, "channel": 10, "same": 10, "mixed_audio": 10, "normalize_sign": 10, "pitch_to_frequ": 10, "refer": 10, "visualize_pianorol": 10, "df": [], "xlabel": 10, "str": 10, "ylabel": 10, "titl": 10, "fmp_1": 10, "velocity_alpha": 10, "figsiz": 10, "12": 10, "4": 10, "ax": 10, "dpi": 10, "72": 10, "plot": [], "pianorol": [], "visual": 10, "inspir": [], "from": 10, "fmp": [], "notebook": [], "c1": [], "c1s2_csv": [], "ipynb": [], "score": [], "label": 10, "x": 10, "axi": 10, "y": 10, "sever": [], "string": [], "fmp_colormap": [], "matplotlib": 10, "colormap": 10, "3": [], "dict": [], "assign": [], "veloc": 10, "alpha": [], "rectangl": [], "height": [], "inch": [], "instanc": 10, "dot": [], "fig": 10, "figur": 10, "wa": [], "warp_sampl": 10, "target_pitch": 10, "target_duration_sec": 10, "provid": 10, "get": 10, "shift": 10, "librosa": 10, "effect": 10, "pitch_shift": 10, "tempor": 10, "align": 10, "shorter": 10, "than": 10, "crop": 10, "els": 10, "longer": 10, "pad": 10, "target": 10, "fading_sec": [], "avoid": 10, "warped_sampl": 10, "sonify_chunk": [], "arg": [], "sonify_spectrogram_multi": 5, "num_process": 5, "multiprocess": 5, "effici": [5, 8], "number": [5, 10], "process": [5, 8], "open": 8, "tailor": 8, "annot": [], "By": 8, "emploi": 8, "explicit": 8, "easi": 8, "understand": 8, "techniqu": 8, "offer": 8, "trigger": 8, "spectral": 8, "harmon": 8, "tonal": 8, "melod": 8, "rhythmic": 8, "aspect": 8, "unlik": 8, "exist": 8, "softwar": 8, "librari": 8, "focus": 8, "creativ": 8, "design": 8, "meet": 8, "need": 8, "research": 8, "educ": 8, "It": 8, "aim": 8, "simplifi": 8, "explor": 8, "promot": 8, "more": 8, "intuit": 8, "approach": 8, "data": 8, "analysi": 8, "user": 8, "interact": 8, "acoust": 8, "meaning": 8, "wai": 8, "As": 8, "result": 8, "improv": 8, "analyt": 8, "capabl": 8, "scientist": 8, "up": 8, "new": 8, "avenu": 8, "innov": 8, "discoveri": 8, "furthermor": [], "well": [], "document": [], "stand": [], "alon": [], "cover": [], "essenti": [], "build": [], "block": [], "crucial": [], "appli": [], "easili": [], "extend": [], "method": [], "addition": [], "includ": [], "jupyt": [], "illustr": [], "code": [], "exampl": [], "demonstr": [], "deepen": [], "within": [], "scenario": [], "mir": 8, "fm": 4, "metronom": 6, "smooth_weight": 10, "weight": 10, "fading_sampl": 10, "smooth": 10, "weights_smooth": 10, "panda": 10, "core": 10, "frame": 10, "type": 10, "home": 10, "yiitoz": 10, "miniconda3": 10, "env": 10, "lib": 10, "python3": 10, "8": 10, "site": 10, "__init__": 10, "py": 10, "piano": 10, "roll": 10, "format": 10, "text": 10, "see": 10, "http": 10, "github": 10, "com": 10, "meinardmuel": 10, "libfmp": 10, "rectangular": 10, "region": 10, "object": 10, "resolut": 10}, "objects": {"libsoni.core": [[0, 0, 0, "-", "chroma"], [1, 0, 0, "-", "f0"], [3, 0, 0, "-", "methods"], [4, 0, 0, "-", "pianoroll"], [5, 0, 0, "-", "spectrogram"], [6, 0, 0, "-", "tse"]], "libsoni.core.chroma": [[0, 1, 1, "", "sonify_chroma_vector"], [0, 1, 1, "", "sonify_chromagram"]], "libsoni.core.f0": [[1, 1, 1, "", "sonify_f0"]], "libsoni.core.methods": [[3, 1, 1, "", "generate_click"], [3, 1, 1, "", "generate_shepard_tone"], [3, 1, 1, "", "generate_sinusoid"], [3, 1, 1, "", "generate_tone_additive_synthesis"], [3, 1, 1, "", "generate_tone_fm_synthesis"], [3, 1, 1, "", "generate_tone_instantaneous_phase"], [3, 1, 1, "", "generate_tone_wavetable"]], "libsoni.core.pianoroll": [[4, 1, 1, "", "sonify_pianoroll_additive_synthesis"], [4, 1, 1, "", "sonify_pianoroll_clicks"], [4, 1, 1, "", "sonify_pianoroll_fm_synthesis"], [4, 1, 1, "", "sonify_pianoroll_sample"]], "libsoni.core.spectrogram": [[5, 1, 1, "", "sonify_spectrogram"], [5, 1, 1, "", "sonify_spectrogram_multi"]], "libsoni.core.tse": [[6, 1, 1, "", "sonify_tse_clicks"], [6, 1, 1, "", "sonify_tse_multiple_clicks"], [6, 1, 1, "", "sonify_tse_multiple_samples"], [6, 1, 1, "", "sonify_tse_sample"]], "libsoni.util": [[10, 0, 0, "-", "utils"]], "libsoni.util.utils": [[10, 1, 1, "", "fade_signal"], [10, 1, 1, "", "mix_sonification_and_original"], [10, 1, 1, "", "normalize_signal"], [10, 1, 1, "", "pitch_to_frequency"], [10, 1, 1, "", "smooth_weights"], [10, 1, 1, "", "visualize_pianoroll"], [10, 1, 1, "", "warp_sample"]]}, "objtypes": {"0": "py:module", "1": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"]}, "titleterms": {"chroma": 0, "libsoni": [0, 1, 2, 3, 4, 5, 6, 8, 10], "core": [0, 1, 2, 3, 4, 5, 6], "f0": 1, "featur": [2, 8], "method": 3, "pianorol": 4, "spectrum": [], "spectrogram": 5, "tse": 6, "index": [7, 9], "A": 8, "mir": [], "sonif": [], "toolbox": 8, "modul": 9, "util": 10, "piano": 4, "roll": 4, "python": 8, "sonifi": 8, "music": 8, "annot": 8, "represent": 8}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx.ext.intersphinx": 1, "sphinx": 58}, "alltitles": {"Index": [[7, "index"]], "Module Index": [[9, "module-index"]], "Core Features (libsoni.core)": [[2, "core-features-libsoni-core"]], "libsoni: A Python Toolbox for Sonifying Music Annotations and Feature Representations": [[8, "libsoni-a-python-toolbox-for-sonifying-music-annotations-and-feature-representations"]], "Utils (libsoni.util.utils)": [[10, "module-libsoni.util.utils"]], "Chroma (libsoni.core.chroma)": [[0, "module-libsoni.core.chroma"]], "F0 (libsoni.core.f0)": [[1, "module-libsoni.core.f0"]], "Methods (libsoni.core.methods)": [[3, "module-libsoni.core.methods"]], "Piano-Roll (libsoni.core.pianoroll)": [[4, "module-libsoni.core.pianoroll"]], "Spectrogram (libsoni.core.spectrogram)": [[5, "module-libsoni.core.spectrogram"]], "TSE (libsoni.core.tse)": [[6, "module-libsoni.core.tse"]]}, "indexentries": {"libsoni.core.chroma": [[0, "module-libsoni.core.chroma"]], "module": [[0, "module-libsoni.core.chroma"], [1, "module-libsoni.core.f0"], [3, "module-libsoni.core.methods"], [4, "module-libsoni.core.pianoroll"], [5, "module-libsoni.core.spectrogram"], [6, "module-libsoni.core.tse"]], "sonify_chroma_vector() (in module libsoni.core.chroma)": [[0, "libsoni.core.chroma.sonify_chroma_vector"]], "sonify_chromagram() (in module libsoni.core.chroma)": [[0, "libsoni.core.chroma.sonify_chromagram"]], "libsoni.core.f0": [[1, "module-libsoni.core.f0"]], "sonify_f0() (in module libsoni.core.f0)": [[1, "libsoni.core.f0.sonify_f0"]], "generate_click() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_click"]], "generate_shepard_tone() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_shepard_tone"]], "generate_sinusoid() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_sinusoid"]], "generate_tone_additive_synthesis() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_tone_additive_synthesis"]], "generate_tone_fm_synthesis() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_tone_fm_synthesis"]], "generate_tone_instantaneous_phase() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_tone_instantaneous_phase"]], "generate_tone_wavetable() (in module libsoni.core.methods)": [[3, "libsoni.core.methods.generate_tone_wavetable"]], "libsoni.core.methods": [[3, "module-libsoni.core.methods"]], "libsoni.core.pianoroll": [[4, "module-libsoni.core.pianoroll"]], "sonify_pianoroll_additive_synthesis() (in module libsoni.core.pianoroll)": [[4, "libsoni.core.pianoroll.sonify_pianoroll_additive_synthesis"]], "sonify_pianoroll_clicks() (in module libsoni.core.pianoroll)": [[4, "libsoni.core.pianoroll.sonify_pianoroll_clicks"]], "sonify_pianoroll_fm_synthesis() (in module libsoni.core.pianoroll)": [[4, "libsoni.core.pianoroll.sonify_pianoroll_fm_synthesis"]], "sonify_pianoroll_sample() (in module libsoni.core.pianoroll)": [[4, "libsoni.core.pianoroll.sonify_pianoroll_sample"]], "libsoni.core.spectrogram": [[5, "module-libsoni.core.spectrogram"]], "sonify_spectrogram() (in module libsoni.core.spectrogram)": [[5, "libsoni.core.spectrogram.sonify_spectrogram"]], "sonify_spectrogram_multi() (in module libsoni.core.spectrogram)": [[5, "libsoni.core.spectrogram.sonify_spectrogram_multi"]], "libsoni.core.tse": [[6, "module-libsoni.core.tse"]], "sonify_tse_clicks() (in module libsoni.core.tse)": [[6, "libsoni.core.tse.sonify_tse_clicks"]], "sonify_tse_multiple_clicks() (in module libsoni.core.tse)": [[6, "libsoni.core.tse.sonify_tse_multiple_clicks"]], "sonify_tse_multiple_samples() (in module libsoni.core.tse)": [[6, "libsoni.core.tse.sonify_tse_multiple_samples"]], "sonify_tse_sample() (in module libsoni.core.tse)": [[6, "libsoni.core.tse.sonify_tse_sample"]]}})
\ No newline at end of file
diff --git a/libsoni/core/methods.py b/libsoni/core/methods.py
index 85389f9..a6ac858 100644
--- a/libsoni/core/methods.py
+++ b/libsoni/core/methods.py
@@ -286,7 +286,9 @@ def generate_tone_fm_synthesis(pitch: int = 69,
assert 0 <= pitch <= 127, f'Pitch is out of range [0,127].'
pitch_frequency = pitch_to_frequency(pitch=pitch, tuning_frequency=tuning_frequency)
- generated_tone = np.sin(2 * np.pi * pitch_frequency * (np.arange(int(duration * fs))) / fs + modulation_amplitude * np.sin(2 * np.pi * pitch_frequency * modulation_rate_relative * (np.arange(int(duration * fs)))))
+ generated_tone = np.sin(2 * np.pi * pitch_frequency * (np.arange(int(duration * fs))) / fs +
+ modulation_amplitude * np.sin(2 * np.pi * pitch_frequency * modulation_rate_relative *
+ (np.arange(int(duration * fs)))))
generated_tone = gain * fade_signal(signal=generated_tone, fs=fs, fading_duration=fading_duration)
return generated_tone
diff --git a/libsoni/core/pianoroll.py b/libsoni/core/pianoroll.py
index 99a9b00..435ba02 100644
--- a/libsoni/core/pianoroll.py
+++ b/libsoni/core/pianoroll.py
@@ -12,7 +12,7 @@ def sonify_pianoroll_additive_synthesis(pianoroll_df: pd.DataFrame,
tuning_frequency: float = 440.0,
signal_fading_duration: float = 0.05,
note_fading_duration: float = 0.01,
- sonification_duration: int = None,
+ sonification_duration: float = None,
normalize: bool = True,
fs: int = 22050) -> np.ndarray:
"""Sonifies a piano-roll with additive synthesis.
@@ -45,8 +45,8 @@ def sonify_pianoroll_additive_synthesis(pianoroll_df: pd.DataFrame,
tuning_frequency: float, default = 440.0
Tuning frequency, in Hertz.
- sonification_duration: int, default = None
- Determines duration of sonification, in samples.
+ sonification_duration: float, default = None
+ Determines duration of sonification, in seconds.
signal_fading_duration: float, default = 0.05
Determines duration of fade-in and fade-out at beginning and end of the final sonification, in seconds.
@@ -94,7 +94,7 @@ def sonify_pianoroll_additive_synthesis(pianoroll_df: pd.DataFrame,
def sonify_pianoroll_clicks(pianoroll_df: pd.DataFrame,
tuning_frequency: float = 440.0,
- sonification_duration: int = None,
+ sonification_duration: float = None,
signal_fading_duration: float = 0.05,
normalize: bool = True,
fs: int = 22050) -> np.ndarray:
@@ -112,8 +112,8 @@ def sonify_pianoroll_clicks(pianoroll_df: pd.DataFrame,
tuning_frequency: float, default = 440.0
Tuning Frequency, in Hertz
- sonification_duration: int, default = None
- Determines duration of sonification, in samples.
+ sonification_duration: float, default = None
+ Determines duration of sonification, in seconds.
signal_fading_duration: float, default = 0.05
Determines duration of fade-in and fade-out at beginning and end of the final sonification, in seconds.
@@ -155,7 +155,7 @@ def sonify_pianoroll_clicks(pianoroll_df: pd.DataFrame,
def sonify_pianoroll_sample(pianoroll_df: pd.DataFrame,
sample: np.ndarray = None,
reference_pitch: int = 69,
- sonification_duration: int = None,
+ sonification_duration: float = None,
signal_fading_duration: float = 0.05,
note_fading_duration: float = 0.01,
normalize: bool = True,
@@ -176,8 +176,8 @@ def sonify_pianoroll_sample(pianoroll_df: pd.DataFrame,
reference_pitch: int, default = 69
Original pitch of the sample.
- sonification_duration: int, default = None
- Determines duration of sonification, in samples.
+ sonification_duration: float, default = None
+ Determines duration of sonification, in seconds.
signal_fading_duration: float, default = 0.05
Determines duration of fade-in and fade-out at beginning and end of the final sonification, in seconds.
@@ -226,7 +226,7 @@ def sonify_pianoroll_fm_synthesis(pianoroll_df: pd.DataFrame,
mod_rate_relative: float = 0.0,
mod_amp: float = 0.0,
tuning_frequency: float = 440.0,
- sonification_duration: int = None,
+ sonification_duration: float = None,
signal_fading_duration: float = 0.05,
note_fading_duration: float = 0.01,
normalize: bool = True,
@@ -251,8 +251,8 @@ def sonify_pianoroll_fm_synthesis(pianoroll_df: pd.DataFrame,
tuning_frequency: float, default = 440.0
Tuning frequency in Hertz.
- sonification_duration: int, default = None
- Determines duration of sonification, in samples.
+ sonification_duration: float, default = None
+ Determines duration of sonification, in seconds.
signal_fading_duration: float, default = 0.05
Determines duration of fade-in and fade-out at beginning and end of the final sonification, in seconds.
@@ -296,25 +296,25 @@ def sonify_pianoroll_fm_synthesis(pianoroll_df: pd.DataFrame,
return pianoroll_sonification
-def __init_pianoroll_sonification(pianoroll_df,
- fs,
- sonification_duration):
+def __init_pianoroll_sonification(pianoroll_df: pd.DataFrame,
+ fs: int,
+ sonification_duration: float = None):
+
pianoroll_df = format_df(pianoroll_df)
num_samples = int(pianoroll_df['end'].max() * fs)
- if sonification_duration is not None:
- # if sonification_duration equals num_samples, do nothing
- if sonification_duration == num_samples:
- pass
+ if sonification_duration is None:
+ sonification_duration = pianoroll_df['end'].max()
+ sonification_duration_samples = int(sonification_duration * fs)
- # if sonification_duration is less than num_samples, crop the arrays
- elif sonification_duration < num_samples:
- pianoroll_df = pianoroll_df[pianoroll_df['start'] < sonification_duration]
- pianoroll_df['end'] = pianoroll_df[pianoroll_df['end'] > sonification_duration] = sonification_duration
- pianoroll_df['duration'] = pianoroll_df['end'] - pianoroll_df['start']
+ # if sonification_duration is less than num_samples, crop the arrays
+ if sonification_duration_samples < num_samples:
+ pianoroll_df = pianoroll_df[pianoroll_df['start'] < sonification_duration]
+ pianoroll_df.loc[pianoroll_df['end'] > sonification_duration, 'end'] = sonification_duration
- num_samples = sonification_duration
+ pianoroll_df['duration'] = pianoroll_df['end'] - pianoroll_df['start']
+ num_samples = sonification_duration_samples
pianoroll_sonification = np.zeros(num_samples)
return pianoroll_df, pianoroll_sonification
diff --git a/setup.py b/setup.py
index ceee47a..b916142 100644
--- a/setup.py
+++ b/setup.py
@@ -12,7 +12,7 @@
author_email='yigitcan.oezer@audiolabs-erlangen.de',
url='https://github.com/groupmm/libsoni',
download_url='https://github.com/groupmm/libsoni',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests*']),
long_description=long_description,
long_description_content_type='text/markdown',
classifiers=[
diff --git a/tests/data/click_60_11025.wav b/tests/data/click_60_11025.wav
new file mode 100644
index 0000000..e9f02db
Binary files /dev/null and b/tests/data/click_60_11025.wav differ
diff --git a/tests/data/click_60_22050.wav b/tests/data/click_60_22050.wav
new file mode 100644
index 0000000..b23873f
Binary files /dev/null and b/tests/data/click_60_22050.wav differ
diff --git a/tests/data/click_60_4410.wav b/tests/data/click_60_4410.wav
new file mode 100644
index 0000000..763bc13
Binary files /dev/null and b/tests/data/click_60_4410.wav differ
diff --git a/tests/data/click_69_11025.wav b/tests/data/click_69_11025.wav
new file mode 100644
index 0000000..94c0862
Binary files /dev/null and b/tests/data/click_69_11025.wav differ
diff --git a/tests/data/click_69_22050.wav b/tests/data/click_69_22050.wav
new file mode 100644
index 0000000..7638463
Binary files /dev/null and b/tests/data/click_69_22050.wav differ
diff --git a/tests/data/click_69_4410.wav b/tests/data/click_69_4410.wav
new file mode 100644
index 0000000..5ed499f
Binary files /dev/null and b/tests/data/click_69_4410.wav differ
diff --git a/tests/data/pianoroll_add_0.wav b/tests/data/pianoroll_add_0.wav
new file mode 100644
index 0000000..02449fc
Binary files /dev/null and b/tests/data/pianoroll_add_0.wav differ
diff --git a/tests/data/pianoroll_add_1.wav b/tests/data/pianoroll_add_1.wav
new file mode 100644
index 0000000..ec9bace
Binary files /dev/null and b/tests/data/pianoroll_add_1.wav differ
diff --git a/tests/data/pianoroll_clicks.wav b/tests/data/pianoroll_clicks.wav
new file mode 100644
index 0000000..007376b
Binary files /dev/null and b/tests/data/pianoroll_clicks.wav differ
diff --git a/tests/data/pianoroll_fm.wav b/tests/data/pianoroll_fm.wav
new file mode 100644
index 0000000..a0ee091
Binary files /dev/null and b/tests/data/pianoroll_fm.wav differ
diff --git a/tests/data/pianoroll_sample.wav b/tests/data/pianoroll_sample.wav
new file mode 100644
index 0000000..fccf4d7
Binary files /dev/null and b/tests/data/pianoroll_sample.wav differ
diff --git a/tests/data/shepard_0_11025_1102.wav b/tests/data/shepard_0_11025_1102.wav
new file mode 100644
index 0000000..02576a3
Binary files /dev/null and b/tests/data/shepard_0_11025_1102.wav differ
diff --git a/tests/data/shepard_0_11025_2205.wav b/tests/data/shepard_0_11025_2205.wav
new file mode 100644
index 0000000..cfc6bf5
Binary files /dev/null and b/tests/data/shepard_0_11025_2205.wav differ
diff --git a/tests/data/shepard_0_22050_1102.wav b/tests/data/shepard_0_22050_1102.wav
new file mode 100644
index 0000000..34aa29c
Binary files /dev/null and b/tests/data/shepard_0_22050_1102.wav differ
diff --git a/tests/data/shepard_0_22050_2205.wav b/tests/data/shepard_0_22050_2205.wav
new file mode 100644
index 0000000..77c7654
Binary files /dev/null and b/tests/data/shepard_0_22050_2205.wav differ
diff --git a/tests/data/shepard_0_4410_1102.wav b/tests/data/shepard_0_4410_1102.wav
new file mode 100644
index 0000000..073ee38
Binary files /dev/null and b/tests/data/shepard_0_4410_1102.wav differ
diff --git a/tests/data/shepard_0_4410_2205.wav b/tests/data/shepard_0_4410_2205.wav
new file mode 100644
index 0000000..808e25d
Binary files /dev/null and b/tests/data/shepard_0_4410_2205.wav differ
diff --git a/tests/data/shepard_9_11025_1102.wav b/tests/data/shepard_9_11025_1102.wav
new file mode 100644
index 0000000..7ad82cb
Binary files /dev/null and b/tests/data/shepard_9_11025_1102.wav differ
diff --git a/tests/data/shepard_9_11025_2205.wav b/tests/data/shepard_9_11025_2205.wav
new file mode 100644
index 0000000..37dfbed
Binary files /dev/null and b/tests/data/shepard_9_11025_2205.wav differ
diff --git a/tests/data/shepard_9_22050_1102.wav b/tests/data/shepard_9_22050_1102.wav
new file mode 100644
index 0000000..8f6725c
Binary files /dev/null and b/tests/data/shepard_9_22050_1102.wav differ
diff --git a/tests/data/shepard_9_22050_2205.wav b/tests/data/shepard_9_22050_2205.wav
new file mode 100644
index 0000000..c2d5329
Binary files /dev/null and b/tests/data/shepard_9_22050_2205.wav differ
diff --git a/tests/data/shepard_9_4410_1102.wav b/tests/data/shepard_9_4410_1102.wav
new file mode 100644
index 0000000..065d298
Binary files /dev/null and b/tests/data/shepard_9_4410_1102.wav differ
diff --git a/tests/data/shepard_9_4410_2205.wav b/tests/data/shepard_9_4410_2205.wav
new file mode 100644
index 0000000..b4757f7
Binary files /dev/null and b/tests/data/shepard_9_4410_2205.wav differ
diff --git a/tests/data/sin_60_11025_1102.wav b/tests/data/sin_60_11025_1102.wav
new file mode 100644
index 0000000..164316a
Binary files /dev/null and b/tests/data/sin_60_11025_1102.wav differ
diff --git a/tests/data/sin_60_11025_2205.wav b/tests/data/sin_60_11025_2205.wav
new file mode 100644
index 0000000..cdca5a9
Binary files /dev/null and b/tests/data/sin_60_11025_2205.wav differ
diff --git a/tests/data/sin_60_22050_1102.wav b/tests/data/sin_60_22050_1102.wav
new file mode 100644
index 0000000..db9b9b5
Binary files /dev/null and b/tests/data/sin_60_22050_1102.wav differ
diff --git a/tests/data/sin_60_22050_2205.wav b/tests/data/sin_60_22050_2205.wav
new file mode 100644
index 0000000..d3b95e3
Binary files /dev/null and b/tests/data/sin_60_22050_2205.wav differ
diff --git a/tests/data/sin_60_4410_1102.wav b/tests/data/sin_60_4410_1102.wav
new file mode 100644
index 0000000..725cb3f
Binary files /dev/null and b/tests/data/sin_60_4410_1102.wav differ
diff --git a/tests/data/sin_60_4410_2205.wav b/tests/data/sin_60_4410_2205.wav
new file mode 100644
index 0000000..44b002b
Binary files /dev/null and b/tests/data/sin_60_4410_2205.wav differ
diff --git a/tests/data/sin_69_11025_1102.wav b/tests/data/sin_69_11025_1102.wav
new file mode 100644
index 0000000..96b93ee
Binary files /dev/null and b/tests/data/sin_69_11025_1102.wav differ
diff --git a/tests/data/sin_69_11025_2205.wav b/tests/data/sin_69_11025_2205.wav
new file mode 100644
index 0000000..1d69c8b
Binary files /dev/null and b/tests/data/sin_69_11025_2205.wav differ
diff --git a/tests/data/sin_69_22050_1102.wav b/tests/data/sin_69_22050_1102.wav
new file mode 100644
index 0000000..72c113a
Binary files /dev/null and b/tests/data/sin_69_22050_1102.wav differ
diff --git a/tests/data/sin_69_22050_2205.wav b/tests/data/sin_69_22050_2205.wav
new file mode 100644
index 0000000..3330e87
Binary files /dev/null and b/tests/data/sin_69_22050_2205.wav differ
diff --git a/tests/data/sin_69_4410_1102.wav b/tests/data/sin_69_4410_1102.wav
new file mode 100644
index 0000000..42a9da3
Binary files /dev/null and b/tests/data/sin_69_4410_1102.wav differ
diff --git a/tests/data/sin_69_4410_2205.wav b/tests/data/sin_69_4410_2205.wav
new file mode 100644
index 0000000..2e9d0ca
Binary files /dev/null and b/tests/data/sin_69_4410_2205.wav differ
diff --git a/tests/test_chroma.py b/tests/test_chroma.py
deleted file mode 100644
index e69de29..0000000
diff --git a/tests/test_methods.py b/tests/test_methods.py
index e69de29..52e95f1 100644
--- a/tests/test_methods.py
+++ b/tests/test_methods.py
@@ -0,0 +1,53 @@
+import numpy as np
+import soundfile as sf
+
+from libsoni.core.methods import generate_click, generate_shepard_tone, generate_sinusoid
+from libsoni.util.utils import pitch_to_frequency
+
+DURATIONS = [0.2, 0.5, 1.0]
+FADE = [0.05, 0.1]
+PITCHES = [60, 69]
+Fs = 22050
+
+
+def test_click():
+ for duration in DURATIONS:
+ for pitch in PITCHES:
+ y = generate_click(pitch=pitch,
+ click_fading_duration=duration)
+
+ ref, _ = sf.read(f'tests/data/click_{pitch}_{(int(Fs * duration))}.wav')
+
+ assert len(y) == len(ref), 'Length of the generated sonification does not match with the reference!'
+ assert np.allclose(y, ref, atol=1e-4, rtol=1e-5)
+
+
+def test_sinusoid():
+ for duration in DURATIONS:
+ for pitch in PITCHES:
+ for fading_duration in FADE:
+ freq = pitch_to_frequency(pitch=pitch)
+ y = generate_sinusoid(frequency=freq,
+ duration=duration,
+ fading_duration=fading_duration)
+ dur_samples = int(Fs * duration)
+ fade_samples = int(Fs * fading_duration)
+ ref, _ = sf.read(f'tests/data/sin_{pitch}_{dur_samples}_{fade_samples}.wav')
+ assert len(y) == len(ref), 'Length of the generated sonification does not match with the reference!'
+ assert np.allclose(y, ref, atol=1e-4, rtol=1e-5)
+
+
+def test_shepard_tone():
+ for duration in DURATIONS:
+ for pitch in PITCHES:
+ for fading_duration in FADE:
+ pitch_class = pitch % 12
+ y = generate_shepard_tone(pitch_class=pitch_class,
+ duration=duration,
+ fading_duration=fading_duration)
+ dur_samples = int(Fs * duration)
+ fade_samples = int(Fs * fading_duration)
+ ref, _ = sf.read(f'tests/data/shepard_{pitch_class}_{dur_samples}_{fade_samples}.wav')
+ assert len(y) == len(ref), 'Length of the generated sonification does not match with the reference!'
+ assert np.allclose(y, ref, atol=1e-4, rtol=1e-5)
+
diff --git a/tests/test_pianoroll.py b/tests/test_pianoroll.py
index a1e6871..3380e56 100644
--- a/tests/test_pianoroll.py
+++ b/tests/test_pianoroll.py
@@ -1,48 +1,51 @@
-# import numpy as np
-# import pandas as pd
-# import os
-# from scipy.io import wavfile
-#
-# from libsoni.core import pianoroll
-#
-# FS = 22050
-# EXPORT_AUDIO = True
-# DURATIONS = [None, 4.2, 3.0, 5.0]
-#
-#
-# def test_pianoroll_clicks():
-# pianoroll_df = pd.read_csv(os.path.join('data_csv', 'Bach_BWV1056-01-mm000-116_Oezer-V1_P_aligned.csv'),
-# delimiter=';')
-#
-# y = pianoroll.sonify_pianoroll_clicks(pianoroll_df,
-# tuning_frequency=440.0,
-# duration=None,
-# fs=FS)
-#
-# if EXPORT_AUDIO:
-# wavfile.write(os.path.join('tests', 'data_audio',
-# 'Bach_BWV1056-01-mm000-116_Oezer-V1_P_aligned_pianoroll_sonified_clicks.wav'), FS, y)
-#
-#
-# #test_pianoroll_clicks()
-#
-# def test_pianoroll_additive_synthesis():
-# pianoroll_df = pd.read_csv(os.path.join('data_csv', 'Bach_BWV1056-01-mm000-116_Oezer-V1_P_aligned.csv'),
-# delimiter=';')
-#
-# y = pianoroll.sonify_pianoroll_additive_synthesis(pianoroll_df,
-# partials=[1, 2, 3, 4],
-# partials_amplitudes=[1, 0.7, 0.3, 0.1],
-# partials_phase_offsets=[0, 0, 0, 0],
-# tuning_frequency=440.0,
-# duration=None,
-# fs=FS)
-#
-# if EXPORT_AUDIO:
-# wavfile.write(os.path.join('tests',
-# 'data_audio',
-# 'Bach_BWV1056-01-mm000-116_Oezer-V1_P_aligned_pianoroll_sonified_additive_synthesis.wav'),
-# FS, y)
-#
-#
-# test_pianoroll_additive_synthesis()
+import numpy as np
+import pandas as pd
+import soundfile as sf
+
+from libsoni.core.pianoroll import sonify_pianoroll_clicks,\
+ sonify_pianoroll_additive_synthesis, sonify_pianoroll_fm_synthesis, sonify_pianoroll_sample
+
+Fs = 22050
+SAMPLE, _ = sf.read('data_audio/samples/01Pia1F060f_np___0_short.wav', Fs)
+DF_PIANOROLL = pd.read_csv('data_csv/demo_pianoroll/FMP_B_Sonify_Pitch_Schubert_D911-11_SC06.csv',
+ sep=';')
+PARTIALS = [np.array([1]), np.array([1, 2, 3])]
+PARTIALS_AMPLITUDES = [np.array([1]), np.array([1, 0.5, 0.25])]
+
+
+def test_pianoroll_additive():
+ for partial_idx, partials in enumerate(PARTIALS):
+ y = sonify_pianoroll_additive_synthesis(pianoroll_df=DF_PIANOROLL,
+ partials=partials,
+ partials_amplitudes=PARTIALS_AMPLITUDES[partial_idx],
+ sonification_duration=5.0)
+
+ ref, _ = sf.read(f'tests/data/pianoroll_add_{partial_idx}.wav')
+ assert np.allclose(y, ref, atol=1e-4, rtol=1e-5)
+
+
+def test_pianoroll_sample():
+ y = sonify_pianoroll_sample(pianoroll_df=DF_PIANOROLL,
+ sample=SAMPLE,
+ reference_pitch=60,
+ sonification_duration=3.0)
+ ref, _ = sf.read(f'tests/data/pianoroll_sample.wav')
+ assert np.allclose(y, ref, atol=1e-4, rtol=1e-5)
+
+
+def test_pianoroll_fm():
+ y = sonify_pianoroll_fm_synthesis(pianoroll_df=DF_PIANOROLL,
+ sonification_duration=3.0,
+ mod_rate_relative=0.5,
+ mod_amp=0.1)
+
+ ref, _ = sf.read(f'tests/data/pianoroll_fm.wav')
+ assert np.allclose(y, ref, atol=1e-4, rtol=1e-5)
+
+
+def test_pianoroll_clicks():
+ y = sonify_pianoroll_clicks(pianoroll_df=DF_PIANOROLL,
+ sonification_duration=3.0)
+
+ ref, _ = sf.read(f'tests/data/pianoroll_clicks.wav')
+ assert np.allclose(y, ref, atol=1e-4, rtol=1e-5)
diff --git a/tests/test_spectrogram.py b/tests/test_spectrogram.py
deleted file mode 100644
index e69de29..0000000