[CM] some CM sprout/process questions
Michael Klingbeil
michael@klingbeil.com
Sat, 28 Sep 2002 16:23:30 -0400
Interesting error. I don't have access to CMUCL on Linux, so I can't
really test this. I think this is an issue Rick Taube or others could
look into.
For the moment you could just redefine copy-object, replacing
allocate-instance with make-instance. I think the idea was that by
calling allocate-instance, object initialization is bypassed (thus
avoiding any possible side-effects), thus allowing the source object
to be directly "cloned."
But for the purposes of CM, this should be fine:
(defmethod copy-object ((object standard-object))
(let* ((class (class-of object))
(new (make-instance class)))
(fill-object new object)
new))
The other way is to just initialize all slots in the new maco
(setf foo (new i ins 1 time 1.45 duration 4.2))
I hope these suggestions are helpful.
>Greetings, Micheal. It seem that it's allocate-instance that's somehow
>undefined. The following is with CM 2.3.4, on Linux Cmucl:
>
>
>* (setf foo (new i))
>
>#e(i)
>* (setf bar (copy-object foo))
>
>
>No matching method for the generic-function #<Standard-Generic-Function
>ALLOCATE-INSTANCE (3)
> {281B4229}>,
>when called with arguments (#<STANDARD-CLASS I {282AB2AD}>).
>
>On Fri, 27 Sep
>2002, Michael Klingbeil
>wrote:
>
>> It sounds like each time you are calling 'sv' on your object 'o', you
>> are overwriting the old slot values. This is one of those examples
>> where the functional programmers will shout "side effects are bad!"
>> This isn't a problem if you are immediately sending events out the
>> midi-port, but if you are putting them into a seq or something like
>> that, then you need a new object for each event.
>>
>> Your idea of using copy-object is definitely on the right track and
>> in fact it should work. Copy-object should work for any kind of CLOS
>> object... I have used it for stuff not even CM related. What kind of
>> error are you getting when you attempt to use copy-object? What
>> version of CM do you have? Maybe there is an old bug?
>>
>> What I often do to avoid any of this is something like
>>
>> (output (new csound-event-subclass ...))
>>
>> just setting the slot values in each output statement. If this is
>> tedious, then copy-object should (ideally!) do the trick.
>>
>> You can avoid using defprocess entirely and just insert events into a list:
>>
>> (setf my-events
>> (list (new csound-event-subclass ...)
>> (new csound-event-subclass ...)
>> (new csound-event-subclass ...)
>> ...))
>>
>> (events my-events "mypiece.sco" 0 ...)
>>
>>
>>
>>
>>
>> >My goal is that I would to sprout a short (say three or four) sequence
>> >of csound score events.
>> >
>> >I thought that rather than hassle with patterns, it would be simpler and
>> >easier to read, if I can simply write a handfull of sv's and output's
>> >linearly, so to speak.
>> >
>> >For example,
>> >
>> >(defprocess note ()
>> > (let (o (new csound-event-subclass ...))
>> > process repeat 1 do
>> > (sv o ...)
>> > (output o)
>> > (sv o ...)
>> > (output o)
>> > (sv o ....)
>> > (output o)
>> > wait 4))))
>> >
>> >With this process I intend to define a conceptual "note" that is a short
>> >sequence of csound events (in this particular case, using a negative p3
>> >on all but the last event).
>> >
>> >In this situation, I want to create an object "o" in the let
>> >initialization and define the values of most of the slots. In the "sv"'s
>> >I will modify only one or two of the slots.
>> >
>> >I tried the above method both by setting the time slot in the "sv"
>> >functions, and by providing the optional start-time parameter to the
>> >"output" functions.
>> >
>> >The problem is that it seems that the "sv" calls happen all at once, so
>> >what happens is that the second and third outputs both get the final
>> >(third) values of the slots.
>> >
>> >I then tried using "copy-object" to use a seperate clone an instance of
>> >the prototype csound object before modifying it for each output, but for
> > >some reason the "copy-object" method ends up being undefined for my
>> >csound event subclass.
>> >
>> >Questions:
>> >
>> >1. Is there a better idiom for this type of thing? In particular, it
>> >seems awkward to have to define a process using "repeat 1" for this.
>> >
>> >2. What doesn't the default copy-object method work? Do I really need to
>> >define one for every csound subclass? I would think that copy-object by
>> >default would simply copy all the slots, but is this not the case?
>> >
>> >
>> >Regards
>> >
>> >Larry
>> >_______________________________________________
>> >Cmdist mailing list
>> >Cmdist@ccrma.stanford.edu
>> >http://ccrma-mail.stanford.edu/mailman/listinfo/cmdist
>>
>> _______________________________________________
>> Cmdist mailing list
>> Cmdist@ccrma.stanford.edu
>> http://ccrma-mail.stanford.edu/mailman/listinfo/cmdist
>>
>
>-- Larry Troxler -- lt@westnet.com -- Patterson, NY USA --