It's so quiet. Let's make music.

91
It’s so quiet. Let’s make music. Loren Segal RubyConf 2014

description

Ruby is used for a lot of things, but for some reason, only a few people are using it for music. In a language that is meant to make programming fun, the lack of such creative code is scary. Let's fix the current landscape by learning how to use the tools available in Ruby (and some not) to let those creative juices flow. We will be focusing on how to build sounds from the ground up (the powerful amplitude, and the majestic waveform), so you don't need any prior audio wizardry. Just bring yourself and a Ruby console and we just might create some beautiful music in a beautiful language.

Transcript of It's so quiet. Let's make music.

Page 1: It's so quiet. Let's make music.

It’s so quiet.Let’s make music.

Loren Segal RubyConf 2014

Page 2: It's so quiet. Let's make music.

@lsegal

Page 3: It's so quiet. Let's make music.

WARNING: MUSIC AHEAD🚨 🚨

Page 4: It's so quiet. Let's make music.

What ismusic even?

Page 5: It's so quiet. Let's make music.

S + R = Mound

hythm

usic

Page 6: It's so quiet. Let's make music.

S + R = Mound

hythm

usic

Page 7: It's so quiet. Let's make music.

S + R = Mound

uby

usic

Page 8: It's so quiet. Let's make music.

S + R =ound

uby

Page 9: It's so quiet. Let's make music.

S + R =ound

uby

This talk.

Page 10: It's so quiet. Let's make music.

dSoundd boop.

beep.

Page 11: It's so quiet. Let's make music.

Analog Audio

Page 12: It's so quiet. Let's make music.

Good Vibrations

Page 13: It's so quiet. Let's make music.

Continuous Signal

Page 14: It's so quiet. Let's make music.

DIGITAL AUDIO

Page 15: It's so quiet. Let's make music.

💻 🔊?

Page 16: It's so quiet. Let's make music.

Discrete Signal (not continuous)

187 198

-84 -84

Page 17: It's so quiet. Let's make music.

not continuous,

Just Samples

Page 18: It's so quiet. Let's make music.

Discrete Signal (not continuous)

Page 19: It's so quiet. Let's make music.

Discrete Signal (not continuous)

Page 20: It's so quiet. Let's make music.

Discrete Signal (sampling)

Page 21: It's so quiet. Let's make music.

Discrete Signal (sampling)

Page 22: It's so quiet. Let's make music.

Discrete Signal (sampling)

Page 23: It's so quiet. Let's make music.

Audio Vocabulary[Sample Rate]⇒

“Number of data values for each second of audio”

Measured in Hertz (Hz)

Page 24: It's so quiet. Let's make music.

[0, 214, 231, 35, -193, -245, -72, 167, 252, 105, -139, -255, -137, 107, 252, 165, -74, -246, -192, 38]

20.times.map {|i| (Math.sin(i) * 255).floor }

20 Samples

Page 25: It's so quiet. Let's make music.

Common Sample Rates

44,100 Hz 44,800 Hz 96,000 Hz

used by VHS, CDs

Page 26: It's so quiet. Let's make music.

💻 🔊

Page 27: It's so quiet. Let's make music.

WAVESfundamental

Page 28: It's so quiet. Let's make music.

SINEsin(x)

Page 29: It's so quiet. Let's make music.

#math

Page 30: It's so quiet. Let's make music.
Page 31: It's so quiet. Let's make music.

f(t) = A sin(2πΩt)s

Page 32: It's so quiet. Let's make music.

f(t) = A sin(2πΩt)Amplitude

Frequency

s

Page 33: It's so quiet. Let's make music.

Ampl

itude

Frequency* …ish

Page 34: It's so quiet. Let's make music.

Audio Vocabulary[Amplitude]⇒

“Loudness” Measured in Decibels (dB)

Page 35: It's so quiet. Let's make music.

Audio Vocabulary[Frequency]⇒

“Pitch” Measured in Hertz (Hz)

Page 36: It's so quiet. Let's make music.

s = Sample Rate

Ωs

= e.g., 44100

Page 37: It's so quiet. Let's make music.

Frequency?

Page 38: It's so quiet. Let's make music.

Ω = 440 Hz [A3]

Page 39: It's so quiet. Let's make music.

f(t) = sin(0.0627t)

Page 40: It's so quiet. Let's make music.
Page 41: It's so quiet. Let's make music.

SQUARE

Page 42: It's so quiet. Let's make music.

f(t) = A ((Ωt) < 0.5 ? -1 : 1)s

Page 43: It's so quiet. Let's make music.

Triangle

Page 44: It's so quiet. Let's make music.

f(t) = A(1 - 4(Ωt - Ωt ))ss

Page 45: It's so quiet. Let's make music.

SAW(tooth)

Page 46: It's so quiet. Let's make music.

f(t) = 2A (Ωt - Ωt )s s

Page 47: It's so quiet. Let's make music.

NOISE

Page 48: It's so quiet. Let's make music.

f(t) = A rand()rand() = some evenly distributed random fn

Page 49: It's so quiet. Let's make music.

Show, Don’t Tell

Page 50: It's so quiet. Let's make music.

Processing Audio

Page 51: It's so quiet. Let's make music.

From synthesis

Page 52: It's so quiet. Let's make music.

To analysis

Page 53: It's so quiet. Let's make music.

Fourier Transform

Page 54: It's so quiet. Let's make music.

It’s Complex

Page 55: It's so quiet. Let's make music.

Literally.

Page 56: It's so quiet. Let's make music.

SIDE VIEW OF f(t)!

Page 57: It's so quiet. Let's make music.

thefouriertransform.com

Page 58: It's so quiet. Let's make music.

“All waveforms, no matter what you scribble or observe in the universe, are actually just the sum of simple sinusoids of different frequencies.”

Page 59: It's so quiet. Let's make music.
Page 60: It's so quiet. Let's make music.
Page 61: It's so quiet. Let's make music.
Page 62: It's so quiet. Let's make music.
Page 63: It's so quiet. Let's make music.
Page 64: It's so quiet. Let's make music.

Analysis Applications

Page 65: It's so quiet. Let's make music.

1. Pitch Detection: Instrument Tuner, Visualization

Page 66: It's so quiet. Let's make music.

2. Wave Shaping: Equalizer, Autotune

Page 67: It's so quiet. Let's make music.

Let’s see it.

Page 68: It's so quiet. Let's make music.

RUBY TIME

Page 69: It's so quiet. Let's make music.

ruby-audio$ gem install

Page 70: It's so quiet. Let's make music.

libsndfile wrapper

Page 71: It's so quiet. Let's make music.

require  'ruby-­‐audio'  include  RubyAudio      sample_rate,  len,  freq,  amp  =  48000,  10,  440,  0.9    buf  =  Buffer.float(sample_rate  *  len)  buf.size.times  do  |i|      sine_rad  =  ((freq  *  Math::PI  *  2)  /  sample_rate)  *  i      buf[i]  =  amp  *  Math.sin(sine_rad)  end      format  =  FORMAT_WAV  |  FORMAT_PCM_16  info  =  SoundInfo.new(channels:  1,  samplerate:  sample_rate,  format:  format)  snd  =  Sound.new('out.wav',  'w',  info)  snd.write(buf)  snd.close

Write a Sine Wave

Page 72: It's so quiet. Let's make music.

easy_audio$ gem install

Page 73: It's so quiet. Let's make music.

portaudio wrapper

Page 74: It's so quiet. Let's make music.

require  'easy_audio'  

EasyAudio.easy_open(&EasyAudio::Waveforms::SINE)  sleep  2  #  play  for  2  seconds

Play a Sine Wave

Page 75: It's so quiet. Let's make music.

require  'easy_audio'  

triangle  =  EasyAudio::Waveforms::TRIANGLE  stream  =  EasyAudio.easy_open(freq:  220,  &triangle)  Thread.new  {  loop  {  stream.frequency  +=  50;  sleep  0.2  }  }  sleep  3

Increase Frequency / Time

Page 76: It's so quiet. Let's make music.

Audio Plugins

Page 77: It's so quiet. Let's make music.

VST

Page 78: It's so quiet. Let's make music.

github.com/lsegal/ easy_vst

Page 79: It's so quiet. Let's make music.

AudioEffect*  createEffectInstance(audioMasterCallback  audioMaster)  {      ruby_init();      ruby_init_loadpath();      rb_require("drb/drb");      rb_eval_string("DRb.start_service");          return  new  SampleVST(audioMaster);  }      //  ...          server  =  rb_eval_string(          "DRbObject.new_with_uri('druby://localhost:9090')");

Embedding DRb - C++

Page 80: It's so quiet. Let's make music.

rb_funcall(      server,                                  //  the  DRb  object      rb_intern(“process”),      //  the  remote  method      1,                                            //  one  argument      INT2FIX(sampleFrames));  //  number  of  samples

Call Distributed Method

Page 81: It's so quiet. Let's make music.

Fun Time!

Page 82: It's so quiet. Let's make music.

Summary

Page 83: It's so quiet. Let's make music.

1. Audio is samples!

Page 84: It's so quiet. Let's make music.

2. Making waves!Sine, Square, Saw, Triangle, Noise

Page 85: It's so quiet. Let's make music.

3. Fourier = analysis

Page 86: It's so quiet. Let's make music.

4. Ruby libraries!ruby-audio

easy_audio easy_vst

Page 87: It's so quiet. Let's make music.

5. Music!

Page 88: It's so quiet. Let's make music.

💾gnuu.org

Page 89: It's so quiet. Let's make music.

github.com/lsegal

Page 90: It's so quiet. Let's make music.

@lsegal

Page 91: It's so quiet. Let's make music.

Thanks! Questions?