Project 2 – Kevin Darr

For this project, I used spectral analysis along with machine learning to create a system for chord recognition. The system works by writing FFT frequency bin amplitudes into a matrix, then taking “snapshots” of the matrix and outputting the snapshot as a list, then sending these lists to the ml.svm object for categorization. While the system could easily work with any audio source, for this demonstration I made a simple polyphonic synth using sawtooth oscillators and a MIDI controller to play chords for the system to analyze. The challenge with this project was devising a system for processing the data from the FFT matrix and molding it into a form that is usable by the SVM but still contains enough data to identify specific chord spectra. The algorithm is powerful enough to recognize, for example, the difference between a C major chord and a C minor chord, if given enough training data.

In this demonstration I show how to train the SVM and how to map new chords. At the end I show that the system is not aware that a chord played an octave higher is not recognized. This can be fixed easily by simply mapping one chord played in several octaves (for example play C major chords with roots C3, C4, and C5 as state 1, D3 D4 D5 state 2, etc.)

main patch

<pre><code> ———-begin_max5_patcher———- 4889.3oc6cs0iiiak94p+UHXrOjfTsg3McIOMK17ZP.RxKKlJnfrMKWZZYIG I45xDj929RxCkrjsjLkLkqZmzC5wk0UdNe7bijmC8+5K2sXU1a7hEN+Qme14 t69We4t6TmRdh6zGe2hcQusNIpPcaKVmsaGOsbw8v0J4uUpN+NdYdlSY11sI 7GRqtbQ46Ib00qNS5gcwoI7R0aCoO49nx0OGmt8wb95RfZ78CV5duiWn7SDy U9Gr3Sm+Q0yjyKDDRTYbVZy2U7FU6ks5W9pePiVM6PYUy51wqnQSSXzkLQqQ oxFMfcrokO1+9KeQ9w8WId82OTlkGGk7GeHEszYcBOJ2o7YtSwK6t2YWz2De 6Pt5Pm3Bm3Tmx7Hwm6x1HfW7RmmyR13jk6TvSDDty5myx27PJYoingi2Jt8m izmUzo3D4THXStyp2EMU75uIvZUqEseed1dAcHu1gxxrTmrT0Uxi1DmsMO6v 9GRoKgmR28JegkGxU2ppaOMaG240miW+rfbR2THZtjn7sbGAruhm6j8jSwdA UleXmSQzt8I7B06.X2GRYK0uumd53K7gTukBpNauhUkDrhaV9Pp+Rmb9dtf+ ve0SvuB3J8cmx3chWq3nM7h3b9Fme2g8xVwWxza3OEcHo7dmhXQy+tSzlMBn LWylZVuv4IAfpNsBsJ98OjFTy5R3+gzPAM8ZrPZU9p2EsW2gfbWdNjHNsnqc eRz6.oKntzMNuJk0cDv9pnUwIwku6TjDugmW7f30+2hdQxox66uxWGkjHORH l9Rb1AAmEUFIjW9Koq4UfmyyBNdEmqkO3atWSuEQuT0mrNmK4FQuxR4aP81E eWR4INOEK6PUBKQoh2jS1dt30HYubEEnZI0KWRKxWvRm+GUSHuS0Ib9CNvKS 9lUmU9LPiIe+2KONUSXQakxwhW+wa7Hkrz4uAcPmCxJIFdQoSJ+0Z7T9tDmR AFBFdCPeUJaBziuN6PpRiC2oVe22xUX1RzkKLWPCIvevJiG9rQZ3hNICWTOk MSBgBMdPiFeBltD.sfXNyxUZVIOd.K7.8V99dNPUKhkl+Z8mZrvTXEgBWRD+ GhHsKKsNSU.LF2.Xa.fL+tAPh8fgjrnMBKNENti.JFOm64At9BTRR93g3ZBq atFMAtdKnAd87FoediwTRnn.0enJMGRKdCzK6RColU2GkGIL4xyejmFsBHRW qAC8z4uOK48u6H+rH5UG5HPIoy4njqTCHzcIVnCD5MnzPf8jF9F3iZZJ8cyq X8IE9nJ4ei+95rjrbMupjJZ9wQimCiLfYWBUIPwHiypKwa7xTUbgzCUqdvdr PypIUudI0maiFtK8CnDD8dw2PTlaXf7atXBCG1FbxiR2pnBZnEE0kwZI7quK VDDlvz+rZsqkTNX4C4NnkdT3hYWYORD1hqMryiMjywJEa1fp2XjEYbUb5ig+ Dp1qDRaSnGVLttJ9DAgGoGbWe7o+DzJ+jiAM5qMBCHt2FLHI9E9RYL0eup8d IJOUzf8b097tceyuI++mDQKo7GjDWTNdkCrN1.3OfISDwqGKBjg.KTmfEqpa WNHhGiJKyiEiIje7aEZTSCaRfI4.O6opSWc9lMZRV519AuV2ZgX7LkFduUvs aGWam.OkW6q9R4ottdjp+2qyqJFhWYrL3DvsSM515lNHtoZsCJbckXV0eriQ 2MQq+tgyhzkEbzCEh3O3XF5YLWSfmf4IYjQKMZyH9.WAw7foUeNlPdlPDOWH BGhOPNd9vbncjprmrALWinw3Pd.C03KhvHhRJBFsRu9ol+3Pd5oxu67ZtHd4 xrcQBKSuQDn.ld8y1J0eYf1gD00S1ygnCNTSL0dZK8wtpIyYVC2zWvd0AcQT SzKLou8w1d8v1sZCd9oNKjSs0K77h1Jh2sHZ+9FmtsejcQ+BLB.+ZivBlBNE o9TxoFr54o0mMJesbTUqKOjCX1a0DtdrJ4oGhqEOUcVeo5EVKSff3OgYSxi5 B9da5WXwpsIYq+FeSS+QKjSrWb5oVepurdtXe7orzxh3eE7JiW140eJZMu2G t1e4+sbhzq3uEayi2jkJIhVXs7zUMmHDLFrtBMYF0cjFsuiGVz2Kvkdtnbxh OTrJJW1UnschqtXYVVR6KU+bI7mJ0WdebZ5InXY199uXd71mG3YWkIt3tgd2 pqTHblCW8QgxX4ixneZeeQIIZsy1u92hRiEVf3xIcGl4z5KB9OdtXcdVRRK9 EtxKcbkMBo307Wi2T9rpgZJLHt838UBQKp6k2DukWT19bkQaKZelyrZHN0gU ZszGK461mH3Bvox6eUd7hFL4wUFqolYSyYsN+Pl0ZaZKWX5fWOfxdnzdGzwh iwk0iur9WTMVkyY47GQOyg1Y16ZQicL.iFQ+UYx+2XXkv2uYXU8bNOyXkbRm i1x6DrbW57i+8i+8ep+qoNQqU1CQmf4iVJ5MiVI73nmGoQE8z7nWVPWUjUHZ X+FUHCX.FYQiJxI5PDQ30hRcE3cui4.hnDEnFuA97k15rI1InIkHoX3RGJUy 99u0wIFwTbh0INUvStc3z.Nz+mvv2wN+Tz5x3W3NnI.msFO+D7sCqr..rvXA FBQCuMf1uDWtbMOIYkbPUKNw3yoCEpSXQM8p54b87veVmk.nCyqGKaMFGl98 exBaMLT2+nxTcsZAvlCfcn9GLVMGRddAKYdDLAeuCIXfXU6uSpo0+7rWukR6 x9TXtZbJVGkvc9IwPNzdlbPN+zl3cx9C4Wk8iNpYJmfmfJgnkdDZoKD36Er2 HUKplLHDX6gf7ujJB91D7qhKrq4W2K3xVIDpwg5O60e8.RgnVphPZAdJgGmt g+lsEOAZ3xn1XjRfHYntHyvEOR+3h60hKGmBGYPe8LncEOHud2.VQ1g70URK Za9NsYmM7hx3z5Iz5mqM6bx8kkuAlBPy5CmKBC2Og4NKDlbxBLhxjA0JL38O lGpvPhPNb8Stwcwa1mEmVpkfzAlFDnl..eOHvqSNDyfCCfbFVc3LwYcPw8HR p6HlEpf3c8JFterTFw8VqyRLU0PZmb155viqmaVnA4f3ln3yIpmTw3lkpbHj 7OZkU4AyEkyrLkKSElZJWcPmTt9jUKQiNGEfUjXfDTXTyb91jrUQI54EuNB9 glF8iy0t0W5+0YoOkkuSPMO6THt4mcVkkUd9BApWKnASPmIsv5ggGWVPJj9Y prMo+0ErmTsbJ4fiDFf5QXZb7YbcMtdV95O1UINnwxkRvvXn0IoFZb4c.iN9 DOfXbpUh7omQaep5ITKz1UHTVA9tSprnn1G7kw8PB8XT1QzuIwYOiCJqewQI YamdmxzxZuVc.dMpNs9LJPwydQHTkbtpjBYB.x0YZTWfbClwDX1rmWLe39KZ ZWzL+ET64unGPQZrGzSZaqebvwzzTZ4m.zTPtrAyha2YGPpTUx4QatEZJsDJ zZJClI6jYWQ4VUxRf2IrqGLz3gSjLO6w18Uqs0Ee5KwEGhRh+0gxyaisDB41 Hh3uzW50CELEewddSpR+7fkNDGBkGM1cVpQ4iEoZrX7EWMhQPt0ZD9PMVOwB 61CMITCKbUUQ.LhRYDhUw5Ao3HSULKTD7XRCGKJOJzA8qfrXZY1WnuSIGaMj GI5.pNOWlaZwvhYZa6booQHEx5w2ZdIFHCiY3.X4ETcqjyyvXShmmsXJYpci ALgg4fnYyay73UU83eUPFahWWZMTkbQOPZTMXvPOn9+mTJ8Bo8Jnl4C1R7Xr Oeoz6eNKMZc1Oxo2ejSuCjSuutC6JhffgcitX58dSxq284woVdcVgrPkAUfB EBrlLokg281jvC+g9xmmN5stXsPMwDrCoL9T4Oa.3B8gmMT0kWcc7hSD1ldB ef0wTxTdEBQWTFy61fZ5sfB7UhKWUVfqKEa8jYRBOcKpnisohdKUpKMkqeb4 XeoyJm3qClUA+e+kzdufjnGreO.E9OibQAQzGd0ITo9VzW90L+puUkNN1PsW 2OK179n.LDi1vdmNONFxIQ3mFuDQa9nQMBLWSWVNqc1Z+gfZ+ZhSNe6Go6Cj tZnQp+vXWDz79vSiRKHI4ZhUdHiJwrpO6MiJQeBynRKfeC6nz0nvRLFCwVBC +MiLndyExX.jXI.jbiRq2dPvQYvODF5oumgXD8+ukhuDhooRKcFSXUBdLTwr kVmHCoBzblfhFmAmyITT0ae4NDu4lJLpCwaFENkCwxLrXNy4XLZLXwrQEllD unv4LAZMM++qxz1O1z3kPu0oAtwjF9VmE3HuOEBPlBO8ao+n2XUDG83Ntdwb 5LXj5k8qSpd01V6.lgA3PJQtuWF5GvX9v2vXDt0NfIrRYqWKBun0iGvPtgxm IfhwT3aDWWZGOMOgu6zG2OvMD1+MCbcwn.3MQPdAm+7MWEqetdcrZcKq19Tb RRcKb2YbuXHr5XbWrUtAkyasnBp537HwgCcQgdRRh3FF3RguINE5LhS+jnF6 xpBXT7e9zpuE16SgqASDw2Eov.ruGAvETPvI6Fo5Nizs5EOq4NRGrpzY6yxq WJwkjvVO2gxrZduoohiqq4YHgfFBvRpAGDfz.ACQHmyRpoHP8rOFmJWtVd8d d28M9nNwgOockShqft5ZwcVrSHRG2jh+jk.+cslY1HW9OHzZNL901WuMA2ZV VF6diMApS3pDNdrYOQvblJ5XTuzVbIem1x4BUFRHAg6keHWKn5aKJII60M4Q amZd7b7WxgaQZOVk7eBLPx2PxehF41RHMz56Kgn.RiNE29HNYmxIavlKpxv. +58D0jCMSH.gBYgj11nMhb+Y+aRoSSe4ljVV4FjaRvZOWkaRroncwlVtIISW 3fSRNI1UkbRJ6xidWLeZ1kBzkmAj5yhPNVh777B7kBa9xp7xb7CeLUc0Rg0a dCSXWJuW6UPly.ICY+zaAuT..5sPVs2RK+iKQ9ExbRSEqcu3urPUom7va3iL 2YOqrKT+XvTbQMZi2KO8NZoigTUZ3v6tzLuYeu7rNyyQc+ayxMvwjTH+X8SA 6okjJCaclKs2fLSWcGVt+WxbU1NYTUwwpSAe2dx.RK1+OHiZOVrQDVL8VPQ3 jJENxjRjb+i6PJT3GhllMuE2nie6WbjaoOK+Sbk+q8I72bvSuv2lfVi6QgIp daSBOnESJxdU81fNsMhoa56p9QQitvENFMByC1FtzUdQP3H+MFgbp+bhs8li DjVE0p+ofBCBonvlg51k27lkwaw9n0woas8uoDyWYmQH9mJqxHSInUBcgs6T ZZw.1WkaRZVbKl2jAbec9N8qKYm9covBuM+7L02XjTdTc9uP2hgI0DbziUZ3 cJdVvMHlxhW1YM2sUkSgdMyG9WdMxrGLYtQLmEFoPSCJD8fgQCx7nYumE1Nj A46IVJqCGLv.kUCInQv.TpA0067+yv2tjkSSZXRgC0xEiKT5VCtG.frWcMey pGui0sLBB1A16qoAizKJdwU7CHR0jQznomxOnQ7W3IJ2Oe2p+ZrrKJ+a7b8r 29UOAI9UZf3Chm3CLU7gbko9pmZ5+7F7WuNZiZkmoryB..wajyTDYRvMFGbb l1.c5Pu58aSAviCPdnirflyOT.S2YPiNE08zN+bf9nSWgRcO0YqLYqEtsuUk jsn+IT0zFxmYPKQCsQKYRCgrPC4QMokjjC9XeY6skJeBpwjtBkGsN4uZcDwS Il36hUyKqWyAUzdEzmWtoc9XLH23AJV58U11GgCfinmej9Gms.DoiifDGOf. aeWd3tPA2qCELADrfrCKzfFhEXiVxDUbFwFsjIZdDOa0RHSZIz01RraF5Yh9 Gx0FsDxjVxFMjqAMjG0BsDMzTSwV2toQMMF2cSecFqnlnZehi2SLY64oVsB8 LL3gfU2u0QHc8vB+7xgZ8Cqtsvv.S69PVGC8uUJ3zaloDpQAlXC2XTrAsjM7 hQQFXwm4MKZYlzzsyqcqoWXhCUKftDiFF.saVDeCZ5YAcMpoQj4PlhXRblDa 3ruJJngwWeazRFMBOaXLffM0uGxngpfzCtBlVoVGU47C12fmEmeFwMdzYQLz j.zv1HTPxH780cOVPidLpOTGwAvri29HXG6vCFjn5nqj1w9lhR8JtgBNNIlX XcbPdr1m5ZoRua0DrfYWcmIx0Ec5BGV2a5Ou8llntgrwfRvFMNKqziXh2DaD uGxjA6PrgMdjIhyLa.dHirMMGAfXbKa8Q8fLwvuMzALI1YeK0NWTt7bFBl+7 S1.4jswIabbmrowc9FFW+aVbmtQwopIgSJhGfWqqgfcuCqXhhaNoncz.Pqh0 wjxJ4BUISWUHSUUQzakwLsphoUEwXbgB0phXP5Dm43GGuuNK+k9K8kdJ6k5J GYjksh945obUZWpJMkyq66g0b8+kKKAgpkxraQftJ5JLCoJTK+.TfpdgbYgv ND+IRBM1B+vxax0MvRLf5QPFK6JHQAEBDqHp.BHAI9FNTU7Y9GqJiy4Wg3NU WCTUh8z1EHVe8ecIAYE1+UoU.mcYoYxj4hOBbvvBta5Ea20TnceRMeXTA0Mw hoy1VRlPgycys9bVop8CI2eH494SxU7L+6u7+AT4vgfD ———–end_max5_patcher———– </code></pre>

poly-saw

<pre><code> ———-begin_max5_patcher———- 623.3ocuVE1iiBBD8y1eEF93EOOPwV89qb4RCUY2k8TvnX21rY6u8CGz1au0 Zqo11Dkxvfu48XXf2W3f1n1wqQt+z8WtNNuuvwAL0ZvoquCpfsKMmUCtgj72 TadE4YGRy2oAy5WD0kp78G5GoVuOmCC0aQ0ny4Z89RtEOjPpQd1F2e24jroP HMtAfQ5LVxzouHjOuthmpsSllP7CM+HgdtgAQ9XO2n312AA93ieMQFDAl.96 j.zIHrgBfQPqwOVrn8k2soArr5pCtDLFdv9qbCvSPNpEOKY4sJxo+AOCKNQi HNXqTPgFR.cTggLrvPmOg4GlXXk+DjhmxUrykTDbQdSRV01PIiQ63gYMY9X8 2NXxAl95+jYMIJokngwAPyxwXM8ty5Bs5oIP5ouyuitcKxgilaGd2oairjk9 GWy18GTgud5GBzOYzb76eIOgzk7PVsw.QCwiVI6Lq18wGaKOaswQyGeMSqqD aZz1C+bNxZGT6HqSUEEbokiHX.PulIUyDbGFS2ln3Pi.YgN5VgkCKN34iU0r 2N73J2EjXK2kLFoit79eXZnbg7+uFD.cq8OqD0plpzdNzcPh6Ivy30ZgjoEJ 4+3S6YrsNMnXes.EcE.QmAbnWANKmAbBuBbhlAbLUAcIW.m3YBmKwmvY.m9j oKlHbhzEhrRk43ltTbJYkeT6UErWWJN5XuiyPUkwqN+YkyZrR9rxMbvFj.k2 hvX+3t68Cl9ZDiu8HN3Ji3aCoqPZ9JN15Urxxs7p5NmAHL0neUABvJOnqPZ6 FBcq3aE89SAKrJSoUsotZSksT8tk1qGhJTFoT1H5V+MH+wh+BTMjzLF ———–end_max5_patcher———– </code></pre>

writetomatrix3

<pre><code> ———-begin_max5_patcher———- 1098.3oc2XkriiaCD8r8WgfNNvwgE2UNNyg4z7ADDDLfsLsi5HKZHI2KYv3u 8vEIaK2dQtsbCj3CRTjrXUuGqM3eLdT7ClWzUwQ+VzeDMZzOFOZjeJ2DiZ9d T7R0Ko4pJ+1hKzOad3w3Igkp0uT6md975rh4lMsKTU+Zt1uxL8b05751ELqq y000utRGzZbVgcsi8J5OaDoX8xrBqPdC.ZlbkpN8uxJV78RcZc3nv.dJZRD. tmhD2SrclsmS1LuAYM+egPi2c3ASxe5T2j+b7X2iI2Fi7oMQ32xFmjFpxVTn xOAnwmFz.Hc.kfX9W3ygZ9wAMLnfFPebnFindTe16Z1cG0UOM2dYiPuCjO4r iNNuPtLuv3tWbx43E.e+iAhPSYWAoLO2npuduALy61yCg.ryAZL5t6M7qa9H B.3vT1jnj.XSbiO48r3+IPN3a2KHe+yz8XV8zUl+VuIpJUkqifnqI5+8mmm4 gOf3myKmd2geppr1rxju4VR48dIAfFh2wmyG3DY2vCGG364wVv65644pS4CW 1wPzC+B33bBYONwKVbdVwgsE5Usa9tDUkYcYZKtZZxHZmxmoqrjjpNyTr2dn g8bzqh9pGVOziqD2MqHWuhQ3KnIWckaVSsGx4wjMctMaS6lLkyzktkQe.ple bUC2lp6glYC.65ItKoHb.g2lh38TQ2Lh5C0wGBE0iH.5Pvbc7uNi++P.nd4s 2UQgjipUqdRWV0rauNr0Kdz3iEDS7elUD9z2qdbo9or18S8ynJs4wqsIwWWF JY7BOTzNdowFUUrNqIvxhtwMkVNHgbgZYPzku5W1FCCLjDwUgr7aqB0gJdXQ pIOXa1ZGthEnoI1eBZ6nDXhagsriJMUWTumT1sInRjbRXjPjzNJg0UTctd4g xRDboWWjDIGDtQTNHIzthN2TT2hP6Ex2LEpTytpiOrXdVd91CdzV.ZqO2TmM dQoZVltnsL7n3N1ANAAIbugfRjnfI4lpK7ajB1iv573f8gaOdIGKnL2gJEHl TFFIojCOdUwhPWCXAxdlMytpz1cUYqGoir1t+00lsHqMuevMw6pa47TmbcIc PvodtlynIHb3ByN0A20tda7B98rBmOtt8.79IsO7RLdmVsgckVq4vV.iWZ89 xZsw8CS255F5r5y4q0s8lbbu1i3CdQHMjFXo44hq1B2YWLA1NdRv6+tXge4U 00afHbBi5CADBBA6ISIF.fL7F3WK052gE5YOh6maDvcgUCuw8M0Bq3pq17jT Dm6sLDGYMNOUxSfs4AGPa72044lmudSDyBIYERPBdSkYu0YuMaaU1+zDt69e TYIHjbf.vyK8klXXT+KMYClk3DJIDVKYLQXDFC3KVeRx.jObSRw3PfmjfPT7 kKOIjnDvWLPhPXHj21l01c49ej5SWnf9apTADABBw9BNIfcPZY+6akpNn0pO oOUIVJgFvx.B4ir9jUleN9eQEnrJf ———–end_max5_patcher———– </code></pre>

.data and .model example files.

 

chordsCmajor.data

chordsCmajor.model