Skip to main content

load_sm/
load_sm.rs

1use rotterna_lib::structs::SmFile;
2use std::path::PathBuf;
3
4fn main() {
5    // Load a .sm file
6    let path = PathBuf::from("assets/MEGALOVANIA.sm");
7    
8    println!("Loading file: {:?}", path);
9    
10    match SmFile::from_file(path) {
11        Ok(sm_file) => {
12            println!("\n=== METADATA ===");
13            println!("Title: {}", sm_file.metadata.title);
14            println!("Artist: {}", sm_file.metadata.artist);
15            println!("Subtitle: {}", sm_file.metadata.subtitle);
16            println!("Offset: {}", sm_file.offset);
17            
18            println!("\n=== BPMS ===");
19            for (beat, bpm) in &sm_file.bpms {
20                println!("  Beat {}: {} BPM", beat, bpm);
21            }
22            
23            println!("\n=== STOPS ===");
24            for (beat, duration) in &sm_file.stops {
25                println!("  Beat {}: {} seconds", beat, duration);
26            }
27            
28            println!("\n=== CHARTS ===");
29            println!("Number of charts: {}", sm_file.charts.len());
30            
31            for (chart_idx, chart) in sm_file.charts.iter().enumerate() {
32                println!("\n--- Chart {} ---", chart_idx + 1);
33                println!("Stepstype: {}", chart.stepstype);
34                println!("Difficulty: {}", chart.difficulty);
35                println!("Meter: {}", chart.meter);
36                println!("Number of measures: {}", chart.measures.len());
37                
38                // Print last measure to check total duration
39                if let Some(last_measure) = chart.measures.last() {
40                    if let Some(last_beat) = last_measure.beats.last() {
41                        let total_duration_sec = last_beat.time / 1000.0;
42                        println!("Last beat time: {:.2} ms ({:.2} seconds / {:.2} minutes)", 
43                            last_beat.time, total_duration_sec, total_duration_sec / 60.0);
44                    } else if !chart.measures.is_empty() {
45                        // Empty measure - calculate from start_time
46                        let total_duration_sec = last_measure.start_time / 1000.0;
47                        println!("Last measure start time: {:.2} ms ({:.2} seconds / {:.2} minutes)", 
48                            last_measure.start_time, total_duration_sec, total_duration_sec / 60.0);
49                    }
50                }
51                
52                // Print first few measures
53                for (measure_idx, measure) in chart.measures.iter().take(3).enumerate() {
54                    println!("\n  Measure {}:", measure_idx + 1);
55                    println!("    Start time: {:.3} ms", measure.start_time);
56                    println!("    Number of beats: {}", measure.beats.len());
57                    
58                    // Print first few beats
59                    for (beat_idx, beat) in measure.beats.iter().take(3).enumerate() {
60                        println!("      Beat {}: time={:.3} ms, notes={:?}", 
61                            beat_idx + 1, beat.time, beat.notes);
62                    }
63                    if measure.beats.len() > 3 {
64                        println!("      ... ({} more beats)", measure.beats.len() - 3);
65                    }
66                }
67                if chart.measures.len() > 3 {
68                    println!("\n  ... ({} more measures)", chart.measures.len() - 3);
69                }
70            }
71        }
72        Err(e) => {
73            eprintln!("Error loading file: {}", e);
74            std::process::exit(1);
75        }
76    }
77}
78