|
@@ -16,6 +16,24 @@ use env_logger::Env;
|
|
|
use std::sync::Arc;
|
|
|
use std::sync::Mutex;
|
|
|
use log::*;
|
|
|
+use std::collections::HashMap;
|
|
|
+use std::fs;
|
|
|
+use std::path::Path;
|
|
|
+
|
|
|
+
|
|
|
+enum FsType {
|
|
|
+ Dir,
|
|
|
+ File
|
|
|
+}
|
|
|
+
|
|
|
+struct FsItem {
|
|
|
+ fstype: FsType,
|
|
|
+ parent: Option<Box<FsItem>>,
|
|
|
+ children: Vec<FsItem>,
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
|
|
|
fn collect_sounds (root: &str) -> Vec<Sound> {
|
|
|
WalkDir::new(root)
|
|
@@ -27,6 +45,20 @@ fn collect_sounds (root: &str) -> Vec<Sound> {
|
|
|
.collect()
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+fn sound_lib(root: &str) -> HashMap<String, Vec<Sound>> {
|
|
|
+ let mut hm: HashMap<String, Vec<Sound>> = HashMap::new();
|
|
|
+
|
|
|
+ for s in collect_sounds(root) {
|
|
|
+ let e = hm.entry(
|
|
|
+ s.location.clone().parent().unwrap().to_string_lossy().into()
|
|
|
+ ).or_default().push(s.clone());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ hm
|
|
|
+}
|
|
|
+
|
|
|
fn collect_patterns (root: &str) -> Vec<Pattern> {
|
|
|
WalkDir::new(root)
|
|
|
.into_iter()
|
|
@@ -56,6 +88,11 @@ fn main() {
|
|
|
let dev = Arc::new(rodio::default_output_device().unwrap());
|
|
|
|
|
|
let mut sounds = collect_sounds("media");
|
|
|
+ let soundlib = sound_lib("media");
|
|
|
+ // for (k, v) in &soundlib {
|
|
|
+ // println!("{} {:?}", k, v.iter().map(|s| s.name.clone()).collect::<Vec<String>>());
|
|
|
+ // }
|
|
|
+
|
|
|
let mut patterns = collect_patterns("patterns");
|
|
|
let mut bpm = 120;
|
|
|
|
|
@@ -72,9 +109,9 @@ fn main() {
|
|
|
let mut system = support_ogl::init(file!());
|
|
|
let display = system.imgui.io().display_size;
|
|
|
let mut style = system.imgui.style_mut();
|
|
|
- style.window_rounding = 1.5;
|
|
|
- style.anti_aliased_lines = false;
|
|
|
- style.anti_aliased_fill = false;
|
|
|
+ style.window_rounding = 0.0;
|
|
|
+ // style.anti_aliased_lines = false;
|
|
|
+ // style.anti_aliased_fill = false;
|
|
|
|
|
|
const PURPLE: [f32; 4] = [0.07, 0.05, 0.27, 1.00];
|
|
|
const YELLOW: [f32; 4] = [0.60, 0.25, 0.0, 1.00];
|
|
@@ -94,40 +131,74 @@ fn main() {
|
|
|
]);
|
|
|
|
|
|
|
|
|
- Window::new(im_str!("sources"))
|
|
|
- .position([400.0, 140.0], Condition::Appearing)
|
|
|
- .collapsible(false)
|
|
|
- .size([300.0, 300.0], Condition::FirstUseEver)
|
|
|
+ // SOUND SOURCES WINDOW
|
|
|
+ // Window::new(im_str!("samples"))
|
|
|
+ // .position([800.0, 0.0], Condition::Appearing)
|
|
|
+ // .size([200.0, 500.0], Condition::FirstUseEver)
|
|
|
+ // .build(ui, || {
|
|
|
+
|
|
|
+ // ui.tree_node(im_str!("snds"))
|
|
|
+ // .opened(true, Condition::Appearing)
|
|
|
+ // .build(|| {
|
|
|
+ // for s in &mut sounds {
|
|
|
+ // ui.tree_node(&im_str!("{}", s.name)).build(|| {
|
|
|
+ // // ui.same_line(0.0);
|
|
|
+ // // if ui.small_button(im_str!("add to pattern")) {
|
|
|
+ // // active_pattern.sounds[pattern_row][pattern_col] = Some(s.clone());
|
|
|
+ // // }
|
|
|
+ // if ui.small_button(im_str!("load")) {
|
|
|
+ // active_sound = Some(s.clone());
|
|
|
+ // }
|
|
|
+ // ui.same_line(0.0);
|
|
|
+ // if ui.small_button(im_str!("play")) {
|
|
|
+ // s.play(&dev, bpm);
|
|
|
+ // }
|
|
|
+ // });
|
|
|
+ // }
|
|
|
+ // });
|
|
|
+ // });
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ Window::new(im_str!("samples2"))
|
|
|
+ .position([800.0, 0.0], Condition::Appearing)
|
|
|
+ .size([200.0, 500.0], Condition::FirstUseEver)
|
|
|
.build(ui, || {
|
|
|
+
|
|
|
+
|
|
|
+ for (k, snds) in &soundlib {
|
|
|
+
|
|
|
+ ui.tree_node(&im_str!("{}", k))
|
|
|
+ .opened(true, Condition::Appearing)
|
|
|
+ .build(|| {
|
|
|
+ for s in snds {
|
|
|
+ ui.tree_node(&im_str!("{}", s.name)).build(|| {
|
|
|
+ // ui.same_line(0.0);
|
|
|
+ // if ui.small_button(im_str!("add to pattern")) {
|
|
|
+ // active_pattern.sounds[pattern_row][pattern_col] = Some(s.clone());
|
|
|
+ // }
|
|
|
+ if ui.small_button(im_str!("load")) {
|
|
|
+ active_sound = Some(s.clone());
|
|
|
+ }
|
|
|
+ ui.same_line(0.0);
|
|
|
+ if ui.small_button(im_str!("play")) {
|
|
|
+ s.play(&dev, bpm);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
- // ui.show_default_style_editor();
|
|
|
|
|
|
- ui.tree_node(im_str!("snds"))
|
|
|
- .opened(true, Condition::Appearing)
|
|
|
- .build(|| {
|
|
|
- for s in &mut sounds {
|
|
|
- ui.tree_node(&im_str!("{}", s.name)).build(|| {
|
|
|
- // ui.same_line(0.0);
|
|
|
- // if ui.small_button(im_str!("add to pattern")) {
|
|
|
- // active_pattern.sounds[pattern_row][pattern_col] = Some(s.clone());
|
|
|
- // }
|
|
|
- if ui.small_button(im_str!("load")) {
|
|
|
- active_sound = Some(s.clone());
|
|
|
- }
|
|
|
- ui.same_line(0.0);
|
|
|
- if ui.small_button(im_str!("play")) {
|
|
|
- s.play(&dev, bpm);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
});
|
|
|
- });
|
|
|
|
|
|
+ // PATTERN LOAD WINDOW
|
|
|
Window::new(im_str!("patterns"))
|
|
|
- // .resizable(false)
|
|
|
- .position([400.0, 140.0], Condition::Appearing)
|
|
|
- .collapsible(true)
|
|
|
- .size([300.0, 300.0], Condition::FirstUseEver)
|
|
|
+ .position([800.0, 500.0], Condition::Appearing)
|
|
|
+ .size([200.0, 300.0], Condition::FirstUseEver)
|
|
|
.build(ui, || {
|
|
|
ui.tree_node(im_str!("patterns"))
|
|
|
.opened(true, Condition::Appearing)
|
|
@@ -147,9 +218,10 @@ fn main() {
|
|
|
});
|
|
|
});
|
|
|
|
|
|
- // PATTERN WINDOW ====================================
|
|
|
+ // PATTERN EDIT WINDOW ====================================
|
|
|
Window::new(im_str!("pattern"))
|
|
|
- .size([300.0, 100.0], Condition::FirstUseEver)
|
|
|
+ .size([800.0, 400.0], Condition::FirstUseEver)
|
|
|
+ .position([0.0, 255.0], Condition::Appearing)
|
|
|
.build(ui, || {
|
|
|
let button_size: f32 = 32.0;
|
|
|
|
|
@@ -220,7 +292,8 @@ fn main() {
|
|
|
match &active_sound {
|
|
|
Some(snd) => {
|
|
|
snd.play_detached(&dev, bpm);
|
|
|
- active_pattern.insert_sound(&(x,y), &snd)
|
|
|
+ // active_pattern.insert_sound(&(x,y), &snd.updated_from_source().unwrap())
|
|
|
+ active_pattern.insert_sound(&(x,y), &snd.cloned())
|
|
|
},
|
|
|
None => active_pattern.remove_sound(&(x,y))
|
|
|
}
|
|
@@ -253,7 +326,8 @@ fn main() {
|
|
|
});
|
|
|
|
|
|
Window::new(im_str!("sound"))
|
|
|
- .size([300.0, 100.0], Condition::FirstUseEver)
|
|
|
+ .size([500.0, 255.0], Condition::FirstUseEver)
|
|
|
+ .position([0.0, 0.0], Condition::Appearing)
|
|
|
.build(ui, || {
|
|
|
|
|
|
// let w = ui.current_column_width()*2.0/3.0 + 2.0;
|
|
@@ -318,6 +392,8 @@ fn main() {
|
|
|
|
|
|
Window::new(im_str!("tracks"))
|
|
|
.size([300.0, 100.0], Condition::FirstUseEver)
|
|
|
+ .position([0.0, 650.0], Condition::Appearing)
|
|
|
+
|
|
|
.build(ui, || {
|
|
|
|
|
|
ui.drag_int(im_str!("BPM"), &mut bpm)
|