[chuck-users] Jack Server shuts down ChucK client ...

Joel Matthys jwmatthys at gmail.com
Tue Mar 31 22:00:48 EDT 2015


Hello Niklas. Your class idea is good, and your old code is very close 
to working.

The problem is scope-related. In our OSC receiving method, you create an 
instance of MyBuzzer, then spork a method from it. But your object 
"buzzer" gets freed at the end of that code block, so the object your 
sporked thread references to no longer exists!

You need to instantiate MyBuzzer in the sporked thread, not the main 
thread. This modified version worked for me:

class MyBuzzer {
     SawOsc saw => LPF lp => ADSR e => Dyno dyn => dac;
     ADSR filt => Gain fg => blackhole;
     10 => fg.gain;
     Step s;
     s => filt;
     1 => s.next;

     // one-shot sine spork
     fun void buzz(float freq, float gain, int a, int d, int sus, int r) {
         a + d + sus + r => int overall;
         freq => saw.freq;
         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);

         e.keyOn();
         filt.keyOn();
         sus::ms => now;
         e.keyOff();
         filt.keyOff();
         r::ms => now;

         // I removed the connect and disconnect code because it wasn't 
the problem
     }

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

// this will get sporked
fun void sporkedBuzzer(float freq, float gain, int a, int d, int s, int r )
{
     MyBuzzer buzzer;
     buzzer.buzz(freq, gain, a, d, s, r);
}

// 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" ) @=> 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;
         spork ~ sporkedBuzzer(freq, gain, a, d, s, r);
     }
}


On 03/31/2015 12:26 PM, Niklas Reppel wrote:
> Hmm i'm using this a lot elsewhere, so i don't think so ...
>
> Strange thing is, if i don't use a class, but two plain methods, the 
> problem doesn't occur any longer ...
>
> I can live with that, though i'd say using a class would b eslightly 
> more intuitive here ...
>
> NEW VERSION: 
> https://github.com/the-drunk-coder/graa/blob/master/shreds/buzz.ck
>
>
> OLD VERSION:
>
> class MyBuzzer {
>     SawOsc saw => LPF lp => ADSR e => Dyno dyn;
>     ADSR filt => Gain fg => blackhole;
>     10 => fg.gain;
>
>     Step s;
>     s => filt;
>     1 => s.next;
>
>     // one-shot sine spork
>
>     fun void buzz(float freq, float gain, int a, int d, int sus, int r) {
>
>         a + d + sus + r => int overall;
>
>         freq => saw.freq;
>
>         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);
>
>         e.keyOn();
>
>         filt.keyOn();
>
>         sus::ms => now;
>
>         e.keyOff();
>
>         filt.keyOff();
>
>         r::ms => now;
>
>         // disconnecting doesn't really help here ...
>         dyn !=> dac;
>
>     }
>
>     fun void filteradsr (time then, float freq){
>
>         while (now < then){
>
>             float currfilt;
>
>             filt.last() * 800 + 100 => currfilt;
>
>             currfilt => lp.freq;
>
>             1::ms => now;
>
>         }
>
>     }
>
>     fun void connect(UGen ugen){
>
>         dyn => ugen;
>
>     }
>
> }
>
> // 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" ) @=> 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;
>
> MyBuzzer buzzer;
>
> buzzer.connect(dac);
>
> spork ~ buzzer.buzz(freq, gain, a, d, s, r);
>
> }
>
> }
>
>
>
>
>
> On 31.03.2015 19:14, Robert Poor wrote:
>> Is there any chance that oe.nextMsg() is returning false, as in:
>>
>> while( oe.nextMsg() )
>>      { ...
>>      }
>>
>> ?
>>
>>
>> On Tue, Mar 31, 2015 at 9:52 AM, Niklas Reppel <nik at parkellipsen.de> 
>> wrote:
>>> So, i'm trying to write a simple SawOsc-Synth with Polyphony, 
>>> triggered by
>>> OSC messages ...
>>>
>>> You can check it out here:
>>> https://github.com/the-drunk-coder/graa/blob/master/shreds/buzz.ck
>>>
>>> As i want to use a filter with adsr, i can't just spork a single method
>>> right ?
>>>
>>> But, with the current version, the Jack-Server (i'm on Linux) shuts the
>>> client down,
>>> with the following message:
>>>
>>> (JACK) the JACK server is shutting down this client...
>>>      ... stream stopped and closed!
>>>
>>> Anyone's got an idea why ?
>>>
>>> Regards,
>>> Nik
>>> _______________________________________________
>>> chuck-users mailing list
>>> chuck-users at lists.cs.princeton.edu
>>> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
>> _______________________________________________
>> chuck-users mailing list
>> chuck-users at lists.cs.princeton.edu
>> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
>
> _______________________________________________
> chuck-users mailing list
> chuck-users at lists.cs.princeton.edu
> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users



More information about the chuck-users mailing list