class ColtraneSynth::Base

Constants

SAMPLE_RATE

Attributes

buffer[R]
device[R]

Public Class Methods

new() click to toggle source
# File lib/coltrane/synth/base.rb, line 13
def initialize
  @device = CoreAudio.default_output_device
end
play(something, duration = 1.0) click to toggle source
# File lib/coltrane/synth/base.rb, line 9
def self.play(something, duration = 1.0)
  new.play(*extract_frequencies(something), duration: duration)
end

Private Class Methods

extract_frequencies(arg) click to toggle source
# File lib/coltrane/synth/base.rb, line 33
def self.extract_frequencies(arg)
  case arg
  when Coltrane::Chord then arg.notes.map { |n| n.frequency.octave(4).to_f }
  when Coltrane::PitchClass then arg.frequency.octave(4).to_f
  when Coltrane::Voicing then arg.frequencies.map(&:to_f)
  end
end

Public Instance Methods

play(*freqs, duration: 1.0) click to toggle source
# File lib/coltrane/synth/base.rb, line 17
def play(*freqs, duration: 1.0)
  @device = CoreAudio.default_output_device
  buffer = @device.output_loop(SAMPLE_RATE)

  SAMPLE_RATE.times do |i|
    sound = freqs.reduce(0) { |sum, freq| Math.sin(phase(freq) * i) + sum }
    buffer[i] = (sound * (0x6AFF / freqs.size)).round
  end

  buffer.start
  sleep duration
  buffer.stop
end

Private Instance Methods

phase(freq) click to toggle source
# File lib/coltrane/synth/base.rb, line 45
def phase(freq)
  (Math::PI * 2.0 * freq) / SAMPLE_RATE.to_f
end
sine_wave(freq, i) click to toggle source
# File lib/coltrane/synth/base.rb, line 41
def sine_wave(freq, i)
  Math.sin(phase(freq) * i)
end