From 4f3f94e6710a6b0338c4bbbf01ba88cf31f610d5 Mon Sep 17 00:00:00 2001 From: aprzn Date: Mon, 6 Feb 2023 12:29:49 -0500 Subject: [PATCH] finally actually starting work on the editor! --- Cargo.lock | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 1 + src/main.rs | 7 +++ src/music.rs | 29 +++++++++ 4 files changed, 200 insertions(+), 3 deletions(-) create mode 100644 src/music.rs diff --git a/Cargo.lock b/Cargo.lock index 51ab2f8..bbc5385 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -118,6 +118,15 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "arboard" version = "3.2.0" @@ -331,6 +340,21 @@ dependencies = [ "libc", ] +[[package]] +name = "chrono" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-integer", + "num-traits", + "time 0.1.45", + "wasm-bindgen", + "winapi", +] + [[package]] name = "clang-sys" version = "1.4.0" @@ -399,6 +423,16 @@ dependencies = [ "objc", ] +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + [[package]] name = "combine" version = "4.6.6" @@ -543,6 +577,50 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" +[[package]] +name = "cxx" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc831ee6a32dd495436e317595e639a587aa9907bef96fe6e6abc290ab6204e9" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94331d54f1b1a8895cd81049f7eaaaef9d05a7dcb4d1fd08bf3ff0806246789d" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48dcd35ba14ca9b40d6e4b4b39961f23d835dbb8eed74565ded361d93e1feb8a" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bbeb29798b407ccd82a3324ade1a7286e0d29851475990b612670f6f5124d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "darling" version = "0.13.4" @@ -913,7 +991,7 @@ dependencies = [ "line-wrap", "quick-xml", "serde", - "time", + "time 0.3.17", ] [[package]] @@ -934,7 +1012,7 @@ checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] @@ -1039,6 +1117,30 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d13cdbd5dbb29f9c88095bbdc2590c9cba0d0a1269b983fef6b2cdd7e9f4db1" +[[package]] +name = "iana-time-zone" +version = "0.1.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +dependencies = [ + "cxx", + "cxx-build", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1198,6 +1300,15 @@ dependencies = [ "safemem", ] +[[package]] +name = "link-cplusplus" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" +dependencies = [ + "cc", +] + [[package]] name = "lock_api" version = "0.4.9" @@ -1302,7 +1413,7 @@ checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.42.0", ] @@ -1451,6 +1562,16 @@ dependencies = [ "syn", ] +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.15" @@ -1635,6 +1756,7 @@ name = "pipedash" version = "0.1.0" dependencies = [ "base64 0.21.0", + "chrono", "eframe", "flate2", "gd_plist", @@ -1821,6 +1943,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "scratch" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" + [[package]] name = "sctk-adwaita" version = "0.4.3" @@ -2045,6 +2173,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.38" @@ -2065,6 +2202,17 @@ dependencies = [ "syn", ] +[[package]] +name = "time" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + [[package]] name = "time" version = "0.3.17" @@ -2188,6 +2336,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + [[package]] name = "url" version = "2.3.1" @@ -2222,6 +2376,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index a77ded7..b4724d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,3 +12,4 @@ home = {version = "0.5.4"} base64 = {version = "0.21.0"} flate2 = {version = "1.0.25"} gd_plist = {git = "https://github.com/Syudagye/gd-plist.git", version = "1.4.0"} +chrono = {version = "0.4.23"} diff --git a/src/main.rs b/src/main.rs index bda62f3..a3342e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ mod gd; +mod music; use eframe; use eframe::egui; @@ -30,6 +31,9 @@ enum Message { struct Editor { scroll_pos: f32, pts_per_second: f32, + beats_per_bar: f32, + subdivisions: f32, + beat_rate: music::BeatRate, } type EditorWidget<'a> = &'a mut Editor; @@ -67,6 +71,9 @@ impl PipeDash { editor: Editor { scroll_pos: 0f32, pts_per_second: 5f32, + beats_per_bar: 4.0, + subdivisions: 4.0, + beat_rate: music::StaticBeatRate::from_bpm(120f32).into(), } } } diff --git a/src/music.rs b/src/music.rs new file mode 100644 index 0000000..cc826f8 --- /dev/null +++ b/src/music.rs @@ -0,0 +1,29 @@ +// TODO: SWITCH BEAT RATE TO CHANGE ON BEATS INSTEAD OF DURATIONS, +// TODO: BECAUSE THAT WAS A STUPID IDEA + +use chrono::Duration; +use std::collections::BTreeMap; + +/// Like BPM, but not necessarily represented in terms of minutes +/// Only BPM jumps for now; no smooth accel/decel +pub struct BeatRate { + initial: StaticBeatRate, + changes: BTreeMap, +} + +pub struct StaticBeatRate(Duration); + +impl StaticBeatRate { + pub fn from_bpm(bpm: f32) -> Self { + Self(Duration::microseconds(60_000_000 / bpm as i64)) + } +} + +impl From for BeatRate { + fn from(rhs: StaticBeatRate) -> Self { + Self { + initial: rhs, + changes: BTreeMap::new(), + } + } +}