| 817 | }; |
| 818 | |
| 819 | inline FeatureSnapshot runSignal(audio::Sample (*gen)(fl::u32), int frames = 15) { |
| 820 | audio::detector::Vocal det; |
| 821 | det.setSampleRate(44100); |
| 822 | for (int i = 0; i < frames; ++i) { |
| 823 | auto sample = gen(i * 12); |
| 824 | auto ctx = fl::make_shared<audio::Context>(sample); |
| 825 | ctx->setSampleRate(44100); |
| 826 | ctx->getFFT(64); |
| 827 | det.update(ctx); |
| 828 | } |
| 829 | FeatureSnapshot s; |
| 830 | s.flatness = Diag::getSpectralFlatness(det); |
| 831 | s.formant = Diag::getFormantRatio(det); |
| 832 | s.presence = Diag::getVocalPresenceRatio(det); |
| 833 | s.density = Diag::getHarmonicDensity(det); |
| 834 | s.centroid = Diag::getSpectralCentroid(det) |
| 835 | / static_cast<float>(Diag::getNumBins(det)); |
| 836 | s.rolloff = Diag::getSpectralRolloff(det); |
| 837 | s.jitter = Diag::getEnvelopeJitter(det); |
| 838 | s.acfIrreg = Diag::getAutocorrelationIrregularity(det); |
| 839 | s.zcCV = Diag::getZeroCrossingCV(det); |
| 840 | s.variance = Diag::getSpectralVariance(det); |
| 841 | s.confidence = det.getConfidence(); |
| 842 | s.isVocal = det.isVocal(); |
| 843 | return s; |
| 844 | } |
| 845 | |
| 846 | /// Run makeVocalInFullMix at a given ratio for N frames. |
| 847 | inline FeatureSnapshot runMix(float ratio, int frames = 20) { |
no test coverage detected