Skip to content
Permalink
master
Go to file
 
 
Cannot retrieve contributors at this time
219 lines (182 sloc) 5.27 KB
-- scriptname: 4_voice
-- v1.1.0 @jah
engine.name = 'R'
local R = require 'r/lib/r'
local Option = require 'params/option'
local Formatters = require 'formatters'
local function to_hz(note)
local exp = (note - 21) / 12
return 27.5 * 2^exp
end
function init()
engine.new("FreqGate", "FreqGate")
engine.new("LFO", "MultiLFO")
engine.new("Env", "ADSREnv")
engine.new("FilterMod", "LinMixer")
engine.new("Osc", "PulseOsc")
engine.new("Filter", "MMFilter")
engine.new("Amp", "Amp")
engine.new("SoundOut", "SoundOut")
engine.set("Osc.FM", 1)
engine.connect("FreqGate/Frequency", "Osc*FM")
engine.connect("FreqGate/Gate", "Env*Gate")
engine.connect("LFO/Sine", "Osc*PWM")
engine.connect("LFO/Sine", "FilterMod*In1")
engine.connect("Env/Out", "FilterMod*In2")
engine.connect("Env/Out", "Amp*Lin")
engine.connect("FilterMod/Out", "Filter*FM")
engine.connect("Osc/Out", "Filter*In")
engine.connect("Filter/Lowpass", "Amp*In")
engine.connect("Amp/Out", "SoundOut*Left")
engine.connect("Amp/Out", "SoundOut*Right")
local midi_note_list = {}
for i=0,127 do
midi_note_list[i] = i
end
local gate = Option.new("gate", "Gate", {0, 1})
gate.action = function(value)
engine.set("FreqGate.Gate", value-1)
end
params:add { param=gate }
local note = Option.new("note", "Note", midi_note_list, 60)
note.action = function(value)
engine.set("FreqGate.Frequency", to_hz(value))
end
params:add { param=note }
params:add {
type="control",
id="osc_tune",
name="Osc.Tune",
controlspec=R.specs.PulseOsc.Tune,
action=function(value) engine.set("Osc.Tune", value) end
}
local lfo_frequency_spec = R.specs.MultiLFO.Frequency:copy()
lfo_frequency_spec.default = 0.2
params:add {
type="control",
id="lfo_frequency",
name="LFO.Frequency",
controlspec=lfo_frequency_spec,
formatter=Formatters.round(0.001),
action=function(value) engine.set("LFO.Frequency", value) end
}
params:add {
type="control",
id="osc_pulsewidth",
name="Osc.PulseWidth",
controlspec=R.specs.PulseOsc.PulseWidth,
formatter=Formatters.percentage,
action=function(value) engine.set("Osc.PulseWidth", value) end
}
local lfo_to_osc_pwm_spec = R.specs.PulseOsc.PWM:copy()
lfo_to_osc_pwm_spec.default = 0.6
params:add {
type="control",
id="lfo_to_osc_pwm",
name="LFO > Osc.PWM",
controlspec=lfo_to_osc_pwm_spec,
formatter=Formatters.percentage,
action=function(value) engine.set("Osc.PWM", value) end
}
local env_attack_spec = R.specs.ADSREnv.Attack:copy()
env_attack_spec.default = 1
params:add {
type="control",
id="env_attack",
name="Env.Attack",
controlspec=env_attack_spec,
action=function(value) engine.set("Env.Attack", value) end
}
local env_decay_spec = R.specs.ADSREnv.Decay:copy()
env_decay_spec.default = 800
params:add {
type="control",
id="env_decay",
name="Env.Decay",
controlspec=env_decay_spec,
action=function(value) engine.set("Env.Decay", value) end
}
params:add {
type="control",
id="env_sustain",
name="Env.Sustain",
controlspec=R.specs.ADSREnv.Sustain,
formatter=Formatters.percentage,
action=function(value) engine.set("Env.Sustain", value) end
}
local env_release_spec = R.specs.ADSREnv.Release:copy()
env_release_spec.default = 1250
params:add {
type="control",
id="env_release",
name="Env.Release",
controlspec=env_release_spec,
action=function(value) engine.set("Env.Release", value) end
}
local filter_frequency_spec = R.specs.MMFilter.Frequency:copy()
filter_frequency_spec.default = 500
params:add {
type="control",
id="filter_frequency",
name="Filter.Frequency",
controlspec=filter_frequency_spec,
action=function(value) engine.set("Filter.Frequency", value) end
}
local filter_resonance_spec = R.specs.MMFilter.Resonance:copy()
filter_resonance_spec.default = 0.4
params:add {
type="control",
id="filter_resonance",
name="Filter.Resonance",
controlspec=filter_resonance_spec,
formatter=Formatters.percentage,
action=function(value) engine.set("Filter.Resonance", value) end
}
local lfo_to_filter_fm_spec = R.specs.MMFilter.FM:copy()
lfo_to_filter_fm_spec.default = 0.4
params:add {
type="control",
id="lfo_to_filter_fm",
name="LFO > Filter.FM",
controlspec=lfo_to_filter_fm_spec,
formatter=Formatters.percentage,
action=function(value) engine.set("FilterMod.In1", value) end
}
local lfo_to_filter_fm_spec = R.specs.LinMixer.In2:copy()
lfo_to_filter_fm_spec.default = 0.3
params:add {
type="control",
id="env_to_filter_fm",
name="Env > Filter.FM",
controlspec=lfo_to_filter_fm_spec,
formatter=Formatters.percentage,
action=function(value) engine.set("FilterMod.In2", value) end
}
engine.set("FilterMod.Out", 1)
engine.set("Filter.FM", 1)
params:bang()
end
function redraw()
screen.clear()
screen.level(15)
screen.move(1, 10)
screen.text("VOICE")
screen.move(1, 30)
screen.text("See params in menu")
screen.update()
end
function enc(n, delta)
if n == 1 then
mix:delta("output", delta)
end
end
function key(n, z)
if n == 3 then
if z == 1 then
params:set("gate", 2)
else
params:set("gate", 1)
end
redraw()
end
end