@@ -71,135 +71,17 @@ let Ok(LiveEvent::ChannelVoice(channel_voice_msg)) = LiveEvent::from_bytes(¬e
7171 panic! (" Expected a channel voice event" );
7272};
7373
74- let VoiceEvent :: NoteOn { key , velocity } = channel_voice_msg . event () else {
74+ let VoiceEvent :: NoteOn { note , velocity } = channel_voice_msg . event () else {
7575 panic! (" Expected a note on event" );
7676};
7777
7878assert_eq! (channel_voice_msg . channel (), Channel :: Three );
79- assert_eq! (key . note (), Note :: C );
80- assert_eq! (key . octave (), Octave :: new (4 ));
79+ assert_eq! (note . key (), Key :: C );
80+ assert_eq! (note . octave (), Octave :: new (4 ));
8181assert_eq! (velocity . byte (), 96 );
8282```
8383
8484
85-
86-
87-
88- ## Bevy Support
89-
90- Midix has been built with the bevy engine in mind. this feature uses ` rustysynth ` to play midi sounds under the hood!
91-
92- ### Note
93- When running the examples, try using ` cargo run --example <EXAMPLE_NAME> --features example --release ` for the best results!
94-
95- ### Example
96- ``` rust, no_run
97- use bevy_platform::prelude::*;
98- use std::time::Duration;
99- use bevy::{
100- log::{Level, LogPlugin},
101- prelude::*,
102- };
103- use midix::prelude::*;
104- fn main() {
105- App::new()
106- .add_plugins((
107- DefaultPlugins.set(LogPlugin {
108- level: Level::INFO,
109- ..default()
110- }),
111- MidiPlugin {
112- input: None,
113- ..Default::default()
114- },
115- ))
116- .add_systems(Startup, load_sf2)
117- .add_systems(Update, scale_me)
118- .run();
119- }
120- /// Take a look here for some soundfonts:
121- ///
122- /// <https://sites.google.com/site/soundfonts4u/>
123- fn load_sf2(asset_server: Res<AssetServer>, mut synth: ResMut<Synth>) {
124- synth.use_soundfont(asset_server.load("soundfont.sf2"));
125- }
126-
127- struct Scale {
128- timer: Timer,
129- current_key: Key,
130- note_on: bool,
131- forward: bool,
132- incremented_by: u8,
133- max_increment: u8,
134- }
135-
136- impl Scale {
137- pub fn calculate_next_key(&mut self) {
138- if self.forward {
139- if self.incremented_by == self.max_increment {
140- self.forward = false;
141- self.incremented_by -= 1;
142- self.current_key -= 1;
143- } else {
144- self.incremented_by += 1;
145- self.current_key += 1;
146- }
147- } else if self.incremented_by == 0 {
148- self.forward = true;
149- self.incremented_by += 1;
150- self.current_key += 1;
151- } else {
152- self.incremented_by -= 1;
153- self.current_key -= 1;
154- }
155- }
156- }
157-
158- impl Default for Scale {
159- fn default() -> Self {
160- let timer = Timer::new(Duration::from_millis(200), TimerMode::Repeating);
161- Scale {
162- timer,
163- current_key: Key::new(Note::C, Octave::new(2)),
164- note_on: true,
165- forward: true,
166- incremented_by: 0,
167- max_increment: 11,
168- }
169- }
170- }
171-
172- fn scale_me(synth: Res<Synth>, time: Res<Time>, mut scale: Local<Scale>) {
173- // don't do anything until the soundfont has been loaded
174- if !synth.is_ready() {
175- return;
176- }
177- scale.timer.tick(time.delta());
178- if !scale.timer.just_finished() {
179- return;
180- }
181- if scale.note_on {
182- //play note on
183- _ = synth.push_event(ChannelVoiceMessage::new(
184- Channel::One,
185- VoiceEvent::note_on(scale.current_key, Velocity::MAX),
186- ));
187- } else {
188- //turn off the note
189- _ = synth.push_event(ChannelVoiceMessage::new(
190- Channel::One,
191- VoiceEvent::note_off(scale.current_key, Velocity::MAX),
192- ));
193- scale.calculate_next_key()
194- }
195-
196- scale.note_on = !scale.note_on;
197- }
198- ```
199-
200- See ` /examples ` for details.
201-
202-
20385## Semantic Versioning and Support
20486` midix ` will adhere to semantic versioning. This means that I've opted to use major versions, even if this crate does not consider itself feature complete (you might get a midix ` v29.3.1 ` someday)
20587
0 commit comments