#
#   This file was written by James Lehman.
#   creator of LaserBoy,
#
#   the free, multiplatform laser display application
#   that reads this format.
#
#   <james@akrobiz.com>
#   Extra Stimulus Inc., Akron, Ohio USA
#   http://laserboy.org/
#
#   ASCII format version: LaserBoy-txt-07-26-2020
#

#############################################################################################
#############################################################################################
#
#   Copy the following header for txt files for version: LaserBoy-txt-07-01-2020
#
#############################################################################################
#
#     pendulum position P1(t) =
#     P1.amplitude * sin(t * P1.frequency + P1.phase) * e^(-P1.damping * t) + P1.offset
#
#     frequency_mod P1(t) ~~ P2(t) =
#     P1.amplitude * sin(t * P1.frequency * P2(t) + P1.phase) * e^(-P1.damping * t) + P1.offset
#
​# math still_frames (value)
#     is the introduction to the animated
#     LaserBoy math forms. It is an integer
#     number of frames to be added to the
#     LaserBoy frame set that are all the
#     same frame as described in a single
#     frame math form. This is for setting
#     and holding a single frame for multiple
#     frames of time. This is a file scope
#     setting only. It applies to all single
#     frame forms that follow its definition.
# math still_frames 1
#     is the default setting; each form 1 frame.
#
# math iterations (value)
#     is the number of calculated vertices in each
#     form frame. The result is a set of consecutive
#     vectors.
# math iterations 100
#     is the default value.
#     Iterations must be defined in each form. If the
#     value in the form is set to -1, iterations is
#     taken from this file scope value.
#    
# math frames (value)
#     is the number of frames to calculate for an
#     animated math form.
#
#     frames must be defined in each form. If the
#     value in the form is set to -1, frames is
#     taken from this file scope value.
# math frames 2
#     is the default value.
#
#     phase is in degrees, radians, 0.0 to 1.0
#     (value) is what gets used in the math code.
#     (value) = phase * (two_pi / one_rotation).
#     (value) is therefor always in radians.
# math one_rotation  360.0
#     is the default value. Text values are in degrees.
# math one_rotation  6.28318530718
# math one_rotation  1.0
#     are two other convenient values.
#
#     duration is orbiting the unit circle (time).
#     In all of the periodic forms, given the right
#     values, the end of the curve will join perfectly
#     with the start. This often takes multiples of 2pi.
#     (value) is what gets used in the math code.
#     (value) = duration * (two_pi / one_period).
#     (value) is therefor always in radians.
# math one_period  6.28318530718
#     is the default. Text values are in radians.
# math one_period  1.0
#     is a convenient value. 0.0 to 1.0 is one whole
#     orbit around the unit circle.
#
#############################################################################################
#############################################################################################

math one_rotation  360.0
math one_period    1.0
math iterations    2400
math frames        120
math still_frames  1

#----------------------------------------------
#             single frame forms
#----------------------------------------------

#----------------------------------------------
#   https://en.wikipedia.org/wiki/Rhodonea
math rhodonea 255 0 0
#   radius  pedals_numerator  pedals_denominator
    1.0     5.0               7.0
#   start  duration  iterations
    0.0    3.5       -1

#----------------------------------------------
#   https://en.wikipedia.org/wiki/Epicycloid
math epicycloid 255 255 0
#   fixed_radius  roller_radius
    3.0           13.0
#   start  duration  iterations
    0.0    13.0      -1

#----------------------------------------------
#   https://en.wikipedia.org/wiki/Epitrochoid
math epitrochoid 255 0 127
#   fixed_radius  roller_radius  roller_offset
    3.0           4.0            6.0
#   start  duration  iterations
    0.0    4.0       -1

#----------------------------------------------
#   https://en.wikipedia.org/wiki/Hypocycloid
math hypocycloid 0 255 255
#   fixed_radius  roller_radius
    12.0          5.0
#   start  duration  iterations
    0.0    5.0       -1

#----------------------------------------------
#   https://en.wikipedia.org/wiki/Hypotrochoid
math hypotrochoid 127 0 127
#   fixed_radius  roller_radius  roller_offset
    12.0          5.0            15.0
#   start  duration  iterations
    0.0    5.0       -1

#----------------------------------------------
#   https://en.wikipedia.org/wiki/Lissajous_curve
math lissajou 0 0 255
#   amplitude  frequency  phase
    1.0        1.0        0.0
    1.0        1.0        90.0
#   duration  iterations
    1.0       -1

#----------------------------------------------
math pendulum 255 255 255
#   x(t) = t
#   y(t) = P1(t)
#   amplitude  frequency  phase  damping
    1.0        1.0        0.0    0.0
#   duration  iterations
    1.0       -1

#----------------------------------------------
math pendulum_sum 0 255 0
#   x(t) = t
#   y(t) = P1(t) + P2(t)
#   amplitude  frequency  phase  damping
    1.0        1.0        0.0    0.0
    0.5        10.0       0.0    0.0
#   duration  iterations
    1.0       -1

#----------------------------------------------
math pendulum_xy 0 0 255
#   x(t) = P1(t)
#   y(t) = P2(t)
#   amplitude  frequency  phase  damping  offset
    1.0        2.05       120.0  0.02     0.0
    1.0        1.0        12.0   0.01     0.0
#   duration  iterations
    17.0      -1

#----------------------------------------------
math pendulum_xyz 128 0 128
#   x(t) = P1(t)
#   y(t) = P2(t)
#   z(t) = P3(t)
#   amplitude  frequency  phase  damping  offset
    1.0        30.1       0.0    0.22     0.0
    1.0        20.0       120.0  0.05     0.0
    1.0        40.3       0.0    0.3      0.0
#   duration  iterations
    1.0       -1

#----------------------------------------------
math harmonograph 255 0 0
#   https://en.wikipedia.org/wiki/Harmonograph
#   x(t) = P1(t) + P2(t)
#   y(t) = P3(t) + P4(t)
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        7.0        0.0    0.0      0.0
    2.1        0.05       90.0   0.0      0.0
#   Y
    1.0        7.2        0.0    0.0      0.0
    2.1        0.05       0.0    0.0      0.0
#   duration  iterations
    20.0      -1

#----------------------------------------------
math harmonograph_3D 127 255 0
#   https://en.wikipedia.org/wiki/Harmonograph
#   x(t) = P1(t) + P2(t)
#   y(t) = P3(t) + P4(t)
#   z(t) = P5(t) + P6(t)
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        6.0        0.0    0.0      0.0
    2.1        0.05       90.0   0.0      0.0
#   Y
    1.0        6.1        0.0    0.0      0.0
    2.1        0.05       0.0    0.0      0.0
#   Z
    1.0        6.0        0.0    0.0      0.0
    2.1        0.10       0.0    0.0      0.0
#   duration  iterations
    20.0      -1

#----------------------------------------------
math amplitude_mod 255 255 0
#   x(t) = t
#   y(t) = P1(t) * P2(t)
#   amplitude  frequency  phase  damping  offset
    1.0        100.0      0.0    0.0      0.0
    1.0        1.0        0.0    0.0      1.0
#   duration  iterations
    1.0       -1

#----------------------------------------------
math amplitude_mod_xy 255 255 0
#   x(t) = P1(t) * P2(t)
#   y(t) = P3(t) * P4(t)
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        60.0       0.0    0.0      0.0
    1.0        1.0        0.0    0.0      1.0
#   Y
    1.0        60.0       90.0   0.0      0.0
    1.0        1.0        90.0   0.0      1.0
#   duration  iterations
    1.0       -1

#----------------------------------------------
math amplitude_mod_xyz 200 0 127
#   x(t) = P1(t) * P2(t)
#   y(t) = P3(t) * P4(t)
#   z(t) = P5(t) * P6(t)
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        50.0       0.0    0.0      0.0
    1.0        50.3       0.0    0.0      0.70
#   Y
    1.0        50.0       60.0   0.0      0.0
    1.0        50.7       90.0   0.0      0.70
#   Z
    1.0        50.0       90.0   0.0      0.0
    1.0        50.9       0.0    0.0      0.70
#   duration  iterations
    0.5       -1

#----------------------------------------------
math frequency_mod 255 255 0
#   x(t) = t
#   y(t) = P1(t) ~~ P2(t)
#   amplitude  frequency  phase  damping  offset
    1.0        10.0       0.0    0.0      0.0
    0.50       1.0        0.0    0.0      2.0
#   duration  iterations
    1.0       -1

#----------------------------------------------
math frequency_mod_xy 255 255 0
#   x(t) = P1(t) ~~ P2(t)
#   y(t) = P3(t) ~~ P4(t)
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        3.0        0.0    0.0      3.0
    0.20       13.0       0.0    0.0      0.0
#   Y
    1.0        2.0        90.0   0.0      3.0
    0.20       13.0       90.0   0.0      0.0
#   duration  iterations
    1.1       -1

#----------------------------------------------
math frequency_mod_xyz 255 255 0
#   x(t) = P1(t) ~~ P2(t)
#   y(t) = P3(t) ~~ P4(t)
#   z(t) = P5(t) ~~ P6(t)
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        0.10       0.0    0.0      3.0
    0.20       20.0       0.0    0.0      0.0
#   Y
    1.0        0.10       180.0  0.0      3.0
    0.20       20.7       00.0   0.0      0.0
#   Z
    1.0        0.10       180.0  0.0      3.0
    0.20       21.40      0.0    0.0      0.0
#   duration  iterations
    2.0       -1

#----------------------------------------------
#            animated frames forms
#----------------------------------------------

#----------------------------------------------
#   https://en.wikipedia.org/wiki/Rhodonea
math rhodoneas 255 255 255
#   radius  pedals_numerator  pedals_denominator
    1.0     7.5               8.0
#   radius  pedals_numerator  pedals_denominator
    1.0     8.5               8.0
#   start  duration  iterations  frames
    0.0    16.0      -1          -1

#----------------------------------------------
#   https://en.wikipedia.org/wiki/Epicycloid
math epicycloids 255 0 127
#   fixed_radius  roller_radius
    6.95          12.0
#   fixed_radius  roller_radius
    7.0           12.0
#   start  duration  iterations  frames
    0.0    36.0      -1          -1

#----------------------------------------------
#   https://en.wikipedia.org/wiki/Epitrochoid
math epitrochoids 127 0 255
#   fixed_radius  roller_radius  roller_offset
    5.0           1.0            -11.0
#   fixed_radius  roller_radius  roller_offset
    5.0           1.0            11.0
#   start  duration  iterations  frames
    0.10   1.0       -1        -1

#----------------------------------------------
#   https://en.wikipedia.org/wiki/Hypocycloid
math hypocycloids 255 255 0
#   fixed_radius  roller_radius
    30.0          20.0
#   fixed_radius  roller_radius
    30.0          19.7
#   start  duration  iterations  frames
    0.25   22.0      -1          -1

#----------------------------------------------
#   https://en.wikipedia.org/wiki/Hypotrochoid
math hypotrochoids 127 255 127
#   fixed_radius  roller_radius  roller_offset
    6.4           13.0           11.0
#   fixed_radius  roller_radius  roller_offset
    6.6           13.0           11.0
#   start  duration  iterations  frames
    0.25   26.0      -1          -1

#----------------------------------------------
#   https://en.wikipedia.org/wiki/Lissajous_curve
math lissajous 63 63 255
#   amplitude  frequency  phase
    1.0        5.0        0.0
    1.0        7.0        0.0
#   amplitude  frequency  phase
    1.0        5.0        0.0
    1.0        7.03       180.0
#   duration  iterations  frames
    6.0       -1          -1

#----------------------------------------------
math pendulums 255 127 0
#   x(t) = t
#   y(t) = P1(t)
#   amplitude  frequency  phase  damping
    3.14       1.0        0.0    0.0
#   amplitude  frequency  phase  damping
    3.14       30.0       0.0    1.0
#   duration  iterations  frames
    1.0        -1         -1

#----------------------------------------------
math pendulums_sum 255 127 0
#   x(t) = t
#   y(t) = P1(t) + P2(t)
#   amplitude  frequency  phase  damping  offset
    1.5        1.0        0.0    0.0      0.0
    0.0        33.0       0.0    0.0      0.0
#   amplitude  frequency  phase  damping  offset
    1.5        3.3        0.0    0.0      0.0
    1.5        33.0       0.0    0.0      0.0
#   duration  iterations  frames
    1.0       -1          -1

#----------------------------------------------
math pendulums_xy 0 255 255
#   x(t) = P1(t)
#   y(t) = P2(t)
#   amplitude  frequency  phase  damping  offset
    1.0        3.0        0.0    0.0007   0.0
    1.0        5.011      180.0  0.0007   0.0
#   amplitude  frequency  phase  damping  offset
    1.0        3.0        0.0    0.06     0.0
    1.0        5.0        0.0    0.06     0.0
#   duration  iterations  frames
    15.0      -1          -1

#----------------------------------------------
math pendulums_xyz 128 0 128
#   x(t) = P1(t)
#   y(t) = P2(t)
#   z(t) = P3(t)
#   amplitude  frequency  phase  damping  offset
    1.0        3.0        0.0    0.005    0.0
    1.0        4.0        90.0   0.005    0.0
    1.0        10.0       0.0    0.005    0.0
#   amplitude  frequency  phase  damping  offset
    1.0        3.0        0.0    0.01     0.0
    1.0        4.02       110.0  0.015    0.0
    1.0        10.0       0.0    0.01     0.0
#   duration  iterations  frames
    12.0      -1          -1

#----------------------------------------------
math harmonographs 255 0 0
#   https://en.wikipedia.org/wiki/Harmonograph
#   x(t) = P1(t) + P2(t)
#   y(t) = P3(t) + P4(t)
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        1.5        0.0    0.0      0.0
    1.13       0.05       90.0   0.0      0.0
#   Y
    1.0        1.5        90.0   0.0      0.0
    1.13       0.05       0.0    0.0      0.0
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        1.5        0.0    0.024    0.0
    1.13       0.05       90.0   0.02     0.0
#   Y
    1.0        1.5        90.0   0.024    0.0
    1.13       0.05       0.0    0.02     0.0
#   duration  iterations  frames
    40.0      -1          -1

    #----------------------------------------------
math harmonographs_3D 127 255 0
#   https://en.wikipedia.org/wiki/Harmonograph
#   x(t) = P1(t) + P2(t)
#   y(t) = P3(t) + P4(t)
#   z(t) = P5(t) + P6(t)
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        6.0        0.0    0.0      0.0
    2.1        0.05       0.0    0.0      0.0
#   Y
    1.0        6.0        30.0   0.0      0.0
    2.1        0.05       0.0    0.0      0.0
#   Z
    1.0        6.0        0.0    0.0      0.0
    2.1        0.15       0.0    0.0      0.0
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        6.0        0.0    0.0      0.0
    2.1        0.05       120.0  0.0      0.0
#   Y
    1.0        6.2        0.0    0.0      0.0
    2.1        0.05       0.0    0.0      0.0
#   Z
    1.0        6.0        0.0    0.0      0.0
    2.1        0.10       0.0    0.0      0.0
#   duration  iterations  frames
    20.0      -1          -1

#----------------------------------------------
math amplitude_mods 0 200 0
#   x(t) = t
#   y(t) = P1(t) * P2(t)
#   amplitude  frequency  phase  damping  offset
    1.0        20.0       0.0    0.0      0.0
    1.0        1.0        0.0    0.0      1.0
#   amplitude  frequency  phase  damping  offset
    1.0        20.0       0.0    0.0      0.0
    1.0        1.0        180.0  0.0      1.0
#   duration  iterations  frames
    2.0       -1        -1

#----------------------------------------------
math amplitude_mods_xy 0 127 255
#   x(t) = P1(t) * P2(t)
#   y(t) = P3(t) * P4(t)
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        60.0       0.0    0.0      0.0
    1.0        1.0        0.0    0.0      1.0
#   Y
    1.0        60.0       90.0   0.0      0.0
    1.0        1.0        90.0   0.0      1.0
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        60.0       0.0    0.0      0.0
    1.0        1.0        0.0    0.0      1.0
#   Y
    1.0        60.0       270.0  0.0      0.0
    1.0        1.0        90.0   0.0      1.0
#   duration  iterations  frames
    1.0       -1          -1

#----------------------------------------------
math amplitude_mods_xyz 200 0 127
#   x(t) = P1(t) * P2(t)
#   y(t) = P3(t) * P4(t)
#   z(t) = P5(t) * P6(t)
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        70.0       0.0    0.0      0.0
    1.0        70.4       70.0   0.0      0.350
#   X
    1.0        70.0       60.0   0.0      0.0
    1.0        70.6       90.0   0.0      0.350
#   Y
    1.0        70.0       90.0   0.0      0.0
    1.0        70.8       0.0    0.0      0.350
#   amplitude  frequency  phase  damping  offset
#   Z
    1.0        70.0       90.0   0.0      0.0
    1.0        71.2       20.0   0.0      0.650
#   Y
    1.0        70.0       100.0  0.0      0.0
    1.0        72.6       90.0   0.0      0.650
#   Z
    1.0        70.0       200.0  0.0      0.0
    1.0        73.3       0.0    0.0      0.650
#   duration  iterations  frames
    0.15      -1          -1

#----------------------------------------------
math frequency_mods 0 160 0
#   x(t) = t
#   y(t) = P1(t) ~~ P2(t)
#   amplitude  frequency  phase  damping  offset
    3.0        0.3        0.0    0.0      0.0
    0.350      3.0        0.0    0.0      2.0
#   amplitude  frequency  phase  damping  offset
    3.0        0.3        180.0  0.0      0.0
    0.350      3.3        0.0    0.0      2.0
#   duration  iterations  frames
    2.0       -1          -1

#----------------------------------------------
math frequency_mods_xy 255 255 255
#   x(t) = P1(t) ~~ P2(t)
#   y(t) = P3(t) ~~ P4(t)
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        1.0        0.0    0.0      3.1
    0.20       7.0        0.0    0.0      0.0
#   Y
    1.0        1.0        0.0    0.0      3.1
    0.20       7.0        90.0   0.0      0.0
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        1.0        360.0  0.0      3.1
    0.20       7.0        0.0    0.0      0.0
#   Y
    1.0        1.0        360.0  0.0      3.1
    0.20       7.0        90.0   0.0      0.0
#   duration  iterations  frames
    1.0       -1          -1

#----------------------------------------------
math frequency_mods_xyz 255 255 0
#   x(t) = P1(t) ~~ P2(t)
#   y(t) = P3(t) ~~ P4(t)
#   z(t) = P5(t) ~~ P6(t)
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        0.10       0.0    0.0      3.0
    0.20       20.0       0.0    0.0      0.0
#   Y
    1.0        0.10       180.0  0.0      3.0
    0.20       20.7       00.0   0.0      0.0
#   Z
    1.0        0.10       180.0  0.0      3.0
    0.20       21.4       00.0   0.0      0.0
#   amplitude  frequency  phase  damping  offset
#   X
    1.0        0.10       0.0    0.0      3.0
    0.20       20.0       0.0    0.0      0.0
#   Y
    1.0        0.10       180.0  0.0      3.0
    0.20       20.7       360.0  0.0      0.0
#   Z
    1.0        0.10       180.0  0.0      3.0
    0.20       21.4       360.0  0.0      0.0
#   duration  iterations  frames
    2.0       -1          -1

###############################################
###############################################
