it's so quiet. let's make music

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

Upload: loren-segal

Post on 07-Jul-2015

264 views

Category:

Technology


11 download

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

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?