mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-10 21:56:42 +01:00
72 lines
3.3 KiB
Rust
72 lines
3.3 KiB
Rust
use crate::*;
|
|
|
|
expose!([self: Sampler]
|
|
([Arc<str>])
|
|
([MaybeSample])
|
|
([PathBuf])
|
|
([f32])
|
|
([u7]
|
|
(":pitch" (self.note_pos() as u8).into()) // TODO
|
|
(":sample" (self.note_pos() as u8).into()))
|
|
([usize]
|
|
(":sample-up" self.note_pos().min(119) + 8)
|
|
(":sample-down" self.note_pos().max(8) - 8)
|
|
(":sample-left" self.note_pos().min(126) + 1)
|
|
(":sample-right" self.note_pos().max(1) - 1)));
|
|
|
|
impose!([state: Sampler]
|
|
(FileBrowserCommand:
|
|
("begin" [] Some(Self::Begin))
|
|
("cancel" [] Some(Self::Cancel))
|
|
("confirm" [] Some(Self::Confirm))
|
|
("select" [i: usize] Some(Self::Select(i.expect("no index"))))
|
|
("chdir" [p: PathBuf] Some(Self::Chdir(p.expect("no path"))))
|
|
("filter" [f: Arc<str>] Some(Self::Filter(f.expect("no filter")))))
|
|
(SamplerCommand:
|
|
("import" [,..a]
|
|
FileBrowserCommand::try_from_expr(state, a).map(Self::Import))
|
|
("select" [i: usize]
|
|
Some(Self::Select(i.expect("no index"))))
|
|
("record/begin" [i: u7]
|
|
Some(Self::RecordBegin(i.expect("no index"))))
|
|
("record/cancel" []
|
|
Some(Self::RecordCancel))
|
|
("record/finish" []
|
|
Some(Self::RecordFinish))
|
|
("set/sample" [i: u7, s: MaybeSample]
|
|
Some(Self::SetSample(i.expect("no index"), s.expect("no sampler"))))
|
|
("set/start" [i: u7, s: usize]
|
|
Some(Self::SetStart(i.expect("no index"), s.expect("no start"))))
|
|
("set/gain" [i: u7, g: f32]
|
|
Some(Self::SetGain(i.expect("no index"), g.expect("no gain"))))
|
|
("note/on" [p: u7, v: u7]
|
|
Some(Self::NoteOn(p.expect("no pitch"), v.expect("no velocity"))))
|
|
("note/off" [p: u7]
|
|
Some(Self::NoteOff(p.expect("no pitch"))))));
|
|
|
|
macro_rules! cmd { ($cmd:expr) => {{ $cmd; None }}; }
|
|
macro_rules! cmd_todo { ($msg:literal) => {{ println!($msg); None }}; }
|
|
|
|
defcom!([self, state: Sampler]
|
|
(SamplerCommand
|
|
(Select [i: usize] Some(Self::Select(state.set_note_pos(i))))
|
|
(RecordBegin [p: u7] cmd!(state.begin_recording(p.as_int() as usize)))
|
|
(RecordCancel [] cmd!(state.cancel_recording()))
|
|
(RecordFinish [] cmd!(state.finish_recording()))
|
|
(SetStart [p: u7, frame: usize] cmd_todo!("\n\rtodo: {self:?}"))
|
|
(SetGain [p: u7, gain: f32] cmd_todo!("\n\rtodo: {self:?}"))
|
|
(NoteOn [p: u7, velocity: u7] cmd_todo!("\n\rtodo: {self:?}"))
|
|
(NoteOff [p: u7] cmd_todo!("\n\rtodo: {self:?}"))
|
|
(SetSample [p: u7, s: MaybeSample] Some(Self::SetSample(p, state.set_sample(p, s))))
|
|
(Import [c: FileBrowserCommand] match c {
|
|
FileBrowserCommand::Begin => {
|
|
//let voices = &state.state.voices;
|
|
//let sample = Arc::new(RwLock::new(Sample::new("", 0, 0, vec![])));
|
|
state.mode = Some(SamplerMode::Import(0, FileBrowser::new(None)?));
|
|
None
|
|
},
|
|
_ => {
|
|
println!("\n\rtodo: import: filebrowser: {c:?}");
|
|
None
|
|
}
|
|
})));
|