Re: [Csnd-dev] UDO problem in latest develop

Dave Seidel <[email protected]> Mon, 10 Nov 2025 12:06:32 -0500
Newsgroups gmane.comp.audio.csound.devel
Message-ID <CAMnrweDxg-5YKZsbr2DoJS+Sms5BnN_wf78dmDT0S1D58HOoWw@mail.gmail.com>
My piece actually contains 5 UDOs, all of which were written using the new
style, and none of them work. Hopefully there will be a testable fix soon
so I don't have to rewrite a substantial part of the code. :-)

On Mon, Nov 10, 2025 at 11:59 AM Dave Seidel <[email protected]> wrote:

> To confirm, the UDO works if defined and invoked using the old syntax.
>
> On Mon, Nov 10, 2025 at 11:55 AM Dave Seidel <[email protected]>
> wrote:
>
>> Thanks, Hlöðver.
>>
>> On Mon, Nov 10, 2025 at 11:52 AM Hlöðver Sigurðsson <[email protected]>
>> wrote:
>>
>>> I made a reproducible test here, it fails in instr 2, instr 1 works, so
>>> you have a workaround for now, by placing the arguments positionally
>>> "old-style" while I make a fix
>>>
>>> <CsoundSynthesizer>
>>> <CsOptions>
>>> -n -d
>>> </CsOptions>
>>> <CsInstruments>
>>> sr = 44100
>>> ksmps = 64
>>> nchnls = 2
>>> 0dbfs = 1
>>>
>>> giSine ftgen 0, 0, 4096, 10, 1
>>>
>>> opcode TestXout, aa, ikai
>>>   ifreq, koff, aamp, itbl xin
>>>   koff1 = koff
>>>   koff2 = 2 * koff
>>>
>>>   a1 poscil aamp, ifreq+koff1, itbl
>>>   a2 poscil aamp, ifreq+koff2, itbl
>>>   a3 poscil aamp, ifreq-koff1, itbl
>>>   a4 poscil aamp, ifreq-koff2, itbl
>>>
>>>   aL = a1 + a3
>>>   aR = a2 + a4
>>>
>>>   xout aL, aR
>>> endop
>>>
>>> instr 1
>>>   ifreq = 440
>>>   koff = 0.004
>>>   aenv linen 0.5, 0.01, p3, 0.01
>>>
>>>   ; This should work - unpacking the outputs
>>>   aL, aR TestXout ifreq, koff, aenv, giSine
>>>   out aL, aR
>>> endin
>>>
>>> instr 2
>>>   ifreq = 440
>>>   koff = 0.004
>>>   aenv linen 0.5, 0.01, p3, 0.01
>>>
>>>   ; This tests the regression - calling UDO with multiple outputs
>>> directly in out statement
>>>   out TestXout(ifreq, koff, aenv, giSine)
>>> endin
>>>
>>> </CsInstruments>
>>> <CsScore>
>>> i 1 0 0.1
>>> i 2 0 0.1
>>> </CsScore>
>>> </CsoundSynthesizer>
>>>
>>> On Mon, 10 Nov 2025 at 18:51, Dave Seidel <[email protected]> wrote:
>>>
>>>> This is how it's being used in context:
>>>>
>>>> instr Drone
>>>>     idur = p3
>>>>     iamp = ampdb(p4) / 7
>>>>     ifreq = p5
>>>>
>>>>     icps = ifreq / 4
>>>>     icps2 = icps * 1.5
>>>>     icps3 = icps * 2
>>>>     prints("drones: %f, %f, %f\n", icps, icps2, icps3)
>>>>
>>>>     aenv = linen(iamp, 3, idur, 3)
>>>>
>>>>     a1L, a1R = RissetHarmOsc(icps,  0.004, aenv, giPrime)
>>>>     a2L, a2R = RissetHarmOsc(icps2, 0.005, aenv, giPrime)
>>>>     a3L, a3R = RissetHarmOsc(icps3, 0.006, aenv, giPrime)
>>>>     ga_drone_L +=  a1L+a2L+a3L
>>>>     ga_drone_R +=  a1R+a2R+a3R
>>>>
>>>>     printks("drone %f, %f\n", 2, ga_drone_L, ga_drone_R)
>>>> endin
>>>>
>>>>
>>>> On Mon, Nov 10, 2025 at 11:48 AM Dave Seidel <[email protected]>
>>>> wrote:
>>>>
>>>>> I'm not getting any error message at all.
>>>>>
>>>>> On Mon, Nov 10, 2025 at 11:45 AM Hlöðver Sigurðsson <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> this is the error you are seeing?
>>>>>>
>>>>>> > error: opcode 'RissetHarmOsc' for expression with arg types icai
>>>>>> returns out-args != 1, line 43
>>>>>>
>>>>>> On Mon, 10 Nov 2025 at 18:41, Hlöðver Sigurðsson <[email protected]>
>>>>>> wrote:
>>>>>>
>>>>>>> I'm taking a look at this now, I don't know if my changes had
>>>>>>> anything to do with it, not unlikely
>>>>>>>
>>>>>>> On Mon, 10 Nov 2025 at 18:39, Dave Seidel <[email protected]>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> The following UDO does not work with the latest develop sources.
>>>>>>>> The print statement shows that all four inputs argos are coming in at 0; If
>>>>>>>> I revert to the 7.0.0-beta.9 tag, it works fine.
>>>>>>>>
>>>>>>>> opcode RissetHarmOsc(freq:i,ofs:k,amp:a,tbl:i):(a,a)
>>>>>>>>     koff1 = ofs
>>>>>>>>     koff2 = 2 * ofs
>>>>>>>>     koff3 = 3 * ofs
>>>>>>>>     koff4 = 4 * ofs
>>>>>>>>
>>>>>>>>     printks(">> RissetHarmOsc ->%f %f %f %f\n", 5, freq, ofs, amp,
>>>>>>>> tbl)
>>>>>>>>
>>>>>>>>     ; a1 = poscil3(kamp, freq, tbl
>>>>>>>>     a2 = poscil3(amp, freq+koff1, tbl)
>>>>>>>>     a3 = poscil3(amp, freq+koff2, tbl)
>>>>>>>>     a4 = poscil3(amp, freq+koff3, tbl)
>>>>>>>>     a5 = poscil3(amp, freq+koff4, tbl)
>>>>>>>>     a6 = poscil3(amp, freq-koff1, tbl)
>>>>>>>>     a7 = poscil3(amp, freq-koff2, tbl)
>>>>>>>>     a8 = poscil3(amp, freq-koff3, tbl)
>>>>>>>>     a9 = poscil3(amp, freq-koff4, tbl)
>>>>>>>>     aL = a2+a4+a6+a8
>>>>>>>>     aR = a3+a5+a7+a9
>>>>>>>>
>>>>>>>>     aoutL, aoutR = reverbsc(aL, aR, 0.4, 4000)
>>>>>>>>     xout(aoutL+aL, aoutR+aR)
>>>>>>>>     ; xout(aL, aR)
>>>>>>>>   endop
>>>>>>>>
>>>>>>>> example calling statement:
>>>>>>>>
>>>>>>>> a1L, a1R = RissetHarmOsc(icps,  0.004, aenv, giPrime)
>>>>>>>>
>>>>>>>> Has something changed to make my UDO invalid in some way? I'm using
>>>>>>>> this code in as performance on Saturday and I'm focused on preparing, but I
>>>>>>>> can follow up with a minimal example.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>