Permalink
Cannot retrieve contributors at this time
| --- Audio class | |
| -- @classmod audio | |
| -- @alias Audio | |
| local cs = require 'controlspec' | |
| local Audio = {} | |
| --- set headphone gain. | |
| -- @tparam number gain (0-64) | |
| Audio.headphone_gain = function(gain) | |
| _norns.gain_hp(gain) | |
| end | |
| --- set level for ADC input. | |
| -- @param level in [0, 1] | |
| Audio.level_adc = function(level) | |
| _norns.level_adc(level) | |
| end | |
| --- set level for *both* output channels. | |
| -- @param level in [0, 1] | |
| Audio.level_dac = function(level) | |
| _norns.level_dac(level) | |
| end | |
| -- @static | |
| Audio.level_eng = function(level) | |
| _norns.level_ext(level) | |
| end | |
| --- set monitor level for *both* input channels. | |
| -- @param level in [0, 1] | |
| Audio.level_monitor = function(level) | |
| _norns.level_monitor(level) | |
| end | |
| --- set monitor mode to mono. | |
| --- both inputs will be mixed to both outputs. | |
| Audio.monitor_mono = function() | |
| _norns.monitor_mix_mono() | |
| end | |
| --- set monitor mode to stereo. | |
| --- each input will be monitored on the respective output. | |
| Audio.monitor_stereo = function() | |
| _norns.monitor_mix_stereo() | |
| end | |
| --- set tape level. | |
| -- @param level [0,1] | |
| Audio.level_tape = function(level) | |
| _norns.level_tape(level) | |
| end | |
| --- set cut master level. | |
| -- @param level [0,1] | |
| Audio.level_cut = function(level) | |
| _norns.level_cut_master(level) | |
| end | |
| --- enable input pitch analysis. | |
| Audio.pitch_on = function() | |
| _norns.audio_pitch_on() | |
| end | |
| --- disable input pitch analysis (saves CPU). | |
| Audio.pitch_off = function() | |
| _norns.audio_pitch_off() | |
| end | |
| --- restart the audio engine (recompile sclang). | |
| Audio.restart = function() | |
| _norns.restart_audio() | |
| end | |
| --- Effects functions | |
| -- @section Effects | |
| --- reverb on. | |
| function Audio.rev_on() | |
| _norns.rev_on() | |
| end | |
| --- reverb off. | |
| function Audio.rev_off() | |
| _norns.rev_off() | |
| end | |
| --- reverb Monitor level. | |
| -- @tparam number val | |
| function Audio.level_monitor_rev(val) | |
| _norns.level_monitor_rev(val) | |
| end | |
| --- reverb ENGINE level. | |
| -- @tparam number val | |
| function Audio.level_eng_rev(val) | |
| _norns.level_ext_rev(val) | |
| end | |
| --- reverb TAPE level. | |
| -- @tparam number val | |
| function Audio.level_tape_rev(val) | |
| _norns.level_tape_rev(val) | |
| end | |
| --- reverb DAC level. | |
| -- @tparam number val | |
| function Audio.level_rev_dac(val) | |
| _norns.level_rev_dac(val) | |
| end | |
| --- set reverb parameter. | |
| -- @tparam string name | |
| -- @tparam number val | |
| function Audio.rev_param(name, val) | |
| _norns.rev_param(name, val) | |
| end | |
| --- turn on compressor. | |
| function Audio.comp_on() | |
| _norns.comp_on() | |
| end | |
| --- turn off compressor. | |
| function Audio.comp_off() | |
| _norns.comp_off() | |
| end | |
| --- compressor mix amount. | |
| -- @tparam number val | |
| function Audio.comp_mix(val) | |
| _norns.comp_mix(val) | |
| end | |
| --- set compressor parameter. | |
| -- @tparam string name | |
| -- @tparam number val | |
| function Audio.comp_param(name, val) | |
| _norns.comp_param(name, val) | |
| end | |
| --- Tape Functions | |
| -- @section Tape | |
| --- open a tape file. | |
| -- @param file | |
| Audio.tape_play_open = function(file) | |
| _norns.tape_play_open(file) | |
| end | |
| --- start tape playing. | |
| Audio.tape_play_start = function() | |
| _norns.tape_play_start() | |
| end | |
| --- stop tape playing. | |
| Audio.tape_play_stop = function() | |
| _norns.tape_play_stop() | |
| end | |
| --- open a tape recording file. | |
| -- @param file | |
| Audio.tape_record_open = function(file) | |
| _norns.tape_record_open(file) | |
| end | |
| --- start tape recording. | |
| Audio.tape_record_start = function() | |
| _norns.tape_record_start() | |
| end | |
| --- stop tape recording. | |
| Audio.tape_record_stop = function() | |
| _norns.tape_record_stop() | |
| end | |
| --- Softcut levels | |
| -- @section softcut | |
| --- softcut adc level. | |
| -- @tparam number value | |
| Audio.level_adc_cut = function(value) | |
| _norns.level_adc_cut(value) | |
| end | |
| --- softcut eng level. | |
| -- @tparam number value | |
| Audio.level_eng_cut = function(value) | |
| _norns.level_ext_cut(value) | |
| end | |
| --- softcut tape level. | |
| -- @tparam number value | |
| Audio.level_tape_cut = function(value) | |
| _norns.level_tape_cut(value) | |
| end | |
| --- softcut cut reverb level. | |
| -- @tparam number value | |
| Audio.level_cut_rev = function(value) | |
| _norns.level_cut_rev(value) | |
| end | |
| --- global functions | |
| -- @section globals | |
| --- callback for VU meters. | |
| -- scripts should redefine this. | |
| -- @param in1 input level 1 in [0, 63], audio taper | |
| -- @param in2 | |
| -- @param out1 | |
| -- @param out2 | |
| Audio.vu = function(in1, in2, out1, out2) | |
| -- print (in1 .. '\t' .. in2 .. '\t' .. out1 .. '\t' .. out2) | |
| end | |
| --- helpers | |
| -- @section helpers | |
| --- set output level, clamped, save state. | |
| -- @tparam number value audio level (0-64) | |
| function Audio.set_audio_level(value) | |
| local l = util.clamp(value,0,64) | |
| if l ~= norns.state.out then | |
| norns.state.out = l | |
| Audio.output_level(l / 64.0) | |
| end | |
| end | |
| --- adjust output level, clamped, save state. | |
| -- @tparam number delta amount to change output level | |
| function Audio.adjust_output_level(delta) | |
| local l = util.clamp(norns.state.out + delta,0,64) | |
| if l ~= norns.state.out then | |
| norns.state.out = l | |
| Audio.output_level(l / 64.0) | |
| end | |
| end | |
| --- print audio file info | |
| -- @tparam string path (from dust directory) | |
| function Audio.file_info(path) | |
| -- dur, ch, rate | |
| --print("file_info: " .. path) | |
| return _norns.sound_file_inspect(path) | |
| end | |
| function Audio.add_params() | |
| params:add_group("LEVELS",9) | |
| params:add_control("output_level", "output", | |
| cs.new(-math.huge,0,'db',0,norns.state.mix.output,"dB")) | |
| params:set_action("output_level", | |
| function(x) | |
| audio.level_dac(util.dbamp(x)) | |
| norns.state.mix.output = x | |
| end) | |
| params:set_save("output_level", false) | |
| params:add_control("input_level", "input", | |
| cs.new(-math.huge,0,'db',0,norns.state.mix.input,"dB")) | |
| params:set_action("input_level", | |
| function(x) | |
| audio.level_adc(util.dbamp(x)) | |
| norns.state.mix.input = x | |
| end) | |
| params:set_save("input_level", false) | |
| params:add_control("monitor_level", "monitor", | |
| cs.new(-math.huge,0,'db',0,norns.state.mix.monitor,"dB")) | |
| params:set_action("monitor_level", | |
| function(x) | |
| audio.level_monitor(util.dbamp(x)) | |
| norns.state.mix.monitor = x | |
| end) | |
| params:set_save("monitor_level", false) | |
| params:add_control("engine_level", "engine", | |
| cs.new(-math.huge,0,'db',0,norns.state.mix.engine,"dB")) | |
| params:set_action("engine_level", | |
| function(x) | |
| audio.level_eng(util.dbamp(x)) | |
| norns.state.mix.engine = x | |
| end) | |
| params:set_save("engine_level", false) | |
| params:add_control("softcut_level", "softcut", | |
| cs.new(-math.huge,0,'db',0,norns.state.mix.cut,"dB")) | |
| params:set_action("softcut_level", | |
| function(x) | |
| audio.level_cut(util.dbamp(x)) | |
| norns.state.mix.cut = x | |
| end) | |
| params:set_save("softcut_level", false) | |
| params:add_control("tape_level", "tape", | |
| cs.new(-math.huge,0,'db',0,norns.state.mix.tape,"dB")) | |
| params:set_action("tape_level", | |
| function(x) | |
| audio.level_tape(util.dbamp(x)) | |
| norns.state.mix.tape = x | |
| end) | |
| params:set_save("tape_level", false) | |
| params:add_separator() | |
| params:add_option("monitor_mode", "monitor mode", {"STEREO", "MONO"}, | |
| norns.state.mix.monitor_mode) | |
| params:set_action("monitor_mode", | |
| function(x) | |
| if x == 1 then audio.monitor_stereo() | |
| else audio.monitor_mono() end | |
| norns.state.mix.monitor_mode = x | |
| end) | |
| params:set_save("monitor_mode", false) | |
| params:add_number("headphone_gain", "headphone gain", 0, 63, | |
| norns.state.mix.headphone_gain) | |
| params:set_action("headphone_gain", | |
| function(x) | |
| audio.headphone_gain(x) | |
| norns.state.mix.headphone_gain = x | |
| end) | |
| params:set_save("headphone_gain", false) | |
| params:add_group("REVERB",11) | |
| params:add_option("reverb", "reverb", {"OFF", "ON"}, | |
| norns.state.mix.aux) | |
| params:set_action("reverb", | |
| function(x) | |
| if x == 1 then audio.rev_off() else audio.rev_on() end | |
| norns.state.mix.aux = x | |
| end) | |
| params:set_save("reverb", false) | |
| local cs_DB_LEVEL = cs.new(-math.huge,18,'db',0,0,"dB") | |
| local cs_DB_LEVEL_MUTE = cs.new(-math.huge,18,'db',0,-math.huge,"dB") | |
| local cs_DB_LEVEL_9DB = cs.new(-math.huge,18,'db',0,-9,"dB") | |
| params:add_control("rev_eng_input", "input engine", cs_DB_LEVEL_9DB) | |
| params:set_action("rev_eng_input", | |
| function(x) audio.level_eng_rev(util.dbamp(x)) end) | |
| params:add_control("rev_cut_input", "input softcut", cs_DB_LEVEL_9DB) | |
| params:set_action("rev_cut_input", | |
| function(x) audio.level_cut_rev(util.dbamp(x)) end) | |
| params:add_control("rev_monitor_input", "input monitor", cs_DB_LEVEL_MUTE) | |
| params:set_action("rev_monitor_input", | |
| function(x) audio.level_monitor_rev(util.dbamp(x)) end) | |
| params:add_control("rev_tape_input", "input tape", cs_DB_LEVEL_MUTE) | |
| params:set_action("rev_tape_input", | |
| function(x) audio.level_tape_rev(util.dbamp(x)) end) | |
| params:add_control("rev_return_level", "return level", cs_DB_LEVEL) | |
| params:set_action("rev_return_level", | |
| function(x) audio.level_rev_dac(util.dbamp(x)) end) | |
| local cs_IN_DELAY = cs.new(20,100,'lin',0,60,'ms') | |
| params:add_control("rev_pre_delay", "pre delay", cs_IN_DELAY) | |
| params:set_action("rev_pre_delay", | |
| function(x) audio.rev_param("pre_del",x) end) | |
| local cs_LF_FC = cs.new(50,1000,'exp',0, 200,'hz') | |
| params:add_control("rev_lf_fc", "lf fc", cs_LF_FC) | |
| params:set_action("rev_lf_fc", | |
| function(x) audio.rev_param("lf_fc",x) end) | |
| local cs_RT60 = cs.new(0.1,16,'lin',0,6,'s') | |
| params:add_control("rev_low_time", "low time", cs_RT60) | |
| params:set_action("rev_low_time", | |
| function(x) audio.rev_param("low_rt60",x) end) | |
| params:add_control("rev_mid_time", "mid time", cs_RT60) | |
| params:set_action("rev_mid_time", | |
| function(x) audio.rev_param("mid_rt60",x) end) | |
| local cs_HF_DAMP = cs.new(1500,20000,'exp',0,6000,'hz') | |
| params:add_control("rev_hf_damping", "hf damping", cs_HF_DAMP) | |
| params:set_action("rev_hf_damping", | |
| function(x) audio.rev_param("hf_damp",x) end) | |
| --[[ | |
| local cs_EQ_FREQ1 = cs.new(40,2500,'exp',0,315,'hz') | |
| params:add_control("rev_eq1_freq","rev eq1 freq", cs_EQ_FREQ1) | |
| params:set_action("rev_eq1_freq", | |
| function(x) audio.aux_param("eq1_freq",x) end) | |
| local cs_EQ_LVL = cs.new(-15,15,'lin',0,0,"dB") | |
| params:add_control("rev_eq1_level","rev eq1 level", cs_EQ_LVL) | |
| params:set_action("rev_eq1_level", | |
| function(x) audio.aux_param("eq1_level",x) end) | |
| local cs_EQ_FREQ2 = cs.new(160,10000,'exp',0,1500,'hz') | |
| params:add_control("rev_eq2_freq","rev eq2 freq", cs_EQ_FREQ2) | |
| params:set_action("rev_eq2_freq", | |
| function(x) audio.aux_param("eq2_freq",x) end) | |
| params:add_control("rev_eq2_level","rev eq2 level", cs_EQ_LVL) | |
| params:set_action("rev_eq2_level", | |
| function(x) audio.aux_param("eq2_level",x) end) | |
| params:add_control("rev_level","rev level", cs_DB_LEVEL) | |
| params:set_action("rev_level", | |
| function(x) audio.aux_param("level",x) end) | |
| --]] | |
| params:add_group("COMPRESSOR",8) | |
| params:add_option("compressor", "compressor", {"OFF", "ON"}, | |
| norns.state.mix.ins) | |
| params:set_action("compressor", | |
| function(x) | |
| if x == 1 then | |
| audio.comp_off() | |
| else | |
| audio.comp_on() | |
| end | |
| norns.state.mix.ins = x | |
| end) | |
| params:set_save("compressor", false) | |
| local cs_params = cs.new(0,1,'lin',0,1,'') | |
| params:add_control("comp_mix", "mix", cs_MIX) | |
| params:set_action("comp_mix", | |
| function(x) audio.comp_mix(x) end) | |
| local cs_RATIO = cs.new(1,20,'lin',0,4,'') | |
| params:add_control("comp_ratio", "ratio", cs_RATIO) | |
| params:set_action("comp_ratio", | |
| function(x) audio.comp_param("ratio",x) end) | |
| local cs_THRESH = cs.new(-100,10,'db',0,-18,'dB') | |
| params:add_control("comp_threshold", "threshold", cs_THRESH) | |
| params:set_action("comp_threshold", | |
| function(x) audio.comp_param("threshold",x) end) | |
| local cs_ATTACK = cs.new(1,1000,'exp',0,5,'ms') | |
| params:add_control("comp_attack", "attack", cs_ATTACK) | |
| params:set_action("comp_attack", | |
| function(x) audio.comp_param("attack", x*0.001) end) | |
| local cs_RELEASE = cs.new(1,1000,'exp',0,50,'ms') | |
| params:add_control("comp_release", "release", cs_RELEASE) | |
| params:set_action("comp_release", | |
| function(x) audio.comp_param("release",x * 0.001) end) | |
| local cs_PREGAIN = cs.new(-20,60,'db',0,0,'dB') | |
| params:add_control("comp_pre_gain", "pre gain", cs_PREGAIN) | |
| params:set_action("comp_pre_gain", | |
| function(x) audio.comp_param("gain_pre",x) end) | |
| local cs_POSTGAIN = cs.new(-20,60,'db',0,9,'dB') | |
| params:add_control("comp_post_gain", "post gain", cs_POSTGAIN) | |
| params:set_action("comp_post_gain", | |
| function(x) audio.comp_param("gain_post",x) end) | |
| params:add_group("SOFTCUT",3) | |
| params:add_control("cut_input_adc", "input adc", cs_MAIN_LEVEL) | |
| params:set_action("cut_input_adc", | |
| function(x) audio.level_adc_cut(util.dbamp(x)) end) | |
| params:add_control("cut_input_eng", "input engine", cs_MAIN_LEVEL) | |
| params:set_action("cut_input_eng", | |
| function(x) audio.level_eng_cut(util.dbamp(x)) end) | |
| params:add_control("cut_input_tape", "input tape", cs_MAIN_LEVEL) | |
| params:set_action("cut_input_tape", | |
| function(x) audio.level_tape_cut(util.dbamp(x)) end) | |
| end | |
| return Audio |