Csound Csound-dev Csound-tekno Search About

[Csnd] trying to make my own mode-udo

Date2012-02-12 16:46
FromStefan Thomas
Subject[Csnd] trying to make my own mode-udo
Dear community,
I'm trying to build my own udo, using the mode-opcode.
My aim:
reading the relative partial-frequencies from a table, as many as I desire, and stop reading, when the end of the table is reached.
First I've created a csd-file, as a template for the udo. But unfortunately the code doesn't work.
When I play the first note, I get:
PERF ERROR: tab_i off end
and I can't hear a sound.
Sorry, it's my first trial with iterative code, so maybee I'm a little thumb.
Here is my code:


<CsoundSynthesizer>
<CsOptions>
-odevaudio -Ma -b-1 -B 4096 -m0d
</CsOptions>
<CsInstruments>

sr    =    48000
ksmps     =     100
nchnls    =    2
0dbfs    =    1

giPartfreqs    ftgen        0, 0, 8, -2, 1, 2,3,4,5,6,7,8

instr 1   
iamp ampmidi 1
icps cpsmidi
iq = 200
ain mpulse iamp, 0
indx init 0
        inumparts = ftlen (giPartfreqs)
loop:
indx = indx+1
ipartfreq    tab_i        indx, giPartfreqs

ipartfreq    =        ipartfreq * icps
asig         mode    ain, ipartfreq, iq
    amix    init    0
amix        =  asig+amix
amix         = amix/inumparts
        loop_le    indx, 1, inumparts, loop

outs amix, amix

endin

</CsInstruments>
; ==============================================
<CsScore>
f 0 36


</CsScore>
</CsoundSynthesizer>



Date2012-02-12 17:00
FromSteven Yi
SubjectRe: [Csnd] trying to make my own mode-udo
Hi Stefan,

There's a couple of issues here.  First thing is that you're doing an
init-time loop though you have performance-time code within it, which
should be avoided.  Using k-vars will ensure you are doing the loop at
performance time.  Also, you can not loop and call the same opcode
over and over when it has its own state.  Your goal is to run multiple
modes, but instead you are running the same mode opcode over and over.

I'd recommend reviewing two articles of mine regarding control flow:

http://www.csounds.com/journal/2006spring/controlFlow.html
http://www.csounds.com/journal/2006summer/controlFlow_part2.html

particularly part 2 which discusses recursion.  For this scenario, I
would recommend using recursion with a UDO if you are going to have
n-number of performance time modes.

I was working on a recursive mode instrument and made a UDO a couple
of months ago.  The instrument is not complete, but the code I used
for the UDO is here:

	opcode mode2,a,akkkko

ain, kfreq, kq, kampmultiplier, kqmultiplier, icounter xin

kcurrentfreq = kfreq * (icounter + 1)

itie tival

aout mode ain, kcurrentfreq, kq, itie
;printk 1, kcurrentfreq
if (icounter < 64) then

kfreqnext = kcurrentfreq + kfreq

if (kfreqnext < (sr * .2) && icounter < 64) then

aout2 mode2 ain * kampmultiplier, kfreq, kq * kqmultiplier,
kampmultiplier, kqmultiplier, icounter + 1
aout sum aout, aout2

endif

endif

xout aout

	endop

(This UDO is also still a work in progress).

Hope that helps and good luck!
steven


On Sun, Feb 12, 2012 at 4:46 PM, Stefan Thomas
 wrote:
> Dear community,
> I'm trying to build my own udo, using the mode-opcode.
> My aim:
> reading the relative partial-frequencies from a table, as many as I desire,
> and stop reading, when the end of the table is reached.
> First I've created a csd-file, as a template for the udo. But unfortunately
> the code doesn't work.
> When I play the first note, I get:
> PERF ERROR: tab_i off end
> and I can't hear a sound.
> Sorry, it's my first trial with iterative code, so maybee I'm a little
> thumb.
> Here is my code:
>
>
> 
> 
> -odevaudio -Ma -b-1 -B 4096 -m0d
> 
> 
>
> sr    =    48000
> ksmps     =     100
> nchnls    =    2
> 0dbfs    =    1
>
> giPartfreqs    ftgen        0, 0, 8, -2, 1, 2,3,4,5,6,7,8
>
> instr 1
> iamp ampmidi 1
> icps cpsmidi
> iq = 200
> ain mpulse iamp, 0
> indx init 0
>         inumparts = ftlen (giPartfreqs)
> loop:
> indx = indx+1
> ipartfreq    tab_i        indx, giPartfreqs
>
> ipartfreq    =        ipartfreq * icps
> asig         mode    ain, ipartfreq, iq
>     amix    init    0
> amix        =  asig+amix
> amix         = amix/inumparts
>         loop_le    indx, 1, inumparts, loop
>
> outs amix, amix
>
> endin
>
> 
> ; ==============================================
> 
> f 0 36
>
>
> 
> 
>
>


Date2012-02-12 17:08
FromStefan Thomas
SubjectRe: [Csnd] trying to make my own mode-udo
Dear Steven,
thanks for sending Your opcode to me.
I will try it, for sure, but first I will study Your articles.
To be honest, I've started reading it and then I thought "let's do it by myself", but that seems to be a bit too early.

Am 12. Februar 2012 18:00 schrieb Steven Yi <stevenyi@gmail.com>:
Hi Stefan,

There's a couple of issues here.  First thing is that you're doing an
init-time loop though you have performance-time code within it, which
should be avoided.  Using k-vars will ensure you are doing the loop at
performance time.  Also, you can not loop and call the same opcode
over and over when it has its own state.  Your goal is to run multiple
modes, but instead you are running the same mode opcode over and over.

I'd recommend reviewing two articles of mine regarding control flow:

http://www.csounds.com/journal/2006spring/controlFlow.html
http://www.csounds.com/journal/2006summer/controlFlow_part2.html

particularly part 2 which discusses recursion.  For this scenario, I
would recommend using recursion with a UDO if you are going to have
n-number of performance time modes.

I was working on a recursive mode instrument and made a UDO a couple
of months ago.  The instrument is not complete, but the code I used
for the UDO is here:

       opcode mode2,a,akkkko

ain, kfreq, kq, kampmultiplier, kqmultiplier, icounter xin

kcurrentfreq = kfreq * (icounter + 1)

itie tival

aout mode ain, kcurrentfreq, kq, itie
;printk 1, kcurrentfreq
if (icounter < 64) then

kfreqnext = kcurrentfreq + kfreq

if (kfreqnext < (sr * .2) && icounter < 64) then

aout2 mode2 ain * kampmultiplier, kfreq, kq * kqmultiplier,
kampmultiplier, kqmultiplier, icounter + 1
aout sum aout, aout2

endif

endif

xout aout

       endop

(This UDO is also still a work in progress).

Hope that helps and good luck!
steven


On Sun, Feb 12, 2012 at 4:46 PM, Stefan Thomas
<kontrapunktstefan@googlemail.com> wrote:
> Dear community,
> I'm trying to build my own udo, using the mode-opcode.
> My aim:
> reading the relative partial-frequencies from a table, as many as I desire,
> and stop reading, when the end of the table is reached.
> First I've created a csd-file, as a template for the udo. But unfortunately
> the code doesn't work.
> When I play the first note, I get:
> PERF ERROR: tab_i off end
> and I can't hear a sound.
> Sorry, it's my first trial with iterative code, so maybee I'm a little
> thumb.
> Here is my code:
>
>
> <CsoundSynthesizer>
> <CsOptions>
> -odevaudio -Ma -b-1 -B 4096 -m0d
> </CsOptions>
> <CsInstruments>
>
> sr    =    48000
> ksmps     =     100
> nchnls    =    2
> 0dbfs    =    1
>
> giPartfreqs    ftgen        0, 0, 8, -2, 1, 2,3,4,5,6,7,8
>
> instr 1
> iamp ampmidi 1
> icps cpsmidi
> iq = 200
> ain mpulse iamp, 0
> indx init 0
>         inumparts = ftlen (giPartfreqs)
> loop:
> indx = indx+1
> ipartfreq    tab_i        indx, giPartfreqs
>
> ipartfreq    =        ipartfreq * icps
> asig         mode    ain, ipartfreq, iq
>     amix    init    0
> amix        =  asig+amix
> amix         = amix/inumparts
>         loop_le    indx, 1, inumparts, loop
>
> outs amix, amix
>
> endin
>
> </CsInstruments>
> ; ==============================================
> <CsScore>
> f 0 36
>
>
> </CsScore>
> </CsoundSynthesizer>
>
>


Send bugs reports to the Sourceforge bug tracker
           https://sourceforge.net/tracker/?group_id=81968&atid=564599
Discussions of bugs and features can be posted here
To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound"



Date2012-02-12 17:31
FromTito Latini
SubjectRe: [Csnd] trying to make my own mode-udo
AttachmentsNone