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