Skip to content
brian crabtree edited this page Jun 10, 2018 · 4 revisions

Collected Questions and Answers

Please help us collect helpful tips shared on


Should I use the bottom power-off button?

NO. Use this only if you have a system lockup. You'll risk losing data by using the bottom button. Use SYSTEM > SLEEP in the menu.

Should I leave the WIFI nub plugged in?

If you're not using it actively, no. Take it out. It uses almost 100ma of power which will only decrease your battery time.

What's that number in the corner of the LEVELS screen?

That's the current battery percentage. Hold KEY1 to see current drain/charge rate.

Scripting (Lua)

Engines (Supercollider)

How do I use audio input within an engine?

See this example

Any hints as to how we could include the Patterns library in our CroneEngine? I have a synth in SC that I have been controlling via Patterns. I’m imagining creating a LUA interface that changes the values of the pattern. What’s the best way to go about this?

(from @catfact)

there are very few limitations as to what you can do in a CroneEngine. you can use Patterns or any other sclang feature, whether it's a good idea or not.

we have not yet published the repo containing the base classes, but of course they are in the filesystem on your norns and you can examine them in the usual ways.

in advance of more proper documentation / tutorials, here is a sort of template:

Engine_Foo : CroneEngine {

   var <baz_poll;
   var <baz_seq;

// this is your constructor. the 'context' arg is a CroneAudioContext. 
// it provides input and output busses and groups. 
// see its implementation for details.
	*new { arg context, doneCallback;
		^, doneCallback);

// this is called when the engine is actually loaded by a script. 
// you can assume it will be called in a Routine,
//  and you can use .sync and .wait methods.
	alloc {

// this is how you add "commands", 
// which is how the lua interpreter controls the engine. 
// the format string is analogous to an OSC message format string, 
// and the 'msg' argument contains data.
		this.addCommand("foo", "f", { arg msg; postln( msg[1]); });

/// this is how you add a "poll", which is how to send data back to lua, 
// triggering a callback.
// by default, a poll is periodically evaluated with a given function.
// this function just returns a random number.
                this.addPoll("bar", { 1.0.rand });

/// here is a non-periodic poll, which we can arbitrarily trigger.
// notice that it has no function argument.
                baz_poll = this.addPoll("baz", periodic:false);

// this Routine triggers the "baz" poll with another random number,
// at a random interval.
// (i would have used Pseq here for demonstration, but i've forgotten how!)
                baz_seq = Routine { {
                    (0.1 + 1.0.rand).wait;
	            } }.play;
	free {
             // here you should free resources (e.g. Synths, Buffers &c) 
// and stop processes (e.g. Routines, Tasks &c)

Could you have a single SynthDef playing and then have Buses connecting data from LUA to SC so that you can have smooth control changes in the sound?

// CroneEngine_TestSine
// dumbest possible test: a single, mono sinewave
Engine_TestSine : CroneEngine {
	var <synth;

	*new { arg context, doneCallback;
		^, doneCallback);

	alloc {
		synth = {
			arg out, hz=220, amp=0.5, amplag=0.02, hzlag=0.01;
			var amp_, hz_;
			amp_ =, amplag);
			hz_ =, hzlag);, ( * amp_).dup);
		}.play(args: [\out, context.out_b], target: context.xg);

		this.addCommand("hz", "f", { arg msg;
			synth.set(\hz, msg[1]);

		this.addCommand("amp", "f", { arg msg;
			synth.set(\amp, msg[1]);

	free {;

here the smoothing is done in the synthdef. but it could be on a Bus with a separate synth. the PolySub engine in earthsea and so on, uses shared control buses for the multiple synth voices.

You can’t perform that action at this time.