[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [sc-users] recording mouse gestures
Thanks very much Alberto. I didn't have any luck compiling the source
and may start a new thread about that. I'll try these files and folders
in the mean time. I did however manage to incorporate KtlLoop in to my
existing code using your examples and it's working very well.
One more question: is it possible for a KtlLoop object, that is
controlling a particular synth, to control another synth (from another
synthdef) or ndef with the same parameters? Or is it necessary to
duplicate?
Specifically in this project, I'd like to use the recorded data in the
KtlLoop objects to control not only spatializing synths, but a also
secondary and separate processes performing graphics (this graphic work
could perhaps be done from within the spatializing synths, but I'd like
to keep it separate).
Best,
Iain
Em Qua, 2015-12-30 às 15:06 +0100, alberto.decampo escreveu:
> Hi Iain,
>
> hm, it is actually several things that changed in the JITlib updates from 3.6.6 to 3.7,
> and a lot of other things got fixed for 3.7, so it is worth trying to compile it.
>
> In case this takes too long, or you run into trouble,
> you can try replacing files in SCCLassLibrary to get at least the JITlib updates:
>
> 1. just the entire TaskProxyGui file:
> https://github.com/supercollider/supercollider/tree/master/SCClassLibrary/JITLib/GUI/TaskProxyGui.sc
>
> 2. all JITLib Guis:
> https://github.com/supercollider/supercollider/tree/master/SCClassLibrary/JITLib/GUI
>
> 3. entire JITLib folder:
> https://github.com/supercollider/supercollider/tree/master/SCClassLibrary/JITLib
>
> best adc
>
> > On 29/12/2015, at 21:01 , Iain Mott <mott@xxxxxxxxxxxxxxx> wrote:
> >
> > It's 3.6.6, which is the most recent package for Ubuntu available here:
> > https://launchpad.net/~supercollider/+archive/ubuntu/ppa
> >
> > I'll try compiling the source, but if that gets too complicated, where
> > do I place that override? I tried now inserting it at the end
> > of /usr/share/SuperCollider/SCClassLibrary/JITLib/GUI/TaskProxyGui.sc.
> > When I restarted SC and ran the KtlLoopGui line, it gave a long list of
> > errors which I'll paste below.
> >
> > Thanks,
> >
> > Iain
> >
> > ERROR: Message 'key' not understood.
> > RECEIVER:
> > Instance of TaskProxy { (0x36ddce8, gc=AC, fmt=00, flg=00, set=04)
> > instance variables [9]
> > source : instance of Function (0x474afb8, size=2, set=2)
> > pattern : instance of Prout (0x3f5f778, size=1, set=2)
> > envir : instance of Event (0x148d788, size=5, set=3)
> > clock : nil
> > quant : nil
> > condition : true
> > reset : nil
> > player : nil
> > playQuant : nil
> > }
> > ARGS:
> > PATH: /home/iain/projects/ambisonics/sc/adc.sc
> > CALL STACK:
> > DoesNotUnderstandError:reportError 0x383eef8
> > arg this = <instance of DoesNotUnderstandError>
> > Nil:handleError 0x381ce38
> > arg this = nil
> > arg error = <instance of DoesNotUnderstandError>
> > Thread:handleError 0x3841f38
> > arg this = <instance of Thread>
> > arg error = <instance of DoesNotUnderstandError>
> > Object:throw 0x373fcd8
> > arg this = <instance of DoesNotUnderstandError>
> > Object:doesNotUnderstand 0x381e4e8
> > arg this = <instance of TaskProxy>
> > arg selector = 'key'
> > arg args = [*0]
> > TaskProxyGui:getState 0x381dca8
> > arg this = <instance of TdefGui>
> > TaskProxyGui:checkUpdate 0x381e018
> > arg this = <instance of TdefGui>
> > var newState = nil
> > var playState = nil
> > JITGui:object_ 0x381e178
> > arg this = <instance of TdefGui>
> > arg obj = <instance of TaskProxy>
> > TaskProxyGui:object_ 0x3847448
> > arg this = <instance of TdefGui>
> > arg obj = <instance of TaskProxy>
> > EventLoopGui:object_ 0x353e6b8
> > arg this = <instance of KtlLoopGui>
> > arg obj = <instance of KtlLoop>
> > < closed FunctionDef > (no arguments or variables)
> > Interpreter:interpretPrintCmdLine 0x120b748
> > arg this = <instance of Interpreter>
> > var res = nil
> > var func = <instance of Function>
> > var code = "KtlLoopGui(k, parent: w, bou..."
> > var doc = <instance of ScelDocument>
> > var ideClass = nil
> > Process:interpretPrintCmdLine 0x3a12448
> > arg this = <instance of Main>
> > ^^ The preceding error dump is for ERROR: Message 'key' not understood.
> > RECEIVER: a TaskProxy
> > ERROR: Message 'key' not understood.
> > RECEIVER:
> > Instance of TaskProxy { (0x36ddce8, gc=AC, fmt=00, flg=00, set=04)
> > instance variables [9]
> > source : instance of Function (0x474afb8, size=2, set=2)
> > pattern : instance of Prout (0x3f5f778, size=1, set=2)
> > envir : instance of Event (0x148d788, size=5, set=3)
> > clock : nil
> > quant : nil
> > condition : true
> > reset : nil
> > player : nil
> > playQuant : nil
> > }
> > ARGS:
> > PATH: /home/iain/projects/ambisonics/sc/adc.sc
> >
> > PROTECTED CALL STACK:
> > Meta_MethodError:new 0x2f4b580
> > arg this = DoesNotUnderstandError
> > arg what = nil
> > arg receiver = a TaskProxy
> > Meta_DoesNotUnderstandError:new 0x2f4d540
> > arg this = DoesNotUnderstandError
> > arg receiver = a TaskProxy
> > arg selector = key
> > arg args = [ ]
> > Object:doesNotUnderstand 0x10ad240
> > arg this = a TaskProxy
> > arg selector = key
> > arg args = nil
> > TaskProxyGui:getState 0x29c0080
> > arg this = a TdefGui
> > TaskProxyGui:checkUpdate 0x29c0a00
> > arg this = a TdefGui
> > var newState = nil
> > var playState = nil
> > EventLoopGui:checkUpdate 0x29f4300
> > arg this = a KtlLoopGui
> > var newState = ( 'object': KtlLoop('sp1'), 'scaler': 1, 'inverted': 0,
> > 'isReversed': 0,
> > 'looped': 0, 'shift': 0, 'name': sp1, 'numLists': 0, 'isRecording':
> > 0,
> > 'listIndex': 0, 'rescaled': 0 )
> > var playState = nil
> > KtlLoopGui:checkUpdate 0x29f8940
> > arg this = a KtlLoopGui
> > var newState = ( 'object': KtlLoop('sp1'), 'scaler': 1, 'inverted': 0,
> > 'isReversed': 0,
> > 'looped': 0, 'shift': 0, 'name': sp1, 'numLists': 0, 'isRecording':
> > 0,
> > 'listIndex': 0, 'rescaled': 0 )
> > a FunctionDef 0x28ceb80
> > sourceCode = "<an open Function>"
> > Routine:prStart 0x224ac00
> > arg this = a Routine
> > arg inval = 1451417746.0578
> >
> > CALL STACK:
> > DoesNotUnderstandError:reportError 0x37d7278
> > arg this = <instance of DoesNotUnderstandError>
> > < closed FunctionDef > 0x37d6c48
> > arg error = <instance of DoesNotUnderstandError>
> > Integer:forBy 0x7feafc042948
> > arg this = 0
> > arg endval = 2
> > arg stepval = 2
> > arg function = <instance of Function>
> > var i = 2
> > var j = 1
> > SequenceableCollection:pairsDo 0x3813628
> > arg this = [*4]
> > arg function = <instance of Function>
> > Scheduler:seconds_ 0x3810c18
> > arg this = <instance of Scheduler>
> > arg newSeconds = 1451417746.5586
> > Meta_AppClock:tick 0x3812218
> > arg this = <instance of Meta_AppClock>
> > var saveClock = <instance of Meta_SystemClock>
> > Process:tick 0x38130a8
> > arg this = <instance of Main>
> > ^^ The preceding error dump is for ERROR: Message 'key' not understood.
> > RECEIVER: a TaskProxy
> >
> >
> >
> >
> >
> >
> >
> >
> > Em Ter, 2015-12-29 às 19:28 +0100, alberto.decampo escreveu:
> >>> On 29/12/2015, at 18:58 , Iain Mott <mott@xxxxxxxxxxxxxxx> wrote:
> >>>
> >>> Many thanks for your help Alberto. I'm testing these examples now. One
> >>> thing I notice, when I run:
> >>>
> >>> KtlLoopGui(k, parent: w, bounds: 310@180).skipjack.dt_(0.05);
> >>>
> >>> in the code for the "KtlLoop.help" window, it results in the following
> >>> warning:
> >>>
> >>> WARNING: TdefGui : object a TaskProxy not accepted!
> >>> a SkipJack
> >>
> >> I fixed this a while ago in current SC.
> >> which version of SC are you using?
> >> best is a current 3.7 alpha build.
> >> If you need to stick to an earlier version (3.6.6?),
> >> you can overwrite the “accepts" method of TaskProxyGui with this one:
> >>
> >> + TaskProxyGui {
> >> accepts { |obj| ^obj.isNil or: { obj.isKindOf(PatternProxy) } }
> >> }
> >>
> >> hth, best adc
> >>
> >>> Much the same thing happens when I run "e = KtlLoopGui(k, bounds:
> >>> 250@180);" in the KtlLoopGui help file.
> >>>
> >>>
> >>> Is there another Quark that i need to install? I installed
> >>> JITLibExtensions and JITMIDIKtl.
> >>>
> >>>
> >>> Iain
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>> Em Ter, 2015-12-29 às 14:15 +0100, alberto.decampo escreveu:
> >>>> // and here an example with 8 synths ktlloops and guis:
> >>>>
> >>>> (
> >>>> s.scope(8);
> >>>>
> >>>> SynthDef(\spat, { |out, amp = 0.2, dens = 300, freq = 600, rq = 0.01, azim = 0, dist = 1|
> >>>> var snd = Ringz.ar(Dust2.ar(300), freq, 0.01) * amp;
> >>>> var ring = PanAz.ar(8, snd, azim);
> >>>> var panned = (snd * (1/8)).blend(ring, dist);
> >>>> Out.ar(out, panned);
> >>>> }).add;
> >>>>
> >>>> // make an 8 8chan pannable synths
> >>>> ~spats = 8.collect {
> >>>> Synth(\spat, [
> >>>> \freq, exprand(300, 3000), \dens, exprand(50, 500),
> >>>> \azim, 2.0.rand;
> >>>> ]);
> >>>> };
> >>>>
> >>>> // make 8 ktlloops for them
> >>>> ~ktlps = ~spats.collect { |sp, i|
> >>>> var ktlname = ("sp" ++ i).asSymbol;
> >>>> var ktloop = KtlLoop(ktlname, { |ev| sp.set(\azim, ev.azim, \dist, ev.dist) });
> >>>> ktloop.object = sp;
> >>>> };
> >>>>
> >>>> ~wins = ~ktlps.collect { |kl, i|
> >>>> var w, sl2d;
> >>>> w = Window("KtlLoop.help", Rect(320 * (i % 4), 380 * (i div: 4), 320, 380).postln).front;
> >>>> w.view.addFlowLayout;
> >>>> sl2d = Slider2D(w, Rect(5,5,190,190))
> >>>> .action_({ |sl|
> >>>> var polar = Polar(sl.x * 2 - 1, sl.y * 2 - 1);
> >>>> var azim = polar.angle / pi; // scale to 0, 2
> >>>> var dist = polar.magnitude;
> >>>>
> >>>> var event = (azim: azim, dist: dist);
> >>>> // store it,
> >>>> kl.recordEvent(event.put(\type, \set));
> >>>> // and set the object from it
> >>>> kl.object.set(\azim, azim, \dist, dist);
> >>>> });
> >>>>
> >>>> // make an eventloopgui for KtlLoop
> >>>> KtlLoopGui(kl, parent: w, bounds: 310@180).skipjack.dt_(0.05);
> >>>> };
> >>>> )
> >>>>
> >>>>> On 29/12/2015, at 13:53 , alberto.decampo <alberto.decampo@xxxxxxxxx> wrote:
> >>>>>
> >>>>> Hi Ian,
> >>>>>
> >>>>>> On 29/12/2015, at 12:22 , Iain Mott <mott@xxxxxxxxxxxxxxx> wrote:
> >>>>>>
> >>>>>> A question about KtlLoop:
> >>>>>>
> >>>>>> in the sample code in the help file for KtlLoop, the sound to be
> >>>>>> controlled is defined within a node proxy definition (ndef).
> >>>>>
> >>>>> yes. should also work with plain synths, example below.
> >>>>> Ndefs are really convenient placeholders for single synths,
> >>>>> which are easy to control, modify, play, pause, stop,
> >>>>> they remember their settings etc. etc., so I tend to use them
> >>>>> rather than raw synths most of the time.
> >>>>>
> >>>>> Also, I just updated some things in the KtlLoop quarks, so please update.
> >>>>>
> >>>>>>
> >>>>>> The thing or things that I'm wishing to control are instances of a
> >>>>>> synthdef that perform 2D spatialisation. These receive their audio input
> >>>>>> via busses and perform ambisonic encoding and other steps in response to
> >>>>>> distance and azimuth data received via the "set" method. So it's the
> >>>>>> distance and azimuth data for each sound source that I wish to record
> >>>>>> and play back (rather than x and y coords from the mouse directly).
> >>>>>
> >>>>> what you want to control is freely definable, so distance and azimuth should also work.
> >>>>>
> >>>>> for rescaling movements in space, using x y and converting to azim/dist in the synth func
> >>>>> may actually work nicely :-)
> >>>>>
> >>>>>>
> >>>>>> What I was thinking of doing was to create an array of KtlLoop objects
> >>>>>> for each of the instances synthdef. Something like this:
> >>>>>
> >>>>>
> >>>>>> number_of_sound_sources.do { arg i;
> >>>>>>
> >>>>>> k[i] = KtlLoop(2Dspatializerinstances[i]);
> >>>>>>
> >>>>>> };
> >>>>>>
> >>>>>>
> >>>>>> This however gives a "wrong type" error.
> >>>>>>
> >>>>>> Can synthdef instances be controlled by KtlLoop and if so how?
> >>>>>
> >>>>> yes, based on your question, something like this:
> >>>>>
> >>>>> SynthDef(\spat, { |out, amp = 0.2, dens = 300, freq = 600, rq = 0.01, azim = 0, dist = 1|
> >>>>> var snd = Ringz.ar(Dust2.ar(300), freq, 0.01) * amp;
> >>>>> var ring = PanAz.ar(8, snd, azim);
> >>>>> var panned = (snd * (1/8)).blend(ring, dist);
> >>>>> Out.ar(out, panned);
> >>>>> }).add;
> >>>>>
> >>>>> s.scope(8);
> >>>>>
> >>>>> // make an 8chan pannable sound
> >>>>> ~sp1 = Synth(\spat, [\freq, 600]);
> >>>>>
> >>>>> // move ~sp1 - azim goes from 0..2, because it uses PanAz
> >>>>> ~sp1.set(\azim, 0.5);
> >>>>> ~sp1.set(\azim, 1);
> >>>>>
> >>>>> ~sp1.set(\dist, 0); // in center of all 8
> >>>>> ~sp1.set(\dist, 0.5); // centered on chans 5, 6, but present in all
> >>>>> ~sp1.set(\dist, 1.0); // just on chans 5, 6
> >>>>>
> >>>>> // a KtlLoop for sp1
> >>>>> k = KtlLoop(\sp1, { |ev| ~sp1.set(\azim, ev.azim, \dist, ev.dist) });
> >>>>> k.object = ~sp1;
> >>>>> k.func.postcs;
> >>>>> (
> >>>>> w = Window("KtlLoop.help", Rect(0,500, 400, 550)).front;
> >>>>> w.view.addFlowLayout;
> >>>>> ~sl2d = Slider2D(w, Rect(0,0,190,190))
> >>>>> .action_({ |sl|
> >>>>> var polar = Polar(sl.x * 2 - 1, sl.y * 2 - 1);
> >>>>> var azim = polar.angle / pi; // scale to 0, 2
> >>>>> var dist = polar.magnitude;
> >>>>>
> >>>>> var event = (azim: azim, dist: dist);
> >>>>> // store it,
> >>>>> k.recordEvent(event.put(\type, \set));
> >>>>> // and set the object from it
> >>>>> k.object.set(\azim, azim, \dist, dist);
> >>>>> });
> >>>>>
> >>>>> // make an eventloopgui for KtlLoop
> >>>>> KtlLoopGui(k, parent: w, bounds: 310@180).skipjack.dt_(0.05);
> >>>>> )
> >>>>> // a second synth would be
> >>>>> ~sp2 = Synth(\spat, [\freq, 800, \dens, 200]);
> >>>>>
> >>>>> // or make an array of synths
> >>>>> ~spats = 8.collect { Synth(\spat, [\freq, exrand(300, 3000), \dens, 200]); };
> >>>>>
> >>>>> …
> >>>>> but that will need a lot more admin by hand that Ndefs can take care of very easily.
> >>>>>
> >>>>>> I did try entering the name of the synthdef itself as an argument to
> >>>>>> KtlLoop and this produced no error, but I didn't go any further with
> >>>>>> this. Not understanding ndef, I also tried redefining a synthdef
> >>>>>> instance within an ndef - this produced a string of errors.
> >>>>>
> >>>>> Try going thru the Ndef helpfile, it has lots of examples :-)
> >>>>>
> >>>>> best adc
> >>>>
> >>>>
> >>>> _______________________________________________
> >>>> 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/
> >>
> >>
> >> _______________________________________________
> >> 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/
>
>
> _______________________________________________
> 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/