[Csnd] trying to make my own mode-udo
| Date | 2012-02-12 16:46 |
| From | Stefan 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> |
| Date | 2012-02-12 17:00 |
| From | Steven Yi |
| Subject | Re: [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 |
| Date | 2012-02-12 17:08 |
| From | Stefan Thomas |
| Subject | Re: [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, |
| Date | 2012-02-12 17:31 |
| From | Tito Latini |
| Subject | Re: [Csnd] trying to make my own mode-udo |
| Attachments | None |