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:
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:
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:
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:
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> |
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