# Is there a way to prevent audio from becoming out of sync with graphics?

The code below could be used to say help Pre-Kindergarten and Kindergarten children learn about the numerals and numbers from one to 9. The problem is that this age group would be prone to just pressing buttons and it is easy to get the audio out of sync with the graphics. I have played around with Pause[different values] placed after the Speak statements and Enabled->False/Enabled->True as well as SynchronousUpdating -> False. I was hoping that someone might be able to tell me whether I was on the right track or if there is a different function I should look at. I would also appreciate if someone could tell me a way to follow the flow of the way the code is read by the computer (I have tried Trace with little success), that would give me an idea of where to best place Pauses, etc. (I want to thank John Fultz for contributions previously made to this manipulate.) Thank You

Manipulate[
Pane[Column[{Text[
Row[If[n < 2, {Spacer[160],
Style[nnames[[n]], Bold, Large, Hue[RandomReal[]]],
Style[" Ball", Bold, Large, Green]}, {Spacer[160],
Style[nnames[[n]], Bold, Large, Hue[RandomReal[]]],
Style[" Balls", Bold, Large, Green]}]]],
Row[Table[Graphics[{
Darker[Green], Disk[],
Text[Style[numerals[[ r]], Orange, "Label", 48], {0,
0}]}], {r, 1, n}]
]}, BaseStyle -> {LinebreakAdjustments -> {1., 10, 0, 0,
10}}], {525, 300}],
Row[{Button[
" Start  \n ", {n = 1,
Speak["lets count the numbers 1 to 9 out loud. One"]}],
Spacer[55],
Button[
"\[FilledLeftTriangle]\[FilledLeftTriangle] Start Over", {n = 1,
Speak["one"]}],
Button[
"\[FilledLeftTriangle] Less", {If[
n < 2, {n = 1,
Speak["Today we are just working on the numbers from one to \
nine."]}, {n -= 1, Speak[n]}]}], Spacer[10],
Button[
"More \[FilledRightTriangle]", {If[
n > 8, {n = 9,
Speak["Lets learn the numbers from one to nine before we go \
on."]}, {n += 1, Speak[n]}]}],
Button[
"All \[FilledRightTriangle]\[FilledRightTriangle]", {n = 9,
Speak["nine"]}]
}],
{{n, 9, " "}, ControlType -> None},
Initialization :> (
numerals = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
nnames = {"One", "Two", "Three", "Four", "Five", "Six", "Seven",
"Eight", "Nine"};)]

-
The code isn't syntactically correct. Please check that it works on copy-paste on a clean kernel –  Rojo Apr 26 '13 at 21:48
This is the MathGroup thread on the same topic (@user7133 cross posts are allowed, but it's good practice to link them together to avoid duplication of effort. It'd also be nice if you could choose an easier to remember username than "user7133". Welcome to Mathematica.SE!) –  Szabolcs Apr 26 '13 at 21:55
@Rojo, I am very sorry about that. There should be a )] after ...,"Nine"}; –  Clif Apr 26 '13 at 22:03
@Szabolcs, Thanks for letting me know and for posting the link. –  Clif Apr 26 '13 at 22:05

## 1 Answer

This is not the perfect solution to the problem, however the behavior of the manipulate is improved over what it was in the original question. Thanks to all who looked at this and especially David Park who gave me the “choiceEnabled =True/False” as well as all who left comments. I am not going to accept this as “The Answer”, in hopes that someone will eventually post a really good way to synchronize the audio and the graphics in general. As for this solution I feel like one of the keys was to place the “Speak” and “Pause” statements after the graphics, forcing the program to read through the graphics before encountering the “Pause”.

 Manipulate[
Pane[Column[{Text[
Row[If[n < 2, {Spacer[160],
Style[nnames[[n]], Bold, Large, Hue[RandomReal[]]],
Style[" Ball", Bold, Large, Green]}, {Spacer[160],
Style[nnames[[n]], Bold, Large, Hue[RandomReal[]]],
Style[" Balls", Bold, Large, Green]}]]],
Row[Table[
Graphics[{Darker[Green], Disk[],
Text[Style[numerals[[r]], Orange, "Label", 48], {0, 0}]}], {r,
1, n}]], Speak[n], Pause[1], choiceEnabled = True;},
BaseStyle -> {LinebreakAdjustments -> {1., 10, 0, 0, 10}}], {525,
300}], Row[{Button[
" Start \n ", {If[n < 2,
"", {n = 1, Speak["lets count the numbers 1 to 9 out loud"],
choiceEnabled = False}]}, Enabled -> Dynamic[choiceEnabled]],
Spacer[55],
Button[
"\[FilledLeftTriangle]\[FilledLeftTriangle] Start Over", {If[
n < 2, "", {n = 1, choiceEnabled = False}]},
Enabled -> Dynamic[choiceEnabled]],
Button[
"\[FilledLeftTriangle] Less", {If[
n < 2, {n = 1,
Speak["Today we are just working on the numbers from one to \
nine."], Pause[3]}, {n -= 1, choiceEnabled = False}]},
Enabled -> Dynamic[choiceEnabled]], Spacer[10],
Button["More \[FilledRightTriangle]", {If[
n > 8, {n = 9,
Speak["Lets learn the numbers from one to nine before we go \
on."], Pause[3]}, {n += 1, choiceEnabled = False}]},
Enabled -> Dynamic[choiceEnabled]],
Button[
"All \[FilledRightTriangle]\[FilledRightTriangle]", {If[n > 8,
"", {n = 9, choiceEnabled = False}]},
Enabled -> Dynamic[choiceEnabled]]}],
{{n, 9, " "}, ControlType -> None},
Initialization :> (numerals = {"1", "2", "3", "4", "5", "6", "7",
"8", "9"};
nnames = {"One", "Two", "Three", "Four", "Five", "Six", "Seven",
"Eight", "Nine"};
choiceEnabled = True;)]

-