Lab 3.4: Control the Audio
Use Conditionals to control audioExample: Load the audio file:
Goals
In this lab, we will learn the following computer science concepts:
- Creating Objects
- Using conditional statements
Computer Science Principles Curriculum
- Big Idea: Algorithms: EK 4.1.1A, EK 4.1.1C, EK 4.1.1D
Common Core Standards
- English Language Arts Standards » Science & Technical Subjects: CCSS.ELA-Literacy.RST.9-10.3, CCSS.ELA-Literacy.RST.9-10.4, CCSS.ELA-Literacy.RST.9-10.5, CCSS.ELA-Literacy.RST.9-10.7, CCSS.ELA-Literacy.RST.9-10.10, CCSS.ELA-Literacy.RST.11-12.2, CCSS.ELA-Literacy.RST.11-12.3, CCSS.ELA-Literacy.RST.11-12.4, CCSS.ELA-Literacy.RST.11-12.5, CCSS.ELA-Literacy.RST.11-12.10
- Standards For Mathmatical Practice: CCSS.Math.Practice.MP1, CCSS.Math.Practice.MP2, CCSS.Math.Practice.MP4, CCSS.Math.Practice.MP5, CCSS.Math.Practice.MP6, CCSS.Math.Practice.MP7, CCSS.Math.Practice.MP8
Vocabulary
- Control Structures
- If statement
- Loops
- Input Manager
Overview
This lab demonstrates how to use key presses on the keyboard to perform some tasks. The task you will perform is to write a program that changes the balance of a sound file from left to right or right to left upon pressing of the left and right arrow keys. The program will also increase the volume upon pressing of the up arrow key and decrease the volume upon pressing the down arrow key. Download this zip file for a template to help you get started.
Understanding the InputMonitor and KeyboardEvent Libraries
Open the provided template and navigate to the main.quorum file . Near the top of the file, there are two lines that look like this on lines 15 and 16:
Goal 1: Creating Objects
//This line declares an InputMonitor object called "inputMonitor"
InputMonitor inputMonitor
Line 16 declares one of the objects you use to determine if a specific key has been pressed on the keyboard. The InputMonitor
object can tell you when a key is pressed down, and the KeyboardEvent
object, which you will add in the first activity, can let you know which key is pressed down.
You use these objects to determine when a key is pressed down and which key is pressed down.
Activity: Declare the KeyboardEvent
object. Call it keys
.
Add this new line of code below the InputMonitor
.
The InputMonitor
object has an action called IsKeyPressed
that takes a KeyboardEvent
object variable and returns a boolean
— true
if the passed key is pressed, false
if not. You need to pass the KeyboardEvent
object variable to the IsKeyPressed
action, telling the KeyboardEvent
object which key you want to check is pressed.
Activity: Declare the Audio
object. Call it song
.
Add this new line of code below the KeyboardEvent
.
Navigate to the action called CreateGame
on line 36 through line 37. This is where you load the song for your Audio
object. Recall that to load an audio file to an Audio
object, we call the Load
action, passing the file name of the file we want to load.
//This line will load the song to the audio object
song:Load("media/music.wav")
Activity: EnableLooping
, and Play
your song.
Once you have your Audio
loaded, you should enable looping so that it can play over and over during your program.
This is done by calling the EnableLooping
action on your Audio
object. Finally, you want to play your Audio
object. Recall that this is done by calling the Play
action on the Audio
object. Now that you have your Audio
loaded and set up, you can begin writing the code to change the volume and balance upon key presses.
Goal 2: Using Conditional Statements
Navigate to the action called Update(number seconds) around line 49. This action is called on every frame of your game. This is where you write your code to handle the key presses. This action should check whether some keys are pressed down and, if they are, begin the appropriate task for those keys.
The volume should be changed upon pressing of the up or down arrow keys.
You need to check whether the up and down arrow keys are pressed.
The names of the variables in KeyboardEvent
objects that represent the up and down arrow keys are UP
and DOWN
, respectively.
If the up arrow key is pressed, the volume should be increased.
To do this, you need to get the current volume of the Audio
object by calling the GetVolume
action.
The new volume should be set to the current volume plus some increment value.
The SetVolume
action takes one number
parameter that represents the percentage of the volume to play. A number
of 1 means to play the song at 100% of its normal volume. A number
of 0.8 means to play the song at 80% of its normal volume. A number
of 0.5 means to play the song at 50% of its normal volume, and so on.
Choose a good increment value for the volume to use when the up key is pressed down. A good one is to increase the volume by 10% with each key press.
Example: Write the code that increases the volume when the Up key is pressed.
//This if statement checks when the Up key is pressed
if inputMonitor:IsKeyPressed(keys:UP)
//This line gets the current volume of the audio
number currentVolume = song:GetVolume()
//This line uses the current volume and adds an increment value to it
number newVolume = currentVolume + 0.1
//This line sets the new volume
song:SetVolume(newVolume)
end
Activity: Lower the volume of the song.
If the down arrow key is pressed, the volume should be decreased.
To do this, you need to get the current volume of the Audio
object by calling the GetVolume
action.
The new volume should be set to the current volume minus some decrement value.
Choose a good decrement value for the volume to use when the down key is pressed down.
A good one is to decrease the volume by 10% with each key press.
Write the code to do this.
The balance should be changed upon pressing the right or left arrow keys.
You need to check whether the left or right arrow keys are pressed.
The names of the variables in KeyboardEvent
objects that represent the left and right arrow keys are LEFT
and RIGHT
, respectively.
If the left arrow key is pressed, the balance should move towards the left ear.
To do this, you need to get the current balance of the Audio
object by calling the GetBalance
action.
The new balance should be set to the current balance minus some decrement value.
The SetBalance
action takes one number
parameter between -1 and 1 that represents the audio balance. A number
of -1 means to play the audio fully in the left ear. A number
of 1 means to play the audio fully in the right ear. A number
of 0 means to play the audio equally in both ears, and so on.
Choose a good decrement value for the balance to use when the left key is pressed down. A good one is to decrease the balance by 0.1 with each key press.
Example: Write the code to move the balance towards the left when the Left key is pressed.
//This line checks for the left key being pressed
if inputMonitor:IsKeyPressed(keys:LEFT)
//This line get the current balance of the audio
number currentBalance = song:GetBalance()
//This line uses the current balance and subtracts a decrement value
number newBalance = currentBalance - 0.1
//This line sets the new balance
song:SetBalance(newBalance)
end
Activity: Change the balance towards the right ear.
If the right arrow key is pressed, the balance should move towards the right ear.
To do this, you need to get the current balance of the Audio
object by calling the GetBalance
action.
The new balance should be set to the current balance plus some increment value.
Choose a good increment value for the balance to use when the right arrow key is pressed down.
A good one is to increase the balance by 0.1 with each key press.
You may now compile and run your code. There should be no errors. If there are errors, fix them and try again. You should be able to change the volume and balance by pressing the appropriate keys.
Resources
The music used for this lab is Beachfront Celebration by Kevin MacLeod (incompetech.com). Licensed under Creative Commons: By Attribution 3.0 License.
Next Tutorial
In the next tutorial, we will discuss repetition, which describes how to do operations over and over again.