Expressive Guitar Controller Project 2 Steven Krenn

Howdy,

I wanted to make an expressive Guitar Controller using Max and Max 4 Live. I used an old guitar I had laying around that I wanted to create something fun and new with it. I used a bare conductive Touch Board ( https://www.bareconductive.com/shop/touch-board/ ) for the brains on the guitar, and an application called Touch OSC running on a mobile device.

Here is a picture of the guitar:

guitar

I used aluminum foil for the touch sensors which are connected to the Bare Conductive board. For this demo, the touch sensors are controlling my last project, the drum synthesizer. The sensors go from top left; Kick, Snare, Tom 1, Tom 2, Tom 3, Closed Hat, Open Hat. Then the two touch sensors near the phono jack on the guitar are mapped to stop, and record in Ableton Live. Also, there is a stand alone play button on the top right of the guitar that is unsee in the picture. I plan on using conductive paint for the touch sensors in a future generation of this device.

I also had an incredibly hard time working with a Bluetooth module. The original idea for this project was to be completely wireless (other than the guitar jack, which wireless systems already exist) and the Bare Conductive board to be running off of a LiPoly battery. I sadly, couldn’t get a head of the correct bluetooth firmware on my HC-06 module chipset to support HID interaction. Hopefully in a future generation of this device, I can make it a complete wireless system with conductive paint. I wanted to focus on the Max and Arduino plumbing for this project.

On the Touch OSC side, I created a patch that interprets the OSC data to changing the parameters on my guitar effect patch running in Max 4 Live. The Touch OSC patch looks like this:

touch_osc

The multi-sliders control the Delay and Feedback lines I used from an existing M4L patch. The first red encoder controls the first gain stage of the guitar effect. The second red encoder controls the second gain stage of the guitar effect. Together they make a distortion effect on the guitar. The red slider on the right is the amount of reverb time that the distorted guitar receives. The green encoder controls the amount of delay time that is taken in the effect. Lastly the purple encoder is the amount of feedback taken in to the effect.

 

In Ableton Live the guitar effect has this UI:

guitar_m4l

The effect parameters can be effected here as well, as well as levels, and a master out.

The drums are pretty much the same as my Project 1. Here is a link to my Project 1: https://courses.ideate.cmu.edu/18-090/f2016/2016/11/06/drum-machine-project-1-steven-krenn/

This is what it looks like in Ableton Live:

drums_m4l

Here is the code to the guitar effect:

<pre><code>
----------begin_max5_patcher----------
4618.3oc6cs0iaaiE94jeEDtOroESlHdQ2J1WZ2hTr.In.aKv9PRw.YKZOpQ
Vxqj7LIon429xKRxhxRzTdj03I0.I1dDojNmuyERd3gj+4ye1r4oejlOC78f
2Ad1y9ym+rmItD+BOq7ue1r0AebQbPtnZyVjtdMMoX1UxxJnerPb8L5czr4f
hn0zpx1DTr31njU2jQWTHeGPKx0VWAfPOwW1V7uPrOA+d0MkQyYO+fhnzD98
.Kudx10QIwzh7lWLJT7tSm+GuzlLaWMS2VTUUqxqlW7oXpn1y53MoPh1RRDc
s8U.WmcTH+19qm+b9GWYHZkPumQb6AVeG6sXYcsFfxAi3uXrEj+EwWPEnF3j
Bdf5.OPciGvdwCYkJ9zFpjDlsLNMfQNiHemwdGTvqfuJKHYkN8DaaIG6HTW7
rGL6S75l8Qly9yth8+QWpqSn65fELpmv5ffFNW6dNKzWRogyCV7Acp8Do8ls
zFzBOXH.e9I2+bLXECD1v3NMrtOV3LD5JD6tVCW3ae9w5+xu9ud4dx+W8cZf
AOrvx2VnG.IP8vPGMDPHOhv.8ygAK9hNEbGglsKVZhaW8o4RYrwsycDzebzc
zqWEDkTyC2EjkDrl1pz2A+cMLIQ511ww6ZGBzi3v3QYC9Xmg1TeGP.Bu6cmw
nsBZ1Mzjf4R9F1I7X2mrNOZURPLWhu6W7+K8CdEmoy49C02oAWGgVqraMcwq
4A2QCuInnHKZNybX2uxKkFkhCNfGukltr5xUWuIyFmlrRqPQo142llUTW82F
jytH3W1VzUcq.FqNJaMSpvK6kBeScUdfP0xoyRiRhJhXvq.tZzgOkJskUoZE
XhrbgFb0WiqCYcMEK6yQo2X6g2NDAcl6MNjFG7IsthcsDLuiTcFcDthgOhX.
mqYFXELeKswgeXaXTJ3WVtTWywjReXhgAv631XMREHxp58tLMYmk4q2VrMK.
7VZXz10U0XaNc9pzjEowoYMedc44ypAelxFMV8MwFTiPD17iZ1fWaypoBgHL
hcI1vqX+vk3ag3+.45Qvv8eARDpB3S5Vs.2qZACE1iofJOdU55pFezjT5V8h
8+njC6iGBktDjCMoKMh0ogJMAMeUafsaxJltJXwmTDDvwypOHLmwKayA42Gw
TyMPmG5x048ki+fL.mdPnu4p1OHeBJBL96JO5yRrmQ0GA10WXM9grUa4EjCJ
RAaVtr3Ke+6SfeK3EoyiiVETjl8ouETbKEjuct.QYssxp4bJf0+gPZH3Euk7
lqE9ZuVb6fWBVuMufWinDvaC93+fIXnAYKtEvt+a+12mf3O8MbkufX4y90u9
2.b9ieG4Aq2DSyAu.ZgHcVatURbvFvxfELxC7BdsvJ058yBxVk+9YfnbP.3C
zOceZVH6dCJ.bwA3SoaAgzkQITPPM+uj8rTYz2mPTdr5pK3EKRyX1UaRSBYJ
cbL5aX9I9Fz0WeMmsTq82VIGhYzvhzsIBggilQMfbkwIQLrABT7kKY.sUAwc
p49CY7NsLvHKonOZMp5i+VJSagBtM89VPVNfID+vUL0tEePTzZVWBAUnePRH
HLcKqghWtHNhUizD1+X5JKE0UpYxfAFfJzzS2PaKS3Ro..yGC39njvz6utSY
jstX+I6jLAJiAnbvONCoCE11OIDRu9vA5vyRnvhQBMUa2pQOLB8tneHB7iow
gOTbReijNX6c8YrIaMhv6uVP000ceXYrSDpYX3nAs9mNkO8fpsMY2nKQ9mDP
sRmMWaz6ktYKCKqCZzfVD4.Zsf+cQ.yw0oEmIDqc3bStaDw4eh2U.wzjnCoc
88ZBzNiGPaeN.zHEf14wvKAq+63SiaBjyikeB7H5mPDVIFYxqUGgBrxcw+g0
yBSQZ4DZfKm5uw.ocGdf.qFmQvlMrdcGjrPotcNVipoD4.No8Z.9cvjiaD.i
R9.WVzDY5ODg8HrzDkv9pUEx.0DePj1nChr0Fev8ke8GEQnAAQrqWU9FFdDG
sVTtrieOrvLJrUDNdNfkxdNoZdwfsEoqEZUkQK42xhVshloqqNNJVVxVrbFC
KKOSrrZDYmlLR2Fb8EZuCXUAQMBrt0dLXUHWr1CDKc5VGtgyD6uCa60WspfN
jFqKXm1VTlDoDzE.xNUqNMfZYezoY3cQ4QkZCnSVb52.9orsIev.C.4rpUlz
.VCHhUH+iZ3RCXB06ILUMZLWN951ZgKih4oTStpkqngqFWVUAccveHCenasP
iw9xKsSsIixkdx62t9p7PPEUvP1sYRN5idN6TC41YYIaipiMoP797pGXs4pL
ngx3HhbkeQZXvxCJJODEzvldmmwi2PTRauU0EGRWFrMt3ltQP0xWFrf16M2u
.9YyVkEEx78xnDE7le4p2Iab6h7QoI+HJOIXSG2ZY.U5tPYPYmGj0zTppvhz
zX0hpuuX5xhxh2DkjzBHKR2zegLi9a0buySYEtV2yVTRNqEVYo2vLfKtg6XU
sdAwwkVzpO9OFjDwbNSEIIFmcspKT13xs4KxRiiU3WYI20QIgL83Ez6iBKtU
0UEqDV0i1T2LPsLNLZEMuP8ZEAqxUuxdV0rKUGGraJnq2Dy3B0JnjHcMMJa5
6S45ZGGipiv+I3mEIPBCX4cfBHZgJGDkvCUWBEjy7JFSA7opVDpOlSnMaKJi
nKe9qa7PUBWGpQAZRWOGkz0yu4r21SmI1KrTVMogdGXT+CNpGASeQxqQKRUM
DM9Bk2FrA7NKd1J86.QFswCc56rtl0Lb4EloGekytrHSA1gxdGA757UH595z
L.MXwsf4Lj7JvJZBMiY1AB3PaX5ZoU.f8P1jEkSCAyoE2SoI.KgM.pNXw6q1
iOfZurSmxIS.JGHMw5HDK1eEJV94J4.2QDWzjOyHzrTWGZczJ4nu5Py2zx2b
WILlLhqky17w6g.RzidJ8E5IDDpDoh9RovpIxtdLxGEBh+5DA+QlM7APPDoA
BZe7HH5oKBJoCEbJKsHkOPuc4VG4MWKXD0d6zUFR50vpFd7V01nGBbUoUTms
niDVoLbdsodmd7orGQD+CiOntwG+GjBG5fHn9fZcp0I0fyuRDn0Cfx3lc+D6
bznr2CBkgCGkUiH+iHLu8yQbf1HbtLURsNZX18AAy3gCyyEsLr66lIc0oFzE
nwX4t0qY3iMvaqU2B.xnpDqBkmJewiJNJUjev3nM7IHPpwKPHOJ0hwCYHBJG
YoqA8jB2MBhmZOtGio+tXjxG7cOAGSfQ7x6VDjmtMaQEQT1hNPEuBo4EQI0A
M9c65YTqJdaTXHMosdYXTNO.ixPcZj9xPIYOCIY+yFJl0RC.9jihMAiwmMTL
2InQjr6YCISF.HiNKnXrgTr2HgwxTsodpwJmzY47.oYFmGz7Ubn4wpuIIaUb
57f3xYwn9AnaRO1MyHOvbin+7HRjNbFjDQUI0obAgNh4PD15LJGhvmu4PTWB
pKIPzTj.Q0H+Xm8PdtJ1TiW1CggmIYOD9qgrGps7+RpCMJoNTk1uLEqOhTGB
itj5PiepC4VZqRjQ909RpCcI0gtj5PWRcnKoNzkTG5RpCcI0gtj5PWRcnKoN
zkTG5RpCcI0gLM0gPVWRcnSepCcTn7kTGZnoNzQAyWRcnKoNzkTG5qsTGRuq
fKoNzkTG5RpCcI0gtj5PWRcnmjoNz5swEQ4wQg6xhgt1XUxeYGUr6tpbGMqH
ZQP7KWkQo06BsKBRBYWMghU1.Y8r0sq1VeSdU2DzyB6KpusqCwUrw354yun5
c1+1XAVNPJ25cykcI9if4ZuI2181z6Qm0F38.Dxv4s92VhWcaZdw7.41aa8V
dUo1lCYf6Jr0zn8A22h2PC9fY6vwGHKSVvLOBCJBZBf0zgix17KgiWnN1qeK
tMZwGXcoQQJz69QWycGxx43ApnWPKXB0xL33c6+1poNTUE7QPaGeNg4WodaY
a460y84pvU6t481ZnU0M8IPnGudPH1EYK9E+G1k2136MPjkLeE3JnLsTFjq.
eNMQDuDnuikWOB0i1w.4Qzw.anQW7LzwFnXyUF4ey8Ln+PK4mYEn6.YQl4WN
x3oKiOgm0HbJkfsO9SoDVeE2vbmciLQ.Dz4KK8KzjzxX97JhtSe1GORGvIx8
vQHguyvWFEG6l5aKhi1bSceGqfiDFWuQvY6RZsGwTorgtflrnruZMFGNJXqw
J4kM6LTYJxd49RASwlJd6s+d91VOemhOmoRXYoK+L87D5Z1kS6JTeBZZuuEn
ikgInohGJahzoGuU+xeXy8t4p5W6nSpyRqvdSsyIQ.XlHvQtbDHkGFW9VCVD
X6+2DQfnMnvF6vuJ8MM6Su5+VGJ8NylKWnbFdH6197HtiQe2bN9k2xCXgr3T
1DAB0C+7XlO8JRCMsCnoh5aJnLg5srFuEphA95seD80ycxLOHF8kC2SKaGop
Ad3NzINSl2Dzf8lb0ifekxUFh1iR0xCUTrLAvFSWKtltJeTDGPK1XTEiSDVO
lAHa..DeSjGifOIuyPWRsEj5WiOcWMS7IwaverbJgDOqC6WpqEcTdAciDZrf
S1BrqOynFaOyZsj7fxEJm7DJUpAgGk0Km2I0Rho+beEyZchstjcSuCr47X62
1DCrVmdOC1Fy2errvrMx9ZRZ2eSPBMV25yVdhMW1JiW84f5C21ndDDYoaSBk
yeFzYbNq2IkGCukG9GxUrBxS2JDkuZYTVxPCNBW6BK8FlZW05U6Zr+IPr34f
NMhEh0ITrTd7v7zUrbnSB86nYyuQrT15Wzgq1Z6KOtIcG7QPK7L7.Ae2wOaF
qI4aPZ..jr4VYTG7ICm8Im8rOT6IPrfuwGK2+Xd16xZYNOXWeo1kZwUG6v1X
lokCw12A24wHHRiZg7jYFK.FYXSvC4.TuNO6dPqK6wSkXaHyK3BJSc.3oObb
PYqUxXp36umJww5K2YDWn580PqXNVvhiU1FD93ghyi9eaCB0E9A9RJm61u7H
8lo4XqyjxoiyJDzrQKxiGAmuLJl00tUYAatUGehccq12XtpbyRoUimJ7oW0E
kO9dOmTztkdz8nJbMGWjqz3FSJkleTU28NBfas784SApjoJMetBvE+rF9E+y
AdsiqExSLu4HGHgOM1vq8crgdvqZeJR29C0mEhexABwHLR9zfVXrXdSIVdtP
j9m1woLvFgytiR4NTCJO3jvXXikNvX3s.5Yhlvxzr0AJmZuOnlgDKifCd.ca
4WoraqxximelE7tto0MisLbat0AXZnMb67n5kQajRpK7cveWWO2JCwqryKiX
HG8dTlLixC9cYyWm7.G1LxEcf2ZBbgnOk.zv21spluhNiag5tg0IaFD3mZ4B
F3KZGRfaiwD4LbiK2m.1V5hxB9zXWY+XZWUlSIOJ1UlZTAepaTAr00lkLRCx
Lsvc3VUjGeqpdS+q8KsyNKUFYLbU.xJWaqO3r.Cc7IA1IJStfkiOPZ00Aqdh
M6ZJKzO46f2PuiFepxDKs6hjCIEqd3VuzOGDt3KZOBk2MjNR8mO7txO6zM22
8o8gJ2EzTYjFfl3Intr+jXX6EvSIRpeMyoYgQUuJ01eA6r+h0YOIpoTiqATC
RYAGdRIGdNwcP5gmmE.rF5YcT3lT13uKkPd9ktO8kqMUjz0RiM6qwjCLgA7l
N.0DxgbdQNvyJxAeVQM7IM4bhbNuTcfmWpN7X4OQ9ws8M0wIZZnGjIlVtSl3
x1D3YxjVDS5Df8z0rKwjtAfmtVsHF4X1dZoGnIzCz7tk35YIBDrbgD3v5OR0
ecB5VBwDC.7z0VWq9bziA4DJgMxe0z0ZWqNA0C9LgdHLbTKSC0fMw+oXrDjy
G5QzD8DQOtlhOnyG5QfOSD83XZuklH4kIdmQSm24VMkogdll9KgIlpOeFQOB
84IhdvlhO3yG5QfOSD8bl05N1jV2wSWq6XKSomIRe1D2ySW2MP9mWcdFYR2M
ZQzmT5w0T5YZTePFo+LgxKrAMmRltlSQl3ND5Lc3CzzYg.NczCzD5AMczCxD
5AOczC1D5gLczCwD5wdZnGCTeZMSWmZxwnNic9PNDmIkbflPNvyFzYBGIH57
ZffPOSa4ZhnGSBjvz0OdiImIBcLIrFvoaZEflLr8IjbPVFMmlGx0bq4Uv2Vj
IvN9h7bvGKxmpV+kki3uJqI+uNAy4PaJuG9CMcsDBMoilS2jN.MbRIOFpQlm
RsNRM4DRqiRyVGil6eDZ1+wmY6iNS1a9ud9+Gqj7bM.
-----------end_max5_patcher-----------
</code></pre>
view raw gistfile1.txt hosted with ❤ by GitHub

Here is the drum synthesizer:

<pre><code>
----------begin_max5_patcher----------
5794.3oc68rsiajbcOK8UPL1vOjLhnN08J.N.1YCvBrvNAPF4kMBBTjsF0Vj
MmPxQdWa34aOUUMY2Mmgr4ouUcQtqVrinH6Yly860o9Gu8M28o0+Tx16l7uM
4Gm7l27Od6adi+sbuwa1+ueycql8SyWNaq+wtKK4us9S+06tO+i1k7S67u8h
Yye9va93rcy+RZ1CebSx7c4+roDEaJgPnb98SLTXplwX.69IL0Tx8SnzojIe
X+2d1SqRyVlry+6it+MSW3+0X+U+NCbW4St9ocGdTx92c6tedYh+ouy8F+y2
9V2WtGI9Me8pUIY6dEB99cIeKIaxOrIIKqFDEXJ4To8OT48S.tG6.f6QRREj
7wMIas+ZlsKccl66DNExCuF40xpP170KWuI+WLYpVRUbw8tWoHBsN+UZNCrf
vwz25oZm.DaAF9oGNB5XfB3fClXb.XT+qXRJQtG55Qd0+0iVN02Oa2j+m0Ke
ZURcrKJHJQFhn2YWhQmcgDCGQ10+wx0aSVfjgQjrAkgwGcFFRLbDYX+k0ql.
WlWY.XPYUrwlUgDAGQN06ylsIY74TzekSgQmhdYNkxZb.FPNEL1bJjH3HyoX
WlSIshbNDQqFFNEYr4THQv325GWnqfHx9lSIG8PJPhfiHm5GRm+0I+40oaQv
tXdDPmmDhh1yLqQOnBl1idrJnGI5XU+2oV1hMlcjLKJTAaz8FyBHwAyhppE8
B.y5LUkwBnIoeK44Iqlkl8QKhVWlUZB3.cklZAm7py.Dc8km4DLEg7zkmANK
sM+g18yOljCI2sM8grYKuqOoDVl2BTjg2YJpMEmp87UmYSinwDhAsLUKsr0o
KRsTo8+391rMYyVkb7G9izOTGG2gfVrx.SsZJbuQTW8b5tQTR4u0MVfZWxlO
ljM6S43KbRxB8bBC2c+j697x0yr.8GtPlyWBe1N6aIK93rc61j9om1kT9ps6
oz6I0Np4xmRV+4Cu8g2uJBsbc1CET7+XpEKt+0Oz1urdytK9TGvV3De1JKo1
+YNm.m5im4ESn7S9woYo6rxAul5epmZeoZ4GnWG8LOYelBQVR9m6kYO7WCi.
L7g5K1JcPDfElwQ.9R3yvI.+9YqdbYxkEgO+yc.iI0HDakgIPMRwPeIDWwE+
4khgtKEettgj7vlYKRpuiHLv6mUwsQ6A9vjjP8NYXmPRULpda8Jp1vDe5rZw
U+vZTgqDfHwGtKH5C8Xdy0iY0oG2bc47pYbNDa3TneIwuFc5ZezCD.5I9L62
xp8DmTWlBtR4mLKy8huai8Gp+E4pB2cR0w13d5PDxChh61jkVN35MOOgUmPq
gRxSRSTDprzTutK+DRmv3q6dQOvHzcqj9Se5ClMp9fqGoFN818JNWRm8rOV8
wRt2MKou7yJv3mkLXpqq+VxlENJwy0psxMEdZUJnTkUz3YOPPGUU1ZaHG196
T5oUP5sRwPkQUKdpEGGu5wXs.sXUx1sSH0EYHPEEyJCyv7EkAZb4GncOxv9W
Hkhs0VkLv7ILoepWnLp5tUs3XzKjlOVIJtkTIyirsEBopHTFkgsodChgTYT0
VuqY6nfxBsBcteegQ5poRKDQ4QlHZwvs89uL6Q7y11v30GLw07sM1xqHFwsK
x1NZ9uFH1lNtlxsXkskO.AWhicT60GHFlJplgfXkeUYLBtDSiQ3CNSaz8kiG
IGal1EsJJdYYh6UN03Ol1V0KWem0FKN4QRoN53T+oYa2krYR8MPmLj7oweje
8HyXyfpcHG9MaW+T1hKLlCUMmSEhoF6ejlxgMpQUZnbNbFhQc3gYoYOi08Ks
2GzRalt0UHZRsEhFe8.uOuGJWp7zWBY6wYGxJH4B+4i61j9vCIavJLQKmbsK
MzLjSPsIlQJeqyPF9T5+2SyrZUjob6+O4ct+19Ek8eTWwrzTmVNiJrjAgkjT
LQUhKPSjullvJHIedcVYK.9CapzdltWN5J+J1l92yK+uEJGBJoVN4cfmDl+J
i8UlZIlzBhIWUY7zTMmXBk8D9plZ9u7bsDLnffIo7hWS0thfznNd.kSXvUN8
5RZrJoKBrbMVioPHiSabWhfxYf7pll8uhUFSnKoWsRFScSPuxbYd9LVYLUoW
Atr4SWpPeqnWxvJkw0ETLFsERYlaEJFEIEiWwNVanXkCx6Mts+JQqwY5NY6W
B+BwVVUZFv6jsrxScyUMMa9SabG1Bxj2UmIMEqjvwpLNJplO8mfrwAy1pLS+
zrrG5UBnq4cydH4UTPecR3S.WJVTKgDXD2KArjStpL4.VaTdGxfcCjoNXZcM
vVPKh.gqKGeQlrEDKULdRel+yyWZUBYDhK+x5HEbnjTPKypTqaAoPGijBuvP
cIVKL5xnqH7N42ScaDC+14ybhOjoVR29uVWjCbszU5KAi6FCFVA0DHllWZBc
TJEsLMq1.ApRBDBkqTxZktclTzl92qUKnDe9or495DirlmupcGZVeLtZFRyq
7LGOkJefnuu7jMbradDUf9BH9rEKdbcZ1tsU5LDYpQSs+w9J62jM+DtTSTFe
WQTN6O9Ofyq9Aj7GlP1+Sv8kd1NIYpnN6jpJtJjcyNoAtUxoBpMmJghTRyHc
qdZF5MAMyQbdFKIioPmR0oxLvvt8KyM2FxxgFW5hl6fyWEoEhX2FsEX9xzGe
dx6n1nVlhkxUIrEUajzD2NFzvFqbkz14sHLGyu.5OfjU1zNIg1oLMMpeAPup
jYtjUpRxkMutsF8sO8R.pSm6pnEzqaiNCrNK4w0KSPS0rphEEer4tLoDxuLL
7WgjwEPWLjQIPLlg+EiKsJEfVItTRiiVfRnQYQCQU4dAjWpYsqTyxNU4dJQd
cV49yP.Wsa8mwJBwLkQCvawAajbkEMvYa1A314Gj7tcvmvMtRb3ds.qLHsbY
UA7lW1Z1UdyNZv7tdzwDpqC7JTtaBFiAd83i7T+Owq.WFQS75Ew1.1yafxkU
BexTrd3ZSSu4p3rmQ0h+RSkj5TkZTllGzMOJ61QC6+CvXUFPIUoDQqZ.D2bM
1.nioAUzJZSp9Bx0RGfN1kx.0BHADgs.pIX9o5ATdLeNICqrBwnA+o0wstK7
6YGxTEmKj5yz5GZOeJG9xrceb8iIYHNnCVDO+XZ4NR4z7Aql4fa21PnoG0An
GVlL2MRGeniN9tcNbJpdTCm5nih7.DNEiGSgScIrMjgSQ390gheIhHXcadnY
hquvoHRYA9KIkNQaS3TL4sP3TVaAkRDUlP9VENEScUFN0QzfJZEsIbJl9pIb
pibo7pfJ1GZsh1C1iMwXLUME8qKvJtMxDpDbSjEYJ0+MlGGkMjEvFttTDvXq
l628IXht5HRP0nqnrlGcEmDYQW0rHMcEL0sJn22iFkOHSUKhsRLjwV8om1sq
ds5C3AQUfGz7nM3MBM5t2s1a85LbzzOO42lB+9eOW869c+1T5+NYxtujj4dO
DDDslUxXEMeSTBTUTJeiWamUoVZGIlSawcs.kNth4GgLcUVmEwx5hlHqWkpz
cAd9Ua5xU2MocOa4QcaabzZVc.RVlFSaaiKgr8ZrR6VuBPX2jRj7x0CK0eUQ
XnMO9HXrVzFHu4ODe.qBELDqebfLN2AH3wrgaGj6ucuJY.0rFx8OYSuMPZyd
FGF2EMNAsBIur8GsoJNP2yZI2vVeqX9cIym8yUUJ2rd2Z2u0hmXW5Et4lA0P
qyBTL5ruZ2gYAMizezScc1P5OyIfhJ3l51cX8wkM.dZR+psml8UGea64T9N9
JI3XVec2JAtmr4WNPGtUBH818R.Ug5lI3TWpIa2k7XdIeN0uksOljrXY5p82
lQC78f0eX2tYy+ZWz5LVaSCsRG65RoCOIYD04dImuFkt7GsCZc8lR20hN24F
27I3cyqDcyMOe7byWyDbhF8Mk2LlLdySgEDwUp7yVrcyy0ekb.EHOe+E2l60
W5FaSbJj+Lkxj2lrXKek++68SEasRDJVIQQ5KQeaZQEDwqQBrJDUkI3sn1Vf
NduzbQUgqpWrIcsBWJ0XVfqithV5+BbozQT8stDt1202hhp9VBOPIHt8Iw97
i7WAyMuHWpHuFWrOfUkZPBcWONk3BOhMzk3BhnRb4N+FQbItzS4FiRHcqgwJ
K6ylG6qItqvEz9bs0Ry.qvZtxpuEdJxnWdK3WKu0XUdqtnxAxgVk6Jq5V3oH
ie0sfqppaolJtoqtUEO75xyUZa7veEVbKadF582JvjxshPKpsk4ZqzVDMuHc
q86rkb5PyKsk4loxVBd4tXQJKZWPKJuk4Zs5V4aDUujPEohVTbKy0dsspdin
14ZaIFyZaczc65.TaqX5bieIbsuqsECyLuJyKStfjOkHNmssorV73trVpOfU
aZX5HsRLJ00BOlMz00hGS00RDu00pPej6Gix1zIWkLpKmEu84VqrwDOzJplq
qjqwSRF85YwuppmkfbCUOqNnyIk7gVmSSttz4vSRF+BZw+0BZEKEzpv0tLOm
8V3ZWCWa0wp.oM9kFaaFMKM85p9UVaPjoBc94JSR8aIf1LUVZ1sQsq.q0QOM
P2oMUJn4Wk0s5fFvdIg1LKV5nbQhrE8ADCrgUexCVqo4lCTv3drZOBU51wpU
Qi3SUKqImp1pDktdpZUrn6TjibNwrQBkWJVloyh4R83JleDpzMwboIhEyglH
lWknzYwbRLJliojwZNon8ScUJebWEHGgIcTHOl2FHjFHjWklzUYbY7sPP1lM
aSBBgbaJ8mNhkluva3iaDKGgIcSHmGwArvzMPHuJMoqB47HKdEKVlj5t5.P0
IYQQkrXZeNY.k178e+3dCJbwdL6QnxB0kig.ue1L4wzxAYOmS5OfBEHJn52t
K2jAUHe8owck9Apr6DawbJbtksS+XF8rJSaWm87DAYpEXseQIpqRG5xdnqqb
S1bnI+mEa4uFaEQ+pyrflPqencJFaIkVVY00z7km4U4UQKkWdAJp3PWlaqys
d0huEmIiT1fDfjOnK4KMRYeXykFiaKSFPJ1C2.QVAmUDLKJSxTqCX+VwzeQF
LkpYBMzqKEyK4mLWl7.CqGmBKFIhbRddrLf6Y5JdJpZUnEaYZFb0sjoo7RjW
2oStEidCrgos4ebX9MOxEYK1uzL1U45klqKo.cyGIieM5ibftpNXhH2OYkTU
JWpzW5xZWwxuINb2rKlofRy496kCJHItQ+vsyGbWH7BIgHO3ubHWpzM4RpXu
9siS247gXQe9P.qPDWpLU821jTgnvsQtPfj5bvILkt7ZSZPv04MxzdjWX51s
U5UycGffVMLydL6mxkSSLcWAHxuEhztYuivd0cE.6hl0MJfSMdS01mVp.h1O
QeT+eBaJP77ol2i.84lDVDSoA4ubN45RV0vjJT97wXE8qgp+Nq3w9y5nPpxG
VlVrwht9tscp3ejpZ6PAdKjCDeechgW3erU2wNWi9GUkMhw4irkKtL8Ul6wg
JwmX2EYqR7wnDLRtGRWKc.tgIXiZlOal7a9Z57uhYEZozkMdlVFefV13iZHm
GcCU.RhffPK6DOurqyZcymofwcvYNBS53LEDwCNCS1fYJnJMoy2rHjwZmMb1
aF951nyJu.rV32HofKZcAo4yQgJxPYRs21C5xojpi3sNxvalrthUawvBo7Nh
3l3xPd15cIo0Y0Swpf6DR4Fnf0X62m6Nkl0rCxy8G8WshXLe8pUIY6dE036R
9V57jIeKYytTar7SVltJstRalea+oHESbh8uzMYK0b3m8mWmU4nosoxAa7ht
5p7SXa5eO+LmUb3zt6KoKVjjGGY+Iz73xmdvBT0lkm1He4ENmf8ppJbwZecd
Bzj+35kK5wP+Kx+4LDzdTL6OMKMax+4m+rkZs8+Mqt+6v2pKSp4qeJy+8Ch5
NGVZQQqFTLQwBjhQ84c667BoIxnxBdvmlM+qOrwUw+yu+FNu.5md3nCxplIL
beq90LMg5eggaip28Jav7JMuWUs+Aa3p0Squz+cRdACpoBOkquKAUWVBXUYS
v3MaxwgggU.FIw2NIsPqo42VoEu2.vKduadjCLyfoXtymn2OV0tPIcK708ma
wlwMD5Afa.662G25NwqJ33CpghQ7WVupCjavTicHiDJVjcTY48T.0F3fqZeR
nIjZ0fH3yHN48RZq+UTqYI50M8la3dZbaH0k2Wu+Jo9bkwyTY3k5.olouMH0
ee5jue1tIMmHyq6XmwDUHxkUG2hFNJMXZR8VJytqWozJlhJ72g2JhQS7TZug
aw.Qo+y1r0lrZVlMCV2m2qTbtMfc8IRzCbyuQio3zgQ1VJHFou9uRgfR7uRo
T.YeXiGQs8.qm.rulxGH9dr289GyB1t9oMyOjXvgUl3jRbdQx1coYEEl+GK2
rjUdnxDtNfTKR25pB+hh8q0qDFPCOJDviRGN3Qhk9.gAdDXfm.RePAOxvAOb
LviHbvCCK8IPxOTrvCMLvCAC7vCF+xcQkfCdBC+Bi4YQv3VJTTGRv3VJLjGU
37dov3sPENqOJLVCAU3LOqvXNTQCG7fwbna0zDJ3Ai4PoIbvCVuEr3Bb3AAb
jXLGJCWvXRLzGY3z1kXLGJCm4PIFsKQ3bmJLXgmvDrgPhEdHQD7PiL3ABG+R
fEdBi4YAGK7DH9ECq7Sf3WTrzm.Y+Av3OMf7KzvCDOvCMtHOATZFi2zWDv+f
CO.F3IlnOjHi9PhK5iTEWzGoJtnOtgsKjvyknOtodLjvC8RvSrwuhL6g7Hyd
HPiLE9b.JpnP7XiBwiLJDQDYTHR.ygGAAhEtfN3XRYlGN9EGSJpLUbAOTSbA
OP.oOXRgmGtbv3XRgmGtTlQwtb23DApDP3gmvThdFlRrBhvofwTXbXDtdFvD
HfGV3B4fgx.c3hhlgw.DKbUcgQQNQ.Ah7.XIOABdvDfX.ifFizCkDtVxQMHT
2CXNXTLsrLbVCoXBeFfv0w6F.PgwgJEi8GHbJXT.UUwAR.gHTgbbF3A5e3gf
IFnv4QEG7.AbLxPBQAbREnDEJGGzHCh.SzAQAb7+PBQAbhfdYnEmSNJjzHJJ
HBBHDgxfswDPHBUYNC3X0SwAPACddI23bRQj.BQZTjHQ.gHbVr0ADhjnfHU.
gHTwWGvCf.f5Dr7xndGVHhghFERHBURHFV.gH79Pf.AQn5LkNj1rQIXGroeC
PcVe.c.sOp0nsFEHoHMJ6i5.ZeTiw9X.ORK4cy.GIJTLMTlG0ALTDjPT.MXq
QYvVSCHDQPSiBkbDF.Jf7LkAMEJPtPTJzogDHdFpif3Kk9GVHRfFhBEMBSOP
BXpiRTJZAbTXAoBchZAhmIQIEICXfHRN5hz.wDDIUwFDEvi3FHQEslLf1Gk3
5WTHkrwDIBKfYNJvMEOAz.o.kIaQ.SCQnPqpEJHRhlqEHkeg.cEQCEDgyjc.
CFA0gTDB3o3DdwIp8bPTHoQnRUiGRKjXxCIfopwQYwNfmVn7eWWFhBnEatBM
MJTPDNK1gTNBklVHiEAkA6fMbO4n9EMNxBnPDCWYiBXvZLTJZr.loFCkhV.G
6ZfIPSiBEDgRSiFRIaT.T3jhPM7r.Mf7LJJ4ZZ.SBghSJJftzn3DiBXmGvMw
pgrhnTrsJNPvCpdWCAbHiAbMmIfmTuW965bRQgjqIQSiBjEa.237GPeZ.9CX
PnfHTVrg.5CAmieHfwOhx.YNDEnNgBnRTKfGLD.vFsVffGbGx.HfyIBAiteq
qHR9toe1iO9sjMa2+yzCK2sZ1eMee2qt2+OSyx+m9K0p61j7szCOu+Zf5tYa
l+kzcIy28zl7Um+OoyusCta05EIaxdJc+s+k827+7s++.ujRI1.
-----------end_max5_patcher-----------
</code></pre>

Here is the Bare Conductive board’s code:

// compiler error handling
#include "Compiler_Errors.h"
#include <MPR121.h>
#include <Wire.h>
#include "Midi_object.h"
MIDIEvent e;
#define numElectrodes 12
midi_object_t MIDIobjects[numElectrodes]; // create an array of MIDI objects to use (one for each electrode)
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
MPR121.begin(0x5C);
MPR121.setInterruptPin(4);
// *************************
// Proximity (CC) electrodes
// *************************
// set up electrode 7 as a proxmity mapped controller attached to controller 109
MIDIobjects[7].type = MIDI_CONTROL;
MIDIobjects[7].controllerNumber = 109;
MIDIobjects[7].inputMin = 520;
MIDIobjects[7].inputMax = 480;
MIDIobjects[7].outputMin = 0;
MIDIobjects[7].outputMax = 127;
// set up electrode 8 as a proxmity mapped controller attached to controller 110
MIDIobjects[8].type = MIDI_CONTROL;
MIDIobjects[8].controllerNumber = 110;
MIDIobjects[8].inputMin = 520;
MIDIobjects[8].inputMax = 480;
MIDIobjects[8].outputMin = 0;
MIDIobjects[8].outputMax = 127;
// set up electrode 9 as a proxmity mapped controller attached to controller 111
MIDIobjects[9].type = MIDI_CONTROL;
MIDIobjects[9].controllerNumber = 111;
MIDIobjects[9].inputMin = 520;
MIDIobjects[9].inputMax = 480;
MIDIobjects[9].outputMin = 0;
MIDIobjects[9].outputMax = 127;
// set up electrode 10 as a proxmity mapped controller attached to controller 112
MIDIobjects[10].type = MIDI_CONTROL;
MIDIobjects[10].controllerNumber = 112;
MIDIobjects[10].inputMin = 520;
MIDIobjects[10].inputMax = 480;
MIDIobjects[10].outputMin = 0;
MIDIobjects[10].outputMax = 127;
// set up electrode 11 as a proxmity mapped controller attached to controller 113
MIDIobjects[11].type = MIDI_CONTROL;
MIDIobjects[11].controllerNumber = 113;
MIDIobjects[11].inputMin = 0;
MIDIobjects[11].inputMax = 200;
MIDIobjects[11].outputMin = 0;
MIDIobjects[11].outputMax = 127;
// ***********************
// Touch (note) electrodes
// ***********************
// // set up electrode 0 as a touch sensitive key attached to note 60
MIDIobjects[0].type = MIDI_NOTE;
MIDIobjects[0].noteNumber = 36;
MIDIobjects[0].touchThreshold = 40; // always make sure that the touch threshold is
MIDIobjects[0].releaseThreshold = 20; // larger than the release threshold - larger values
// // are less sensitive (and more robust)
//
// // set up electrode 1 as a touch sensitive key attached to note 61
MIDIobjects[1].type = MIDI_NOTE;
MIDIobjects[1].noteNumber = 38;
MIDIobjects[1].touchThreshold = 40;
MIDIobjects[1].releaseThreshold = 20;
//
// // set up electrode 2 as a touch sensitive key attached to note 62
MIDIobjects[2].type = MIDI_NOTE;
MIDIobjects[2].noteNumber = 40;
MIDIobjects[2].touchThreshold = 40;
MIDIobjects[2].releaseThreshold = 20;
//
// // set up electrode 3 as a touch sensitive key attached to note 63
MIDIobjects[3].type = MIDI_NOTE;
MIDIobjects[3].noteNumber = 41;
MIDIobjects[3].touchThreshold = 40;
MIDIobjects[3].releaseThreshold = 20;
//
// // set up electrode 4 as a touch sensitive key attached to note 64
MIDIobjects[4].type = MIDI_NOTE;
MIDIobjects[4].noteNumber = 43;
MIDIobjects[4].touchThreshold = 40;
MIDIobjects[4].releaseThreshold = 20;
//
// // set up electrode 5 as a touch sensitive key attached to note 65
MIDIobjects[5].type = MIDI_NOTE;
MIDIobjects[5].noteNumber = 45;
MIDIobjects[5].touchThreshold = 40;
MIDIobjects[5].releaseThreshold = 20;
//
// // set up electrode 6 as a touch sensitive key attached to note 66
MIDIobjects[6].type = MIDI_NOTE;
MIDIobjects[6].noteNumber = 47;
MIDIobjects[6].touchThreshold = 40;
MIDIobjects[6].releaseThreshold = 20;
//
// set touch and release thresholds for electrodes that require it
for(int i=0; i<numElectrodes; i++){
if(MIDIobjects[i].type == MIDI_NOTE){
MPR121.setTouchThreshold(i, MIDIobjects[i].touchThreshold);
MPR121.setReleaseThreshold(i, MIDIobjects[i].releaseThreshold);
}
}
// start with fresh data
MPR121.updateAll();
}
void loop() {
// check note electrodes
if(MPR121.touchStatusChanged()){
MPR121.updateTouchData();
for(int i=0; i<numElectrodes; i++){
if(MIDIobjects[i].type==MIDI_NOTE){ // if this is a note type object...
e.type = 0x08;
e.m2 = MIDIobjects[i].noteNumber; // set note number
e.m3 = 127; // maximum volume
if(MPR121.isNewTouch(i)){
// if we have a new touch, turn on the onboard LED and
// send a "note on" message with the appropriate note set
digitalWrite(LED_BUILTIN, HIGH);
e.m1 = 0x90;
} else if(MPR121.isNewRelease(i)){
// if we have a new release, turn off the onboard LED and
// send a "note off" message
digitalWrite(LED_BUILTIN, LOW);
e.m1 = 0x80;
} else {
// else set a flag to do nothing...
e.m1 = 0x00;
}
// only send a USB MIDI message if we need to
if(e.m1 != 0x00){
MIDIUSB.write(e);
}
}
}
}
MPR121.updateFilteredData();
// now check controller electrodes
for(int i=0; i<numElectrodes; i++){
if(MIDIobjects[i].type==MIDI_CONTROL){ // if we have a control type object...
Serial.print("E");
Serial.print(i);
Serial.print(":"); // this prints some Serial debug data for ease of mapping
Serial.println(MPR121.getFilteredData(i)); // e.g. E11:567 means E11 has value 567 (this is the input data)
// output the correctly mapped value from the input
e.m3 = (unsigned char)constrain(map(MPR121.getFilteredData(i), MIDIobjects[i].inputMin, MIDIobjects[i].inputMax, MIDIobjects[i].outputMin, MIDIobjects[i].outputMax), 0, 127);
if(e.m3!=MIDIobjects[i].lastOutput){ // only output a new controller value if it has changed since last time
MIDIobjects[i].lastOutput=e.m3;
e.type = 0x08;
e.m1 = 0xB0; // control change message
e.m2 = MIDIobjects[i].controllerNumber; // select the correct controller number - you should use numbers
// between 102 and 119 unless you know what you are doing
MIDIUSB.write(e);
}
}
}
// flush USB buffer to ensure all notes are sent
MIDIUSB.flush();
delay(10); // 10ms delay to give the USB MIDI target time to catch up
}

 

Also, because this project has a lot of part to it, I will upload a Zip file to google drive that includes all of the files you would need to get it up and running on your machine.

Here is the link to the zip:

https://drive.google.com/drive/folders/0B6W0i2iSS2nVWDA4SW5HS1RCV3c?usp=sharing

 

For the future iteration of the device I could imagine, Bluetooth (wireless), battery powered, conductive paint on a 3D printed overlay, and a gyroscope. I am excited to continue working on this next semester.

Have a good one,

Steven Krenn