a quick tutorial on Pins
[swftools.git] / doc / fileformat.sc
1 # ==================================================================================
2 #
3 # File format specification (well, sort of)
4 # Version: 0.1
5 #
6 # ==================================================================================
7
8 # Notice that the following is actually a valid .sc file, generating the four swfs
9 # spec.swf, scroll1.swf, scroll2.swf and simple_viewer.swf. (Provided all included 
10 # files are present)
11
12 # File header
13 # -----------
14
15 .swf bbox=200x200 version=6 fps=50 name="spec.swf" compress
16
17 # bbox=200x200         : set bounding box to 200x200
18 # bbox=200x200:100:100 : set bounding box to (100,100)-(300,300)
19 # bbox=autocrop        : (default) - make bbox just big enough so that nothing ever get's clipped
20 #
21 # all coordinates are in pixels, not in twips. fixed point values like 1.25, 333.40 are allowed.
22 #
23 # version=6    : generate flash mx movie
24 # fps=50       : set framerate to 50 frames/second
25 # name="..."   : save result to spec.swf. (Default: input file with extension 
26 #                                          changed to .swf, or the value of the -o command line 
27 #                                          parameter if given)
28
29 # load a simple object:
30 # ---------------------
31
32 .shape myshape1 "choo1.swf"
33 .shape myshape2 filename="choo1.swf" # long form
34 .shape myshape3 filename=choo1.swf # long form, without quotes
35 .shape myshape4 choo1.swf # short form, without quotes
36
37 #TODO: Do those files come from the current directory, the script directory or both?
38
39 # load an image:
40 # --------------
41
42 .jpeg background "panorama.jpg"
43 .jpeg background2 "panorama.jpg" quality=30% #reduces jpeg quality
44
45 .png background3 "choochoo.png"
46
47 # (you can put this directly (generating a shape), or insert it into a shape via the fill= argument
48
49 # define a texture from an image:
50 # -------------------------------
51
52 .texture text1=background scale=50% rotate=45
53
54 # load several pages:
55 # -------------------
56
57 .movie train1 "choochoopuff.swf"
58
59 # Notice: An embedded animation can't have a different framerate than
60 # the frame rate from the surrounding animation.
61
62 # Create simple objects:
63 # ----------------------
64
65 # We should support some primitives to not have to load everything
66 # from a file
67 .box mybox1 width=100 height=50 color=black fill=none #unfilled rectangle (just the lines)
68 .box mybox2 width=100 height=50 color=black           #same as above
69 .box mybox3 width=100 height=50 color=black fill      #filled black rectangle
70 .box mybox4 width=100 height=50 color=red line=2 fill=blue #blue rectangle with red edges
71 .box mybox5 width=100 height=50 color=red line=2 fill=background #part the background image, with red edges
72 .circle mycircle1 r=50 color=#aa33ff fill=background
73 .egon poly1 vertices=5
74
75 # Continuous soundtrack synched up to several frames in a row:
76 # ------------------------------------------------------------
77
78 # load a sound effect:
79 .sound sound1 "LocoStart.wav"
80
81 .frame 16
82     .play sound1 loop=1 #other arguments supported: nomultiple (don't start if already playing)
83
84 .frame 20
85 # this starts a synchronized soundtrack at this frame position. The command
86 # expects a filename, not a sound object, as it would be duplicating the
87 # sound object otherwise, and I'd rather have that done explicitly.
88     .soundtrack "LocoStart.wav"
89          #...  TODO: should .soundtrack sounds have a name? we could support
90              # .stop for them, which would simply stop generating mp3 data
91
92 .frame 55
93 # unlike characters, sounds can't have multiple instances, and can't
94 # be referenced once playing. So we stop the sound, not the instance.
95     .stop sound1
96
97 # Sound effects on user pressing or releasing a button 
98
99 .button playbutton shape=obj1
100 #    ...
101 .end
102 .buttonsounds playbutton press=sound1 release=sound2 enter=sound3 leave=sound4
103
104 # Elements of the movie should be animated by various means 
105 # moving (x,y and zoom) 
106 # ---------------------
107
108 .box obj1 width=200.0 height=100.0
109
110 .frame 100
111     .put obj1 x=0 y=0 #object starts at (0,0)
112
113 .frame 140
114     .change obj1 x+=100 y=0 scale=120% # smoothly move obj1 100 pixels to the right over 40 frames,
115                                        # scaling it to 120% of it's original size
116 .frame 170
117     .jump obj1 x=200 y=200 # make object to suddenly change to 200,200 at frame 70.
118
119 .frame 190
120     .qchange obj1 x=300 y=200 # make obj1 move towards 300,200...
121 .frame 210
122     .qchange obj1 x=300 y=300 # ... and then smoothly over to 300,300 using bspline interpolation
123
124 #.frame 220   #TODO
125 #    .jump obj1 x=reset y=reset
126
127 .frame 230
128     .del obj1   #Remove object again
129
130 # morphing (easy for simple polygons, hard for more complex shapes) 
131 # -----------------------------------------------------------------
132
133 .morphshape morphthing start="start.fig" end="end.fig"
134
135 #.morphshape blop [V77CJQAvn3KKYD8GDb4gFgbAZ4oM2RBdhOtvEVRdpNdIJF4tQ5gh7GzxnFYNvxe7lpXVranU
136 #                 +v/OjhGkCoUrOq9gUj4bJj0JjioYaA+VDsZ4Wq0+XLm0MiIgJZICQbADnUpdro5N11eVS699O]
137
138 # the following would be more work, but may be nice:
139 .box mybox6 width=100 height=50 color=black
140 .box mybox7 width=100 height=50 color=red
141 .morphshape morphthing2 start=mybox1 end=mybox2
142
143 # interpolation between crude manual animation frames
144 # ---------------------------------------------------
145
146 .shape ball "ball.fig" #The ball should be white or violet to make the cxforms below work
147
148 # now draw two balls, which fly around each other.
149
150 .frame 300
151 .put myball1=ball x=0 y=100 blue=0
152 .put myball2=ball x=100 y=100 red=0
153
154 .frame 310
155 # the .qchange means, "interpolate to this position and frame, using quadratic splines".
156          .qchange myball1 x=50 y=0
157          .qchange myball2 x=50 y=100
158
159 .frame 320
160 # We could also use coordinates relative to start position: .change myball1 x+=100 y+=0
161          .qchange myball1 x=100 y=100
162          .qchange myball2 x=0 y=100
163
164 .frame 330
165          .qchange myball1 x=50 y=100
166          .qchange myball2 x=50 y=0
167  
168 .frame 340
169 # Hmmm. This frame is the same as frame 0. How to prevent duplicating that one?
170          .qchange myball1 x=0 y=100
171          .qchange myball2 x=100 y=100
172
173 # fading into existence/out of existence (colour xform):
174 # ------------------------------------------------------
175
176 # .put, .change, .qchange, .jump all support params which result in color transform.
177 # Everything up to the + is multiplicated, the rest summed.
178 # TODO: negative values should also be allowed.
179
180 .put obj1 blue=50% #(scale blue color component to 50%)
181 .change obj1 blue=128 #(same as above)
182 .change obj1 red=+25% #(shift blue color component by 25%)
183 .change obj1 red=+64 #(same as above)
184 .change obj1 green=50%+50% #(scale green color component to 50% and then shift it by 50%)
185 .change obj1 green=128+128 #(same as above)
186 .change obj1 green=-1+255 #(invert green color component)
187 .change obj1 green=2-128  #(reduce spectrum for green to the upper 50%)
188 .change obj1 luminance=50% #(fade all color components 50% to black, same as red=50% green=50% blue=50%)
189 .change obj1 alpha=50% #(make object 50% transparent)
190
191 # scaling
192 # -------
193
194 .change obj1 scale=50%   # change an object to 50% of it's size
195 .change obj1 scaley=50%  # flatten object to 50% of it's height
196 .change obj1 scaley=110% scalex=75% #(funhouse mirror!)
197
198 # rotating
199 # --------
200
201 .change obj1 rotate=45  # tilt object, counterclockwise
202
203 # TODO: we still don't have full control over the 2x3 object-placement matrix.
204 #       (As we only have one parameter for the two values on the primary diagonal) ActionScript
205 #       has the same problem, however.
206
207 # sprites
208 # -------
209
210 # synonym: submovie
211
212 .sprite spr1
213     .frame 1    .put ball1=ball 0 0
214     .frame 2    .change ball1 100 100
215 .end
216
217 .sprite spr2
218     .frame 1    .put ball2=ball 100 0
219     .frame 7    .change ball2 0 100
220 .end
221
222 .frame 400
223     .put spr1
224     .put spr2
225
226 # so spr1 has three frames, spr2 has seven. The whole animation loops after 21 frames.
227
228 # multi-level nesting: (sprites can be nested to any depth)
229
230 .sprite mspr1
231     .sprite mspr2
232         .sprite spr3
233         .put ball 100 0
234         .end
235     .end
236 .end
237
238 # clipping an animation inside a star-shaped sprite:
239
240 .shape mystar1 "star.swf"
241 .movie anim1 "penguins.swf"
242
243 .sprite cspr1
244     .startclip mystar1
245         .put anim1
246     .end
247 .end
248 .frame 401
249     .put cspr1 rotate=0
250 .frame 402
251     .change cspr1 rotate=360
252
253 # buttons
254 # -------
255
256 # create at minimum a Play button and a Stop button, maybe a Rewind also 
257 .png playlogo "Play.png"
258 .png stoplogo "Stop.png"
259
260 .button myplaybutton shape=playlogo
261 #everything till the .end is actionscript.
262     press:
263         play "spr1"
264 .end
265 .button mystopbutton shape=stoplogo
266     press:
267         stop "spr1"
268 .end
269
270 .put myplaybutton x=100 y=100
271 .put mystopbutton x=200 y=100
272
273 # The following examples drop the .end command. This is only possible
274 # if we keep the leading dot (.) in the command names. (Due to naming
275 # conflicts with Actionscript)
276
277 # button which is blue, get's green when the mouse hovers over it, and
278 # white when it is pressed:
279
280 .button b1 shape=blueshape over=greenshape press=whiteshape
281
282 # button where the button position is not identical to the active area:
283
284 .button b2 area=activearea shape=blueshape over=greenshape press=whiteshape
285
286 # (if area is not set, it's the same as shape)
287
288 # the above put into use: pop up a window if the mouse cursor enters a certain
289 # area:
290
291 .button b3 area=activearea shape=emptyshape over=window1 press=window1
292
293 # button characters also support positioning and cxforming characters.
294 # to use this, we put the characters "virtually", and then use the
295 # instances in the button
296
297 .buttonput area1=playlogo x=300 y=400 rotate=0
298 .buttonput shape1=playlogo x=400 y=400 rotate=0 red=50%
299 .buttonput over1=playlogo x=400 y=400 rotate=30 red=50%
300 .buttonput press1=playlogo x=500 y=500 rotate=180
301 .button mybutton1 area=area1 shape=shape1 over=over1 press=press1
302      #[...actionscript...]
303 .end
304
305 # fonts
306 # -----
307
308 #only supported via other tools (lib/examples/makefonts) at the moment.
309
310 .font font1 "myfont.swf"
311
312 # text fields
313 # -----------
314
315 #(these are scalable vector objects just like shapes)
316 .text mytext1 "I am a happy little scroll message" color=blue size=100% font=font1
317 #TODO: clipping
318
319 # edittext
320 # --------
321
322 #(field where the flash animation can get input from the user)
323
324 .font helvetica "helvetica-bold.swf"
325 .edittext edittext1 text="Type something here" color=blue maxlength=200 font=helvetica size=24 width=320 height=200
326 # width/height: dimensions of the box
327 # text: The text which appears initally in the box, and can be overwritten by the user
328 # maxlength: max. length of the text the user can type
329 # color/font/size: Font appeareance
330 # variable: Name of the actionscript variable the text is stored in
331 # The following boolean options are also supported:
332 # password (show input only as stars), wordwrap, multiline, html, noselect, readonly
333
334 # actionscript
335 # ------------
336
337 #simplified:
338
339 .action
340     stop spr1
341     setproperty spr1._visible 1  #TODO: spr1._visible=1?
342 .end
343
344 #full:
345
346 .action opcodes
347     settarget "spr1"
348     stop
349     settarget ""
350     push "spr1"
351     push _visible
352     push 1
353     setproperty
354     end
355 .end
356
357 #simplified:
358
359 .button playbutton2 shape=obj1 opcodes
360     press:   play spr1
361     release: stop spr1
362 .end
363
364 #full:
365
366 .button playbutton3 shape=obj1 opcodes
367     press:
368         settarget "spr1"
369         play
370         settarget ""
371         end
372     # [...]
373 .end
374
375 # todo: mx initaction, placeobject2 initclip
376
377 # depth control
378 # -------------------
379
380 # .put, .change, .qchange, .jump, .startclip take before and after parameters,
381 # which can be used to specify the depth of an object
382
383 .put o1=obj1
384 .put o2=obj1 below=o1 x=50
385 .frame
386 .change o1
387 .change o2 above=o1 x=50
388
389 # newline conventions
390 # -------------------
391
392 # All Newlines are treated as normal whitespace. Therefore, splitting
393 # commands over several lines, like
394 .put obj2=obj1 x=300
395              y=300
396              red=100%
397              green=50%
398              blue=50%
399 # is allowed.
400
401 # Furthermore, having more than one command in one line is also possible:
402
403 .frame 600  .change obj1 x+=700  .change obj2 x+=300
404 .frame 601  .change obj1 x+=500  .change obj2 x+=500
405 .frame 602  .change obj1 x+=300  .change obj2 x+=700
406
407 .end # end of first file
408
409 # ==================================================================================
410 #
411 # Ok, now for some actual examples
412 #
413 # ==================================================================================
414
415 # scroll1.sc
416 #
417 # This example scrolls a single line of text from the bottom to the top, with
418 # a background image
419 #
420
421 .swf bbox=200x200 fps=25 version=6 name="scroll1.swf"
422
423 .jpeg background "panorama.jpg"
424
425 .font helvetica-bold "helvetica-bold.swf"
426 .text title1 "I am a happy little scroll message" color=blue font=helvetica-bold size=100%
427
428 .put background x=0 y=0
429
430 .frame 1
431 .put obj1=title1 x=0 y=200     # As text box positions are specified at the upper left corner, this
432                           # places the text just below the bottom.
433 # (.put title1 is actually .put title1=title1 (i.e. the instance has the same name as the character)
434
435 .frame 200
436     #
437     # "change" moves the object to the new position, _interpolating_ in the frames between.
438     # Do we also need a command for abruptly changing position (omitting interpolation)?
439     #
440 .change obj1 x=0 y-=12     # Now move the text up until it disappears at the top, in 40 frames
441
442 # to scroll horizontally, we would have modified the x instead of the y coordinate, and scrolled to -200
443 # (assuming the text is < 200 pixels)
444
445 .end
446
447 # ==================================================================================
448
449 # scroll2.sc
450 #
451 # This example now also fades the text in and out again
452 #
453
454 .swf bbox=200x200 fps=25 version=6 name="scroll2.swf"
455 .jpeg background "panorama.jpg"
456
457 #create some text for a title and credits 
458
459 .font helvetica "helvetica-bold.swf"
460 .text title1 "ChooChoo Train" color=blue font=helvetica size=100%
461
462 # move from bottom to top. Fade it in on the way,
463 # then fade it out again.
464 # TODO: the following looks like fading only if the background is black. Add alpha channel support.
465 .put obj1=title1 x=0 y=200 luminance=0%
466 .frame 100
467     .change obj1 luminance=100%
468 .frame 200
469     .change obj1 y-=12 luminance=0%
470
471 .end
472
473 # simpleviewer.sc
474 #
475 # Create the simple_viewer.swf file used in SWFTools.
476
477 .swf bbox=1024x768 version=4 fps=25 name="simple_viewer.swf"
478 .frame 1
479 .shape leftshape "left.fig"
480 .shape rightshape "right.fig"
481
482 .sprite viewport
483 .end
484
485 .action
486     stop viewport
487     setvariable "/subtitle" ""
488 .end
489
490 .buttonput left=leftshape luminance=50%
491 .buttonput lefthover=leftshape luminance=75%
492 .buttonput leftpress=leftshape luminance=100%
493 .button leftbutton shape=left over=lefthover press=leftpress
494     release: 
495         previousframe viewport
496 .end
497
498 .buttonput right=rightshape x=20 luminance=50%
499 .buttonput righthover=rightshape x=20 luminance=75%
500 .buttonput rightpress=rightshape x=20 luminance=100%
501 .button rightbutton shape=right over=righthover press=rightpress
502     release: 
503         nextframe viewport
504 .end
505
506 .font arial "arial.swf"
507 .edittext subtitlebox width=826 height=160 color=black variable="/:subtitle" font=arial size=24
508
509 .put viewport
510 .put leftbutton
511 .put rightbutton
512 .put subtitlebox x=40
513
514 .end
515
516 # boxlayers.sc
517 # test "above"
518
519 .swf bbox=400x300 version=4 fps=50 name="boxLayers.swf"
520
521 .box box1 width=100 height=100 color=white fill
522 .box box2 width=100 height=100 color=white fill
523
524 .frame 0
525      .put box1 x=30 y=10 blue=0 red=0 luminance=50
526      .put box2 x=60 y=40 green=0 red=0 luminance=50
527 .frame 100
528      .jump box1 above=box2
529 .frame 200
530      .jump box2 above=box1
531 .end
532
533 # ---------------------- everything below this line should actually be working ----------------------
534
535
536 # boxes.sc
537 #
538 # Do things with rectangles.
539
540 .swf bbox=autocrop version=6 fps=50 name="boxes.swf" compress
541
542     .box box1 width=100 height=100 color=red fill #filled red box
543     .box box2 width=100 height=100 color=white    #white hollow frame
544     .box box3 width=100 height=100 color=green line=10 fill=blue #filled blue box, with thick green border
545     
546 .frame 0  
547         .put box1 x=30 scalex=30
548         .put box2 x=30 scalex=30
549         .put box3 x=30 scalex=30
550 .frame 100
551         .change box1 x+=300 scalex=100
552         .change box2 y+=300 scalex=100
553         .change box3 x+=300 y-=300 scalex=100
554 .frame 150
555         .del box1
556         .del box2
557         .del box3
558 .end
559
560 # monkey.sc
561 #
562
563 .swf bbox=autocrop version=4 fps=50 name="monkey.swf"
564
565     .shape island "island.swf"
566     .shape monkey "monkey4.swf"
567     .put island
568     .point leftfoot 45 177
569     .point rightfoot 138 177
570     .frame 0 .put monkey 160 160
571     .frame 20 .change monkey 160 160
572     .frame 30 .change monkey 160 122
573     .frame 35 .change monkey 160 112
574     .frame 40 .change monkey 160 122
575     .frame 50 .change monkey 160 160
576     
577     .frame 70 .change monkey 205 337 pin=leftfoot rotate=0 
578     .frame 90 .change monkey rotate=30
579     .frame 100 .change monkey rotate=30
580     .frame 120 .change monkey rotate=0
581     .frame 122 .change monkey 298 337 pin=rightfoot rotate=0
582     .frame 140 .change monkey rotate=-30
583     .frame 150 .change monkey rotate=-30
584     .frame 170 .change monkey rotate=0
585 .end
586
587 # cxform.sc
588 #
589 # Try color transforms
590
591 .swf name="cxform.swf" version=5
592     
593     .shape s1 "photo.swf"
594
595     .put s1 x=50 y=50 scalex=110 scaley=110
596     .frame 100
597     .change s1 x=0 y=0 scalex=210 scaley=210 red=-1+255 green=-1+255 blue=-1+255 #invert
598     .frame 200
599     .change s1 x=100 y=50 scalex=110 scaley=110 red=0 green=+0 blue=+0 #remove red
600     .frame 300
601     .change s1 x=0 y=0 scalex=210 scaley=210 red=+0 green=2 blue=-1+255 #amplify green, invert blue
602     .frame 400
603     .change s1 x=50 y=100 scalex=110 scaley=110 red=2-128 green=-2+255 blue=+0.7+40 #alien glow
604     .frame 500
605     .change s1 x=0 y=0 scalex=210 scaley=210 red=8-1024 green=8-1024 blue=8-1024 #palette reduce
606     .frame 600
607     .change s1 x=0 y=0 scalex=210 scaley=210 red=+0 green=+0 blue=+0 #back to normal
608     .frame 700
609     .change s1 x=105 y=105 scalex=0 scaley=0 luminance=0 #fadeout
610 .end
611
612 # transparency.sc
613 #
614 # Test transparency
615
616 .swf bbox=200x200 version=5 fps=25 name="transparency.swf"
617
618 .box box1 90 90 color=yellow fill=blue line=5
619 .box box2 90 90 color=white fill=red line=5
620
621 .put b1=box1 75 75 rotate=0
622 .put b2=box1 75 75 rotate=90
623 .put b3=box1 75 75 rotate=180
624 .put b4=box1 75 75 rotate=270
625 .put box2 30 30 alpha=100%
626 .frame 300
627 .change b1 rotate+=360
628 .change b2 rotate+=360
629 .change b3 rotate+=360
630 .change b4 rotate+=360
631 .change box2 alpha=0%
632 .end
633
634
635 # points.sc
636 #
637 # Test points, pivots, pins
638
639 .swf version=5 fps=20 name="points.swf"
640
641 .box box 90 90 color=white fill=red line=5
642 .point center 45 45
643 .point corner1 0 0 
644 .point corner2 90 0 
645 .point corner3 90 90 
646 .point corner4 0 90 
647
648 .put b1a=box x=90 y=90 pin=center
649 .put b1b=box x=90 y=90 pin=center alpha=50%
650 # OR: .put b1=box x=90 y=90 pin=(45,45) rotate=0
651
652 .put b2=box x=90 y=90 pin=corner1 alpha=75% blue=+128 red=0.2
653 .put b3=box x=90 y=90 pin=corner2 alpha=75% blue=+128 red=0.2
654 .put b4=box x=90 y=90 pin=corner3 alpha=75% blue=+128 red=0.2
655 .put b5=box x=90 y=90 pin=corner4 alpha=75% blue=+128 red=0.2
656
657 .frame 100
658 .change b1a rotate-=720
659 .change b1b rotate+=720
660 .change b2 rotate+=360
661 .change b3 rotate-=360
662 .change b4 rotate+=360
663 .change b5 rotate-=360
664
665 .end
666
667 # clipping.sc
668 #
669 # Test clipping
670
671 .swf name="clip.swf" fps=25
672     .sprite s1 # this just constructs a colorful object "s1"
673         .box b1 40 40 color=red fill=violet line=10
674         .box b2 40 40 color=blue fill=green line=10
675         .box b3 40 40 color=yellow fill=cyan line=10
676         .box b4 40 40 color=white fill=black line=10
677         .put b1 0 0
678         .put b2 60 0
679         .put b3 60 60
680         .put b4 0 60
681     .end
682
683     # the line and fill colors of the circle don't actually do anything-
684     # as it's used for clipping only it's shape matters
685     .circle c1 80 color=blue fill=green
686
687     .startclip c1 x=-160 y=-160 #c1 clips...
688         .put s1  # ...the sprite s1
689     .end
690
691 .frame 200
692     .change c1 x=160 y=160 # movement doesn't change the clipping property
693     .change s1 rotate=5
694
695 .end
696
697 # fonts.sc
698 #
699 # fonts&text
700
701 .swf name="fonts.swf"
702     .font courier "Courier.swf"
703     .font helvetica "Helvetica.swf"
704     .text abc text="abcdefghijklmnopqrstuvwxyz" font=courier size=100% color=blue
705     .text abc2 text="abcdefghijklmnopqrstuvwxyz" font=helvetica size=100% color=red
706     .put abc
707     .put abc2 y=200
708 .end
709
710
711 # shear.sc
712 #
713 # Shearing
714
715 .swf bbox=300x200:-30 name="shear.swf" fps=25
716     .font helvetica "Helvetica.swf"
717     .text text text="Shear" font=helvetica size=100% color=yellow
718     .put t0=text y=150 alpha=0% shear=0
719     .put t1=text y=150 alpha=0% shear=1
720     .put t2=text y=150 alpha=0% shear=2
721     .put t3=text y=150 alpha=0% shear=3
722     .put t4=text y=150 alpha=0% shear=4
723     .put t5=text y=150 alpha=0% shear=5
724     .put t6=text y=150 alpha=0% shear=6
725     .put t7=text y=150 alpha=0% shear=7
726     .put t8=text y=150 alpha=0% shear=8
727     .put t9=text y=150 alpha=0% shear=9
728     .frame 50
729     .change t0 alpha=40% shear=0
730     .change t1 alpha=40% shear=0
731     .change t2 alpha=40% shear=0
732     .change t3 alpha=40% shear=0
733     .change t4 alpha=40% shear=0
734     .change t5 alpha=40% shear=0
735     .change t6 alpha=40% shear=0
736     .change t7 alpha=40% shear=0
737     .change t8 alpha=40% shear=0
738     .change t9 alpha=40% shear=0
739     .frame 100
740     .change t0 .change t1 .change t2 .change t3 .change t4
741     .change t5 .change t6 .change t7 .change t8 .change t9
742     .frame 150
743     .change t0 alpha=0% shear=-9
744     .change t1 alpha=0% shear=-8
745     .change t2 alpha=0% shear=-7
746     .change t3 alpha=0% shear=-6
747     .change t4 alpha=0% shear=-5
748     .change t5 alpha=0% shear=-4
749     .change t6 alpha=0% shear=-3
750     .change t7 alpha=0% shear=-2
751     .change t8 alpha=0% shear=-1
752     .change t9 alpha=0% shear=-0
753 .end
754