Some funky waves:
(The following can probably be neater but I'm just dropping the idea here)
DynamicModule[{a, b, imgs, drange, str, n = 6, export},
drange[it_, d_] := Range[Pi/(d/it), Pi*it, Pi/(d/it)];
str = ToUpperCase /@ StringSplit["This is some text!", ""];
Panel@Column@{
Row@{Slider[Dynamic[a], {-2, 2, .1}], Dynamic[a]},
Row@{Slider[Dynamic[b], {-2, 2, .1}], Dynamic[b]},
Row@{Slider[Dynamic[imgs], {3, 6}], Dynamic[imgs]},
Dynamic@Row[Text@
Style[#, #3, #2*20] & @@@ (Thread@{str, ((Sin[a*# + b] + 2) & /@ N@drange[n, Length@str]),
Hue[Length@str/#] & /@ Range@Length@str}),
ImageSize -> imgs*100],
Dynamic@Plot[Sin[a*x + b], {x, 0, n*Pi}],
Button["Export to GIF", export[a, imgs]]},
Initialization :> (export[a_, imgs_] := Export["~/test.gif",
Table[Row[Text@
Style[#, #3, #2*20] & @@@ (Thread@{str, ((Sin[a*# + b] + 2) & /@ N@drange[n, Length@str]),
Hue[Length@str/#] & /@ Range@Length@str}),
ImageSize -> imgs*100], {b, 0, 2 Pi, Pi/20}],
"DisplayDurations" -> .1])]

(And yes, the colours are ugly as well :D)
Clicking on Export to GIF
results in:

By using Framed[Style[#, #3, #2*20], RoundingRadius -> 100] &
as Yves mentioned you can have the less fancy text on earth:

And without text:

And with colours:

Style
. $\endgroup$