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