def lab2timelineRDF(infilename, outfilename, format="xml"): infile = open(infilename, 'r') lines = infile.readlines() mi = mopy.MusicInfo() homepage = mopy.foaf.Document("http://sourceforge.net/projects/motools") mi.add(homepage) program = mopy.foaf.Agent() program.name = "lab2timelineRDF.py" program.homepage = homepage mi.add(program) tl = RelativeTimeLine("tl") tl.label = "Timeline derived from "+infilename tl.maker = program mi.add(tl) intervalNum = 0 for line in lines: i = Interval("i"+str(intervalNum)) try: [start_s, end_s, label] = parseLabLine(line) i.beginsAtDuration = secondsToXSDDuration(start_s) i.endsAtDuration = secondsToXSDDuration(end_s) i.label = label i.onTimeLine = tl except Exception, e: raise Exception("Problem parsing input file at line "+str(intervalNum+1)+" !\n"+str(e)) mi.add(i) intervalNum+=1
def labchords2RDF(infilename, outfilename, format="xml", audiofilename=None, withdescriptions=False): if withdescriptions: commonchords = ConjunctiveGraph() commonchords.load("CommonChords.rdf") extrachords = ConjunctiveGraph() infile = open(infilename, 'r') lines = infile.readlines() mi = mopy.MusicInfo() homepage = mopy.foaf.Document("http://sourceforge.net/projects/motools") mi.add(homepage) program = mopy.foaf.Agent() program.name = "labchords2RDF.py" program.homepage = homepage mi.add(program) tl = RelativeTimeLine("#tl") tl.label = "Timeline derived from "+infilename tl.maker = program mi.add(tl) intervalNum = 0 for line in lines: i = Interval("#i"+str(intervalNum)) try: [start_s, end_s, label] = parseLabLine(line) i.beginsAtDuration = secondsToXSDDuration(start_s) i.endsAtDuration = secondsToXSDDuration(end_s) #i.label = "Interval containing "+label+" chord." i.onTimeLine = tl # Produce chord object for the label : chordURI = "http://purl.org/ontology/chord/symbol/"+label.replace("#","s").replace(",","%2C") if withdescriptions and \ len(list(commonchords.predicate_objects(URIRef(chordURI)))) == 0 and \ len(list(extrachords.predicate_objects(URIRef(chordURI)))) == 0: # Deref to grab chord info print "loading "+chordURI+"..." extrachords.load(chordURI) c = mopy.chord.Chord(chordURI) c_event = mopy.chord.ChordEvent("#ce"+str(intervalNum)) c_event.chord = c c_event.label = label c_event.time = i except Exception, e: raise Exception("Problem parsing input file at line "+str(intervalNum+1)+" !\n"+str(e)) mi.add(i) mi.add(c) mi.add(c_event) intervalNum+=1
def mma2RDF(infilename, outfilename, format="xml", audiofilename=None, withdescriptions=False): if withdescriptions: commonchords = ConjunctiveGraph() commonchords.load("CommonChords.rdf") extrachords = ConjunctiveGraph() # Compile mma file and grab output lines = os.popen(mmabin + ' "' + infilename + '" -nrw').readlines() print "\n".join(lines) # # Initial model bits # mi = mopy.MusicInfo() homepage = mopy.foaf.Document("http://sourceforge.net/projects/motools") mi.add(homepage) program = mopy.foaf.Agent() program.name = "mma2RDF.py" program.homepage = homepage mi.add(program) tl = TimeLine("#tl") tl.label = "Timeline derived from " + infilename tl.maker = program mi.add(tl) # extract tempo from mma file tempo = 60 mmafile = open(infilename, "r") for line in mmafile: if line.startswith("Tempo "): tempo = int(line[len("Tempo ") :].strip().split()[0]) print "Found tempo = " + str(tempo) break lineNum = 1 thisBar_i = None i = None t_secs = 0.0 for line in lines: print "parsing line " + str(lineNum) try: # i = None barNum = getBarNum(line) lastBar_i = thisBar_i thisBar_i = Interval("#i_" + str(barNum)) thisBar_i.beginsAtDuration = secondsToXSDDuration(t_secs) if lastBar_i != None: lastBar_i.endsAtDuration = secondsToXSDDuration(t_secs) thisBar_i.intervalAfter = lastBar_i lastBar_i.intervalBefore = thisBar_i mi.add(thisBar_i) chordMMASymbols = getChordSymbols(line) beatNum = 1 for chordMMASymbol in chordMMASymbols: if chordMMASymbol != "/": print " handling new chord symbol" if i != None: print " terminating last interval" i.endsAtDuration = secondsToXSDDuration(t_secs) mi.add(i) i = Interval("#i_" + str(barNum) + "_" + str(beatNum)) i.onTimeLine = tl i.beginsAtDuration = secondsToXSDDuration(t_secs) chordURI = "http://purl.org/ontology/chord/symbol/" + mmaSymbolToChordSymbol( chordMMASymbol ).replace("#", "s").replace(",", "%2C") if ( withdescriptions and len(list(commonchords.predicate_objects(URIRef(chordURI)))) == 0 and len(list(extrachords.predicate_objects(URIRef(chordURI)))) == 0 ): # Deref to grab chord info print "loading <" + chordURI + ">..." extrachords.load(chordURI) c = Chord(chordURI) c_event = ChordEvent("#ce_" + str(barNum) + "_" + str(beatNum)) c_event.chord = c c_event.time = i c_event.label = mmaSymbolToChordSymbol(chordMMASymbol) mi.add(c) mi.add(c_event) mi.add(i) print " added new chord event for " + chordURI else: if beatNum == 1: # Need to continue the last seen chord print " continuing last bar's chord" # i = Interval("i_"+str(barNum)+"_"+str(beatNum)) # i.onTimeLine = tl # i.beginsAtDuration = secondsToXSDDuration(t_secs) # c_event = ChordEvent("ce_"+str(barNum)+"_"+str(beatNum)) # c_event.chord = c # c_event.time = i # mi.add(c_event); mi.add(i) beatNum += 1 t_secs += 60.0 / tempo except Exception, e: print ("ERROR : Problem parsing input file at line " + str(lineNum) + " !\n") raise lineNum += 1