Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/examples/audio/pitch.rs
6592 views
1
//! This example illustrates how to play a single-frequency sound (aka a pitch)
2
3
use bevy::prelude::*;
4
use std::time::Duration;
5
6
fn main() {
7
App::new()
8
.add_plugins(DefaultPlugins)
9
.add_event::<PlayPitch>()
10
.add_systems(Startup, setup)
11
.add_systems(Update, (play_pitch, keyboard_input_system))
12
.run();
13
}
14
15
#[derive(BufferedEvent, Default)]
16
struct PlayPitch;
17
18
#[derive(Resource)]
19
struct PitchFrequency(f32);
20
21
fn setup(mut commands: Commands) {
22
commands.insert_resource(PitchFrequency(220.0));
23
}
24
25
fn play_pitch(
26
mut pitch_assets: ResMut<Assets<Pitch>>,
27
frequency: Res<PitchFrequency>,
28
mut events: EventReader<PlayPitch>,
29
mut commands: Commands,
30
) {
31
for _ in events.read() {
32
info!("playing pitch with frequency: {}", frequency.0);
33
commands.spawn((
34
AudioPlayer(pitch_assets.add(Pitch::new(frequency.0, Duration::new(1, 0)))),
35
PlaybackSettings::DESPAWN,
36
));
37
info!("number of pitch assets: {}", pitch_assets.len());
38
}
39
}
40
41
fn keyboard_input_system(
42
keyboard_input: Res<ButtonInput<KeyCode>>,
43
mut frequency: ResMut<PitchFrequency>,
44
mut events: EventWriter<PlayPitch>,
45
) {
46
if keyboard_input.just_pressed(KeyCode::ArrowUp) {
47
frequency.0 *= ops::powf(2.0f32, 1.0 / 12.0);
48
}
49
if keyboard_input.just_pressed(KeyCode::ArrowDown) {
50
frequency.0 /= ops::powf(2.0f32, 1.0 / 12.0);
51
}
52
if keyboard_input.just_pressed(KeyCode::Space) {
53
events.write(PlayPitch);
54
}
55
}
56
57