[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [sc-users] Allocating new Buffers in a Score
Sorry, that code should read:
(
var server = Server(\nrt,
options: ServerOptions.new
.numOutputBusChannels_(2)
.numInputBusChannels_(2)
);
~chebs = Array.fill(20, {Array.fill(8, {1.0.rand})});
~bufs = Array.fill(20, { Buffer(server) });
a = Score([
[0.0, ['/d_recv',
SynthDef(\NRTsine, { |out, freq = 440|
Out.ar(out, SinOsc.ar(freq, 0, 0.2).dup)
}).asBytes]]]);
~bufs.do { |buf, i|
buf.postln;
a.add([
0.1,
buf.allocMsg(completionMessage: {
buf.chebyMsg([0, 1, 1, 1, 0, 1])
})])}
)
On Sat, May 22, 2021 at 11:34 PM geoff baltan <geoffbaltan@xxxxxxxxx> wrote:
>
> Oh, this is extremely helpful - thank you. I definitely missed some of
> the distinctions between RT and NRT here.
>
> I am noticing with both of the possible solutions you gave, though, I
> am drawing an 'asInteger' not understood" error and I have absolutely
> no idea why. Full code and full error message reprinted below..
>
>
>
> ///code
> (
> var server = Server(\nrt,
> options: ServerOptions.new
> .numOutputBusChannels_(2)
> .numInputBusChannels_(2)
> );
> ~chebs = Array.fill(20, {Array.fill(8, {1.0.rand})});
> ~bufs = Array.fill(20, { Buffer(server) });
> a = Score([
> [0.0, ['/d_recv',
> SynthDef(\NRTsine, { |out, freq = 440|
> Out.ar(out, SinOsc.ar(freq, 0, 0.2).dup)
> }).asBytes]],
> ~bufs.do { |buf, i|
> n.add([
> 0.1,
> buf.allocMsg(completionMessage: {
> buf.chebyMsg(~chebs[i])
> })])}]);
> )
>
> //////error message
>
> nrt : setting clientID to 0.
> ERROR: Message 'asInteger' not understood.
> RECEIVER:
> nil
> ARGS:
> CALL STACK:
> DoesNotUnderstandError:reportError
> arg this = <instance of DoesNotUnderstandError>
> Nil:handleError
> arg this = nil
> arg error = <instance of DoesNotUnderstandError>
> Thread:handleError
> arg this = <instance of Thread>
> arg error = <instance of DoesNotUnderstandError>
> Object:throw
> arg this = <instance of DoesNotUnderstandError>
> Object:doesNotUnderstand
> arg this = nil
> arg selector = 'asInteger'
> arg args = [*0]
> Buffer:allocMsg
> arg this = <instance of Buffer>
> arg completionMessage = <instance of Function>
> < closed FunctionDef >
> arg buf = <instance of Buffer>
> arg i = 0
> ArrayedCollection:do
> arg this = [*20]
> arg function = <instance of Function>
> var i = 0
> < closed FunctionDef >
> var server = <instance of Server>
> Interpreter:interpretPrintCmdLine
> arg this = <instance of Interpreter>
> var res = nil
> var func = <instance of Function>
> var code = "(
> var server = Server(\nrt,
> ..."
> var doc = nil
> var ideClass = <instance of Meta_ScIDE>
> Process:interpretPrintCmdLine
> arg this = <instance of Main>
> ^^ The preceding error dump is for ERROR: Message 'asInteger' not understood.
> RECEIVER: nil
>
> On Sat, May 22, 2021 at 10:11 PM <jamshark70@xxxxxxxxx> wrote:
> >
> > On Sat, May 22, 2021 at 1:59 PM <geoffbaltan@xxxxxxxxx> wrote:
> > > I'm currently trying to create bunch of Chebyshev-filled buffers for
> > > use in a Score. I've established the values elsewhere as an
> > > environmental variable and I'm using the following to load up the
> > > buffers and add them in the Score:
> > > n.add([0.1, [\b_alloc, ~bufs = Array.fill(20, {|i| Buffer.alloc(s,
> > > 1024, 1, { |buf| buf.chebyMsg(~chebs[i])})})]]);
> > >
> > > I'm suspicious that this is causing a problem, but I can't quite prove
> > > it (something about the multiple "allocs", maybe) . As for this
> > > question, I was simply hoping that someone could point out whether
> > > this is the right way of creating a bunch of buffers in a Score.
> >
> > [/b_alloc, [aBuffer, aBuffer, aBuffer, ...]] is not a valid OSC
> > message format ;)
> >
> > Couple of issues here:
> >
> > 1. The score should contain allocation *messages*, NOT buffer objects.
> >
> > Buffer.alloc sends the allocation message immediately to the given
> > server and does NOT return the message to you. So if you need to do
> > something NRTish like add messages to a score, `alloc` simply can't
> > work.
> >
> > Or, proceeding from analogy:
> >
> > Synths:
> > RT: Synth(\name, ...)
> > NRT: Synth.basicNew(\name).newMsg(...)
> >
> > Buffers:
> > RT: Buffer.alloc(...)
> > NRT: Buffer.new(s).allocMsg(completionMessage: { |buf| buf.chebyMsg(...) })
> >
> > 2. You would have to add the resulting allocMsg's one by one into the
> > score. You can't do [0, [[/b_alloc, ...], [/b_alloc, ...]...]].
> >
> > // note Buffer *new here, NOT alloc
> > ~bufs = Array.fill(20, { Buffer(my_nrt_server_instance) });
> >
> > ~bufs.do { |buf, i|
> > n.add([
> > 0.1,
> > buf.allocMsg(completionMessage: {
> > buf.chebyMsg(~chebs[i])
> > })
> > ])
> > };
> >
> > Or, if you want to do it in one loop:
> >
> > ~bufs = Array.fill(20, { |i|
> > var buf = Buffer(my_nrt_server_instance);
> > n.add([
> > 0.1,
> > buf.allocMsg(completionMessage: {
> > buf.chebyMsg(~chebs[i])
> > })
> > ]);
> > // array fill func should return the object
> > // if n.add is last, then the array would contain
> > // side effects but not the objects you're interested in
> > buf
> > });
> >
> > 3. The NRT guide suggests creating a NRT Server object so that the
> > score will have its own allocators (and then removing the instance
> > after building the score). Otherwise you're allocating buffer IDs etc.
> > from the real-time server instance.
> >
> > hjh
> >
> > _______________________________________________
> > sc-users mailing list
> >
> > info (subscription, etc.): http://www.birmingham.ac.uk/facilities/ea-studios/research/supercollider/mailinglist.aspx
> > archive: https://listarc.bham.ac.uk/marchives/sc-users/
> > search: https://listarc.bham.ac.uk/lists/sc-users/search/
_______________________________________________
sc-users mailing list
info (subscription, etc.): http://www.birmingham.ac.uk/facilities/ea-studios/research/supercollider/mailinglist.aspx
archive: https://listarc.bham.ac.uk/marchives/sc-users/
search: https://listarc.bham.ac.uk/lists/sc-users/search/