test/
test.rs

1//! 
2//! An example of the time_calc crate in action.
3//!
4
5extern crate time_calc;
6
7use time_calc::{
8    Bars,
9    Beats,
10    Bpm,
11    Division,
12    DivType,
13    Measure,
14    Ms,
15    Ppqn,
16    SampleHz,
17    Samples,
18    Ticks,
19    TimeSig,
20};
21
22// "Samples per second" is used to convert between samples and milliseconds.
23const SAMPLE_HZ: SampleHz = 44_100.0;
24// "Parts per quarter note" is used to calculate Ticks; a high resolution musical time measurement.
25const PPQN: Ppqn = 19_200;
26
27fn main() {
28    println!("time_calc demonstration!");
29
30    // Out `Bars` type is a simplified version of a Measure.
31    assert!(Bars(1).measure() == Measure(1, Division::Bar, DivType::Whole));
32    // The same goes for out `Beats` type.
33    assert!(Beats(1).measure() == Measure(1, Division::Beat, DivType::Whole));
34
35    // We can use "parts per quarter note" to convert to ticks.
36    println!("Parts per quarter note: {}", PPQN);
37    println!("Duration of a beat in ticks: {}", Beats(1).ticks(PPQN));
38    println!("Duration of 38_400 ticks in beats: {}", Ticks(38_400).beats(PPQN));
39
40    // We can use "beats per minute" to convert from musical time to milliseconds.
41    let bpm: Bpm = 120.0;
42    println!("Duration of a beat at 120 beats per minute: {} milliseconds.", Beats(1).ms(bpm));
43
44    // And we can use "samples per second" to convert our duration to samples.
45    println!("Samples per second: {}", SAMPLE_HZ);
46    println!("Duration of a beat at 120bpm in samples: {}", Beats(1).samples(bpm, SAMPLE_HZ));
47
48    // We also need to know the "time signature" if we are to convert from "Bars".
49    // This is because different time signatures can have a different duration in "Beats".
50    let beats_per_bar = TimeSig { top: 4, bottom: 4 }.beats_per_bar();
51    println!("Duration of a bar in `Beats` with a 4/4 Time Signature: {}", beats_per_bar);
52    let beats_per_bar = TimeSig { top: 3, bottom: 4 }.beats_per_bar();
53    println!("Duration of a bar in `Beats` with a 3/4 Time Signature: {}", beats_per_bar);
54    let beats_per_bar = TimeSig { top: 7, bottom: 8 }.beats_per_bar();
55    println!("Duration of a bar in `Beats` with a 7/8 Time Signature: {}", beats_per_bar);
56    let time_sig = TimeSig { top: 4, bottom: 4 };
57    println!("Duration of a bar at 120bpm, 44_100 sample_hz and 4/4 Time Sig in samples: {}",
58             Bars(1).samples(bpm, time_sig, SAMPLE_HZ));
59
60    // We can also convert back the other way! Here's an example from Ms -> Beats.
61    println!("1 minute as a duration in beats: {}", Ms(60_000.0).beats(bpm));
62
63    // Here's an example from Samples -> Bars.
64    println!("176_400 samples as a duration in bars: {}",
65             Samples(176_400).bars(bpm, time_sig, SAMPLE_HZ));
66
67    println!("Great Success!");
68}