Create Music with Code
Tags: beginners, music
Published: 2020-04-01 09:01:39

Hello 👋🏼

I was always interested in music but somehow I just couldn't get myself to explore those costly tools with complex UI. Until a few weeks ago, I found something really interesting. I found out about a tool that compiles code into Music! I tested it out and was instantly hooked. It's really fun and even if you're not that much into making music, you can kill some great time with Sonic Pi. So, here's a blog on how to get started! 

## What's Sonic Pi? 
`Sonic Pi is a code-based music creation and performance tool.`
This basically means that you can create, mix music by code. Sonic Pi is built on Ruby and is [Open Source](github.com/samaaron/sonic-pi/).
You can download Sonic Pi from [their website](sonic-pi.net/). You can download it for Windows, macOS and Raspberry Pi as well. 

## Basic Music Theory
Before we start, I'll be covering some basic Music theory which is very easy to understand so don't worry.

### Notes
The piano diagram below shows the various piano notes that piano keys usually correspond to. The ones with `#` are the sharp notes and the ones with the symbol that looks like a `b` are the flat notes. Keys, wherever multiple notes are written, can be referenced as those notes. Meaning that `C# and Db` are the same key.  

<img src="http://www.piano-keyboard-guide.com/wp-content/uploads/2015/05/piano_notes.jpg">

You can test what these notes usually sound on piano on [this virtual piano](https://www.onlinepianist.com/virtual-piano). Make sure you enable the "Letter Notes" so that you know which note you are playing by pressing the key. 


### Numbers, Notes and Octaves.

Every note along with its octave represents a number, depending on the number of keys on a keyboard. An Octave is an interval between musical pitch and another with double its frequency. So, numbers or notes belonging to one octave will have the same frequency and those with different octave numbers will have different frequencies. Here is a cheat sheet I've taken from MeHackit's Sonic Pi tutorial. 

<img src="http://sonic-pi.mehackit.org/assets/img/midi_notes.png">


## Coding on Sonic Pi

Once you open Sonic Pi you'll probably be able to understand most of the interface but Sonic Pi's documentation has a UI guide that I'm attaching below for your reference.  

<img src="https://sonic-pi.net/media/images/tutorial/GUI.png">

### Playing notes

We'll start by playing a note and this is how you play a note. In your editor, just type `play :c` and hit `Run`. 

Congratulations! You've created and played your first music :p! 

You can also change the octaves in the notes like so
`play :c2` which will play the C note at the 2nd octave. You can experiment with different notes and octaves yourself. You can also refer to the cheat sheet provided above.

You can also play a note by its number. If you look for the note C at 4th octave you'll find the number 60. So, playing `:c4` is the same as playing the 60th note number. To play a note number on Sonic Pi, just type `play` and the corresponding note: 
``` Ruby
play 60
```
Notice how we did not include the colon as we did in the `play :c` command. When we play a number, we don't have to use any colon. 


## Changing the Synth

One thing you'll notice, that these notes sound very different than a normal piano. That's because Sonic Pi uses a default synthesizer and we can change the synth with the `use_synth` command. A bunch of synth options will appear in a list like so: 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/c40xlk4jl3f5c5mv9wwi.png)

I'm using the `piano` synth and after that, all my notes will sound like a piano

``` Ruby
use_synth :piano
play :c4
```
Awesome right? You can try playing with different synth options available to you by Sonic Pi. 

## Sleep 

We just played a single note up until now, but what if we want to play more than one note? I can just play another note below my first note, simple right? 
```Ruby
play :c4
play :c2
```
No. If you tried it yourself you will know what's wrong. The problem is that Sonic Pi executes lines of code quickly. So technically, before my first note even finishes playing, my second note will start which is almost instant. So what's the workaround? For that, we have the `sleep` command. 

```Ruby
play :c4
sleep 1
play :c2
```
Once the first note is played, the sleep command will tell Sonic Pi to stop for *a second* and *then* play the next note. The time is in seconds so if you type `sleep 0.25`, it will sleep for a Quarter of a second. 

## Parameters

You can tweak notes by changing their different parameters. You can add parameters to your notes separated by a comma.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/8pfzxwxea1fscsegtw6l.png)

You'll see a bunch of parameter options that we can use. We'll go through a few of them. 

### Pan

With the `pan` parameter, you can change the direction of your sound. For example, you can play your sound on the right or left or in the middle or anywhere in-between left and right. The value ranges from `-1 to 1`. -1 being extreme left and 1 being extreme right. 

```Ruby
play :c3, pan: -1 #plays the note on left
sleep 1
play :c3, pan: 1 #plays the note on right
sleep 1
play :c3, pan: 0 #plays the note in the middle(default)
sleep 1
play :c3, pan: -0.25 #plays the note a little bit to the left
```

### Amp

With the `amp` parameter, you can change the amp of your notes. Which basically means you can change the volume.
```Ruby
play :c4, amp: 2
```
If you run the above snippet, you'll hear the volume has increased. The default amp value is 1 and it starts from 0. If you put `amp: 0`, the volume will be 0 and you won't be able to hear anything. 

## Samples

We'll explore something really interesting called samples. Samples are basically pre-recorded sounds that you can use in your music. Sonic Pi has around 130 of such samples and also gives you the option to use external samples that aren't available in Sonic Pi. You can play different samples using the `sample` keyword and you'll get a list of samples you can select from. 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/7fgtaw8pcthpwqwybrt5.png)

There are a lot of different cool samples that you can explore. For example, the following sample will give you a `kick` or a `beat` sound. 

```Ruby
sample :bd_haus
```
Just like the `play` command, samples also have parameters that you can use to tweak how your samples sound. You can play with different samples and different parameters. 


## Loops 

That was nice, in fact, it was so nice that we'd like to play it over and over again. So rather than playing the sample on every line, which will take me forever to do so, we can use the loop command given to us by Sonic Pi. The syntax goes something like this:

```Ruby
loop do
  #code that you want to loop
end
```
Note that every loop *must have at least one sleep command*. Otherwise, Sonic Pi will try to play everything at once, which will completely cause it to break and will throw you an error about the loop not sleeping or syncing. 


```Ruby
loop do
  sample :bd_haus
  sleep 1
end
```
As you might have guessed, the above code snippet will play the `bd_haus` sample every second over and over again. 

## Done and Dusted?
That's about it for now! Play around with notes, samples, loops, and try changing different parameters and get creative! Remember, it's all fun and games. There is no such thing as a right and a wrong approach in art! It all depends on your creativity. 


### Part 2
In [Part 2](https://dev.to/obitodarky/create-music-with-code-2-57je), I have covered the basics of `live_loop`, adding effects, and using randomness in your music! Do check out if you like this part :) 

### Contact Me
You can contact me if you have any doubts and you can also let me know on social media and do give a feedback! :D 
- [Find me on Twitter](https://twitter.com/obitodarky)
- [Find me on GitHub](https://github.com/obitodarky)


Stay Home and Stay Safe :) <3