diff --git a/.github/workflows/test_conda.yml b/.github/workflows/test_conda.yml new file mode 100644 index 0000000..83663bf --- /dev/null +++ b/.github/workflows/test_conda.yml @@ -0,0 +1,39 @@ +name: Python Package using Conda + +on: + push: + branches: + - unit_tests + pull_request: + branches: + - unit_tests +jobs: + build-linux: + runs-on: ubuntu-latest + strategy: + max-parallel: 5 + + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.11 + uses: actions/setup-python@v2 + with: + python-version: 3.11 + - name: Add conda to system path + run: | + # $CONDA is an environment variable pointing to the root of the miniconda directory + echo $CONDA/bin >> $GITHUB_PATH + - name: Install dependencies + run: | + conda install -c conda-forge libsndfile python=3.11 + python -m pip install -e .['tests'] + - name: Lint with flake8 + run: | + conda install flake8 + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pytest \ No newline at end of file diff --git a/.github/workflows/test_pip.yml b/.github/workflows/test_pip.yml new file mode 100644 index 0000000..76eb21b --- /dev/null +++ b/.github/workflows/test_pip.yml @@ -0,0 +1,55 @@ +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Python package + +on: + push: + branches: + - main + - unit_tests + pull_request: + branches: + - main + - unit_tests + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: + - 3.8 + - 3.9 + - '3.10' + - 3.11 + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install libnsdfile + run: | + sudo apt update + sudo apt install libsndfile1-dev libsndfile1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install flake8 + python -m pip install -e .['tests'] + python --version + pip --version + python -m pip list + - name: Lint with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pytest \ No newline at end of file diff --git a/README.md b/README.md index aa39045..77085a4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ +[![Python package using Conda](https://github.com/groupmm/libsoni/actions/workflows/test_conda.yml/badge.svg)](https://github.com/groupmm/libsoni/actions/workflows/test_conda.yml) +[![Python package using pip](https://github.com/groupmm/libsoni/actions/workflows/test_pip.yml/badge.svg)](https://github.com/groupmm/libsoni/actions/workflows/test_pip.yml) + + - + diff --git a/docs/build/doctrees/core/pianoroll.doctree b/docs/build/doctrees/core/pianoroll.doctree index 73dc546..6dfde4a 100644 Binary files a/docs/build/doctrees/core/pianoroll.doctree and b/docs/build/doctrees/core/pianoroll.doctree differ diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle index e53803a..b76ccdc 100644 Binary files a/docs/build/doctrees/environment.pickle and b/docs/build/doctrees/environment.pickle differ diff --git a/docs/build/html/_modules/libsoni/core/methods.html b/docs/build/html/_modules/libsoni/core/methods.html index fa277da..fae3a1e 100644 --- a/docs/build/html/_modules/libsoni/core/methods.html +++ b/docs/build/html/_modules/libsoni/core/methods.html @@ -366,7 +366,9 @@

Source code for libsoni.core.methods

     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/docs/build/html/_modules/libsoni/core/pianoroll.html b/docs/build/html/_modules/libsoni/core/pianoroll.html index dcf3525..83a14f8 100644 --- a/docs/build/html/_modules/libsoni/core/pianoroll.html +++ b/docs/build/html/_modules/libsoni/core/pianoroll.html @@ -92,7 +92,7 @@

Source code for libsoni.core.pianoroll

                                         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
    libsoni logolibsoni logo

    libsoni: A Python Toolbox for Sonifying Music Annotations and Feature Representations