Chris@339
|
1 #!/bin/bash
|
Chris@222
|
2
|
Chris@222
|
3 # Assumption: instrument parameter value 0 of the Silvet plugin is
|
Chris@222
|
4 # always "multiple or unknown instruments" and 1 is always "piano".
|
Chris@222
|
5
|
Chris@339
|
6 set -eu
|
Chris@339
|
7
|
Chris@222
|
8 piano_path="/home/cannam/Music/piano_small_dataset"
|
Chris@222
|
9 yc="/home/cannam/code/may/bin/yc"
|
Chris@222
|
10
|
Chris@222
|
11 if [ ! -d "$piano_path" ]; then
|
Chris@222
|
12 echo "Piano dataset directory $piano_path not found, giving up"
|
Chris@222
|
13 exit 1
|
Chris@222
|
14 fi
|
Chris@222
|
15
|
Chris@222
|
16 if ! "$yc" -v ; then
|
Chris@222
|
17 echo "Failed to run Yeti compiler yc at $yc_path, giving up";
|
Chris@222
|
18 fi
|
Chris@222
|
19
|
Chris@222
|
20 if ! sonic-annotator -v ; then
|
Chris@222
|
21 echo "Failed to run sonic-annotator (not in PATH?), giving up"
|
Chris@222
|
22 exit 1
|
Chris@222
|
23 fi
|
Chris@222
|
24
|
Chris@222
|
25 rdffile="../../silvet.n3"
|
Chris@222
|
26 if [ ! -f "$rdffile" ] ; then
|
Chris@222
|
27 echo "Failed to find plugin RDF file at $rdffile, giving up"
|
Chris@222
|
28 exit 1
|
Chris@222
|
29 fi
|
Chris@222
|
30
|
Chris@222
|
31 case "$piano_path" in
|
Chris@222
|
32 *\ *) echo "Piano dataset path $piano_path has a space in it, this script won't handle that"; exit 1;;
|
Chris@222
|
33 esac
|
Chris@222
|
34
|
Chris@222
|
35 ( cd ../.. ; make -f Makefile.linux ) || exit 1
|
Chris@222
|
36
|
Chris@222
|
37 VAMP_PATH=../..
|
Chris@222
|
38 export VAMP_PATH
|
Chris@222
|
39
|
Chris@222
|
40 outfile="/tmp/$$"
|
Chris@225
|
41 reference="/tmp/$$ref"
|
Chris@222
|
42
|
Chris@222
|
43 tmpwav="/tmp/$$.wav"
|
Chris@222
|
44
|
Chris@222
|
45 transfile="/tmp/$$transform.ttl"
|
Chris@222
|
46
|
Chris@271
|
47 trap 'rm -f "$outfile" "$tmpwav" "$transfile" "$reference.lab" "$outfile.lab"' 0
|
Chris@222
|
48
|
Chris@238
|
49 infiles=$(find "$piano_path" -name \*.wav | sort)
|
Chris@222
|
50
|
Chris@222
|
51 echo
|
Chris@222
|
52 echo "Input files are:"
|
Chris@222
|
53 echo $infiles | fmt -1
|
Chris@222
|
54
|
Chris@222
|
55 time for infile in $infiles; do
|
Chris@222
|
56
|
Chris@222
|
57 echo
|
Chris@222
|
58 echo "Evaluating for file $infile..."
|
Chris@222
|
59
|
Chris@222
|
60 intended_instrument=1 ## assumption: 1 == piano
|
Chris@222
|
61
|
Chris@222
|
62 # We run this twice, once using the default instrument
|
Chris@222
|
63 # (i.e. "multiple or unknown") and once using the intended
|
Chris@222
|
64 # instrument preset (piano).
|
Chris@222
|
65
|
Chris@222
|
66 filename=$(basename "$infile" .wav)
|
Chris@222
|
67
|
Chris@225
|
68 duration=30
|
Chris@225
|
69
|
Chris@339
|
70 for instrument in $intended_instrument 0 ; do
|
Chris@222
|
71
|
Chris@363
|
72 for mode in 1 0; do
|
Chris@269
|
73
|
Chris@269
|
74 for norm in no; do
|
Chris@222
|
75
|
Chris@269
|
76 echo
|
Chris@339
|
77 echo "For mode $mode, file $filename, instrument $instrument, norm $norm..."
|
Chris@222
|
78
|
Chris@269
|
79 if [ "$norm" = "no" ]; then
|
Chris@269
|
80 # Don't normalise; plugin is now supposed to do it
|
Chris@269
|
81 sox "$infile" "$tmpwav" trim 0 $duration
|
Chris@269
|
82 else
|
Chris@269
|
83 # Normalise as reference
|
Chris@269
|
84 sox "$infile" "$tmpwav" trim 0 $duration gain -n -6.020599913279624
|
Chris@269
|
85 fi
|
Chris@222
|
86
|
Chris@269
|
87 # generate the transform by interpolating the instrument parameter
|
Chris@269
|
88 cat transform.ttl | \
|
Chris@269
|
89 sed "s/INSTRUMENT_PARAMETER/$instrument/" | \
|
Chris@269
|
90 sed "s/MODE_PARAMETER/$mode/" > "$transfile"
|
Chris@222
|
91
|
Chris@269
|
92 sonic-annotator \
|
Chris@269
|
93 --writer csv \
|
Chris@269
|
94 --csv-one-file "$outfile" \
|
Chris@269
|
95 --csv-force \
|
Chris@269
|
96 --transform "$transfile" \
|
Chris@269
|
97 "$tmpwav"
|
Chris@222
|
98
|
Chris@269
|
99 cat "$outfile" | \
|
Chris@269
|
100 sed 's/^[^,]*,//' | \
|
Chris@269
|
101 while IFS=, read start duration frequency level label; do
|
Chris@269
|
102 end=`echo "$start $duration + p" | dc`
|
Chris@269
|
103 echo -e "$start\t$end\t$frequency"
|
Chris@269
|
104 done > "$outfile.lab"
|
Chris@223
|
105
|
Chris@269
|
106 for ms in 50 100 150; do
|
Chris@269
|
107 mark=""
|
Chris@269
|
108 if [ "$ms" = "50" ]; then
|
Chris@269
|
109 if [ "$instrument" = "0" ]; then
|
Chris@339
|
110 mark=" <-- main generic preset for $filename (mode = $mode, norm = $norm)";
|
Chris@269
|
111 else
|
Chris@339
|
112 mark=" <-- main piano preset for $filename (mode = $mode, norm = $norm)";
|
Chris@269
|
113 fi
|
Chris@269
|
114 fi;
|
Chris@269
|
115 echo
|
Chris@269
|
116 echo "Validating against ground truth at $ms ms:"
|
Chris@269
|
117 egrep '(^[0-9]\.)|(^[012][0-9]\.)' "../piano-groundtruth/$filename.lab" > "$reference.lab"
|
Chris@339
|
118 "$yc" ../scripts/evaluate_lab.yeti "$ms" "$reference.lab" "$outfile.lab" | sed 's#$#'"$mark"'#'
|
Chris@269
|
119 done;
|
Chris@223
|
120 echo
|
Chris@269
|
121 done
|
Chris@223
|
122 done
|
Chris@222
|
123 done
|
Chris@222
|
124 done
|