User:Laurier Rochon/prototyping/clappingmusic

From XPUB & Lens-Based wiki

Attempt #1

ARRAYS : shifting positions into a loop

Trying to move

1 2 3 4 5 6

into

2 3 4 5 6 1

Need to have something like

array[currentposition]=array[currentposition+1]

But then we need to have a reminder of what the first value was before we override it with (2) in this case.

start loop

firstvalue=array[positionone]
if loopindex <smaller lastarrayindex
	array[currentposition]=array[currentposition+1]
endif	
array[lastvalue]=array[firstvalue]

end loop

The main problem is that firstvalue=array[positionone] changes as you move through the loop. Meaning that you lose the value and after looping this once, you get

1 3 4 5 6 6

Insteda of

2 3 4 5 6 1

Attempt #2

ARRAYS : creating an empty array that we refill and then override the original array with the new values (avoids values overriding/shifting by creating this 'buffer'). Not very elegant!

#declare values
notes=( a a+ b b+ c c+ d d+ e e+ f f+ g g+ ) #fun to toggle!
notes=( c c c r c c r c r c c r) #fun to toggle!
 
#check the length
len=${#notes[@]}
 
#create an empty array 'newnotes'
declare -a newnotes
 
#loop1, do this 13 times
for((a=0;a<$len;a++));do
 
	loop2, another 13 times (13x13 total)
	for (( i=0;i<$len;i++)); do
		#check the last value
		last=${notes[$len-1]}
		#throw that into the 1st position
		newnotes[0]=$last
		#if the position of loop is smaller than total elements
		if [ $i -lt $((len-1)) ]; then
			#grab the value of the old array, put into new
			newnotes[$((i+1))]=${notes[$i]}
		fi
	done
 
	#then squash the new array, so this works within a loop
 
	for (( i=0;i<$len;i++)); do
		#reassign
		notes[$i]=${newnotes[$i]}
	done
 
	#echo
	echo ${notes[*]}
 
done

Which creates a nice shifting matrix like so

g+ a a+ b b+ c c+ d d+ e e+ f f+ g
g g+ a a+ b b+ c c+ d d+ e e+ f f+
f+ g g+ a a+ b b+ c c+ d d+ e e+ f
f f+ g g+ a a+ b b+ c c+ d d+ e e+
e+ f f+ g g+ a a+ b b+ c c+ d d+ e
e e+ f f+ g g+ a a+ b b+ c c+ d d+
d+ e e+ f f+ g g+ a a+ b b+ c c+ d
d d+ e e+ f f+ g g+ a a+ b b+ c c+
c+ d d+ e e+ f f+ g g+ a a+ b b+ c
c c+ d d+ e e+ f f+ g g+ a a+ b b+
b+ c c+ d d+ e e+ f f+ g g+ a a+ b
b b+ c c+ d d+ e e+ f f+ g g+ a a+
a+ b b+ c c+ d d+ e e+ f f+ g g+ a
a a+ b b+ c c+ d d+ e e+ f f+ g g+


End result

cat << STOP
@head {
    \$time_sig 4/4
    \$tempo 120
}
@body {
 
    @channel 1 {
        \$patch 1
        \$octave 4
        \$length 16
 
 
 
STOP

#just the original loop outputting non-variable pattern

notes=( c c c r c c r c r c c r)
len=${#notes[@]}

for((a=0;a<$len;a++));do

	echo ${notes[*]}

done

cat << STOP
}
 
 
	@channel 2 {
	    \$patch 1
        \$length 16
        \$octave 6
 
 
STOP


#declare values
notes=( a a+ b b+ c c+ d d+ e e+ f f+ g g+ ) #fun to toggle!
notes=( c c c r c c r c r c c r) #fun to toggle!

#check the length
len=${#notes[@]}

#create an empty array 'newnotes'
declare -a newnotes

#loop1, do this 13 times
for((a=0;a<$len;a++));do
	
	loop2, another 13 times (13x13 total)
	for (( i=0;i<$len;i++)); do
		#check the last value
		last=${notes[$len-1]}
		#throw that into the 1st position
		newnotes[0]=$last
		#if the position of loop is smaller than total elements
		if [ $i -lt $((len-1)) ]; then
			#grab the value of the old array, put into new
			newnotes[$((i+1))]=${notes[$i]}
		fi
	done

	#then squash the new array, so this works within a loop

	for (( i=0;i<$len;i++)); do
		#reassign
		notes[$i]=${newnotes[$i]}
	done
	
	#echo
	echo ${notes[*]}

done

 
cat << STOP
 
} 
}
STOP