scoreseek
Find a musical score by metadata — across many sources, behind one call.
import scoreseek
hits = scoreseek.search("Cooley's") # out of the box: The Session (CC-BY-SA)
ref = hits[0]
path = ref.fetch() # -> a local .abc file
# hand straight to audiate.render(path) to hear it
Every hit is a license-tagged ScoreRef, so public-domain / permissive
results stay cleanly separated from copyrighted / gray ones — searches are
copyright-safe by default.
Install
pip install scoreseek # zero required dependencies
pip install "scoreseek[render]" # + audiate, to render hits to audio
Why
Scores live in many places — public-domain corpora (PDMX, IMSLP, OpenScore),
downloadable datasets, chord/lyric collections, and your own folders. scoreseek
puts them behind one pluggable-source interface and tags every result with a
license, so you can ask for "only what I can legally build on" or opt into
copyrighted material explicitly.
Sources
A source answers search(query) -> [ScoreRef] and optionally fetch(ref) -> path.
Register any object with that shape.
On by default (zero-config, lightweight, cleanly licensed):
| Source | What | License |
|---|---|---|
thesession |
thesession.org traditional tunes (ABC) | CC-BY-SA 4.0 |
openscore_lieder |
~1,356 OpenScore art songs (compressed MusicXML) | CC0 |
Opt-in (import from scoreseek.sources and register_source(...) — heavier, or license-gated):
| Source | What | License | Notes |
|---|---|---|---|
IMSLPSource |
IMSLP/Petrucci public-domain classical | Public Domain | live API; mostly PDF, some MIDI |
PDMXSource |
250K Public-Domain MusicXML corpus | PD / CC0 | local corpus — one-time download (see below) |
ChordonomiconSource |
680K chord progressions | CC-BY-NC (gray lane) | no title/artist — genre/chord-text search |
KaggleChordsSource |
135K chords+lyrics songs (via sung) |
scraped / gray | needs Kaggle creds + a ~283 MB download |
LocalFolderSource |
a folder of .mid/MusicXML/ABC/kern files |
you set it | offline |
from scoreseek import register_source, License
from scoreseek.sources import IMSLPSource, LocalFolderSource
register_source(IMSLPSource()) # opt in to IMSLP
register_source(LocalFolderSource("~/scores", license=License.PUBLIC_DOMAIN))
hits = scoreseek.search("nocturne", composer="Chopin", sources=["imslp"])
hits = scoreseek.search("hey jude", allow_copyrighted=True) # opt into gray/copyrighted
Canonicalize a messy query (MusicBrainz)
normalize=True resolves a fuzzy "title [+ artist]" to a canonical work via
MusicBrainz before searching (adds a ~1 s network round-trip), and stamps the
resolved MBID onto each hit:
hits = scoreseek.search("moonlight sonata beethovan", normalize=True)
PDMX: a local public-domain corpus
PDMX ships only as bulk tarballs, so PDMXSource searches a local extraction.
Download once (index-only = 225 MB; + MusicXML = ~2.1 GB) from
Zenodo record 15571083 and point the
source at it:
from scoreseek.sources import PDMXSource
register_source(PDMXSource("~/pdmx")) # dir with PDMX.csv (+ extracted mxl/, mid/)
search() works with just PDMX.csv; fetch() needs the extracted mxl//mid/
trees and otherwise raises with the exact tarball URL to download.
Write your own source
from scoreseek.sources import Source
from scoreseek.base import License
class MySource(Source):
name = "mine"
license = License.CC0
def search(self, query="", *, title="", composer="", limit=10):
return [self._ref(title="...", id="...", formats=("musicxml",))]
def fetch(self, ref, *, fmt=None):
...
return "/path/to/score.musicxml"
License tags
License classifies each hit: PUBLIC_DOMAIN, CC0, PERMISSIVE (CC-BY/-SA,
MIT, …), NONCOMMERCIAL (CC-BY-NC), COPYRIGHTED, GRAY (scrapes/unspecified),
UNKNOWN.
search(..., allow_copyrighted=False) (the default) is copyright-safe: it
returns the commercial-safe lanes (PUBLIC_DOMAIN/CC0/PERMISSIVE) plus
UNKNOWN (unclassified provenance, e.g. your own local folders), and drops the
restricted lanes — COPYRIGHTED, GRAY, and NONCOMMERCIAL (a known usage
restriction). Pass allow_copyrighted=True to include them.
Where it fits
scoreseek is the search stage of a larger pipeline:
scoreseek (find a score) → audiate
(render to audio) → arioso
(AI-enhance).
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file scoreseek-0.0.3.tar.gz.
File metadata
- Download URL: scoreseek-0.0.3.tar.gz
- Upload date:
- Size: 24.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.33 {"installer":{"name":"uv","version":"0.11.33","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e487d592fcfd86f76fba19d1adc1c9f8dd10f6751f994b41d204bee0a823eeff
|
|
| MD5 |
bab37d37626bbc6e991ce0b01af5f04d
|
|
| BLAKE2b-256 |
9028c5331b36ffba131786f13e5d54c01ab328a42d0643244244a236514c987e
|
File details
Details for the file scoreseek-0.0.3-py3-none-any.whl.
File metadata
- Download URL: scoreseek-0.0.3-py3-none-any.whl
- Upload date:
- Size: 32.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.33 {"installer":{"name":"uv","version":"0.11.33","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eea6c67cbe4baae553e944269be3229b02b331cecffe3beafdba35e124f88b97
|
|
| MD5 |
44ff798cf796ad0ece5a097146be1af1
|
|
| BLAKE2b-256 |
a8cde463a6c49659d358406352df8d102280db0bd6e11f32006b554ab7e9efe1
|