I think it’s totally viable. We simply have to place limitations on the sequence of engine loading from lua side, since the current possibility of race conditions with SC will extend to other, possibly homebrewed DSP environments. I’d just bake a state variable as shown above into the core engine module. engine.load() can have a return value that is false if there is already an incomplete load request in flight. I’ll PR this and then we can discuss if there are other concerns.

(Is it useful? Who knows. but leaving the possibility of un freed engine resources is not acceptable to me.)

update: PR is here, please check it out and discuss if you like
[ https://github.com/monome/norns/pull/846 ]

3 Likes

Could somebody lowercase the D, in the thread title?

2 Likes

Is there anything in the boot process that sets the screen rotation?

Trying to see if I can flip my display. Tried modifying the screen overlay to rotate=180 but no dice.

I figure either rotation is locked in somewhere in the code, or perhaps the fb_ssd1322 driver does not support rotation?

In the overlay file maybe ( ssd1322-spi-overlay.dts), line 74

Edit: nope you already tested that, sorry I misread the post…

FWIW - I was able to flip the display by modifying the display driver and recompiling. Now if I could figure out how to get the driver to honor the rotate param from the overlays I’d be pretty excited.

Edit: attempted to update the display driver to support rotation - wont know if it works until tomorrow when I recompile. :crossed_fingers:

UPDATE: My updated version of the fb_ssd1322 driver source file now works and obeys the rotate variable from the overlay! :tada:

3 Likes

I’ve been curious about using the Espeak command line tool or maybe flite (and maybe this goes along with using other dsp tools aside from SC)

So… a question for @zebra - if I wanted to get some audio from “outside of norns” and route it out to the norns outputs - what is the best approach? Do I need to create a Jack client that connects to the running Jack instance?

If so, any pointers on how to do that? Thx!

2 Likes

Do I need to create a Jack client that connects to the running Jack instance?

Yes. U can connect arbitrary jack client to system outputs, crone engine inputs, can one softcut inputs, and/or supercollider

any pointers

man jack_connect For hooking up clients

If you have a make a new jack client (wrapping a lib or something) you need to build it in c/c++. You could look at crone client sources for example

3 Likes

In searching around on JACK info, etc, I found what looks like a handy command line tool - jack-matchmaker. Wanted to post this here in case it might be helpful to anyone else.

1 Like

This might be stupid/super obvious, but is there a way to expose jack stuff on a script level? So that you could in theory have parameters that would let you route signals.

yes, can execute jack commands from lua. but i don’t see great utility in this; we don’t have tons of jack clients; the mixer client handles most routing internally (with fancy smoothed matrix mixing.)

i guess you could do weird stuff like making feedback loops from softcut->supercollider.

You can also look at this small JACK client program that I built for the norns. This is more or less the JACK boilerplate I dig up whenever I need to start a new project:

3 Likes

It’s more about repurposing ins/outs as fx buses if you are running a mono-setup.

can you give an example of how altering the jack connection graph would help achieve that goal?

my feeling is that you probably want to make changes to the mixer client and its interface, or just use something completely different.

Just an idea. But from your response it looks like it not doable(?)

altering the jack connection graph from lua is totally doable.

os.execute("jack_connect blablabla")

what do you want blablabla to accomplish? my guess is that it likely has something to do with the functions of crone mixer client, and can either be accomplished within the mixer API, or can’t. but i don’t know.

jack client ports in norns:

system:capture_1
system:capture_2
system:playback_1
system:playback_2
crone:input_1
crone:input_2
crone:input_3
crone:input_4
crone:input_5
crone:input_6
crone:output_1
crone:output_2
crone:output_3
crone:output_4
crone:output_5
crone:output_6
softcut:input_1
softcut:input_2
softcut:output_1
softcut:output_2
SuperCollider:in_1
SuperCollider:in_2
SuperCollider:out_1

mixer API assumes following mapping for crone I/O pairs:
1, 2 -> ADC/DAC
3, 4 -> softcut
5, 6 -> supercollider

but if you want to “monoize” everything, or whatever, just go for it

-- helpers
connect = function(src, dst)
  os.execute("jack_connect " .. src .. " " .. dst)
end

disconnect = function(src, dst) 
  os.execute("jack_disconnect ".. src .. " " .. dst)
end

monoize = function() 
  disconnect("system:capture_1", "crone:input_1")
  disconnect("crone:output_1", "system:playback_1")
  connect("crone:output_1", "system:playback_2")
end

that will make all of norns processing mono, ignoring input 1 and summing any stereo processing (from supercollider etc) to output 2. input 1 and output 1 will do nothing unless you launch some other process that connects to them.

but again - it’s quite possible that existing mixer API and routing structure will handle your needs. i often use norns in an effect loop, monitor in stereo mode with dry passthrough from 2->2 for example.

2 Likes

Great idea!

At some point, I’ve worked with both of these. From what I remember, I think the flite API was sane enough to be usable. It is supposed to be a lightweight little sister to Festival. Espeak sounds better. I think I remember at some point trying to hack something with the espeak API, but I don’t think I got far. One of these programs actually uses an embedded dialect of scheme under the hood for scripting, but I can’t remember which one.

In a similar vein is the LPC10 codec via openlpc. I imagine it will run just fine on the norns. I have a wrapper for it in Soundpipe here, which you are free to use or reverse engineer into something better:

1 Like

what I want is to have on in/out on my norns function as an fx loop. it will probably end with just a nasty feedback loop instead of an fx loop with pedals etc. within my system(I was hoping to avoid getting a mixer, but it might be unavoidable). I curse my hope for minimalism :wink:

1 Like

So yeah, that seems entirely dependent on changing routes within the mixer process.

Maybe very small changes that could be easily executed!

1 Like

How can you call norns.script.load(...) from ssh exactly? I just set up intellij with the lua package addon. Its soooooo nice, but it would be nice to load the transfered project durring (er… after) the deployment of my project to norns too.

maiden speaks to the lua process (matron) via websocket, not via ssh.

matron simply present its REPL on stdin/stdout, and is piped to websockets through a small nanomsg-based tool (ws-wrapper).

i’m not aware of a way to interface IDEA lua plugin with a remote repl but you can roll your own ws-wrapper replacement if you have a plan for that.

(note that matron REPL is simple, doesn’t have readline or command history, so is well suited to programmatic control.)

1 Like