class SynthBlocks::Synth::Monosynth

A monosynth sound generator

Public Class Methods

new(sfreq, preset={}) click to toggle source

Parameters

  • amp_attack, _decay, _sustain, _release - Amp Envelope params

  • flt_attack, _decay, _sustain, _release - Filter Envelope params

  • flt_envmod - filter envelope modulation amount in Hz

  • flt_frequency, flt_Q - filter params

  • osc_waveform - waveform to generate (see Oscillator class)

Calls superclass method SynthBlocks::Core::Sound::new
# File lib/synth_blocks/synth/monosynth.rb, line 18
def initialize(sfreq, preset={})
  super(sfreq, mode: :monophonic)
  @preset = {
    amp_attack: 0.001,
    amp_decay: 0.2,
    amp_sustain: 0.8,
    amp_release: 0.2,
    flt_attack: 0.001,
    flt_decay: 0.05,
    flt_sustain: 0.0,
    flt_release: 0.2,
    flt_envmod: 1000,
    flt_frequency: 2000,
    flt_Q: 2,
    osc_waveform: :square,
    lfo_waveform: :sine,
    lfo_frequency: 2
  }.merge(preset)
  @oscillator = SynthBlocks::Core::Oscillator.new(@sampling_frequency)
  @filter = SynthBlocks::Core::StateVariableFilter.new(@sampling_frequency)
  @filter2 = SynthBlocks::Core::StateVariableFilter.new(@sampling_frequency)
  @lfo = SynthBlocks::Core::Oscillator.new(@sampling_frequency)
  @amp_env = SynthBlocks::Mod::Adsr.new(
    @preset[:amp_attack],
    @preset[:amp_decay],
    @preset[:amp_sustain],
    @preset[:amp_release]
  )
  @flt_env = SynthBlocks::Mod::Adsr.new(
    @preset[:flt_attack],
    @preset[:flt_decay],
    @preset[:flt_sustain],
    @preset[:flt_release]
  )
end

Public Instance Methods

run(offset) click to toggle source

run generator

# File lib/synth_blocks/synth/monosynth.rb, line 57
def run(offset)
  # time in seconds
  t = time(offset)
  events = active_events(t)
  if events.empty?
    0.0
  else
    note = events.keys.last
    event = events[note]
    # lfo_out = (@lfo.run(@preset[:lfo_frequency], waveform: @preset[:lfo_waveform]) + 1) / 8 + 0.5
    osc_out = @oscillator.run(frequency(note), waveform: @preset[:osc_waveform])
    local_started = t - event[:started]
    local_stopped = event[:stopped] && event[:stopped] - event[:started]
    osc_out = @filter.run(osc_out, @preset[:flt_frequency] + @flt_env.run(local_started, local_stopped) * @preset[:flt_envmod], @preset[:flt_Q])
    # osc_out = @filter2.run(osc_out, @preset[:flt_frequency] + @flt_env.run(local_started, local_stopped) * @preset[:flt_envmod], @preset[:flt_Q])
    0.3 * osc_out * @amp_env.run(local_started, local_stopped)
  end
end