# Jonny’s Bird

The `||music:play sound||` block lets you create and play complex sounds beyond the simple sequence of tones in a melody. You can choose a sound waveform, change its frequency or volume, and add custom effects. Here’s a program you can code to create fun bird sounds when you shake or tilt the micro:bit!

## Use acceleration to set frequency

The acceleration in the `X`and `Y` dimensions are used to set the frequencies of the sound. Make two variables named `||variables:currFreq||` and `||variables:lastFreq||`. One variable will hold the value for the current freqency as an input of accleration in the `X` direction. The other will remember the previous frequency value.

Get a `||loops:forever||` block and pull the `||variables:set currFreq||` and `||variables:set lastFreq||` blocks into it. Change the value for `||variables:set lastFreq||` from `0` to `||variables:currFreq||`.

``````let currfreq = 0
let lastfreq = 0
basic.forever(function () {
currfreq = 0
lastfreq = currfreq
})``````

Pull a `||math:map from to||` block into the value slot of the `||variables:set currFreq||`. Use `||input:acceleration (mg) x||` as the mapping value, set the `from` value range as `-1024` and `1023`. Set the `to` value range as `0` and `5000`.

``````let currfreq = 0
let lastfreq = 0
basic.forever(function () {
currfreq = Math.map(input.acceleration(Dimension.X), -1024, 1023, 1, 5000)
lastfreq = currfreq
})``````

Go get a `||music:play sound until done||` block and place it in between the `||variables:set currFreq||` and `||variables:set lastFreq||`.

``````let currFreq = 0
let lastFreq = 0
basic.forever(function () {
currFreq = Math.map(input.acceleration(Dimension.X), -1024, 1023, 0, 5000)
music.playSoundEffect(music.createSoundEffect(WaveShape.Sine, 5000, 0, 255, 0, 500, SoundExpressionEffect.None, InterpolationCurve.Linear), SoundExpressionPlayMode.UntilDone)
lastFreq = currFreq
})``````

Expand the sound effect parameters in `||music:play sound until done||` by clicking the (+) symbol. Duplicate 2 `||math:map from to||` blocks from `||variables:set currFreq||` and place one in the `start frequency` value and the other in the `end frequency` value. Change the acceleration direction in the `end frequency` value to the `y` direction.

``````let currFreq = 0
let lastFreq = 0
basic.forever(function () {
currFreq = Math.map(input.acceleration(Dimension.X), -1024, 1023, 0, 5000)
music.playSoundEffect(music.createSoundEffect(WaveShape.Sine,
Math.map(input.acceleration(Dimension.X), -1024, 1023, 0, 5000),
Math.map(input.acceleration(Dimension.Y), -1024, 1023, 0, 5000),
255,
0,
500,
SoundExpressionEffect.None, InterpolationCurve.Linear), SoundExpressionPlayMode.UntilDone)
lastFreq = currFreq
})``````

## Add duration and volume

Click the (+) symbol again on the sound effect block inside of `||music:play sound until done||`. This will show the volume parameters.

Pull out 3 `||math:pick random||` blocks and put them in for the values of `duration`, `start volume`, and `end volume`. For `duration`, use a range of `40` to `100`. For both `start volume` and `end volume`, use a random range of `0` to `1024`.

``````let currFreq = 0
let lastFreq = 0
basic.forever(function () {
currFreq = Math.map(input.acceleration(Dimension.X), -1024, 1023, 0, 5000)
music.playSoundEffect(music.createSoundEffect(WaveShape.Sine,
Math.map(input.acceleration(Dimension.X), -1024, 1023, 0, 5000),
Math.map(input.acceleration(Dimension.Y), -1024, 1023, 0, 5000),
randint(0, 1024),
randint(0, 1024),
randint(40, 100),
SoundExpressionEffect.None, InterpolationCurve.Linear), SoundExpressionPlayMode.UntilDone)
lastFreq = currFreq
})``````

## Set the effects

Once again, click the (+) symbol again on the sound effect block inside of `||music:play sound until done||`. The effects parameters will appear. Change the setting for `effect` to `vibrato` and change `interpolation` to `curve`.

``````let currfreq = 0
let lastfreq = 0
basic.forever(function () {
currfreq = Math.map(input.acceleration(Dimension.X), -1024, 1023, 1, 5000)
music.playSoundEffect(music.createSoundEffect(
WaveShape.Sine,
Math.map(input.acceleration(Dimension.X), -1024, 1023, 1, 5000),
Math.map(input.acceleration(Dimension.Y), -1024, 1023, 1, 5000),
randint(0, 1024),
randint(0, 1024),
randint(40, 100),
SoundExpressionEffect.Vibrato,
InterpolationCurve.Curve
),
SoundExpressionPlayMode.UntilDone)
lastfreq = currfreq
})``````

## Birds are singing!

Transfer you program to the micro:bit, shake and tilt it. The birds are singing!