First attempt at interpolation
This commit is contained in:
@@ -21,6 +21,9 @@ pub enum Message {
|
||||
MetronomePosition {
|
||||
position: f32, // 0.0 - 1.0 position within current beat
|
||||
},
|
||||
Tempo {
|
||||
bpm: f32,
|
||||
},
|
||||
}
|
||||
|
||||
impl Message {
|
||||
@@ -59,6 +62,9 @@ impl Message {
|
||||
Message::MetronomePosition { position } => {
|
||||
state.set_metronome_position(*position);
|
||||
}
|
||||
Message::Tempo { bpm } => {
|
||||
state.set_tempo(*bpm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,6 +123,11 @@ impl Message {
|
||||
position: *position,
|
||||
}));
|
||||
}
|
||||
} else if addr == "/looper/tempo" {
|
||||
if let Some(rosc::OscType::Float(bpm)) = args.first() {
|
||||
log::trace!("Tempo: bpm={bpm}");
|
||||
return Ok(Some(Message::Tempo { bpm: *bpm }));
|
||||
}
|
||||
}
|
||||
// Unknown or unsupported message
|
||||
Ok(None)
|
||||
@@ -168,6 +179,14 @@ impl Message {
|
||||
args: vec![rosc::OscType::Float(position)],
|
||||
})
|
||||
}
|
||||
Message::Tempo { bpm } => {
|
||||
let address = "/looper/tempo".to_string();
|
||||
|
||||
rosc::OscPacket::Message(rosc::OscMessage {
|
||||
addr: address,
|
||||
args: vec![rosc::OscType::Float(bpm)],
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -23,10 +23,11 @@ pub struct State {
|
||||
pub rows: usize,
|
||||
pub metronome_position: f32, // 0.0 - 1.0 position within current beat
|
||||
pub metronome_timestamp: std::time::Instant, // When position was last updated
|
||||
pub tempo: f32, // BPM
|
||||
}
|
||||
|
||||
impl State {
|
||||
pub fn new(columns: usize, rows: usize) -> Self {
|
||||
pub fn new(columns: usize, rows: usize, tempo: f32) -> Self {
|
||||
let cells = (0..columns)
|
||||
.map(|_| {
|
||||
vec![
|
||||
@@ -47,6 +48,7 @@ impl State {
|
||||
rows,
|
||||
metronome_position: 0.0,
|
||||
metronome_timestamp: std::time::Instant::now(),
|
||||
tempo,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,12 +81,18 @@ impl State {
|
||||
Message::MetronomePosition { position } => {
|
||||
self.set_metronome_position(*position);
|
||||
}
|
||||
Message::Tempo { bpm } => {
|
||||
self.set_tempo(*bpm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_state_dump(&self) -> Vec<Message> {
|
||||
let mut messages = Vec::new();
|
||||
|
||||
// Send tempo
|
||||
messages.push(Message::Tempo { bpm: self.tempo });
|
||||
|
||||
// Send current selections
|
||||
messages.push(Message::SelectedColumnChanged {
|
||||
column: self.selected_column,
|
||||
@@ -140,4 +148,8 @@ impl State {
|
||||
self.metronome_position = position;
|
||||
self.metronome_timestamp = std::time::Instant::now();
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set_tempo(&mut self, bpm: f32) {
|
||||
self.tempo = bpm;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user