[chuck-users] ChucK, JCRev and stability (frequent crashes)!

Niklas Reppel nik at parkellipsen.de
Wed May 27 16:41:37 EDT 2015


Hi everybody,

i have some osc-triggered synth shreds like the one attached, and tried 
to spice things up using pan control (basic, i know ...).

Now, for the music i have in my mind, the respective shred is triggered 
about 10 - 15 times per second via OSC, and there are multiple of those
shreds, including some granulation shreds.

Now, even when i only trigger the attached shred with different pan 
values, ChucK crashes after a few seconds ... so i don't know, is the
shred faulty, or is chuck simply not capable for what i have in mind ?

Btw, i'm using Arch linux on a pretty recent laptop with plenty of ram 
and a fast processor, so resources should not be an issue ...

ChucK error message:
(JACK) the JACK server is shutting down this client...
... stream stopped and closed!
[chuck]: cleaning up...
terminate called after throwing an instance of 'RtError'
   what():  RtApi:: a stream is not open!


JACK error message
subgraph starting at ChucK timed out (subgraph_wait_fd=9, status = 0, 
state = Running, pollret = 0 revents = 0x0)

Regards,
nik


-------------- next part --------------
class MyBuzzer {

	SawOsc saw => LPF lp => ADSR e => Dyno dyn => Pan2 p;
	
	ADSR filt => Gain fg => blackhole;
	10 => fg.gain;

	p.left => JCRev lrev => dac.left;
	p.right => JCRev rrev => dac.right;
	
	Step s;
	s => filt;
	1 => s.next;

	// one-shot buzz spork
	fun void buzz(float freq, float gain, int a, int d, int sus, int r, float rev, float cutoff, float pan)
	{	
				
		a + d + sus + r => int overall;
		freq => saw.freq;

		pan => p.pan;
		rev => lrev.mix;
		rev => rrev.mix;
	

		e.set( a::ms, d::ms, gain, r::ms );
		filt.set( a::ms, (sus - r)::ms, gain, r::ms );

		dyn.limit;
		gain / 4 => dyn.thresh;
		
		if(d == 0){
			0 => e.decayRate;
			0 => filt.decayRate;
		}
		
		now + overall::ms => time then;	
		spork ~ filteradsr(then, freq, cutoff);
		e.keyOn();
		filt.keyOn();
		sus::ms => now;
		e.keyOff();
		filt.keyOff();	
		r::ms => now;

		if(rev > 0.0){
			2000::ms => now;
	    }

	}

	fun void filteradsr (time then, float freq, float cutoff)
	{
		while (now < then)
		{
			float currfilt;
			(filt.last() * 800 + 100) * cutoff => currfilt;
			currfilt => lp.freq;		
			1::ms => now;
		}
	}
}

fun void sporkBuzzer(float freq, float gain, int a, int d, int sus, int r, float rev, float cutoff, float pan){
	MyBuzzer buzzer;
	buzzer.buzz(freq, gain, a, d, sus, r, rev, cutoff, pan);
}

// create our OSC receiver
OscRecv recv;
// use port 6449 (or whatever)
6449 => recv.port;
// start listening (launch thread)
recv.listen();

// create an address in the receiver, store in new variable
recv.event( "/buzz, f f i i i i f f f ") @=> OscEvent @ oe;

// infinite event loop
while( true )
{
    // wait for event to arrive
    oe => now;
	
    // grab the next message from the queue. 
    while( oe.nextMsg() )
    {		
		oe.getFloat() => float freq;
		oe.getFloat() => float gain;	
		oe.getInt() => int a;
		oe.getInt() => int d;
		oe.getInt() => int s;
		oe.getInt() => int r;
		oe.getFloat() => float rev;
		oe.getFloat() => float cutoff;
		oe.getFloat() => float pan;
		
		
		spork ~ sporkBuzzer(freq, gain, a, d, s, r, rev, cutoff, pan);
    }
}


More information about the chuck-users mailing list