diff --git a/examples/audio/audio_module_playing.py b/examples/audio/audio_module_playing.py new file mode 100644 index 0000000..e8694b1 --- /dev/null +++ b/examples/audio/audio_module_playing.py @@ -0,0 +1,172 @@ +""" + +raylib [audio] example - playing + +""" +import dataclasses +import pyray +import raylib as rl +from raylib.colors import ( + RAYWHITE, + ORANGE, + RED, + GOLD, + LIME, + BLUE, + VIOLET, + BROWN, + LIGHTGRAY, + PINK, + YELLOW, + GREEN, + SKYBLUE, + PURPLE, + BEIGE, + MAROON, + GRAY, + BLACK +) + + +MAX_CIRCLES=64 + + +@dataclasses.dataclass +class CircleWave: + position: 'rl.Vector2' + radius: float + alpha: float + speed: float + color: 'rl.Color' + + +screenWidth = 800 +screenHeight = 450 + +rl.SetConfigFlags(rl.FLAG_MSAA_4X_HINT) # NOTE: Try to enable MSAA 4X + +rl.InitWindow(screenWidth, screenHeight, b"raylib [audio] example - module playing (streaming)") + +rl.InitAudioDevice() # Initialize audio device + +colors = [ ORANGE, RED, GOLD, LIME, BLUE, VIOLET, BROWN, LIGHTGRAY, PINK, + YELLOW, GREEN, SKYBLUE, PURPLE, BEIGE ] + +# Creates some circles for visual effect +circles = [] + +for i in range(MAX_CIRCLES): + rad = rl.GetRandomValue(10, 40) + pos = pyray.Vector2( + float(rl.GetRandomValue(rad, int(screenWidth) - rad)), + float(rl.GetRandomValue(rad, int(screenHeight) - rad)) + ) + c = CircleWave( + alpha=0.0, + radius=float(rad), + position=pos, + speed=float(rl.GetRandomValue(1, 100))/2000.0, + color=colors[rl.GetRandomValue(0, 13)] + ) + circles.append(c) + +music = rl.LoadMusicStream(b"resources/mini1111.xm") +music.looping = False +pitch = 1.0 + +rl.PlayMusicStream(music) +timePlayed = 0.0 +pause = False + +rl.SetTargetFPS(60) # Set our game to run at 60 frames-per-second + + +# Main game loop +while not rl.WindowShouldClose(): # Detect window close button or ESC key + # Update + #---------------------------------------------------------------------------------- + rl.UpdateMusicStream(music) # Update music buffer with new stream data + + # Restart music playing (stop and play) + if rl.IsKeyPressed(rl.KEY_SPACE): + rl.StopMusicStream(music) + rl.PlayMusicStream(music) + pause = False + + # Pause/Resume music playing + if rl.IsKeyPressed(rl.KEY_P): + pause = not pause + if pause: + rl.PauseMusicStream(music) + else: + rl.ResumeMusicStream(music) + + + if rl.IsKeyDown(rl.KEY_DOWN): + pitch -= 0.01 + elif rl.IsKeyDown(rl.KEY_UP): + pitch += 0.01 + + rl.SetMusicPitch(music, pitch) + + # Get timePlayed scaled to bar dimensions + timePlayed = (rl.GetMusicTimePlayed(music) / rl.GetMusicTimeLength(music))*(screenWidth - 40) + + # Color circles animation + for i in range(MAX_CIRCLES): + if pause: + break + + circles[i].alpha += circles[i].speed + circles[i].radius += circles[i].speed*10.0 + + if circles[i].alpha > 1.0: + circles[i].speed *= -1 + + if circles[i].alpha <= 0.0: + circles[i].alpha = 0.0 + rad = rl.GetRandomValue(10, 40) + pos = pyray.Vector2( + float(rl.GetRandomValue(rad, int(screenWidth) - rad)), + float(rl.GetRandomValue(rad, int(screenHeight) - rad)) + ) + circles[i].position = pos + circles[i].radius = float(rad) + circles[i].speed = float(rl.GetRandomValue(1, 100)) / 2000.0 + circles[i].color = colors[rl.GetRandomValue(0, 13)] + + #---------------------------------------------------------------------------------- + + # Draw + #---------------------------------------------------------------------------------- + pyray.begin_drawing() + + pyray.clear_background(RAYWHITE) + + for i in range(MAX_CIRCLES): + pyray.draw_circle_v(circles[i].position, circles[i].radius, rl.Fade(circles[i].color, circles[i].alpha)) + + # Draw time bar + pyray.draw_rectangle(20, screenHeight - 20 - 12, screenWidth - 40, 12, LIGHTGRAY) + pyray.draw_rectangle(20, screenHeight - 20 - 12, int(timePlayed), 12, MAROON) + pyray.draw_rectangle_lines(20, screenHeight - 20 - 12, screenWidth - 40, 12, GRAY) + + # Draw help instructions + pyray.draw_rectangle(20, 20, 425, 145, RAYWHITE) + pyray.draw_rectangle_lines(20, 20, 425, 145, GRAY) + pyray.draw_text("PRESS SPACE TO RESTART MUSIC", 40, 40, 20, BLACK) + pyray.draw_text("PRESS P TO PAUSE/RESUME", 40, 70, 20, BLACK) + pyray.draw_text("PRESS UP/DOWN TO CHANGE SPEED", 40, 100, 20, BLACK) + pyray.draw_text(f"SPEED: {pitch}", 40, 130, 20, MAROON) + + pyray.end_drawing() + #---------------------------------------------------------------------------------- + + +# De-Initialization +#-------------------------------------------------------------------------------------- +rl.UnloadMusicStream(music) # Unload music stream buffers from RAM + +rl.CloseAudioDevice() # Close audio device (music streaming is automatically stopped) + +rl.CloseWindow() # Close window and OpenGL context diff --git a/examples/audio/resources/mini1111.xm b/examples/audio/resources/mini1111.xm new file mode 100644 index 0000000..a185c1a Binary files /dev/null and b/examples/audio/resources/mini1111.xm differ