Hi list<br><br>I&#39;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&nbsp;&nbsp;&nbsp; /usr/bin/chuck-alsa<br>081a6000-081ce000 rw-p 0015d000 08:02 1107555&nbsp;&nbsp;&nbsp; /usr/bin/chuck-alsa<br>
081ce000-08456000 rw-p 081ce000 00:00 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [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&nbsp;&nbsp;&nbsp;&nbsp; /usr/lib/libogg.so.0.5.3<br>b7bcd000-b7bcf000 rw-p 00003000 08:02 509500&nbsp;&nbsp;&nbsp;&nbsp; /usr/lib/libogg.so.0.5.3<br>
b7bcf000-b7c1e000 r-xp 00000000 08:02 510590&nbsp;&nbsp;&nbsp;&nbsp; /usr/lib/libFLAC.so.8.1.0<br>b7c1e000-b7c20000 rw-p 0004f000 08:02 510590&nbsp;&nbsp;&nbsp;&nbsp; /usr/lib/libFLAC.so.8.1.0<br>b7c20000-b7c33000 r-xp 00000000 08:02 455207&nbsp;&nbsp;&nbsp;&nbsp; /lib/<a href="http://libpthread-2.6.1.so">libpthread-2.6.1.so</a><br>
b7c33000-b7c35000 rw-p 00013000 08:02 455207&nbsp;&nbsp;&nbsp;&nbsp; /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&nbsp;&nbsp;&nbsp;&nbsp; /lib/<a href="http://libc-2.6.1.so">libc-2.6.1.so</a><br>
b7d64000-b7d65000 r--p 0012c000 08:02 455181&nbsp;&nbsp;&nbsp;&nbsp; /lib/<a href="http://libc-2.6.1.so">libc-2.6.1.so</a><br>b7d65000-b7d67000 rw-p 0012d000 08:02 455181&nbsp;&nbsp;&nbsp;&nbsp; /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&nbsp;&nbsp;&nbsp;&nbsp; /lib/libgcc_s.so.1<br>b7d75000-b7d77000 rw-p 00009000 08:02 455263&nbsp;&nbsp;&nbsp;&nbsp; /lib/libgcc_s.so.1<br>b7d77000-b7d9a000 r-xp 00000000 08:02 455189&nbsp;&nbsp;&nbsp;&nbsp; /lib/<a href="http://libm-2.6.1.so">libm-2.6.1.so</a><br>
b7d9a000-b7d9c000 rw-p 00022000 08:02 455189&nbsp;&nbsp;&nbsp;&nbsp; /lib/<a href="http://libm-2.6.1.so">libm-2.6.1.so</a><br>b7d9c000-b7df2000 r-xp 00000000 08:02 1237590&nbsp;&nbsp;&nbsp; /usr/lib/libsndfile.so.1.0.17<br>b7df2000-b7df4000 rw-p 00055000 08:02 1237590&nbsp;&nbsp;&nbsp; /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&nbsp;&nbsp;&nbsp;&nbsp; /lib/<a href="http://libdl-2.6.1.so">libdl-2.6.1.so</a><br>b7dfa000-b7dfc000 rw-p 00001000 08:02 455187&nbsp;&nbsp;&nbsp;&nbsp; /lib/<a href="http://libdl-2.6.1.so">libdl-2.6.1.so</a><br>
b7dfc000-b7edf000 r-xp 00000000 08:02 510606&nbsp;&nbsp;&nbsp;&nbsp; /usr/lib/libstdc++.so.6.0.9<br>b7edf000-b7ee2000 r--p 000e2000 08:02 510606&nbsp;&nbsp;&nbsp;&nbsp; /usr/lib/libstdc++.so.6.0.9<br>b7ee2000-b7ee4000 rw-p 000e5000 08:02 510606&nbsp;&nbsp;&nbsp;&nbsp; /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&nbsp;&nbsp;&nbsp;&nbsp; /usr/lib/libasound.so.2.0.0<br>b7fa1000-b7fa2000 r--p 000b6000 08:02 509387&nbsp;&nbsp;&nbsp;&nbsp; /usr/lib/libasound.so.2.0.0<br>b7fa2000-b7fa6000 rw-p 000b7000 08:02 509387&nbsp;&nbsp;&nbsp;&nbsp; /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&nbsp;&nbsp;&nbsp;&nbsp; /lib/<a href="http://ld-2.6.1.so">ld-2.6.1.so</a><br>b7fe6000-b7fe8000 rw-p 0001a000 08:02 455174&nbsp;&nbsp;&nbsp;&nbsp; /lib/<a href="http://ld-2.6.1.so">ld-2.6.1.so</a><br>
bfcf2000-bfd07000 rw-p bfcf2000 00:00 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [stack]<br>ffffe000-fffff000 r-xp 00000000 00:00 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [vdso]<br>Abortado<br><br><br>I think there is not a NullPointerException in the logic of the<br>chuck code, maybe I&#39;m wrong, but the error menssages 2) and 3) are not<br>
only chuck-code-logic-problems. I can&#39;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>&nbsp;&nbsp; &nbsp;int afinacion;<br>&nbsp;&nbsp; &nbsp;0 =&gt; int GRAVE;<br>&nbsp;&nbsp; &nbsp;1 =&gt; int MEDIO;<br>&nbsp;&nbsp; &nbsp;2 =&gt; int AGUDO;<br><br>&nbsp;&nbsp; &nbsp;float bfreq;<br><br>&nbsp;&nbsp; &nbsp;constructor();<br>&nbsp;&nbsp; &nbsp;fun void constructor() {<br>
//***********************************************************************<br>// setNComponentes &lt; 5<br>//&nbsp;&nbsp; [chuck](VM): NullPointerException: shred[id=3:<a href="http://grancassa.ck">grancassa.ck</a>], PC=[13]<br>// setNComponentes = 5<br>
//&nbsp;&nbsp; segfault<br>// setNComponentes &gt; 5<br>//&nbsp;&nbsp; [chuck](VM): NullPointerException: shred[id=3:<a href="http://grancassa.ck">grancassa.ck</a>], PC=[13]<br>//&nbsp;&nbsp; *** glibc detected *** chuck-alsa: double free or corruption (!prev): 0x083ae308 ***<br>
//************************************************************************<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;setNComponentes( 5 );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;setResonancia( 10::second, 4.0 );<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;setAfinacion( GRAVE );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;setGanancias( 0 );<br>
&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun float tocar( float n ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;setTAtaque( 2::second, 0 );<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;n =&gt; g.gain;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;noteOn();<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun float apagar( float n ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( n &gt; 0.5 ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;setTApagado( 0.25::second, -2 );<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;setTApagado( 0.5::second, 2 );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;noteOff();<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void setAfinacion( int a ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;a =&gt; afinacion;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;setFrecuencias();<br>
&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void setFrecuencias() {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( afinacion == GRAVE )<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;40.0 =&gt; bfreq;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else if( afinacion == MEDIO )<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;80.0 =&gt; bfreq;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else // afinacion == AGUADO<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;120.0 =&gt; bfreq;<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i; i &lt; ncomp; i++ ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;bfreq + bfreq * 0.5 * i +<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;( Std.rand2f( -2.5, 2.5 ) ) =&gt; s[i].freq;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void setGanancias( int material ) {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i; i &lt; ncomp; i++ ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;1.0 / (i + 1.0) =&gt; gain[i].gain;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br>}<br><br>// Test<br><br>GranCassa gc;<br>&lt;&lt;&lt; &quot;np&quot; &gt;&gt;&gt;;<br><br>gc.connectTo( dac );<br>
<br>while( true ) {<br>&nbsp;&nbsp; &nbsp;gc.tocar( 0.5 );<br>&nbsp;&nbsp; &nbsp;5::second =&gt; now;<br>&nbsp;&nbsp; &nbsp;gc.apagar( 0.7 );<br>&nbsp;&nbsp; &nbsp;2::second =&gt; 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>&nbsp;&nbsp; &nbsp;12 =&gt; int MAX_COMP;<br>&nbsp;&nbsp; &nbsp;int ncomp;<br>&nbsp;&nbsp; &nbsp;SinOsc @ s[MAX_COMP];<br>
&nbsp;&nbsp; &nbsp;CADSR @ env[MAX_COMP];<br>&nbsp;&nbsp; &nbsp;Gain @ gain[MAX_COMP];<br>&nbsp;&nbsp; &nbsp;Gain g;<br><br>&nbsp;&nbsp; &nbsp;fun void connectTo( UGen ug ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;g =&gt; ug;<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun float setGain( float g_ ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;g_ =&gt; g.gain;<br>
&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun float getGain() {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return g.gain();<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void setNComponentes( int n ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( n &lt;= MAX_COMP &amp;&amp; n &gt;= 1 ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;n =&gt; ncomp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;&lt;&lt; &quot;(PercAditiva): Cantidad de componenetes no soportada&quot; &gt;&gt;&gt;;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;&lt;&lt; &quot;(PercAditiva): ncomp = 6&quot; &gt;&gt;&gt;;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;6 =&gt; ncomp;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i; i &lt; ncomp; i++ ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SinOsc saux @=&gt; s[i];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;CADSR caux @=&gt; env[i];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Gain gaux @=&gt; gain[i];<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;env[i].connectFrom( s[i] );<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;env[i].connectTo( gain[i] );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//s[i] =&gt; env[i].g =&gt; gain[i];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;gain[i] =&gt; g;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void noteOn() {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i; i &lt; ncomp; i++ ) {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;env[i].keyOn();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void noteOff() {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i; i &lt; ncomp; i++ ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;env[i].keyOff();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void setTAtaque( dur dt, float factor ) {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i; i &lt; ncomp; i++ ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;env[i].setAttack( dt, factor );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void setTApagado( dur dt, float factor ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i; i &lt; ncomp; i++ ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;env[i].setRelease( dt, factor );<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void setResonancia( dur dt, float factor ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i; i &lt; ncomp; i++ ) {<br>//*********************************************************<br>// Commenting the next line, no problem arise (¿?¿?¿?¿?)<br>
//*********************************************************<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;env[i].setDecay( dt, float factor );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;env[i].setSustain( 0.0 );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<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>&nbsp;&nbsp; &nbsp;CurveTable attack;<br>&nbsp;&nbsp; &nbsp;CurveTable decay;<br>&nbsp;&nbsp; &nbsp;CurveTable release;<br>&nbsp;&nbsp; &nbsp;Gain g;<br><br>
&nbsp;&nbsp; &nbsp;dur atime;<br>&nbsp;&nbsp; &nbsp;dur dtime;<br>&nbsp;&nbsp; &nbsp;dur rtime;<br><br>&nbsp;&nbsp; &nbsp;float acurve;<br>&nbsp;&nbsp; &nbsp;float dcurve;<br>&nbsp;&nbsp; &nbsp;float rcurve;<br><br>&nbsp;&nbsp; &nbsp;float slevel;<br>&nbsp;&nbsp; &nbsp;float clevel; // current level<br><br>&nbsp;&nbsp; &nbsp;float rate;<br>&nbsp;&nbsp; &nbsp;float step;<br>
<br>&nbsp;&nbsp; &nbsp;int state;<br>&nbsp;&nbsp; &nbsp;0 =&gt; int ATTACK;<br>&nbsp;&nbsp; &nbsp;1 =&gt; int DECAY;<br>&nbsp;&nbsp; &nbsp;2 =&gt; int SUSTAIN;<br>&nbsp;&nbsp; &nbsp;3 =&gt; int RELEASE;<br>&nbsp;&nbsp; &nbsp;4 =&gt; int DONE;<br><br>&nbsp;&nbsp; &nbsp;constructor();<br><br>&nbsp;&nbsp; &nbsp;fun void constructor() {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;setAttack( 0.5::second, 0.0 );<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;setDecay( 0.5::second, 0.0 );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;setSustain( 0.5 );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;setRelease( 0.5::second, 0.0 );<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;0.0 =&gt; g.gain;<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void connectTo( UGen ug ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;g =&gt; ug;<br>
&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void connectFrom( UGen ug ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ug =&gt; g;<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void setAttack( dur t, float curve ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t =&gt; atime;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;curve =&gt; acurve;<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void setDecay( dur t, float curve ) {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t =&gt; dtime;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;curve =&gt; dcurve;<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void setSustain( float level ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;level =&gt; slevel;<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void setRelease( dur t, float curve ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t =&gt; rtime;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;curve =&gt; rcurve;<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void keyOn() {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// Si se ataca continua sin apagar, se mantienen los shreds<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// VERIFICAR<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;spork ~ computeSamples();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;me.yield(); // para darle oportunidad que corra el shred (?)<br>
&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void keyOff() {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( state == DONE | state == RELEASE ) return;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;RELEASE =&gt; state;<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;fun void computeSamples() {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( state == ATTACK ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// Las CurveTable se inicializan acá porque si no, hay<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// problemas con la inicialización y los índices.<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;[ 0.0, 0.0, acurve, 1.0, 1.0 ] =&gt; attack.coefs;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;0.0 =&gt; clevel;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;0.0 =&gt; step;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;1.0 / ( atime / samp ) =&gt; rate;<br>
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;while( state == ATTACK ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;attack.lookup( step ) =&gt; g.gain =&gt; clevel;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;rate +=&gt; step;<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// La comparación debe ir antes de que se realize el<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// cómputo (pase el tiempo) por la concurrencia<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// de state con respecto a RELEASE. !!!<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( step &gt;= 1.0 ) DECAY =&gt; state;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;1::samp =&gt; now;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( state == DECAY ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;[ 0.0, clevel, dcurve, 1.0, slevel ] =&gt; decay.coefs;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;0.0 =&gt; step;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;1.0 / ( dtime / samp ) =&gt; rate;<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;while( state == DECAY ) {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;decay.lookup( step ) =&gt; g.gain =&gt; clevel;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;rate +=&gt; step;<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( step &gt;= 1.0 ) SUSTAIN =&gt; state;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;1::samp =&gt; now;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// Este no if está demás por el paso del tiempo en el shred<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( state == SUSTAIN ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;while( state == SUSTAIN ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// clevel ~= slevel<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;clevel =&gt; g.gain;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;1::samp =&gt; now;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( state == RELEASE ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;[ 0.0, clevel, rcurve, 1.0, 0.0 ] =&gt; release.coefs;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;0.0 =&gt; step;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;1.0 / ( rtime / samp ) =&gt; rate;<br>
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;while( state == RELEASE ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;release.lookup( step ) =&gt; g.gain =&gt; clevel;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;rate +=&gt; step;<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( step &gt;= 1.0 ) DONE =&gt; state;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;1::samp =&gt; now;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// Este if está demás (?)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( state == DONE ) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// por si las dudas<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;0.0 =&gt; g.gain;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;1::samp =&gt; now;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br>
}<br>// End of CADSR.ck<br><br><br>Thanks<br>Lucas<br><br>