Go statements break the straight flow of sequence play to continue somewhere else. There are three kinds: Go to, Go to with chance, and Go between. The short description of each is here:
Go To label with 25% chance //one-quarter chance of going to label
//three-quarters likely to go to the next statement
Go Between label1 And label2 // 1/3 or 33% chance of going to each label.
//Never continues to the next statement
label1
//code here
go to ending //this Go To occurs always
label
//more code
go to ending //this Go To occurs always
label2
//and more code
go to ending //this Go To occurs always
ending //reaches this point and falls through to repeat
That’s all three in a tiny nutshell. Learn them well and you need go no further.
If you want to know more, here they are in all their glory. The following covers
- Labels
- Go To
- Go Between
- Go To with Chance
- Random Loop Counter
- Number of Loops
- Eyeball Estimates
- Randomizing a non-random Sequence
Labels
Anything that is “legal” and is not a number or a keyword is considered a label. Upper/lowercase letters are treated alike. Underscores “_” separate words for readability, so does camelcase.
loopName //camelcase makes words readable by humans
within //oops! Illegal keyword is already used by Fade To statement
myTable@home //bzzz. Try again
another_loop_name //underscores make it readable by humans
GO TO LOOPname //case need not match label
Typos can be interpreted as labels. They are usually easy to spot. But how about this: A programmer may accidentally type “goto” instead of “go to”. It looks alright but since goto isn’t a keyword, it will become a label. It will cause other errors.
loop1
//code here
goto loop1 //oops, "goto" typo is now a label, "loop1" becomes a duplicate label
//other code here
goto loop1 //oops, "goto" typo is now a duplicate label too.
Limits:
A label can be any length (well, billions of characters).
A sequence may contain up to 250 labels. The number of Go statements to those labels is not limited.
Go To Label
Go To Label statements always reach their destination. They take the following form:
//Two Go To examples
//one forward, one back
//code here would play once on startup
loop //this is a label
//code here would play repeatedly
@+5ms
go to skip //goes forward in the sequence
//code here would be skipped, would never play
skip //this is a label
go to loop //goes back to an earlier point in the sequence
There is one strict rule: The Go To Loop, which is a backward reference, must never go to a label that shares the same time stamp as the Go statement that went to it. This would cause an untimed loop, which is too fast to be seen, it would hog CPU time and be halted by the Morsel. If power is cycled, the Morsel will try to run it again, most likely with the same result.
Go Between label1 And label2
A Go Between statement always goes somewhere, but you don’t know where, it’s random. Label1 and label2 specify a range of labels inclusive that it can go to, and all are equally likely:
//Go Between example
//LED brightness is set randomly and held for 0.5s
full
chn1 = 100%
go between full and ninth
third
chn1 = 33%
@+0.5s go between full and thirtieth
ninth
chn1 = 11%
@+0.5s go between full and thirtieth
altThirtieth
thirtieth
chn1 = 3.3%
@+0.5s go between full and thirtieth
//never falls through
Notice the middle labels never get mentioned by the Go Between statement. That’s okay, because the statement uses them too, each with an equal chance of setting a different brightness.
Notice too that the last brightness has two labels, thirtieth and altThirtieth. The presence of two labels means this code has twice as much chance of occurring as the others. Since there are 5 labels, each one has a 1/5 or 20% chance. The 3.3% brightness choice has a 40% chance.
Here’s another game we can play with the choice of labels. We made the first Go Between different from the others. When the LED hits 100% brightness, we decided not to let it fall all the way to a thirtieth next time, only allowing down to 1/9 brightness on the following change.
Sometimes the code you want to go between has other go to’s and labels contained within it. These are fair play for the Go Between statement. In many cases, it may look okay to go to these inner labels, but if it is not, a Go To table can be used.
//Go Between with table
//go to table
chooseFull Go to full
chooseHalf Go To half
altChooseQtr chooseQtr Go To qtr //twice as likely
//the code
full
chn1 = 100%
waitFull
@+50ms
Go To waitFull with 90% chance
Go Between chooseFull and chooseHalf //don't transition to dimmest choice
half
chn1 = 50%
waitHalf
@+50ms
Go To waitHalf with 90% chance
Go Between chooseFull and chooseQtr
qtr
chn1 = 25%
waitQtr
@+50ms
Go To waitQtr with 90% chance
Go Between chooseFull and chooseQtr
//never falls through
The table ensures that the labels we specifically choose have equal probability of occurring. Once again, we played our old tricks: The Go Between following the “full” label omits the dimmest choice and the last Go Between was made twice as likely with the alternate label.
If we had not used the table, the wait labels would also be targets for the Go Between statements. That might be okay for your purposes, but it works differently: When going to a wait loop, the brightness setting instruction is skipped. In that case, the prior brightness lasts around twice as long.
Go To Label With Chance
Go To With Chance uses a probability that a Go will be taken. It might not. Chance is a percentage from 0.0% (will never happen) to 100.0% (will always happen, well, this one comes to 99.4% likely). This percent scale was also seen for LED brightness (chn1 = 50%), but LED brightness is definite, not random.
The previous Go Between example can be written with Go to with chance statements instead
//Go To with Chance //the code full chn1 = 100% waitFull @+50ms Go To waitFull with 90% chance Go To full with 50% chance //Either Full or Half, not dimmest choice half chn1 = 50% waitHalf @+50ms Go To waitHalf with 90% chance Go To full with 33% chance //maybe full Go To half with 50% chance //maybe half or falls through to qtr qtr chn1 = 25% waitQtr @+50ms Go To waitQtr with 90% chance Go To half with 33% chance //maybe half Go To qtr with 50% chance //maybe qtr Go To full //or maybe falls through to full (optional Go To)
Not as compact but it works.
Random Loop Counter
Here is an example of a random loop counter.
//Go To with Chance
//Randomized loop count
chn1 = fade from 0% to 100% for 5s //slooow fade
@+5s
blinkLoop
chn1 = 100%
@+100ms chn1 = 0%
@+100ms go to blinkLoop with 90% chance //eyeball estimate 10 loops typical
//it could fall through and replay the slooow fade
The statements following blinkLoop are eyeball-estimated at occurring around 9 times before falling through, but that can be as little as once to more than 100, just by chance. But there is an average range we call eyeball estimates.
Number of loops and
Eyeball Estimates
We can calculate the chance of a loop happening a certain number times. That number is not obvious, because in loops, the probabilities are multiplied.
The next table may be a bit much to take in. That is why we follow it with eyeball estimates.
Chance of looping at least...
Go To Chance Never Once Twice 3 Times 10 Times 100 times
1% 99% 1% .01% 0.* 0.* 0.*
33% 66% 33% 11% 3.6% 0.* 0.*
50% 50% 50% 25% 12.5% .1% 0.*
80% 20% 80% 64% 51% 11% 0.*
90% 10% 90% 81% 73% 35% 0.*
95% 5% 95% 90% 86% 60% 0.6%
97% 3% 97% 94% 91% 73% 5%
98% 2% 98% 96% 94% 82% 13%
99% 1% 99% 98% 97% 90% 37%
*very small chance, but possible
But that doesn’t tell us how many times it will loop. For that, we can quickly arrive at an eyeball estimate that is pretty good.
Eyeball Estimates: How many times will it loop?
Go To label With NN Chance
Go To Chance
NN In words Eyeball Estimate Actual at
1% rarely loops again rare exceptions 1%
33% unlikely to loop occasionally 33%
50% 1 in 2 chance 1 loop, half the time 50%
66% 2 in 3 chance loops about twice 44% chance to loop twice or more
80% 4 in 5 chance loops around 4 times 41% chance of 4 loops or more
90% 9 in 10 chance loops around 9 times 39% chance of 9 loops or more
95% 19 in 20 chance loops around 19 times 38% chance of 19 loops or more
97% 32 in 33 chance loops around 32 times 38% chance of 32 loops or more
98% 49 in 50 chance loops around 49 times 37% chance of 49 loops or more
99% 99 in 100 chance loops around 99 times 37% chance of 99 loops or more
Keep in mind, the loop always executes once before reaching the Go To With Chance. So add one.
//Eyeball Estimate Loop Example:
chn1=100%
@+100ms
chn1=0% //How long will it stay turned off?
loop
@+100ms
go to loop with 90% chance //about how many loops? Try it!
//falls through and repeats
Now you possess massive amounts of knowledge on Go statements. Knowledge is power. And power can be used for both good and evil. Effects, that is.
