[Csnd] Initialisation issues with k-rate arrays
| Date | 2023-09-22 19:28 |
| From | "Jeanette C." |
| Subject | [Csnd] Initialisation issues with k-rate arrays |
Hey hey,
I've come up against a challange I can't solve. I have an opcode with a 2d
array parameter, internally a slightly transformed version of that matrix
shall be stored. Updates only occur when the input parameter changes. the idea
is:
init interla matrix from parameter matrix
if parameter matrix has changed
update at k-rate
The code construct for the initialisation appears to fail.
The parameter handed to the opcode is known as
kRoutes
The internal matrix is called:
kMatrix
the first dimension is iterated through with iIndIns, the second dimension
with iIndOuts. iIndInsWrite is the actual position in kMatrix where something
will be written.
Consider this piece of code, Itried variants...
iIndOuts = 0
while (iIndOuts < iLenOuts) do
iIndIns = 0 ; reset pointer to kRoutes
iIndInsWrite = 0 ; reset pointer to kMatrix
while (iIndIns < iLenIns) do
if (kRoutes[iIndIns][iIndOuts] == 1 ) then ; This fails, I think!
kMatrix[iIndInsWrite][iIndOuts] = iIndIns
iIndInsWrite += 1
endif
iIndIns += 1
od
; Fill the rest of the column
while (iIndInsWrite < iLenIns) do
kMatrix[iIndInsWrite][iIndOuts] = -1
iIndInsWrite += 1
od
iIndOuts += 1
od
Instead of if (kRoutes[... I also tried if (i(kRoutes, ...)
I also tried using:
kMatrix[iIndInsWrite][iIndOuts] init iIndIns
So exchanging init for '='.
The best I could get with using init for assignment to matrix was a
matrix of -1. Otherwise I get a matrix of 0.
does anyone have an idea how to properly code/structure this use-case?
Or does anyone know which point I missed?
Best wishes,
Jeanette
--
* Website: http://juliencoder.de - for summer is a state of sound
* Youtube: https://www.youtube.com/channel/UCMS4rfGrTwz8W7jhC1Jnv7g
* Audiobombs: https://www.audiobombs.com/users/jeanette_c
* GitHub: https://github.com/jeanette-c
I thought love was just a tingling of the skin <3
(Britney Spears)
Csound mailing list
Csound@listserv.heanet.ie
https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
Send bugs reports to
https://github.com/csound/csound/issues
Discussions of bugs and features can be posted here |
| Date | 2023-09-22 20:41 |
| From | joachim heintz |
| Subject | Re: [Csnd] Initialisation issues with k-rate arrays |
would it work with setrow?
and can you break down your code to a more minimal example?
(my guess is that kArr[i][i] does not work.)
joachim
On 22/09/2023 20:28, Jeanette C. wrote:
> Hey hey,
> I've come up against a challange I can't solve. I have an opcode with a
> 2d array parameter, internally a slightly transformed version of that
> matrix shall be stored. Updates only occur when the input parameter
> changes. the idea is:
> init interla matrix from parameter matrix
> if parameter matrix has changed
> update at k-rate
>
> The code construct for the initialisation appears to fail.
>
> The parameter handed to the opcode is known as
> kRoutes
>
> The internal matrix is called:
> kMatrix
> the first dimension is iterated through with iIndIns, the second
> dimension with iIndOuts. iIndInsWrite is the actual position in kMatrix
> where something will be written.
>
> Consider this piece of code, Itried variants...
> iIndOuts = 0
> while (iIndOuts < iLenOuts) do
> iIndIns = 0 ; reset pointer to kRoutes
> iIndInsWrite = 0 ; reset pointer to kMatrix
> while (iIndIns < iLenIns) do
> if (kRoutes[iIndIns][iIndOuts] == 1 ) then ; This fails, I think!
> kMatrix[iIndInsWrite][iIndOuts] = iIndIns
> iIndInsWrite += 1
> endif
> iIndIns += 1
> od
>
> ; Fill the rest of the column
> while (iIndInsWrite < iLenIns) do
> kMatrix[iIndInsWrite][iIndOuts] = -1
> iIndInsWrite += 1
> od
> iIndOuts += 1
> od
>
> Instead of if (kRoutes[... I also tried if (i(kRoutes, ...)
> I also tried using:
> kMatrix[iIndInsWrite][iIndOuts] init iIndIns
> So exchanging init for '='.
>
> The best I could get with using init for assignment to matrix was a
> matrix of -1. Otherwise I get a matrix of 0.
>
> does anyone have an idea how to properly code/structure this use-case?
> Or does anyone know which point I missed?
>
> Best wishes,
>
> Jeanette
>
Csound mailing list
Csound@listserv.heanet.ie
https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
Send bugs reports to
https://github.com/csound/csound/issues
Discussions of bugs and features can be posted here |
| Date | 2023-09-23 02:02 |
| From | "Jeanette C." |
| Subject | Re: [Csnd] Initialisation issues with k-rate arrays |
Hi Joachim,
my application is a matrix mixer. I get in a full matrix, with a 1 at each
point where a connection is made and try to condense the number of
multiplications and additions by having another matrix which only contains the
necessary indices to focus on. For that I have to initialise this "condensed"
internal matrix. The internal matrix contains the array indices that are
relevant and -1 after that. Example. The connections matrix looks like this:
out1 out2
0 1 in1
1 0 in2
this condesned matrix:
out1 out2
1 0 in1
-1 -1 in2
So in the real multiplications that happen every k-cycle, I will loop:
while index2 < cols
while index1 < rows
if kmatrix[index1][index2] == -1
index1 = huge!
index1++
index2++
I update the internal kmatrix whenver something changes in the real
connections matrix at k-rate,but I have to initialise it once. the idea is: in
your average matrx mixer out of n times n i/o combinations you will only use a
fraction and thus it is good sense to optimised the looping and
multiplication and addition operations.
Does that make more sense?
In the end it comes down to operations like:
aOut[IndexOut] = aOut[IndexOut] + aIn[Indexin] * kLevel[IndexIn]
If the inner IndexIn loop can be be shortened to the actual number of inputs
summed into the output that is a great help. That expression is simplified, I
actually take the IndexIn from the condensed kMatrix. Thus it's a twofold
process.
Best wishes,
Jeanette
Sep 22 2023, joachim heintz has written:
> would it work with setrow?
>
> and can you break down your code to a more minimal example?
>
> (my guess is that kArr[i][i] does not work.)
>
> joachim
>
>
> On 22/09/2023 20:28, Jeanette C. wrote:
>> Hey hey,
>> I've come up against a challange I can't solve. I have an opcode with a 2d
>> array parameter, internally a slightly transformed version of that matrix
>> shall be stored. Updates only occur when the input parameter changes. the
>> idea is:
>> init interla matrix from parameter matrix
>> if parameter matrix has changed
>> update at k-rate
>>
>> The code construct for the initialisation appears to fail.
>>
>> The parameter handed to the opcode is known as
>> kRoutes
>>
>> The internal matrix is called:
>> kMatrix
>> the first dimension is iterated through with iIndIns, the second dimension
>> with iIndOuts. iIndInsWrite is the actual position in kMatrix where
>> something will be written.
>>
>> Consider this piece of code, Itried variants...
>> iIndOuts = 0
>> while (iIndOuts < iLenOuts) do
>> iIndIns = 0 ; reset pointer to kRoutes
>> iIndInsWrite = 0 ; reset pointer to kMatrix
>> while (iIndIns < iLenIns) do
>> if (kRoutes[iIndIns][iIndOuts] == 1 ) then ; This fails, I think!
>> kMatrix[iIndInsWrite][iIndOuts] = iIndIns
>> iIndInsWrite += 1
>> endif
>> iIndIns += 1
>> od
>>
>> ; Fill the rest of the column
>> while (iIndInsWrite < iLenIns) do
>> kMatrix[iIndInsWrite][iIndOuts] = -1
>> iIndInsWrite += 1
>> od
>> iIndOuts += 1
>> od
>>
>> Instead of if (kRoutes[... I also tried if (i(kRoutes, ...)
>> I also tried using:
>> kMatrix[iIndInsWrite][iIndOuts] init iIndIns
>> So exchanging init for '='.
>>
>> The best I could get with using init for assignment to matrix was a
>> matrix of -1. Otherwise I get a matrix of 0.
>>
>> does anyone have an idea how to properly code/structure this use-case?
>> Or does anyone know which point I missed?
>>
>> Best wishes,
>>
>> Jeanette
>>
>
> Csound mailing list
> Csound@listserv.heanet.ie
> https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
> Send bugs reports to
> https://github.com/csound/csound/issues
> Discussions of bugs and features can be posted here
>
--
* Website: http://juliencoder.de - for summer is a state of sound
* Youtube: https://www.youtube.com/channel/UCMS4rfGrTwz8W7jhC1Jnv7g
* Audiobombs: https://www.audiobombs.com/users/jeanette_c
* GitHub: https://github.com/jeanette-c
I thought love was just a tingling of the skin <3
(Britney Spears)
Csound mailing list
Csound@listserv.heanet.ie
https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
Send bugs reports to
https://github.com/csound/csound/issues
Discussions of bugs and features can be posted here |
| Date | 2023-09-23 08:12 |
| From | joachim heintz |
| Subject | Re: [Csnd] Initialisation issues with k-rate arrays |
hi jeanette -
sure it makes sense. i just thought it could be good to have a minimal
example to see why / what is not working.
i remember when i was working with 2d arrays i had to use the setrow
opcode, but i don't know if it was the same problem as in your case.
best -
joachim
On 23/09/2023 03:02, Jeanette C. wrote:
> Hi Joachim,
> my application is a matrix mixer. I get in a full matrix, with a 1 at
> each point where a connection is made and try to condense the number of
> multiplications and additions by having another matrix which only
> contains the necessary indices to focus on. For that I have to
> initialise this "condensed" internal matrix. The internal matrix
> contains the array indices that are relevant and -1 after that. Example.
> The connections matrix looks like this:
> out1 out2
> 0 1 in1
> 1 0 in2
> this condesned matrix:
> out1 out2
> 1 0 in1
> -1 -1 in2
> So in the real multiplications that happen every k-cycle, I will loop:
> while index2 < cols
> while index1 < rows
> if kmatrix[index1][index2] == -1
> index1 = huge!
> index1++
> index2++
> I update the internal kmatrix whenver something changes in the real
> connections matrix at k-rate,but I have to initialise it once. the idea
> is: in your average matrx mixer out of n times n i/o combinations you
> will only use a fraction and thus it is good sense to optimised the
> looping and multiplication and addition operations.
>
> Does that make more sense?
>
> In the end it comes down to operations like:
> aOut[IndexOut] = aOut[IndexOut] + aIn[Indexin] * kLevel[IndexIn]
> If the inner IndexIn loop can be be shortened to the actual number of
> inputs summed into the output that is a great help. That expression is
> simplified, I actually take the IndexIn from the condensed kMatrix. Thus
> it's a twofold process.
>
> Best wishes,
>
> Jeanette
>
> Sep 22 2023, joachim heintz has written:
>
>> would it work with setrow?
>>
>> and can you break down your code to a more minimal example?
>>
>> (my guess is that kArr[i][i] does not work.)
>>
>> joachim
>>
>>
>> On 22/09/2023 20:28, Jeanette C. wrote:
>>> Hey hey,
>>> I've come up against a challange I can't solve. I have an opcode
>>> with a 2d
>>> array parameter, internally a slightly transformed version of that
>>> matrix
>>> shall be stored. Updates only occur when the input parameter
>>> changes. the
>>> idea is:
>>> init interla matrix from parameter matrix
>>> if parameter matrix has changed
>>> update at k-rate
>>>
>>> The code construct for the initialisation appears to fail.
>>>
>>> The parameter handed to the opcode is known as
>>> kRoutes
>>>
>>> The internal matrix is called:
>>> kMatrix
>>> the first dimension is iterated through with iIndIns, the second
>>> dimension
>>> with iIndOuts. iIndInsWrite is the actual position in kMatrix where
>>> something will be written.
>>>
>>> Consider this piece of code, Itried variants...
>>> iIndOuts = 0
>>> while (iIndOuts < iLenOuts) do
>>> iIndIns = 0 ; reset pointer to kRoutes
>>> iIndInsWrite = 0 ; reset pointer to kMatrix
>>> while (iIndIns < iLenIns) do
>>> if (kRoutes[iIndIns][iIndOuts] == 1 ) then ; This fails, I think!
>>> kMatrix[iIndInsWrite][iIndOuts] = iIndIns
>>> iIndInsWrite += 1
>>> endif
>>> iIndIns += 1
>>> od
>>>
>>> ; Fill the rest of the column
>>> while (iIndInsWrite < iLenIns) do
>>> kMatrix[iIndInsWrite][iIndOuts] = -1
>>> iIndInsWrite += 1
>>> od
>>> iIndOuts += 1
>>> od
>>>
>>> Instead of if (kRoutes[... I also tried if (i(kRoutes, ...)
>>> I also tried using:
>>> kMatrix[iIndInsWrite][iIndOuts] init iIndIns
>>> So exchanging init for '='.
>>>
>>> The best I could get with using init for assignment to matrix was a
>>> matrix of -1. Otherwise I get a matrix of 0.
>>>
>>> does anyone have an idea how to properly code/structure this use-case?
>>> Or does anyone know which point I missed?
>>>
>>> Best wishes,
>>>
>>> Jeanette
>>>
>>
>> Csound mailing list
>> Csound@listserv.heanet.ie
>> https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
>> Send bugs reports to
>> https://github.com/csound/csound/issues
>> Discussions of bugs and features can be posted here
>>
>
Csound mailing list
Csound@listserv.heanet.ie
https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
Send bugs reports to
https://github.com/csound/csound/issues
Discussions of bugs and features can be posted here |
| Date | 2023-09-23 12:52 |
| From | "Jeanette C." |
| Subject | Re: [Csnd] Initialisation issues with k-rate arrays |
Hi Joachim,
Sep 23 2023, joachim heintz has written:
...
> i remember when i was working with 2d arrays i had to use the setrow opcode,
> but i don't know if it was the same problem as in your case.
...
I did naturally come across setrow and setcol. I must admit that I'm not
sure which one pertains to wich dimension of the array.
Best wishes and thanks,
Jeanette
--
* Website: http://juliencoder.de - for summer is a state of sound
* Youtube: https://www.youtube.com/channel/UCMS4rfGrTwz8W7jhC1Jnv7g
* Audiobombs: https://www.audiobombs.com/users/jeanette_c
* GitHub: https://github.com/jeanette-c
Baby, take the time to realize
I'm not the kind to sacrifice <3
(Britney Spears)
Csound mailing list
Csound@listserv.heanet.ie
https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
Send bugs reports to
https://github.com/csound/csound/issues
Discussions of bugs and features can be posted here |