praxworld.com Electronics, music, electronic music! general geekery

12Mar/120

Middle Aged Engineering Grum-P-Lab: connect and read sensor input


When I left off from Part 1, I had plugged the Teensy into the computer and loaded the flash program to make sure it works. The next phase involves loading Firmata onto the Teensy, and getting some sensor input into MaxMSP. Note that Firmata and MaxMSP are just two of many software possibilities. Other programs that are great for doing stuff with sensors include the free open-source PureData, and Processing applications.

To load Firmata onto Teensy, download and install the Teensy loader if you haven't already done so. Then, pick up the special Teensy version of Firmata from here. Follow the instructions for loading Firmata onto the Teensy and you're good to go.

For my first sensor I'm going with the pressure sensitive resistance pad. When you press on it, the resistance goes up! I have soldered it to the end of a 3.5mm male cable. One lead of the pressure pad is connected to the ground wire of the 3.5mm cable, and one to the positive wire (tip). You can ignore polarity for the pressure pad. This diagram shows the circuit (Teensy on the left, audio breakout on the right, pressure pad assembly is not shown - it's plugged into the breakout):

  • +5V to TIP
  • GND to GND (10k ohm resistor)
  • A0 (38) to GND

If you omit the +5V line all you'll get is noise. When I load the Max patcher and press the pressure pad, I can get a good signal. Woo-hoo! This could be set up to go to a pitch bender, bit crusher, purple spotlight, vacuum cleaner, or whatever. You can alter the response of the pressure sensor by placing other thin materials on top of it (if you're building it into something you will probably do this anyway). My feeling was that it tends to dampen the response a bit. This is good since at light pressure the reading is a bit jittery. Also you can play with the resistance on the +5V to change the high limit. 120k ohms worked for me but your mileage may vary. If you are building this into something a trimmer resistor might not be a bad idea here.

Here is a screenshot of the Max patcher. You can set it to print the analog values, and the other part flashes LED 6 for an easy way to make sure your serial connection is working.

And the code:


----------begin_max5_patcher----------
1943.3oc4assiaaCD8YGf9OPXzGRK13kT2ceKn.EH.sHEH8sf.CZIZuLUVzP
hx6tMn+6kWjjkjkrobj0t.MHQaBuN7vyLblgLe6Gdyr4qYOQxlC9EvmAyl8M
QIyTkIKYVYAyluC+TXLNS0v46HYY3sj42UTIm7DWUgyhf.q.jcUMaXI7D7Nh
p12mRwwUUkjuilDS3pgzprTZjpor0e8cdN0aKKmW1XT8QOi9OpQGYs.VVtts
7m2Szqq4yAeort8Xd3CzjsqRIgbc0KcW3dGvw0QLB.jZf.nfEPvWT84e+g2H
+o3G2YLBkPdTrDNEfxBwwD.ZA.p9sKDBWLXvxqKvxZp.KeEXgP0.KK3MArRA
hl8Ng7MXDB1AB4NUHDxVgIAJnwCcCAnrqFfPcAPnd.H3k.nt.AW051doBDru
4rDZxnPRbVNUjDE9D.ke0Fdtobjq.d5hh3DLhTDKKkFhsixhhq2MDDhY3n03
jsiCH3OZbDkLcVdhefxNqBb7f2PHJjEGCnIT9ehSw6xFGjpOStNCWa5tZ+w.
DSqYEr7HhU1kL7ARzJg3I5wJLmmRWmy0d.M6HnMaNY2ZhZo.0kT.1WEn2qCS
Q461OJNK4XOQFtzvqq5XMW3H3pTHa2NRB+TrYinIOPIiyYaiocKj1QwkJS3N
AifR4lXlPtFmUJrmkp0fIBBoBykJbW1LkkWPMLwEdpZ2doYEBmjthjfWGSNp
YMlVw9Y.5pbotSUJ2QSkRijFgfd9JV0xQfUwYa2FSLm5X6coE7IKLZxkVV5C
4sr7V3D36gzKpaL4HWX5N0DNf.Pn6DJdhZbMGlPilFlD9Fh9UMX7kSGSLCoL
wLCGEsLa3D5MUIaT6rom6Hnj06wWehvA6oIfcrHBnvAfLvCjTxQySwzDRHKO
geB84ZM+itXPbqyWWPMPWSbc91Ru08s0g+qLVYGLolortgloBphT81pa0qCg
26ceDc6Gy4feDMJ5WCKqGnq1uvxn4zYDxW6Yn+2EwXa1iTw7XMfEq0kLM2cf
EmOTcMcvtfrqNY11Z5s6tOUPiA3DbLa6gZTfuGyEViYNeDa5BSC1tAsC85pg
hn5KlRoPkzTn4KQ3fMWXf6Z1dpzfZqX6NvxuWfSTApxIPLs6yUCGZ74Jf2q3
Iqfq9v3j5Gj2jl9T6hDj42kkXQeD920Nf8MzXxARZFkkTWtlMGueesxmUuSR
37qrz5YUW6VntL3wxRIGnkCgSQoxspxI43BHnHmMAZW170TDKTs0fXecaLK7
uKRvPUor8jDZx9TRlvkBLuX5NVeDYCNOlupGntYC1fCI828t4AyluMkFwRjB
Ry9JKubJKSeo7as0jpII38c08LwxIOaMNUhhEpCVU0xYr3l0cb2SnAfEdoi4
DNUKxBWOqpktSYVr4jo03dHKLkEG2bzzUcnqphD6vgjGoQ7GTCWCXUzA59xM
j4GgKwg0jLdqB43sYsJpwsr0fAVWGuYEsz0ioGHKxhoQGisQ0nC3zpMyZs4y
nuznYcpg2adRNyYn8eNZK6l8pgGn7gTFLS0ApKaPkTLlGXOVttfMGwSsr1X8
nyvWUp85HIesvYIFFmSXapWeiFTeVySn7L9ymNwMZ0NwdmpAKf80jRzq2FHf
fTdm6sAM1aazoXVx193C05RY5LO4eT6uWbTz0QW0LjgSAQmiCBuD0Rm3Da2h
37J+1jZUFylREczW3CTOc3HjyjnjVjBp+uqjJuRD4AjJPAtX4RWQTuM.gWRc
5foUmto6lMc47ie5WeWpfwQ.2CA2iZzny3vgwrd6yv5saOYcDP6EtWISUHP5
60OnHe2Ug2LlvrBL5Ggf8fPVmAgPmGELc066+xYW0PxmN.4Qm9gL0n6voeFS
8rU1hQPqaH2qU9LaByqIaXoDPdlP9.XY5MuC7LKGrKOiCxHb.kC3LcJOgf2J
bNlxwxqUVDn6OAXo5ZrAuUuIUTQi4pdvOqZjeTDp28z+JkrNWDTHG7Ge5DIO
jEqilSZ+12V9q6Td2q+fZyhMyZje+Rc8W4g+BGOGaW2xjD3pCbxwuiYsO+bN
GipyTzVMm56RxFdjuzXbS2td.3R6vRQ8v8pEQnb+qundTRtrA8vJyX4ogk5I
Et8.ZIRh3x3zjJI5yG8frcKefFE0JlTc3aYRuSpeO+lnKMXYWb3E.Yhr+5Tz
MB1cd0I5VFyXd0I5HSEc6QUzqo6FQ1SRDiS3yqBwBaq8nFWYCt5H3E6dhTy3
37xi6lS+c7uMuwjU8xZF5iyoiLrbtjZc4zgcZs8lisswr033hrPVMiWHkPlj
5MCxtWqzP88+xjVWlM0xcf5QolQjB3GDQ.YddhCFb11qkN3VyrL1qEBwcO9n
.z6aor3xHQP0SSxeYGW7fdhZdpTAL0VAsDrNQwLng9VeVwap91gFYGZict8Y
rbIe4pWVvBld4x50ob4YjbI++fPsCte8HXxa0ZhQLWiDL48DM0BFzDAy9EPm
z2DAywd5ELWirhM8br1XQOHl0jKX1dFwwldDqMs9LB1zZGy1HsRqo2bgkQak
SOES93UpuG0ibM8lwLxtuyzeDNxnMROqWoBV686AJXENy15wMnjo1Opg1Ong
SdLCpQU74+7F22IN
-----------end_max5_patcher-----------
7Mar/120

Announcing our first soundware product!

Salad Spynner is a set of seven Ableton Live racks and 213 drum hits harvested from the SonicCharge Synplant synth. This collection of sounds is replete with beeps, boops, blasts, fizzles, sizzles, and kerplonks, all infused with the unique character of Synplant. The racks feature macros that are tuned to deliver a wide variety of sounds. And it's a great value at $3.86! Available for purchase and immediate download in our online store.

Filed under: Uncategorized No Comments
5Mar/120

Handy Maxuino abstraction

If you like making Arduino talk to MaxMSP, there are few things as nice and simple as Maxuino. A while back I wrote about using Maxuino and Firmata, and included my own patch which I unfortunately named "Maxuino simplified". Looking at it now, it doesn't really simplify anything! It did help me with understanding how to use Maxuino, but that's about it. As I bust out my Arduino once again, I have done a bit of work to actually simplify using Maxuino in my patches (see the bottom of this post for the MaxMSP code). I encapsulated Maxuino into a patcher that you can load into a bpatcher object. The inlet accepts OSC messages to Maxuino, the output spits out messages from Maxuino. From the panel you can select a COM port and activate the Maxuino example GUIs since they do come in handy. Here is an action shot:

Another thing I do is use a coll to initialize my pin modes. Put your pin mode settings into the coll using this format:
1, /0/mode 1;
2, /38/mode 2;
3, /39/mode 2;

Connect the coll to the inlet of the Maxuino bpatcher and send a dump message to the coll.

Here is the MaxMSP code (copy to clipboard, open Max, select File, Open from clipboard). Be sure to install Maxuino into your Max search path.


----------begin_max5_patcher----------
3890.3oc6c00iiaaE84I.4+.gZKPR6LdIonDkReJMAnMOrMKv1h9P1fEx1b7
nr1RNRxytaC5+8xOjrDkkro7HIqIiA1clwR1xWdN26kG98u8kewMVyi+DK0B
7MfeBbyM+F+J2Hul3J2Tbgar1D7oEqCRkuQqEwa1vhxrtM+lYrOkIuw2sNbw
G.YwfkgoaWG7Yv1vHvl3kLve+e+Cy1+9WGFwVDuKR9gvEWc9t4yWy1FGptNb
FgVbqncaBiVyxje8H8OPZ3Rl3x1EW993nrnfMxKZ8sIgAqsp7bh2kU7ff5OH
smc3R4GOd9ubGxp5SNM7+pdm3Y6+7aCxV7PXzp2mvVjofRxLmaAHhs7WXa96
EX6MCB9Y4G4+8keg327ec6..57O1tvn3m0Xt8YC5Xha+A5BPd9trr3n81y1D
VJmGBxB4Wrp4uMHgi.Yrj2yhBxKaviilFCa1MfQkPj5Ml84sLENXYcq5+RZ8
maxxqfZ9TAPgQhe5H+aDQ.ZMR.vRBXuC3pcgVGgUP1Rl.iwBdgHeAhyQOAZY
CKMMXE6vXg3srHqFwbbmw7l7KcNBl2BhgNpKaA3n.daGI3PeR9rQrOxM0Cwl
sK3lUR7Zqt5SB9awqW1APxs6fDzHPxS4ip7f98afMxoWircN6.ads2hJuSMH
5Fg7EQ2Tr7ENOSitwCT3Mxg76mvaDjLPA3HpWuEfKK5MiEPyKql4PzPIBSj4
pPPOU58heV9gJzyI83UJ1tiWSJ3Ge62ABir5ech+CVB6VvGYfzecWX5C6kIx
SkDCB.ykkBVB393Dvh3jnGYQgrnErYV8TtNXShXfmsPOaU3jMwQJ6CNLpqyQ
oSWKgAfy+JgMeGGiy.u9sc.ivXqSjnGQ1mnG4BOzW69jUyyemx2S0enGvdev
B1AEf8rhqdkDKhWGmb5maSgG9RiTVmglEe1DnBCOgq5owZDz5nlspIFpZSML
pFv+J2tKyp+y3CdSXzcuVqF5JTBbFBYSwb6k+WXGhu3OvPpGwtFA0OttMVWA
9LpR06nw94b.RVkx9DrzCb3XI4XZAnx+VBWydjkjVKz8Fqfsaqb8ap9gDbwu
nfT2aKuFmWSp5CwuVB6wvhGAI+pBdt3KorH3.IJaWVQGEJKIDpakx.2oXkFW
RnPGOOAExYRHVxk19XjqNWJ9bqiW7A1RMqSJcJLpdxqx6ujcevt0YuuEsM5u
ghjDMe2lqK3FqUIgKiijZ3z9rhqW7U9SBsiJEjUKSx2RTv1l93o7hytz4AIB
zOWcNd+cyhiWqeuRVmG1EDEtIHikEpLYLr74FtYaRQ2hr+hpF.7P5BtPq05O
M0sdroasj6Yrf8wvkYOn5kkp.G+CDtsfPrJgqkgqXoY0tXVvpzZWRq+6z7bq
lXQ+FGSqT65kNRLe83dhq1i6Hg9sEl6ZCkoZwsIf5fzsV6uddR1h.vyFWp0P
D8ruuB9JYOahZG3vUuyISm1A301qSvaKJwaC5c3JpfNHeBhqtBKpyG3Ry60l
hpn6SXtl1KcX9qdLX8NVJHHgw8Du66CWElwayxODwMmhWc2OtKi6cb22FErN
d0ch6Ye2a9Ou9NNv.BhVBH28VVxixZh+Zf12ilfJs9HEQZ68c.yzX8mmMoCa
KlB1tkWQJHW5LwkX6vCd7jrFQ0lbuCBdZKWeaU7xaWVwS1UFORfRYb7l9O5t
EyY7lov.6R41HuwKaC4b9mi2A1rKMCjxg3rGXpQdPzblrGBxDum+JXabprl.
PoaE2qhLyTmBmIlSgM0HmBRoSgJUJwUwbdG3TruoBvYTt9BG5sxJrT+.0Een
ZMQvnmWScNvgFuR3zkvuSn11Zh4Cf8LwGf5yqPE4h8EJF4gxNHt9QdhR2xNa
4oTmgKo7oSn6e5jZckynQTeqnSTlZDkemIJd.ZAT50+DkOd+SGdoHpTQMySM
lxF0UlBySMMbgTXQ2qe3SebYpsebyjimr6LOgvMkbpu3In6kO022Kz4N4XJR
my84suRJBr+y8QKqjhd4XpoWkT1NclnnngTMgaYhU7.RTIAKCiWkDuaqd4+H
C96IXk36um2RjCaKogswuacghV2EVq23gFnx1g3suQ+HUy6jcDqbHc0+zgYr
MEFhFTTvvZMRR1PqCJnKCSEn4x7lFbak+cUR+ubGxHkhNNNUDc22R5sIdkOc
6qR5aVROryDkWeKoWin7tJouElB0UlBibFvPJL7pj9F4I6NySv9VRuVDk+UI
8svTjNm6i12R50XJ2qR5alnb5LQ4hFR0DNuLkzioipjdaA3VHo2YHjziuJo2
3fPiTzSvzATQO1ldUQ+Ia5EryDUuqnWintpnuMlB0Ulp+UzWkotpnuEdB2Yd
p2UzqEQcUQeaLkcmy806J50XpqJ5agnHcln5cE8ZD0KTE8HuQUQOVrJM4J5o
WUzOEZVsIwfXJd.Uzibt1G8mdDM6LO06B503oqB5aaFt1Uhp+0yWkntpmuYZ
xoyzTuKmWKd5pb9VHJ2Nm3q2UyqQTWUy2LOQ6LO06h403oWnh4GWs7ho09Us
7SlFTa1ZqYH6cd532475qr3ZBORXaYQKsFNtn0FUWqCC68k2FcFE4AQdh0Mr
rZNG3EBjSkqwz6kqXoW8mVJWQgWDDGMjHNwtBhmuAPkuzwtDJpCi.+gImTMy
lKEHxLpuGl5KR.g54FoRbPmJ8V+GbraybVReU++4vH31ZkC43gDh0F9s.q4A
QqdpQGUm4s3AOezQCNlMal0EnEk5cQSWAPdtjxD5x5KwuP8YQijOa0oVBl3L
70gNcgb3HA4U66+W1PNwejfbQUrk5VdQC4diDj6BGUD+36vG+Y0N7we7RrEe
PbFRE4Z4uoW3s3iKilCxSRyA1GNpZNNtiJ9R5nNnMcTqVubGUuAzQ833L5Bh
y19CINWs2HGCb942fHazn8aS8l4g7PTYmz6NiB40hQ5sVnSuNsPMYgd42Ypx
2YFFQ7njgn2buNNxsQTdcln7fkDEo2iotNRxsRUzNSUN16opdZvjoWmYnFvT
tclo30NMbY+dwtXuF28uA2eGOyPMZe37xHJGNjhxcQSGM4hsQwMhsbwvH9et
QlOAv+mX6pWrEaxMedPVDXSdw.vA0EePTWlbqX7A15shseY41wH+ybGOPMSm
Qa7DJZLybhasCA7MpCUbccgh8iYatLBd1TWAskexkPuHDFmK9Fvq1FF8Okcr
nJNQFPa5lfJcpMMMLRFBgVtQkpNWcjC1ru6SbGPs5yM+n7fdo1HJyyI9Mf2Y
In02YYHiN01UaMStREjWU4lpA0Nd8Gip5sYDDcoXz2xgv2DFAN5ziRmLsGRx
T6bgoKLpgyO3xM0UW09eujQO9tTLwfIxX4yUMSSTmrYhWL.Lp9wNwIfZSWVq
0Rx0Tu0AmYaai7QpMg4hZadB6R5U1s8EtXssixKMFwanEvIMdWxhB0O4SpRP
MyYIKMKLZue5OUNpd0emODtbYs86+5pOglSoc11ESADyLd4DnZpY8Higdmom
wCM13mdHeStxMa71SOmdhwQr1vomw6XdDKc5Y8nmyVus+yZq20bqGO8rd3yY
rGSM05cldI6wF63zTl0KrwiLNYuyzKYeiAhsTUknbhdtZ8SwX1FU7NNILqzT
kkx0nBKZwme+h.d6VUeqEsyq7zWyJM3Q1x2ysFdandePVVR37cYpV4TsnZx4
fVaGXWG6rO6zmZZGd2VMgUqimGrN+Pta+23QOjvZ7vD6HGZa6wu95PK7wfRK
sxocZqm2lhaNi+27RYech+ha37Iz+Dmzxm0oYawITHQ1GU998voYaaGAjEGw
jAMc.PlO1QtXJwA0vAtiI.54dtO516GB3Enpmrb35NfnZ9ReCrMNIyZ3OjLo
cFp7OJRYCkcklqs.ubsGxybZf5nMLcnPoxZIZB375YfK+Pa1VdfBS7KAtmKG
rnX0ogpuL3.meH6pUD50yGT70yGzWDmOnGaErlATvvYLXC57eusN8yok1GDA
7oGDAYpS0zUQkSnxwK9Xs1fkiPtVcPcYhMbJvEazBg+DphNqkdfDO8jUK43d
gV20YfEqYAIioW6IVS6J64oMGtwNUNRrIvK6FG.fW22Yt+AbtPr8ftjYTCLr
5W9WrML.VSXSe.pXi1TtZake8TW8AxrAR8J1WpbBgYrQMgfyH3sBqb5YOPPZ
+e3g+jO6vUtS9EBEqKW7lA+fCe.lU.mbNAjy3plG+TJ1W9YBvjqyNMtK9md8
vuwCHp8za3POrO6aoClmdiGmon9Dbv35eSeS3xswbgBoEstR0Sdp9vKWmp6A
SNyQajLLdHvldCBiolN9b4JN6HnJnZ4PkSbhW0ctZzG1F7keXavOyG1l8hiW
GGrTt6NbQ5n2xyDtCkCpumSzotIWl4wFK7oy2kIdZcSds0oRI5sa6xfxU6Pq
yT2Ab.YJOBvNZek21FeXQ6yJ6W7py75174aTatKIuUdBTG0CihyNth1cmFaO
1BAStlnTOsu6GesSO6jWLKssBRRh+n12qXUyjH2z+Zi2Nx3nUzz6aMgBonRJ
jhK6RyyhBkstPrGzJpSvoV+idNbXsIFeYjSvZwpJhWXdjs9yfOGuCrHHBjJ6
eIPd7F3cVhdI8cVf+hr6RUaiNfuJ3Vv7aAK958O0Fm678DICah7JGYuNLHTx
AuinpoE6UrXGFBv8sr07uVvak8oD3MUGsSyRQ0unkmkQogr8UPSSNwIql23J
nDU2Uundazo7+EfU6qLSzAiNXS8DAhbfEe1j41fH15SSSyCV7AwhgMZoArm7
8oDuY6tmYVEEyKHqCW7g5OhSPjkGNM5qpU3LpmG1141F+KcnrEGf7UCqn8Bx
e44cBBPs76jQTE8NdS3u5Yn2eG47QcQ4ErxAhw0m9qs0TUW89RnAY30kfamK
9lJEpT8UU9xNP+ci9VcprfLqrfNZYouMLOS.YbqXLpELF6Hamiibj+QTRwKF
NDlZt2x3hvtlXX9mzItuMKGrQ.FjL9VlIFl6naV1lXVNitYgcMI0BsqIIwpl
w4QT4Hko80dg37Mf+BjpcGdCYnM1HOButliRd3bvscYAEqliWZuvVJHOOUl3
ECXQzHuKrS2qqyurcgXeUaVp9B0h4LGJvZZF58x3zLQ3AJHZ2vPmgLCLRoVB
5NCkueFzvkPDkTbub8sjgjHLrDifiOWXTjd8ptFCCCOU8dqWAcKbI9ogY454
qM8KkVU8ocY8ob4AS2R4Sk+i+OfSh41D
-----------end_max5_patcher-----------
Filed under: Arduino, MaxMSP No Comments
5Mar/120

Introducing the Middle-Aged Engineering Grum-P-Lab

If you like the idea of controlling music and other stuff using sensors, then you will probably love the Oplab from Teenage Engineering. It's a really smart, inspiring piece of kit which takes physical input (taps, gestures, pressure, shaking, etc.) and outputs the resulting signals in USB, MIDI, and even control voltage, which you can plug in to your favorite electronic instrument or software. I love the idea of Oplab, but I can't justify spending $300 on it. I figure I can create a microcontroller-based sensor-oriented I/O system with an eye toward modularity, expandability, and ease of use. I'm thinking that once the initial work is complete, it should be something I can just reach for and use with a minimal amount of fiddling around.
For a microcontroller, I chose the Teensy++ over Arduino. It's also AVR-based, it's got more pins, it's native USB/HID/MIDI, it's smaller (fits on a breadboard) and it's cheaper. You can even program Teensy boards using the Arduino software if the C language isn't your thing. You can pick up a Teensy for a measly $16, $24 for the Teensy++. The regular Teensy actually has a few more analog ins than the Teensy++ so that's one thing to consider.
As for the sensors, I put together an assortment of items including a piezo disc for a percussion sensor, a pressure-sensitive resistor pad, an accelerometer, and an ambient light sensor. Those should be a good starting point. To make it modular, I am using standard 3.5mm audio connectors to connect the sensors. For cables I picked up some 3.5mm male to male connector cables (the kind you use to hook your iPod to a stereo). I'll cut those apart, and solder the sensors on, probably with some heat-shrink to make everything tidy. This approach will also transition nicely to an enclosure should that stage be reached. For now, everything takes place on a breadboard, which the Teensy++ plugs directly into. Since Teensy supports USB, you don't need to fuss with a power supply (of course it can run on batteries if needed).

What a nice collection of items! If only I had some sort of special container to store it all in, like maybe a tray or something.
In terms of software, my first choice is MaxMSP and the Maxuino library. Maxuino requires the Firmata library to work. I wrote about this a while back: Interfacing MaxMSP and Arduino. In a nutshell, you load Firmata onto your Teensy (or other Arduino-compatible). Maxuino communicates using the OSC protocol, and facilitates I/O from within MaxMSP. My initial step is to make sure Teensy works by following the instructions here. I got a blink, so far so good!!! Next step: get a sensor and send a signal into MaxMSP.

9Jan/124

Monome 128 Enclosure Kit

At long last, here are some detailed photos of the Monome 128 enclosure kit. The chassis is a formed piece of sheet metal, with mounting holes that will fit either Arduino or Monome mk logic board:

The end caps are available in walnut or clear polycarbonate. They fit neatly on either end, as shown here:

Six screws hold everything together. They come up through the bottom of the chassis, through the end-caps, and attach to the faceplate itself.

These enclosures are an attractive, durable housing for your Monome!

The kit includes the chassis, end-caps, and all necessary assembly hardware. The faceplate, also shown here, is sold separately.

Filed under: Uncategorized 4 Comments