     @@                 0 @ P ` p                        p ` P @ 0     0                p     p ` P @ 0          @`                 0 @ P ` p                        p ` P @ 0                                  p ` P @ 0          @                 0 @ P ` p                        0 @ P ` p                        p ` P @ 0          @                 0 @ P ` p           2  0                                             ? .@rP`׃_紂oM;	):\~J8kYzWyFBvRsRb>N
֣p^<*:Km[k[|I'>P-aq-p=
״pn]LLLL]n9}k'%y$ߛh5 !Cu1A..O>`=
ţ)[9l'|I&|.?a>؂-ؓN
ƒ_<	ţ9m9I'&HF͊g4#  "Cv/dbb>N
ƓpM;	):\~)l8'IjYѦ.?PrOO`,_<Jml|YXzh$ଉgE433CTvRR/.O=`,ִ)\J8I{Y87@@Pb-aa,ד_赒p^<+*;\~[I|{6ЋFޫgVUUf1/bb-ׂ=_<	)Km(l98j7bbr-P>_
Ƃ_+ִnnnK'|8&6ii$Ϋ!dR/.>rǂN紒on]]n~KJ8IjYYj.P-r,׃N
Ɠ`M:l[|Yi5ЛW#޼ S0bQrPǓo<
JmJ'|'Y'&bQ@Qb-a`׃_赒p^L;***;Km[J%hΊFCS.O_פ^M;*)*;LmJ[[&jHHHY0..OrP
`,p=Ŵ9l9ZHY6yE#!Cu0A?@r-ד_ţpKJ8I{jj{sbbs.aPr=
ƣp^<*)Km98%i$߫xE3""CeSsbrPƂ_,	)[~(lZk8%GtR@@@a-aa,`=
ţp[(YHiWޛxVEDDTe0u0>؃>łoM+);\J'|'I'&XsA?..?P-q,׃N
ףp^<	:\986Њ6ΫwffvSR??aa,Œpn]LL\]~9m98Z7%6Xs@..P>؃>qNţpK'YXzy5޻1utQQ=_+ƴ([ZIk8&&7Y%t@sss-PO`,贁_<*	:\~8}8Gh$̻ S0sPƂ^+	)K~(lZ{H'&&7Y%t@tbQQb-P
Pǒ_+ִpJ'ZY%ЛW$BuR/?؃=_<*:\~JlY7&&7Y%i/0sA???Psaq=łoM+	)K}(}8%hΊV4   2d uA@a`,赒pn]M\]n(l88jH77Hi&i/0b??raד_+ţpn~9}|Yi6V4#"2CeBsr>_,ִ)[[Z|ZHHY{Gz%/t/AbQQb-aq,q^+	)\k'&y$ଉgUUUe t?.aדo<:l9'|8|jj{&X6cc/Q/?aP
q=	֣o]LLL\m[kHYW߬xwwRR@aPפo]LLL\m9}Zk86X%iiBARb@@PbONqNִ([9|%z5޼1u/N_,ִKJI{YHXj%XGW/tct@sbs>aq=^<:m'|8&XW$!dR?@=q^<):\~J8Y'7iG6G1 0R/-P>_+赒p^MLL\m[kYzϊF# !S s-ׂ=
ִ9l9I|jjj%X66WuB1Ac0.?aPƂNţJ86hE#2Tc0Or,דo<	)KmJIkH77X{XFGy1uRAAc@...Orq,pMJ}Z'&iΚgE43CTAs-q=ƣp9}Jk7&HzXWi$Л1uRAAsA/.>P-؃N
ƒoM+*K}(YX5༉gfUf u@Orד_<)K}'lk'Gziy$ЛW1RAAsA?.?Q>_贒p^]L]m[{{W߬S-q-ţpK'|'{jjG%Њ5GΊFBSAAsA??Oa_
q=
紣J8%y5޼BQ@rǂ_<:\98kIHY{XFWy5yFdBSBRtQ0?Psaדo<
:}Z7HW2u/-a,赒(\9Z7&6HzXWi$h$yBu d tSc/bQQb>؃NƒoM+*):K}8jzyE 2eR@aƁN+	)\JZ6iXhߊFΊW1dBB/t/t0crPq<ƣnnl&6h5#"2d0Pףo^]m~[IkYYi%XXi$W$yF2e1u tBAc0-@>`=
)\Z7iΊgEDDec0P_,9l9I&6iGGi$h5Λg4SvBu d1/u0cQ@Q-r-贁^<+**:K}8{6Ὁwfv1s=pM;***;\(}'ZHHj6z%ߊ5h$y5߬yV#!T1u1dt@>aq=
ִ9}86i：c/.a,贒(lZ{{%XGhߛW߫h5߼W42d SB/dc/cQaaדo<)K|jG̻1QQ_+)['|87ziz5y5Κg4ެg52Tv!T1d1ut/Q??Orq=ƣk'6z5 dt-ד_<:\IZ'&&H%z%ЋFΊF߬yFΫV4v Cu1dS0 A.?r-ؓo<:}|zh4  !C/_
ƒp^]]nkk8&7X%Њ%WΚW#ཊW4߼xV42TvCvSSAAss>N
֣o~k'GgE#2CeR@r=ţ9}|H77Y5Њ5WߛW$͚g5ͫgE#Tv!Cv!TBSRbQrOqM:}|{ϚgUUetbP+)[(I77Y5Њ5Wߛg$ΛhE޼xV4#2Te CuBu1d/R@@b`,贒po~k7XΚxw0-ׂ^<*K~9Z8GY6Њ5Wߛh4ޫxV#ͫgV4#Dev2TvCv d1/A/.?qǂ^+	9l|6ͫS/Po^]m~[kHHi6Ћ6h$x5）g5޼wVD# !3Tv2dSB0As-r-赂nn~Z7i$1uQ=ţ9}|ZYzGFy5V#ΫyV4ͫgVE2CTev2TvCv d10bAQs,ǂN[{GS`<	9lI{{%XhߊV߬yFΫgE#ͻw2Cev Cu1u1/t0.aד`]LK\}I7zE"!Bu0Op^LL\~|7%G%Њ6yE߫yV#ＪgE4"ͼ !2CTev!CeBv0uStQ@aPţ(jhE3Ceb-ţ[kHXzXy5yFｚhE#ݼwfUD3" DTUefw"CeCv S00ts>_,	9l%ߚgff/-q=	:mIXGy5Κg4ͫgE# ͼxwg !2Dew CuBRR/-Pƒo]L\~IX򽚈caƒpJjYjGWΚW#͚xE#ݼwfUD3"   !"3TevBe Sdc0.?r=ţ'|z߼1P+)\Z'6XGi4W4ｚgE3ͼ   !""3CDUev2Tv1d tt@?P_JF da
on~Z%Xhߛh4ޫW4"ݼxgfUED433#""""DDDDDDDDDTUUfvw !Ce2e tt@?Q
qM+)K}8h# S_9l|j%iߊF߬yV#ͫxfU4#" ݈wwwwwwwwwww!2TvBu utA@aƒo^]~ZF#"Cbon'|YY%ЋFΊW$޼wV4"̻̻ !2DeCv utA@r-贒hETu._JI7XFy5ޫyV4ͼwgfUUEDDDDDDDDDDDUUe  !"CTe!S1utQQN
J&ϊwwbqnnI&Xh$yF#޼wVE4#     "ffUED433""""!""23CDUfwBeB/bb`=**K}Hᬙ0O
[{hϊV͚xV4"̼̻xwwwfffffffww!Ce SAs-דpo{޼co]]~ZHii$༉V$ͻwfVED433#""""2333CDDUUfvwVED3#" "CTvBc/_
961>ųJXy5߼gE4̼ "2CDU̻wgfVUED43333#23333DTUfw!SAR@N+*:}i#!cr=**KIXFV#޼xgVUD4333#"33333DDUUffwxgVUD3" ̻2Tv1/-ףF3C|y$gE#ͼ !"3DUfvwfUD3" ̼xwffUUDD433333CDDUev!StQr,ZyVe?I6W：xVD#   "23DTefw "3VD3"ͼxgVED3"  2Ce1u?.ǂonxb,*l7Hh4޼wfUED433333DDTUefvw "3DUfE4"̻xgVE4#̼xwwww1d -IЫomHXyE޼xwwwww"3Dev"3TE4#̫wfE4#̻xwfUED433""""233DUvBbom/ǢIXV#ͼ"3DUfw !2CUvVE3ͻxfE4# ͼwfUD3# 2TRP
YQZYW4 "3CTev!3Tev2CUxVE3̫gVD#ͼxgVD3" ͼ1u?qn%s,)kYΊgE3"""3CTefw"CTfw!3TewxfE3̫xgU4#ݼxgUD# ݼwfVUDDDDDDUf -iDo~iΛxfUDDDDDTUfvw!3Dev2Dev"CTvxfE3 ݼxfE3̫xgU4#̫wfUD3" !S^fȢj߼!3Dev!2Dev2CUv2wVD#ͻgU4#ͫgU4#ͼwVE4"̻A{%!2CUf"CTv!CTv"CUv̫xfE3 ݼgV4#ͫxgE4"̫xgE4"ͻwfE4#"B=MW4"""3CTev2Dev2Dew !3Tf"CUv̫xfE3ͼgV4"̫xfE#ͼgV4#ͫxgE4"ͻ!2Dew !3Tf2Cev!3Tf2CevgV4#̫xfE3ͼgU4"̫xVE#ͻgU4޼wVD# 2Te"CUv!2Tf2Cev !3Tf2DewwVD#ͫxgE4ݼwVD#ͫxgE4޼xVE# ݼwgw㼪!CTf"CUv2De!CTv2TeˉgV4#ͫxfE3 ݼwVD#ͼgV4#ͼxfE4" cngfefvw"CUv!CTv2Cev!2TefE3 ݼxVE#ͼwVD#ͼxfE3ͼwfUD43333DeJyE3"!""3DTev"CTf !2Te !3Tf!C4#ͻgU4#ͻgVD# ݼgVD3ͼ1N*f8i5 "3DUfw2CUv !3Te !3Te ݼxfE4ͻwVE3ͼxgVE4# C0أGC'i4̻ "CTev!3Tew2CUvͼxfE3ͼxfU4# ͼxgVUD43""!"2CTvca,*|$!_m&i$޼!3DUf !2Dev !3TeݼxgU4# ̻xfUD3̻wwgfffww Ss7s,J&h$ͫwfVUUUUUUefvw "CTev"CTfͼxgUD#ݼxgVE4#" !SvA_+:}@(X߼gU43"""33DTefw "CTew"CͼxgVE3" ̻xwfUED433""""""23CTewCA@ų8ϫ|GΚgE# !"3DUfw!2DUv ͼxfUD4# ̼2TAs`M\xM;\Z%h5̫wwwwww "3DUfw UD#̻xgfUED43"""!"2CTew1uR?PJyUu@	[7Xy5߼xfUD3""""23CDUefw "3TewfVE4#" ̼"Cu1u/-דF3C%y5͚gE#̻ !2CTUfw ͼxwgfVUUEDDDDDDTUUfv2eSca_<*K}j$ca,J}8Gz%h5ͫxfUD3#"""""33CDUefwwgfUED3#"    "3DUvBu1Q@r,JG0-ף(j%ЋF߬V4 ̻ !" ̼ 2De!d @?P
ƣ߼RrM+*K'&z%h5ͫgU4#  !"3CDU̻wwww2Tv S u0.Op^]mj򽚙-责k77iy5ΚgEͫwgVUDD4333333333CDDTUefvwxwwffVUUUDDDDDDTUUefvw!CeS/t0.>؃N+:}HЛxwAقN;:KmZHiWΊFཚxV4ͼ33#""""""33DTef2TS/t0.q=JyEDe-责Ijj6Wߛh5ͫxVE3"   !2CTev!CvC/t0-`פ|V#"2u@؂^<*;\({%z$ЛW$gE#ͼxgVUD43#""!"" "CTv2eBt/O^]]~Yz$B=ų(|76iy5yFͫgE#ͼwwwwwffwwfffffvwww2De S1ucs-ׂ^+	:}'GS@oM;Km|HHzhϊF߬V$ͫxgUD3" !""23CDUev2T!dSAcQbPų9%༫ N
9}'{%iy5FͫVD#ͻxwfVUUDDD4 !2CUv!Ce!d utA?Or,褁onnZY򽚈RQonn(}H7Hz$z5h4ΛxE#ͫxfE4#UUffw!2Tv!T dAAs>o<:}&%ߛgff/-q=:lIGFh$W$߼xV4#ͼxwff "3Tev2T1e dBc@?P_״(|jhE3Cec=ų(l|Yi%iϊFΊW#ΫyV4ͻwfUD3#fw2DeCuBSRcsO^<**;\8&y5!C@Po^]n9Y7GiWh$h5ޫyV$ͻxgE4#  "CTf2T2u dBR/-O_ų9jF c-ǂN+:\|8&6XFWΚWཊg4ͫgV4#̼fw2Tv2d1uB0R0?P>q^L;;Km8&X1b_9mZ'&X6GΊF߬yF#޼xV4ͻ !2Tv2dSB/u/bQQ-ׂNųJZz$༪d@r,贒[I&&X6FΉFޫxEͫgE#̫ev!Ce2eSdc/sbaדp^<;;L}9GxwA.Oo]L]n9I%X6FyEޛh5ｚxV4ͫ2Tv1d ddBR/P`<	ĳJZigUUf/-ǂ^,	)Km'|8%H6Fy5Κg4޼gE#ͫv2eCv dA1R?..PO
ƒoM<;;\~9%ߊW4#2Cuca_+J}k'G5ЋFy5V#ͫxV$ͫ2TCvCB00cQ@a>`,	Ŵ[ZYW$  !S@?q,赒[I|{{6z$z5h$xE߼W4ͫ2dCv dA0AsON
Ɠpn]L]nJ%y5!d>q^L;;K](|'jYi%ihϊFΊWཊg4ͫ2d!d dAAc@??aOqM:}kYF̻BRb`=
J}IZ77Gi66Xߛg$W$޼guC d tSc0-`q=ƣ(|7&i߼c/>q,Œ9|['|6iXy$h$yF͚hETC1uA0AsQQa-ׂ=oM;**;\~9{6wfv0c-`M+):\~(l|Y8HY%yz%W߫h4ΛxEd TS tc/R0?Oa_
Ƃ^+	:mkHiΚgEDDeR?ONų[|'{{Gz%z%ЛFΊF߫xEuB1SRtA..@=_+ţ9}8%GhE#!2T/sNoM<;;Lm(||8&&X%yz5h$x5߫1u1uRRc0?rr=Ɠp^MLL]~Z|%ϊF 1dA?@_,ĳ([[|I8HY%ihϊ5y5Λg1d tRBc0>a`ףpM+):m'}Yih$1dtrO
ƒo]L;KLm[J|jYj%XGXϊFΊW#!d tRBc0-PO
N+9lZ7GЋ6޼10.@`,Ŵ:}9I{{%X66WߛW d dRBc0O>`,ִ9'h：BcbO
ƒ`^L;;L]~J'}I&X%z$z5X߫T dBAc?s>r,ׂN
֣o]LLLm~[{jFxfUfc/.@`<	ĳ9l'l|I7&7X%ihz5hSA1R/sbr-``,q^;)Km'|HHzߛhE43CTv0bb_֣p^MLLLm~9}kjYYj%iXhߊFB u/AtRQQr>>qMĳ)lIGyE#"CvR..P
qM:mlk77zXXy5dRcR0/?@rPrM
״pn^mn(l|j%ߊV#!S/bsa,ŒonnnJk|Y87Hi%ihy$1/u0R/sOr-ׂN	ƒoM+)K}(}H7Xh$!dR?Or-pM+)KmI'}H|&X5z%ߊ5A1RR@@@b>NqMŴ([8|%z5޼1u/O`,ĳ([JI|ZYYj%iGWAAc0ss-P>`,赒o^L;;;K\~JZHXGޫxwwScQb`,赒pn]]]m[l'Y7&7HzG%ЊARtA?..?a>N
Ƃ_,	ĳJ}Zh߬gUUUf0u0.O؂=q^<	);\(lJk8&%7Y%z0RbA@Pb>؃=_,ŒpnMLLL\m[kHH5yV4#"2CeSP
qN)\J8Y'&X%i/A.sbbs>rr=^+	KZGyF#   !Cu1ba-؃Nţ9l(||H%H%i/A.s>a`ƂN紒p^MLLL]nkk8GjΊF# Cd@?a`贂o^MLLL]~Jkk8{%H%ϸtQ?-?aOPףpM)KZ{6W̻!dB>؂=^<	)Km(lJZ'{%H%R@??@bONq=	֣o^MLLL]~(lk77Xh$ͫB/ssP
Ƃ^+	:mZ9Y&{{{Gz.cRQasO=O
֓`=)\[{%y5͚gffwcc@P-ؓ_ţ:}8}'|8|jjj70-P=؂=p=	ִpo^]]]n9}k87XFΚxVDDDTf1@..P_紁oM<;;;K\mJ[ZjYHYj%R@??@b>=_q^<)K~(|'{hߛhE3"!"Cecs-a,ף`M+	)K}J(}8jH'&7Hz.s>QO_֓_,	ִ(\8YHX6xE# !Cu1Q@P=_,ִ)\[IZ'{%bQ@Qb-a`׃_赒p^L;***;Km[J%hΊFCS.O_פ^M;*)*;LmJ[[&jHHHY?.>Oa>=_q^+	Jml|jj6W#޼S RQb_
Ƃ^+	Ŵ)\9}k|8|{.@raq-qNִ9l8I77iy5޼ dR.-Pq=ƣpo]LLLL]n(\lkZ8&&7>aO_Ƃ^Œpo]L<;L\m9}['GW߬wfUUfw1utQQr`ד`=:l9}Zk'kYIYs.P>؃>`,ŒpM<	)KmJ8kj%y%ཊgE433CTvBA.aq=
֤^]LL\]~([[IZ'|kjss-O-r,ؓOףpM+	Ĵ:l[kHHiWΛgE# "CeScAPraף`M:\(l98Z7s?raq=N+ִp9l8I&&G5xE#2e t/-arM
״pn]LLL]nJ}9'|'Z8& ;; title:   Tunnel
;; author:  Sam Pagenkopf
;; desc:    A trippy TIC80 demo
;; site:    44100.xyz
;; license: MIT License
;; version: 0.1
;; script:  fennel

;; pp debug print function
;; (local fennel (require :fennel)) (fn _G.pp [x] (trace (fennel.view x)))

(local waveforms-offset 65508)
(local colors-offset 16320)

(fn range [lower upper]
  (let [list []]
    (do
      (for [i lower upper]
        (tset list i i)))
    list))

(fn as-byte [num]
  (* 127 (+ num 1)))

(fn as-nibble [num]
  (* 7 (+ num 1)))

(fn trig-scale [x bound]
  (* 2 math.pi (/ x bound)))

(fn sine-within [x bound]
  (math.sin (trig-scale x bound)))

(fn sine-color [hue spread]
  (let [color (fn [hue]
                (as-byte (sine-within hue 360)))]
    [(color hue) (color (+ hue spread)) (color (+ hue (* spread 2)))]))

(fn write-color [index colors]
  (let [base-addr (+ colors-offset (* index 3))]
    (each [i v (ipairs colors)]
      (poke (+ -1 i base-addr) v))))

(fn draw-circle [zoom x y]
  (let [square (fn [x]
                 (* x x))
        coord (fn [coord div]
                (square (* zoom (- (/ coord div) 0.5))))]
    (math.floor (* 16 (math.sqrt (+ (coord x 240) (coord y 136)))))))

;; FM waveform
(fn write-waveform [depth mod-pitch]
  (for [s 0 32]
    (poke4 (+ (* 2 waveforms-offset) s)
           (as-nibble (math.sin (* depth (sine-within (* s mod-pitch) 32)))))))

(var count 0)
(fn _G.TIC []
  (write-waveform (/ count 1001) (/ count 100))
  (when (= count 0)
    (music 0 0))
  (set count (+ count 1))
  (for [i 0 15]
    (write-color i (sine-color (+ (* count 10) (* i (/ 360 16))) (/ count 10))))
  (for [x 0 240]
    (for [y 0 136]
      (let [wobble (math.sin (* y (if (< count 2000) 0 (/ (- count 2000) 2000))))]
      (pix x y (draw-circle (/ count 10) (+ x wobble) y))))))
