First attempt at interpolation

This commit is contained in:
2025-06-22 11:44:46 +02:00
parent 7e6a539296
commit b35574c364
11 changed files with 667 additions and 26 deletions

View File

@@ -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)],
})
}
}
}
}
}

View File

@@ -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;
}
}