Chris@222: #!/bin/sh Chris@222: Chris@222: # Assumption: instrument parameter value 0 of the Silvet plugin is Chris@222: # always "multiple or unknown instruments" and 1 is always "piano". Chris@222: Chris@222: piano_path="/home/cannam/Music/piano_small_dataset" Chris@222: yc="/home/cannam/code/may/bin/yc" Chris@222: Chris@222: if [ ! -d "$piano_path" ]; then Chris@222: echo "Piano dataset directory $piano_path not found, giving up" Chris@222: exit 1 Chris@222: fi Chris@222: Chris@222: if ! "$yc" -v ; then Chris@222: echo "Failed to run Yeti compiler yc at $yc_path, giving up"; Chris@222: fi Chris@222: Chris@222: if ! sonic-annotator -v ; then Chris@222: echo "Failed to run sonic-annotator (not in PATH?), giving up" Chris@222: exit 1 Chris@222: fi Chris@222: Chris@222: rdffile="../../silvet.n3" Chris@222: if [ ! -f "$rdffile" ] ; then Chris@222: echo "Failed to find plugin RDF file at $rdffile, giving up" Chris@222: exit 1 Chris@222: fi Chris@222: Chris@222: case "$piano_path" in Chris@222: *\ *) echo "Piano dataset path $piano_path has a space in it, this script won't handle that"; exit 1;; Chris@222: esac Chris@222: Chris@222: ( cd ../.. ; make -f Makefile.linux ) || exit 1 Chris@222: Chris@222: VAMP_PATH=../.. Chris@222: export VAMP_PATH Chris@222: Chris@222: outfile="/tmp/$$" Chris@225: reference="/tmp/$$ref" Chris@222: Chris@222: tmpwav="/tmp/$$.wav" Chris@222: Chris@222: transfile="/tmp/$$transform.ttl" Chris@222: Chris@271: trap 'rm -f "$outfile" "$tmpwav" "$transfile" "$reference.lab" "$outfile.lab"' 0 Chris@222: Chris@238: infiles=$(find "$piano_path" -name \*.wav | sort) Chris@222: Chris@222: echo Chris@222: echo "Input files are:" Chris@222: echo $infiles | fmt -1 Chris@222: Chris@222: time for infile in $infiles; do Chris@222: Chris@222: echo Chris@222: echo "Evaluating for file $infile..." Chris@222: Chris@222: intended_instrument=1 ## assumption: 1 == piano Chris@222: Chris@222: # We run this twice, once using the default instrument Chris@222: # (i.e. "multiple or unknown") and once using the intended Chris@222: # instrument preset (piano). Chris@222: Chris@222: filename=$(basename "$infile" .wav) Chris@222: Chris@225: duration=30 Chris@225: Chris@238: for instrument in $intended_instrument ; do Chris@222: Chris@269: for mode in 1 0; do Chris@269: Chris@269: for norm in no; do Chris@222: Chris@269: echo Chris@269: echo "For file $filename, instrument $instrument, norm $norm..." Chris@222: Chris@269: if [ "$norm" = "no" ]; then Chris@269: # Don't normalise; plugin is now supposed to do it Chris@269: sox "$infile" "$tmpwav" trim 0 $duration Chris@269: else Chris@269: # Normalise as reference Chris@269: sox "$infile" "$tmpwav" trim 0 $duration gain -n -6.020599913279624 Chris@269: fi Chris@222: Chris@269: # generate the transform by interpolating the instrument parameter Chris@269: cat transform.ttl | \ Chris@269: sed "s/INSTRUMENT_PARAMETER/$instrument/" | \ Chris@269: sed "s/MODE_PARAMETER/$mode/" > "$transfile" Chris@222: Chris@269: sonic-annotator \ Chris@269: --writer csv \ Chris@269: --csv-one-file "$outfile" \ Chris@269: --csv-force \ Chris@269: --transform "$transfile" \ Chris@269: "$tmpwav" Chris@222: Chris@269: cat "$outfile" | \ Chris@269: sed 's/^[^,]*,//' | \ Chris@269: while IFS=, read start duration frequency level label; do Chris@269: end=`echo "$start $duration + p" | dc` Chris@269: echo -e "$start\t$end\t$frequency" Chris@269: done > "$outfile.lab" Chris@223: Chris@269: for ms in 50 100 150; do Chris@269: mark="" Chris@269: if [ "$ms" = "50" ]; then Chris@269: if [ "$instrument" = "0" ]; then Chris@269: mark=" <-- main generic preset for $filename (norm = $norm)"; Chris@269: else Chris@269: mark=" <-- main piano preset for $filename (norm = $norm)"; Chris@269: fi Chris@269: fi; Chris@269: echo Chris@269: echo "Validating against ground truth at $ms ms:" Chris@269: egrep '(^[0-9]\.)|(^[012][0-9]\.)' "../piano-groundtruth/$filename.lab" > "$reference.lab" Chris@269: "$yc" ../scripts/evaluate_lab.yeti "$ms" "$reference.lab" "$outfile.lab" | sed 's,$,'"$mark"',' Chris@269: done; Chris@223: echo Chris@269: done Chris@223: done Chris@222: done Chris@222: done