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 <[email protected]> + +- 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 [email protected]: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'], } )
