woelper преди 4 години
родител
ревизия
8511a868f3
променени са 7 файла, в които са добавени 77 реда и са изтрити 53 реда
  1. 6 6
      sampler.ini
  2. 22 1
      src/base.rs
  3. BIN
      src/fonts/IBMPlexMono-Regular.ttf
  4. 0 0
      src/fonts/IBMPlexSans-Regular.ttf
  5. 0 0
      src/fonts/mplus-1p-regular.ttf
  6. 35 43
      src/main.rs
  7. 14 3
      src/support_ogl/mod.rs

+ 6 - 6
sampler.ini

@@ -10,7 +10,7 @@ Collapsed=0
 
 [Window][sources]
 Pos=400,140
-Size=339,460
+Size=246,460
 Collapsed=0
 
 [Window][ImGui Demo]
@@ -29,17 +29,17 @@ Size=328,168
 Collapsed=0
 
 [Window][sound]
-Pos=40,12
-Size=300,100
+Pos=33,28
+Size=290,168
 Collapsed=0
 
 [Window][tracks]
-Pos=56,432
+Pos=84,461
 Size=300,100
 Collapsed=0
 
 [Window][pattern]
-Pos=38,153
-Size=316,208
+Pos=51,222
+Size=523,173
 Collapsed=0
 

+ 22 - 1
src/base.rs

@@ -83,6 +83,24 @@ impl Default for Pattern {
 
 
 impl Pattern {
+    pub fn play_mut(&mut self, device: &rodio::Device) {
+        let delay = ((60.0 / self.bpm as f32)*1000.0) as u64;
+        for _ in 0..self.repeat + 1 {
+
+
+            for step in 0..self.length() {
+                for row in &mut self.sounds {
+                    if let Some(s) = &mut row[step] {
+                        s.play(device);
+                    }
+                }
+            
+                thread::sleep(Duration::from_millis(delay));
+            }
+    
+
+        }
+    }
     pub fn play(&mut self, device: &rodio::Device) {
         let delay = ((60.0 / self.bpm as f32)*1000.0) as u64;
         for _ in 0..self.repeat+1 {
@@ -99,6 +117,9 @@ impl Pattern {
 
         }
     }
+
+
+
     // pub fn cols_mut(&mut self) -> Vec<Option>Sound>> {
     //     for row in &mut self.sounds {
     //         row.resize(self.sounds.len() + slots, None);
@@ -116,7 +137,7 @@ impl Pattern {
     }
 
     pub fn length(&self) -> usize {
-        self.sounds.len()
+        self.sounds[0].len()
     }
 }
 

BIN
src/fonts/IBMPlexMono-Regular.ttf


src/support_ogl/IBMPlexSans-Regular.ttf → src/fonts/IBMPlexSans-Regular.ttf


src/support_ogl/mplus-1p-regular.ttf → src/fonts/mplus-1p-regular.ttf


+ 35 - 43
src/main.rs

@@ -30,26 +30,17 @@ fn main() {
     let mut sounds = collect_sounds("media");
     
     let mut timeline = Timeline::default();
-    // let mut track = Track::default();
-    // track.test();
-    // track.bar_mut(0).bpm = 1;
-    // track.bars[0].bpm = 1;
-    // let mut x = &mut track.bars[0];
-    // x.bpm = 1;
-
-    // dbg!(&track);
 
     // return;
     let mut pattern_col: usize = 0;
     let mut pattern_row: usize = 0;
-    // let mut active_track: usize = 0;
-    // let mut active_bar: usize = 0;
+    let mut active_sound_idx = 0;
 
 
     // let mut active_bar = Bar::default();
     // let mut active_bar = &mut timeline.patterns[0].bars[0];
     let mut active_pattern = Pattern::default();
-    let mut active_sound: &Option<Sound> = &None;
+    let mut active_sound: Option<Sound> = None;
     // let mut active_pattern = &mut timeline.patterns[0];
 
 
@@ -78,6 +69,9 @@ fn main() {
                             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);
@@ -91,55 +85,50 @@ fn main() {
             .size([300.0, 100.0], Condition::FirstUseEver)
             .build(ui, || {
 
-                // for i in 0..active_pattern.length() {
-                //     ui.same_line(0.0);
-                    
-                //     let token = match pattern_col == i {
-                //         true => ui.push_style_color(StyleColor::Button, [1.0, 0.0, 0.0, 1.0]),
-                //         false => ui.push_style_color(StyleColor::CheckMark, [0.0, 0.0, 0.0, 1.0])
-                //     };
-                //     if ui.small_button(&im_str!("{}", i)) {
-                //         pattern_col = i as usize;
-                //     }
-                //     token.pop(ui);
-
-                // }
-
-                for (row_idx, row) in (&active_pattern).sounds.iter().enumerate() {
+                if ui.small_button(&im_str!("column++")) {
+                    active_pattern.extend_length(1);
+                }
+                ui.same_line(0.0);
+                
+                if ui.small_button(&im_str!("row++")) {
+                    active_pattern.extend_row(1);
+                }
+
+                ui.same_line(0.0);
+                if ui.small_button(&im_str!("ply")) {
+                    active_pattern.play_mut(&dev);
+                }
+
+
+                ui.drag_int(im_str!("bpm"), &mut active_pattern.bpm).build();
+
+                for row_idx in 0..active_pattern.sounds.len() {
                     ui.text(im_str!("row {}", row_idx));
-                    for (snd_idx, sound) in row.iter().enumerate() {
+
+                    for snd_idx in 0..active_pattern.sounds[row_idx].len() {
                         ui.same_line(0.0);
                         // ui.text(im_str!("snd {}", snd_idx));
 
-                        let label = match sound {
+                        let label = match &active_pattern.sounds[row_idx][snd_idx] {
                             Some(_s) => "X",
                             None => " "
                         };
 
-                        if ui.small_button(&im_str!("{} {}x{}", label, row_idx, snd_idx)) {
+                        if ui.small_button(&im_str!("{}##{}{}", label, row_idx, snd_idx)) {
                             pattern_col = snd_idx;
                             pattern_row = row_idx;
-                            // pattern_col = i as usize;
+                            println!("r{}c{}", row_idx, snd_idx);
+                            active_pattern.sounds[row_idx][snd_idx] = active_sound.clone();
                         }
                     }
 
+
                 }
 
                 ui.text(im_str!("pat {} {}", pattern_col, pattern_row));
 
 
-                if ui.small_button(&im_str!("column++")) {
-                    active_pattern.extend_length(1);
-                }
-                
-                if ui.small_button(&im_str!("row++")) {
-                    active_pattern.extend_row(1);
-                }
-
-                
-                if ui.small_button(&im_str!("ply")) {
-                    active_pattern.play(&dev);
-                }
+        
             });
     
             Window::new(im_str!("sound"))
@@ -152,6 +141,9 @@ fn main() {
                     ui.text(im_str!("volume {}", s.volume));
                     ui.text(im_str!("rate   {}", s.rate));
                 }
+                if ui.small_button(&im_str!("clear")) {
+                    active_sound = None;
+                }
             });
     
             Window::new(im_str!("tracks"))
@@ -159,7 +151,7 @@ fn main() {
             .build(ui, || {
                
                 if ui.small_button(&im_str!("add")) {
-                    active_pattern.play(&dev);
+                    active_pattern.play_mut(&dev);
                 }
             });
     

+ 14 - 3
src/support_ogl/mod.rs

@@ -1,6 +1,6 @@
 use gfx::Device;
 use glutin::{Event, WindowEvent};
-use imgui::{Context, FontConfig, FontGlyphRanges, FontSource, Ui};
+use imgui::{Context, FontConfig, FontSource, Ui};
 use imgui_gfx_renderer::{Renderer, Shaders};
 use imgui_winit_support::{HiDpiMode, WinitPlatform};
 use std::time::Instant;
@@ -32,10 +32,21 @@ pub fn init(title: &str) -> System {
     let mut platform = WinitPlatform::init(&mut imgui);
 
     let hidpi_factor = platform.hidpi_factor();
-    let font_size = (13.0 * hidpi_factor) as f32;
+    let font_size = (15.0 * hidpi_factor) as f32;
     imgui.fonts().add_font(&[
         FontSource::TtfData {
-            data: include_bytes!("IBMPlexSans-Regular.ttf"),
+            data: include_bytes!("../fonts/IBMPlexMono-Regular.ttf"),
+            // data: include_bytes!("mplus-1p-regular.ttf"),
+            size_pixels: font_size,
+            config: Some(FontConfig {
+                glyph_offset: [0.0, -1.5],
+                name: Some("IBM Plex mono".to_string()),
+                // glyph_ranges: FontGlyphRanges::japanese(),
+                ..FontConfig::default()
+            }),
+        },
+        FontSource::TtfData {
+            data: include_bytes!("../fonts/IBMPlexSans-Regular.ttf"),
             // data: include_bytes!("mplus-1p-regular.ttf"),
             size_pixels: font_size,
             config: Some(FontConfig {