[Csnd] Recursive UDOs?
Date | 2009-12-26 07:51 |
From | Graham Breed |
Subject | [Csnd] Recursive UDOs? |
After trying to get a fractal noise generator working, I'm now looking at the basic problem of a recursive UDO. Here's a simple example: sr = 44100 ksmps = 100 nchnls = 1 opcode Recursive, i, ii icurr, itar xin cigoto (icurr >= itar), end icurr Recursive icurr + 1, itar end: xout icurr endop instr 1 icps Recursive 1, 440 print icps a1 oscil 20000, icps, 1 out a1 endin That should run with the score for the "line" example. The recursion is only to count up to the target value supplied as the second argument. What actually happens is: instr 1: icps = 440.000 PERF ERROR in instr 1 (opcode Recursive): Recursive: not initialised icurr Recursive #i0 itar 0 note aborted B 0.000 .. 2.000 T 2.000 TT 2.000 M: 0.0 The recursion's clearly working because the correct value comes out. But then this error stops the performance. The documentation says "But it is possible to call the opcode from itself. This allows recursion of any depth that is limited only by available memory." http://www.csounds.com/manual/html/opcode.html It looks like recursion can only be of infinite depth. Otherwise, how can it be stopped without not initializing the opcode? I've also tried an k-rate UDO. In that case, I get no errors or warnings, and the orchestra cleanly segfaults. I'll guess that it's doing infinite recursion. I don't know if that's supposed to happen or not. The documentation helpfully says: "The opcode call is always executed both at initialization and performance time, even if there are no a- or k-rate arguments. If there are many user opcode calls that are known to have no effect at performance time in an instrument, then it may save some CPU time to jump over groups of such opcodes with kgoto. " That doesn't make sense. What's the point of jumping over the opcodes if they're always executed? Is a kgoto supposed to stop them being executed or not? I'm running Csound 5.10, which may not be the latest. (It would help if the website gave the current version number.) Is there a bug that's been fixed? Does anybody have a strategy for recursive UDOs? Graham Send bugs reports to this list. To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound" |
Date | 2009-12-26 09:58 |
From | Victor Lazzarini |
Subject | [Csnd] Re: Recursive UDOs? |
This example works fine as far as I know /* example opcode 3: recursive call */ opcode RecursiveLowpass, a, akkpp ain, ka1, ka2, idep, icnt xin ; read input parameters if (icnt >= idep) goto skip1 ; check if max depth reached ain RecursiveLowpass ain, ka1, ka2, idep, icnt + 1 skip1: aout Lowpass ain, ka1, ka2 ; call filter xout aout ; write output endop In your example, I guess the problem is that icps can only take a single value per instrument initialisation. What you want to do perhaps is to move the oscillator into the UDO and output the mixed signal. This example mixes signals: Victor On 26 Dec 2009, at 07:51, Graham Breed wrote:
|
Date | 2009-12-26 10:08 |
From | Graham Breed |
Subject | [Csnd] Re: Re: Recursive UDOs? |
Victor Lazzarini |