def compute_distance(self, a, b): if a in self.intonationmap: #print " -hit a" adata = self.intonationmap[a] else: try: adata = util.docserver_get_json(a, "normalisedpitch", "normalisedhistogram") except docserver.models.Document.DoesNotExist: return None self.intonationmap[a] = adata if b in self.intonationmap: #print " -hit b" bdata = self.intonationmap[b] else: try: bdata = util.docserver_get_json(b, "normalisedpitch", "normalisedhistogram") except docserver.models.Document.DoesNotExist: return None self.intonationmap[b] = bdata if (a, b) in self.distancemap: #print " -hit d-ab" distance = self.distancemap[(a, b)] elif (b, a) in self.distancemap: #print " -hit d-ba" distance = self.distancemap[(b, a)] else: distance = recording.kldiv(adata, bdata) self.distancemap[(a, b)] = distance return distance
def compute_distance(self, a, b): if a in self.intonationmap: # print " -hit a" adata = self.intonationmap[a] else: try: adata = util.docserver_get_json(a, "normalisedpitch", "normalisedhistogram") except util.NoFileException: print "can't find recording %s in docserver" % a return None self.intonationmap[a] = adata if b in self.intonationmap: # print " -hit b" bdata = self.intonationmap[b] else: try: bdata = util.docserver_get_json(b, "normalisedpitch", "normalisedhistogram") except util.NoFileException: print "can't find recording %s in docserver" % b return None self.intonationmap[b] = bdata if (a, b) in self.distancemap: # print " -hit d-ab" distance = self.distancemap[(a, b)] elif (b, a) in self.distancemap: # print " -hit d-ba" distance = self.distancemap[(b, a)] else: distance = recording.kldiv(adata, bdata) self.distancemap[(a, b)] = distance return distance
def obtainPitchTonicForRaga(raganame, outputfolder): if not os.path.exists(outputfolder): os.makedirs(outputfolder) #get raga recording mapping ragaRecordings = obtainRagaRecordingMapping() print len(ragaRecordings.keys()) for mbid in ragaRecordings[raganame]: pitchData = util.docserver_get_json(mbid,'pitch','pitch') tonic = float(util.docserver_get_contents(mbid,'ctonic','tonic')) HopSize = 196 filename =util.docserver_get_filename(mbid,'mp3') shutil.copyfile(filename, outputfolder+ '/'+filename.split('/')[-1]) filename = filename.split('/')[-1].split('.')[0] #TStamps = np.array(range(0,len(pitchData)))*np.float(HopSize)/44100.0 #dump = np.array([TStamps, pitchData]).transpose() np.savetxt(outputfolder+ '/'+filename+'.pitch', pitchData, delimiter = "\t") np.savetxt(outputfolder+ '/'+filename+'.tonic', np.array([tonic]), delimiter = "\t")
def run(self, musicbrainzid, fname): pitch = util.docserver_get_json(musicbrainzid, "pitch", "pitch", version="noguessunv") tonic = util.docserver_get_contents(musicbrainzid, self.tonicname, "tonic", version=self.tonicversion) tonic = float(tonic) nppitch = np.array(pitch) bpo = 64 # 256 pixel high image spanning 4 octaves = 64px/octave height = 255 # Height of the image drawpitch = self.normalise_pitch(nppitch[:, 1], tonic, bpo, height) packed_pitch = StringIO.StringIO() for p in drawpitch: packed_pitch.write(struct.pack("B", p)) drawhist = self.get_histogram(drawpitch, 256, 1) bpo = 120 # 10 cents per bin (original resolution in melody calculation) max_value = bpo * 4 # 4 octaves simpitch = self.normalise_pitch(nppitch[:, 1], tonic, bpo, max_value) simhist = self.get_histogram(simpitch, max_value, 7) return { "packedpitch": packed_pitch.getvalue(), "normalisedpitch": drawpitch, "drawhistogram": drawhist, "normalisedhistogram": simhist }
def calc_profile(self, raag, recordings, style): average = compmusic.extractors.similaritylib.raaga.Raaga(raag.name, "") pitches = [] tonics = [] for r in recordings: mbid = r.mbid try: pitch = util.docserver_get_json(mbid, "pitch", "pitch") tonic = util.docserver_get_contents(mbid, "votedtonic", "tonic") tonic = float(tonic) npp = np.array(pitch) pitches.append(npp) tonics.append(tonic) except util.NoFileException: pass average.compute_average_hist_data(pitches, tonics) if style == "carnatic": entityname = "raaga" elif style == "hindustani": entityname = "raag" fname = "%s-%s-%s.png" % (style, entityname, raag.common_name.lower().replace(" ", "")) average.generate_image(fname) im = data.models.Image() raag.images.remove() im.image.save(fname, ContentFile(open(fname, "rb").read())) raag.images.add(im) os.unlink(fname)
def calc_profile(self, raag, recordings, style): average = compmusic.extractors.similaritylib.raaga.Raaga(raag.name, "") pitches = [] tonics = [] for r in recordings: mbid = r.mbid try: pitch = util.docserver_get_json(mbid, "pitch", "pitch") tonic = util.docserver_get_contents(mbid, "votedtonic", "tonic") tonic = float(tonic) npp = np.array(pitch) pitches.append(npp) tonics.append(tonic) except util.NoFileException: pass average.compute_average_hist_data(pitches, tonics) if style == "carnatic": entityname = "raaga" elif style == "hindustani": entityname = "raag" fname = "%s-%s-%s.png" % (style, entityname, raag.common_name.lower().replace(" ", "")) average.generate_image(fname) im = data.models.Image() im.image.save(fname, ContentFile(open(fname, "rb").read())) raag.image = im raag.save() os.unlink(fname)
def calc_profile(self, raag, recordings): average = raaga.Raaga(raag.name, "") pitches = [] tonics = [] for r in recordings: mbid = r.mbid try: pitch = util.docserver_get_json(mbid, "pitch", "pitch") tonic = util.docserver_get_contents(mbid, "votedtonic", "tonic") tonic = float(tonic) npp = np.array(pitch) pitches.append(npp) tonics.append(tonic) except util.NoFileException: pass average.compute_average_hist_data(pitches, tonics) fname = "hindustani-raag-%s.png" % raag.common_name.lower().replace(" ", "") average.generate_image(fname) im = data.models.Image() raag.images.remove() im.image.save(fname, ContentFile(open(fname, "rb").read())) raag.images.add(im) os.unlink(fname)
def compute_distance(self, a, b): if a in self.intonationmap: # print " -hit a" adata = self.intonationmap[a] else: try: adata = util.docserver_get_json(a, "normalisedpitch", "normalisedhistogram") except util.NoFileException: print "can't find recording %s in docserver" % a self.intonationmap[a] = None return None self.intonationmap[a] = adata if b in self.intonationmap: # print " -hit b" bdata = self.intonationmap[b] else: try: bdata = util.docserver_get_json(b, "normalisedpitch", "normalisedhistogram") except util.NoFileException: print "can't find recording %s in docserver" % b return None self.intonationmap[b] = None self.intonationmap[b] = bdata if adata is None or bdata is None: return None if (a, b) in self.distancemap: # print " -hit d-ab" distance = self.distancemap[(a, b)] elif (b, a) in self.distancemap: # print " -hit d-ba" distance = self.distancemap[(b, a)] else: distance = recording.kldiv(adata, bdata) self.distancemap[(a, b)] = distance return distance
def run(self, fname): pitch = util.docserver_get_json(self.musicbrainz_id, "pitch", "pitch", version="noguessunv") tonic = util.docserver_get_contents(self.musicbrainz_id, "votedtonic", "tonic", version="0.2") tonic = float(tonic) nppitch = np.array(pitch) bpo = 64 # 256 pixel high image spanning 4 octaves = 64px/octave height = 255 # Height of the image drawpitch = self.normalise_pitch(nppitch[:,1], tonic, bpo, height) packed_pitch = StringIO.StringIO() for p in drawpitch: packed_pitch.write(struct.pack("B", p)) drawhist = self.get_histogram(drawpitch, 256, 1) bpo = 120 # 10 cents per bin (original resolution in melody calculation) max_value = bpo * 4 # 4 octaves simpitch = self.normalise_pitch(nppitch[:,1], tonic, bpo, max_value) simhist = self.get_histogram(simpitch, max_value, 7) return {"packedpitch": packed_pitch.getvalue(), "normalisedpitch": drawpitch, "drawhistogram": drawhist, "normalisedhistogram": simhist}
def calc_profile(self, raag, recordings): average = compmusic.extractors.similaritylib.raaga.Raaga(raag.name, "") pitches = [] tonics = [] for r in recordings: mbid = r.mbid try: pitch = util.docserver_get_json(mbid, "pitch", "pitch") tonic = util.docserver_get_contents(mbid, "votedtonic", "tonic") try: tonic = float(tonic) npp = np.array(pitch) pitches.append(npp) tonics.append(tonic) except ValueError: pass except util.NoFileException: pass average.compute_average_hist_data(pitches, tonics) profile = average.average_hist[:, 0] y = np.concatenate((profile[-50:], profile[:-50])) y = gaussian_filter(y, 7) return y.tolist()