from aubio.bench.node import *
def parse_args(req):
req.basehref = BASEHREF
req.datadir = DATADIR
if req.path_info: path_info = req.path_info
else: path_info = '/'
location = re.sub('^/show_[a-z0-9]*/','',path_info)
location = re.sub('^/play_[a-z0-9]*/','',location)
location = re.sub('^/index/','',location)
location = re.sub('^/','',location)
location = re.sub('/$','',location)
datapath = "%s/%s" % (DATADIR,location)
respath = "%s/%s" % (DATADIR,location)
last = re.sub('/$','',location)
last = last.split('/')[-1]
first = path_info.split('/')[1]
# store some of this in the mp_request
req.location, req.datapath, req.respath = location, datapath, respath
req.first, req.last = first, last
if location:
if not (os.path.isfile(datapath) or
os.path.isdir(datapath) or
location in ['feedback','email']):
# the path was not understood
from mod_python import apache
req.write(" path not found %s" % (datapath))
raise apache.SERVER_RETURN, apache.OK
#from mod_python import apache
#raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND
def navigation(req):
""" main html navigation header """
from mod_python import psp
req.content_type = "text/html"
parse_args(req)
datapath = req.datapath
location = req.location
# deal with session
if req.sess.is_new():
msg = "Welcome %s
" % req.sess['login']
else:
msg = "Welcome back %s
" % req.sess['login']
# start writing
tmpl = psp.PSP(req, filename='header.tmpl')
tmpl.run(vars = { 'title': "aubioweb / %s / %s" % (req.first,location),
'basehref': '/~piem/',
'message': msg,
'action': req.first})
req.write("
Content of ")
print_link(req,"","/")
y = location.split('/')
for i in range(len(y)-1):
print_link(req,"/".join(y[:i+1]),y[i])
req.write(" / ")
req.write("%s
\n" % y[-1])
a = {'show_info' : 'info',
'show_sound': 'waveform',
'show_onset': 'onset',
'index' : 'index',
'show_pitch': 'pitch',
'play_m3u': 'stream (m3u/ogg)',
'play_ogg': 'save (ogg)',
'play_wav': 'save (wav)',
}
# print task lists (only remaining tasks)
print_link(req,re.sub('%s.*'%req.last,'',location),"go up")
akeys = a.keys(); akeys.sort();
curkey = req.first
for akey in akeys:
if akey != curkey:
req.write(":: ")
print_link(req,"/".join((akey,location)),a[akey])
else:
req.write(":: ")
req.write("%s" % a[akey])
req.write("
")
# list the content of the directories
listdir,listfiles = [],[]
if os.path.isdir(datapath):
listfiles = list_snd_files(datapath)
listdir = list_dirs(datapath)
listdir.pop(0) # kick the current dir
elif os.path.isfile(datapath):
listfiles = [datapath]
listdir = [re.sub(req.last,'',location)]
link_list(req,listdir,title="Subdirectories")
link_list(req,listfiles,title="Files")
def footer(req):
""" html navigation footer """
from mod_python import psp
tmpl = psp.PSP(req, filename='footer.tmpl')
tmpl.run(vars = { 'time': -req.mtime+req.request_time })
def apply_on_data(req, func,**keywords):
# bug: hardcoded snd file filter
act_on_data(func,req.datapath,req.respath,
filter="f -maxdepth 1 -name '*.wav' -o -name '*.aif'",**keywords)
def print_link(req,target,name,basehref=BASEHREF):
req.write("%s\n" % (basehref,target,name))
def print_img(req,target,name='',basehref=BASEHREF):
if name == '': name = target
req.write("\n" % (basehref,target,name,name))
def link_list(req,targetlist,basehref=BASEHREF,title=None):
if len(targetlist) > 1:
if title: req.write("%s
"%title)
req.write('')
for i in targetlist:
s = re.split('%s/'%DATADIR,i,maxsplit=1)[1]
if s:
req.write('- ')
print_link(req,s,s)
req.write('
')
req.write('
')
def print_list(req,list):
req.write("\n")
for i in list: req.write("%s\n" % i)
req.write("
\n")
def print_command(req,command):
req.write("%s
\n" % re.sub('%%','%',command))
def print_runcommand(input,output):
cmd = re.sub('(%)?%i','%s' % input, command)
cmd = re.sub('(%)?%o','%s' % output, cmd)
print_list(req,runcommand(cmd))
apply_on_data(req,print_runcommand)
def datapath_to_location(input):
location = re.sub(DATADIR,'',input)
return re.sub('^/*','',location)
## drawing hacks
def draw_func(req,func):
import re
req.content_type = "image/png"
# build location (strip the func_path, add DATADIR)
location = re.sub('^/draw_[a-z]*/','%s/'%DATADIR,req.path_info)
location = re.sub('.png$','',location)
if not os.path.isfile(location):
from mod_python import apache
raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND
# replace location in func
cmd = re.sub('(%)?%i','%s' % location, func)
# add PYTHONPATH at the beginning,
cmd = "%s%s 2> /dev/null" % (PYTHONPATH,cmd)
for each in runcommand(cmd):
req.write("%s\n"%each)
def show_task(req,task):
def show_task_file(input,output,task):
location = datapath_to_location(input)
print_img(req,"draw_%s/%s" % (task,location))
navigation(req)
req.write("%s
\n" % task)
apply_on_data(req,show_task_file,task=task)
footer(req)
## waveform_foo
def draw_sound(req):
draw_func(req,"aubioplot-audio %%i stdout 2> /dev/null")
def show_sound(req):
show_task(req,"sound")
## pitch foo
def draw_pitch(req,threshold='0.3'):
draw_func(req,"aubiopitch -i %%i -p -m schmitt,yin,fcomb,mcomb -t %s -O stdout" % threshold)
def show_pitch(req):
show_task(req,"pitch")
## onset foo
def draw_onset(req,threshold='0.3'):
draw_func(req,"aubiocut -i %%i -p -m complex -t %s -O stdout" % threshold)
def show_onset(req,threshold='0.3',details=''):
def onset_file(input,output):
location = datapath_to_location(input)
print_img(req,"draw_onset/%s?threshold=%s"%(location,threshold))
print_link(req,"?threshold=%s" % (float(threshold)-0.1),"-")
req.write("%s\n" % threshold)
print_link(req,"?threshold=%s" % (float(threshold)+0.1),"+")
# bug: hardcoded sndfile extension
anote = re.sub('\.wav$','.txt',input)
if anote == input: anote = ""
res = get_extract(input,threshold)
if os.path.isfile(anote):
tru = get_anote(anote)
print_list(req,get_results(tru,res,0.05))
else:
req.write("no ground truth found
\n")
if details:
req.write("Extraction
\n")
print_list(req,res)
else:
req.write("details
\n" %
(req.basehref,location,threshold))
if details and os.path.isfile(anote):
req.write("Computed differences
\n")
ldiffs = get_diffs(tru,res,0.05)
print_list(req,ldiffs)
req.write("Annotations
\n")
print_list(req,tru)
navigation(req)
req.write("Onset
\n")
apply_on_data(req,onset_file)
footer(req)
def get_anote(anote):
import aubio.onsetcompare
# FIXME: should import with txtfile.read_datafile
return aubio.onsetcompare.load_onsets(anote)
def get_diffs(anote,extract,tol):
import aubio.onsetcompare
return aubio.onsetcompare.onset_diffs(anote,extract,tol)
def get_extract(datapath,threshold='0.3'):
cmd = "%saubiocut -v -m complex -t %s -i %s" % (PYTHONPATH,threshold,datapath)
lo = runcommand(cmd)
for i in range(len(lo)): lo[i] = float(lo[i])
return lo
def get_results(anote,extract,tol):
import aubio.onsetcompare
orig, missed, merged, expc, bad, doubled = aubio.onsetcompare.onset_roc(anote,extract,tol)
s =("GD %2.8f\t" % (100*float(orig-missed-merged)/(orig)),
"FP %2.8f\t" % (100*float(bad+doubled)/(orig)) ,
"GD-merged %2.8f\t" % (100*float(orig-missed)/(orig)) ,
"FP-pruned %2.8f\t" % (100*float(bad)/(orig)) )
return s
# play m3u foo
def play_m3u(req):
def show_task_file(input,output,task):
location = datapath_to_location(input)
req.write("http://%s%s/play_ogg/%s\n" % (HOSTNAME,BASEHREF,re.sub("play_m3u",task,location)))
req.content_type = "audio/mpegurl"
parse_args(req)
apply_on_data(req,show_task_file,task="play_ogg")
# play wav foo
def play_wav(req):
req.content_type = "audio/x-wav"
func = "cat %%i"
# build location (strip the func_path, add DATADIR)
location = re.sub('^/play_wav/','%s/'%DATADIR,req.path_info)
if not os.path.isfile(location):
from mod_python import apache
raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND
# replace location in func
cmd = re.sub('(%)?%i','%s' % location, func)
# add PYTHONPATH at the beginning,
cmd = "%s 2> /dev/null" % cmd
for each in runcommand(cmd):
req.write("%s\n"%each)
# play ogg foo
def play_ogg(req):
req.content_type = "application/ogg"
func = "oggenc -o - %%i"
# build location (strip the func_path, add DATADIR)
location = re.sub('^/play_ogg/','%s/'%DATADIR,req.path_info)
location = re.sub('.ogg$','',location)
if not os.path.isfile(location):
from mod_python import apache
raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND
# replace location in func
cmd = re.sub('(%)?%i','%s' % location, func)
# add PYTHONPATH at the beginning,
cmd = "%s 2> /dev/null" % cmd
for each in runcommand(cmd):
req.write("%s\n"%each)