Project 1: KeyboardJohnny

For a while, I’ve wanted to get some more experience in Javascript. Whether it’s because I see money in web development or whether it’s because I am drawn to masochistic scoping and global variable practices… I’m not quite sure. Regardless, I saw this project as a good opportunity to flex my fledgling js muscles and make some dots fly around.

The product is an audio visualizer comprised of two visual systems: a point cloud (bunch of dots floating around according to a noise function generator, connecting to one another with line segments whenever they are within a certain distance); and a particle generator, called a particle jet because I want it to be. These systems are, with the exception of basis function generator and matrix to calculate the point cloud positions, entirely contained within Javascript classes. Heavy thanks to Amazing Max Stuff for teaching me how to make these systems.

Informing these two systems is an amalgamation of concepts we’ve covered in class. Starting with an audio signal, I used cascade~ objects to filter it into two frequencies, one roughly representing the bass of the song and the other supposedly representing the vocals but, in reality, just vaguely representing the treble portion of the song. Once separated, I fed the two signals into FFTs, then packed the bins into a matrix and used the average values to calculate the parameters for the point cloud (radius and line drawing threshold) and the particle jet (rate of movement/emission and color). The point cloud grows whenever there’s a bass kick and the particle jet spins in circles around it – it’s all quite fun. Here’s the gist!

<pre><code>
----------begin_max5_patcher----------
654.3ocwW00jZBCE8Y7WQFdrikgD9z9Pmo+F5ic5rSDC1nPBSHr0c1Y82dCI
f00EowJpu.xkaxImyM2bvWm43tjuiT6B9B3G.GmWm43nC0Fvo6YG2R7trBbs
NMWF427kabmadkjrSpCWwKj7LrXe+aXMk7FYAQpGFpKpIj7kJhAS2Z5ZFtvc
9geA9YWpUXY1unr0OIHYRS1god9yAnEIs2h80Of77OLD5J8ZQs99bZ+5nV9R
gFL2iVYT1gEVar2lMq8x7qSBxykJ5sG.GVB7GgWZBEfVzdKJbLdEdC4UFurj
vjefXYMRddN.WVUPkMqHdfuSj.IGPq4EXIArklssteXETFIi2vjGW2sVJPHX
K8S0WgQ5ZbPvvZQrkZAb5pwEb7pRRcMHIxa3xL7b6zGcmMLNtkogQZxiFaGP
vMj04Eb0bbgsvsMuKwr01PPScMZzV2D2CSi.WRjDwSDFdogq8acx4hRrdtiu
6aB9z9KrzawQawodIQpc7IFoYgWz4EHXz8+vsudC3LLvzkihsfyg2eNugJ8p
3aI6AKUY9sxpZ.D3Oks88bV6qAChFqs3ATzU94RtxY+lZpaz.n4b+wM0QODS
cJ6rd5AVq.V9AN5c.PiWPxXRA7+vEPOOZ+4S9hO8JoM960mZdiHqmQceTE3u
qlUjZk1fkTN6nbBM4LXE3RvAZANvqDmDK3CbJ.JvBfRl.gCYCghdWRbwJh37
FjSJxgCir+Ug7I7YXnSeXHeST6STxQJzW6NWnEshuuccpDW0jhrPamBB9uTR
zDzZZiPhFVH+3Y33ppmIh5tQqwT4lsgqSOYt9QJy7n1ixUPdl1mejNBVnbej
JqmFgw+XWp4OT4VxU.yZncXqP9sY+AvDOHa9
-----------end_max5_patcher-----------
</code></pre>
view raw fft_bass.maxpat hosted with ❤ by GitHub
<pre><code>
----------begin_max5_patcher----------
759.3oc2WkjaaCCEcs7ofPKKbMDoFSWTfdF5x1f.ZYpTlJQJHQ45ff3yd4fr
SriFXpkhA5FYqOGd7897OnmV33tluiT6B9B3G.GmmV33nMoL3z9tiaAdWZNt
VOMWF4O70O3tzLjfrSnMmywaJH00.n2pCCxZJ3MhbhPuRXqUiIwikDCrttfa
aGpDKR+Ekc+cUjTgYTXTzJukfP8yDj5IR973RnazvKORe1+.t0hGy0at6qNI
T1wChx1yKVndr7xXcIOWvSwU66lxn9nbM8dFN2c4w+MjDD.Ur1Gdi5mHugj.
XhkZ.Z5zfrLgje6Avt0.uQIVnlRgACRr34jXMEqIUuSWnx4sFytePWm+MwZV
4oIW3v9tH2iaTEtfHHU2QX30F15Mi2smO5mnCagggVPez+gzWeAGhPVPeuqE
86Mplxx38jXKnOcgxDJo4s+LXBNOzK43kxTX+xTvLliOkWTPTm3yjhzFAOKC
fKJyohlMjUfuSD.AGPq44XAArUVBHu9mrCqLmxHo7Fl30WgrNqHxbcINToCP
ysFe+tkinYTNxx4x8XNhKZqoahNFNrH1lnhLdUAVu2Qe3wIeZ+6raGKJ3Gkr
JV46iMRyMCEP.C+3q3+0YfyP+1bkQVv4fOdN+.Urpj+axdSz92JJks5B7lxV
cOP5DsP3mLTbwUvqKayUvkM7Nq85Zz.HBNdutnqRqtTVuc55asBXYe+5tlf5
.hf3Aad3enLfdezkpN6y+zmDk8S0mZdSU5AF0lZF7xoYCoVpMXAkyd0bTQpx
vja6zEXKPp8.MFPQlSyECDbLfPSDPiJcdS.P9V.T7DfCxFBEdxj3Uajcc2aw
3IE4ftQ16hPV8s1iC8TntZjf1fzkFpclOpajlE+nUHeljOUNx.au8dwxqEYx
lJbFiPSQdLnE2KQmLmo51hMADIcir2aJBhKK2RppaWtFTY6.Ov0SOdo9UJy7
ptHuaEYK8v7C0VvUxx2BYs6lJSA3cIlONysfKAl0PaYsD4mW7WvAWpNg
-----------end_max5_patcher-----------
</code></pre>
<pre><code>
----------begin_max5_patcher----------
5562.3oc6c01iiabj9yy9qngt.bN2MVl8K7s7o09Nj.eHAWPxg.bv1X.GIJM
bWJRYRpc1IFd+smt6pIEojHYSolhZWOwwxCeuqmt5pqp5pp9WdycydL8ig4y
P+AzOft6te4M2cm7ThSbm536lsI3iKhCxk21rjvmSe7cytGtTQ3GKjmdK5c4
e+lsoYE4kWKY2lzcEwgExGzRc1sAEKdJJY8CYgKJfOLF6L29dD1dt08HGewu
DxbKzOodjnkxOA+y90NNku87hWhCkmu12KJ4jetvLEAonn6lsJJN7CgY4QoI
hKguWc9fsaqc56p8HBX3coxWj68UmJJANEs5TYgeHp74sqNaPFmnK3T7tLnQ
+QuRJQ7ZRWFlkrKR1TfS9quorIsGmrDHi7GGl7+v7r1CS7Nt0woKde3xZz+c
yR2FlDkrMKLOLoHnP0xpt7xvUA6hKdXUZRQdz+T13vbv+TWeUvhvVe3jfM.k
8sYQAwkz1r0YQKSSDMhF3r3zketeP0yK9cOwHuijfsm3g4LBbLokKlyIxc4O
FjI5FdDXQHkWrHMMt4kpdt3vUEpKuMJI4.TrHca6WLKZ8Sc7rOlxu3ltd2xq
j+vtD3pOvGrU7PdvGZh1EAwwpQeMe8eLHIZSPQXQDzEPrptXXR.mPeJeQVZb
bC5EtxGNwUVx4fWD9bzxhmjen5LC7aOZaISzrpd4kQqCyKZdthf04MOyQCY4
mZ2ipQnOTDtYaLmJZdCMjOUe3Xc4TMNeWxqZJy5c4n+ZPVQzh3v+AmgJMa96
xqeiMEfgqcE3zEurUw.OaVEiaKx3XVtRYbVxAtXKuCkxcnjNra8lxwP2QR7p
29D7NKe.Fm7PPQQVzi6J.b7tivKPZX032tfDAokwuwBd+Ev.I4Ppt9u9l2b3
ewEjMp8b+OgEiX2FEaUqayG2auFYh60NBNtk5xRiRJ9uhS2sbD6wHXb8dLZe
8Xt3opGqEz3FbL1H1cgI9f.QY2kqcecWNSsXwa1NqQeJLaqA0SMUiqL17V60
EMNJoTIDzO8l5pm2WK8WNGMm3pw+XPrRunJ5pK0n1qq0a1SDxeAtMcLraQ5l
MbSDNxxNtcCK4LBnrfkQ6xQEonhmBQe2e7OkiBRVh9GQ46Bh+uyh31MU9rB7
ZQ5tjhZJequ4f9tDgDblMArJPxuQosXPnslFDhOCHYSXddv5vifDET76vm1T
WEmbGCwNEY64H0tfQbjV3Y0kYv1dZR0DCR0aUR.+abkzMLsyHz4t79baL6z5
Y0nKeLI9VbuQz9AFZRuhmPGRl4BN7vWvy2JISFQRNeKuQkklufaK8mLYuJXV
OyhByaH6ZYNmlBY1iHEtJNk+NNMoQZkztGM6wfj050KZKIR6tG05Oq5MchYi
TWaUZF2XdwYbFOIasvluKYavh2yM4efrAb.NPS1chqT7FsSfxc1UmzeWTwbZ
K7Hrt3Qp92NIeLcNgS9TPzlsUWi1scFQxe7FsCZxq4vc2quL7sqVU7ID+mG9
P5hf37AR74QqSBh0ABntRMW775hGm5e84wyPOZxdbB3EZJFlt1tKxknsi6M6
PZtnzrnOhdqPMZjre+a2rMG8VAMhjhsnDzaWFsgOlDgQucabfR2UDY.py15r
H71vCPanWYDkvIUsBHRTkZ2B6iy0m8giVKEJGxgJSxF4PgYMoRFH2NW+G+uX
nZOGa4b.NN8S0jIjpICVYfNIaeKvpNhrO2izEY6NkjsQoZOrzjVEU61ojxwb
fca13W2H94uKGsLbkvkGRC7y1kjKM4eYVvyBGArMKcQ3xcYb4moYxqrU3JSz
BguL+wjSJ0jNXm..V+6ZCtGzCzlvsEHiMAX1elypH8KR3OuKJKbIR9HbPSfJ
GBnEonmSydeKnyfcQB1yubES62CI3I.b92Poq.1hgGN.kRFYrZCVrZQUY6If
3D8cb99rv7mRiqwwqe2mkkmjD8Y05.akFs9rWSQNAKoTGGR+pJxXinphs0m9
+8TTNhaRdVZRJWSQtBaqWGlk+G9wj+2UqxC4R2BhWrKVF.E+XxeCb.XN+jbB
8aZbsZBCKEYdxA8rAy0.i1spOn2oEdFFYBFWHfiPt50wQE6VFlKk6E79PX1i
ODDuiOiQV5Fzi7WjPK7e.+SxYXjOWNJpPHlbC+I3SwH3s3OGGAxQOErcaXBJ
JY+jMOHwWyfqtttf9mxoncocgqzoPdSdbzRE.BytHArknfJn1XyqXQjFshwL
Hhr5blEB9ydASt.EZKI2tEKYe8MfU1wabWwwEF6BJU4ANroS2Tnqy1o2T9ks
hFsw86WVh2MieYGODozvKECe2.h83.HpSxOUzFNUBAW1MEJ4wzGkvN21nzUU
nhRPpVxTv3OKkoTRhZwaXcquTOuCTeso9ZmAroCj4o74Smd6Qaa3GVjWzH1P
Zkh6J.QNqnoP364EgwwOJBI6AtpRwQ4EmdkkxRetAFztWjI1NvRLAAU.tkY2
qbwVqgv8AKGSsa+fvAe1ggP9s95Vf8r52XTJ9FXcKJMX5TKaA9FYYKHkgzb2
KaA85axv908Sfiivp9YWaQ+5wQ9Sfqb1hx4LAK4xA4B2FpDdE4euV.A3pNJr
B+c6Zer+.k1+kTd7PY64TvDY11fb7beMUddMUddMUdNu3etZc6vyGsL3gIWo
VBDll8G+yzgF+yWmHE+JfTXXF.sQJ7DhT.00NRX0S9AAoqJiJ4Mf.YfZ0AoR
ufnhuz+vhG3uvEoV+ghRVF9wp.lZz.mfjjz8S8L6rwMvtPsgMOCgZe2dE.ah
Zljkpoa7OXg1qG4YmA6lmZoJbaYcCaKxQlhgVcgCG1QLHTv0ZXf.61TR7+wm
NSAvGnJdOxlnN1mN.ya0U+5hSlTTSC210tEJZ59t9lCG7R4wtvq0fzrOW4cZ
24cNhqN1suiOm3hf7EAKCGa9Q03V.7cH8A99SI6nzZ40YAaepCTwsKTozKdf
uy69OJu25IMROvnJO7D94SZFo2A.YRoA+GL34TNoVKtaM5A7ZLX3XqLkulvB
nkozUjSB2K90R9+wTBdtOyA63JJ0E19NN997aYNl54aeesRfwI+Q9lpdYTps
+bB0wxiwO6bOpuuCU7Wtt9X6ddapD86y9YATKgutSBL3DX+yuIAJMOQ2IAHd
uNIf4XGwCZN.hyqSBzNLZf4.pVp+am4.3iH8X1dtXonZGhEwS7W1LKGO5.mB
fqumqmuKyW7Fj2iqkK1x8JJ6WBMi6fJr6bJ++gEStwzzQDCsNJX0hI0+cwhK
f96eOrNAZZZ8ISs9CgWIgJt9oA47zcYKJAJk9hnlz6xv7hnjJ2U7C6syAoae
7PaDzA0JvMtwMQKUgLMXrhsLNnofctTHjukGMVscOMa6BuXMdHnt.n+H1HHZ
CEj95FwTmZcitVicunXJS8a5iVqvVyVgr41I.5XUlnTx55Cs5nQpoKDMpUS+
3g5GzxINbiN.4x9DPMb4L0MNf.gg.0EzM26Pg1oYKgIJslVp8D7UsStDX0MU
cchCNMMgGGZhnIMMlyDHrtVa1nNG.TxZ.4ECiPpNZrZ55xRzN98kacxI7etL
XwmlcdYuAwGlEu52SlwVVSR0cYWdnQCsduZgEDqy58.gLADLwjDKkVOFn5rV
tfoW+ReP9pswAu7ITKzLU6v+QqXuG3zYx+icmwCEV2f9jLLwHOFjGsnXWhH2
qDQZIqJtGVkFGm9LH4PDlBoMB.CoyaRJVjlIHmCCvFQ38HahxWekPkzrn0bY
iwwgIqg3rfOUHw0kHb9HiJp5IyJhV79781wU8LUMAH0fKiE0HNn1Ri3m2EDG
U7xIZGhXFIuHKj+rp5EbkPXSJmHKTDBAHB5w3zzkOlkVvk9NeyVpHfJssrLe
EDpLPMs5rrPgGyJHD+E7395a1GB1OcSyqXzbQPQ19ZTZgn5Dt4WyTVSUz3DQ
nZQJhO3.QEoDrHA9D+a87i9dU9iCwa58xTBTTd4LThjCUSNpOT+cgnzrsDI2
lMMEdn0wy4i2dpdtMhd6hz3zL9fXw+fQuUjKoOHDAoxqZzag6VD6cH5UNneU
0rCUM5SECisEzu15N8t+MU9dTVWR.yz5ozdgu0y2CU5dL7rwGpGgTJnGWm0z
H1DTdVxaK2.5UWbWv7a2NoHuQjhJRWuNNzv0Uv8AfqPGrxeOIs4LQSZzlpEB
IbiRUGP4ukt6om.0x+YYAG.wFZszTSUvgfcwo6hs.9yx5tnp7vnktQrambwq
MN+phIhgqqpJXhphD2NG.PYSfQ3B8CMbYzU4NUU0zsaRlb8GyKpT2MKNPiPG
tKLose2UfPqqPFWdZZ03oaYa1g.Up4ynD83Ba7CpJzip9PzRQAgLlp8L54yb
II1cEAv8lOel2mzjIoQ4g+E3uIUYKI1Z1naNDVkXoNchkSQ0JCxqnnzDT91v
vkCd7fiELD.aCqBGtqJVEYJxxSTprPMMvN4CBCGcrGTmwKXueCmeiXlubZ2u
12QUfXoPDLX+ZJN9ZJN9ZJN1U7YV2axiWDvBCHIXK8h.VWCGifWqrL5ayQAn
EoI4g+7tvjEg2KN7INBEVVL4VEkkWfjsLzW87SQKdBsTPaajk+TYUOMhO9KM
qz40QIqhR3RHQRmrFl86UuvbtVGEnzj3Wj2lbRVYMvLN3kGCV796QbckQAbA
q7wEuTqpoJZH7QB0u24n+b5ygYB+muux48bTbLZ6t7m1+r4nU6xDq9R4K4dD
mDhCQYAbQF7mNp.drL93ijkhGbSij9rgyhcN2zwpTCYYrrHkM1HW1ugRFqt3
UjE.RI08umixS4n31cYaSy4c4xx255vjvLwNeBnlQY43iekUhtZd2QJJcWlb
kKZGjoWFHKm3A7aIqCLFOkYT6kDuq8u6tAkWDLDdQ8GlqNFJJWG8jF8ByCYL
yEBxPpd3BwPIT6DjBxCKUQgXmUWXAOlvxUJsR+OE981x5byt+l1A0MtR.Gqa
2+lYJaBSiiNvpuQn843hTk5ZAgCCq+cPT5sITsuFbY95EA.QX.hH8WuHrFpT
8qTFTApD1NLw5BljawX6K5a5jEPk.mJXawlNiZsu0RcC2QLdccuER9AmgzH5
LngITvA1TYvHhYrpiFqfFloaaeLC5ZcydDReAyNVEl0dvF.ssaYr5aeUiNec
omSf9sSPBSzb5IaCvSePw+asHKuUOa+3p0CcUBqs3EZ3Sa0dNU29zV6JA9Wf
tzFr49q8gLVFaA4urmsyqdz9UOZ+pGsOSet8+mtS3G03knc4gHYfjCKdKJMC
sJKXAGxE9jiqTcRNJ.bHqHn2yq15o9t+3eBbs52yO0NoSNCJTuj0hU+m+sQw
oouOm+kRi4nT6Nmy9rqlYPVWC6ChpBRkKyb5ge87AZnJJrQbhe6NgGlEaXK6
2vuyBQhcHVwlOhXiaQ.tEoMVvcki02Dv+CEqkzszG6Ycd+Q1RwL+g4mZmDq8
9I2yt7oA6RuM5mj0PgVcSl8sZO0yo66Q3CdVdOJMY+Fx1G+55fqnqp9Ueo9U
GAeUic1GsYJEm6za02zCGf.WC3PkhdtGIxEJHMEDgulnGnbf.eplmj8KkqDi
.tgEL.5pVFsZUXl3tqF+jGJVQshv3WFAISXXAYJ43c5Sxj2M+pyH31yAd+5q
JSFGO4RpNTlhPSyW1uRahEnotHlp.C6XHmcYb+kHt6g6lTGEEdSoHllgkYSH
WsNW+NLxZrb7miEjaAP1g53za43aJ8M5DiUvVGp9P0TVGuDwh2VwRNm97EDJ
CZTDjTK8rz3UOq9FpQ7uJCptRTODbu5S7deAr5utPTFn1wE5eUNMUQN5qjq0
yuG8bnvTyuAhp3QesO6RhCzR1G67iEVWJv41tRscIbc5sLdpopzm0iYXVuWZ
FeqM45neVgkvTY5CkTCCkerKn7Vp3xikZOZqavtPLU3K7UfS.3H08u.pTmOk
QzfbB0fEuGQNy4SaIR96C2A9TMhtAueysj8pLKxln4J16dath8YMRJZiiRL0
pFBvDqWk1w1SHL0k1FPZ5003uKCnrU03PPYCa2a53IpKfRxNMpPE0gVWur9G
5MkFBdcBmc0vLpESuvY23087q3V2iDPNOVK8RM.O6Zhrb5EKctQ8dEW8NQr.
nVsHgGaQiloRXZcSkv3diCK6IbHYWdY8kZ9OsoqQG1xg46.EpvZqCPW6OKt2
nNc9ilANT7EZCG2naWMBsveb0ZDtVF0hHn2BivjKA37xUb85nmtZ6ihA6r4D
ZupMPdEY0CYUUbM8QVSjvIiRjkpa.UZ2a3y4KifRJThGwLZ0QiTnLZarHYT0
V8fJhAyt5nqYjLZOrnCsexQs+o54Wcz0LPFoFKPScfTpm5aUu6w2Z7Jy6DS0
U.E5TpOtdOgOd7Js4CsVUOsEX8d65IdUiLsaLx7pFiw5Wv3GF8TxPzN8LNCM
I5FH5zwLR9IZuOFLpkgecYU6sV1q3NYPh9ZSnUGcU4U0kUs+cWiR5gVt+XUd
zUMd30celfLpYMgqwz0vBxCUHqIpjncsyZBWiorQC5oRhl00UhFVakmrFStD
lo3RrYNk3nUCtjq6NeAyTbIUzSCEgZWC6IdWun29GpplIOsVLfMldpUziUi9
ma0bep+b4h4n1SgTA.09itpcPVCbmFRWBpr+pcBBeSrumzw7F.OlRaI0rHcn
szzROX8oGPaIhSOZKY8EQh6IosldiBxiuC6HTYyW240baddpllcGkvf59g7z
3CUZWzE8gb04CYafOjiNjDsgDniDpPoyIb9Taao8n9Nx+i7nKswQznw43YBX
PiOD1w.eHac3UcHl3Kc48rdtf8E1N05XkGcosMc3us8MAJzXeuqsujqI9RXc
3gLAypsFeHSHDhoynBlIjqxX57knl3KQu3QEXKrzqLtX+ZCKjGcoMNcXgXlf
EhYoCLXDlHMF+0TQuijB4HUSECkJZN56TcnAZa8Nh0x.f.UGo9LSHEhpiTeV
e72PUq.BEVE+MgVsTImeiSGAJ1Nc03HLkUkPr9QHycKO7RabrAHY3x9RZICx
HbCjKWG.kIIV0UtSdT0Szzbjwsw1bUGZswBgUEc+QG2XwWViUGQ0TSLikNLK
LeMPEJDYLdT6piLNpnCnzra1PLODsz10DScRzQ20FqKxg8Gt1p9CHqUsgDzf
3Z99CsZq1cN6aYiEpjQJKBjGY7tPclcfZBivH15xrPZCV7wpEekp1trcqNz3
3hNsVQsnUiVqTSJ2xkYgbpF6Exwoyrn1lv9VhNSWf6d5BWPyFW092U4AWZKS
GkqYlv6MZM8tA9NXeMzhm5apuTuJAXBsvvdZJG2HeHrFeHxk9gbzUrVqSM4A
9vC65Ah0fonjGZZwZZ0Zkh05u0Jmhx00prLcZbwZX6AHr4x9R5H.0w5z5PQt
ReZrwwWsLE2uaKCkxuANWu8GXb9V5EOuCiLJy6f0wlDhIrqDao6X2leIXkdN
nDDJ9HGT5AOnrCdbIGr8xM3gkZP9W9Wey+Bflu4A+
-----------end_max5_patcher-----------
</code></pre>

E questo è tutto! Because there are a bunch of classes and scripts that go along with my patch, I’ve uploaded the whole thing to a github repository here – but beware!! There are a bunch of values that are woefully hardcoded to make the visual match Blood Brother by Zed’s Dead, DISKORD, and Reija Lee, and no shiny GUI to change them as of yet. But I did include the audio file in the repository (I hope that’s not illegal), so there’s that.

And finally, here’s my dots dancing to the aforementioned song! Please excuse the audio quality, it’s early in the morning.