Csound Csound-dev Csound-tekno Search About

[Csnd] Saving arrays in a array and reading it out

Date2023-02-18 19:12
FromPhilipp Neumann
Subject[Csnd] Saving arrays in a array and reading it out
Hello Everybody!

I’m working on a instrument where i can save multiple arrays in one array. Then i want to read these arrays out, one after another.
For example:

iArr1[] = 1, 2, 3, 4, 5
iArr2[] = 11, 22, 33, 44, 55
iArr3[] = 111, 222, 333, 444, 555

iAllArr[] = iArr1, iArr2, iArr3

After this i want to create automatically a new array with all the values like this:

iAllValues[] = 1, 2, 3, 4, 5, 11, 22, 33, 44, 55, 111, 222, 333, 444, 555

I already done this and this working quit well:

kPtr1[] fillarray 1, 2, 3, 4
kPtr2[] fillarray 11, 12, 13

iSngLng = lenarray(kPtr1) + lenarray(kPtr2)

gkPtrCmpl[] init iSngLng

kSngNdx init 0
kRdNdx init 0
kActPtr[] = kPtr1
while kSngNdx < iSngLng do
	kNewValue = kActPtr[kRdNdx]
	gkPtrCmpl[kSngNdx] = kNewValue
	kRdNdx += 1
	kSngNdx += 1
	if kRdNdx == lenarray(kActPtr) then
		kRdNdx = 0
		kActPtr = kPtr2
	endif
od

But this is only a solution for two arrays as input for a new array.
I want to use a abritary number of kPtrN - Arrays as Input for another Array (iPtrChain[] = iPtr1, iPtr1, iPtr2).
Then i want to read all the values into a new array.

How can i come there?

Greetings,
Philipp
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

Date2023-02-18 19:53
From"Jeanette C."
SubjectRe: [Csnd] Saving arrays in a array and reading it out
Hi Philipp!
Feb 18 2023, Philipp Neumann has written:
...
> But this is only a solution for two arrays as input for a new array.
> I want to use a abritary number of kPtrN - Arrays as Input for another Array (iPtrChain[] = iPtr1, iPtr1, iPtr2).
> Then i want to read all the values into a new array.
...
Here are a few things that might help. First, you can change the size of
an array using trim
https://csound.com/manual/trim.html
This can help to change the size of your song array.
You can copy values like you did in a while loop.
You can write a UDO to help you, extend the song by one pattern at a
time. Perhaps something like this:
opcode AddPattern, 0, k[]k[]
   kSong[], kPattern[] xin ; get the two arrays inside the UDO

   ; get the length of the pattern
   kPatternLen = lenarray(kPattern) ; or use a fixed value


   ; Get the length of the song so far
   kSongLen = lenarray(kSong)

   ; Extend the size of your song to accomodate the new pattern
   trim(kSong, (kSongLen + kPatternLen)

   ; Now copy
   kReadIndex init 0
   kWriteIndex = kSongLen - 1 ; indexing starts at 0 so -1
   while (kReadIndex < kPatternLen) do
     kSong[kWriteIndex] = kPattern[kReadIndex]
 	 kReadIndex += 1
 	 kWriteIndex += 1
   od
endop

I haven't tested the code, but this is the idea. Inside the orchestra
part or directly inside your  instrument you can create the patterns and
then use the UDO like this:
instr Player
   ... ; do stuff
   kPart1[] = ...
   kPart2 = ...
   kSong[] = kPart1 ; yes the first pattern should probably be added like
     ; this, I'm not sure whether you can create an array with 0 elements
   AddPattern kSong, kPart2
   AddPattern kSong, kPart1
   ...
endin

HTH.

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

There must be another way
Cause I believe in taking chances
But who am I to say - What a girl is to do <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