Kazan is an application where musicians can discover tracks, jam on them and republish for further collaboration
Kazan aims to be a decentralised platform where musicians with different skill levels (amateurs to professionals) will be able to discover tracks based on the instruments they play and then jam on them. Once republished, this track would then be available to other musicians who might feel like adding something more to the existing track. Each track should be well defined wrt who the collaborators are and the parent tracks. This would allow users to also checkout a parent component of a current track and see if a jam on the parent component sounds better. Content creators must have direct control over their own data and should be available in user buckets (on IPFS/Filecoin) created through Textile.
The prototype for Kazan supports the following actions:
Recording fresh tracks
Uploading recorded tracks with instrument tags
Recommendation of tracks based on instruments that user plays
Adding other music components to selected track
Uploading mixed tracks
Behind the scenes, when a track is uploaded/published, the audio data is stored through Textile Buckets on IPFS/Filecoin, while the metadata is stored on a centralised database that a Go backend server interacts with.
To recommend tracks to users to jam on, the metadata server is queried to get a list of tracks filtered by the instruments that the user does not play.
The mixing of audio tracks happens through Web Audio APIs and does a basic mixing of streams from MediaStreamAudioSourceNode and a MediaElementAudioSourceNode, with the mixed audio being redirected to a MediaStreamAudioDestinationNode and the default destination, which is the output device like a speaker. Before mixing can start, the MediaElementAudioSourceNode first loads the entire data from the IPFS URL associated with the selected track. There is a slight noticeable latency of around 100ms, while mixing the audio and needs further work.
The frontend UI is built on Vue JS and uses Vuetify for some of the components and has almost no external styling and makes the UI look quite ugly. Massive work needs to go on that front.
Kazan also uses @audius/hedgehog for identity management. When a user signs up, an entropy key is created based on the username and password, which is further used to generate an ethereumjs-wallet. The identity that is used to created Textile buckets is created using the keys generated through Hedgehog.