We’ve moved to updated standard

This proposal is an implementation of many of the crowdsourced contributions on this document organized by Garrett Hughes. The goal is to standardize some common properties specific to music NFTs (chain agnostic).

Feel free to leave comments with feedback & suggestions.

[Additional thoughts (open editing)](https://catalogworks.notion.site/Additional-thoughts-open-editing-6594b5206f6b49ea8b959458e9225d99)

Schema

{
	"version": string, // schema version
  "title": string,
  "artist": string,
  "description": string, // nullable
  "duration": number, // seconds
  "mimeType": string,
  "trackNumber": int, // nullable - starts at 1
  "project": { // nullable
      "title": string,
      "artwork": { // project artwork may be different from single artwork
		      "uri": string,
		      "mimeType": string,
		      "nft": { // nullable
						"chainId": string,
	          "contractAddress": string,
	          "tokenId": number,
						"externalUrl": string,
					}
		  },
			"notes": string, // nullable
			"numTracks": number,
			"type": string, // eg: *ep*, *album*, *compilation*
			"originalReleaseDate": DateTime ISO8601, // (or sumn) - nullable
			"recordLabel": string, // nullable
			"publisher": string, // nullable
			"compilation": boolean // this boolean matches ID3 tags but is redundant (very open to removing)
			"links": [string] // nullable - undecided on this one
  },
  "artwork": {
      "uri": string,
      "mimeType": string,
      "nft": {...} // nullable
  },
  "visualizer": { // nullable
	    "uri": string,
	    "mimeType": string,
	    "nft": {...} // nullable
  },
	"genre": string, // nullable
	"tags": [string], // nullable
	"lyrics": string, // nullable - could be their own NFT
	"bpm": number, // nullable
	"key": string, // nullable - open key notation (e.g. 6a)
	"language": string, // nullable
	"license": string,
	"isrc": string, // nullable
	"locationCreated": string, // nullable
	"recordedAt": string, // nullable
	"originalReleaseDate": DateTime ISO8601, // nullable - open to a different standard
	"recordLabel": string, // nullable
	"explicit": boolean, // nullable
	"credits": [ // nullable
			{
				"name": string, // e.g. Daddy Kev
				"collaboratorType": string, // e.g. composer, songwriter, performer, producer, mixingEngineer, masteringEngineer
			}
	],
	"links": [string], // nullable
	"lossyAudio": string, // nullable - possibly redundant w/ *animation_url*
	"isInstrumental": boolean,
	// proposed by Foundation 👇
	"thumbnail": string,
	// OpenSea standards 👇
	"image": string,
	"name": string,
	"external_url": string,
	"animation_url": string, // if this is lossless audio, should we include a mimeType?
	"attributes": {
		"artist" : string,
		"project": string, // nullable
		"bpm" : number, // nullable
		"key": string, // nullable
		"genre": string, // nullable
		"recordLabel": string, // nullable
	}
//	"losslessAudio": "<uri>", // redundant w/ contentURI & potentially animation_url
//	"samples": [],
//  "software": [],
//  "instruments": [],
// 	"isRemix": false,
//	"originalSong": "", // for remixes
//  "additionalMedia": [], // how does this compete w/ visualizer?
//  "livePerformance": {
//     venue, date, etc
//  }
}

Example

{
	"version": "music-nft-20220101", // schemaVersion - very open to a better name :)
  "title": "Our Taproot",
  "artist": "Omari Jazz",
  "description": null,
  "duration": 65.881,
  "mimeType": "audio/aiff",
  "trackNumber": 9,
  "project": {
      "title": "Dream Child",
      "artwork": {
		      "uri": "<https://ipfs.io/ipfs/bafybeibmxbxuw5n5hwmrhtyp2qlzgiu56qpzzwi3pbflbnbb4ykhhgy7gu>",
		      "mimeType": "image/jpeg",
		      "nft": {
		          "chainId": 1,
		          "contractAddress": "0x849880398bd686031ccb44c2cd00fac129654b55",
		          "tokenId": 4,
							"externalUrl": "<https://zora.co/collections/0x849880398bd686031ccb44c2cd00fac129654b55/4>",
		      }
		  },
			"notes": null
			"numTracks": 10,
			"type": "Album",
			"originalReleaseDate": "2020-06-05",
			"recordLabel": null,
			"publisher": null,
			"compilation": false,
			"links": [
				"<https://omarijazz.bandcamp.com/album/dream-child>",
				"<https://open.spotify.com/album/1P7wB0gMNW2a3mXnBqw0Nz>"
			]
  },
  "artwork": {
      "uri": "<https://ipfs.io/ipfs/bafybeibmxbxuw5n5hwmrhtyp2qlzgiu56qpzzwi3pbflbnbb4ykhhgy7gu>",
      "mimeType": "image/jpeg",
      "nft": {
          "chainId": 1,
          "contractAddress": "0x7C2668BD0D3c050703CEcC956C11Bd520c26f7d4",
          "tokenId": 147,
					"externalUrl": "<https://catalog.works/><0x7C2668BD0D3c050703CEcC956C11Bd520c26f7d4>/<147>",
      }
  },
  "visualizer": {
	   "uri": "<https://ipfs.io/ipfs/QmQnDQbc7wDnVdtXbdrbY5ifwGw6QPAQGLwBvrV444vPhH>",
	    "mimeType": "video/mp4",
	    "nft": null
  },
	"genre": "Future beats",
	"tags": ["chill", "dreamy"],
	"lyrics": null,
	"bpm": "93",
	"key": "6a", // open key notation
	"language": "English",
	"license": "CC0",
	"isrc": "QZHN62027539",
	"locationCreated": "Portland, OR",
	"recordedAt": null,
	"originalReleaseDate": "2020-06-05",
	"recordLabel": null,
	"explicit": false,
	"credits": [
			{
				"name": "Omari Jazz",
				"collaboratorType": "producer"
			},
			{
				"name": "Omari Jazz",
				"collaboratorType": "songwriter"
			},
			{
				"name": "Harris Cole",
				"collaboratorType": "masteringEngineer"
			},
			{
				"name": "Doplhin Midwives",
				"collaboratorType": "performer"
			},
			{
				"name": "B Timon",
				"collaboratorType": "performer"
			}
	],
	"links": [
		"<https://omarijazz.bandcamp.com/track/our-taproot>",
		"<https://open.spotify.com/track/4LcHzoQ7NhMO5SY519Hpbp?si=9a1ed309662743d9>"
	],
	"lossyAudio": "<https://ipfs.io/ipfs/bafybeibkwtsedsrh3kicasowmiwuserv32og5p4vycupsa7baa3qsw5cia>",
	"thumbnail": "<https://ipfs.io/ipfs/bafybeiff7devuutbbvgllcc6yuctawaazcpmfyngfbcnmebn2cca2gl66u>",
	"image": "<https://ipfs.io/ipfs/bafybeiff7devuutbbvgllcc6yuctawaazcpmfyngfbcnmebn2cca2gl66u>",
	"name": "Omari Jazz - Our Taproot",
	"external_url": "<https://catalog.works/0x7C2668BD0D3c050703CEcC956C11Bd520c26f7d4/147>",
	"animation_url": "<https://ipfs.io/ipfs/bafybeibkwtsedsrh3kicasowmiwuserv32og5p4vycupsa7baa3qsw5cia>",
	"attributes": {
		"artist" : "Omari Jazz",
		"project": "Dream Child",
		"bpm" : 93,
		"key": "6a",
		"genre": "Future beats",
		"recordLabel": null,
	}
}