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 . I’d say look at TestSine, PolySub, Glut, Ack. CroneGenEngine is experimental.
For this project it wouldn’t be useful anyway but it does seem like an easy way to add a more straightforward synth,
It builds engines from SynthDefs, basically.
Engine_Gong is an example of this.
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.
Reading through the CroneAudioContext.sc code and getting very excited about programmable hardware! Export VU/Level meters as OSC bundles!
This is SO helpful. Thanks!
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…
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?
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
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…)
oh - you mean the FM7 in sc3? I’m pretty sure the SC3 extensions are installed
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
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!
sc3-plugins are included by default.
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.
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.
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
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!
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
End goal is to get some kind of modulation matrix between pressed buttons on an illuminated grid and encoders.
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!
cool! I’ll be working more this week.
Have you seen the BBCut extensions? That could be some next level grid vibes.
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
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
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?
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.