redact_composer_musical/
timing.rs1#[cfg(feature = "redact-composer")]
2use redact_composer_core::derive::Element;
3
4#[cfg(feature = "serde")]
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Copy, Clone)]
9#[cfg_attr(feature = "redact-composer", derive(Element))]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub struct TimeSignature {
12 pub beats_per_bar: i32,
14 pub beat_length: i32,
16}
17
18impl TimeSignature {
19 pub fn bar(&self) -> i32 {
21 self.beats_per_bar * self.beat_length
22 }
23
24 pub fn bars(&self, n: i32) -> i32 {
26 self.bar() * n
27 }
28
29 pub fn beat(&self) -> i32 {
31 self.beat_length
32 }
33
34 pub fn beats(&self, n: i32) -> i32 {
36 self.beat() * n
37 }
38
39 pub fn half_beat(&self) -> i32 {
41 self.beat_length / 2
42 }
43
44 pub fn half_beats(&self, n: i32) -> i32 {
46 self.half_beat() * n
47 }
48
49 pub fn triplet(&self) -> i32 {
51 self.beat_length * 2 / 3
52 }
53
54 pub fn triplets(&self, n: i32) -> i32 {
56 self.triplet() * n
57 }
58
59 pub fn half_triplet(&self) -> i32 {
61 self.beat_length / 3
62 }
63
64 pub fn half_triplets(&self, n: i32) -> i32 {
66 self.half_triplet() * n
67 }
68
69 pub fn quarter_beat(&self) -> i32 {
71 self.beat_length / 4
72 }
73
74 pub fn quarter_beats(&self, n: i32) -> i32 {
76 self.quarter_beat() * n
77 }
78
79 pub fn eighth_beat(&self) -> i32 {
81 self.beat_length / 8
82 }
83
84 pub fn eighth_beats(&self, n: i32) -> i32 {
86 self.eighth_beat() * n
87 }
88}