1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
use serde::Deserialize;
use serde_repr::*;

#[derive(Clone, Debug, Deserialize)]
pub struct AudioFeatures {
    pub acousticness: f32,
    pub analysis_url: String,
    pub danceability: f32,
    pub duration_ms: u32,
    pub energy: f32,
    pub id: String,
    pub instrumentalness: f32,
    /// The key the track is in. Integers map to pitches using standard Pitch Class notation. E.g. 0 = C, 1 = C♯/D♭, 2 = D, and so on. If no key was detected, the value is -1.
    pub key: i32,
    pub liveness: f32,
    pub loudness: f32,
    // Mode indicates the modality (major or minor) of a track, the type of scale from which its melodic content is derived. Major is represented by 1 and minor is 0.
    pub mode: Mode,
    pub speechiness: f32,
    pub tempo: f32,
    pub time_signature: u32,
    pub track_href: String,
    pub r#type: String,
    pub uri: String,
    pub valence: f32,
}

#[derive(Clone, Debug, Deserialize)]
pub(crate) struct AudioFeaturesResult {
    pub(crate) audio_features: Vec<AudioFeatures>,
}

#[derive(Clone, Debug, Deserialize)]
pub struct AudioAnalysis {
    pub meta: Meta,
    pub track: TrackAnalysis,
    pub bars: Vec<Bar>,
    pub beats: Vec<Beat>,
    pub sections: Vec<Section>,
    pub segments: Vec<Segment>,
    pub tatums: Vec<Tatum>,
}

#[derive(Clone, Debug, Deserialize)]
pub struct Meta {
    pub analyzer_version: String,
    pub platform: String,
    pub detailed_status: String,
    /// The return code of the analyzer process. 0 if successful, 1 if any errors occurred.
    pub status_code: u32,
    pub timestamp: u64,
    pub analysis_time: f32,
    pub input_process: String,
}

#[derive(Clone, Debug, Deserialize)]
pub struct TrackAnalysis {
    pub num_samples: u32,
    pub duration: f32,
    /// This field will always contain an empty string.
    pub sample_md5: String,
    pub offset_seconds: u32,
    pub window_seconds: u32,
    pub analysis_sample_rate: u32,
    pub analysis_channels: u32,
    pub end_of_fade_in: f32,
    pub start_of_fade_out: f32,
    pub loudness: f32,
    pub tempo: f32,
    pub tempo_confidence: f32,
    pub time_signature: u32,
    pub time_signature_confidence: f32,
    pub key: i32,
    pub key_confidence: f32,
    pub mode: Mode,
    pub mode_confidence: f32,
    pub codestring: String,
    pub code_version: f32,
    pub echoprintstring: String,
    pub echoprint_version: f32,
    pub synchstring: String,
    pub synch_version: f32,
    pub rhythmstring: String,
    pub rhythm_version: f32,
}

#[derive(Clone, Debug, Deserialize)]
pub struct Bar {
    pub start: f32,
    pub duration: f32,
    pub confidence: f32,
}

#[derive(Clone, Debug, Deserialize)]
pub struct Beat {
    pub start: f32,
    pub duration: f32,
    pub confidence: f32,
}

#[derive(Clone, Debug, Deserialize)]
pub struct Section {
    pub start: f32,
    pub duration: f32,
    pub confidence: f32,
    pub loudness: f32,
    pub tempo: f32,
    pub tempo_confidence: f32,
    pub key: i32,
    pub key_confidence: f32,
    pub mode: Mode,
    pub mode_confidence: f32,
    pub time_signature: u32,
    pub time_signature_confidence: f32,
}

#[derive(Clone, Debug, Deserialize)]
pub struct Segment {
    pub start: f32,
    pub duration: f32,
    pub confidence: f32,
    pub loudness_start: f32,
    pub loudness_max: f32,
    pub loudness_max_time: f32,
    pub loudness_end: f32,
    pub pitches: Vec<f32>,
    pub timbre: Vec<f32>,
}

#[derive(Clone, Debug, Deserialize)]
pub struct Tatum {
    pub start: f32,
    pub duration: f32,
    pub confidence: f32,
}

#[derive(Clone, Copy, Debug, Deserialize_repr)]
#[repr(u8)]
pub enum Mode {
    Minor,
    Major,
}