Mercurial > hg > svapp
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: |