Automatically find loop points of any song and play endlessly or export into intro/loop/outro sections or loop points.
Project description
PyMusicLooper
A script for repeating music seamlessly and endlessly, by automatically finding the best loop points.
Features:
- Find loop points within any music file (if they exist).
- Supports a large set of different audio formats, and all the popular ones (MP3, OGG, M4A, FLAC, WAV, etc).
- Play the music file endlessly and seamlessly with the best discovered loop.
- Export to intro/loop/outro sections for editing or seamless playback within any music player that supports gapless playback.
- Export loop points in samples (e.g. for use in creating custom themes with seamlessly looping audio).
Installation
Requires Python >=3.6 to run. This program depends on NumPy (for arrays and mathematical operations) and Librosa (for audio analysis and beat extraction). If you don't have these dependencies installed, they'll be automatically downloaded:
pip install git+https://github.com/arkrow/PyMusicLooper.git
To play music endlessly through the terminal, the external library mpg123
is required. Available through the following link: (https://www.mpg123.de/download.shtml).
Usage
usage: python -m pymusiclooper [-h] [-p] [-e] [-j] [-b] [-r] [-o OUTPUT_DIR]
[-m MIN_DURATION_MULTIPLIER]
path
Automatically find loop points in music files and play/export them.
positional arguments:
path path to music file.
optional arguments:
-h, --help show this help message and exit
-p, --play play the song on repeat with the best discovered loop
point (default).
-e, --export export the song into intro, loop and outro files (WAV
format).
-j, --json export the loop points (in samples) to a JSON file in
the song's directory.
-b, --batch batch process all the files within the given path
(usage with export args [-e] or [-j] only).
-r, --recursive process directories and their contents recursively
(usage with [-b/--batch] only).
-o OUTPUT_DIR, --output-dir OUTPUT_DIR
specify a different output directory.
-m MIN_DURATION_MULTIPLIER, --min-duration-multiplier MIN_DURATION_MULTIPLIER
specify minimum loop duration as a multiplier of song
duration (default: 0.35)
PyMusicLooper will find the best loop point it can detect, and will then, depending on your arguments:
(a) play the song on repeat using the best discovered loop point (default, requires mpg123);
(b) export intro/loop/outro sections of the song (currently outputs as WAV-only, although you may convert with ffmpeg or Audacity);
(c) export the loop points (in samples) to a JSON text file, which you can use for audio loops in custom theme creation, etc.
Example Usage
Note: If on Windows, you can Shift+Right-Click in an empty spot in the song's folder and choose command-line/powershell from the context menu. Otherwise, cd/dir to the folder.
Play the song on repeat with the best discovered loop point.
python -m pymusiclooper "Song I Could Listen To Forever.mp3"
Export the song into intro, loop and outro files, as well as the loop points used.
python -m pymusiclooper -ej "some music track.ogg"
Export the loop points of all the songs in the current directory.
python -m pymusiclooper -bj .
The I WANT IT ALL option. Export intro/loop/outro sections and loop points of all the songs in the current directory and its subdirectories, to a folder called "Music Loops".
python -m pymusiclooper -brej . -o "Music Loops"
If the loop is very long (or very short), you may specify a different minimum duration for the algorithm to use, which is 0.35 (35%) by default.
If the most of the track is the loop section, specifying a higher multiplier will also speed the algorithm up.
Here -m 0.85
means that, excluding silence, the loop section is at least 85% of the music track.
python -m pymusiclooper "super long track.flac" -m 0.85
Building from source
Requried python packages: pip
and setuptools
.
Clone the git repository to a directory of your choice and cd to inside the repo.
Run:
python setup.py build
Followed by:
python setup.py install
Contribution
If there is a song that you think PyMusicLooper should be able to loop but doesn't, please feel free to open an issue with a link to that song and mention the approximate timestamp at which it loops. Forks and pull requests are of course welcome.
Acknowledgement
This project started out as a fork of Nolan Nicholson's project Looper. Although at this point only a few lines of code remain from that project due to adopting a completely different approach and implementation, without their contributions this project would not have been possible.
Version History
- v1.2.1 Save export output to a "looper_output" folder in the current working directory by default
- v1.2.0 Removed unreliable cache implementation
- v1.1.0 Added support for batch processing
- v1.0.0 Initial Release
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.