From b732708ce3a22682b03b096e17b6b6f537964cc2 Mon Sep 17 00:00:00 2001 From: Dukantic Date: Mon, 2 Jun 2025 14:43:10 +0200 Subject: [PATCH] sound by polygons and ui for add polygons and change global rotation --- assets/ah.ogg | Bin 0 -> 21433 bytes src/main.rs | 85 +++++++++++++++++++++++++++++++++++--------- src/polygon_draw.rs | 76 +++++++++++++++++++++++++++------------ 3 files changed, 123 insertions(+), 38 deletions(-) create mode 100644 assets/ah.ogg diff --git a/assets/ah.ogg b/assets/ah.ogg new file mode 100644 index 0000000000000000000000000000000000000000..62c5a1e6c556e1067a3f72939fd3eedc5c8f7c56 GIT binary patch literal 21433 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 { + let mut poly: Polygon; + match s.as_str() { + "segment" => { + poly = Polygon::segment(0.0, self.default_sound.clone()); + poly.name = "segment".to_string() + } + "triangle" => { + poly = Polygon::triangle(0.0, self.default_sound.clone()); + poly.name = "triangle".to_string() + } + "square" => { + poly = Polygon::square(0.0, self.default_sound.clone()); + poly.name = "square".to_string() + } + _ => poly = Polygon::n_gon(0.0, 0, self.default_sound.clone()), + } + self.poly_frame.polygons.push(poly); + } Message::Tick => { let time_btw = Instant::now().duration_since(self.time_last_frame); - let teta_temp = self.polys.teta; - self.polys.teta += 2.0 + let teta_temp = self.poly_frame.teta; + self.poly_frame.teta += 2.0 * PI * (1.0 / self.nb_sec_for_rev as f32) * (time_btw.as_millis() as f32 / 1_000.0); - self.polys.teta %= 2.0 * PI; - if self - .polys - .have_point_polygon_btw(teta_temp, self.polys.teta) - { + self.poly_frame.teta %= 2.0 * PI; + let sound_to_play = self + .poly_frame + .all_sound_to_play_btw(teta_temp, self.poly_frame.teta); + for sound in sound_to_play { self.audio_manager - .play(self.default_sound.clone()) + .play(sound.clone()) .expect("Error to play sound"); } self.time_last_frame = Instant::now(); } + Message::ChangeTeta(i, teta) => self.poly_frame.polygons[i].global_teta = teta, } } fn view(&self) -> iced::Element { let txt_nb_rev = format!("Revolution per second : {}", self.nb_sec_for_rev); + let mut i = 0; + let polygon_rows: Vec> = self + .poly_frame + .polygons + .iter() + .map(|polygon| { + let current_index = i; + i += 1; // Incrémenter l'index pour le prochain polygone + + row![ + text(&polygon.name), + slider( + 0.0..=2.0 * std::f32::consts::PI, + polygon.global_teta, + move |f| { Message::ChangeTeta(current_index, f) } + ) + .step(2.0 * PI / 42f32) + ] + .into() + }) + .collect(); + + // Utiliser Column::with_children pour ajouter dynamiquement les boutons + let polygon_column = Column::with_children(polygon_rows); column![ text("Polymusic").size(32.0), row![ - canvas(&self.polys).height(500).width(500), + canvas(&self.poly_frame).height(500).width(500), column![ text(txt_nb_rev), row![ button("Increment").on_press(Message::ButtonPressedIncrement), button("Decrement").on_press(Message::ButtonPressedDecrement), ], + text("Polygon options"), + pick_list( + ["segment", "triangle", "square"] + .map(|s| s.to_string()) + .to_vec(), + Some("Chose polygon".to_string()), + |s| { Message::AddPolygon(s) } + ), + polygon_column, ], ] ] diff --git a/src/polygon_draw.rs b/src/polygon_draw.rs index 1e1d19f..8ece829 100644 --- a/src/polygon_draw.rs +++ b/src/polygon_draw.rs @@ -6,6 +6,10 @@ use iced::widget::canvas; use iced::widget::canvas::Stroke; use iced::widget::canvas::Style; use iced::{Color, Rectangle, Renderer, Theme}; +use kira::PlaySoundError; +use kira::{ + AudioManager, AudioManagerSettings, DefaultBackend, sound::static_sound::StaticSoundData, +}; use std::time::Instant; pub trait RotationExt { @@ -26,13 +30,16 @@ pub struct PolygonFrame { } impl PolygonFrame { - pub fn have_point_polygon_btw(&self, before: f32, after: f32) -> bool { + pub fn all_sound_to_play_btw(&self, before: f32, after: f32) -> Vec<&StaticSoundData> { + let mut all_sound: Vec<&StaticSoundData> = vec![]; for poly in &self.polygons { + all_sound.extend(poly.sound_to_play_btw(before, after)); + /* if poly.have_points_btw(before, after) { return true; - } + }*/ } - false + all_sound } } @@ -103,26 +110,33 @@ impl canvas::Program for PolygonFrame { } } +#[derive(Debug)] pub struct Polygon { pub global_teta: f32, pub points_teta: Vec, + pub sound: StaticSoundData, + pub name: String, } #[warn(dead_code)] impl Polygon { - pub fn have_points_btw(&self, before: f32, after: f32) -> bool { + pub fn sound_to_play_btw(&self, before: f32, after: f32) -> Vec<&StaticSoundData> { + let mut sound_to_play: Vec<&StaticSoundData> = vec![]; if after < before { - return self.have_points_btw(before, 2.0 * PI) || self.have_points_btw(0.0, after); + sound_to_play = self.sound_to_play_btw(before, 2.0 * PI); + sound_to_play.extend(self.sound_to_play_btw(0.0, after)); + return sound_to_play; } let mut p_g; for p in self.points_teta.clone() { p_g = (p + self.global_teta) % (2.0 * PI); if before <= p_g && p_g <= after { - return true; + sound_to_play.push(&self.sound); } } - false + sound_to_play } - pub fn n_gon(teta: f32, n_side: u8) -> Self { + + pub fn n_gon(teta: f32, n_side: u8, sound: StaticSoundData) -> Self { let mut v: Vec = Vec::with_capacity(n_side as usize); for i in 0..n_side { v.push((i as f32 * 2.0 * PI) / n_side as f32); @@ -130,22 +144,26 @@ impl Polygon { Polygon { global_teta: teta, points_teta: v, + sound: sound, + name: "".to_string(), } } - pub fn segment(teta: f32) -> Self { - Polygon::n_gon(teta, 2) + pub fn segment(teta: f32, sound: StaticSoundData) -> Self { + Polygon::n_gon(teta, 2, sound) } - pub fn triangle(teta: f32) -> Self { - Polygon::n_gon(teta, 3) + pub fn triangle(teta: f32, sound: StaticSoundData) -> Self { + Polygon::n_gon(teta, 3, sound) } - pub fn square(teta: f32) -> Self { - Polygon::n_gon(teta, 4) + pub fn square(teta: f32, sound: StaticSoundData) -> Self { + Polygon::n_gon(teta, 4, sound) } - pub fn nr_6_in_30(teta: f32) -> Self { + pub fn nr_6_in_30(teta: f32, sound: StaticSoundData) -> Self { Polygon { + sound: sound, + name: "".to_string(), global_teta: teta, points_teta: vec![ 2.0 * 5.0 * PI / 30.0, @@ -157,8 +175,10 @@ impl Polygon { ], } } - pub fn nr_7_in_30(teta: f32) -> Self { + pub fn nr_7_in_30(teta: f32, sound: StaticSoundData) -> Self { Polygon { + sound: sound, + name: "".to_string(), global_teta: teta, points_teta: vec![ 0.0, @@ -171,8 +191,10 @@ impl Polygon { ], } } - pub fn nr_8_in_30(teta: f32) -> Self { + pub fn nr_8_in_30(teta: f32, sound: StaticSoundData) -> Self { Polygon { + sound: sound, + name: "".to_string(), global_teta: teta, points_teta: vec![ 2.0 * PI / 30.0, @@ -186,8 +208,10 @@ impl Polygon { ], } } - pub fn nr_9_in_30(teta: f32) -> Self { + pub fn nr_9_in_30(teta: f32, sound: StaticSoundData) -> Self { Polygon { + sound: sound, + name: "".to_string(), global_teta: teta, points_teta: vec![ 0.0, @@ -202,8 +226,10 @@ impl Polygon { ], } } - pub fn nr_8_in_42(teta: f32) -> Self { + pub fn nr_8_in_42(teta: f32, sound: StaticSoundData) -> Self { Polygon { + sound: sound, + name: "".to_string(), global_teta: teta, points_teta: vec![ 2.0 * 3.0 * PI / 42.0, @@ -217,8 +243,10 @@ impl Polygon { ], } } - pub fn nr_9_in_42(teta: f32) -> Self { + pub fn nr_9_in_42(teta: f32, sound: StaticSoundData) -> Self { Polygon { + sound: sound, + name: "".to_string(), global_teta: teta, points_teta: vec![ 0.0, @@ -233,8 +261,10 @@ impl Polygon { ], } } - pub fn nr_10a_in_42(teta: f32) -> Self { + pub fn nr_10a_in_42(teta: f32, sound: StaticSoundData) -> Self { Polygon { + sound: sound, + name: "".to_string(), global_teta: teta, points_teta: vec![ 2.0 * 6.0 * PI / 42.0, @@ -250,8 +280,10 @@ impl Polygon { ], } } - pub fn nr_10b_in_42(teta: f32) -> Self { + pub fn nr_10b_in_42(teta: f32, sound: StaticSoundData) -> Self { Polygon { + sound: sound, + name: "".to_string(), global_teta: teta, points_teta: vec![ 0.0,