mangl

a 7 track granular sample player.

mangl is based on angl by @tehn and the Glut engine/script by @artfwo.

Requirements

Norns 2.2.3
Arc suggested

Documentation

  • arc ring 1 = speed

  • arc ring 2 = pitch

  • arc ring 3 = grain size

  • arc ring 4 = density

  • norns key1 = alt

  • norns key2 = enable/disable
    voice

  • norns key3 = set track speed to 0

  • norns enc1 = track volume

  • norns enc3 = nav

holding alt and turning a ring, or pressing a button,
performs a secondary function.

  • alt + ring1 = scrub

  • alt + ring2 = fine tune

  • alt + ring3 = spread

  • alt + ring4 = jitter

  • alt + key2 = loop in/out

  • alt + key3 = loop clear

  • alt + enc1 = filter cutoff

  • alt + enc2 = delay send

nb: loop in/out is set in one button press. loop in
on press, loop out on release.

Download

v2.1 last updated 12.16.19

update v2.1

  • adds per voice delay send params
  • adds send as lfo targets
  • adds alt + enc2 = delay send

update v2.0

  • adds per voice filters
  • adds filter parameters
    • filter cutoff - filter cutoff frequency
    • filter q - filter resonance
    • filter mode
      • 0 = lowpass
      • 1 = highpass
      • 2 = bandpass
  • adds cutoff as an lfo target
  • alt + enc1 = filter cutoff

update v1.9

  • adds position as a modulation target
  • adds mGlut engine (a personal fork of Glut that I can fuck around with :sweat_smile:)
  • swaps freeverb effect for greyhole echo
  • adds greyhole params:
    • delay_time - approximate reverberation time in seconds
    • delay_damp - controls damping of high-frequencies as the reverb decays. 0 is no damping, 1 is very strong damping.
    • delay_size - size of delay-lines within the diffusion unit, producing the impression of a larger or smaller space
    • delay_diff - controls pattern of echoes produced by the diffuser. At very low values, the diffuser acts like a delay-line whose length is controlled by the ‘size’ parameter. Medium values produce a slow build-up of echoes, giving the sound a reversed-like quality. Values of 0.707 or greater than produce smooth exponentially decaying echoes.
    • delay_fdbk - amount of feedback through the system.
    • delay_mod_depth - depth of delay-line modulation. Use in combination with modFreq to produce chorus and pitch-variations in the echoes.
    • delay_mod_freq - frequency of delay-line modulation

v1.8

  • grid: momentary mode
    • hold alt and press a grid key in the buffer area to toggle latched/momentary mode per track
  • arc: there are now params for arc sensitivity - they are at the bottom of the parameter menu, so just keep scrolling :sweat_smile:

v1.7

  • adds LFO’s via hnds
  • modulation targets:
    • volume
    • grain size
    • grain density
    • spread
    • jitter

v1.6

  • norns : enc3 sensitivity has been adjusted. much easier to accurately select a track.
  • grid : the first 7 grid buttons in row 1 are now track select buttons.
  • grid : alt + track select retains the old track stop/deactivate behavior.

v1.4

  • tracks have been increased to 7
  • grid support (via @artfwo’s wonderful glut script)
  • navigating between tracks has moved from key3 to enc3
  • key3 now sets the selected track speed to 0
57 Likes

This is GREAT!!!
Is there a way use it without ark? Maybe by mapping midi controller with rotaries to it.

3 Likes

wow!!! It’s just what I’m looking for <3

3 Likes

I haven’t tried it, but should be possible just using cc mapping in the parameters menu.

edit: @KthulhTriokus I just tried this, and it works. Though it is a bit less “playable” :slight_smile:

8 Likes

This might be the one to push me over the edge into Norns ownership

3 Likes

Thanks! What is the key difference between angl and mangl?

They both use Glut, so the underlying engine and parameters are the same. The biggest difference between the scripts being their control schemes. Outside of control oriented stuff, mangl adds the ability to scrub through the audio file, and to loop a portion of the file. That’s about it, tho.

3 Likes

mangl seems more ‘playable’ to me for some reason.

Beautiful demo of a beautiful thing. Thank you!

2 Likes

This looks and sounds fantastic. Might tip me over the edge into the madness of getting an arc.

2 Likes

It’s hard to explain just how good the Arc feels :sweat_smile: but… it feels really good.

7 Likes

i usually discourage gas but not when it comes to the arc
anybody who can afford one should absolutely get it

it’s the most underrated thing and very tough to imagine/describe

5 Likes

There are a few things in this life I enjoy more than using arc with ansible to control four free running lfos. I could watch those little lights circle around those knobs all day long. It’s just perfect.

5 Likes

To that end: https://www.instagram.com/p/Bv0HMXEghpd/?utm_source=ig_share_sheet&igshid=uhwqp6cm7654

4 Likes

thank you @Justmat :slight_smile:

1 Like

after finally exiting the forest of problems I’ve had getting my norns upated to 2.0, I spent a bunch fo time pushing audio through mangl and it’s so fucking good.

6 Likes

FRACKEN WOW!!!
what an amazing script!

THANK YOU for making this.
been making noiz with it for the past hour or so…lost in the wall of noiz.

it’s so intuitive with the setup and use.

not sure if it’s possible…i get the minimalist aesthetic with it all…but…is it possible to put text over the four arc variables?
and can they switch to their other use when hitting alt?

1 Like

i actually did this for my own copy as well. assuming nothing as changed, you can probably just copy/paste this over the redraw() function. but i don’t know if this will mess something up when the script is updated by the author!

 function redraw()
  screen.clear()
  screen.move(64,40)
  screen.level(params:get(track .. "play") == 2 and 15 or 3)
  screen.font_face(10)
  screen.font_size(30)
  screen.text_center(tracks[track])
  
  if util.time() - time_last_enc < .6 and last_enc == 1 then
    screen.move(10, 10)
    screen.font_face(1)
    screen.font_size(8)
    screen.text("vol : " .. string.format("%.2f", params:get(track .. "volume")))
  end
  
  screen.move(20, 50)
  screen.font_size(8)
  screen.font_face(1)
	screen.text_center("speed")
  screen.move(20, 60)
  screen.text_center(string.format("%.2f", params:get(track .. "speed")))
  screen.move(50, 50)
	screen.text_center("pitch")
  screen.move(50, 60)
  screen.text_center(string.format("%.2f", params:get(track .. "pitch")))

  if alt then
		screen.move(80, 50)
		screen.text_center("spread")
		screen.move(80, 60)
    screen.text_center(string.format("%.2f", params:get(track .. "spread")))
    screen.move(110, 50)
		screen.text_center("jitter")
    screen.move(110, 60)
    screen.text_center(string.format("%.2f", params:get(track .. "jitter")))
  else
		screen.move(80, 50)
		screen.text_center("size")
		screen.move(80, 60)
    screen.text_center(string.format("%.2f", params:get(track .. "size")))
    screen.move(110, 50)
		screen.text_center("density")
    screen.move(110, 60)
    screen.text_center(string.format("%.2f", params:get(track .. "density")))
  end

  screen.move(track == 3 and 100 or 90, 40)
  screen.level(loops[track].state == 1 and 12 or 0)
  screen.font_size(12)
  screen.font_face(12)
  screen.text("L")

  screen.update()
end

edit to add also yeah this thing is super fun! can’t remember if i already complimented earlier! amazing work

2 Likes

yeah…that fracked it all up.
or…i just fracked it all up.
:stuck_out_tongue:
i’m not a programmer…just a noizician.

Thank you! I appreciate the kind words :smiley:

This would be a super simple add, I’ll post an updated version later today.

1 Like