Norns: ideas

maybe check out this example for building the UI (the ScrollingList in particular might be useful) - https://github.com/monome/we/blob/master/demos/ui.lua

You could copy some scripts from Bowery: a crow collection to your script directory on norns and try running something like crow.send("r filename.lua") when you select a new list item.

3 Likes

I don’t think this works, the r <filename> and u <filename> shortcuts are just handled by druid. Seems maybe nice to have a crow.run helper function that would allow executing a crow script as part of setup for a norns script though? I think that since the C function for sending data to crow adds a \n\0 terminator that you currently could not implement this in Lua the way druid does it.

(I also notice that since this function uses strcpy / strcat rather than strncpy / strncat that this function can corrupt memory. Indeed sending a very long line such as crow.send(some_512_byte_string) will crash matron. PR incoming!)

3 Likes

this definitely does not work as “r” is a druid host command, not native crow command.

@Galapagoose has been talking about a norns based crow uploader for awhile. it’s not trivial, but also not super complex. some nuances need to be worked out as @csboling points out above

1 Like

ah my mistake. i suppose you could also just nornsify the crow scripts (change things like ‘input[0]’ to ‘crow.input[0]’) and just invoke functions that redefine crow functionality, instead of actually trying to launch a script

Hi there :slight_smile: Just a little idea… Is the possibility of pre-listening sample per script is doable? i guess this can be a a softcut functionnality implemented in the engine, like a button combination or so…

Hi Everyone, especially to developers :smiley:
I wanted to ask how difficult or possible it would be to create an effect script similar to a mooger fooger pedal like the Murf on Norns / Fates.
@okyeron developed TORI which is very close to MURF.

But the MOOG MidiMurf have 8 filters act as resonant filters with center
frequencies of 200, 300, 450, 675, 1000, 1500, 2200, and 3400 Hz. to this must be added the possibility of scanning all the filters in sequencer mode.

At the moment I only know two pedal remodels both downloadable as a Reaktor ensemble :smile:
It could be a good source of inspiration.

  1. MuRF GLP Series
  2. Murf Waves This most deprecated

It would be really useful to have a script for Norns. It is a device with a great dynamic useful for animating the simplest things :blush:

There are two uses of midimurf with a crossover of the frequency range of the resonant filters.

MANUAL HERE
The first type is the same as in the moogerfooger MF-101 lowpass filter, as well as the lowest filter in the MIDI MuRF’s BASS voicing; the second type is in the top 7 bands of the MIDI MuRF’s BASS voicing and all 8 bands of the MIDS voicing

would it be very difficult?
Thanks

1 Like

I’m going to try this out later, but figured I’d get the idea out first —
check this out: https://www.jasondavies.com/bml/#0.42/128/64

Traffic (perhaps something else given that name is already taken)

K1 - Alt
E1 - Scroll pages
Visualizer on first page:
E2 - Density / Resolution, from 128x64 to 8x4 (Alt)
E3 - Speed / Tempo (Alt)
K2 - Start and stop
K3 - Reset

I’m thinking sequencer, but paired with some kind of internal oscillator for immediate satisfaction.

Remains to be seen what the mappings are, but I’d also want to leave that somewhat open-ended — make some room for interesting psets.

I’m thinking first page will be the visualizer, and the remaining pages (between 2 or 3) will map model params to sequencer params. Maybe something to do with number of collisions? Or number of moving cars? With respect to X and Y? Melodies? Rhythms? Something in between?

From a design perspective I don’t like having to go into Parameters > Edit so I’d like to keep the menu simple and self-contained.

Thematically I’m thinking World on a Wire meets Koyaanisqatsi — at once a critique and a celebration, a parody and an insight. Random collisions structure our interactions with one another, and the decisions we had thought were behind us only ripple ahead to meet us in the future. Karma, for those trapped in it, is a vicious cycle, a traffic jam not of space but time — the eternal return of the same.

3 Likes

there are a few generative cv sequencers but not gate ones…

1 Like

FWIW, i just updated this with some “multi-sampling” options to produce successively bandlimited versions of the input waveform.

(i’d like to add a BL’d wavetable synth to norns.)

5 Likes

Polyphonic Chromatic Sampler

Hey All, I am wondering if a polyphonic chromatic sampling capability has been implemented.

My goal is to record a sample into norms, cross fade the loop for a clean transition as the loop repeats then play the loop back chromatically via a midi keyboard with 4 or more voices of polyphony.

The quintessential demonstration of softcut-based sampling implies this is possible, however my forays into making this so have not been fruitful.

Does anyone have any advice or know if such capability has been developed? Cranes seems to get close to this functionality

This sounds totally possible with softcut. A rough, completely untested sketch:

  • Get your script set up to record a loop, something like softcut study 4. If you need to adjust crossfade time this is controllable per-voice.
  • When you get a midi note-on, calculate the right rate multiplier to pass as the rate for a softcut head. For example if you want A440 to be the same playback speed as your original sample, something like (for a single softcut voice):
m = midi.connect()
m.event = function(data)
  local d = midi.to_msg(data)
  if d.type == "note_on" then
    -- calculate a scaled rate so that midi note number 69 = A440
    -- results in softcut.rate(1, 1.0)
    softcut.rate(1, 2 ^ ((d.note - 69) / 12)))
    softcut.level(1, d.vel / 127)
  elseif d.type == "note_off" then
    softcut.level(1, 0)
    softcut.rate(1, 0)
  end
end
  • Once you’ve got something like that working, then you just need to figure out how you want the polyphonic allocation to work. Something simple without note-stealing might just count the number of active voices and use this to assign which softcut voice you adjust. Fancier polyphonic allocation schemes have probably been implemented in some existing library scripts you could reference, though I don’t know which offhand.
4 Likes

@cncs.lrkr would timber keys accomplish what you need?

I did a thing w/chromatic sample playback by loading a continuous multisample recording into softcut and the playing back via midi keyboard. (see below)

Your use case should be doable (or even directly adaptable from my script) depending on what you mean by crossfading at the end of the loop. As far as I know, each softcut voice can fade in and out at the start/end of the loop, but I don’t think it can self-crossfade (@zebra may have a definitive answer). You might be able to achieve something similar with two voices crossfading the same loop, but I think that would cut your max polyphony to 3.

1 Like

i also made a lib in the we package which is a simple four-voice sample player.

see this and this

4 Likes

not exactly sure i understand this correctly, but each voice does perform crossfading internally (has two R/W heads.)

Oof. My mental model has been off. Thanks for the clarification!

its on me for never putting it clearly enough maybe:

each voice has two heads; during a crossfade, one head fades out from the end of the loop, while the other fades in from the start of the loop.

the fade times can be arbitrarily long within the limits of the buffer size.

a crossfade begins automatically when a head reaches the loop endpoint, or when pos command is received. (fade-in begins at pos argument, which need not be within loop bounds.)

when a position change is requested during a crossfade, the new position change is queued and executed when the fade completes. (queue depth is 1; so additional position requests are discarded.)


so anyway, polyphony is 6. i think in future update we will increase this, while restricting the number of voices that can simultaneously record (varispeed write-with-xfade is several times more expensive than varispeed read.) it is actually easy to try this out “manually” if you want to see how it goes:

  • change the NumVoices enum value here
  • call rec(0) for all voices that you don’t want to record with. (e.g. all of them in a non-live sampler)
  • oh and i guess also the voice count in lua API here
3 Likes

Thanks for the guidance all.

Just to clarify the concept, the end goal is op-1 like sampling where the loop can be cross-faded by a user defined amount to prevent a click when the loop repeats; giving smooth playback if a synth pad was sampled for instance. (if the loop is originally 15 seconds long, with 1 second of cross-fade the loop will then be 14 seconds long)

I think someone asked, but shooting for monotimbral initially; multitimbral should no doubt be the end goal.

Reviewing the sources y’all posted, tehn’s fourwaves sample player seems like a good jumping off point.

Gaining familiarity with this codebase. The function sc.note looks to be where pitch shifting is implemented.

Looks like the task at hand is to write a script around fourwaves to manage live sampling and polyphonic key allocation.

Reviewing softcut, rate control and cross fade are exposed.

I might have missed it - with the assumption of monotimbrality, what is limiting fourwaves to 4 voices?

Can you give some insight on how you got the FH-1 to receive MIDI from the Norns? I just built a Norns shield and I don’t see the FH-1 in Devices > MIDI.

Edit: I’m connected to my FH-1 via a USB - USB cable.

1 Like

You are directly connecting two USB hosts, this won’t work. Indeed both devices are probably trying to supply power to each other and I suspect that in some cases this could be Bad, as in current going somewhere it shouldn’t. This post mentions using an iConnectMidi2 to act as a hub between the two hosts. There are a number of gadgets around which can allow two midi hosts to talk to each other, by acting as a USB device to each host and routing midi packets back and forth.