From 5f67506f9f7b1f2c3c54ae1fc0e51f35b5357fbd Mon Sep 17 00:00:00 2001 From: dan derks Date: Tue, 31 Oct 2023 11:55:20 -0400 Subject: [PATCH 01/10] update: lfo v2 --- norns/reference/lib/lfo.md | 96 +++++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/norns/reference/lib/lfo.md b/norns/reference/lib/lfo.md index 0033a4bc..d482fdab 100644 --- a/norns/reference/lib/lfo.md +++ b/norns/reference/lib/lfo.md @@ -38,7 +38,7 @@ Before we dive into code examples, let's cover the attributes associated with th An LFO is made of the following attributes: -- `shape`: the shape of the LFO. options are `sine`, `saw`, `square`, `random` (default `sine`) +- `shape`: the shape of the LFO. options are `sine`, `tri`, `up`, `down`, `saw`, `square`, `random` (default `sine`) - `min`: number which represents the lowest value the LFO will reach at full depth (default `0`) @@ -52,6 +52,8 @@ An LFO is made of the following attributes: - `period`: number, which in `clocked` mode represents beats or in `free` mode represents seconds (default `4`, assuming `clocked` mode by default) +- `phase`: number, the phase shift amount for this LFO (range: `0.0` to `1.0`; default: `0`) + - `baseline`: string which represents the base value from which the LFO's movement is calculated. options are `min`, `center`, or `max` (default `min`) - `reset_target`: string which determines the LFO reset behavior. Options are `floor`, `ceiling`, `mid: falling`, and `mid: rising`; this determines which point the reset will return the LFO to (default `floor`) @@ -161,6 +163,7 @@ To go further, there are additional `:set` and `:get` methods, which connect - `offset`: number `-1.0` to `1.0` for offset - `mode`: string `clocked` or `free` - `period`: number; if mode is 'clocked' then number represents beats; if mode is 'free' then number represents seconds +- `phase`: number, the phase shift amount for this LFO (range:` 0.0`to`1.0`; default:` 0`) - `baseline`: string `min`, `center`, `max` - `reset_target`: string `floor`, `ceiling`, `mid: falling`, `mid: rising`; determines whether the LFO value returns to bottom, top, halfway going downward, or halfway going upward - `ppqn`: number representing the resolution of the LFO @@ -362,3 +365,94 @@ function redraw() screen.update() end ``` + +### delta changes + +It's possible to use a `control` parameter's current value as the center-point for an LFO: + +```lua +-- LFO examples: bi-polar LFO + delta behavior + +-- goal: use a parameter's value as the centerpoint for an LFO +-- note: use with 'control' parameters! + +_lfos = require 'lfo' + +engine.name = 'PolyPerc' +s = require 'sequins' + +function init() + engine.gain(2.2) + hz_vals = s{400,600,200,350} + sync_vals = s{1,1/3,1/2,1/6,2} + clock.run(iter) + + clock.run(redraw_clock) + + params:add_control('cutoff', 'cutoff', controlspec.new(400,7000,'lin',1/100,3700)) + params:set_action('cutoff',function(x) engine.cutoff(x) end) + + cutoffLFO = _lfos:add{ + shape = 'sine', -- shape + min = -1, -- min + max = 1, -- max + depth = 0.2, -- depth (0 to 1) + mode = 'clocked', -- mode + period = 6, -- period (in 'clocked' mode, represents 4/4 bars) + baseline = 'center', + action = function() params:lookup_param('cutoff').action(calculate_bipolar_lfo_movement(cutoffLFO, 'cutoff')) end + } + cutoffLFO:add_params('myLFO', 'lfo') + params:hide('lfo_min_myLFO') + params:hide('lfo_max_myLFO') + _menu.rebuild_params() + cutoffLFO:start() -- start our LFO, complements ':stop()' + +end + +function redraw_clock() + while true do + redraw() + clock.sleep(1/15) -- 15fps + end +end + +function calculate_bipolar_lfo_movement(lfoID, paramID) + if lfoID:get('depth') > 0 then + return params:lookup_param(paramID).controlspec:map(lfoID:get('scaled')/2 + params:get_raw(paramID)) + else + return params:lookup_param(paramID).controlspec:map(params:get_raw(paramID)) + end +end + +function redraw() + screen.clear() + screen.level(15) + screen.move(10,32) + screen.text('(E2) bipolar lfo depth: '..cutoffLFO:get('depth')) + screen.move(10,42) + screen.text('(E3) param val: '..params:get('cutoff')) + screen.move(10,52) + screen.text("lfo'd param val:") + screen.move(120,52) + local modifiedCutoff = calculate_bipolar_lfo_movement(cutoffLFO, 'cutoff') + screen.text_right(util.round(modifiedCutoff,0.01)..'hz') + screen.update() +end + +function enc(n,d) + if n == 2 then + params:delta('lfo_depth_myLFO',d) + elseif n == 3 then + params:delta('cutoff',d) + end +end + +function iter() + while true do + clock.sync(sync_vals()) + hertz = hz_vals() * math.random(1,2) + engine.hz(hertz) + end +end +``` From 16da6fe541564f7cc687cc1891b9019487c0275c Mon Sep 17 00:00:00 2001 From: dan derks Date: Tue, 14 Nov 2023 16:00:55 -0500 Subject: [PATCH 02/10] Create reflection.md --- norns/reference/lib/reflection.md | 212 ++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 norns/reference/lib/reflection.md diff --git a/norns/reference/lib/reflection.md b/norns/reference/lib/reflection.md new file mode 100644 index 00000000..7815beb8 --- /dev/null +++ b/norns/reference/lib/reflection.md @@ -0,0 +1,212 @@ +--- +layout: default +nav_exclude: true +permalink: /norns/reference/lib/reflection +--- + +## reflection + +### functions + +The following assumes a script has invoked `reflection` via: + +```lua +reflection = require 'reflection' +``` + +| Syntax | Description | +| -------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| my_pattern = reflection.new() | Assign a variable to record and play back a pattern | +| my_pattern.process = `name_of_function` | A script-defined function which parses the recorded pattern data | +| my_pattern:watch({events}) | Commits a table of events to the pattern, if recording is enabled | +| my_pattern:set_rec(rec_state, duration, beat_sync) | Enable / disable record head. `rec_state` is `1` for recording, `2` for queued recording or `0` for not recording. `duration` (optional) is duration in beats for recording. `beat_sync` (optional) is a beat value to sync recording start. | +| my_pattern:start(beat_sync, offset) | Start playback. `beat_sync` (optional) is a beat value to sync playback start. `offset` (optional) will be added to the `beat_sync` value. | +| my_pattern:stop() | Stop playback. | +| my_pattern:set_loop(loop) | Enable (`1`) / disable (`0`) looping | +| my_pattern:set_quantization(q) | Set quantization of pattern data playback, defaults to `1/48` | +| my_pattern:set_length(beats) | Set length of pattern | +| my_pattern:undo() | Undo previous overdub | +| my_pattern:clear() | Clear recorded pattern data | + +### variables + +| Syntax | Description | +| ------------------- | ---------------------------------------------------- | +| my_pattern.rec | Returns the current record state (`1` or `0`) | +| my_pattern.play | Returns the current play state (`1` or `0`) | +| my_pattern.event | Returns a table of the recorded event data | +| my_pattern.count | Returns the total event count | +| my_pattern.step | Returns the current pattern step | +| my_pattern.loop | Returns the current loop state (`1` or `0`) | +| my_pattern.quantize | Returns the pattern data playback quantization value | + +### user script callbacks + +| Syntax | Description | +| ------------------------------- | ----------------------------------------- | +| my_pattern.start_callback | Executes whenever the pattern starts | +| my_pattern.step_callback | Executes with every pattern step | +| my_pattern.end_of_loop_callback | Executes at the end of every pattern loop | +| my_pattern.end_of_rec_callback | Executes when recording has finished | +| my_pattern.end_callback | Executes when the pattern stops | + +### example + +```lua +pattern_time = require 'pattern_time' -- use the pattern_time lib in this script + +function init() + enc_pattern = pattern_time.new() -- establish a pattern recorder + enc_pattern.process = parse_enc_pattern -- assign the function to be executed when the pattern plays back + + enc_value = 0 + pattern_message = "press K3 to start recording" + erase_message = "(no pattern recorded)" + overdub_message = "" + + + screen_dirty = true + screen_timer = clock.run( + function() + while true do + clock.sleep(1/15) + if screen_dirty then + redraw() + screen_dirty = false + end + end + end + ) +end + +function record_enc_value() + enc_pattern:watch( + { + ["value"] = enc_value + } + ) +end + +function parse_enc_pattern(data) + enc_value = data.value + screen_dirty = true +end + +function key(n,z) + if n == 3 and z == 1 then + if enc_pattern.rec == 1 then -- if we're recording... + enc_pattern:rec_stop() -- stop recording + enc_pattern:start() -- start playing + pattern_message = "playing, press K3 to stop" + erase_message = "press K2 to erase" + overdub_message = "hold K1 to overdub" + elseif enc_pattern.count == 0 then -- otherwise, if there are no events recorded.. + enc_pattern:rec_start() -- start recording + record_enc_value() + pattern_message = "recording, press K3 to stop" + erase_message = "press K2 to erase" + overdub_message = "" + elseif enc_pattern.play == 1 then -- if we're playing... + enc_pattern:stop() -- stop playing + pattern_message = "stopped, press K3 to play" + erase_message = "press K2 to erase" + overdub_message = "" + else -- if by this point, we're not playing... + enc_pattern:start() -- start playing + pattern_message = "playing, press K3 to stop" + erase_message = "press K2 to erase" + overdub_message = "hold K1 to overdub" + end + elseif n == 2 and z == 1 then + enc_pattern:rec_stop() -- stops recording + enc_pattern:stop() -- stops playback + enc_pattern:clear() -- clears the pattern + erase_message = "(no pattern recorded)" + pattern_message = "press K3 to start recording" + overdub_message = "" + elseif n == 1 then + enc_pattern:set_overdub(z) -- toggles overdub + overdub_message = z == 1 and "overdubbing" or "hold K1 to overdub" + end + screen_dirty = true +end + +function enc(n,d) + if n == 3 then + enc_value = enc_value + d + record_enc_value() + screen_dirty = true + end +end + +function redraw() + screen.clear() + screen.level(15) + screen.move(0,10) + screen.text("encoder 3 value: "..enc_value) + screen.move(0,40) + screen.text(pattern_message) + screen.move(0,50) + screen.text(erase_message) + screen.move(0,60) + screen.text(overdub_message) + screen.update() +end +``` + +### description + +Record changes to data over time, with variable-rate playback and overdubbing. + +The basic architecture of the `pattern_time` library includes: + +- a `watch` method, which ingests a table of data and assigns it a relative timestamp for future playback + +- a `process` function, which parses the recorded data into meaningful action within a script + +As outlined in the example's `key` handling, `pattern_time` works similarly to an audio recorder, where certain functions and variables need to be coupled in the script for standard use-cases: + +- combine `rec_stop()` and `start()` to loop data after recording + +- use `.count == 0` to determine if a pattern is empty + +- use `.play == 1` to determine is a pattern is currently playing + +#### extended: saving + loading patterns + +The most meaningful persistent data generated by `pattern_time` lives is in: + +- `my_pattern.event` + +- `my_pattern.time` + +- `my_pattern.count` + +- `my_pattern.time_factor` + +Currently, saving and loading these pattern tables is up to the script to employ its own approach. Here's a starting point, using our previous example: + +```lua +function save_pattern(filepath) + local pattern_data = {} -- create a temp container + pattern_data.event = enc_pattern.event + pattern_data.time = enc_pattern.time + pattern_data.count = enc_pattern.count + pattern_data.time_factor = enc_pattern.time_factor + tab.save(pattern_data,filepath) -- permanently save to disk +end + +function load_pattern(filepath) + enc_pattern:rec_stop() -- stops recording + enc_pattern:stop() -- stops playback + enc_pattern:clear() -- clears pattern + local pattern_data = tab.load(filepath) + for k,v in pairs(pattern_data) do + enc_pattern[k] = v + end + pattern_message = "stopped, press K3 to play" + erase_message = "press K2 to erase" + overdub_message = "" + screen_dirty = true +end +``` From c0626504dce78bf8f8d233b95acc60f08c8e5047 Mon Sep 17 00:00:00 2001 From: dan derks Date: Tue, 14 Nov 2023 16:15:18 -0500 Subject: [PATCH 03/10] Update reflection.md --- norns/reference/lib/reflection.md | 335 ++++++++++++++++++++---------- 1 file changed, 229 insertions(+), 106 deletions(-) diff --git a/norns/reference/lib/reflection.md b/norns/reference/lib/reflection.md index 7815beb8..dcbea0cd 100644 --- a/norns/reference/lib/reflection.md +++ b/norns/reference/lib/reflection.md @@ -53,160 +53,283 @@ reflection = require 'reflection' ### example ```lua -pattern_time = require 'pattern_time' -- use the pattern_time lib in this script +_r = require 'reflection' +my_pattern = _r.new() + +g = grid.connect() function init() - enc_pattern = pattern_time.new() -- establish a pattern recorder - enc_pattern.process = parse_enc_pattern -- assign the function to be executed when the pattern plays back - - enc_value = 0 - pattern_message = "press K3 to start recording" - erase_message = "(no pattern recorded)" - overdub_message = "" - - - screen_dirty = true - screen_timer = clock.run( - function() - while true do - clock.sleep(1/15) - if screen_dirty then - redraw() - screen_dirty = false - end + lit = {} + my_pattern.process = process_press + + params:add_option( + "demo", + "demo", + {"all synced: loop","unsynced: loop"}, + 1 + ) + params:set_action("demo", + function(x) + if x == 1 then + params:set("record_duration", 4) + params:set("hold_rec", 1) + params:set("rec_sync_value", 3) + params:set("play_sync_value", 3) + params:set("loop", 2) + elseif x == 2 then + params:set("record_duration", 0) + params:set("hold_rec", 2) + params:set("rec_sync_value", 0) + params:set("play_sync_value", 0) + params:set("loop", 1) + end + grid_redraw() + end + ) + + record_duration = 0 + params:add_number( + "record_duration", + "record duration", + 0, + 128, + record_duration, + function(param) return ( + param:get() == 0 and 'free' or + param:get()..' beats' + ) end + ) + params:set_action("record_duration", function(x) record_duration = x end) + + hold_rec = true + params:add_option( + "hold_rec", + "hold rec for first event?", + {"no","yes"}, + hold_rec and 2 or 1 + ) + params:set_action("hold_rec", function(x) hold_rec = x == 2 end) + + rec_sync_value = nil + params:add_option( + "rec_sync_value", + "sync record start", + {"free","next beat", "next bar"}, + 1 + ) + params:set_action("rec_sync_value", + function(x) + if x == 1 then + rec_sync_value = nil + elseif x == 2 then + rec_sync_value = 1 + elseif x == 3 then + rec_sync_value = 4 end end ) + + play_sync_value = nil + params:add_option( + "play_sync_value", + "sync play start", + {"free","next beat", "next bar"}, + 1 + ) + params:set_action("play_sync_value", + function(x) + if x == 1 then + play_sync_value = nil + elseif x == 2 then + play_sync_value = 1 + elseif x == 3 then + play_sync_value = 4 + end + end + ) + + params:add_option( + "loop", + "loop playback?", + {"no", "yes"}, + 1 + ) + params:set_action("loop", function(x) my_pattern:set_loop(x-1) grid_redraw() end) + + params:add_trigger( + "erase_rec", + "erase recording?" + ) + params:set_action("erase_rec", function(x) my_pattern:clear() lit = {} grid_redraw() end) + + params:add_trigger( + "double_rec", + "double recording" + ) + params:set_action("double_rec", function(x) my_pattern:double() end) + + overdubbing = false + playback_queued = false + + params:bang() + + grid_redraw() end -function record_enc_value() - enc_pattern:watch( - { - ["value"] = enc_value - } - ) +function my_pattern.start_callback() + print('playback started', clock.get_beats()) + playback_queued = false + grid_redraw() +end + +function my_pattern.end_of_rec_callback() + print('recording finished', clock.get_beats()) + grid_redraw() end -function parse_enc_pattern(data) - enc_value = data.value - screen_dirty = true +function my_pattern.end_of_loop_callback() + print('loop ended', clock.get_beats()) + grid_redraw() end -function key(n,z) - if n == 3 and z == 1 then - if enc_pattern.rec == 1 then -- if we're recording... - enc_pattern:rec_stop() -- stop recording - enc_pattern:start() -- start playing - pattern_message = "playing, press K3 to stop" - erase_message = "press K2 to erase" - overdub_message = "hold K1 to overdub" - elseif enc_pattern.count == 0 then -- otherwise, if there are no events recorded.. - enc_pattern:rec_start() -- start recording - record_enc_value() - pattern_message = "recording, press K3 to stop" - erase_message = "press K2 to erase" - overdub_message = "" - elseif enc_pattern.play == 1 then -- if we're playing... - enc_pattern:stop() -- stop playing - pattern_message = "stopped, press K3 to play" - erase_message = "press K2 to erase" - overdub_message = "" - else -- if by this point, we're not playing... - enc_pattern:start() -- start playing - pattern_message = "playing, press K3 to stop" - erase_message = "press K2 to erase" - overdub_message = "hold K1 to overdub" +function my_pattern.end_callback() + print('playback ended') + if my_pattern.loop == 0 then + overdubbing = false + end + lit = {} + grid_redraw() +end + +function g.key(x,y,z) + if x == 1 and y == g.rows then + if z == 1 then + if my_pattern.rec == 0 and my_pattern.queued_rec == nil and my_pattern.count == 0 then + my_pattern:set_rec(hold_rec and 2 or 1, record_duration > 0 and record_duration or nil, rec_sync_value) + elseif my_pattern.count > 0 and my_pattern.play == 0 then + if play_sync_value ~= nil then + playback_queued = true + my_pattern:start(play_sync_value) + else + my_pattern:start() + end + elseif my_pattern.play == 1 then + my_pattern:stop() + else + my_pattern:set_rec(0) + end + end + elseif x == 1 and y == g.rows - 1 then + if z == 1 then + params:set("loop", params:get("loop") == 1 and 2 or 1) end - elseif n == 2 and z == 1 then - enc_pattern:rec_stop() -- stops recording - enc_pattern:stop() -- stops playback - enc_pattern:clear() -- clears the pattern - erase_message = "(no pattern recorded)" - pattern_message = "press K3 to start recording" - overdub_message = "" - elseif n == 1 then - enc_pattern:set_overdub(z) -- toggles overdub - overdub_message = z == 1 and "overdubbing" or "hold K1 to overdub" + elseif x == 1 and y == g.rows - 2 then + if z == 1 then + if my_pattern.count > 0 and my_pattern.play == 1 then + overdubbing = not overdubbing + my_pattern:set_rec(overdubbing and 1 or 0) + end + end + else + local event = { + id = x*8 + y, + x = x, + y = y, + z = z + } + my_pattern:watch(event) + process_press(event) end - screen_dirty = true + grid_redraw() end -function enc(n,d) - if n == 3 then - enc_value = enc_value + d - record_enc_value() - screen_dirty = true +function process_press(e) + if e.z == 1 then + lit[e.id] = { + x = e.x, + y = e.y + } + -- print(clock.get_beats()) + else + if lit[e.id] ~= nil then + lit[e.id] = nil + end end + grid_redraw() end -function redraw() - screen.clear() - screen.level(15) - screen.move(0,10) - screen.text("encoder 3 value: "..enc_value) - screen.move(0,40) - screen.text(pattern_message) - screen.move(0,50) - screen.text(erase_message) - screen.move(0,60) - screen.text(overdub_message) - screen.update() +function grid_redraw() + g:all(0) + if my_pattern.queued_rec ~= nil and my_pattern.queued_rec.state then + g:led(1,g.rows,7) + elseif playback_queued then + g:led(1,g.rows,8) + elseif my_pattern.rec == 1 then + g:led(1,g.rows,15) + g:led(1,g.rows-1,15) + elseif my_pattern.play == 1 then + g:led(1,g.rows,10) + elseif my_pattern.play == 0 and my_pattern.count > 0 then + g:led(1,g.rows,5) + else + g:led(1,g.rows,2) + end + g:led(1,g.rows-1, my_pattern.loop == 1 and 10 or 2) + g:led(1,g.rows-2, overdubbing and 10 or 2) + for i,e in pairs(lit) do + g:led(e.x, e.y, 15) + end + g:refresh() end ``` ### description -Record changes to data over time, with variable-rate playback and overdubbing. +Record clock-synced changes to data over time, with variable-rate playback, overdubbing, and pattern management tools. -The basic architecture of the `pattern_time` library includes: +The basic architecture of the `reflection` library includes: - a `watch` method, which ingests a table of data and assigns it a relative timestamp for future playback - a `process` function, which parses the recorded data into meaningful action within a script -As outlined in the example's `key` handling, `pattern_time` works similarly to an audio recorder, where certain functions and variables need to be coupled in the script for standard use-cases: - -- combine `rec_stop()` and `start()` to loop data after recording - -- use `.count == 0` to determine if a pattern is empty - -- use `.play == 1` to determine is a pattern is currently playing - #### extended: saving + loading patterns The most meaningful persistent data generated by `pattern_time` lives is in: -- `my_pattern.event` +- `my_pattern.event` (a table) + +- `my_pattern.count` (a number) -- `my_pattern.time` +- `my_pattern.endpoint` (a number) -- `my_pattern.count` +- `my_pattern.loop` (a number) -- `my_pattern.time_factor` +- `my_pattern.quantize` (a number) Currently, saving and loading these pattern tables is up to the script to employ its own approach. Here's a starting point, using our previous example: ```lua function save_pattern(filepath) local pattern_data = {} -- create a temp container - pattern_data.event = enc_pattern.event - pattern_data.time = enc_pattern.time - pattern_data.count = enc_pattern.count - pattern_data.time_factor = enc_pattern.time_factor + pattern_data.event = my_pattern.event + pattern_data.length = my_pattern.count/96 -- 96 ppqn + pattern_data.endpoint = my_pattern.endpoint + pattern_data.loop = my_pattern.loop + pattern_data.quantize = my_pattern.quantize tab.save(pattern_data,filepath) -- permanently save to disk end function load_pattern(filepath) - enc_pattern:rec_stop() -- stops recording - enc_pattern:stop() -- stops playback - enc_pattern:clear() -- clears pattern + my_pattern:set_rec(0) -- stops recording + my_pattern:stop() -- stops playback + my_pattern:clear() -- clears pattern local pattern_data = tab.load(filepath) for k,v in pairs(pattern_data) do - enc_pattern[k] = v + my_pattern[k] = v end - pattern_message = "stopped, press K3 to play" - erase_message = "press K2 to erase" - overdub_message = "" - screen_dirty = true + my_pattern:set_quantization(pattern_data.quantize) + my_pattern:set_loop(pattern_data.loop) + my_pattern:set_length(pattern_data.length) end ``` From fcee170b613688905f9c63f13729161689343613 Mon Sep 17 00:00:00 2001 From: dan derks Date: Fri, 17 Nov 2023 11:01:53 -0500 Subject: [PATCH 04/10] Update reflection.md --- norns/reference/lib/reflection.md | 286 ++++++++++++++---------------- 1 file changed, 135 insertions(+), 151 deletions(-) diff --git a/norns/reference/lib/reflection.md b/norns/reference/lib/reflection.md index dcbea0cd..3b407ae8 100644 --- a/norns/reference/lib/reflection.md +++ b/norns/reference/lib/reflection.md @@ -27,6 +27,8 @@ reflection = require 'reflection' | my_pattern:set_length(beats) | Set length of pattern | | my_pattern:undo() | Undo previous overdub | | my_pattern:clear() | Clear recorded pattern data | +| my_pattern:save(filepath) | Save a pattern to disk | +| my_pattern:load(filepath) | Read a pattern from disk | ### variables @@ -53,19 +55,133 @@ reflection = require 'reflection' ### example ```lua -_r = require 'reflection' -my_pattern = _r.new() +-- reflection scripting example -g = grid.connect() +_r = require 'reflection' -- import the library +my_pattern = _r.new() -- make a pattern + +g = grid.connect() -- connect a grid function init() + lit = {} -- lit keys for grid presses + my_pattern.process = process_press -- the process which the pattern will execute upon playback + initialize_parameters() -- init params + grid_redraw() -- redraw the connected grid +end + +function my_pattern.start_callback() -- user-script callback + print('playback started', clock.get_beats()) + playback_queued = false + grid_redraw() +end + +function my_pattern.end_of_rec_callback() -- user-script callback + print('recording finished', clock.get_beats()) + grid_redraw() +end + +function my_pattern.end_of_loop_callback() -- user-script callback + print('loop ended', clock.get_beats()) + grid_redraw() +end + +function my_pattern.end_callback() -- user-script callback + print('playback ended') + if my_pattern.loop == 0 then + overdubbing = false + end lit = {} - my_pattern.process = process_press - + grid_redraw() +end + +-- bottom-left grid key: initialize recording / playback +-- above that: loop toggle +-- above that: overdub toggle +function g.key(x,y,z) + if x == 1 and y == g.rows then + if z == 1 then + if my_pattern.rec == 0 and my_pattern.queued_rec == nil and my_pattern.count == 0 then + my_pattern:set_rec(hold_rec and 2 or 1, record_duration > 0 and record_duration or nil, rec_sync_value) + elseif my_pattern.count > 0 and my_pattern.play == 0 then + if play_sync_value ~= nil then + playback_queued = true + my_pattern:start(play_sync_value) + else + my_pattern:start() + end + elseif my_pattern.play == 1 then + my_pattern:stop() + else + my_pattern:set_rec(0) + end + end + elseif x == 1 and y == g.rows - 1 then + if z == 1 then + params:set("loop", params:get("loop") == 1 and 2 or 1) + end + elseif x == 1 and y == g.rows - 2 then + if z == 1 then + if my_pattern.count > 0 and my_pattern.play == 1 then + overdubbing = not overdubbing + my_pattern:set_rec(overdubbing and 1 or 0) + end + end + else + local event = { + id = x*8 + y, + x = x, + y = y, + z = z + } + my_pattern:watch(event) + process_press(event) + end + grid_redraw() +end + +function process_press(e) + if e.z == 1 then + lit[e.id] = { + x = e.x, + y = e.y + } + else + if lit[e.id] ~= nil then + lit[e.id] = nil + end + end + grid_redraw() +end + +function grid_redraw() + g:all(0) + if my_pattern.queued_rec ~= nil and my_pattern.queued_rec.state then + g:led(1,g.rows,7) + elseif playback_queued then + g:led(1,g.rows,8) + elseif my_pattern.rec == 1 then + g:led(1,g.rows,15) + g:led(1,g.rows-1,15) + elseif my_pattern.play == 1 then + g:led(1,g.rows,10) + elseif my_pattern.play == 0 and my_pattern.count > 0 then + g:led(1,g.rows,5) + else + g:led(1,g.rows,2) + end + g:led(1,g.rows-1, my_pattern.loop == 1 and 10 or 2) + g:led(1,g.rows-2, overdubbing and 10 or 2) + for i,e in pairs(lit) do + g:led(e.x, e.y, 15) + end + g:refresh() +end + +function initialize_parameters() params:add_option( "demo", "demo", - {"all synced: loop","unsynced: loop"}, + {"all synced: loop","unsynced: loop", "unsynced: 1-shot"}, 1 ) params:set_action("demo", @@ -77,6 +193,12 @@ function init() params:set("play_sync_value", 3) params:set("loop", 2) elseif x == 2 then + params:set("record_duration", 0) + params:set("hold_rec", 2) + params:set("rec_sync_value", 0) + params:set("play_sync_value", 0) + params:set("loop", 2) + elseif x == 3 then params:set("record_duration", 0) params:set("hold_rec", 2) params:set("rec_sync_value", 0) @@ -172,114 +294,6 @@ function init() playback_queued = false params:bang() - - grid_redraw() -end - -function my_pattern.start_callback() - print('playback started', clock.get_beats()) - playback_queued = false - grid_redraw() -end - -function my_pattern.end_of_rec_callback() - print('recording finished', clock.get_beats()) - grid_redraw() -end - -function my_pattern.end_of_loop_callback() - print('loop ended', clock.get_beats()) - grid_redraw() -end - -function my_pattern.end_callback() - print('playback ended') - if my_pattern.loop == 0 then - overdubbing = false - end - lit = {} - grid_redraw() -end - -function g.key(x,y,z) - if x == 1 and y == g.rows then - if z == 1 then - if my_pattern.rec == 0 and my_pattern.queued_rec == nil and my_pattern.count == 0 then - my_pattern:set_rec(hold_rec and 2 or 1, record_duration > 0 and record_duration or nil, rec_sync_value) - elseif my_pattern.count > 0 and my_pattern.play == 0 then - if play_sync_value ~= nil then - playback_queued = true - my_pattern:start(play_sync_value) - else - my_pattern:start() - end - elseif my_pattern.play == 1 then - my_pattern:stop() - else - my_pattern:set_rec(0) - end - end - elseif x == 1 and y == g.rows - 1 then - if z == 1 then - params:set("loop", params:get("loop") == 1 and 2 or 1) - end - elseif x == 1 and y == g.rows - 2 then - if z == 1 then - if my_pattern.count > 0 and my_pattern.play == 1 then - overdubbing = not overdubbing - my_pattern:set_rec(overdubbing and 1 or 0) - end - end - else - local event = { - id = x*8 + y, - x = x, - y = y, - z = z - } - my_pattern:watch(event) - process_press(event) - end - grid_redraw() -end - -function process_press(e) - if e.z == 1 then - lit[e.id] = { - x = e.x, - y = e.y - } - -- print(clock.get_beats()) - else - if lit[e.id] ~= nil then - lit[e.id] = nil - end - end - grid_redraw() -end - -function grid_redraw() - g:all(0) - if my_pattern.queued_rec ~= nil and my_pattern.queued_rec.state then - g:led(1,g.rows,7) - elseif playback_queued then - g:led(1,g.rows,8) - elseif my_pattern.rec == 1 then - g:led(1,g.rows,15) - g:led(1,g.rows-1,15) - elseif my_pattern.play == 1 then - g:led(1,g.rows,10) - elseif my_pattern.play == 0 and my_pattern.count > 0 then - g:led(1,g.rows,5) - else - g:led(1,g.rows,2) - end - g:led(1,g.rows-1, my_pattern.loop == 1 and 10 or 2) - g:led(1,g.rows-2, overdubbing and 10 or 2) - for i,e in pairs(lit) do - g:led(e.x, e.y, 15) - end - g:refresh() end ``` @@ -289,47 +303,17 @@ Record clock-synced changes to data over time, with variable-rate playback, over The basic architecture of the `reflection` library includes: -- a `watch` method, which ingests a table of data and assigns it a relative timestamp for future playback +- a `watch` method, which ingests a table of data and assigns it a beat-timestamp for future playback - a `process` function, which parses the recorded data into meaningful action within a script -#### extended: saving + loading patterns - -The most meaningful persistent data generated by `pattern_time` lives is in: - -- `my_pattern.event` (a table) - -- `my_pattern.count` (a number) - -- `my_pattern.endpoint` (a number) +### saving + loading patterns -- `my_pattern.loop` (a number) +Included in the library are save + load helpers: -- `my_pattern.quantize` (a number) +- save: `my_pattern:save(filepath)` +- load: `my_pattern:load(filepath)` -Currently, saving and loading these pattern tables is up to the script to employ its own approach. Here's a starting point, using our previous example: +Use `norns.state.data` to access the `data` filepath for the currently-running script. -```lua -function save_pattern(filepath) - local pattern_data = {} -- create a temp container - pattern_data.event = my_pattern.event - pattern_data.length = my_pattern.count/96 -- 96 ppqn - pattern_data.endpoint = my_pattern.endpoint - pattern_data.loop = my_pattern.loop - pattern_data.quantize = my_pattern.quantize - tab.save(pattern_data,filepath) -- permanently save to disk -end - -function load_pattern(filepath) - my_pattern:set_rec(0) -- stops recording - my_pattern:stop() -- stops playback - my_pattern:clear() -- clears pattern - local pattern_data = tab.load(filepath) - for k,v in pairs(pattern_data) do - my_pattern[k] = v - end - my_pattern:set_quantization(pattern_data.quantize) - my_pattern:set_loop(pattern_data.loop) - my_pattern:set_length(pattern_data.length) -end -``` +When a pattern is loaded to an instance of `reflection`, the previous data will stop playing and clear. From 43977497edc07dc071cc41c3b17b344200b54acb Mon Sep 17 00:00:00 2001 From: dan derks Date: Fri, 17 Nov 2023 11:03:25 -0500 Subject: [PATCH 05/10] 60fps --- norns/reference/lib/lfo.md | 2 +- norns/reference/osc.md | 2 +- .../reference-files/poll/poll-example/poll-example.lua | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/norns/reference/lib/lfo.md b/norns/reference/lib/lfo.md index d482fdab..7b72b560 100644 --- a/norns/reference/lib/lfo.md +++ b/norns/reference/lib/lfo.md @@ -413,7 +413,7 @@ end function redraw_clock() while true do redraw() - clock.sleep(1/15) -- 15fps + clock.sleep(1/60) -- 60fps end end diff --git a/norns/reference/osc.md b/norns/reference/osc.md index 25b5cd44..e4e2a520 100644 --- a/norns/reference/osc.md +++ b/norns/reference/osc.md @@ -50,7 +50,7 @@ function init() redraw_clock = clock.run( function() while true do - clock.sleep(1/15) -- 15fps + clock.sleep(1/60) -- 60fps if screen_dirty then redraw() end diff --git a/norns/reference/reference-files/poll/poll-example/poll-example.lua b/norns/reference/reference-files/poll/poll-example/poll-example.lua index d60acd83..5b6de657 100755 --- a/norns/reference/reference-files/poll/poll-example/poll-example.lua +++ b/norns/reference/reference-files/poll/poll-example/poll-example.lua @@ -23,12 +23,12 @@ function init() -- assign our polls ampL = poll.set('outputAmpL') ampL.callback = function(val) amp_handler(1, val) end -- what to do with the value returned by SuperCollider - ampL.time = 1/15 -- how often to refresh (norns redraws at 15fps) + ampL.time = 1/60 -- how often to refresh (norns redraws at 60fps) ampL:start() -- start the poll! ampR = poll.set('outputAmpR') ampR.callback = function(val) amp_handler(2, val) end - ampR.time = 1/15 -- how often to refresh (norns redraws at 15fps) + ampR.time = 1/60 -- how often to refresh (norns redraws at 60fps) ampR:start() -- start the poll! screen_redraw = clock.run( From 582f5370415ab514f984a781a56e6d78a6b72d1d Mon Sep 17 00:00:00 2001 From: dan derks Date: Fri, 17 Nov 2023 11:12:12 -0500 Subject: [PATCH 06/10] DISPLAY menu --- norns/image/play-images/display.png | Bin 0 -> 1956 bytes norns/play.md | 14 ++++++++++++++ 2 files changed, 14 insertions(+) create mode 100755 norns/image/play-images/display.png diff --git a/norns/image/play-images/display.png b/norns/image/play-images/display.png new file mode 100755 index 0000000000000000000000000000000000000000..e3f34079c88fbef4beadb68ef307cd87e708cb7b GIT binary patch literal 1956 zcmeH{Z%kWN7{+g51F{V_W5|#So562Gq25%p(E^)nS48Jn6uR6}78t#WB@lN59WA#l zCOGFzZ^&F&7rGkBwi@7e5wo_GQj}mZw2+ByK}sPGTSf~Pyg=!HS+WeAnSL^U*?T^m zocElZ_nhZE=XdGUNho<&+AaV9l8fFhJPiPGG60~-lHxWq-$I2CHoJt%VyF;^J#1eY zZ(jj`#4|;OM?bjGzBv6}?bMOff_u98gx=d(2Jr~J?^0sPJI!Ac=Tu-;*5}c|meA3A z=ETiS{)ZS~vKErL)2e)FR~_bsXM+2=u@#;02Z@ai$b_#90Q>fx1(K3-fE_zhfw;Im z0F9O)lL7Gs1v1*fgU_a)$?|V@c*4{&9LFJJGuVV-Sct^UjQ6EOL0I6bjRS!ZB;IOBvfLZR;HSQEAs?PpQOXrt07)@7Qu zKGqY`{qykC&5vveZic5S11DAPaycdm4_}APyhSc7Ao3c{#b8g`N+1weG{qtz|FW6H zEO!0fQGqb;SG!FChNW$Tf)K%0v%-6Uj~u$ zuxDEA`>ca#b{V1ybn;cmh(qi)oAd?o99O9N`>7DO4w?=%kTY`0hneK@`q*sBI!`Nd z*AtLJF|=fad?o&uiI+QeUsdYO zi!SjkUVx`3XVqfXSQpwBde;OB-->&T+U3)OqnUH= z3=qxo{6$bw6pzsLwW+1>$4Yf$hVyd8HdMPR6Iid$)OY7}rZY86e~V*w{}$hywby94 zbMJ(+4YWGx*Bp14BM0;sSM5lZn=|U!w(u#p`>)e=zI<-7)6kJxI{2_u(eaao#IduV F{0TkRQw0D3 literal 0 HcmV?d00001 diff --git a/norns/play.md b/norns/play.md index bb59908f..af3deb32 100644 --- a/norns/play.md +++ b/norns/play.md @@ -344,11 +344,25 @@ The SYSTEM menu contains a number of helpful entries: - `SETTINGS` allows you to: - `RESET` your norns back to its default settings, erasing your favorites, disabling all mods, and restoring global audio levels to their defaults. - change your [`PASSWORD`](/docs/norns/wifi-files/#settings-password) for SSH, SMB, and hotspot + - tune the `DISPLAY` brightness, contrast, and gamma - toggle the on-screen `BATTERY WARNING` on and off - `RESTART` will restart the unit without erasing any settings - `UPDATE` will perform a [system update](/docs/norns/wifi-files/#update), if you're connected to WiFi. - `LOG` will export any messages and errors initiated by matron (the Lua layer), SuperCollider, and the general Linux system. If something isn't performing as expected, this mechanism is the most helpful tool for diagnosing trouble. See [the logs section of the *maiden* docs](/docs/norns/maiden/#logs) for more info. +### DISPLAY + +![](/docs/norns/image/play-images/display.png) +[*figure 10: the norns DISPLAY menu*](image/play-images/display.png) + +This menu allows you to fine-tune the norns display, offering adjustments for: + +- BRIGHTNESS: 0 to 15, default 15 +- CONTRAST: 0 to 255, default 127 +- GAMMA: 1.00 to 30.00, default 1.0 + +Any adjustment will create and update a `system.display` file under `dust/data`. This file can be safely deleted to quickly restore defaults upon RESTART. + ## where to next? Now that you know the basics of navigating the system, adjusting a script's parameters, and recording the results, you might want to explore the [**community scripts**](/docs/norns/community-scripts) available for norns. From bb3037d5a4401bca4f9b27f75a4d2c4d1b87249e Mon Sep 17 00:00:00 2001 From: dan derks Date: Fri, 17 Nov 2023 11:26:40 -0500 Subject: [PATCH 07/10] midi echo --- norns/control-clock.md | 4 +++- .../image/control_clock-images/device-map.png | Bin 38681 -> 44328 bytes 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/norns/control-clock.md b/norns/control-clock.md index f5a0076d..6ec18714 100644 --- a/norns/control-clock.md +++ b/norns/control-clock.md @@ -42,7 +42,7 @@ norns will remember these devices until they're manually removed, even if they a ### manage -Let's say we're running a sequencer and we want to send MIDI out a connected USB-MIDI interface. The device list in [figure 1](image/control_clock-images/device-management.png) shows a `16n` at port 1, but we want this to be the `UM-ONE`. +Let's say we're running a sequencer and we want to send MIDI out a connected USB-MIDI interface. The device list in [figure 1](image/control_clock-images/device-management.png) shows a `16n` at port 1, but we want this to be the `MFT` (MIDI Fighter Twister). If a script doesn't allow you to specify a MIDI device port for incoming or outgoing MIDI, the script will default to the device at port 1. {: .label} @@ -107,6 +107,8 @@ To MIDI-learn: - **accum**: enable when using relative midi cc streams (for controllers that send deltas rather than 0-127 absolute streams) +- **echo**: enable when using devices which can receive MIDI values to redraw LEDs or stateful text (eg. MIDI Fighter Twister or Faderfox EC4) + #### PMAPs Every time a parameter is mapped, norns will save this configuration as a PMAP file. PMAPs are unique to the currently-loaded script and are stored under `data/[scriptname]/[scriptname].pmap`. diff --git a/norns/image/control_clock-images/device-map.png b/norns/image/control_clock-images/device-map.png index 22f57beff435304084f84f6f3edf609c79a11264..361a904c95f7c4909f2620e58fab58d4c7d7bc7f 100644 GIT binary patch literal 44328 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

dLu_MXZ~Uovd9g+=!N#UT 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 Date: Fri, 17 Nov 2023 11:43:55 -0500 Subject: [PATCH 08/10] Update study-3.md --- norns/study-3.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/norns/study-3.md b/norns/study-3.md index f81d2aec..eae22d73 100644 --- a/norns/study-3.md +++ b/norns/study-3.md @@ -888,7 +888,9 @@ minval 20 ### off-menu parameters {#off-menu} -We've been using the default parameter set throughout, which automatically adds what we declare to the norns PARAMETERS system menu -- but if we just want to use these templates for managing values, we can create as many of our *own* parameter sets as we want. They won't be hooked up to the system menu, but we can manipulate them in all of the same ways. Here's how to create one: +We've been using the default parameter set throughout, which automatically adds what we declare to the norns PARAMETERS system menu -- but if we just want to use these templates for managing values, we can create as many of our *own* parameter sets as we want. Note that these are just convenience wrappers for using parameter-style formatting without creating norns menu items -- and since these won't be hooked up to the system menu, they don't tie into PSETs, MIDI mapping, or OSC control. But they're still helpful for establishing and manipulating variables in creative ways. + +Here's how to create one: ```lua -- study 3 From e46d1dd81a862d455065db0658c1e110fb4c6990 Mon Sep 17 00:00:00 2001 From: dan derks Date: Fri, 17 Nov 2023 12:00:08 -0500 Subject: [PATCH 09/10] Update gamepad.md --- norns/reference/gamepad.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/norns/reference/gamepad.md b/norns/reference/gamepad.md index f3d44cfe..9af5eafa 100644 --- a/norns/reference/gamepad.md +++ b/norns/reference/gamepad.md @@ -119,7 +119,7 @@ Deciphers gamepad input and executes user-assignable callbacks. Since many gamep Plug + play models: - iBUFFALO Classic USB Gamepad - - Xbox 360 +- Retrolink B00GWKL3Y4 ((S)NES-style, also sold by under other brands: iNNext, Elecom...) Contributed and maintained by [`@p3r7`](https://github.com/p3r7/) From bfe486eab8e9b2e6407da0cd647f7649f94b3cf4 Mon Sep 17 00:00:00 2001 From: dan derks Date: Fri, 17 Nov 2023 12:03:23 -0500 Subject: [PATCH 10/10] reflection ref updates --- norns/reference.md | 83 ++++++++++++++++--------------- norns/reference/lib/reflection.md | 20 ++++---- 2 files changed, 52 insertions(+), 51 deletions(-) diff --git a/norns/reference.md b/norns/reference.md index 614f0b98..33901100 100644 --- a/norns/reference.md +++ b/norns/reference.md @@ -23,47 +23,48 @@ to access the complete norns API, you can either: ## commands -| Module | Description | -| --------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | -| [arc](arc) | Connect a script to a hardware [arc](https://monome.org/docs/arc) | -| [audio (api)](/docs/norns/api/modules/audio.html) | Directly set system audio levels | -| [clock](clock) | Coroutine system which executes functions on beat-synced and free-running schedules | -| [controlspec](controlspec) | PARAM menu control constructor with presets | -| [crow (api)](/docs/norns/api/modules/crow.html) | Connect a script to a hardware [crow](https://monome.org/docs/crow) | -| [encoders](encoders) | Decipher the norns on-board encoders | -| [engine (api)](/docs/norns/api/modules/engine.html) | Register a SuperCollider engine | -| [gamepad](gamepad) | Connect a script to a gamepad controller | -| [grid](grid) | Connect a script to a hardware [grid](https://monome.org/docs/grid) | -| [hid (api)](/docs/norns/api/modules/hid.html) | Connect a script to HID hardware | -| [keyboard](keyboard) | Decipher keyboard (typing, not piano) input | -| [metro](metro) | High-resolution time-based counter | -| [midi](midi) | Connect a script to MIDI hardware | -| [osc](osc) | Connect a script to OSC streams | -| [params](params) | Create script parameters, displayed in the PARAMETERS menu | -| [poll](poll) | System polling for CPU, incoming/outgoing amplitude, and incoming pitch | -| [screen (api)](/docs/norns/api/modules/screen.html) | Draw to the norns on-board screen | -| [softcut (api)](/docs/norns/api/modules/softcut.html) | Two audio buffers which can be recorded into and played by six individual voices | -| [tab (api)](/docs/norns/api/modules/lib.tabutil.html) | Table utilities | -| [util (api)](/docs/norns/api/modules/lib.util.html) | Helpful utility functions | -| [lib/elca (api)](/docs/norns/api/modules/lib.elca.html) | Elementary cellular automata generator | -| [lib/envgraph (api)](/docs/norns/api/modules/lib.EnvGraph.html) | Envelope graph drawing module | -| [lib/er](./lib/er) | Euclidean rhythm generator | -| [lib/fileselect](./lib/fileselect) | File select utility | -| [lib/filtergraph (api)](/docs/norns/api/modules/lib.FilterGraph.html) | Filter graph drawing module | -| [lib/filters (api)](/docs/norns/api/modules/lib.filters.html) | Value smoother | -| [lib/formatters (api)](/docs/norns/api/modules/lib.formatters.html) | PARAM menu formatter functions | -| [lib/graph (api)](/docs/norns/api/modules/lib.Graph.html) | Graph drawing module | -| [lib/intonation](./lib/intonation) | Library of various tunings, including 12 tone and gamuts | -| [lib/lattice](./lib/lattice) | Simple and extensible sequencers driven by a superclock | -| [lib/lfo](./lib/lfo) | Single-clock framework for generating movement (beat-synced or free) inside of a script | -| [lib/listselect](./lib/listselect) | List select utility | -| [lib/musicutil](./lib/musicutil) | Utility module for common music maths | -| [lib/pattern_time](./lib/pattern_time) | Timed-event pattern recorder / player | -| [lib/sequins](./lib/sequins) | Build and modify sequencers + arpeggiators | -| [lib/timeline](./lib/timeline) | Sequence events in time | -| [lib/textentry](./lib/textentry) | Text entry UI | -| [lib/ui](./lib/ui) | UI widgets module | -| [lib/voice](/docs/norns/api/modules/lib.voice.html) | Experimental voice allocation module | +| Module | Description | +| --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| [arc](arc) | Connect a script to a hardware [arc](https://monome.org/docs/arc) | +| [audio (api)](/docs/norns/api/modules/audio.html) | Directly set system audio levels | +| [clock](clock) | Coroutine system which executes functions on beat-synced and free-running schedules | +| [controlspec](controlspec) | PARAM menu control constructor with presets | +| [crow (api)](/docs/norns/api/modules/crow.html) | Connect a script to a hardware [crow](https://monome.org/docs/crow) | +| [encoders](encoders) | Decipher the norns on-board encoders | +| [engine (api)](/docs/norns/api/modules/engine.html) | Register a SuperCollider engine | +| [gamepad](gamepad) | Connect a script to a gamepad controller | +| [grid](grid) | Connect a script to a hardware [grid](https://monome.org/docs/grid) | +| [hid (api)](/docs/norns/api/modules/hid.html) | Connect a script to HID hardware | +| [keyboard](keyboard) | Decipher keyboard (typing, not piano) input | +| [metro](metro) | High-resolution time-based counter | +| [midi](midi) | Connect a script to MIDI hardware | +| [osc](osc) | Connect a script to OSC streams | +| [params](params) | Create script parameters, displayed in the PARAMETERS menu | +| [poll](poll) | System polling for CPU, incoming/outgoing amplitude, and incoming pitch | +| [screen (api)](/docs/norns/api/modules/screen.html) | Draw to the norns on-board screen | +| [softcut (api)](/docs/norns/api/modules/softcut.html) | Two audio buffers which can be recorded into and played by six individual voices | +| [tab (api)](/docs/norns/api/modules/lib.tabutil.html) | Table utilities | +| [util (api)](/docs/norns/api/modules/lib.util.html) | Helpful utility functions | +| [lib/elca (api)](/docs/norns/api/modules/lib.elca.html) | Elementary cellular automata generator | +| [lib/envgraph (api)](/docs/norns/api/modules/lib.EnvGraph.html) | Envelope graph drawing module | +| [lib/er](./lib/er) | Euclidean rhythm generator | +| [lib/fileselect](./lib/fileselect) | File select utility | +| [lib/filtergraph (api)](/docs/norns/api/modules/lib.FilterGraph.html) | Filter graph drawing module | +| [lib/filters (api)](/docs/norns/api/modules/lib.filters.html) | Value smoother | +| [lib/formatters (api)](/docs/norns/api/modules/lib.formatters.html) | PARAM menu formatter functions | +| [lib/graph (api)](/docs/norns/api/modules/lib.Graph.html) | Graph drawing module | +| [lib/intonation](./lib/intonation) | Library of various tunings, including 12 tone and gamuts | +| [lib/lattice](./lib/lattice) | Simple and extensible sequencers driven by a superclock | +| [lib/lfo](./lib/lfo) | Single-clock framework for generating movement (beat-synced or free) inside of a script | +| [lib/listselect](./lib/listselect) | List select utility | +| [lib/musicutil](./lib/musicutil) | Utility module for common music maths | +| [lib/pattern_time](./lib/pattern_time) | Timed-event pattern recorder / player | +| [lib/reflection](./lib/reflection) | Record clock-synced changes to data over time, with variable-rate playback, overdubbing, and pattern management tools | +| [lib/sequins](./lib/sequins) | Build and modify sequencers + arpeggiators | +| [lib/timeline](./lib/timeline) | Sequence events in time | +| [lib/textentry](./lib/textentry) | Text entry UI | +| [lib/ui](./lib/ui) | UI widgets module | +| [lib/voice](/docs/norns/api/modules/lib.voice.html) | Experimental voice allocation module | ## folder structure diff --git a/norns/reference/lib/reflection.md b/norns/reference/lib/reflection.md index 3b407ae8..65ec80df 100644 --- a/norns/reference/lib/reflection.md +++ b/norns/reference/lib/reflection.md @@ -6,6 +6,16 @@ permalink: /norns/reference/lib/reflection ## reflection +### description + +Record clock-synced changes to data over time, with variable-rate playback, overdubbing, and pattern management tools. + +The basic architecture of the `reflection` library includes: + +- a `watch` method, which ingests a table of data and assigns it a beat-timestamp for future playback + +- a `process` function, which parses the recorded data into meaningful action within a script + ### functions The following assumes a script has invoked `reflection` via: @@ -297,16 +307,6 @@ function initialize_parameters() end ``` -### description - -Record clock-synced changes to data over time, with variable-rate playback, overdubbing, and pattern management tools. - -The basic architecture of the `reflection` library includes: - -- a `watch` method, which ingests a table of data and assigns it a beat-timestamp for future playback - -- a `process` function, which parses the recorded data into meaningful action within a script - ### saving + loading patterns Included in the library are save + load helpers: