Hello community,
here is the log from the commit of package python-librosa for openSUSE:Factory checked in at 2019-04-01 12:34:56
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-librosa (Old)
and /work/SRC/openSUSE:Factory/.python-librosa.new.25356 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-librosa"
Mon Apr 1 12:34:56 2019 rev:2 rq:684459 version:0.6.3
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-librosa/python-librosa.changes 2018-11-06 14:33:37.169110194 +0100
+++ /work/SRC/openSUSE:Factory/.python-librosa.new.25356/python-librosa.changes 2019-04-01 12:34:57.729822637 +0200
@@ -1,0 +2,8 @@
+Wed Feb 20 19:30:09 CET 2019 - Matej Cepl
+
+- Upgrade to 0.6.3:
+ - This release contains a few minor bugfixes and many
+ improvements to documentation and usability.
+- Also, SPEC file is run through spec-cleaner.
+
+-------------------------------------------------------------------
Old:
----
librosa-0.6.2.tar.gz
New:
----
librosa-0.6.3.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-librosa.spec ++++++
--- /var/tmp/diff_new_pack.TrDPAb/_old 2019-04-01 12:34:58.825822917 +0200
+++ /var/tmp/diff_new_pack.TrDPAb/_new 2019-04-01 12:34:58.825822917 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-librosa
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,22 +12,33 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
+#
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-librosa
-Version: 0.6.2
+Version: 0.6.3
Release: 0
-License: ISC
Summary: Python module for audio and music processing
-Url: http://github.com/librosa/librosa
+License: ISC
Group: Development/Languages/Python
+URL: http://github.com/librosa/librosa
Source0: https://files.pythonhosted.org/packages/source/l/librosa/librosa-%{version}.tar.gz
Source10: https://raw.githubusercontent.com/librosa/librosa/%{version}/LICENSE.md
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
+Requires: python-audioread >= 2.0.0
+Requires: python-decorator >= 3.0.0
+Requires: python-joblib >= 0.12
+Requires: python-numba >= 0.38.0
+Requires: python-numpy >= 1.8.0
+Requires: python-resampy >= 0.2.0
+Requires: python-scikit-learn >= 0.14.0
+Requires: python-scipy >= 0.14.0
+Requires: python-six >= 1.3
+BuildArch: noarch
# SECTION test requirements
BuildRequires: %{python_module audioread >= 2.0.0}
BuildRequires: %{python_module decorator >= 3.0.0}
@@ -39,17 +50,6 @@
BuildRequires: %{python_module scipy >= 0.14.0}
BuildRequires: %{python_module six >= 1.3}
# /SECTION
-Requires: python-audioread >= 2.0.0
-Requires: python-decorator >= 3.0.0
-Requires: python-joblib >= 0.12
-Requires: python-numba >= 0.38.0
-Requires: python-numpy >= 1.8.0
-Requires: python-resampy >= 0.2.0
-Requires: python-scikit-learn >= 0.14.0
-Requires: python-scipy >= 0.14.0
-Requires: python-six >= 1.3
-BuildArch: noarch
-
%python_subpackages
%description
++++++ librosa-0.6.2.tar.gz -> librosa-0.6.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/AUTHORS.md new/librosa-0.6.3/AUTHORS.md
--- old/librosa-0.6.2/AUTHORS.md 1970-01-01 01:00:00.000000000 +0100
+++ new/librosa-0.6.3/AUTHORS.md 2019-02-13 22:28:40.000000000 +0100
@@ -0,0 +1,54 @@
+Contributors
+============
+
+* Brian McFee https://github.com/bmcfee
+* Matt McVicar https://github.com/mattmcvicar
+* Dawen Liang https://github.com/dawenl
+* Colin Raffel https://github.com/craffel
+* Douglas Repetto https://github.com/drepetto
+* Dan Ellis https://github.com/dpwe
+* Eric Battenberg https://github.com/ebattenberg
+* Bryce Walburn https://github.com/BWalburn
+* Oriol Nieto https://github.com/urinieto
+* Romain Hennequin https://github.com/romi1502
+* Ryuichi Yamamoto https://github.com/r9y9
+* Rachel Bittner https://github.com/rabitt
+* Stefan Balke https://github.com/stefan-balke
+* CJ Carr https://github.com/Cortexelus
+* Fabian Robert-Stoeter https://github.com/faroit
+* Keunwoo Choi https://github.com/keunwoochoi
+* Eric Humphrey https://github.com/ejhumphrey
+* Carl Thome https://github.com/carlthome
+* Seth Kranzler https://github.com/polyrhythmatic
+* Waldir Pimenta https://github.com/waldyrious
+* Hojin Lee https://github.com/hojinlee
+* Paul Brossier https://github.com/piem
+* Rimvydas Naktinis https://github.com/naktinis
+* Jackie Wu https://github.com/wkcn
+* Erik Peterson https://github.com/EMCP
+* Siddhartha Kumar https://github.com/siddhugolu
+* Julia Wilkins https://github.com/jlw365
+* Curtis Hawthorne https://github.com/cghawthorne
+* Dana Lee https://github.com/danagilliann
+* Pius Friesch https://github.com/pfriesch
+* Ziyao Wei https://github.com/ZiyaoWei
+* Vincent Lostanlen https://github.com/lostanlen
+* Steve Tjoa https://github.com/stevetjoa
+* Matt Vollrath https://github.com/mvollrath
+* Zhen Wang https://github.com/nehz
+* Kyungyun Lee https://github.com/kyungyunlee
+* Frank Zalkow https://github.com/fzalkow
+* Shayenne Moura https://github.com/shayenne
+* nullmightybofo https://github.com/nullmightybofo
+* toddrme2178 https://github.com/toddrme2178
+* Andy Sarroff https://github.com/woodshop
+* Monsij Biswal https://github.com/monsij
+
+Some feature extraction code was based on https://github.com/ronw/frontend by Ron Weiss.
+
+Large portions of LibROSA were ported from MATLAB code by Dan Ellis http://www.ee.columbia.edu/~dpwe/resources/matlab/.
+
+Some spectral features were ported from original MATLAB implementations by Erik Schmidt and Jeff Scott
+at the Drexel METlab http://music.ece.drexel.edu/
+
+Additional thanks to Emanuele Coviello and Erik Schmidt for testing, bug reports and fixes.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/CONTRIBUTING.md new/librosa-0.6.3/CONTRIBUTING.md
--- old/librosa-0.6.2/CONTRIBUTING.md 1970-01-01 01:00:00.000000000 +0100
+++ new/librosa-0.6.3/CONTRIBUTING.md 2018-11-21 15:41:08.000000000 +0100
@@ -0,0 +1,122 @@
+
+Contributing code
+=================
+
+How to contribute
+-----------------
+
+The preferred way to contribute to librosa is to fork the
+[main repository](http://github.com/librosa/librosa/) on
+GitHub:
+
+1. Fork the [project repository](http://github.com/librosa/librosa):
+ click on the 'Fork' button near the top of the page. This creates
+ a copy of the code under your account on the GitHub server.
+
+2. Clone this copy to your local disk:
+
+ $ git clone git@github.com:YourLogin/librosa.git
+ $ cd librosa
+
+3. Remove any previously installed librosas:
+
+ $ pip uninstall librosa
+
+and install your local copy with testing dependencies:
+
+ $ pip install -e .[tests]
+
+4. Create a branch to hold your changes:
+
+ $ git checkout -b my-feature
+
+ and start making changes. Never work in the ``master`` branch!
+
+5. Work on this copy on your computer using Git to do the version
+ control. When you're done editing, do:
+
+ $ git add modified_files
+ $ git commit
+
+ to record your changes in Git, then push them to GitHub with:
+
+ $ git push -u origin my-feature
+
+Finally, go to the web page of the your fork of the librosa repo,
+and click 'Pull request' to send your changes to the maintainers for
+review. This will send an email to the committers.
+
+(If any of the above seems like magic to you, then look up the
+[Git documentation](http://git-scm.com/documentation) on the web.)
+
+It is recommended to check that your contribution complies with the
+following rules before submitting a pull request:
+
+- All public methods should have informative docstrings with sample
+ usage presented.
+
+You can also check for common programming errors with the following
+tools:
+
+- Code with good test coverage (at least 80%), check with:
+
+ $ pytest
+
+- No pyflakes warnings, check with:
+
+ $ pip install pyflakes
+ $ pyflakes path/to/module.py
+
+- No PEP8 warnings, check with:
+
+ $ pip install pep8
+ $ pep8 path/to/module.py
+
+- AutoPEP8 can help you fix some of the easy redundant errors:
+
+ $ pip install autopep8
+ $ autopep8 path/to/pep8.py
+
+Filing bugs
+-----------
+We use Github issues to track all bugs and feature requests; feel free to
+open an issue if you have found a bug or wish to see a feature implemented.
+
+It is recommended to check that your issue complies with the
+following rules before submitting:
+
+- Verify that your issue is not being currently addressed by other
+ [issues](https://github.com/librosa/librosa/issues?q=)
+ or [pull requests](https://github.com/librosa/librosa/pulls?q=).
+
+- Please ensure all code snippets and error messages are formatted in
+ appropriate code blocks.
+ See [Creating and highlighting code blocks](https://help.github.com/articles/creating-and-highlighting-code-blocks).
+
+- Please include your operating system type and version number, as well
+ as your Python, librosa, numpy, and scipy versions. This information
+ can be found by running the following code snippet:
+
+ ```python
+ import platform; print(platform.platform())
+ import sys; print("Python", sys.version)
+ import numpy; print("NumPy", numpy.__version__)
+ import scipy; print("SciPy", scipy.__version__)
+ import librosa; print("librosa", librosa.__version__)
+ ```
+
+Documentation
+-------------
+
+You can edit the documentation using any text editor and then generate
+the HTML output by typing ``make html`` from the docs/ directory.
+The resulting HTML files will be placed in _build/html/ and are viewable
+in a web browser. See the README file in the doc/ directory for more information.
+
+For building the documentation, you will need
+[sphinx](http://sphinx.pocoo.org/),
+[matplotlib](http://matplotlib.sourceforge.net/), and [numpydoc](https://pypi.python.org/pypi/numpydoc).
+
+Note
+----
+This document was gleefully borrowed from [scikit-learn](http://scikit-learn.org/).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/LICENSE.md new/librosa-0.6.3/LICENSE.md
--- old/librosa-0.6.2/LICENSE.md 1970-01-01 01:00:00.000000000 +0100
+++ new/librosa-0.6.3/LICENSE.md 2018-09-13 01:41:47.000000000 +0200
@@ -0,0 +1,15 @@
+## ISC License
+
+Copyright (c) 2013--2017, librosa development team.
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/MANIFEST.in new/librosa-0.6.3/MANIFEST.in
--- old/librosa-0.6.2/MANIFEST.in 1970-01-01 01:00:00.000000000 +0100
+++ new/librosa-0.6.3/MANIFEST.in 2018-11-14 04:11:59.000000000 +0100
@@ -0,0 +1,3 @@
+include AUTHORS.md
+include CONTRIBUTING.md
+include LICENSE.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/PKG-INFO new/librosa-0.6.3/PKG-INFO
--- old/librosa-0.6.2/PKG-INFO 2018-08-09 17:23:07.000000000 +0200
+++ new/librosa-0.6.3/PKG-INFO 2019-02-13 22:29:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: librosa
-Version: 0.6.2
+Version: 0.6.3
Summary: Python module for audio and music processing
Home-page: http://github.com/librosa/librosa
Author: Brian McFee
@@ -134,6 +134,6 @@
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Description-Content-Type: text/markdown
-Provides-Extra: docs
Provides-Extra: display
Provides-Extra: tests
+Provides-Extra: docs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/core/audio.py new/librosa-0.6.3/librosa/core/audio.py
--- old/librosa-0.6.2/librosa/core/audio.py 2018-08-08 06:42:43.000000000 +0200
+++ new/librosa-0.6.3/librosa/core/audio.py 2019-02-13 22:28:41.000000000 +0100
@@ -69,6 +69,13 @@
To use a faster method, set `res_type='kaiser_fast'`.
To use `scipy.signal.resample`, set `res_type='scipy'`.
+
+ .. note::
+ This uses `audioread`, which may truncate the precision of the
+ audio data to 16 bits.
+
+ See https://librosa.github.io/librosa/ioformats.html for alternate
+ loading methods.
Returns
@@ -357,6 +364,19 @@
-------
d : float >= 0
Duration (in seconds) of the input time series or spectrogram.
+
+ Raises
+ ------
+ ParameterError
+ if none of `y`, `S`, or `filename` are provided.
+
+ Notes
+ -----
+ `get_duration` can be applied to a file (`filename`), a spectrogram (`S`),
+ or audio buffer (`y, sr`). Only one of these three options should be
+ provided. If you do provide multiple options (e.g., `filename` and `S`),
+ then `filename` takes precedence over `S`, and `S` takes precedence over
+ `(y, sr)`.
"""
if filename is not None:
@@ -364,7 +384,8 @@
return fdesc.duration
if y is None:
- assert S is not None
+ if S is None:
+ raise ParameterError('At least one of (y, sr), S, or filename must be provided')
n_frames = S.shape[1]
n_samples = n_fft + hop_length * (n_frames - 1)
@@ -726,7 +747,8 @@
desired sampling rate of the output signal
length : int > 0
- desired number of samples in the output signal. When both `duration` and `length` are defined, `length` would take priority.
+ desired number of samples in the output signal. When both `duration` and `length` are defined,
+ `length` would take priority.
duration : float > 0
desired duration in seconds. When both `duration` and `length` are defined, `length` would take priority.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/core/pitch.py new/librosa-0.6.3/librosa/core/pitch.py
--- old/librosa-0.6.2/librosa/core/pitch.py 2018-05-24 15:32:27.000000000 +0200
+++ new/librosa-0.6.3/librosa/core/pitch.py 2019-01-31 02:21:26.000000000 +0100
@@ -154,7 +154,7 @@
# from the next tone up.
residual[residual >= 0.5] -= 1.0
- bins = np.linspace(-0.5, 0.5, int(np.ceil(1./resolution)), endpoint=False)
+ bins = np.linspace(-0.5, 0.5, int(np.ceil(1. / resolution)) + 1)
counts, tuning = np.histogram(residual, bins)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/core/spectrum.py new/librosa-0.6.3/librosa/core/spectrum.py
--- old/librosa-0.6.2/librosa/core/spectrum.py 2018-08-03 20:45:54.000000000 +0200
+++ new/librosa-0.6.3/librosa/core/spectrum.py 2018-12-03 17:51:54.000000000 +0100
@@ -179,7 +179,6 @@
for bl_s in range(0, stft_matrix.shape[1], n_columns):
bl_t = min(bl_s + n_columns, stft_matrix.shape[1])
- # RFFT and Conjugate here to match phase from DPWE code
stft_matrix[:, bl_s:bl_t] = fft.fft(fft_window *
y_frames[:, bl_s:bl_t],
axis=0)[:stft_matrix.shape[0]]
@@ -195,7 +194,7 @@
Converts a complex-valued spectrogram `stft_matrix` to time-series `y`
by minimizing the mean squared error between `stft_matrix` and STFT of
- `y` as described in [1]_.
+ `y` as described in [1]_ up to Section 2 (reconstruction from MSTFT).
In general, window function, hop length and other parameters should be same
as in stft, which mostly leads to perfect reconstruction of a signal from
@@ -635,7 +634,7 @@
@cache(level=20)
def iirt(y, sr=22050, win_length=2048, hop_length=None, center=True,
- tuning=0.0, pad_mode='reflect', **kwargs):
+ tuning=0.0, pad_mode='reflect', flayout=None, **kwargs):
r'''Time-frequency representation using IIR filters [1]_.
This function will return a time-frequency representation
@@ -643,7 +642,7 @@
First, `y` is resampled as needed according to the provided `sample_rates`.
Then, a filterbank with with `n` band-pass filters is designed.
The resampled input signals are processed by the filterbank as a whole.
- (`scipy.signal.filtfilt` is used to make the phase linear.)
+ (`scipy.signal.filtfilt` resp. `sosfiltfilt` is used to make the phase linear.)
The output of the filterbank is cut into frames.
For each band, the short-time mean-square power (STMSP) is calculated by
summing `win_length` subsequent filtered time samples.
@@ -686,6 +685,12 @@
If `center=True`, the padding mode to use at the edges of the signal.
By default, this function uses reflection padding.
+ flayout : string
+ - If `ba`, the standard difference equation is used for filtering with `scipy.signal.filtfilt`.
+ Can be unstable for high-order filters.
+ - If `sos`, a series of second-order filters is used for filtering with `scipy.signal.sosfiltfilt`.
+ Minimizes numerical precision errors for high-order filters, but is slower.
+
kwargs : additional keyword arguments
Additional arguments for `librosa.filters.semitone_filterbank()`
(e.g., could be used to provide another set of `center_freqs` and `sample_rates`).
@@ -695,6 +700,11 @@
bands_power : np.ndarray [shape=(n, t), dtype=dtype]
Short-time mean-square power for the input signal.
+ Raises
+ ------
+ ParameterError
+ If `flayout` is not None, `ba`, or `sos`.
+
See Also
--------
librosa.filters.semitone_filterbank
@@ -702,6 +712,7 @@
librosa.filters.mr_frequencies
librosa.core.cqt
scipy.signal.filtfilt
+ scipy.signal.sosfiltfilt
Examples
--------
@@ -715,6 +726,14 @@
>>> plt.tight_layout()
'''
+ if flayout is None:
+ warnings.warn('Default filter layout for `iirt` is `ba`, but will be `sos` in 0.7.',
+ FutureWarning)
+ flayout = 'ba'
+
+ elif flayout not in ('ba', 'sos'):
+ raise ParameterError('Unsupported flayout={}'.format(flayout))
+
# check audio input
util.valid_audio(y)
@@ -727,7 +746,7 @@
y = np.pad(y, int(hop_length), mode=pad_mode)
# get the semitone filterbank
- filterbank_ct, sample_rates = semitone_filterbank(tuning=tuning, **kwargs)
+ filterbank_ct, sample_rates = semitone_filterbank(tuning=tuning, flayout=flayout, **kwargs)
# create three downsampled versions of the audio signal
y_resampled = []
@@ -750,8 +769,12 @@
# filter the signal
cur_sr_idx = np.flatnonzero(y_srs == cur_sr)[0]
- cur_filter_output = scipy.signal.filtfilt(cur_filter[0], cur_filter[1],
- y_resampled[cur_sr_idx])
+ if flayout == 'ba':
+ cur_filter_output = scipy.signal.filtfilt(cur_filter[0], cur_filter[1],
+ y_resampled[cur_sr_idx])
+ elif flayout == 'sos':
+ cur_filter_output = scipy.signal.sosfiltfilt(cur_filter,
+ y_resampled[cur_sr_idx])
# frame the current filter output
cur_frames = util.frame(np.ascontiguousarray(cur_filter_output),
@@ -1262,7 +1285,9 @@
x_exp = np.clip(x_exp, float(t_min) / n, x[-1])
# Make sure that all sample points are unique
- assert len(np.unique(x_exp)) == len(x_exp)
+ # This should never happen!
+ if len(np.unique(x_exp)) != len(x_exp):
+ raise RuntimeError('Redundant sample positions in Mellin transform')
# Resample the signal
y_res = f_interp(x_exp)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/display.py new/librosa-0.6.3/librosa/display.py
--- old/librosa-0.6.2/librosa/display.py 2018-08-03 16:05:35.000000000 +0200
+++ new/librosa-0.6.3/librosa/display.py 2019-02-13 22:28:41.000000000 +0100
@@ -50,7 +50,15 @@
----------
lag : bool
If `True`, then the time axis is interpreted in lag coordinates.
- Anything past the mid-point will be converted to negative time.
+ Anything past the midpoint will be converted to negative time.
+
+ unit : str or None
+ Abbreviation of the physical unit for axis labels and ticks.
+ Either equal to `s` (seconds) or `ms` (milliseconds) or None (default).
+ If set to None, the resulting TimeFormatter object adapts its string
+ representation to the duration of the underlying time range:
+ `hh:mm:ss` above 3600 seconds; `mm:ss` between 60 and 3600 seconds;
+ and `ss` below 60 seconds.
See also
@@ -72,6 +80,16 @@
>>> ax.xaxis.set_major_formatter(librosa.display.TimeFormatter())
>>> ax.set_xlabel('Time')
+ Manually set the physical time unit of the x-axis to milliseconds
+
+ >>> times = np.arange(100)
+ >>> values = np.random.randn(len(times))
+ >>> plt.figure()
+ >>> ax = plt.gca()
+ >>> ax.plot(times, values)
+ >>> ax.xaxis.set_major_formatter(librosa.display.TimeFormatter(unit='ms'))
+ >>> ax.set_xlabel('Time (ms)')
+
For lag plots
>>> times = np.arange(60)
@@ -83,8 +101,12 @@
>>> ax.set_xlabel('Lag')
'''
- def __init__(self, lag=False):
+ def __init__(self, lag=False, unit=None):
+ if unit not in ['s', 'ms', None]:
+ raise ParameterError('Unknown time unit: {}'.format(unit))
+
+ self.unit = unit
self.lag = lag
def __call__(self, x, pos=None):
@@ -105,15 +127,20 @@
value = x
sign = ''
- if vmax - vmin > 3600:
- s = '{:d}:{:02d}:{:02d}'.format(int(value / 3600.0),
- int(np.mod(value / 60.0, 60)),
- int(np.mod(value, 60)))
- elif vmax - vmin > 60:
- s = '{:d}:{:02d}'.format(int(value / 60.0),
- int(np.mod(value, 60)))
+ if self.unit == 's':
+ s = '{:.3g}'.format(value)
+ elif self.unit == 'ms':
+ s = '{:.3g}'.format(value * 1000)
else:
- s = '{:.2g}'.format(value)
+ if vmax - vmin > 3600:
+ s = '{:d}:{:02d}:{:02d}'.format(int(value / 3600.0),
+ int(np.mod(value / 60.0, 60)),
+ int(np.mod(value, 60)))
+ elif vmax - vmin > 60:
+ s = '{:d}:{:02d}'.format(int(value / 60.0),
+ int(np.mod(value, 60)))
+ else:
+ s = '{:.2g}'.format(value)
return '{:s}{:s}'.format(sign, s)
@@ -361,7 +388,7 @@
Axes to plot on instead of the default `plt.gca()`.
offset : float
- Horizontal offset (in time) to start the waveform plot
+ Horizontal offset (in seconds) to start the waveform plot
max_sr : number > 0 [scalar]
Maximum sampling rate for the visualization
@@ -446,6 +473,7 @@
locs = offset + core.frames_to_time(np.arange(len(y_top)),
sr=sr,
hop_length=hop_length)
+
out = axes.fill_between(locs, y_bottom, y_top, **kwargs)
axes.set_xlim([locs.min(), locs.max()])
@@ -509,15 +537,18 @@
- 'tonnetz' : axes are labeled by Tonnetz dimensions (0-5)
- 'frames' : markers are shown as frame counts.
-
Time types:
- 'time' : markers are shown as milliseconds, seconds,
- minutes, or hours
- - 'lag' : like time, but past the half-way point counts
- as negative values.
+ minutes, or hours.
+ Values are plotted in units of seconds.
+ - 's' : markers are shown as seconds.
+ - 'ms' : markers are shown as milliseconds.
- All time types are plotted in units of seconds.
+ - 'lag' : like time, but past the halfway point counts
+ as negative values.
+ - 'lag_s' : same as lag, but in seconds.
+ - 'lag_ms' : same as lag, but in milliseconds.
Other:
@@ -730,7 +761,11 @@
'cqt_note': __coord_cqt_hz,
'chroma': __coord_chroma,
'time': __coord_time,
+ 's': __coord_time,
+ 'ms': __coord_time,
'lag': __coord_time,
+ 'lag_s': __coord_time,
+ 'lag_ms': __coord_time,
'tonnetz': __coord_n,
'off': __coord_n,
'tempo': __coord_tempo,
@@ -739,7 +774,6 @@
if ax_type not in coord_map:
raise ParameterError('Unknown axis type: {}'.format(ax_type))
-
return coord_map[ax_type](n, **kwargs)
@@ -818,17 +852,41 @@
axis.set_label_text('BPM')
elif ax_type == 'time':
- axis.set_major_formatter(TimeFormatter(lag=False))
+ axis.set_major_formatter(TimeFormatter(unit=None, lag=False))
axis.set_major_locator(MaxNLocator(prune=None,
steps=[1, 1.5, 5, 6, 10]))
axis.set_label_text('Time')
+ elif ax_type == 's':
+ axis.set_major_formatter(TimeFormatter(unit='s', lag=False))
+ axis.set_major_locator(MaxNLocator(prune=None,
+ steps=[1, 1.5, 5, 6, 10]))
+ axis.set_label_text('Time (s)')
+
+ elif ax_type == 'ms':
+ axis.set_major_formatter(TimeFormatter(unit='ms', lag=False))
+ axis.set_major_locator(MaxNLocator(prune=None,
+ steps=[1, 1.5, 5, 6, 10]))
+ axis.set_label_text('Time (ms)')
+
elif ax_type == 'lag':
- axis.set_major_formatter(TimeFormatter(lag=True))
+ axis.set_major_formatter(TimeFormatter(unit=None, lag=True))
axis.set_major_locator(MaxNLocator(prune=None,
steps=[1, 1.5, 5, 6, 10]))
axis.set_label_text('Lag')
+ elif ax_type == 'lag_s':
+ axis.set_major_formatter(TimeFormatter(unit='s', lag=True))
+ axis.set_major_locator(MaxNLocator(prune=None,
+ steps=[1, 1.5, 5, 6, 10]))
+ axis.set_label_text('Lag (s)')
+
+ elif ax_type == 'lag_ms':
+ axis.set_major_formatter(TimeFormatter(unit='ms', lag=True))
+ axis.set_major_locator(MaxNLocator(prune=None,
+ steps=[1, 1.5, 5, 6, 10]))
+ axis.set_label_text('Lag (ms)')
+
elif ax_type == 'cqt_note':
axis.set_major_formatter(NoteFormatter())
axis.set_major_locator(LogLocator(base=2.0))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/effects.py new/librosa-0.6.3/librosa/effects.py
--- old/librosa-0.6.2/librosa/effects.py 2018-08-03 20:45:54.000000000 +0200
+++ new/librosa-0.6.3/librosa/effects.py 2018-12-29 16:15:08.000000000 +0100
@@ -412,9 +412,9 @@
y_mono = core.to_mono(y)
# Compute the MSE for the signal
- mse = feature.rmse(y=y_mono,
- frame_length=frame_length,
- hop_length=hop_length)**2
+ mse = feature.rms(y=y_mono,
+ frame_length=frame_length,
+ hop_length=hop_length)**2
return (core.power_to_db(mse.squeeze(),
ref=ref,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/feature/__init__.py new/librosa-0.6.3/librosa/feature/__init__.py
--- old/librosa-0.6.2/librosa/feature/__init__.py 2018-05-24 15:32:27.000000000 +0200
+++ new/librosa-0.6.3/librosa/feature/__init__.py 2018-12-29 16:15:08.000000000 +0100
@@ -15,6 +15,7 @@
chroma_cens
melspectrogram
mfcc
+ rms
rmse
spectral_centroid
spectral_bandwidth
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/feature/spectral.py new/librosa-0.6.3/librosa/feature/spectral.py
--- old/librosa-0.6.2/librosa/feature/spectral.py 2018-07-06 20:07:15.000000000 +0200
+++ new/librosa-0.6.3/librosa/feature/spectral.py 2019-02-13 22:28:41.000000000 +0100
@@ -10,6 +10,7 @@
from .. import util
from .. import filters
from ..util.exceptions import ParameterError
+from ..util.decorators import moved
from ..core.time_frequency import fft_frequencies
from ..core.audio import zero_crossings, to_mono
@@ -24,6 +25,7 @@
'spectral_rolloff',
'spectral_flatness',
'poly_features',
+ 'rms',
'rmse',
'zero_crossing_rate',
'chroma_stft',
@@ -602,13 +604,13 @@
return gmean / amean
-def rmse(y=None, S=None, frame_length=2048, hop_length=512,
- center=True, pad_mode='reflect'):
- '''Compute root-mean-square (RMS) energy for each frame, either from the
+def rms(y=None, S=None, frame_length=2048, hop_length=512,
+ center=True, pad_mode='reflect'):
+ '''Compute root-mean-square (RMS) value for each frame, either from the
audio samples `y` or from a spectrogram `S`.
- Computing the energy from audio samples is faster as it doesn't require a
- STFT calculation. However, using a spectrogram will give a more accurate
+ Computing the RMS value from audio samples is faster as it doesn't require
+ a STFT calculation. However, using a spectrogram will give a more accurate
representation of energy over time because its frames can be windowed,
thus prefer using `S` if it's already available.
@@ -646,13 +648,13 @@
Examples
--------
>>> y, sr = librosa.load(librosa.util.example_audio_file())
- >>> librosa.feature.rmse(y=y)
+ >>> librosa.feature.rms(y=y)
array([[ 0. , 0.056, ..., 0. , 0. ]], dtype=float32)
Or from spectrogram input
>>> S, phase = librosa.magphase(librosa.stft(y))
- >>> rms = librosa.feature.rmse(S=S)
+ >>> rms = librosa.feature.rms(S=S)
>>> import matplotlib.pyplot as plt
>>> plt.figure()
@@ -668,10 +670,10 @@
>>> plt.tight_layout()
Use a STFT window of constant ones and no frame centering to get consistent
- results with the RMS energy computed from the audio samples `y`
+ results with the RMS computed from the audio samples `y`
>>> S = librosa.magphase(librosa.stft(y, window=np.ones, center=False))[0]
- >>> librosa.feature.rmse(S=S)
+ >>> librosa.feature.rms(S=S)
'''
if y is not None and S is not None:
@@ -693,6 +695,9 @@
return np.sqrt(np.mean(np.abs(x)**2, axis=0, keepdims=True))
+rmse = moved('librosa.feature.rmse', '0.6.3', '0.7.0')(rms)
+
+
def poly_features(y=None, sr=22050, S=None, n_fft=2048, hop_length=512,
order=1, freq=None):
'''Get coefficients of fitting an nth-order polynomial to the columns
@@ -1094,11 +1099,20 @@
def chroma_cens(y=None, sr=22050, C=None, hop_length=512, fmin=None,
tuning=None, n_chroma=12,
n_octaves=7, bins_per_octave=None, cqt_mode='full', window=None,
- norm=2, win_len_smooth=41):
+ norm=2, win_len_smooth=41, smoothing_window='hann'):
r'''Computes the chroma variant "Chroma Energy Normalized" (CENS), following [1]_.
+ To compute CENS features, following steps are taken after obtaining chroma vectors using `chroma_cqt`:
+ 1. L-1 normalization of each chroma vector
+ 2. Quantization of amplitude based on "log-like" amplitude thresholds
+ 3. (optional) Smoothing with sliding window. Default window length = 41 frames
+ 4. (not implemented) Downsampling
+
+ CENS features are robust to dynamics, timbre and articulation, thus these are commonly used in audio
+ matching and retrieval applications.
+
.. [1] Meinard Müller and Sebastian Ewert
- Chroma Toolbox: MATLAB implementations for extracting variants of chroma-based audio features
+ "Chroma Toolbox: MATLAB implementations for extracting variants of chroma-based audio features"
In Proceedings of the International Conference on Music Information Retrieval (ISMIR), 2011.
Parameters
@@ -1141,10 +1155,14 @@
cqt_mode : ['full', 'hybrid']
Constant-Q transform mode
- win_len_smooth : int > 0
- Length of temporal smoothing window.
+ win_len_smooth : int > 0 or None
+ Length of temporal smoothing window. `None` disables temporal smoothing.
Default: 41
+ smoothing_window : str, float or tuple
+ Type of window function for temporal smoothing. See `filters.get_window` for possible inputs.
+ Default: 'hann'
+
Returns
-------
chroma_cens : np.ndarray [shape=(n_chroma, t)]
@@ -1158,6 +1176,9 @@
chroma_stft
Compute a chromagram from an STFT spectrogram or waveform.
+ filters.get_window
+ Compute a window function.
+
Examples
--------
Compare standard cqt chroma to CENS.
@@ -1180,6 +1201,9 @@
>>> plt.colorbar()
>>> plt.tight_layout()
'''
+ if not ((win_len_smooth is None) or (isinstance(win_len_smooth, int) and win_len_smooth > 0)):
+ raise ParameterError('win_len_smooth={} must be a positive integer or None'.format(win_len_smooth))
+
chroma = chroma_cqt(y=y, C=C, sr=sr,
hop_length=hop_length,
fmin=fmin,
@@ -1203,13 +1227,16 @@
for cur_quant_step_idx, cur_quant_step in enumerate(QUANT_STEPS):
chroma_quant += (chroma > cur_quant_step) * QUANT_WEIGHTS[cur_quant_step_idx]
- # Apply temporal smoothing
- win = filters.get_window('hann', win_len_smooth + 2, fftbins=False)
- win /= np.sum(win)
- win = np.atleast_2d(win)
+ if win_len_smooth:
+ # Apply temporal smoothing
+ win = filters.get_window(smoothing_window, win_len_smooth + 2, fftbins=False)
+ win /= np.sum(win)
+ win = np.atleast_2d(win)
- cens = scipy.signal.convolve2d(chroma_quant, win,
- mode='same', boundary='fill')
+ cens = scipy.signal.convolve2d(chroma_quant, win,
+ mode='same', boundary='fill')
+ else:
+ cens = chroma_quant
# L2-Normalization
return util.normalize(cens, norm=norm, axis=0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/filters.py new/librosa-0.6.3/librosa/filters.py
--- old/librosa-0.6.2/librosa/filters.py 2018-08-03 16:05:35.000000000 +0200
+++ new/librosa-0.6.3/librosa/filters.py 2018-12-03 17:51:54.000000000 +0100
@@ -909,7 +909,7 @@
@cache(level=10)
def _multirate_fb(center_freqs=None, sample_rates=None, Q=25.0,
- passband_ripple=1, stopband_attenuation=50, ftype='ellip'):
+ passband_ripple=1, stopband_attenuation=50, ftype='ellip', flayout='ba'):
r'''Helper function to construct a multirate filterbank.
A filter bank consists of multiple band-pass filters which divide the input signal
@@ -944,6 +944,16 @@
The type of IIR filter to design
See `scipy.signal.iirdesign` for details.
+ flayout : string
+ Valid `output` argument for `scipy.signal.iirdesign`.
+ - If `ba`, returns numerators/denominators of the transfer functions,
+ used for filtering with `scipy.signal.filtfilt`.
+ Can be unstable for high-order filters.
+ - If `sos`, returns a series of second-order filters,
+ used for filtering with `scipy.signal.sosfiltfilt`.
+ Minimizes numerical precision errors for high-order filters, but is slower.
+ - If `zpk`, returns zeros, poles, and system gains of the transfer functions.
+
Returns
-------
filterbank : list [shape=(n,), dtype=float]
@@ -988,7 +998,7 @@
cur_filter = scipy.signal.iirdesign(passband_freqs, stopband_freqs,
passband_ripple, stopband_attenuation,
- analog=False, ftype=ftype, output='ba')
+ analog=False, ftype=ftype, output=flayout)
filterbank.append(cur_filter)
@@ -1043,7 +1053,7 @@
return center_freqs, sample_rates
-def semitone_filterbank(center_freqs=None, tuning=0.0, sample_rates=None, **kwargs):
+def semitone_filterbank(center_freqs=None, tuning=0.0, sample_rates=None, flayout='ba', **kwargs):
r'''Constructs a multirate filterbank of infinite-impulse response (IIR)
band-pass filters at user-defined center frequencies and sample rates.
@@ -1078,6 +1088,12 @@
sample_rates : np.ndarray [shape=(n,), dtype=float]
Sample rates of each filter in the multirate filterbank.
+ flayout : string
+ - If `ba`, the standard difference equation is used for filtering with `scipy.signal.filtfilt`.
+ Can be unstable for high-order filters.
+ - If `sos`, a series of second-order filters is used for filtering with `scipy.signal.sosfiltfilt`.
+ Minimizes numerical precision errors for high-order filters, but is slower.
+
kwargs : additional keyword arguments
Additional arguments to the private function `_multirate_fb()`.
@@ -1119,7 +1135,8 @@
if (center_freqs is None) and (sample_rates is None):
center_freqs, sample_rates = mr_frequencies(tuning)
- filterbank, fb_sample_rates = _multirate_fb(center_freqs=center_freqs, sample_rates=sample_rates, **kwargs)
+ filterbank, fb_sample_rates = _multirate_fb(center_freqs=center_freqs, sample_rates=sample_rates,
+ flayout=flayout, **kwargs)
return filterbank, fb_sample_rates
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/onset.py new/librosa-0.6.3/librosa/onset.py
--- old/librosa-0.6.2/librosa/onset.py 2018-08-03 16:05:35.000000000 +0200
+++ new/librosa-0.6.3/librosa/onset.py 2018-12-29 16:15:08.000000000 +0100
@@ -361,9 +361,9 @@
... backtrack=False)
>>> # Backtrack the events using the onset envelope
>>> onset_bt = librosa.onset.onset_backtrack(onset_raw, oenv)
- >>> # Backtrack the events using the RMS energy
- >>> rmse = librosa.feature.rmse(S=np.abs(librosa.stft(y=y)))
- >>> onset_bt_rmse = librosa.onset.onset_backtrack(onset_raw, rmse[0])
+ >>> # Backtrack the events using the RMS values
+ >>> rms = librosa.feature.rms(S=np.abs(librosa.stft(y=y)))
+ >>> onset_bt_rms = librosa.onset.onset_backtrack(onset_raw, rms[0])
>>> # Plot the results
>>> import matplotlib.pyplot as plt
@@ -374,8 +374,8 @@
>>> plt.vlines(onset_bt, 0, oenv.max(), label='Backtracked', color='r')
>>> plt.legend(frameon=True, framealpha=0.75)
>>> plt.subplot(2,1,2)
- >>> plt.plot(rmse[0], label='RMSE')
- >>> plt.vlines(onset_bt_rmse, 0, rmse.max(), label='Backtracked (RMSE)', color='r')
+ >>> plt.plot(rms[0], label='RMS')
+ >>> plt.vlines(onset_bt_rms, 0, rms.max(), label='Backtracked (RMS)', color='r')
>>> plt.legend(frameon=True, framealpha=0.75)
'''
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/output.py new/librosa-0.6.3/librosa/output.py
--- old/librosa-0.6.2/librosa/output.py 2018-05-24 15:32:27.000000000 +0200
+++ new/librosa-0.6.3/librosa/output.py 2018-11-23 18:45:04.000000000 +0100
@@ -196,8 +196,10 @@
path : str
path to save the output wav file
- y : np.ndarray [shape=(n,) or (2,n)]
- audio time series (mono or stereo)
+ y : np.ndarray [shape=(n,) or (2,n), dtype=np.float]
+ audio time series (mono or stereo).
+
+ Note that only floating-point values are supported.
sr : int > 0 [scalar]
sampling rate of `y`
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/segment.py new/librosa-0.6.3/librosa/segment.py
--- old/librosa-0.6.2/librosa/segment.py 2018-05-24 15:32:27.000000000 +0200
+++ new/librosa-0.6.3/librosa/segment.py 2018-11-14 04:11:59.000000000 +0100
@@ -607,7 +607,7 @@
for seg_start, seg_end in zip(frames[:-1], frames[1:]):
idx_slices[axis] = slice(seg_start, seg_end)
- boundaries.extend(seg_start + agglomerative(data[idx_slices],
+ boundaries.extend(seg_start + agglomerative(data[tuple(idx_slices)],
min(seg_end - seg_start, n_segments),
axis=axis))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/sequence.py new/librosa-0.6.3/librosa/sequence.py
--- old/librosa-0.6.2/librosa/sequence.py 2018-05-24 15:32:27.000000000 +0200
+++ new/librosa-0.6.3/librosa/sequence.py 2019-02-13 22:28:41.000000000 +0100
@@ -165,7 +165,7 @@
try:
C = cdist(X.T, Y.T, metric=metric)
- except ValueError as e:
+ except ValueError:
msg = ('scipy.spatial.distance.cdist returned an error.\n'
'Please provide your input in the form X.shape=(K, N) and Y.shape=(K, M).\n'
'1-dimensional sequences should be reshaped to X.shape=(1, N) and Y.shape=(1, M).')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/util/matching.py new/librosa-0.6.3/librosa/util/matching.py
--- old/librosa-0.6.2/librosa/util/matching.py 2018-05-24 15:32:27.000000000 +0200
+++ new/librosa-0.6.3/librosa/util/matching.py 2019-02-13 22:28:41.000000000 +0100
@@ -204,8 +204,10 @@
try:
return __match_intervals(intervals_from, intervals_to, strict=strict)
- except ParameterError as exc:
- six.reraise(ParameterError, ParameterError('Unable to match intervals with strict={}'.format(strict)), sys.exc_info()[2])
+ except ParameterError:
+ six.reraise(ParameterError,
+ ParameterError('Unable to match intervals with strict={}'.format(strict)),
+ sys.exc_info()[2])
def match_events(events_from, events_to, left=True, right=True):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/util/utils.py new/librosa-0.6.3/librosa/util/utils.py
--- old/librosa-0.6.2/librosa/util/utils.py 2018-08-03 20:45:54.000000000 +0200
+++ new/librosa-0.6.3/librosa/util/utils.py 2019-02-13 22:28:41.000000000 +0100
@@ -780,6 +780,15 @@
def localmax(x, axis=0):
"""Find local maxima in an array `x`.
+ An element `x[i]` is considered a local maximum if the following
+ conditions are met:
+
+ - `x[i] > x[i-1]`
+ - `x[i] >= x[i+1]`
+
+ Note that the first condition is strict, and that the first element
+ `x[0]` will never be considered as a local maximum.
+
Examples
--------
>>> x = np.array([1, 0, 1, 2, -1, 0, -2, 1])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa/version.py new/librosa-0.6.3/librosa/version.py
--- old/librosa-0.6.2/librosa/version.py 2018-08-09 16:52:35.000000000 +0200
+++ new/librosa-0.6.3/librosa/version.py 2019-02-13 22:28:41.000000000 +0100
@@ -6,7 +6,7 @@
import importlib
short_version = '0.6'
-version = '0.6.2'
+version = '0.6.3'
def __get_mod_version(modname):
@@ -35,14 +35,18 @@
'joblib',
'decorator',
'six',
- 'resampy']
+ 'resampy',
+ 'numba']
extra_deps = ['numpydoc',
'sphinx',
'sphinx_rtd_theme',
'sphinxcontrib.versioning',
- 'matplotlib',
- 'numba']
+ 'sphinx-gallery',
+ 'pytest',
+ 'pytest-mpl',
+ 'pytest-cov',
+ 'matplotlib']
print('INSTALLED VERSIONS')
print('------------------')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa.egg-info/PKG-INFO new/librosa-0.6.3/librosa.egg-info/PKG-INFO
--- old/librosa-0.6.2/librosa.egg-info/PKG-INFO 2018-08-09 17:23:07.000000000 +0200
+++ new/librosa-0.6.3/librosa.egg-info/PKG-INFO 2019-02-13 22:29:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: librosa
-Version: 0.6.2
+Version: 0.6.3
Summary: Python module for audio and music processing
Home-page: http://github.com/librosa/librosa
Author: Brian McFee
@@ -134,6 +134,6 @@
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Description-Content-Type: text/markdown
-Provides-Extra: docs
Provides-Extra: display
Provides-Extra: tests
+Provides-Extra: docs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa.egg-info/SOURCES.txt new/librosa-0.6.3/librosa.egg-info/SOURCES.txt
--- old/librosa-0.6.2/librosa.egg-info/SOURCES.txt 2018-08-09 17:23:07.000000000 +0200
+++ new/librosa-0.6.3/librosa.egg-info/SOURCES.txt 2019-02-13 22:29:00.000000000 +0100
@@ -1,3 +1,7 @@
+AUTHORS.md
+CONTRIBUTING.md
+LICENSE.md
+MANIFEST.in
README.md
setup.cfg
setup.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/librosa.egg-info/requires.txt new/librosa-0.6.3/librosa.egg-info/requires.txt
--- old/librosa-0.6.2/librosa.egg-info/requires.txt 2018-08-09 17:23:07.000000000 +0200
+++ new/librosa-0.6.3/librosa.egg-info/requires.txt 2019-02-13 22:29:00.000000000 +0100
@@ -1,6 +1,6 @@
audioread>=2.0.0
numpy>=1.8.0
-scipy>=0.14.0
+scipy>=1.0.0
scikit-learn!=0.19.0,>=0.14.0
joblib>=0.12
decorator>=3.0.0
@@ -21,3 +21,6 @@
[tests]
matplotlib>=2.1
+pytest-mpl
+pytest-cov
+pytest<4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/setup.cfg new/librosa-0.6.3/setup.cfg
--- old/librosa-0.6.2/setup.cfg 2018-08-09 17:23:07.000000000 +0200
+++ new/librosa-0.6.3/setup.cfg 2019-02-13 22:29:00.000000000 +0100
@@ -1,6 +1,11 @@
[pycodestyle]
max-line-length = 119
+[tool:pytest]
+addopts = --cov-report term-missing --cov librosa --disable-pytest-warnings
+filterwarnings =
+ ignore:Using a non-tuple sequence:FutureWarning:scipy.*
+
[egg_info]
tag_build =
tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/librosa-0.6.2/setup.py new/librosa-0.6.3/setup.py
--- old/librosa-0.6.2/setup.py 2018-06-26 16:59:24.000000000 +0200
+++ new/librosa-0.6.3/setup.py 2018-12-03 17:51:54.000000000 +0100
@@ -1,8 +1,16 @@
from setuptools import setup, find_packages
+import sys
-import imp
-version = imp.load_source('librosa.version', 'librosa/version.py')
+if sys.version_info.major == 2:
+ import imp
+
+ version = imp.load_source('librosa.version', 'librosa/version.py')
+else:
+ from importlib.machinery import SourceFileLoader
+
+ version = SourceFileLoader('librosa.version',
+ 'librosa/version.py').load_module()
with open('README.md', 'r') as fdesc:
long_description = fdesc.read()
@@ -37,7 +45,7 @@
install_requires=[
'audioread >= 2.0.0',
'numpy >= 1.8.0',
- 'scipy >= 0.14.0',
+ 'scipy >= 1.0.0',
'scikit-learn >= 0.14.0, != 0.19.0',
'joblib >= 0.12',
'decorator >= 3.0.0',
@@ -50,7 +58,10 @@
'matplotlib >= 2.0.0',
'sphinxcontrib-versioning >= 2.2.1',
'sphinx-gallery'],
- 'tests': ['matplotlib >= 2.1'],
+ 'tests': ['matplotlib >= 2.1',
+ 'pytest-mpl',
+ 'pytest-cov',
+ 'pytest < 4'],
'display': ['matplotlib >= 1.5'],
}
)