Discussion:
Buffer.alloc != LocalBuf.clear
Rohan Drape
2014-10-10 08:27:03 UTC
Permalink
dear list

looking into 0220 from the excellent post at
http://www.fredrikolofsson.com/f0blog/?q=node/617 it seems that the
Buffer.alloc in:

a=SinOsc;play{RecordBuf.ar(c=InFeedback.ar,b=Buffer.alloc(s,9e4));HPF.ar(a.ar(99,c*6)/9+TGrains.ar(2,a
ar:3,b,c+3,2,12),9)}// #SuperCollider

cannot replaced with LocalBuf.clear, ie:

a=SinOsc;play{RecordBuf.ar(c=InFeedback.ar,b=LocalBuf(9e4).clear);HPF.ar(a.ar(99,c*6)/9+TGrains.ar(2,a
ar:3,b,c+3,2,12),9)}

doesn't work.

what else needs to be done here?

(leaving out the .clear doesn't help...)

thanks,
rohan

_______________________________________________
sc-users mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-users/
search: http://www.listarc.bham.ac.uk/lists/sc-users/search/
Hanns Holger Rutz
2014-10-10 09:13:20 UTC
Permalink
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I think you get different UGen graphs, because `Buffer:asUGenInput`
produces a constant, whereas `LocalBuf` remains a UGen. So if you use
`b` repeatedly, it doesn't introduce vertices in the graph, whereas
`LocalBuf` _does_, so probably it changes the order of `RecordBuf`
versus `HPF`.

I tried to get the graphs similar:

a = SynthDef("a", {
b=Buffer.alloc(s,9e4);
c=InFeedback.ar;
g=TGrains.ar(2,SinOsc.ar(3),b,c+3,2,12);
h=HPF.ar(SinOsc.ar(99,c*6)/9+g,9);
r=RecordBuf.ar(c,b);
Out.ar(0, h);
});

c = SynthDef("b", {
c=InFeedback.ar;
d=c+3;
e=c*6;
f=SinOsc.ar(99,e);
i=f/9;
b=LocalBuf(9e4);
r=RecordBuf.ar(c,b);
g=TGrains.ar(2,SinOsc.ar(3),b,d,2,12);
h=HPF.ar(i+g,9);
Out.ar(0, h)
});

a.dumpUGens;
c.dumpUGens;


[ 0_InFeedback, audio, [ 0 ] ]
[ 1_+, audio, [ 0_InFeedback[0], 3 ] ]
[ 2_*, audio, [ 0_InFeedback[0], 6 ] ]
[ 3_SinOsc, audio, [ 99, 2_* ] ]
[ 4_/, audio, [ 3_SinOsc, 9 ] ]
[ 5_RecordBuf, audio, [ 28, 0, 1, 0, 1, 1, 1, 0, 0_InFeedback[0] ] ]
[ 6_SinOsc, audio, [ 3, 0 ] ]
[ 7_TGrains, audio, [ 6_SinOsc, 28, 1_+, 2, 12, 0, 0.1, 4 ] ]
[ 8_+, audio, [ 4_/, 7_TGrains[0] ] ]
[ 9_HPF, audio, [ 8_+, 9 ] ]
[ 10_+, audio, [ 4_/, 7_TGrains[1] ] ]
[ 11_HPF, audio, [ 10_+, 9 ] ]
[ 12_Out, audio, [ 0, 9_HPF, 11_HPF ] ]

versus

[ 0_InFeedback, audio, [ 0 ] ]
[ 1_+, audio, [ 0_InFeedback[0], 3 ] ]
[ 2_*, audio, [ 0_InFeedback[0], 6 ] ]
[ 3_SinOsc, audio, [ 99, 2_* ] ]
[ 4_/, audio, [ 3_SinOsc, 9 ] ]
[ 5_MaxLocalBufs, scalar, [ 1 ] ]
[ 6_LocalBuf, scalar, [ 1, 90000, 5_MaxLocalBufs ] ]
[ 7_RecordBuf, audio, [ 6_LocalBuf, 0, 1, 0, 1, 1, 1, 0,
0_InFeedback[0] ] ]
[ 8_SinOsc, audio, [ 3, 0 ] ]
[ 9_TGrains, audio, [ 8_SinOsc, 6_LocalBuf, 1_+, 2, 12, 0, 0.1, 4 ] ]
[ 10_+, audio, [ 4_/, 9_TGrains[0] ] ]
[ 11_HPF, audio, [ 10_+, 9 ] ]
[ 12_+, audio, [ 4_/, 9_TGrains[1] ] ]
[ 13_HPF, audio, [ 12_+, 9 ] ]
[ 14_Out, audio, [ 0, 11_HPF, 13_HPF ] ]

So now they are virtually identical. Still the version with `LocalBuf`
doesn't work. So I'm giving up here trying to understand the difference...

Best, .h.h.
Post by Rohan Drape
dear list
looking into 0220 from the excellent post at
http://www.fredrikolofsson.com/f0blog/?q=node/617 it seems that
a=SinOsc;play{RecordBuf.ar(c=InFeedback.ar,b=Buffer.alloc(s,9e4));HPF.ar(a.ar(99,c*6)/9+TGrains.ar(2,a
ar:3,b,c+3,2,12),9)}// #SuperCollider
Post by Rohan Drape
a=SinOsc;play{RecordBuf.ar(c=InFeedback.ar,b=LocalBuf(9e4).clear);HPF.ar(a.ar(99,c*6)/9+TGrains.ar(2,a
ar:3,b,c+3,2,12),9)}
Post by Rohan Drape
doesn't work.
what else needs to be done here?
(leaving out the .clear doesn't help...)
thanks, rohan
_______________________________________________ sc-users mailing
list
http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
http://www.listarc.bham.ac.uk/lists/sc-users/search/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQIcBAEBAgAGBQJUN6MsAAoJEKZFmaPaYk6Q0REP+wTn+DIK6lkb0mFESwzz7zX1
IcXRN9HtKPuV/TSmdKmxGZtQKWViSJpnbjdcMQOM2Q2oPSo6rv0kaedSssjby8yn
CZnsnB3nFf/WPgDQJE3TJE8mMnL2FLcPP6B6Fo83wWcpvqd6Mfo4ZMyf9u8/AezE
6oypRuLDr+DnbJb3SP42uqtZt8eYqULKw8OB9w7HElJ3FNkXT89OgQxBG/aaK6Iz
9CHDS91y3tCxsAbwAj307/AjlXEOrdJBDydeDaRcUaT4EJU9h6GHtmpcIX4MX30a
ApPXAKtpruj+0DWhxgaVN6w3XtAvfVB0POxPPpaWgPnK0DucFk2+pku5x1kZ0Eq7
PfYNA/n40mE40Ct6txo4F91NItez6qvk+qXQTVuutbqBZnL5NymAatpczq0lD5tG
Lu8d8IEcexuWDC2q0EZuHsR7rv5fLTkd1vD4FYYG6+xJJfjOTu3Fl4qo/4jhWPtz
dcgJn2hDYNr04towpjgibfnPdzziHdcegBoX2n4F2z8exNkHeZrTPg5w2k5H7xgt
CGJ0njBQfxM97kjHY7heWB1eDAaijJXr1B7oenPnEwadw0Xhp/9z/rWu1hOQFNEd
rRB2NLcy4pc58y7u1bwAhjD9sESbqbAOeNwqz3T9hVs8UQUcR3hv2TZM0wN3nJ4X
94nsfn0n/QM1NvqlyPXB
=RIa2
-----END PGP SIGNATURE-----

_______________________________________________
sc-users mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-users/
search: http://www.listarc.bham.ac.uk/lists/sc-users/search/
Hanns Holger Rutz
2014-10-10 09:31:57 UTC
Permalink
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

There must be a bug in TGrains. When using LocalBuf its output is
always zero!

///////////////////// Buffer

val x = Buffer.alloc(s, 90000)
x.zero()

play {
val t = Impulse.ar(3)
val b="buf".kr(x.id)
val c=InFeedback.ar(0)
c.poll(t, "feed")
val g=TGrains.ar(2,SinOsc.ar(3),b,c+3,2,12)
(g \ 0).poll(t, "grain")
val h=HPF.ar(SinOsc.ar(99,c*6)/9+g,9)
(h \ 0).poll(t, "hpf")
val r=RecordBuf.ar(c,b)
r.poll(t, "rec")
Out.ar(0, h)
}

// --> observe that the grain output becomes non-zero

///////////////////// LocalBuf

play {
val t = Impulse.ar(3)
val b=LocalBuf(90000)
val c=InFeedback.ar(0)
c.poll(t, "feed")
val g=TGrains.ar(2,SinOsc.ar(3),b,c+3,2,12)
(g \ 0).poll(t, "grain")
val h=HPF.ar(SinOsc.ar(99,c*6)/9+g,9)
(h \ 0).poll(t, "hpf")
val r=RecordBuf.ar(c,b)
r.poll(t, "rec")
(r + g).poll(0)
Out.ar(0, h)
}

// --> observe that the grain output remains zero
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQIcBAEBAgAGBQJUN6eNAAoJEKZFmaPaYk6QBQ8QAIWcEsytH+HeJnVEwCyWYaYN
sYnZvfuNo+wgkwzK3YXvz2n93LqB1ncl1vvPQWAOiAZX4p0MliyNSy4oHqm55ENY
w8SxBzCE8xb1EGLSYyHL9Wr/PrO/L+IPYXy9Dx6uDjTA51zQZ8VYCwmj7aXBooAt
xxdCUGVkwfGHa48ouc2KoVCp0jWYFVKyOvplN5YZhDsmTIqphXVPNLlAAgFgLe9/
GKqT7+wGZ1C9s/8Ej/sjnCgFzfGbkjjybBlJZ9mIxoTUM4xkF70dVwfSOWIxHQkW
qCKnRlhRzFntoBr/2ZW+VQFWC0Q2kesdCTxjD66pzQS0tpGMbqLoZUO/HCpZKm1e
Sl9pgxxr+HE4Y0vVq+dhbjt8QAsaYLyIOrSKVBhV/f9PT3t0614chwklRDad0iqL
jQBnwnts5U1DHUObl9tpn+ii6/xzqfuGBSNrnIt2T5u2uV2QWUhYBffiy6msQrmo
qQ/8XR78VdPc+ap2lbLXPhnlhhtBkrrP0st3ahz9stkYJDPzV8hhecHSQONKY7a4
Csgm1NZhbeaqSKFGIcSY6a+p+woju56RW5zMxav+99yLH0glp7IDMI/swPKjQW5y
eFidNISY9OSCLmbMP6wLQoI32fnRS8kj8cK4IViRRXmhdZOOuCUW4Re4yCwk7tHa
wSriTm8KsLxaBm7lFxqD
=d4fo
-----END PGP SIGNATURE-----

_______________________________________________
sc-users mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-users/
search: http://www.listarc.bham.ac.uk/lists/sc-users/search/
Hanns Holger Rutz
2014-10-10 09:33:33 UTC
Permalink
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Yo, SuperCollider love. Five year old bug:

http://new-supercollider-mailing-lists-forums-use-these.2681727.n2.nabble.com/LocalBuf-in-Tgrains-problem-td3992047.html
Post by Hanns Holger Rutz
There must be a bug in TGrains. When using LocalBuf its output is
always zero!
///////////////////// Buffer
val x = Buffer.alloc(s, 90000) x.zero()
play { val t = Impulse.ar(3) val b="buf".kr(x.id) val
c=InFeedback.ar(0) c.poll(t, "feed") val
g=TGrains.ar(2,SinOsc.ar(3),b,c+3,2,12) (g \ 0).poll(t, "grain")
val h=HPF.ar(SinOsc.ar(99,c*6)/9+g,9) (h \ 0).poll(t, "hpf") val
r=RecordBuf.ar(c,b) r.poll(t, "rec") Out.ar(0, h) }
// --> observe that the grain output becomes non-zero
///////////////////// LocalBuf
play { val t = Impulse.ar(3) val b=LocalBuf(90000) val
c=InFeedback.ar(0) c.poll(t, "feed") val
g=TGrains.ar(2,SinOsc.ar(3),b,c+3,2,12) (g \ 0).poll(t, "grain")
val h=HPF.ar(SinOsc.ar(99,c*6)/9+g,9) (h \ 0).poll(t, "hpf") val
r=RecordBuf.ar(c,b) r.poll(t, "rec") (r + g).poll(0) Out.ar(0, h)
}
// --> observe that the grain output remains zero
_______________________________________________ sc-users mailing
list
http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
http://www.listarc.bham.ac.uk/lists/sc-users/search/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQIcBAEBAgAGBQJUN6ftAAoJEKZFmaPaYk6QHtkP/0zZoNUFbY3GBRQg0tF++Fh1
1drwuOFojLyuQFhDXbNWowVxRDLaKcQyAkNWwN22S63k5bZTOPA3cQKdLUsE48nY
Zo6JlBJKVitHW6XkmY9l0j03z5IgKdzZbqznBIvQOQbzWY9WpDqmf+FP9XM4LWjq
XTyCbhcVtIFeDJEY2ud1P8b6FE+p0T7wBbOR0Vc7H7n6vb01iiFhnNAXa045m18K
8l92LhC131K3pKINbOqI5Zg1+5Oj0sKEg82KYm8xQ8HLeMMTWsDBKd6+ageNnnZW
75NC3KpMUcrJ8wweQYc7KyTWPBtI7i1yyhwDYRwCYzQqC3JWpB21AzidUQp9IjKa
f+AXu2Po0cEkoB+B73yrNuS/5rirbzZiLF4m2YfIBbehyN9Hu4DgNmC+8V7U6EUZ
ZilrC5Xce/9NFSVH2TcPu2DwIXMNATxB7/6t0oinrkI1ZVStbqCNJaHQKeDmoH9v
aEqwW3iZntTwdI4H6+ldxthYDLfjuIkV6kz9kVuu02pGSgz9W20mSPnnQF4pCe3n
5A6xyQYtwt2ROxo9cNXNYekVFgKmlJilRQilDBUzI28TDcBZMgnfPjmfbWBLam5R
iEjZuP6IprElE6NMzW5rCzcpzEQjWKCyAeCwKlvEMBKwoQUFiyCqABaTAR+IlzCF
UWoUeb29Lz+fvnKnPgO4
=mT6x
-----END PGP SIGNATURE-----

_______________________________________________
sc-users mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-users/
search: http://www.listarc.bham.ac.uk/lists/sc-users/search/
Hanns Holger Rutz
2014-10-10 09:43:17 UTC
Permalink
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

not exactly the same ;)

play {
t = Impulse.ar(3);
b = LocalBuf(90000);
ClearBuf(b);
c = InFeedback.ar(0);
g = GrainBuf.ar(numChannels: 2, sndbuf: b, trigger: SinOsc.ar(3),
dur: 12, rate: c + 3, pos: 2, maxGrains: 2);
h = HPF.ar(SinOsc.ar(99,c*6)/9+g,9);
r = RecordBuf.ar(c,b);
Out.ar(0, h);
}

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQIcBAEBAgAGBQJUN6o1AAoJEKZFmaPaYk6QJgwP/0OvdEbEYYUlu6ZhcC+Go1zE
xUa0nR7ee140ffRaimQrlzvRodbWRaQ0SlcmAOMuY8jsQQ9KOFN0k/gSRxK1Wwor
BmO2+qcr3npgR7kc0N/lvU+BtPgBEqV+tUyqKnCaHCXcaKtemDrDxP0n05tOJuAi
iEhx+sTfWSH8N61TN0F9BOaTEs4OttXODb1g7KYaQlOItknWF8EJjk6yQbAxVcVh
qMsckAMX/OKD1wBvLvVI18uTz/5B5xfspPBIO8xxJYij0cPoRTqv80JwOhPwe4E+
K19m6P57CUawCwP0JtCEYUOkQ9Y5cHljF3H3hzJ2l6hj/HToASzSZn+lZHNaGG7o
3UUr6ruDUnqANPBdFnTL0v9zqNl3f3Fh3k1Qax3DFGyt3XM7YV3basqfV5Auqmrz
MFXZO6tA8GxXfNS79h7w7fzU78RLh/gz6nrTom984p8/NIJgUNSdgy4E/+7uhYPC
ccIUxfRDiIkHduB98Vxto+BQOTiepe8Ki8OkXWTGMs0i36o5C638/C555VQ5W3dt
bmaU9B8BEW9PhkLBxO+cPmLoYtRwqpaAGVbFscrTMVUEN325lkoVFFT2gRAbYBW2
+H1/MhdXhq5WnlSpHGg/xIO1Fqi0L/1UyGmkqKwlO6a+SxNImB0l0YnTC66bpESR
uO578YPrzPaA8+xXFDuz
=dtAs
-----END PGP SIGNATURE-----

_______________________________________________
sc-users mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-users/
search: http://www.listarc.bham.ac.uk/lists/sc-users/search/
r***@public.gmane.org
2014-10-11 03:42:49 UTC
Permalink
Post by Hanns Holger Rutz
There must be a bug in TGrains. When using LocalBuf its output is
always zero!
thanks, well spotted. i also suspected something more subtle...

below is a patch (ie. git diff) that gets this working here.

the buffer macros are rather opaque to me, someone who knows this well should look it over for mistakes.

best,
rohan

ps. i notice this diff also has the blocksize fix (https://github.com/supercollider/supercollider/issues/1180), perhaps that could get taken in as well?

diff --git a/server/plugins/DelayUGens.cpp b/server/plugins/DelayUGens.cpp
index 30caf5b..52cf3ca 100644
--- a/server/plugins/DelayUGens.cpp
+++ b/server/plugins/DelayUGens.cpp
@@ -498,7 +498,7 @@ void RadiansPerSample_Ctor(Unit *unit, int inNumSamples)
ZOUT0(0) = unit->mWorld->mFullRate.mRadiansPerSample;
}

-void Blocksize_Ctor(Unit *unit, int inNumSamples)
+void BlockSize_Ctor(Unit *unit, int inNumSamples)
{
ZOUT0(0) = unit->mWorld->mFullRate.mBufLength;
}
@@ -5983,13 +5983,24 @@ void GrainTap_Ctor(GrainTap *unit)


#define GRAIN_BUF \
- const SndBuf *buf = bufs + bufnum; \
- LOCK_SNDBUF_SHARED(buf); \
- const float *bufData __attribute__((__unused__)) = buf->data; \
- uint32 bufChannels __attribute__((__unused__)) = buf->channels; \
- uint32 bufSamples __attribute__((__unused__)) = buf->samples; \
- uint32 bufFrames = buf->frames; \
- int guardFrame __attribute__((__unused__)) = bufFrames - 2; \
+ const SndBuf *buf = NULL; \
+ if (bufnum >= world->mNumSndBufs) { \
+ int localBufNum = bufnum - numBufs; \
+ Graph *parent = unit->mParent; \
+ if(localBufNum <= parent->localBufNum) { \
+ buf = parent->mLocalSndBufs + localBufNum; \
+ } else { \
+ continue; \
+ } \
+ } else { \
+ buf = bufs + bufnum; \
+ } \
+ LOCK_SNDBUF_SHARED(buf); \
+ const float *bufData __attribute__((__unused__)) = buf->data; \
+ uint32 bufChannels __attribute__((__unused__)) = buf->channels; \
+ uint32 bufSamples __attribute__((__unused__)) = buf->samples; \
+ uint32 bufFrames = buf->frames; \
+ int guardFrame __attribute__((__unused__)) = bufFrames - 2; \


inline float IN_AT(Unit* unit, int index, int offset)
@@ -6157,7 +6168,7 @@ void TGrains_next(TGrains *unit, int inNumSamples)
// start a grain
if (unit->mNumActive+1 >= kMaxGrains) break;
uint32 bufnum = (uint32)IN_AT(unit, 1, i);
- if (bufnum >= numBufs) continue;
+
GRAIN_BUF

if (bufChannels != 1) continue;
@@ -7735,7 +7746,7 @@ PluginLoad(Delay)
DefineInfoUnit(ControlDur);
DefineInfoUnit(SubsampleOffset);
DefineInfoUnit(RadiansPerSample);
- DefineInfoUnit(Blocksize);
+ DefineInfoUnit(BlockSize);
DefineInfoUnit(NumInputBuses);
DefineInfoUnit(NumOutputBuses);
DefineInfoUnit(NumAudioBuses);


_______________________________________________
sc-users mailing list

info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: http://www.listarc.bham.ac.uk/marchives/sc-users/
search: http://www.listarc.bham.ac.uk/lists/sc-users/search/

Loading...