diff --git a/CHANGELOG.md b/CHANGELOG.md index 00e1e40..6e6e422 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# 4.0.0 (unreleased) +## Features +- `MidiFile::into_events` returns an iterator of `Timed` +- `Micros` and `UMicros`: strongly typed microseconds +- `DurationExt` for `core::time::Duration`. Converts the duration into `UMicros` + +## Breaking Changes +- `Note` -> `Key`, and `Key` -> `Note` + - `key!` -> `note!` + - All variants that contained a `key` field have been replaced with a `note` field + + # 3.2.0 ## `bevy_midix` (April 15, 2025) - feat: WASM compatability with example! diff --git a/Cargo.toml b/Cargo.toml index 54fd5b7..c161609 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "midix" -version = "4.0.0-alpha.2" +version = "4.0.0-alpha.5" authors = ["dsgallups "] edition = "2024" description = "MIDI structures designed for humans" @@ -10,15 +10,16 @@ readme = "README.md" keywords = ["midi", "audio", "parser", "bevy"] categories = ["multimedia::audio", "multimedia::encoding", "multimedia"] license = "MIT OR Apache-2.0" -exclude = ["assets/*"] +exclude = ["assets/*", "test-asset"] [features] default = ["std"] -std = ["thiserror/std"] +std = ["thiserror/std", "tracing?/std", "bevy?/std"] web = ["bevy_platform/web"] bevy = ["dep:bevy"] bevy_asset = ["bevy/bevy_asset"] +tracing = ["dep:tracing"] serde = ["dep:serde"] @@ -34,6 +35,7 @@ bevy_platform = { version = "0.17.0-rc", optional = true, default-features = fal "alloc", ] } serde = {version = "1.0", features = ["derive"], optional = true} +tracing = { version = "0.1.41", default-features = false, optional = true } [dev-dependencies] pretty_assertions = { default-features = false, features = [ diff --git a/README.md b/README.md index d2086ce..258be02 100644 --- a/README.md +++ b/README.md @@ -71,135 +71,17 @@ let Ok(LiveEvent::ChannelVoice(channel_voice_msg)) = LiveEvent::from_bytes(¬e panic!("Expected a channel voice event"); }; -let VoiceEvent::NoteOn { key, velocity } = channel_voice_msg.event() else { +let VoiceEvent::NoteOn { note, velocity } = channel_voice_msg.event() else { panic!("Expected a note on event"); }; assert_eq!(channel_voice_msg.channel(), Channel::Three); -assert_eq!(key.note(), Note::C); -assert_eq!(key.octave(), Octave::new(4)); +assert_eq!(note.key(), Key::C); +assert_eq!(note.octave(), Octave::new(4)); assert_eq!(velocity.byte(), 96); ``` - - - -## Bevy Support - -Midix has been built with the bevy engine in mind. this feature uses `rustysynth` to play midi sounds under the hood! - -### Note -When running the examples, try using `cargo run --example --features example --release` for the best results! - -### Example -```rust, no_run -use bevy_platform::prelude::*; -use std::time::Duration; -use bevy::{ - log::{Level, LogPlugin}, - prelude::*, -}; -use midix::prelude::*; -fn main() { - App::new() - .add_plugins(( - DefaultPlugins.set(LogPlugin { - level: Level::INFO, - ..default() - }), - MidiPlugin { - input: None, - ..Default::default() - }, - )) - .add_systems(Startup, load_sf2) - .add_systems(Update, scale_me) - .run(); -} -/// Take a look here for some soundfonts: -/// -/// -fn load_sf2(asset_server: Res, mut synth: ResMut) { - synth.use_soundfont(asset_server.load("soundfont.sf2")); -} - -struct Scale { - timer: Timer, - current_key: Key, - note_on: bool, - forward: bool, - incremented_by: u8, - max_increment: u8, -} - -impl Scale { - pub fn calculate_next_key(&mut self) { - if self.forward { - if self.incremented_by == self.max_increment { - self.forward = false; - self.incremented_by -= 1; - self.current_key -= 1; - } else { - self.incremented_by += 1; - self.current_key += 1; - } - } else if self.incremented_by == 0 { - self.forward = true; - self.incremented_by += 1; - self.current_key += 1; - } else { - self.incremented_by -= 1; - self.current_key -= 1; - } - } -} - -impl Default for Scale { - fn default() -> Self { - let timer = Timer::new(Duration::from_millis(200), TimerMode::Repeating); - Scale { - timer, - current_key: Key::new(Note::C, Octave::new(2)), - note_on: true, - forward: true, - incremented_by: 0, - max_increment: 11, - } - } -} - -fn scale_me(synth: Res, time: Res