been hoping for the same

3 Likes

it should be possible to write a simple script that just passes ASL commands (or any Lua) from norns to crow. It might not have every feature of druid, but would probably get you most of the way there. It could work just like the ^^derwydd max4live device.

1 Like

I had an idea of producing a norns script that would be a tape-delay-utility and would work with any 3-head tape machine; reel-to-reel or casette.

Essentially having input L as your source, output L going to the tape, input R comes back off the tape and output R is you master out. By sending the input of R back into output L you have feedback. And a simple delay line in the initial input/output would allow you to alter delay times without needing to change speed on the machine itself, especially handy for going between 2 or 3 speeds or for those machines which only have a single speed. Add in an low-pass/high-pass filter and maybe an lfo for pitch modulation and I think it would be a really cool idea. I don’t suppose such a thing exists already?

I am an absolutely newbie here and will be getting a norns/grids in a few weeks. I also have only a small amount of experience in max so it will take me time to learn lua. But think it wouldn’t be the hardest code to write given it is a simple concept.

5 Likes

I saw @boboter built this same thing for the Zoia

3 Likes

would something like the be possible in Norns?

I have wondered for maybe 4 years now if someone could make a sound design application that utilized 3d virtual space techniques the same way that houdini or blender or touchdesigner does to warp sound or even place fragments of sound in a virtual space. i havent used it yet but by the looks of it, it’s exactly what i’ve been after.

I don’t know how practical it would be to attempt to port this to norns, but i think it would possibly be the hardware granular solution i’ve been wishing for

2 Likes

I think this would be easy to build and is a great starter project.

Check out this tutorial which will give you the tools for fetching input off the left and right channels and sending them out. The clocks subsystem will give you the tools you need to build out the delay lines. You can wire up your encoders to the delay line / feedback blending to create the tape effect you want.

2 Likes

Oh woah that zoia patch is great! I’ve been using my daw/interface for this.

thanks for sending me some direct resources to get me started; it’s really useful!!

1 Like

Great idea. I used to think about that sort of thing quite a bit. I just wanted to mention that this also reminds me a bit of the Björk: Biophilia interactive album app, which was a fantastic concept!

1 Like

Not sure if it belongs here but wanted to ask about a couple of usability improvements. I feel this changes would do good experience of using norns even better and more immediate.

  • Would be awesome if Pset loading option was before saving in the menu. Might seem counter intuitive but I use loading all the time and saving just occasionally.
  • Also not sure if Pset needs its owns menu with submenus. I thing options that are there would be better on the top level.
  • Would be cool if script options in params would go before other system params, same reason as before I mostly don’t use them and would prefer not to have to scroll through them all the time.
  • Some dB levels can not be set precisely or zeroed. Compressor post gain for example, even while holding K3. It’s not obvious why dB params change in such strange intervals.

This might seem like nitpicking and I guess it really is. But it comes from a fan of the platform :slight_smile:

3 Likes

i can speak the last point a little (with apologies for tediousness.)

i agree it would be better if the parameter value were quantized to nearest decibel.

i think there is no design reason for the present behavior, just expedience:

  • these are parameters of type control. this means they map a “raw” value in [0, 1] to an arbitrary range, quantum, &c, as defined in a ControlSpec. for example, the output range for compressor post-gain is [-20db, +60db]. (here.)

  • the :delta method for control params accepts an incoming number, scales it by 1/100, adds to the raw value, and updates the scaled value. (here.)

  • the output of the raw->ranged mapping is optionally quantized (according to the ControlSpec.) the audio parameter specs do not declare quantization values. (see first link.) so you could try simply changing the line

local cs_POSTGAIN = cs.new(-20,60,'db',0,9,'dB')

to

local cs_POSTGAIN = cs.new(-20,60,'db',1,9,'dB')

[norns/lua/core/audio.lua, line 450]

to round to 1db, and see how that feels.

  • however, the other factor is the input to the :delta function. this is an integer corresponding to the number of positions the encoder moved on the last tick. in fine adjustment mode, the encoder movement is scaled by 1/20.

so, it might feel a little weird to round the scaled parameter values to 1db when changing the raw values by multiples of 0.01 (since encoder movements are integers) - in the case of postgain you will be moving the value in increments of 0.8db that are then rounded to 1db, producing a funky jitter, but maybe that is OK. “fine adjustment” mode will probably feel better. the encoder scaling in “coarse” mode could be made smaller.


more generally, i’ve had this fleeting thought before, which writing this has “crystallized”: i think it would be good if a ControlSpec could define the :delta step (iow, the input quantization) as well as the output quantization. otherwise, its often not a very usable abstraction for sensitive parameters, and the solution so far has been to manually fiddle with the input scaling (iow, encoder sensitivity). it would be cleaner to make this an optional property of the parameter (or its spec, i dunno.)


i don’t have much of an opinion about the other points.

2 Likes

I was just thinking it would be useful to have a simple visual envelope generator available in the parameter menu (like text entry, or file select).

Maybe something like enc 1 being a “rise” and enc 2 being a “fall” with key 1 acting as a shift key to transitions from log -> linear -> exponential for rise/fall. A simple visualization could fit on the screen.

I’d like to do something like this for crow utility, but I think it could work well in different formats too.

Are there any granular effects floating around for Norns? Looking for something like Clouds or Arbhar or Nebulae, but in Norns form!

1 Like

You can use clouds on norns, thanks to @okyeron! Check out Mi-engines. Its also been added to Pedalboard: Chainable FX for norns (v1.5.1).

I think all the other granular scripts I’m aware of don’t work with live input, but there is also easygrain, glut, angl, mangl and langl :slight_smile:

4 Likes

Yes, I’ve looked at all of the non live granular scripts. They look great, just not what I need ATM! Amazing re: clouds!

Sway does granular on live input https://github.com/carltesta/sway

3 Likes

adding live input to the Glut granular engine would be really pretty easy. not a bad first exercise in supercollider

9 Likes

oh wow, i’ve been wanting to be able to do this since i got my fates. thank you

would i just add this to the original Glut script somewhere? or is it more involved than that

1 Like

That’s the Glut code already, unmodified. You’d want to edit it to fill the buffers it creates with live sound, likely via a synthdef using RecordBuf, rather than that code as-is which fills the buffers with sound from the filesystem.

I don’t know much at all about supercollider (yet) but I’m hoping to take a look at this this weekend!

you would add something (loosely) like this to the engine class

/// add a variable to hold a single recording synth
var recSynth;

...

//// add a class method to record
// live record
recordToBuf { arg bufIndex=0, inChannel=0;
	if(buffers[bufIndex].notNil, {
		recSynth = { 
			RecordBuf.ar(
				SoundIn.ar(inChannel),   // capture requested chnanel...
				buffers[bufIndex].bufnum, // to requested buffer
				doneAction:2 // free the synth automatically at buffer end (if not already freed)
			);
		}.play(Crone.server);
	});
}

//// a method to stop recording
// stop recording
stopRecord { 
	if (recSynth.notNil, { recSynth.free; });
}



/// and command glue for lua

this.addCommand("startRecord", "ii", { arg msg;
	recordToBuf(msg[0], msg[1]);
}

this.addCommand("stopRecord", "", { arg msg;
	stopRecord);
}

as written, the recording function is basic and crude:

  • no control over start position
  • can record into multiple buffers at once, each recording will proceed to the end of the buffer,
  • but, can only stop the most recently started recording without more bookkeeping (not a big deal but see elsewhere, like a polysynth, for how to manage multiple running synth instances with an associative collection.)

easy to add overdub / fadein / fadeout options as well. (use recLevel and preLevel fields of RecordBuf, optionally with envelopes)

2 Likes