Arduino meets Max

In this project, I decided to explore how Arduino can communicate with Max and help create interesting integrated systems. The class discussions and patches sparked the idea of using frequency domain processing to control a system linked to Arduino. With a little experience in Arduino and looking up on tutorials and help from professor Jesse Stiles, TA Jeena Yin, Youtube, help forums, I could get together a system where 8 LEDs react to the sounds being passed into Max. The core ideas used were-

  1. Using jit.scanwrap to get the a 1 by 8 matrix of values relating to the amplitudes in the various frequency bins. These 8 values would compared to a threshold value to determine which LEDs to light up.
  2. The conditions would output a 0(LED off) or a 1(LED on) for all the 8 values in the matrix. These 8 values would each tell determine the state of their corresponding LED. In order to do so, these values needed to be passed into Arduino board through the serial port connected to it.
  3. Due to restrictions on passing a value greater than 255 or passing separate values under the time constraint, passing something like 11000001 was not possible. Finding out about these restrictions led me to think of a way to pass an 8 digit number into the Arduino. Then I thought that a binary number can represent a decimal number which could be passed into Arduino. An 8 digit binary number cannot go over the value 256 which was perfect.
  4. In the patch, the encapsulated code takes in the 8 digit binary number and converts it to a decimal number which is then sent to the Arduino board
  5. For the Arduino board, the code I wrote takes input from Serial Port and converts it back into an array of binary numbers. The code for this was more than the knowledge of Arduino I had, so I took it from an Arduino forum from the post by ‘guix ‘ who is an Edison member of the Arduino community- https://forum.arduino.cc/index.php?topic=333006.0
  6. The array used the resulting 8 digits of 0s and 1s to determine which LEDs would be on.

The following code is the Max patch-

<pre><code>
———-begin_max5_patcher———-
3851.3oc2cs0iihiF84Zj1+Cnn4oYSG461rOrpm22UZee0pRjDRJ2MAXARUU
Oi1929Zig.jJWLI3PRot5Dh41wGe722mswl+7u7KOMYdx6g4S79ad+aumd5O
Uo7TYZ5TdpNgmlrI38EQA4kG3jznfeDIyK94joU6NYaQTXQwORCMWoI4x0wA
QSld3sz+eobQgLINH6GS79O0WmzfhEuHiW+bV3hBykBBvnYfopuEkeQA5uvp
OaNs7heDUdmmrCQwa2HiUXpDwvVoZfZYxz5jkKKO4j4e6KX+cWhkAEAUzPMO
7zjEQxzczU68n12JYTXbvFCRVlscy+HIIcVfbU8kr9f9tL1bGC1tTlnSo8Qj
GFEVxMlaSY9E1J6pOlH0UVuaPqzVjDWDFW7bdQPQXMv6fPUAUlbsTUJn.55h
W1ju6Vz9pqJtSVVWRNOHWtXR2cqE.Um4d6PpJ+xeQtptva+K7+caPjr3Gm5Z
quDKRxx5vAcOlxyqXarRoX1Ogr2QzMe1hHmTHW787IG9nKB2jlTgbzGHkUIY
aBhOVNaURTTxaqiRl245r2QkGsMqPtI7H7tdW4EYgJJ3vmdZX3xiBfR3c.pa
2A8+9K+R81pMq2QcpUeq9Zp0lBhCeSUqYWUlhv2KLlHNtoAolBOUMdtOaF.B
ED3TONlLiwXbhXpGhKlIvXBio1F0m5+hCW+Gdf5+P.XRGrEl8Aa.5JruFlkW
ww0WlmlDjl1J8tU9T712RJuV7oMoIiMogaRKK7UY8kf1jbPlhmJTjz1LSV8c
FYRqqjpFaV7VYIfpRUWRVCsF5srZP4GLR4WDQGc3j4JQ7huazY6ruLIIMTUe
KMKLWYiInVe0r+kgqB1FU77JkUnb4eThQn1x8gNfUAKBO9ouyF5umI0NLpOl
0YxkIwZfzk10oWeKUULnF+DcxSkGRbP5gNcUwthbN1d0VS2lOOHSWpL2HyP6
1aQRRT280blQgqJp1epLNdeBsHI8D6UYQ5kSc1yST6cyIu7k6J+4swlc+rpR
qx4Pvq6w7EJqjUUi26N7dPrbixWRsAKDnYuJGcpL7K4KxT185luM650CsqkJ
s8hv2jKM1jAcjGpSPlVKrlzTruTtVYTbuDKBVmuWRezJfJssyqpE+r1nbTkm
wIa9gxKUwj1Y1vi4VuwD39dSOgovtlCK7l2YGevn37.sqrtNB+nkQJhMiSUQ
+P4ZMNhT9IZeOAGfHNZHQmvr39lFEhIGwSxTmPZ+0SSYc7ibTFCBLLFpzTGx
eF8RYLzEvX92VFanjYbvXJyXOfxLJYLkY7GRYFSEdvHJyHOfxLe1XJynOlxL
heYOFLNpLzimJigwkD13HxvOlhLAa1nYJi6+.JxTwXLdVx.OjhLNRLhhL9im
HiqhvXzDYbwioHSYIazbWxe.i8myAim6R9MNlreyChDCX6xQ7RYF1+xkYWBq
Qt0rV69p8pakYMogtsjF9VSZXz.1loQhzP275mrAoI.vwjzf2ZRSLbQzVQY2
Z+.faMkQFt3yFGJi4eqorgvbFmBK4pwgxD2bqYCAkYhncjnrabDsYdEujEl+
RRzxSScmm2fPNZFFiI9L8ieSYKAX7K2S.n+rG8FGdqbk2uJg+8eUhTzXXrGz
KLJOzCb8ToR1IpoRJP+LMPYJcHDCuotVoOvxQ.pj2D7QSMh+bnF84hYvJhbL
0hjGVsnfg0VFwbxnoEgeNzhBUkZQMSNlhQzCqXjC8aIFAifXjv+bHFYbViXj
vFOwH3gULpe1Q…DgFKKiDzmCwHEwmQqYxQzxHA+vJFIPybFXTzgXwmCcHl
S0sXdLkfX+GVIHhZXuwQBR9bHAQPb8b+Yzjf7GVInOxn.MQIBw2dOx9eR7HC
FaUHzApvR.cZpYUTRPgs7CY2DzauoomKkX9cKbWjrYSXbwGuOx3kgu2dNxbO
xiUl6FGhD0ShDcGSjUgtLNDItmDI9dtlcq1hLNrIomrI4NlMa2MCiCaR6IaR
uiYy18f33vlrdxlr6X1r0XCLNjIumjI+NlL6LreiCcJ5IcJFb5zfxIV9.ARH
3YLfR.5ecb0Id3SAGiq7GnXHaMuiijwGcdkVxB5C3HrXdx1rE0Jt5By8WQ.V
FlWHiCZlu+0Cy6zSLy+mNDfgaMXHtGLLqACx8fgZMX.tGLDaACA6dvfsEL5k
gEWCFj0fg6dv.rELP2CFgusfw28ESBqM5ItAfg2Kv.2eYlYoY0DAde.wCvr6
fHvkPzZq0hafXm1KvLJEo1CQ1XUjZsal5LiKACtWfYTJRsGhjwpH0Z+iB2G4
f.zKvLJEo1CQzHUjxs1wtv8QlxE8BLiQQp8P7PL6soH0Z280YFWBFqcrycuW
.NsWLynnurGh7wReQtiB+liuiBbjitiB4gCuibVyA2QtYX92QFHYh6HCjL6s
VOVMqf0OGJigMbp0Pj49NkkR6UODCcKXr10Ay807n3d0c0NlYr10Ay8NUovd
024NlYr10A28tNH98pSYcKyP38ZTEbLXrt1TcfItDLndMDGtkYv1Gtg6GIJr
nWi2hiYF6aop6CQES50f+3VlAZOyb5gRs0J59tkF8fWCW9rYIt94fhhL47sE
lgjtMt56xurYctuZoUd2508oWKlaVxlu90c9Mg44AqCOvBOeldMA3nK97mdk
mW3SmwETNfM0iyI6lUc3OtJXc10bdj8q47rpmp2gbA3OOTu1o6szym0ZEs+f
KfBSOKsfg5GiRAFriQ398mQNxagCzAXDA7xYjUQIpavIj.S2eoP6fScHVyjp
THJ2DqTElGw4KLemFjopoTDl8rYIRu8Cih402P4MmYOOQDNP47wYdv4HnpGC
d1vIJ.GJydEhhiZu.NaWZZS1KR1ZdjePWnIDHB.2wKrJaH54bgYpngYNxFBF
8HPNPU9eLHGvi.4.33wfbPzG.xw2u7AorZ1Kc63lGgZU9HXqY10siadDLGKH
hQgadDL3vE3wfaf9OBbCDomjeLD61xMNHdtswoAK9tGX1A+63wIadF2mdcab
llagmAg9.nuhjQzFRlxFr.IEGfko22M2pSTRTZiwcG2nKnab14c7+tz1oyDM
0Ho9s19.Sr4As5Ia3UNeSVLKOUFEc5VrdlP.vnFRnkhgfcqhA5H9XQP7aYAo
deUyBdklRvHuutTtQElrGz6qAKCRK7.deMMJnxbuG93Ln5h9rp00Yx2sn2ND
rFtDfJC6jn6DHpiIS7vSlKCV7yS0Hd+pozd0RX9vU64PseW3HwRjbYn2WK+5
4soZ0gY6kIuE6QGFQAkzHJHbd41ZQAB3VQAwMb15nY5euMSQb5du0S8qSSTq
idt5LNOYg4M0ZXfl.vgWh.qOj0UXdVyJouIiUhlqwPLk1JlZXiQYgYYYqyas
3KNa5f3WxZd4QzamwsxlTXS0jKoSyA16Kl3npFwIx7POh2hWBxzuTG7PDv.Y
Cg42xIMqU0BpaqV.FGuz.m5ltiEYBXmEYpOxorI1Aw.9a+zCdplMT8lS+Lce
HorS3g9rKsu36SOpdE1fzu7jiJGGjlXS1Dj88vrpYJ6WXJn+E8q74unGykuf
TEqpVmn9P8KcdqIK0+2tz5dKq7kdr4Mfb8q2fKPqTg4s4lW8t83kLM1Ag5kt
ZUwO89WYIeCp1RuZISlbR4BjWtPniMsV.IzKQTTmN.NX3ckiq1VPvB3NKHN1
wEx2EiY27SUXW8xbBJDWZX98nTF4n37MNFphWMXSZ9g76fnLcC.br6lpkRMi
6F21oLH9XOR3X.topgeqb980PgibTey7ade80fnlWDEWmLBUIczlaITzNxDB
XCl+5CxNNJZ4xtVVU26aa2j5g87GdVhh.MQJeIw10GVB6FVppK3awSdeMY0p
7PcrwVaf5RYPbqniwngK5X7g5DKWLXxEayh8.yfT0GTOvk5uuZYRGiz1tX65
gBH1sgJCcTUufX4lYKyjuFdMcXQaRgvapogbbmcBbVGaojQu3EEtTEEPhp0.
OmK+iPOp9WQ+34MIKCUAH3.q4sGkPDUze1y2d1y+55mqUo4q2JaZ6khSJWx7
tBYT6guS8USkKdoeMB8hzQqRhKVErX+nChKzkokjiNFjVou6IQ820CG2D6YT
lyjiKTPJKnVPlK0OgsJq9fy0yz8oCWg9kwhY3Zn.51N.wYT05L4x7WBTwzWx
VlMySeIT2M0l5jJrktsPGh+hjnjLcU4x+0zoSCeMaDiry+IwwcgMxMj6aIYQ
KMrpIdaMkU1vIU19TVC20DAa0fUOJnU8Bk6hyvAgYbwAVvMsMD5C0czuu98e
AfAurVH0i.K7+.IXtMcWz4pHk8mTB0Ty4l.KGah61Y1Vt+Ls7fEKN.AfCf.z
MCAX5Qf.X.f.iaEIzd1Ucc2Pclge1rL5Hk6fABAryh.fiQ.8bH.QcLBHmEAt
tT.eVD.cLBPmEA.GZAZuR3iLmO8cLBNasenXzQ..3Paf1UL..isVz.AzXVgz
.ArC0BD6f.wgPfZGDnNDBL6f.ygPfaGD3NBBDgMFFHCWfIDlM2Pei7eHteDq
xffgKCBr5FxNhkV3sCBtLfWqXcT60liqLFeqjUjAqTFakCU7vUuAYUiXP7g6
FZUSVvtTGaGDfXGpiQrarPFYWMG7vUNis0f7.c+r41wbYQpUhJpC00Pp0hpg
gygVE6MBOXpXHwt1aLb4PqTwvgydLDZyMj5vt0xND.YNr8TVBAjKqKArJXGe
nCabskXP.cnUMH31ZFGZkEEwAueUcrcPZ5qgY4Umh4VMYSv2RJIE9Tyukwle
aF2fIYguJqOEpIofrEuHKBWTN5Z5tS+cV0CKY4fglEuUVWRWsT5X52986T8c
C23a5Km2lj3j7T83UZxjp73pfsQE6wLyWWN1UlqEXlOmS0y.xxwMQ8SeJlgK
+YCYoGihxS5YYrlABqO4xSo9iNmRXTn90WSmaEWfgDj9n49BFtbKAAhP78N4
1ikppj4elDGrHo0ffLe8JYTztqcmURn5gMYx5rfkxvlUiG8qTmVfAom3m5Gn
2YXfu.PLaoRB1ELUmFrZXlpxnMer+AhpuABFhSnk4QNfJDlsDD7GtAAwqMCJ
Ch2LfxJocVRZRVsBUgN+lyXaQxt7WyhfYqEdoN4U.jA78KKlfPAEVtE.iojJ
nTq2mVWoJScg+vXEMYiRMI2c+pVwmTe8+AvAChMF
———–end_max5_patcher———–
</code></pre>

The following code is the Arduino code-

int led1=1;
int led2=1;
int led3=1;
int led4=1;
int led5=1;
int led6=1;
int led7=1;
int led8=1;
//2 is on state, 1 is off state
void setup() {
// put your setup code here, to run once:
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);

Serial.begin(9600);

}

void loop() {
// put your main code here, to run repeatedly:
if (Serial.available()){
int x=Serial.read();
uint8_t bitsCount = sizeof( x ) * 8;
char val[ bitsCount + 1 ];

uint8_t i = -8;
while ( bitsCount– )
val[ i++ ] = bitRead( x, bitsCount ) + ‘0’;
val[ i ] = ‘\0′;

if (val[0]==’1′){
led1=2;
}else {
led1=1;
}
if (val[1]==’1′){
led2=2;

}else {
led2=1;
}
if (val[2]==’1′){
led3=2;
}else {
led3=1;
}
if (val[3]==’1′){
led4=2;
}else {
led4=1;
}
if (val[4]==’1′){
led5=2;
}else {
led5=1;
}
if (val[5]==’1′){
led6=2;
}else {
led6=1;
}
if (val[6]==’1′){
led7=2;
}else {
led7=1;
}
if (val[7]==’1’){
led8=2;
}else {
led8=1;
}

}
//Serial.println(led2);
if (led1==2){
digitalWrite(2,HIGH);
}else{
digitalWrite(2,LOW);
}
if (led2==2){
digitalWrite(3,HIGH);
}else{
digitalWrite(3,LOW);
}
if (led3==2){
digitalWrite(4,HIGH);
}else{
digitalWrite(4,LOW);
}
if (led4==2){
digitalWrite(5,HIGH);
}else{
digitalWrite(5,LOW);
}
if (led5==2){
digitalWrite(6,HIGH);
}else{
digitalWrite(6,LOW);
}
if (led6==2){
digitalWrite(7,HIGH);
}else{
digitalWrite(7,LOW);
}
if (led7==2){
digitalWrite(8,HIGH);
}else{
digitalWrite(8,LOW);
}
if (led8==2){
digitalWrite(9,HIGH);
}else{
digitalWrite(9,LOW);
}
}

 

To show the LEDs in action, here is some videos of the LEDs reacting to the songs played as well as the code and patch used-

Hope you enjoyed!