Initial registry scaffold with example CTP files
This commit is contained in:
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
.DS_Store
|
||||
*.swp
|
||||
*~
|
||||
Thumbs.db
|
||||
59
README.md
Normal file
59
README.md
Normal file
@@ -0,0 +1,59 @@
|
||||
# ClickTrack Registry
|
||||
|
||||
A community collection of CTP 1.0 tempo map files for use with ClickTrack.
|
||||
|
||||
## What is this?
|
||||
|
||||
This repository contains crowd-sourced tempo maps in the CTP (Click Track Protocol) 1.0 format. ClickTrack syncs these files on a configurable interval and imports them into its database, making them available to all users of your instance.
|
||||
|
||||
Files must be valid CTP 1.0 JSON. ClickTrack validates each file on sync and skips any that fail validation, logging the errors.
|
||||
|
||||
## File Format
|
||||
|
||||
Each file is a `.ctp.json` document describing the tempo map for a single recording. See the example files in this repo for the full structure. Required top-level fields: `version`, `metadata`, `count_in`, `sections`.
|
||||
|
||||
For full schema documentation, refer to the [ClickTrack project](https://github.com/your-org/clicktrack).
|
||||
|
||||
## Folder Structure
|
||||
|
||||
Files are organized by artist to keep the repo navigable:
|
||||
|
||||
```
|
||||
<first-letter-of-artist-slug>/<artist-slug>/<mbid>.ctp.json
|
||||
```
|
||||
|
||||
The artist slug is the artist name lowercased, spaces replaced with hyphens, non-alphanumeric characters removed:
|
||||
|
||||
| Artist | Slug | Path prefix |
|
||||
|------------|----------------|-----------------|
|
||||
| Journey | `journey` | `j/journey/` |
|
||||
| Don Henley | `don-henley` | `d/don-henley/` |
|
||||
| AC/DC | `acdc` | `a/acdc/` |
|
||||
| The Beatles| `the-beatles` | `t/the-beatles/`|
|
||||
|
||||
The filename is the MusicBrainz Recording UUID with the `.ctp.json` extension.
|
||||
|
||||
## Contributing a Tempo Map
|
||||
|
||||
1. **Find the MusicBrainz Recording ID** for the song at [musicbrainz.org](https://musicbrainz.org). It's the UUID in the recording URL — make sure it's a *Recording* ID, not an album or artist ID.
|
||||
|
||||
2. **Create the folder path** from the artist name using the slug convention above.
|
||||
|
||||
3. **Name the file** `<mbid>.ctp.json`.
|
||||
|
||||
4. **Fill in all required fields.** Use the example files as a reference:
|
||||
- `metadata.mbid` must be the real MusicBrainz Recording UUID
|
||||
- `metadata.verified` should be `false` unless you have listened to the song and confirmed the tempo map is accurate
|
||||
- `metadata.contributed_by` should be your name or handle
|
||||
|
||||
5. **Open a merge/pull request.**
|
||||
|
||||
## Notes
|
||||
|
||||
### MusicBrainz ID
|
||||
|
||||
`mbid` must be a real MusicBrainz Recording UUID. ClickTrack skips any file where `mbid` is null or missing — it is required for the file to be imported.
|
||||
|
||||
### Verified Flag
|
||||
|
||||
`verified: true` means a human has listened to the recording and confirmed the tempo map is accurate. Verified maps are ranked higher in ClickTrack search results. Leave it `false` for AI-generated or unconfirmed maps.
|
||||
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"version": "1.0",
|
||||
"metadata": {
|
||||
"title": "Example Song",
|
||||
"artist": "Example Artist",
|
||||
"mbid": "00000000-0000-0000-0000-000000000001",
|
||||
"duration_seconds": 214,
|
||||
"contributed_by": "your-name",
|
||||
"verified": false,
|
||||
"created_at": "2026-01-01T00:00:00.000Z"
|
||||
},
|
||||
"count_in": {
|
||||
"enabled": true,
|
||||
"bars": 2,
|
||||
"use_first_section_tempo": true
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"label": "Intro",
|
||||
"start_bar": 1,
|
||||
"bpm": 120,
|
||||
"time_signature": { "numerator": 4, "denominator": 4 },
|
||||
"transition": "step"
|
||||
},
|
||||
{
|
||||
"label": "Verse",
|
||||
"start_bar": 5,
|
||||
"bpm": 120,
|
||||
"time_signature": { "numerator": 4, "denominator": 4 },
|
||||
"transition": "step"
|
||||
},
|
||||
{
|
||||
"label": "Chorus",
|
||||
"start_bar": 13,
|
||||
"bpm": 120,
|
||||
"time_signature": { "numerator": 4, "denominator": 4 },
|
||||
"transition": "step"
|
||||
},
|
||||
{
|
||||
"label": "Outro",
|
||||
"start_bar": 57,
|
||||
"bpm": 120,
|
||||
"time_signature": { "numerator": 4, "denominator": 4 },
|
||||
"transition": "step"
|
||||
}
|
||||
]
|
||||
}
|
||||
48
j/journey/00000000-0000-0000-0000-000000000002.ctp.json
Normal file
48
j/journey/00000000-0000-0000-0000-000000000002.ctp.json
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"version": "1.0",
|
||||
"metadata": {
|
||||
"title": "Don't Stop Believin'",
|
||||
"artist": "Journey",
|
||||
"mbid": "00000000-0000-0000-0000-000000000002",
|
||||
"duration_seconds": 251,
|
||||
"contributed_by": "your-name",
|
||||
"verified": false,
|
||||
"created_at": "2026-01-01T00:00:00.000Z"
|
||||
},
|
||||
"count_in": {
|
||||
"enabled": true,
|
||||
"bars": 2,
|
||||
"use_first_section_tempo": true
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"label": "Intro",
|
||||
"start_bar": 1,
|
||||
"bpm": 118,
|
||||
"time_signature": { "numerator": 4, "denominator": 4 },
|
||||
"transition": "step"
|
||||
},
|
||||
{
|
||||
"label": "Verse 1",
|
||||
"start_bar": 5,
|
||||
"bpm": 118,
|
||||
"time_signature": { "numerator": 4, "denominator": 4 },
|
||||
"transition": "step"
|
||||
},
|
||||
{
|
||||
"label": "Chorus",
|
||||
"start_bar": 21,
|
||||
"bpm": 118,
|
||||
"time_signature": { "numerator": 4, "denominator": 4 },
|
||||
"transition": "step"
|
||||
},
|
||||
{
|
||||
"label": "Outro",
|
||||
"start_bar": 57,
|
||||
"bpm_start": 118,
|
||||
"bpm_end": 108,
|
||||
"time_signature": { "numerator": 4, "denominator": 4 },
|
||||
"transition": "ramp"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user