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
use interpolation::*;
#[derive(Debug, Clone, Copy)]
pub struct Key {
row: u32,
value: f32,
interpolation: Interpolation,
}
impl Key {
pub fn new(row: u32, value: f32, interp: Interpolation) -> Key {
Key {
row: row,
value: value,
interpolation: interp,
}
}
}
#[derive(Debug)]
pub struct Track {
name: String,
keys: Vec<Key>,
}
impl Track {
pub fn new<S: Into<String>>(name: S) -> Track {
Track {
name: name.into(),
keys: Vec::new(),
}
}
pub fn get_name(&self) -> &str {
self.name.as_str()
}
fn get_exact_position(&self, row: u32) -> Option<usize> {
self.keys.iter().position(|k| k.row == row)
}
fn get_insert_position(&self, row: u32) -> Option<usize> {
match self.keys.iter().position(|k| k.row >= row) {
Some(pos) => Some(pos),
None => None,
}
}
pub fn set_key(&mut self, key: Key) {
if let Some(pos) = self.get_exact_position(key.row) {
self.keys[pos] = key;
} else if let Some(pos) = self.get_insert_position(key.row) {
self.keys.insert(pos, key);
} else {
self.keys.push(key);
}
}
pub fn delete_key(&mut self, row: u32) {
if let Some(pos) = self.get_exact_position(row) {
self.keys.remove(pos);
}
}
pub fn get_value(&self, row: f32) -> f32 {
if self.keys.is_empty() {
return 0.0;
}
let lower_row = row.floor() as u32;
if lower_row <= self.keys[0].row {
return self.keys[0].value;
}
if lower_row >= self.keys[self.keys.len() - 1].row {
return self.keys[self.keys.len() - 1].value;
}
let pos = self.get_insert_position(lower_row).unwrap() - 1;
let lower = &self.keys[pos];
let higher = &self.keys[pos + 1];
let t = (row - (lower.row as f32)) / ((higher.row as f32) - (lower.row as f32));
let it = lower.interpolation.interpolate(t);
(lower.value as f32) + ((higher.value as f32) - (lower.value as f32)) * it
}
}