duplicate loop

This commit is contained in:
🪞👃🪞 2024-07-05 11:07:50 +03:00
parent 768c2337e7
commit 2e26fc2eaa
5 changed files with 141 additions and 29 deletions

View file

@ -132,6 +132,7 @@ pub fn main () -> Usually<()> {
Ok(())
})?;
track.sequence = Some(0); // FIXME
track.add_phrase("Custom", ppq * 4, None);
track.add_phrase("Offbeat", ppq * 4, Some(phrase! {
00 * ppq/4 => MidiMessage::NoteOff { key: 40.into(), vel: 100.into() },
02 * ppq/4 => MidiMessage::NoteOn { key: 40.into(), vel: 100.into() },
@ -145,13 +146,32 @@ pub fn main () -> Usually<()> {
Ok(())
})?;
state.add_track_with_cb(Some("Lead"), |_, track|{
track.add_device_with_cb(Plugin::lv2(
"Helm",
"file:///home/user/.lv2/Helm.lv2"
)?, |track, device|{
device.connect_midi_in(0, &track.midi_out.clone_unowned())?;
if let Some(Some(left)) = outputs.get(0) {
device.connect_audio_out(0, left)?;
}
if let Some(Some(right)) = outputs.get(0) {
device.connect_audio_out(1, right)?;
}
Ok(())
})?;
track.sequence = Some(0); // FIXME
track.add_phrase("Custom", ppq * 4, None);
Ok(())
})?;
state.scenes = vec![
Scene::new("Intro", vec![None, Some(0), None, None]),
Scene::new("Hook", vec![Some(0), Some(0), None, None]),
Scene::new("Verse", vec![Some(1), Some(0), None, None]),
Scene::new("Chorus", vec![Some(0), Some(0), None, None]),
Scene::new("Bridge", vec![Some(2), Some(0), None, None]),
Scene::new("Outro", vec![None, Some(0), None, None]),
Scene::new("Intro", vec![None, Some(0), None, None]),
Scene::new("Hook", vec![Some(0), Some(1), None, None]),
Scene::new("Verse", vec![Some(1), Some(0), Some(0), None]),
Scene::new("Chorus", vec![Some(0), Some(1), None, None]),
Scene::new("Bridge", vec![Some(2), Some(0), Some(0), None]),
Scene::new("Outro", vec![None, Some(1), None, None]),
];
Ok(())
@ -306,9 +326,96 @@ impl App {
self.scenes.get_mut(id).map(|t|(id, t))
} }
}
pub fn phrase (&self) -> Option<&Phrase> {
let (track_id, track) = self.track()?;
let (_, scene) = self.scene()?;
track.phrases.get((*scene.clips.get(track_id)?)?)
}
pub fn phrase_mut (&mut self) -> Option<&mut Phrase> {
let (track_id, _) = self.track()?;
let (_, scene) = self.scene()?;
let clip = (*scene.clips.get(track_id)?)?;
self.track_mut()?.1.phrases.get_mut(clip)
}
pub fn phrase_id (&self) -> Option<usize> {
let (track_id, _) = self.track()?;
let (_, scene) = self.scene()?;
*scene.clips.get(track_id)?
}
pub fn selection <'a> (&'a self) -> Selection<'a> {
let track_id = if self.track_cursor == 0 { None } else { Some(self.track_cursor - 1) };
let track = (&track_id).map(|id|self.tracks.get(id)).flatten();
let scene_id = if self.scene_cursor == 0 { None } else { Some(self.scene_cursor - 1) };
let scene = (&scene_id).map(|id|self.scenes.get(id)).flatten();
let phrase_id = if let (Some(scene), Some(id)) = (scene, track_id) {
if let Some(Some(id)) = scene.clips.get(id) {
Some(*id)
} else {
None
}
} else {
None
};
let phrase = if let (Some(id), Some(track)) = (phrase_id, track) {
track.phrases.get(id)
} else {
None
};
Selection {
track_id,
track,
scene_id,
scene,
phrase_id,
phrase
}
}
//pub fn selection_mut <'a> (&'a mut self) -> SelectionMut<'a> {
//let track_id = if self.track_cursor == 0 { None } else { Some(self.track_cursor - 1) };
//let track = (&track_id).map(|id|self.tracks.get_mut(id)).flatten();
//let scene_id = if self.scene_cursor == 0 { None } else { Some(self.scene_cursor - 1) };
//let scene = (&scene_id).map(|id|self.scenes.get_mut(id)).flatten();
//let phrase_id = if let (Some(scene), Some(id)) = (scene, track_id) {
//if let Some(Some(id)) = scene.clips.get_mut(id) {
//Some(*id)
//} else {
//None
//}
//} else {
//None
//};
//let phrase = if let (Some(id), Some(track)) = (phrase_id, track) {
//track.phrases.get_mut(id)
//} else {
//None
//};
//SelectionMut {
//track_id,
//track,
//scene_id,
//scene,
//phrase_id,
//phrase
//}
//}
}
struct Selection<'a> {
pub track_id: Option<usize>,
pub track: Option<&'a Track>,
pub scene_id: Option<usize>,
pub scene: Option<&'a Scene>,
pub phrase_id: Option<usize>,
pub phrase: Option<&'a Phrase>,
}
struct SelectionMut<'a> {
pub track_id: Option<usize>,
pub track: Option<&'a mut Track>,
pub scene_id: Option<usize>,
pub scene: Option<&'a mut Scene>,
pub phrase_id: Option<usize>,
pub phrase: Option<&'a mut Phrase>,
}