Transcript
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?


Top Related