mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
duplicate loop
This commit is contained in:
parent
768c2337e7
commit
2e26fc2eaa
5 changed files with 141 additions and 29 deletions
119
src/main.rs
119
src/main.rs
|
|
@ -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>,
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue