comparison align/Align.cpp @ 771:1d6cca5a5621 pitch-align

Allow use of proper sparse models (i.e. retaining event time info) in alignment; use this to switch to note alignment, which is what we have most recently been doing in the external program. Not currently producing correct results, though
author Chris Cannam
date Fri, 29 May 2020 17:39:02 +0100
parents 1b1960009be6
children 699b5b130ea2
comparison
equal deleted inserted replaced
770:486add472c3f 771:1d6cca5a5621
44 return "trimmed-linear-alignment"; 44 return "trimmed-linear-alignment";
45 case MATCHAlignment: 45 case MATCHAlignment:
46 return "match-alignment"; 46 return "match-alignment";
47 case MATCHAlignmentWithPitchCompare: 47 case MATCHAlignmentWithPitchCompare:
48 return "match-alignment-with-pitch"; 48 return "match-alignment-with-pitch";
49 case SungPitchContourAlignment: 49 case SungNoteContourAlignment:
50 return "sung-pitch-alignment"; 50 return "sung-note-alignment";
51 case TransformDrivenDTWAlignment: 51 case TransformDrivenDTWAlignment:
52 return "transform-driven-alignment"; 52 return "transform-driven-alignment";
53 case ExternalProgramAlignment: 53 case ExternalProgramAlignment:
54 return "external-program-alignment"; 54 return "external-program-alignment";
55 } 55 }
135 toAlign, 135 toAlign,
136 withTuningDifference); 136 withTuningDifference);
137 break; 137 break;
138 } 138 }
139 139
140 case SungPitchContourAlignment: 140 case SungNoteContourAlignment:
141 { 141 {
142 auto refModel = ModelById::get(reference); 142 auto refModel = ModelById::get(reference);
143 if (!refModel) return false; 143 if (!refModel) return false;
144 144
145 Transform transform = TransformFactory::getInstance()-> 145 Transform transform = TransformFactory::getInstance()->
146 getDefaultTransformFor("vamp:pyin:pyin:smoothedpitchtrack", 146 getDefaultTransformFor("vamp:pyin:pyin:notes",
147 refModel->getSampleRate()); 147 refModel->getSampleRate());
148 148
149 transform.setParameter("outputunvoiced", 2.f);
150
151 aligner = make_shared<TransformDTWAligner> 149 aligner = make_shared<TransformDTWAligner>
152 (doc, 150 (doc,
153 reference, 151 reference,
154 toAlign, 152 toAlign,
155 transform, 153 transform,
156 TransformDTWAligner::RiseFall, 154 [](double prev, double curr) {
157 [](double freq) { 155 RiseFallDTW::Value v;
158 if (freq < 0.0) { 156 if (curr <= 0.0) {
159 return 0.0; 157 v = { RiseFallDTW::Direction::None, 0.0 };
158 } else if (prev <= 0.0) {
159 v = { RiseFallDTW::Direction::Up, 0.0 };
160 } else { 160 } else {
161 return double(Pitch::getPitchForFrequency(freq)); 161 double prevP = Pitch::getPitchForFrequency(prev);
162 double currP = Pitch::getPitchForFrequency(curr);
163 if (currP >= prevP) {
164 v = { RiseFallDTW::Direction::Up, currP - prevP };
165 } else {
166 v = { RiseFallDTW::Direction::Down, prevP - currP };
167 }
162 } 168 }
169 return v;
163 }); 170 });
164 break; 171 break;
165 } 172 }
166 173
167 case TransformDrivenDTWAlignment: 174 case TransformDrivenDTWAlignment: