Skip to main content

Post-processing for CREPE to turn f0 pitch estimates into discrete notes e.g. MIDI

Project description

CREPE notes

Post-processing for CREPE to turn f0 pitch estimates into discrete notes (MIDI)

https://github.com/xavriley/crepe_notes/assets/369527/4cc895f5-9bfe-47af-809d-0152933dc4c9

Demo video for pypi users also available here

Features

  • outputs midi notes for monophonic audio
  • include MIDI velocity information
  • includes options to filter notes that are too quiet or too short

Installation

pip install tensorflow # if you haven't already
pip install crepe-notes

Warning Python 3.10 and above will fail to run, due to this long running issue with madmom.

As a workaround, please run !pip install -e git+https://github.com/CPJKU/madmom#egg=madmom after installation

Basic Usage

crepe_notes [path_to_original_audio]

A '.mid' file will be created in the location of the audio file with the name [audio_file_stem].transcription.mid.

For additional options check out crepe_notes --help.

Min duration, min velocity and sensitivity

These are the three params you may need to tweak to get optimal results.

  • --min-duration is specified in seconds (e.g. 0.03 is 30ms). For fast, virtuosic music this is a reasonable default but for things like vocals and double bass lines a longer min duration (50ms or higher) may reduce the number of errors in your transcription.

  • --min-velocity is expressed as in MIDI e.g. 0 - 127. The default is 6 which removes any notes with velocities at or below that value, but you may find recordings with a higher noise floor benefit from a higher threshold.

  • --sensitivity relates to the peak picking threshold used on the combined signal (see paper for details) and defaults to 0.001. If the source material has an unstable pitch profile which results in a lot of short notes either side of a longer target note, increasing the sensitivity to 0.002 may help.

Caching data files

If you are running crepe_notes over an entire dataset, we recommend using the --save-analysis-files flag. This will write the following results:

  • crepe to [audio_file_stem].f0.csv.
  • madmom onset activations to [audio_file_stem].onsets.npz
  • amplitude envelope calculations to [audio_file_stem].amp_envelope.npz

This will speed up run times at the expense of some disk space.

About

This repo is the code to accompany the following paper:

X. Riley and S. Dixon, “CREPE Notes: A new method for segmenting pitch contours into discrete notes,” in Proceedings of the 20th Sound and Music Computing Conference, Stockholm, Sweden, 2023, pp. 1–5.

In the paper we propose a method of combining two things:

a) the gradient of the pitch contour from CREPE b) the (inverse) confidence of the pitch estimate from CREPE

This gives us a new signal which is a reliable indicator of note onsets, which we can then use to segment the pitch contour into discrete notes. For more details please see the paper or the demo video above.

Results

How good is it? For the datasets we've tested so far it looks promising.

  • FiloSax (24 hrs solo saxophone audio) - 90% F-measure (no offsets)
  • ITM GT Flute 99 - (20mins Irish trad flute) - 74% F-measure (no offsets) +7% over Basic Pitch
  • FiloBass (4 hrs double bass source separated stems) - 72% F-measure (no offsets) +10% over Basic Pitch

Please open a Github issue if you get results for any other public datasets - we'll try to include them in this repo.

Caveats

CREPE only works for monophonic audio, which means CREPE Notes only works for monophonic audio too. If you need polyphonic transcription, check out Basic Pitch.

Due to the way the algorithm works, repeated notes at the same pitch are treated as a special case and have to fall back to using a standard onset detector (madmom). The results might vary depending on the type of music you want to transcribe. For example, in a jazz saxophone solo it's relatively uncommon to repeat the same note. In a rock bass line however the opposite is true.

The onset detection library we use (madmom) has a licence which restricts commercial use. This restrictions is conferred onto CREPE Notes as a result - if you have a commercial use case please contact the madmom authors to discuss this.

Roadmap

  • (Distant goal) Add UI to aid with picking thresholds for velocity and note length
  • Experiment with edge preserving smoothing on the confidence thresholds to reduce spurious grace notes/glissandi

Credits

This package was created with Cookiecutter_ and the audreyr/cookiecutter-pypackage_ project template.

History

0.1.0 (2023-07-12)

  • First release on PyPI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

crepe_notes-0.1.3.tar.gz (29.6 kB view details)

Uploaded Source

Built Distribution

crepe_notes-0.1.3-py2.py3-none-any.whl (22.3 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file crepe_notes-0.1.3.tar.gz.

File metadata

  • Download URL: crepe_notes-0.1.3.tar.gz
  • Upload date:
  • Size: 29.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.12

File hashes

Hashes for crepe_notes-0.1.3.tar.gz
Algorithm Hash digest
SHA256 6554b2de6b1a9b46caf3f91f2514ee99e133cf7d8ba84cca991a640782b2de2a
MD5 433fc34edd12528e2fd6ecb432a49e04
BLAKE2b-256 d2145c44bea21e2e19f7a4acc04104d8e1fa9f7a14d24768e667f2a4432e92d5

See more details on using hashes here.

File details

Details for the file crepe_notes-0.1.3-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for crepe_notes-0.1.3-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 0340b45e2c6b510abf55e958e292e39086b2aa03a620463cdd77428ea67b270e
MD5 08b614210300a44f2df259b2191de661
BLAKE2b-256 3945447a094c5ab685bb1e8adc144934e59e82b4d79b6e6fae43950ac6c65371

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page