WavePin (formerly known as IMDS) is a fully decentralized method of storing and distributing music. Nobody owns it and nobody has any more control over the storage and distribution of music than anyone else. WavePin allows anyone to host music, create a music player application, access the music, etc. WavePin does not provide listening analytics or streaming revenue, but services build on top of WavePin could implement these features on their own. WavePin aims to serve as a single yet decentralized backbone for online music distribution.
WavePin is built entirely on top of IPFS. It stores music files directly on the IPFS network and metadata as JSON objects which are also stored directly on the IPFS network as plain text. An album for example, will simply be a JSON object with metadata and a list of tracks which are also JSON objects with references to actual audio files, artwork, etc.
Audio files must be stored as WAV files. The highest quality possible is recommended. Encoding to smaller or lossy formats should be left up to applications and users. WavePin should be seen as the source of truth only.
							Tracks are stored as JSON objects which contain their metadata and reference their assets.
							Here is the format of a track object (note: colored text refers to information specific to a track):
						
{
	"contentType": "track",
	"wavepinVersion": "0.1",
	"date": "date the track was released",
	"version": "version of track",
	"versionDate": "date this version of the track was released",
	"title": "track title",
	"displayName": "artist names - track title (extra information)",
	"musicalKey": "key of track",
	"bpm": tempo of track,
	"description": "description of track",
	"notes": "other details about track",
	"artists": [
		{
			"name":"name of artist #1",
			"wavepinArtistUrl":"url to artist's discography",
			"role":"role of artist #1"
		},
		{
			"name":"name of artist #2",
			"wavepinArtistUrl":"url to artist's discography",
			"role":"role of artist #2"
		}
	],
	"recording":{
		"filename":"preferred name of file if downloaded",
		"cid":"ipfs cid"
	}
	"alternateRecordings": [
		{
			"filename":"preferred name of file if downloaded",
			"name":"name of version",
			"cid":"ipfs cid"
		}
	],
	"alternateLinks" : [
		{
			"name":"name of store/streaming service",
			"url":"url"
		}
	],
	"artwork": {
		"width":width in px if applicable,
		"height":height in px if applicable,
		"format":"file format",
		"cid":"ipfs cid"
	},
	"extraData": {"any JSON object"}
}
						Overview of properties:
Collections are lists of mixed content and can be used for playlists, albums, discographies, etc. Collections can hold other collections and can therefor be used for defining artist discographies, personal music collections or anything else. (note: colored text refers to information specific to a collection):
{
	"contentType": "collection",
	"wavepinVersion": "0.1",
	"collectionType": "type of collection"
	"date": "date the collection was released",
	"version": "version of collection",
	"versionDate": "date this version of the collection was released",
	"title": "collection title",
	"description": "description of collection",
	"notes": "other details about collection",
	"artists": [
		{
			"name":"name of artist #1",
			"wavepinArtistUrl":"url to artist's discography",
			"role":"role of artist #1"
		},
		{
			"name":"name of artist #2",
			"wavepinArtistUrl":"url to artist's discography",
			"role":"role of artist #2"
		}
	],
	"items": [
		"ipfs cid",
		"ipfs cid",
		"ipfs cid",
		"ipfs cid",
		"ipfs cid",
		"ipfs cid",
		"ipfs cid"
	],
	"artwork": {
		"width":width in px if applicable,
		"height":height in px if applicable,
		"format":"file format",
		"cid":"ipfs cid"
	},
	"extraData": {"any JSON object"}
}
						Overview of properties:
The artist data type is used to describe an artist. Typically an artist should register a domain and have the domain point to an artist object which can in turn point to all of that artist's music on IMDS.
{
	"contentType": "artist",
	"wavepinVersion": "0.1",
	"version": "version of artist data",
	"versionDate": "date this version of the artist data was released",
	"name": "artist name",
	"bio": "artist bio",
	"notes": "other details about the artist",
	"works": [
		"ipfs cid",
		"ipfs cid",
		"ipfs cid",
		"ipfs cid",
		"ipfs cid",
		"ipfs cid",
		"ipfs cid"
	],
	"profileImage": {
		"width":width in px if applicable,
		"height":height in px if applicable,
		"format":"file format",
		"cid":"ipfs cid"
	},
	"extraData": {"any JSON object"}
}
						Overview of properties:
Music players and other applications that intend to read music from WavePin under the WavePin should be able to handle any property missing
							This specification was written by Luke Branson
May 2023