From fbd4657a2e5ec789ebb6fb50b993b3b0163f8d1f Mon Sep 17 00:00:00 2001 From: Micah Elizabeth Scott <micah@scanlime.org> Date: Sun, 20 Oct 2013 22:23:50 -0700 Subject: [PATCH] More polish for the Sequencer processing example --- examples/Processing/sequencer/data/glass.jpeg | Bin 0 -> 30903 bytes examples/Processing/sequencer/sequencer.pde | 178 ++++++++++++++---- 2 files changed, 142 insertions(+), 36 deletions(-) create mode 100644 examples/Processing/sequencer/data/glass.jpeg diff --git a/examples/Processing/sequencer/data/glass.jpeg b/examples/Processing/sequencer/data/glass.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..d045dc95c89f296acc673799896cb771a9528f60 GIT binary patch literal 30903 zcmeFZ2Ut_f_b9rP(0d6WRit+agbqpzJ=D;#Py&P!T4-Vc1QbwFK$IXT9YRx-uF^q4 zRJzgx5fl{x5wYOm?gZQU{m;Gs`|kVR``-7xGrDK5S!>OjHEU*eX4cHG^K@sP1%isk z`2YYK4afihKnJiv000I;5T<r8g6zWd7eE+FfyuN-5Sm>)00r@^<QSj<pHT=K1*Qk# zNeIUe9#9~J>jw<xhVTK@ARWX43lRQa@LPz~A2JaXIl>^%21J<x!@(?^P|n{nPvZcp zT{#e`GvYsCm<9k)QGxXU|LKQ>1Y!Z4jbAVxE366t4BK%4Aj$Ugt?wP|i4_K^gy3+$ z;1FR$do^Jxw1*cCPew=s%1Q_oErgPmvXZbeLQ7d)OIZ^vPbh)-Q)g&)Lf$Vp|BT3Q z{m)4LfWHC&XgXRjAC;1_GU5X4XI-GB7pQ*0Ef*oXJP;@h$bbM0yY+%T%7FfoKb`^m zg`dr!{UIN;WCr~Y7|fKx@QZ&b<03^qm5Qb^kdg5lzW!4mgp$(rAMHzSjqA{#HiQ7z zVZY%*o*(kTRxaAr6YLfMQ2aA5*rvt1eS?e!iebO?DW?7b?*s8a`wW>!nW87ye$e;D zDiqzo{sUtvMp9rA5C+?u638;iFcbJt|7;S33b{#;>RJfIuV(ra2LLP+pp0Mu;8+2x zdjib*6nvBWoiF(C{==IhAH-AMfA2ZMo*rHS!d@Oh*f0-aqyj=YC`i~xQCR^AvIF#> z?a2KfYDG@%wijp-7zwO71@A=0Q&H+m#&?1cxlR;YfurWfSb$A}J%9|8d0qg!;|Pi& z=VkxJ1NJ6L0PRD`Pq+JqJO<z1;6wO<=h%I7hV9~44ufwq@cA)b0L5K873VJfS_=3+ z4n8!HpKS-W#_w@TW%qlWQn~&)PN9&WGO0YFzxogTWl$D5n1T<vo|N~_)14K7i8AO8 z8=?Wo&U=7`k^;Qr$b36fKqA0IM@L6b$3#!h#LmdT$j-&e#Kg+Ahm(_wlXDL{6D9n3 z?I!*+hA=ZSGP5wVv9PegSy))$<cI~nn}z*<N5D=yz)lBT2S)%z1c0(bVC;~c8L*NJ zJKc~2pqA7SN&pom2N?KOq@t#wrK4wHg#0HF>=&?~L^c3I1%W}SpwzT9bkr~=6_Cgd zquR%Tpw_qb;1mgsSEhkqEVyYPD#m5k;i-ZQOBgbw70<9=n_u?|SLH6OJ0)S1iSb5t z77^5Vh8<pDKio>}8i`ogFqX_JPP%=md-UbUlKP&p#Z5<_$mHzOhTid|PwFO4zEP(y zmo@fHyxL+1piod-DvD0DG}NjT74{)Gs6Y)uML4OI<1fO=8g$qVt*MB4&W9yr7}|4r zg(KI+X~+uDN~m@YgGv<fc%vND2-p|DRQR83Ao*K`ok@TRMk$jWH~?&<m}%nZfl}88 zryRn{*w|#eEB9UC(D#uabL+byv#-?l?S(Uj<$bi&2zOHSsxoxE@NNhC>`iY$8|6$b zQ32lzH4b`t22V)I+?57es^Yqb@DH8NI|Mj8^Pn@&4tjXLvb_x-hN&sq#B4WysH;+T z%=S6I&sW3Dp^p0@wUQN7HXv)MuCQc0@e*B@uTuHDeIgt^1*Y9nd2lnd%*mZ63vwNz zb+tayxPx4m8XX)bA@8d9+(^-k-sE*W7sCFw4_GV1dUDe3i@4qJ=4@~ODWbkz^^-I9 z{@ERj0St7E9E~Y%f?DoIk_$8G3Xig%&WnZ<xwel<Iu8}fel-(K3b7Kl^}F({k$2*< zpkuII^iwCpU`siw&R1W1#Lw+BQHfPky3Z_Rff)W!S)bu>HaTw*b?K6;-c(><D{tYo zGMPXR$Jc#|Mn<ISg4gCIoT%b$&p{6(2w&ONqhdx)<6haM)j)ao>Xxc03<v$mouT{D z$^{%%&QvllJDdzLlMUs~8D~^YO7nU&dWX6V^WWJ;(^>V##wrx;EnR(=cG4JH=V2l> z{Q70%xoPJW$5rFIt%+6dOVXBgI%y>IE2awsIT77^ZI&BGoi$voBHWx{@#AR#Rki3u zM<Cv4=4J?+;MFM-P;;RA=>$IUSboi6tt!ih*KG1I39j<VoITh9jlW9L4EGi_uUvp5 z4ABWr9>dZV?>IQk@OnDcdE%RI>FqjP5?U2XQtbW3fTl+UN2-_LHxQ++fXahdwW`YM z1P|kPorFv1Pw%BO^IqS0;PkB7{;2k*!|e5py*tBQk*1<q2QVDB&^7e;h7IbwyA5w0 zJm<77ho5T>CF(Ew&G~T5lcI?a^jEd~JRt6mR2wqaoSk_K&QfLVFB|LagrIZkZzS>X zR67rEFfu)(=GT^cx<R`BDhnpB?vk~%WyJe<-6ej}Qm0HNk2BkJv|#_2_Z7Je9v<Q{ zX!YgRfcS$v=5O+^a5zc3$P6fkYe<XfM%lcX-(;6P_l8${Ho~q|^*y_+R-a~%teKq9 z3ye4ioY9<`L1BpcbyAICh;-uQ;hm8ebu@i!m6{)_e4CD*|4gzc<zZETODBQsCYgxN z#`7K>!kB}f7P%)1T$*DPW3(z(#Z#*bv6=zsCHG?43x(^{X0^kdg>ogQ%SiIk@1r2x z#JeW)vw0)17Y1$V*#ZKn=%hQ})@G?XA?3Gg22@H_FFjNUP`=T3q2MYl${ac2b0*hJ zpM|5^mPM)ZQhZ!*c&0Yh`GIg&#%LP$)lTMM1{E2(o86|3S0bh9RoF5+#~LoM(mR-D zHC5x{S)$v;LQX|lg$O8QpY>@$I;Nw&o^_tk2vyy{&Yj#DomZh(lpJ&rsFph$W;W#H zBbqXAnQG#GDVDF1176V~dZBjV37=6Rhe+x0N;!`*_h7{BdfUN5vBWh_IalY<6$sG6 zp!$K{K>+hq?*-El`;w$s*Lm6U<(zsXvlHD^npM)lzBh`#5w+~R2GtqLvG{^qH<FUm z-fMp052f2GG*?nEK`}9xoUZilgWrFheuDG~q5yt(5~~$*-F3KfMe2mzCO)>%meSij z3ec0$xSaY1;yBpPlIIZKdK515>d+H+4DX6f!;H=MBUfPpaRll6%=`SDh%=S+wOQ!* zuuERN2)~UzM$dP~I&0z1)gvSP4<)*V4aO?oF*{N@#SPtJu5V1b7SJVFIP$39j|zID zwlO?a)m*&Q*nN-8z^BQcGgEXjpY~fao9opkws6<rr8pc_{~BS8Rr{2E=`q$tLB_QI z$_FD@A;-&=$a1^lE>b@4eJ}iof@6}FIgM}zclMJ#*@2}VG-xSiSwoiI28O}APZnvs zo9~Vploe~vSI0R7sHkr_?*O>))}m4Omz^*<W%kyfPv-QYS>1gy)c4~CyXgXzUmNoR zB)yWVvXl{~7dybtcvsC#c^{&qh0Ebm^D9)qyYo}xF4PxjvW*R|I@p;x)|TNM4i;LN zkI)~TvdRA_`K(Y|STXa0sa93%L2>7X2M$75wIR^}=$Q@@n@LHX0Ya-<;XG#q!^-2y z9yc~U`v;M!e`&Dr%i~OQkoaTGbnsQJa`U3gX57*5p4N!_4K;9E>?PeEn3L+C<9E6f z>9FNr_%=$6VP7;dFNya$mqRTo=*;BX#+`|R(}o0bx2ExNnV|d3_|yhtw=*IR7oKL} zXbzqVb@`-)S-qWcs^78KKt)RJp)5;Wya%;NpUB9ues;Q5IwOgFX>O!O^bujF{<;x} zO9v3)l@sK+_M|9$i`xAeDdY>o1ds7P!63#jHd#(d%%tql>RWwSqAlNxf_k%Ro495b z%R-uR$6@n^{*NffQ#b~_&fIQc&HFOXcb+WD3|^!v<cD?k2PS!BU+m9+rn_Jk<PXcM zXCH@>re7NJ=H0A&De57^qE%kzP?(b`!$P03&!|}`)j>H}s{M84?Ki0`sgIbmO{MZM z#Fxs&PcYjO<Hh30QgP!5n^))4=IrQ<{OE#kr~q>k5B%e8^CrH1nDP$C<N9<}QY-%D z>(s7wPe`sWc^FUbJlk2}nEt&6Qc+L>Gz`qp;1Y@)<OCqD0E}PUL;#%1g8v1e>Hr;i z5{>{L0jLhZsEk0WBM`DmV4&m^r{rUEVD}&%#_aTZ+2*D$Zj47#Xj&B7A{euQ&+Y`6 zF(eFJZ&^nWLL$hsSMm%Pun8yFdj<ywQaH@;1S}RG5kw}CVe;EBFpQjLrR258MUy!U za0GH5GI>`fHp~i~v13rq<Vo~yVY?Y@!h(Z+?6HK15Nl6=FObLt*Z^TbF!;|05C-f4 zEI5&l07A&30EUoX++d0##vqV@|Dh3+X9O;gfWuQnf^>Qcw;|faV%Lh=WD!t#F#26% zjz4N_9YVkb<HJEZ51G?2gn<8939yo$VZRb~zTxO!3BxeF;qL^V@H=7Y85sVHV&zMS z{FOij1seTIfOh;X+Q2Ko_lF^NtpwPa7#M=ufGZIIu=5rc_70Bl)C-;?Cn>=s4F6wn z27&*T&mhbj<A5g^i`oT}+xAy52=o^IC%j#FAc2Cni4N4W`^C->iS;4`hZ%VgJjgYm zC~4zs6aKSTkYO@2_$I3jSYmy4#r#LH7;ugMPsQ4M1@7W)!o2ic$Py@l%_}T8#K{i} zHZIshad_XK=3^lf>_D9if(eA+puk`}c}+<UOg|}P75>08|HRwjeEt3;F#aTfy8YrO zj};iWYy|_`k0li3=bJK)Bq%f%N=%6k!~whgjhT`pk6j@OCwZZ}yX>Q+VH=b***!xE z5K1o4BSH=gKL!cd%PAUcQn03gqK^+q2?S%Zi-$Z0b}<Dx#9tU?3f>irfAWCt7Lb$N z^M7C{GCzZ9fIPBx{xQH_lga-`+WEgjqu7FuEc@p;gzACg5`2ExO^6Ipma@Bc<Rd3x z<Zr{S_T(hRJe1DI11JMZ00K|}>xTd#a;yRfgIENh03ZQ%Fh+p?guzxb0>~Yil8qwd zck~C24E~Y)!Si1+ztksl;3ERbUpumofyOg90`DFEAEVfdfB<Qf4>`H(|LR{L@;~|~ zVDPIS?-pwJtD92NG~t0bFKoDDpe1>rLH<?_HH8MEIlzaOk}xy+qbyqAu;7T0zoBS? z!*IU1U*AxaJz2Un1qaGt_J|+^n_%&vvxR{51`z-zCgkT&0K+ab8AGO+1^Ehtum7j( z4~qy3{M!!+#rS{6pu>It{$oSq5lFyz`2LNH#S0r4h`~k^%)(7EXv?3UGrFJXzcJJM z1&1Bg55)QYv=r-Z<xPL0!J5;0V|_d#D4$pQNNgD4AJ`p#qW{j$=;>=192gw-hjH0= z<r|p%B7j){E6{rizUT?TA>hw+IQGx)7egTUq5CgbCQr(T@xS01!6x?mPj<@Klp+^I zalJtgtWn_IaR{ft<Sq=Q@R6N!0R1g6BKOPdyANazfXIO$=yuuzx{>~MGyUsk`q$0$ zubb&#H`BjvrhnZ`|GJs}bu;~c!OgTgpW6pc(*VE$d?;JUtbjhaZy5}Df-V<f&<W!Q z!UXUMr$FE`5#ao9ID`R1&|#xS7Pwo&?s|=uvYif=0UmI``w<8sT8fJJa0L(Yj=zFe zaFAlOM~EUqK}iwNIS?HJ?(Sj<!k$=gO`<EZ+S(=}jPuqNaZ*Jqp+gL@emK*kVOaa4 zRv53N0bZKkA_w*h>qKis2ZaP-2_C}HL4o*it!P~lif}CuCZiQagefe909_HvCa177 z+D6zgI1D_9pr9h}rG!8TtEnj<kg95G2svTUrKYT?1pZf(M<BIS)xgsR!asrtSX!93 zkCvU0@sF~=l&;8+N<~FQDMYC#1c&)5A~ZEM$ug9c<v|Yl@EAP7BU&CGF8Wh~5jNZ_ z3`g-e36mv)-joP}t_Y~<ZWV$;eu@1@Tm5A8hyZK*Pe#RpCrKz)1v$tDpok6mdA{PG z^ZX)HGXBg28W)ZJ=L|nvE-2_%5#a<>Bv_GuQt2mmIC+_)Xon3CjtKL@q9U<)g6Pk} zyuE(q4FMN=6k~dODPjY$K_FW=s2GA$REU;g7}f*yL}5TLl&*-nf|7zVSw@H!I@lZM z69YP^u(~2-@2EUNNnTkA^Yhe*ypp<>lF}|KMFjTmtOyk{E9Er94|!k@@&?^qe`os# ziJ+miEV1}-GrUi*t_VU&MNwH*_~%Pm5rn}=MEED0uE@{BF#ppd4I;w7T11On{I0&> zaQIoTKa^DfkCyz&PgypCwg9c5@+aQR&=7Qx`rraVLOAGL6gEQ{sv$Jh)Z~>F5R@9D z(OO2qUJ+z_n;C(*Rgox7RbwM1HDjc{ih+@)v4)X>k&=NDN*$$w(EpXk3?EMLz<XiI zdBAp1z~Q{L^p#cgkxE8N2sLFTH4OwpLs?m0-_Qt!GFCzup;QchmbdF~@Cf|BR<5^~ zmQQe4kO$b^a6ulvSVjL3tS@<hQF^SFDJ~rBA2C0MtUWgL2NZ}CrgTy*4==LA7c_%M zB-UHx2NL&B)j<4r)z}pn1v)5yH_ktFkzKa%U>`!1M;KP$7c}wDPttF<|9>2P`l*<g zp9kI-3pT!@h~ocwP5#>k`G3DAisbL#Zu2PqXUkD&e|#&!ic?VF2bc{0`ttAp`Gx-X z{jUZ7wZOj?_}2peTHs#`{Qt-Tzt@gfJUB^;0#}ARFPNOc>F!}0J8NSzOB7|9%VcVa z!v{mbUDhCQ-<>@Fb#`$TrhNo%-O+>li{K`mhgWzA+TNIaPyqnv#=_)DG8z6IK8^2g z5RS;3+6W8(#{X|Y>|P;Z;08Rz2IN-p23LU~oCv~!QG^gOp1k7%_Y5GzQ1V_2JPcG2 zg!hnP-(8rz!2<W(h4sj=cMu-joTHpj4)G51Cd1tz{!C;9dD9MN3Bt*dIBXOMkAkpR zU_=lOgvmR=@F1)QxRFRj-pvssV7>f6SP6ug!Z3E=4nCC*cn^We_Yc_f510V%o`Jl8 zVQ@$cWj{$+%1c@pT>NSXn_{B^u>^v=4Y;892=fM)+d&~7_!#hPG^NhuTmZ*^S%6T` zyV3uW_y^zr3M9AfE`7t6(q<6uhre;ZbN<E!7lOOc;BGtY!f%{s4gfSJ0l=Qg-#D@B z;E|U^0BCspM}4@-{pAm501oS=KsM;F@ZU20;{2Zjf0U;{F7MakP1tC6`%#$OtG&SO z#E3BAaL}KE6_)?cPW*qI@ej5B&_m7+>w^u$f{Q<4N3fTH$1}j@#(U$)%PV0V{%=dn zKP3DgX8S_|8QksHAi!Dt7XUx30I)rV1F)5c02L=A0CUd=DUe_7W=Zb|y0!qoY45Au zeh<PRof7{of~JE>XgH3tr41O`VT8RR!XkHBsK_sB@Qem4co~8h5CTL2De&BZGI-WN z8_)w#fH`0dU;r235a0zm&w{}7Oi{owARb5t(!d)imjEJg4JZaGfEu6<Xaw#69Y8NI z06YQ4fGJ=OSOnezYrrSq8+f>#7QzhSgz!T4Lc}4m5M_u4WIqH2v4q$`Tp&jvz7RYl z0&)y;3X%rNfDj=CkP666NHe4Z@&Gafc?Ow>EJHp(zCvM8CMX;#2$g^;LN%cJPzxvq zdJyUh4TT<sCPL3cuRsf-RnP`#2Xp{B2AzYxg>Hg(4;W$GuzfIjm<G%cW({+N`M|<p zCt#_tY*-<z2G#=WgN?xEVDDgGsA#A-sf4NIskEs~sT`=hs6weuP@SbBQk7FRP<2y{ zP|Z`VQT;{DOf5hyORYt1M(s@POC3d>Or1?#N?lLgLp?^lNd1Y1hK8F)l181zl*Wa| zpC*>(EKMFwEloSk5X}P3CM_*3FRd)CF0D1K2Q7g%nKp;Einfh*n0Ar&GaVz{UOHtu zV>(wlJY51^HXVuX9^EkAE4pv=Z1m#vTJ+ZR-t;l_>GZ|)E%cA+7wNw-uro+9=rUj! z{2AgIt}xUv^e{{_Y%nr1iZE(2+A`u8;~1|n-eA1XIM4WniGxXo$&ksNDT3)dQyEh` z(=(<GW@csyW<6$CW&-nh<_hL6=2_;?ESxL~EM_d;EGJoVSsGY|S>ChKvx>9ovmRnS z%9_o3i}f+<J2rYY2{uDE54IC*xopjB6KtF8oa_j8YxW@av+N}H2kfsoXgMS}P#oSI zi5x{7T^tLXFiufULryQwQ=G+|J)Dbh8n`6f4DJt4gIB{J!PmGrxR6|qT+v*)Tz9$V zxMAE9+-BT?-09qP+~eF|c?5a%d9XYwJT*MSJX?GC_vr1x?n&KKyJu|AS6*RW6mJ0U zMczi<89pjL89rOSD878Y9=><{aDHumFaA{iI{rxksDO-soj|NWk-$TNO+g_+6TuL{ z9KkNZcS77kdP4p}Swi=OmiKb*-M<&NH*0U(-Z#Qr!urC2!dHa5h1d28>@(dLv9Dm? zqkZ2*Bt;xV5=3f6W<(i8HAH<xvqU>Z*TnXUp~a4gRf<iD(~E0}`-xu`?-SpWkd$ze zI4#jA@mg|^q?zPV$x6v-DQ2kyQlV0XQlru|(i+kM(s|NPWS}ytGJZ0-GLL1UvTCw8 z**w`HIchmgIlNq<+=M)nyuN&-e5L%n0=I&tLV`l0!h1zAMOVd(ihYWIDXA(2DiteD zAvh4`hy+9n;)Ak`vX^qM@~8^4im}Q`l_r&Sq%0DP%tt;|<y1who>uKt{jR327N%CC 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 literal 0 HcmV?d00001 diff --git a/examples/Processing/sequencer/sequencer.pde b/examples/Processing/sequencer/sequencer.pde index 38071ab..c7abc15 100644 --- a/examples/Processing/sequencer/sequencer.pde +++ b/examples/Processing/sequencer/sequencer.pde @@ -4,22 +4,22 @@ float BPM = 120; int[][] pattern = { + {0, 0, 0, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 1, 0, 0, 0, 0}, + {0, 1, 0, 0, 0, 0, 0, 0}, + {0, 0, 1, 0, 0, 0, 0, 1}, + {1, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 1, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 1}, + {0, 0, 0, 0, 1, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 1, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0} + {0, 0, 0, 0, 1, 0, 0, 1} }; OPC opc; @@ -39,7 +39,8 @@ float patternDuration = pattern.length / rowsPerSecond; int ledX = 400; int ledY = 360/2; int ledSpacing = 15; -int ledBottom = int(ledY + 3.5 * ledSpacing); +int ledWidth = ledSpacing * 23; +int ledHeight = ledSpacing * 7; // Images PImage imgGreenDot; @@ -47,7 +48,11 @@ PImage imgOrangeDot; PImage imgPinkDot; PImage imgPurpleDot; PImage imgCheckers; +PImage imgGlass; +PImage[] dots; +// Timekeeping +long startTime, pauseTime; void setup() { @@ -58,6 +63,10 @@ void setup() imgPinkDot = loadImage("pinkDot.png"); imgPurpleDot = loadImage("purpleDot.png"); imgCheckers = loadImage("checkers.png"); + imgGlass = loadImage("glass.jpeg"); + + // Keep our multicolored dots in an array for easy access later + dots = new PImage[] { imgOrangeDot, imgPurpleDot, imgPinkDot, imgGreenDot }; // Connect to the local instance of fcserver. You can change this line to connect to another computer's fcserver opc = new OPC(this, "127.0.0.1", 7890); @@ -82,17 +91,54 @@ void setup() // If the Fadecandy board's status LED is bothersome, it's easy to turn off or repurpose. opc.setStatusLed(false); + + // Init timekeeping, start the pattern from the beginning + startPattern(); } void draw() { background(0); - float now = millis() * 1e-3; + long m = millis(); + if (pauseTime != 0) { + // Advance startTime forward while paused, so we don't make any progress + long delta = m - pauseTime; + startTime += delta; + pauseTime += delta; + } + + float now = (m - startTime) * 1e-3; drawEffects(now); drawGrid(now); + drawInstructions(); +} + +void clearPattern() +{ + for (int row = 0; row < pattern.length; row++) { + for (int col = 0; col < pattern[0].length; col++) { + pattern[row][col] = 0; + } + } } +void startPattern() +{ + startTime = millis(); + pauseTime = 0; +} + +void pausePattern() +{ + if (pauseTime == 0) { + // Pause by stopping the clock and remembering when to unpause at + pauseTime = millis(); + } else { + pauseTime = 0; + } +} + void mousePressed() { int gx = (mouseX - gridX) / gridSquareSpacing; @@ -100,7 +146,15 @@ void mousePressed() if (gx >= 0 && gx < pattern[0].length && gy >= 0 && gy < pattern.length) { pattern[gy][gx] ^= 1; } -} +} + +void keyPressed() +{ + if (keyCode == DELETE) clearPattern(); + if (keyCode == BACKSPACE) clearPattern(); + if (keyCode == UP) startPattern(); + if (key == ' ') pausePattern(); +} void drawGrid(float now) { @@ -122,6 +176,18 @@ void drawGrid(float now) } } +void drawInstructions() +{ + int size = 12; + int x = gridX + gridSquareSpacing * pattern[0].length + 5; + int y = gridY + size; + + fill(255); + textSize(size); + + text("<- Click squares to create an effect pattern\n[Delete] to clear, [Space] to pause, [Up] to restart pattern.\n", x, y); +} + void drawEffects(float now) { // To keep this simple and flexible, we'll calculate every possible effect that @@ -136,29 +202,49 @@ void drawEffects(float now) for (int row = 0; row < pattern.length; row++) { for (int col = 0; col < pattern[0].length; col++) { if (pattern[row][col] != 0) { - float firingTime = patternStartTime + patternDuration * whichPattern + rowDuration * row; - drawSingleEffect(col, now - firingTime); + float patternTime = patternStartTime + patternDuration * whichPattern; + float firingTime = patternTime + rowDuration * row; + drawSingleEffect(col, firingTime, now); } } } } } -void drawSingleEffect(int column, float time) +void drawSingleEffect(int column, float firingTime, float now) { + /* + * Map sequencer columns to effects. Edit this to add your own effects! + * + * Parameters: + * column -- Number of the column in the sequencer that we're drawing an effect for. + * firingTime -- Time at which the effect in question should fire. May be in the + * past or the future. This number also uniquely identifies a particular + * instance of an effect. + * now -- The current time, in seconds. + */ + + float timeDelta = now - firingTime; + switch (column) { // First four tracks: Colored dots rising from below - case 0: drawDotEffect(column, time, imgOrangeDot); break; - case 1: drawDotEffect(column, time, imgPinkDot); break; - case 2: drawDotEffect(column, time, imgPurpleDot); break; - case 3: drawDotEffect(column, time, imgGreenDot); break; - - // Spinner overlay - case 6: drawSpinnerEffect(time, imgCheckers); break; + case 0: + case 1: + case 2: + case 3: + drawDotEffect(column, timeDelta, dots[column]); + break; + + // Stripes moving from left to right. Each stripe particle is unique based on firingTime. + case 4: drawStripeEffect(firingTime, timeDelta); break; + + // Image spinner overlays + case 5: drawSpinnerEffect(timeDelta, imgCheckers); break; + case 6: drawSpinnerEffect(timeDelta, imgGlass); break; // Full-frame flash effect - case 7: drawFlashEffect(time); break; + case 7: drawFlashEffect(timeDelta); break; } } @@ -172,7 +258,7 @@ void drawDotEffect(int column, float time, PImage im) float shrinkSpeed = motionSpeed * 1.2; float size = 200 - max(0, time * shrinkSpeed); float centerX = ledX + (column - 1.5) * 75.0; - float topY = ledBottom - time * motionSpeed; + float topY = ledY + ledHeight/2 - time * motionSpeed; int brightness = int(255 - max(0, fadeSpeed * time)); // Adjust the 'top' position so the dot seems to appear on-time @@ -187,20 +273,22 @@ void drawDotEffect(int column, float time, PImage im) void drawSpinnerEffect(float time, PImage im) { - float t = time / (rowDuration * 8.0); - if (t < 0 || t > 1) return; + float t = time / (rowDuration * 1.5); + if (t < -1 || t > 1) return; - float angle = t * 2.5; + float angle = time * 5.0; float size = 400; - int alpha = int(100 * sin(t * PI)); + int alpha = int(128 * (1.0 + cos(t * PI))); - pushMatrix(); - translate(ledX, ledY); - rotate(angle); - blendMode(ADD); - tint(alpha); - image(im, -size/2, -size/2, size, size); - popMatrix(); + if (alpha > 0) { + pushMatrix(); + translate(ledX, ledY); + rotate(angle); + blendMode(ADD); + tint(alpha); + image(im, -size/2, -size/2, size, size); + popMatrix(); + } } void drawFlashEffect(float time) @@ -214,3 +302,21 @@ void drawFlashEffect(float time) rect(0, 0, width, height); } +void drawStripeEffect(float identity, float time) +{ + // Pick a pseudorandom dot and Y position + randomSeed(int(identity * 1e3)); + PImage im = dots[int(random(dots.length))]; + float y = ledY - ledHeight/2 + random(ledHeight); + + // Animation + float motionSpeed = rowsPerSecond * 400.0; + float x = ledX - ledWidth/2 + time * motionSpeed; + float sizeX = 300; + float sizeY = 30; + + blendMode(ADD); + tint(255); + image(im, x - sizeX/2, y - sizeY/2, sizeX, sizeY); +} + -- GitLab