Norns: crone/supercollider

norns

#21

CroneGenEngine is my class and yes it’s meant to wrap a lot of boiler plate logic. As you’ve noted it’s a work in progress (like most of my stuff scattered with TODOs, sorry). It’s not the direction norns engines are heading in general :slight_smile: . I’d say look at TestSine, PolySub, Glut, Ack. CroneGenEngine is experimental.


#22

Cheers

For this project it wouldn’t be useful anyway but it does seem like an easy way to add a more straightforward synth,


#23

It builds engines from SynthDefs, basically. Engine_Gong is an example of this.


#24

After reading through this thread, I annotated the Supercollider code for the TestSine engine. I don’t know 100% what I’m talking about but I think this might be useful for others. It was helpful to me to step through a real example and explain it to myself.

For those who understand Object Oriented Programming in other languages and are confused by the sigils used in Supercollider class syntax, this reference cleared things up.

For example, why type the sigil ^ when you can type return like in other languages? Because in Supercollider no method can return void, so why bother implementing a reserved word return when everything returns. The ^ sigil says “return this value”. If it is omitted, return the object.

lol it looks like @zebra made some very similar annotations 4 months ago in this topic.

Reading through the CroneAudioContext.sc code and getting very excited about programmable hardware! Export VU/Level meters as OSC bundles!


#25

This is SO helpful. Thanks!


#26

Wait, woah, what? I can just include the stuff in norns/sc/core in the classpath on my laptop with scide? I assumed there is some kind of language binding between SC primitives (do those exist?) and Lua.

I can already imagine something like sshfs to mount the classes on the norns into my laptop for a realtime DSP dev environment…


#27

Does the Norns supercollider build have plugins and extensions installed? I’m looking into building an FM synth using the FM7 UGen which is an extension. Before I start digging through the code, is this possible?


#28

there are Ugens on the Norns - in the Norns repo (MLR is based on SoftCutHead which is a Ugen )

if you look at

it seems that there is both

~/.local/share/SuperCollider/Extensions

and then the ugens in norns/sc appear to be built and shoved into

the norns subdirectory of that.

Obviously I can’t comment on how you’d distribute it - someone from the Norn dev crew would have to comment

(edit: inadvertently goes down a new rabbit hole: Faust looks really interesting too! must resist looking until I’ve made all the current things I’m making…)


#29

oh - you mean the FM7 in sc3? I’m pretty sure the SC3 extensions are installed


#30

Experimenting with instantiating a Crone Engine on my laptop for dev purposes

I have it all compiling - when I make a new Engine_PolySub - it complains about the fact I’ve not given it a context (well it complains it can’t call .xg on the nothing I’ve given it but same thing).

I tried working out where engines actually load but got lost in a twisty turny network of OSC messages :slight_smile:

What are these context & callback objects? anyone any quick idea to save me more code spelunking (and more importantly how might I make/fake them to test things on my laptop)

Edit: figured it out

you use the Crone singleton and interact that way… Progress!


#31

sc3-plugins are included by default.

/Anton


#32

you could just roll a simple C program using liblo:
[ https://github.com/radarsat1/liblo/blob/master/examples/example_client.c ]

or one of the many bindings of that library to interpreted langs like python.


#33

I ended up using python. But now i’ve got a decent dev environment set up & I know what is going on. I’m back working directly on the Norns.


#34

Sweet, here they are! This is great. I’m particularly fond of the FM7 and DWG waveguide extensions. I’d be down to be part of a group who is building synths with these UGens and perhaps writing up some tutorials.

we@norns:/usr/share/SuperCollider/Extensions/SC3plugins $ ls -l
total 152
drwxr-xr-x 5 root root 4096 May 15 00:21 AntiAliasingOscillators
drwxr-xr-x 2 root root 4096 Aug 30 04:23 ATK
drwxr-xr-x 5 root root 4096 May 15 00:21 AuditoryModeling
drwxr-xr-x 3 root root 4096 Aug 30 04:23 AYUGens
drwxr-xr-x 4 root root 4096 Aug 30 04:23 BatUGens
drwxr-xr-x 3 root root 4096 Aug 30 04:23 BBCut2UGens
drwxr-xr-x 4 root root 4096 Aug 30 04:23 BerlachUGens
drwxr-xr-x 4 root root 4096 Aug 30 04:23 BetablockerUGens
drwxr-xr-x 5 root root 4096 Aug 30 04:23 BhobUGens
drwxr-xr-x 4 root root 4096 Aug 30 04:23 BlackrainUGens
drwxr-xr-x 4 root root 4096 Aug 30 04:23 ChaosUGens
drwxr-xr-x 3 root root 4096 Aug 30 04:23 ConcatUGens
drwxr-xr-x 4 root root 4096 Aug 30 04:23 DEINDUGens
drwxr-xr-x 3 root root 4096 Aug 30 04:23 DistortionUGens
drwxr-xr-x 4 root root 4096 May 15 00:21 DWGUGens
drwxr-xr-x 3 root root 4096 Aug 30 04:23 GlitchUGens
drwxr-xr-x 5 root root 4096 Aug 30 04:23 JoshUGens
drwxr-xr-x 3 root root 4096 Aug 30 04:23 LadspaUGen
drwxr-xr-x 5 root root 4096 Aug 30 04:23 LoopBufUGens
drwxr-xr-x 4 root root 4096 Aug 30 04:23 MCLDUGens
drwxr-xr-x 4 root root 4096 Aug 30 04:23 MdaUGens
drwxr-xr-x 4 root root 4096 Aug 30 04:23 MembraneUGens
drwxr-xr-x 5 root root 4096 Aug 30 04:23 NCAnalysisUGens
drwxr-xr-x 3 root root 4096 Aug 30 04:23 Neuromodules
drwxr-xr-x 4 root root 4096 May 15 00:21 OteyPianoUGens
drwxr-xr-x 6 root root 4096 May 15 00:21 PitchDetection
drwxr-xr-x 5 root root 4096 Aug 30 04:23 RFWUGens
drwxr-xr-x 2 root root 4096 Aug 30 04:23 RMEQSuiteUGens
drwxr-xr-x 4 root root 4096 May 15 00:21 SCMIRUGens
drwxr-xr-x 3 root root 4096 Aug 30 04:23 SkUGens
drwxr-xr-x 5 root root 4096 May 15 00:21 SLUGens
drwxr-xr-x 4 root root 4096 May 15 00:21 StkInst
drwxr-xr-x 2 root root 4096 Aug 30 04:23 StkUGens
drwxr-xr-x 3 root root 4096 Aug 30 04:23 SummerUGens
drwxr-xr-x 4 root root 4096 Aug 30 04:23 TagSystemUGens
drwxr-xr-x 3 root root 4096 Aug 30 04:23 TJUGens
drwxr-xr-x 3 root root 4096 Aug 30 04:23 VBAPUGens
drwxr-xr-x 3 root root 4096 Aug 30 04:23 VOSIMUGens

#35

I built the most basic engine for the FM7 UGen that works without exposing any modulation parameters. This is not very useful right now and I discovered a reproducible bug in Crone that does not exist in scide. It happens when I assign a control rate UGen to a variable.

What’s the recommended way to reload classes in ~/dust/lib/sc without rebooting the RPi? Debugging this is quite a challenge using only my goto h4x.

update: Fixed the bug which turns out was a feature!

I have a fork of dust with this engine in the fm7 branch.

It’s monophonic, has no envelope and only exposes a few parameters. I think the next step before I put more time in this is to port the syntax to a poly synth like the one experessed in Engine_PolySub.sc.

End goal is to get some kind of modulation matrix between pressed buttons on an illuminated grid and encoders.


#36

Ooh interesting. Funnily enough I had a similar idea but am building something else first. Will be interesting to see what you make. Looking forward to it!


#37

cool! I’ll be working more this week.

Have you seen the BBCut extensions? That could be some next level grid vibes.


#38

there is so much possibility with Supercollider - I really need to dig in now I’ve figured out how it sits in Norns.

the whole Norns thing feels like a perfect way to unlock its potential and so exciting that it has a vibrant community of people who feel the same around it


#39

I got to a milestone with my Engine_FM7 project. It loads on Norns, can be called through Maiden into a script and the Lua REPL works as expected to get and set params. It’s polyphonic, which was adapted from Engine_PolySub.

It’s not super useful…yet since I need to figure out what to do with the modulation matrix. There’s a lot of params in there.

I’d like to adapt the Earthsea script to work with the FM7 engine. The args and UGen graph is a little different so it’s not a simple swap out of the engine.name.

update, whelp, that worked well

From there I think it could be a cool interface to use a grid as a selector for the 6x6 modulation matrix and an encoder to change the value.

Once I get a useful script that demonstrates it’s usefulness I’ll make a PR for the upstream dust repo.

Anyone else working on new Polyphonic synths?


#40

Spent the last 5 days working on the FM7. There’s a UI that shows the phase mod matrix and a button (based on the second study) for random phase selection. All modulatable args in the SC engine are exposed as Norns parameters with control sets in the UI. It’ll play as a 16 voice synth with MIDI or a grid.

Tonight I got stuck.

The FM7 UGen outputs six channels, one for each operator. I don’t fully understand why the code I hacked works but it does. I have a suspicion it’s only outputting the first two channels when given as an arg to the Out.ar UGen.

When I use SynthDef graph function arguments to choose which operators to output (these would correspond to the “carriers” in FM parlance), the code examples for channel selection in the help file crashed sclang. I’ve commented my source code with the results. It appears args in a SynthDef are an instance of OutputProxy but I want an Integer so I can fill up an array and call some collection methods on it.

The end goal is to get between 1 and 6 channels selected from the UGen output array, then mix them into stereo when passed to the Out.ar UGen. The operators should not be “muted” because setting the amplitude to 0 would prevent that operator from acting as a modulator and a carrier.