mod chord_analysis;
mod discrete;
mod floating_key;
mod melody;
mod reduce_chords;
pub use chord_analysis::{ChordAnalyzer, ChordQuality, RomanNumeral, roman_numeral_from_chord};
pub use discrete::{
KeyAnalysisResult, KeyFindingAlgorithm, analyze_part, analyze_part_with_certainty, find_key,
pitch_class_distribution, tonal_certainty,
};
pub use floating_key::{WindowedKeyResult, analyze_floating_key, detect_modulations};
pub use melody::{ambitus, melodic_interval_diversity};
pub use reduce_chords::ChordReducer;
#[derive(Debug, Clone, PartialEq)]
pub enum PartAnalysisResult {
Key(KeyAnalysisResult),
Ambitus(Option<crate::core::Interval>),
MelodicIntervalDiversity(f64),
}
pub fn analyze_part_by_method(
part: &crate::stream::Part,
method: &str,
) -> Option<PartAnalysisResult> {
match method {
"key" => Some(PartAnalysisResult::Key(analyze_part(
part,
KeyFindingAlgorithm::KrumhanslSchmuckler,
))),
"ambitus" | "range" => Some(PartAnalysisResult::Ambitus(ambitus(part))),
"melodicIntervalDiversity" => Some(PartAnalysisResult::MelodicIntervalDiversity(
melodic_interval_diversity(part),
)),
_ => None,
}
}