Skip to main content

CIP-0060

Abstract

This proposal defines an extension to CIP-25 and CIP-68 for token metadata specific to music tokens.

Motivation: why is this CIP necessary?

Music tokens on Cardano can be either NFTs or FTs and contain links to audio files. In order for players, indexers, and wallets to be able to properly search and categorize a user's music collection, we need to define a common schema for creating music on Cardano. If all parties creating these music tokens follow similar patterns, apps can consume this information and make proper use of it. The existing CIP-25 is a good base to build upon, but for a good music experience, we need to standardize additional fields that will be required specifically for music tokens.

Specification

This CIP divides the additional metadata parameters into two categories of Required and Optional. When minting a music token on Cardano, you are expected to include ALL of the required fields. If you choose to include one or more of the optional fields, they must be named exactly as defined in this CIP. This will properly allow indexing apps and music players to utilize as much of your token metadata as possible without issues.

CDDL Spec Version 3 CDDL Spec Version 2 (deprecated) CDDL Spec Version 1 (deprecated)

Summary of v2 Changes

In version 2 of the CIP-60 spec, album_title has been renamed to release_title. release is a more generic name that covers all types of releases from Albums, EPs, LPs, Singles, and Compilations. At the top level, we are grouping those metadata items that relate to the release under a new key release. At the file for each song, there is a new song key that holds the metadata specific to the individual song. These changes separate the music-specific metadata from the general CIP-25/CIP-68 NFT metadata. A music player can look at just the information necessary instead of having to ignore extra NFT-related fields. CIP-68 NFTs are officially supported and an example specific to CIP-68 has been added below.

Summary of v3 Proposed Changes

Version 3 reorders identifiers like IPN, ISNI, etc into objects tied with the entities they are associated with. contributing_artists, artists, and featured_artists fields are explicitly defined to reduce interpretation. ipi array replaced with author array, which includes ipi key. Removed the parental_advisory field, as it was redundant (explicit is all players need to look for). lyricist is removed and merged into contributing_artist, under role. copyright adds master and composition to distinguish recording and composition copyright owners. Certain fields may be included in release within "Album/EP" release_type if they are qualifying GRAM (Group Registration for Works on an Album of Music) publications. This is done in order to help conserve data in otherwise redundant entries.

Required Fields

FieldTypeExample(s)Notes
artistsArray"artists": [{"name": "Sick City", "isni":"xxxxxxxxxxxxx", "links:{ "website":"https://sickcity.xyz"}}]Players should use these values to determine the song's artist, and should be kept minimal. isni and links are optional. Included in song for "Single" and "Multiple" releases, and in release for "Album/EP" types.
release_titleString"release_title": "Mr. Bad Guy"Included in release
track_numberInteger"track_number": 1Included in song
song_titleStringArray"song_title": "Let's Turn it On"
song_durationString"song_duration": "PT3M21S"ISO8601 Duration Format, included in song https://www.iso.org/iso-8601-date-and-time-format.html
copyrightString"copyright": {"master":"℗ 1985 Sony Records", "composition":"© 1985 Marvin Gaye"} or "copyright": {"composition": "Public Domain", "master": "℗ 2024 Cool Guy"}Included in release within "Album/EP" release_type (ONLY IF ALL compositions are owned by the same artist) , and in song within "Single" and "Multiple" releases.
genresArray"genres": ["Rock","Classic Rock"]Limited to 3 genres total. Players should ignore extra genres. Included in song within "Single" and "Multiple" releases, and in release for "Album/EP" releases should all songs share the same genre values.
release_typeEnum"release_type": "Single"Must be "Single", "Album/EP" for GRAM (Group Registration for Works on an Album of Music- https://www.copyright.gov/rulemaking/gram/) publications, or "Multiple" (for all other cases"). "Multiple" and "Album/EP" releases need to be wary of txn size limits . Included in release
music_metadata_versionInteger"music_metadata_version" : "3"Players should look for the presence of this field to determine if the token is a Music Token. Use integers only.

Optional Fields

FieldTypeExample(s)Notes
isniString"artists": [{"name": "Sick City", "isni":"xxxxxxxxxxxxx", "links:{ "website":"https://sickcity.xyz"}}]Included in song with artists and featured_artists
linksMap"artists": [{"name": "Sick City", "isni":"xxxxxxxxxxxxx", "links:{ "website":"https://sickcity.xyz"}}]Included in artists and featured_artist, and in release where applicable, i.e. if a "Multiple" release_type is a single artist album and has recurring links
ai_generatedBoolean"ai_generated": "true"Used to distinguish works that are entirely AI generated.
contributing_artistsArray"contributing_artists": [{"name":"Jimmy Londo", "ipi":"158743685", "role":["guitars", "vocals"]}]Contributing artist are defined as any creative contributor who is not necessarily identified as an author, but will receive performance royalties when applicable. eg, a band would place the band name in artists, while the band members would be listing individually here. Should not pass to players, but readable within metadata. May contain ipn or ipi (based on use/jurisdiction, i.e. ipi within the US; enables indexing of similarly named contributors) links, and role, all of which are optional
ipnString"contributing_artists": [{"name":"Jimmy Londo", "ipn":"158743685", "role":["guitars", "vocals"]}]Included in song within contributing_artists where used (typically outside US, though internationally recognized.)
rolestring"contributing_artists": [{"name":"Jimmy Londo", "ipi":"158743685", "role":["guitars", "vocals"]}]Included in song within contributing_artists (declares a contributor's role/contribution to the work), as well as authors (establishing role in songwriting, following "Roles" from ASCAP)
seriesstring"series": "That's What I call Music"Included in release
collectionstring"collection": "Now Dance"Included in release
setstring"set": "86 - 20 Smash Dance Hits of the Year"If the song is a part of a collection of songs, such as an album, EP, live performance, etc. that is separate from this release, it can be listed here. Included in song
moodString"mood": "Empowered"Included in song
lyricsURL"lyrics": "ipfs://QmSmadTEhB9bJQ1WHq58yN1YZaJo4jv5BwVNGaePvEj4Fy"Included in song
special_thanksArray"special_thanks": ["Your mom","Your grandma"]Included in song
visual_artistString"visual_artist": "beeple"Included in release
distributorString"distributor": "https://newm.io"Included in release
release_dateString"release_date": "2022-07-27"ISO8601 Date Format, included in release
publication_dateString"publication_date": "2022-07-27"ISO8601 Date Format, included in release https://www.iso.org/iso-8601-date-and-time-format.html
catalog_numberInteger"catalog_number": REC#4582Catalog numbers for digital releases should only be entered if the label or digital distributor has given a unique catalog number for the release. Included in release
bitrateString"bitrate": "256 kbit/s"Included in song
bpmString"bpm": "120 BPM"Included in song
mix_engineerString"mix_engineer": "Robert Smith II"Included in song for "Single" and "Multiple" release_type, and in release for "Album/EP" types (if shared across the entire release, otherwise, in song).
mastering_engineerString"mastering_engineer": "Michael Tyson"Included in song
producerString"producer": "Simon Cowell"Included in song for "Single" and "Multiple" release_type, and in release for "Album/EP" types (if shared across the entire release, otherwise, in song).
co_producerString"co_producer": "Shavaun Dempsey"Included in song for "Single" and "Multiple" release_type, and in release for "Album/EP" types (if shared across the entire release, otherwise, in song).
featured_artistsArray"featured_artists": [{"name":"Paul McCartney", isni":"xxxxxxxxx", "links"{"website":"www.paulmccartney.com"} }]feautured_artists should be passed to players along with the artists, and should be expected to appear as "artistName(s) ft. featuredArtist(s)". Contains isni and links keys, included in song Should be kept minimal.
recording_engineerString"recording_engineer": "Sharon Liston"Included in song for "Single" and "Multiple" release_type, and in release for "Album/EP" types (if shared across the entire release, otherwise, in song).
explicitBoolean"explicit": trueIncluded in song
isrcString"isrc": "US-SKG-22-12345"Included in song
iswcString"iswc": "T-123456789-Z"Included in song
authorsArray"authors": [{"name":"Mark Ronson", "ipi:"157896357", "share":"25%"}]Publishers and authors will be listed here. May contain ipi, role, and share. Included in song
ipiString"authors": [{"name":"Mark Ronson", ipi:"157896357", "role":"Composer/Author", "share":"25%"}]Included in song within authors and contributing_artists
shareString"authors": [{"name":"Mark Ronson", ipi:"157896357", "share":"25%"}]Included in song within authors. Total percentage of all listed authors' shares MUST equal 100%
metadata_languageString"metadata_language": "en-US"https://tools.ietf.org/search/bcp47
country_of_originString"country_of_origin": "United States"Included in song
languageString"language": "en-US"https://tools.ietf.org/search/bcp47
derived_fromString"derived_from" : "Some other work"Included in song

Examples

Single Release

{
"721": {
"": {
"": {
"name": "",
"image": "",
"music_metadata_version": 3,
"release": {
"release_type": "",
"release_title": "",
"distributor": ""
},
"files": [
{
"name": "",
"mediaType": "",
"src": "",
"song": {
"song_title": "",
"song_duration": "PTMS",
"track_number": "",
"mood": "",
"artists": [
{
"name:": "",
"isni": "",
"links": {
"": "",
"": "",
"": ""
}
},
{
"name:": "",
"isni": "",
"links": {
"": "",
"": "",
"": ""
}
}
],
"featured_artists": [
{
"name:": "",
"isni": "",
"links": {
"": "",
"": "",
"": ""
}
},
{
"name:": "",
"isni": "",
"links": {
"": "",
"": "",
"": ""
}
}
],
"authors": [
{
"name": "",
"ipi": "",
"share": ""
},
{
"name": "",
"ipi": "",
"share": ""
},
{
"name": "",
"ipi": "",
"share": ""
}
],
"contributing_artists": [
{
"name": "",
"ipn": "",
"role": [
"",
""
]

},
{
"name": "",
"ipi": "",
"role": [
"",
""
]

},
{
"name": "",
"ipi": "",
"role": [
"",
""
]

}
],
"collection": "",
"genres": [
"",
"",
""
],
"copyright": {"master": "℗ ", "composition": "© "}
}
}

]
}
}
}
}

Album Release

{
"721": {
"c00d776a22ca5db986039420b2a9b3f880d593136a9e2262fabeeb58": {
"ZiplineFromOuterspace": {
"name": "Refraktal - Zipline From Outerspace",
"image": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"music_metadata_version": 3,
"release": {
"release_type": "Album/EP",
"release_title": "Zipline From Outerspace",
"copyright": {
"master": "℗ 2024 Refraktal",
"composition": "© 2024 Refraktal"
},
"artists": [
{
"name:": "Refraktal",
"isni": "0000000517483974",
"links": {
"website": "https://refraktal.com",
"exclusive_content": "https://refraktalnft.duckdns.org"
}
}
],
"contributing_artists": [
{
"name": "Sudo Scientist",
"ipi": "1251891449",
"role": [
"guitar on VOID and Lullaby for My Demons",
"synth",
"programming"
]
},
{
"name": "RX the Pharm Tech",
"ipi": "1251891057",
"role": [
"guitar on Bellywub",
"synth",
"programming"
]
}
],
"genre": [
"Electronic",
"Experimental",
"Psychedelic"
]
},
"files": [
{
"name": "Void",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Void",
"song_duration": "PT4M21S",
"track_number": "1",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Bellywub",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Bellywub",
"song_duration": "PT5M31S",
"track_number": "2",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Lullaby for my Demons",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Lullaby for My Demons",
"song_duration": "PT3M11S",
"track_number": "3",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Meliorism",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Meliorism",
"song_duration": "PT4M21S",
"track_number": "4",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Zipline From Outerspace",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Zipline From Outerspace",
"song_duration": "PT3M36S",
"track_number": "5",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT2M12S",
"track_number": "6",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "7",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "8",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "9",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "10",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "11",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "12",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "13",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "14",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "15",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "16",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "17",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "18",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "19",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
},
{
"name": "Another Cool Song",
"mediaType": "audio/wav",
"src": "ipfs://QmeeHGqiRo8gvAfhG6MuHSTKv6rQpw2bxbnDkAPYvt9jD2",
"song": {
"song_title": "Another Cool Song",
"song_duration": "PT3M36S",
"track_number": "20",
"isrc": "US-SKG-22-12345",
"iswc": "T-123456789-Z"
}
}
]
}
}
}
}

CIP-68

{
"constructor": 0,
"fields": [
{
"map": [
{"k": {"bytes": "373231"}, "v": {
"map": [
{"k": {"bytes": ""}, "v": {
"map": [
{"k": {"bytes": ""}, "v": {
"map": [
{"k": {"bytes": "6E616D65"}, "v": {"bytes": ""}},
{"k": {"bytes": "696D616765"}, "v": {"bytes": ""}},
{"k": {"bytes": "6D757369635F6D657461646174615F76657273696F6E"}, "v": {"int": 3}},
{"k": {"bytes": "72656C65617365"}, "v":
{
"map": [
{"k": {"bytes": "72656C656173655F74797065"}, "v": {"bytes": ""}},
{"k": {"bytes": "72656C656173655F7469746C65"}, "v": {"bytes": ""}},
{"k": {"bytes": "6469737472696275746F72"}, "v": {"bytes": ""}}
]
}
},
{"k": {"bytes": "66696C6573"}, "v":
{
"array": [
{
"map": [
{"k": {"bytes": "6E616D65"}, "v": {"bytes": ""}},
{"k": {"bytes": "6D6564696154797065"}, "v": {"bytes": ""}},
{"k": {"bytes": "737263"}, "v": {"bytes": ""}},
{"k": {"bytes": "736F6E67"}, "v":
{
"map": [
{"k": {"bytes": "736F6E675F7469746C65"}, "v": {"bytes": ""}},
{"k": {"bytes": "736F6E675F6475726174696F6E"}, "v": {"bytes": "MS>"}},
{"k": {"bytes": "747261636B5F6E756D626572"}, "v": {"int": ""}},
{"k": {"bytes": "6D6F6F64"}, "v": {"bytes": ""}},
{"k": {"bytes": "61727469737473"}, "v":
{
"array": [
{
"map": [
{"k": {"bytes": "6E616D65"}, "v": {"bytes": ""}},
{"k": {"bytes": "69736E69"}, "v": {"bytes": ""}},
{"k": {"bytes": "6C696E6B73"}, "v":
{
"map": [
{"k": {"bytes": ""}, "v": {"bytes": ""}},
{"k": {"bytes": ""}, "v": {"bytes": ""}},
{"k": {"bytes": ""}, "v": {"bytes": ""}}
]
}
}
]
}
]
}
},
{"k": {"bytes": "6665617475726564_61727469737473"}, "v":
{
"array": [
{
"map": [
{"k": {"bytes": "6E616D65"}, "v": {"bytes": ""}},
{"k": {"bytes": "69736E69"}, "v": {"bytes": ""}},
{"k": {"bytes": "6C696E6B73"}, "v":
{
"map": [
{"k": {"bytes": ""}, "v": {"bytes": ""}},
{"k": {"bytes": ""}, "v": {"bytes": ""}},
{"k": {"bytes": ""}, "v": {"bytes": ""}}
]
}
}
]
}
]
}
},
{"k": {"bytes": "617574686F7273"}, "v":
{
"array": [
{
"map": [
{"k": {"bytes": "6E616D65"}, "v": {"bytes": ""}},
{"k": {"bytes": "697069"}, "v": {"bytes": ""}},
{"k": {"bytes": "7368617265"}, "v": {"bytes": ""}}
]
}
]
}
},
{"k": {"bytes": "636F6E747269627574696E675F61727469737473"}, "v":
{
"array": [
{
"map": [
{"k": {"bytes": "6E616D65"}, "v": {"bytes": ""}},
{"k": {"bytes": "697069"}, "v": {"bytes": ""}},
{"k": {"bytes": "726F6C65"}, "v":
{
"array": [
{"bytes": ""},
{"bytes": ""}
]
}
}
]
}
]
}
},
{"k": {"bytes": "636F6C6C656374696F6E"}, "v": {"bytes": ""}},
{"k": {"bytes": "67656E726573"}, "v":
{
"array": [
{"bytes": ""},
{"bytes": ""},
{"bytes": ""}
]
}
},
{"k": {"bytes": "636F707972696768"}, "v":
{
"map": [
{"k": {"bytes": "6D6173746572"}, "v": {"bytes": ""}},
{"k": {"bytes": "636F6D706F736974696F6E"}, "v": {"bytes": ""}}
]
}
}
]
}
}
]
}
]
}
}
]
}}
]
}}
]
}}
]
},
{
"int": 1
}
]
}

Rationale: how does this CIP achieve its goals?

Implementing this simplifies and commonizes the process for creating music tokens on Cardano. It greatly simplifies the work that apps have to make when consuming such tokens.

This CIP is the result of several online meetings between many different companies building music-related projects on top of Cardano. These meetings were organized as many in the community started to see fragmentation in the way music NFTs were being minted on Cardano. These meetings gave the opportunity for a bit of a reset and will allow a much brighter future for music on Cardano. As long as all projects agree on some of these basic fields, there is great flexibility in this CIP to do application-specific unique things on top of the music NFT itself. The CIP is intentionally open-ended and can be updated in future versions if there are additional fields that the wider group could benefit from.

Path to Active

Acceptance Criteria

  • Has been implemented by a number of parties, including:

Implementation Plan

  • Consensus of companies building music-related Cardano projects to develop a mutually beneficial metadata vocabulary.

This CIP is licensed under CC-BY-4.0

CIP Information

This null ./CIP-0060 created on 2022-07-26 has the status: Active.
This page was generated automatically from: cardano-foundation/CIPs.