Hi list<br><br>I'm working with ChucK in a musical project,<br>and I have a problem with the code.<br>This code generates 3 different error menssages in my machine<br>(running chuck-alsa on linux), depending on the amount of<br>
components in an array.<br><br>1) A common<br>[chuck](VM): NullPointerException: shred[id=3:<a href="http://grancassa.ck">grancassa.ck</a>], PC=[13]<br><br>2) A segfault, and<br><br>3) A king of 1) + 2) problem<br>[chuck](VM): NullPointerException: shred[id=3:<a href="http://grancassa.ck">grancassa.ck</a>], PC=[13]<br>
*** glibc detected *** chuck-alsa: double free or corruption (!prev): 0x08391c50 ***<br>======= Backtrace: =========<br>/lib/libc.so.6[0xb7c9d4b6]<br>/lib/libc.so.6(cfree+0x89)[0xb7c9f179]<br>/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7eb4a61]<br>
/usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0xb7eb4abd]<br>chuck-alsa[0x8055c25]<br>chuck-alsa[0x80583aa]<br>chuck-alsa[0x809b692]<br>chuck-alsa[0x80564f9]<br>chuck-alsa[0x8057ac8]<br>chuck-alsa[0x80afd98]<br>/lib/libc.so.6(__libc_start_main+0xe0)[0xb7c4cfe0]<br>
chuck-alsa(__gxx_personality_v0+0x3a5)[0x804dfb1]<br>======= Memory map: ========<br>08048000-081a6000 r-xp 00000000 08:02 1107555 /usr/bin/chuck-alsa<br>081a6000-081ce000 rw-p 0015d000 08:02 1107555 /usr/bin/chuck-alsa<br>
081ce000-08456000 rw-p 081ce000 00:00 0 [heap]<br>b63c4000-b63c5000 ---p b63c4000 00:00 0<br>b63c5000-b6bc5000 rw-p b63c5000 00:00 0<br>b6bc5000-b6bc6000 ---p b6bc5000 00:00 0<br>b6bc6000-b73c6000 rw-p b6bc6000 00:00 0<br>
b73c6000-b73c7000 ---p b73c6000 00:00 0<br>b73c7000-b7bc9000 rw-p b73c7000 00:00 0<br>b7bc9000-b7bcd000 r-xp 00000000 08:02 509500 /usr/lib/libogg.so.0.5.3<br>b7bcd000-b7bcf000 rw-p 00003000 08:02 509500 /usr/lib/libogg.so.0.5.3<br>
b7bcf000-b7c1e000 r-xp 00000000 08:02 510590 /usr/lib/libFLAC.so.8.1.0<br>b7c1e000-b7c20000 rw-p 0004f000 08:02 510590 /usr/lib/libFLAC.so.8.1.0<br>b7c20000-b7c33000 r-xp 00000000 08:02 455207 /lib/<a href="http://libpthread-2.6.1.so">libpthread-2.6.1.so</a><br>
b7c33000-b7c35000 rw-p 00013000 08:02 455207 /lib/<a href="http://libpthread-2.6.1.so">libpthread-2.6.1.so</a><br>b7c35000-b7c37000 rw-p b7c35000 00:00 0<br>b7c37000-b7d64000 r-xp 00000000 08:02 455181 /lib/<a href="http://libc-2.6.1.so">libc-2.6.1.so</a><br>
b7d64000-b7d65000 r--p 0012c000 08:02 455181 /lib/<a href="http://libc-2.6.1.so">libc-2.6.1.so</a><br>b7d65000-b7d67000 rw-p 0012d000 08:02 455181 /lib/<a href="http://libc-2.6.1.so">libc-2.6.1.so</a><br>b7d67000-b7d6b000 rw-p b7d67000 00:00 0<br>
b7d6b000-b7d75000 r-xp 00000000 08:02 455263 /lib/libgcc_s.so.1<br>b7d75000-b7d77000 rw-p 00009000 08:02 455263 /lib/libgcc_s.so.1<br>b7d77000-b7d9a000 r-xp 00000000 08:02 455189 /lib/<a href="http://libm-2.6.1.so">libm-2.6.1.so</a><br>
b7d9a000-b7d9c000 rw-p 00022000 08:02 455189 /lib/<a href="http://libm-2.6.1.so">libm-2.6.1.so</a><br>b7d9c000-b7df2000 r-xp 00000000 08:02 1237590 /usr/lib/libsndfile.so.1.0.17<br>b7df2000-b7df4000 rw-p 00055000 08:02 1237590 /usr/lib/libsndfile.so.1.0.17<br>
b7df4000-b7df8000 rw-p b7df4000 00:00 0<br>b7df8000-b7dfa000 r-xp 00000000 08:02 455187 /lib/<a href="http://libdl-2.6.1.so">libdl-2.6.1.so</a><br>b7dfa000-b7dfc000 rw-p 00001000 08:02 455187 /lib/<a href="http://libdl-2.6.1.so">libdl-2.6.1.so</a><br>
b7dfc000-b7edf000 r-xp 00000000 08:02 510606 /usr/lib/libstdc++.so.6.0.9<br>b7edf000-b7ee2000 r--p 000e2000 08:02 510606 /usr/lib/libstdc++.so.6.0.9<br>b7ee2000-b7ee4000 rw-p 000e5000 08:02 510606 /usr/lib/libstdc++.so.6.0.9<br>
b7ee4000-b7eea000 rw-p b7ee4000 00:00 0<br>b7eea000-b7fa1000 r-xp 00000000 08:02 509387 /usr/lib/libasound.so.2.0.0<br>b7fa1000-b7fa2000 r--p 000b6000 08:02 509387 /usr/lib/libasound.so.2.0.0<br>b7fa2000-b7fa6000 rw-p 000b7000 08:02 509387 /usr/lib/libasound.so.2.0.0<br>
b7fa6000-b7fa7000 rw-p b7fa6000 00:00 0<br>b7fcc000-b7fe6000 r-xp 00000000 08:02 455174 /lib/<a href="http://ld-2.6.1.so">ld-2.6.1.so</a><br>b7fe6000-b7fe8000 rw-p 0001a000 08:02 455174 /lib/<a href="http://ld-2.6.1.so">ld-2.6.1.so</a><br>
bfcf2000-bfd07000 rw-p bfcf2000 00:00 0 [stack]<br>ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]<br>Abortado<br><br><br>I think there is not a NullPointerException in the logic of the<br>chuck code, maybe I'm wrong, but the error menssages 2) and 3) are not<br>
only chuck-code-logic-problems. I can't understand the problem and find<br>a workaround! If anyone can confirm that the error was due to a bug, or a mistake in my code,<br>I will be grateful. Here is the simplificated code...<br>
<br><br>//**************<br>// <a href="http://grancassa.ck">grancassa.ck</a><br>//**************<br><br>// To Test: $ chuck CADSR.ck <a href="http://percaditiva.ck">percaditiva.ck</a> <a href="http://grancassa.ck">grancassa.ck</a><br>
<br>public class GranCassa extends PercAditiva<br>{<br> int afinacion;<br> 0 => int GRAVE;<br> 1 => int MEDIO;<br> 2 => int AGUDO;<br><br> float bfreq;<br><br> constructor();<br> fun void constructor() {<br>
//***********************************************************************<br>// setNComponentes < 5<br>// [chuck](VM): NullPointerException: shred[id=3:<a href="http://grancassa.ck">grancassa.ck</a>], PC=[13]<br>// setNComponentes = 5<br>
// segfault<br>// setNComponentes > 5<br>// [chuck](VM): NullPointerException: shred[id=3:<a href="http://grancassa.ck">grancassa.ck</a>], PC=[13]<br>// *** glibc detected *** chuck-alsa: double free or corruption (!prev): 0x083ae308 ***<br>
//************************************************************************<br> setNComponentes( 5 );<br> setResonancia( 10::second, 4.0 );<br><br> setAfinacion( GRAVE );<br> setGanancias( 0 );<br>
}<br><br> fun float tocar( float n ) {<br> setTAtaque( 2::second, 0 );<br><br> n => g.gain;<br> noteOn();<br> }<br><br> fun float apagar( float n ) {<br> if( n > 0.5 ) {<br> setTApagado( 0.25::second, -2 );<br>
}<br> else {<br> setTApagado( 0.5::second, 2 );<br> }<br><br> noteOff();<br> }<br><br> fun void setAfinacion( int a ) {<br> a => afinacion;<br> setFrecuencias();<br>
}<br><br> fun void setFrecuencias() {<br> if( afinacion == GRAVE )<br> 40.0 => bfreq;<br> else if( afinacion == MEDIO )<br> 80.0 => bfreq;<br> else // afinacion == AGUADO<br>
120.0 => bfreq;<br><br> for( int i; i < ncomp; i++ ) {<br> bfreq + bfreq * 0.5 * i +<br> ( Std.rand2f( -2.5, 2.5 ) ) => s[i].freq;<br> }<br> }<br><br> fun void setGanancias( int material ) {<br>
for( int i; i < ncomp; i++ ) {<br> 1.0 / (i + 1.0) => gain[i].gain;<br> }<br> }<br>}<br><br>// Test<br><br>GranCassa gc;<br><<< "np" >>>;<br><br>gc.connectTo( dac );<br>
<br>while( true ) {<br> gc.tocar( 0.5 );<br> 5::second => now;<br> gc.apagar( 0.7 );<br> 2::second => now;<br>}<br>// End of <a href="http://grancassa.ck">grancassa.ck</a><br><br><br><br>//****************<br>
// <a href="http://percaditiva.ck">percaditiva.ck</a><br>//****************<br><br>// Super class for GranCassa<br><br>public class PercAditiva<br>{<br> 12 => int MAX_COMP;<br> int ncomp;<br> SinOsc @ s[MAX_COMP];<br>
CADSR @ env[MAX_COMP];<br> Gain @ gain[MAX_COMP];<br> Gain g;<br><br> fun void connectTo( UGen ug ) {<br> g => ug;<br> }<br><br> fun float setGain( float g_ ) {<br> g_ => g.gain;<br>
}<br><br> fun float getGain() {<br> return g.gain();<br> }<br><br> fun void setNComponentes( int n ) {<br> if( n <= MAX_COMP && n >= 1 ) {<br> n => ncomp;<br> }<br>
else {<br> <<< "(PercAditiva): Cantidad de componenetes no soportada" >>>;<br> <<< "(PercAditiva): ncomp = 6" >>>;<br> 6 => ncomp;<br>
}<br><br> for( int i; i < ncomp; i++ ) {<br> SinOsc saux @=> s[i];<br> CADSR caux @=> env[i];<br> Gain gaux @=> gain[i];<br><br> env[i].connectFrom( s[i] );<br>
env[i].connectTo( gain[i] );<br> //s[i] => env[i].g => gain[i];<br> gain[i] => g;<br> }<br> }<br><br> fun void noteOn() {<br> for( int i; i < ncomp; i++ ) {<br>
env[i].keyOn();<br> }<br> }<br><br> fun void noteOff() {<br> for( int i; i < ncomp; i++ ) {<br> env[i].keyOff();<br> }<br> }<br><br> fun void setTAtaque( dur dt, float factor ) {<br>
for( int i; i < ncomp; i++ ) {<br> env[i].setAttack( dt, factor );<br> }<br> }<br><br> fun void setTApagado( dur dt, float factor ) {<br> for( int i; i < ncomp; i++ ) {<br> env[i].setRelease( dt, factor );<br>
}<br> }<br><br> fun void setResonancia( dur dt, float factor ) {<br> for( int i; i < ncomp; i++ ) {<br>//*********************************************************<br>// Commenting the next line, no problem arise (¿?¿?¿?¿?)<br>
//*********************************************************<br> env[i].setDecay( dt, float factor );<br> env[i].setSustain( 0.0 );<br> }<br> }<br>}<br>// End of <a href="http://percaditiva.ck">percaditiva.ck</a><br>
<br><br>//**********<br>// CADSR.ck<br>//**********<br><br>// CADSR = CurveTable + (stk)ADSR<br><br>public class CADSR<br>{<br> CurveTable attack;<br> CurveTable decay;<br> CurveTable release;<br> Gain g;<br><br>
dur atime;<br> dur dtime;<br> dur rtime;<br><br> float acurve;<br> float dcurve;<br> float rcurve;<br><br> float slevel;<br> float clevel; // current level<br><br> float rate;<br> float step;<br>
<br> int state;<br> 0 => int ATTACK;<br> 1 => int DECAY;<br> 2 => int SUSTAIN;<br> 3 => int RELEASE;<br> 4 => int DONE;<br><br> constructor();<br><br> fun void constructor() {<br> setAttack( 0.5::second, 0.0 );<br>
setDecay( 0.5::second, 0.0 );<br> setSustain( 0.5 );<br> setRelease( 0.5::second, 0.0 );<br><br> 0.0 => g.gain;<br> }<br><br> fun void connectTo( UGen ug ) {<br> g => ug;<br>
}<br><br> fun void connectFrom( UGen ug ) {<br> ug => g;<br> }<br><br> fun void setAttack( dur t, float curve ) {<br> t => atime;<br> curve => acurve;<br> }<br><br> fun void setDecay( dur t, float curve ) {<br>
t => dtime;<br> curve => dcurve;<br> }<br><br> fun void setSustain( float level ) {<br> level => slevel;<br> }<br><br> fun void setRelease( dur t, float curve ) {<br> t => rtime;<br>
curve => rcurve;<br> }<br><br> fun void keyOn() {<br> // Si se ataca continua sin apagar, se mantienen los shreds<br> // VERIFICAR<br> spork ~ computeSamples();<br> me.yield(); // para darle oportunidad que corra el shred (?)<br>
}<br><br> fun void keyOff() {<br> if( state == DONE | state == RELEASE ) return;<br> RELEASE => state;<br> }<br><br> fun void computeSamples() {<br> if( state == ATTACK ) {<br> // Las CurveTable se inicializan acá porque si no, hay<br>
// problemas con la inicialización y los índices.<br> [ 0.0, 0.0, acurve, 1.0, 1.0 ] => attack.coefs;<br> 0.0 => clevel;<br> 0.0 => step;<br> 1.0 / ( atime / samp ) => rate;<br>
<br> while( state == ATTACK ) {<br> attack.lookup( step ) => g.gain => clevel;<br> rate +=> step;<br><br> // La comparación debe ir antes de que se realize el<br>
// cómputo (pase el tiempo) por la concurrencia<br> // de state con respecto a RELEASE. !!!<br> if( step >= 1.0 ) DECAY => state;<br> 1::samp => now;<br>
}<br> }<br> if( state == DECAY ) {<br> [ 0.0, clevel, dcurve, 1.0, slevel ] => decay.coefs;<br> 0.0 => step;<br> 1.0 / ( dtime / samp ) => rate;<br><br> while( state == DECAY ) {<br>
decay.lookup( step ) => g.gain => clevel;<br> rate +=> step;<br><br> if( step >= 1.0 ) SUSTAIN => state;<br> 1::samp => now;<br> }<br>
}<br> // Este no if está demás por el paso del tiempo en el shred<br> if( state == SUSTAIN ) {<br> while( state == SUSTAIN ) {<br> // clevel ~= slevel<br> clevel => g.gain;<br>
1::samp => now;<br> }<br> }<br> if( state == RELEASE ) {<br> [ 0.0, clevel, rcurve, 1.0, 0.0 ] => release.coefs;<br> 0.0 => step;<br> 1.0 / ( rtime / samp ) => rate;<br>
<br> while( state == RELEASE ) {<br> release.lookup( step ) => g.gain => clevel;<br> rate +=> step;<br><br> if( step >= 1.0 ) DONE => state;<br> 1::samp => now;<br>
}<br> }<br> // Este if está demás (?)<br> if( state == DONE ) {<br> // por si las dudas<br> 0.0 => g.gain;<br> 1::samp => now;<br> }<br> }<br>
}<br>// End of CADSR.ck<br><br><br>Thanks<br>Lucas<br><br>