Forgive me, but I skimmed the whole thread and maybe missed more details on this. I’m preparing to record a performance this weekend and would love a filter insert after each track i could control either through params or midi mapping. Can someone point me in the right direction? I’m a software engineer by training so if altering mlr is necessary I can probably make do with handwavy pseudo-implementation details and a link to the right doc

1 Like

hey hey! post filters have been implemented into softcut (which mlr uses for all the magic!) and can be added to the script using the techniques outlined here: https://monome.org/docs/norns/softcut/#5-filters

establishing parameter/midi-map control over those functions would require the techniques described here: https://monome.org/docs/norns/study-3/#parameters, eg:

params:add_control("filter cutoff", "filter cutoff", controlspec.new(10,12000,'exp',1,12000,"Hz"))
params:set_action("filter cutoff", function(x) softcut.post_filter_fc(1,x) end)

params:add_control("lp_filter","low pass presence", controlspec.new(0, 1, 'lin', 0, 1, ""))
params:set_action("lp_filter", function(x) softcut.post_filter_lp(1,x) end)

hopefully this helps? let us know :slight_smile:

2 Likes

This looks perfect. Will dive in tomorrow and give an update after I (hopefully) succeed!

@dan_derks - thanks to your basically complete instructions that was the easiest thing ever - i can send a PR upstream if there’s any interest but this is all i did, and now i’m filterin’

192.168.1.161 ~/dust/code/mlr $ git diff
diff --git a/mlr.lua b/mlr.lua
index 30be35c..66ad737 100644
--- a/mlr.lua
+++ b/mlr.lua
@@ -402,6 +402,11 @@ init = function()
     softcut.loop(i,1)
     softcut.position(i, clip[track[i].clip].s)
 
+    softcut.post_filter_dry(i,0.0)
+    softcut.post_filter_lp(i,1.0)
+    softcut.post_filter_fc(i,12000)
+    softcut.post_filter_rq(1,10)
+
     params:add_control(i.."vol", i.."vol", UP1)
     params:set_action(i.."vol", function(x) softcut.level(i,x) end)
     params:add_control(i.."pan", i.."pan", cs_PAN)
@@ -431,6 +436,9 @@ init = function()
       --function(n) print("FILESELECT > "..i.." "..n) end)
       function(n) fileselect_callback(n,i) end)
 
+    params:add_control(i.."filter cutoff", i.."filter cutoff", controlspec.new(10,12000,'exp',1,12000,"Hz"))
+    params:set_action(i.."filter cutoff", function(x) softcut.post_filter_fc(i,x) end)
+
     update_rate(i)
     set_clip(i,i)
     --softcut.phase_quant(i,calc_quant(i))
7 Likes

@tehn

Hi I just updated my norns and MLR and noticed an little issue (or maybe is it a change in the workflow):

PATTERN seems to save the state of the track (ON / OFF) and recalls it when the track is turned off. Before that i could record a pattern and turn off one of the track freely (even if the pattern was still activated). Now, the track automatically turns back to ON if the pattern is activated.

Is there a way to correct that thing or at least make it switchable in the parameters? I’ve got some gigs coming and it kind of change everything :pensive:

had my first mlr sesh today… feels like a right of passage. everything worked great clocking my modular with crow and moving the grid back and forth from ansible and norns to get new patterns with everything perfectly in sync. so cool to look on the old forum and see people just as excited as I am about it back in 2007. thanks for all the work on this over the years @tehn and co!

15 Likes

I have what is probably a silly question:
I’ve always used mlr at the default tempo but I’m trying to change it for the first time.
I’m just doing live recording without any pre-recorded loops.

I’ve adjusted the tempo using alt+Q and in the parameters (+ reset) and it doesn’t seem to have any effect on the speed of the playheads. I’m using factory Norns and Grid, and I’ve updated MLR and Norns to the latest version.

Is this the expected behavior? I would have thought that a tempo change would change the length of the loop (with each grid column being a 16th note). If not, any advice on how to get the length/speed to change?

From the docs:

QUANTIZE:

touch to toggle quantization. ALT-Q to change tempo and division.

in REC/SPEED mode use ALT-FOCUS to toggle tempo-mapping.

a tempo-mapped clip will follow the tempo.

1 Like

Thanks! I thought I had tried that but I’d been using two fingers on the FOCUS buttons out of habit (because of the pair of lights), which had been toggling the tempo-mapping on then off faster than I could see.

1 Like

Hi all, I know this has been asked – is there a tutorial for MLR? Specifically, I am worried about BPM and tempo keeping. Do I need to record my input with an external metronome to ensure everything keeps time (knowing there’s no input quantization) or use loops that are guaranteed the same BPM? I feel like I’m about to be very lost, but also am very excited. Just received my grid and this is my first foray into using it so just want to make sure I’m having fun.

1 Like

This would qualify as one of the more in-depth run through a of the script.

Honestly, in a way, scripts developed in house by monome have a history of being a little less documented than those by others.

After this script, I suggest you give Cheat Codes, Cranes and Otis a shot for audio mangling stuff as well. Although with that script you might actually get an embarrassment of riches when it comes to complexity and documentation!!!

Welcome to the monome family tho! The grid is great and we’re happy you’re here!!!

15 Likes

Trying to record for the first time in MLR and I feel like I’m missing something obvious. I followed the recording quickstart in the docs exactly, but the notes I play into the L input channel on the norns (fates) don’t play back as the loops loop. I definitely hear it in the monitor and see the level bouncing on the leftmost menu page… what else can i check?

e.g. Otis works for recording so i know the system itself seems functional

Thank you!! This is awesome. The only thing this didn’t really answer was quantization. What does “quant div” do? And if I’m trying to play a melodic piece I’ll effectively have to just use an external metronome then as quantizing changes the pitch (ie is more useful for rhythmic). Am I missing something there?

Honestly, these are questions I don’t have much of an answer for. I apologize, but hopefully someone here might have a bit more knowledge on the inner workings of mlr in that regard.

Sorry to double tap on the above, figured it’d be easier to ask in bulleted Qs

  • Is it better to use external clocked items for melodic pieces like Ableton or an OP1?
  • Are recorded patterns automatically tempo locked/quantized to the tempo without me having to tempo lock that track? I don’t want to tempo lock clips right now because it makes my entire track out of key.
  • What does “quant div” do? I am assuming it has something to do with note divisions, but how is it quantizing note divisions if it’s just slowing or speeding up the pitch of a clip? Is quant div for pattern record (meaning patterns are quantized to nearest 1/4 if the quant div is set to 4)?

Thank you all and sorry for bombarding with Qs :slight_smile: Hopefully this helps someone else too though.

disregard this i suppose - did a reboot of the device and followed the same steps which actually did lead to output.

Alright ladies and gents think I got it figured out (still curious about quantization methods but MLR doesn’t really seem truly built for things that need to be quantized / pitched like Ableton)

Here’s something I came up with using MLR and OTIS - my second day learning so be easy

https://youtu.be/uj9PJ4WGhh0

5 Likes

I’m looking into the MLR.lua to try and make some small changes. I would like to make some adjustments to how playback speed changes work. Can someone point me at the chunk of code I can change to alter the play speed ratios? Like 3/4 instead of octave shifts?

Is it this chunk starting at line 481? Do I change “local n = math.pow(2…” and substitute another value for the 2?

update_rate = function(i)
local n = math.pow(2,track[i].speed + params:get(i…“speed_mod”))
if track[i].rev == 1 then n = -n end
if track[i].tempo_map == 1 then
local bpmmod = params:get(“clock_tempo”) / clip[track[i].clip].bpm
–print("bpmmod: "…bpmmod)
n = n * bpmmod
end
softcut.rate(i,n)
end

EDIT: yep! that did it. Thanks @tehn for keeping the script clean and making user end changes like this possible!

2 Likes

It quantizes the loop to the tempo. You can edit its resolution in the tempo meny (ALT + Q).

Just got shields, so excited, getting lost endlessly over and over again. Had MLR question after experimenting, reading doc, and watching the vimeo tutorial (super helpful):

  1. Are there still glitches in this in terms of connecting with grid?
    a.I frequently get a row that doesn’t respnod like normal all of a sudden;
    b.and I occasionally get a row that had a preloaded audio file that stops playing until I re-load it.

  2. What exactly does the overdub parameter do when recording?

  3. Does record record to the clip slot selected for a track in clip view, overriding whatever selection you had for the clip slot selected for that track already?

  4. What does resize do?

2 Likes