# Using Functions

The former example raises a question, will we always need to type

``````some_freq  => sine.freq;
some_duration => now;
``````

everytime we want to set the frequency and advance time?

## Functions as mean to encapsulate behavior

Well, no: this can all fit in a function. Let's write it

``````fun void play(SinOsc sine, const float freq, const dur d) {
freq => sine.freq;
d => now;
}
``````

### What does this mean?

the `fun` keyword denotes the start of a function declaration.

the return type of the function follows.
here the function returns nothing, we declare it as `void`.

After that there is the function name, `play` in this case.

What follows is the argument list.
A function argument syntax is as follow:

``````Type name
``````

### A simple example function

``````fun int add(int a, int b) {
return a + b;
}
``````

This time the function returns an int, so we change the return type accordingly.

Here is how we call it

``````fun int add(int a, int b) {
return a + b;
}

#! alternatively
<<< (2, 3) => add >>>;
``````

## A example using functions

``````#import Modules

fun void play(SinOsc sine, const float freq, const dur d) {
freq => sine.freq;
d => now;
}

var SinOsc sine ~> dac;

play(sine, 440, second);
play(sine, 220, .5::second);
play(sine, 220, .5::second);
play(sine, 440, second);
``````
built with mdr and mdBook
You'll find the source here, Luke!

note: privacy guards may interfere with the playground