Skip to main content

tuning_comparison/
tuning_comparison.rs

1//! Tuning System Comparison
2//!
3//! This example demonstrates the difference between various tuning systems
4//! by showing how the same MIDI notes map to different frequencies.
5//!
6//! Run with: cargo run --example tuning_comparison -p aetherdsp-midi
7
8use aether_midi::tuning::TuningTable;
9
10fn main() {
11    println!("AetherDSP MIDI - Tuning System Comparison");
12    println!("==========================================\n");
13
14    // Create tuning tables (all use A4=440Hz)
15    let equal_temp = TuningTable::equal_temperament(440.0);
16    let tizita = TuningTable::ethiopian_tizita(440.0);
17    let rast = TuningTable::arabic_maqam_rast(440.0);
18    let yaman = TuningTable::indian_raga_yaman(440.0);
19
20    println!("Comparing tuning systems for one octave (C4-C5):\n");
21    println!("{:4} | {:>10} | {:>10} | {:>10} | {:>10} | {:>8}",
22        "MIDI", "12-TET", "Tizita", "Rast", "Yaman", "Cents");
23    println!("{}", "-".repeat(70));
24
25    // Compare middle C octave (MIDI 60-72)
26    for midi_note in 60..=72 {
27        let freq_12tet = equal_temp.frequency(midi_note);
28        let freq_tizita = tizita.frequency(midi_note);
29        let freq_rast = rast.frequency(midi_note);
30        let freq_yaman = yaman.frequency(midi_note);
31
32        // Calculate cents deviation from 12-TET
33        let cents_tizita: f32 = 1200.0 * (freq_tizita / freq_12tet).log2();
34        let cents_rast: f32 = 1200.0 * (freq_rast / freq_12tet).log2();
35        let cents_yaman: f32 = 1200.0 * (freq_yaman / freq_12tet).log2();
36
37        let note_name = get_note_name(midi_note);
38
39        println!("{:4} | {:10.2} | {:10.2} | {:10.2} | {:10.2} | {:+8.1}",
40            format!("{} ({})", midi_note, note_name),
41            freq_12tet,
42            freq_tizita,
43            freq_rast,
44            freq_yaman,
45            cents_tizita.max(cents_rast).max(cents_yaman)
46        );
47    }
48
49    println!("\nšŸ“Š Key Observations:");
50    println!("  • Ethiopian Tizita: Pentatonic scale with characteristic flat intervals");
51    println!("  • Arabic Maqam Rast: Quarter-tone flats on 3rd and 7th degrees");
52    println!("  • Indian Raga Yaman: Just intonation with raised 4th (Kalyan thaat)");
53    println!("  • Cents: Deviation from 12-TET (100 cents = 1 semitone)");
54
55    println!("\nāœ“ Try these tuning systems in your music!");
56}
57
58fn get_note_name(midi: u8) -> &'static str {
59    let note_names = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
60    note_names[(midi % 12) as usize]
61}