Polyphonic vocoder with live midi

For this project I used FFT to create a simple voccoder using a an input vocal file and simple saw waves. In order to allow the user to play chords and such in real time, I also added a poly midi system that takes in multiple notes, routes them to voices, and kills them when the velocity reaches zero (note release).

 

To use this patch simple load and play a file in the sfplay object, and then connect a midi device and play notes. As you play notes the file loaded into sfplay will be output in the frequencies being played on the midi controller.

To demonstrate how this works in practice I played my favorite jazz standard, Misty, while running an accapella for the death grips song “Death Heated” through the vocodder.

EXPLICIT CONTENT WARNING

It didn’t occur to me until after I was finished that this content might be too offensive to post, so I apologize in advance. I thought it was funny at the time and it didn’t really occur to me I was turning this in for a grade.

If I were given more time I would want to add an ADSR envelope to the voccoder. Currently there is a lot of cutting out because as soon as I lift my hand from one chord to play the next the velocity drops to zero and the voices die. Adding a sustain on note release would make the audio less choppy and make this vocodder more playable in multivoice situations.

MAIN PATCH

<pre><code>
----------begin_max5_patcher----------
972.3ocyX0sbhBCE9Z6L8cfgqsNj.Bkd0tWsODc2wIBQLsPBaRvpam0m8M+.
hZ0Vg0g1aLxIjS9Ne47W30auYj6b1Zrv04AmGcFM5UkjQFYZIiZDLxs.sNIG
ILunaAVh4acGWOGqRlikxMkXqZbWjyPRWme07BjTyxXye5Nf+tkQqJHT0BM5
DzHsDISVRnYy33DoUe.u6m3M1wG5oG.QA5gofIds6fPtI2r6t6qdKvr52H8u
2didTML9hM1DVQAlJ2oWIdsAWtqXIrzTL+mT2SXnAwc2PiMVFHHdxT0vTi4p
M5NXmd81No3WT39slY4hExsNqXquS+uyenKHYTT9oO0ggmlLfuCYLMxPFwPM
YDEZ3B3m8Y9OvRG4RrCpnLmHqRwNrEFAhRLNY4tEjSn3DVEUdfUtOiLs6tG9
Zl3Nu8bN7CFHmCIKKSo6VvwQlj.yvTzb6l5cVOCB8bIC.cmDl1D8qXAn4+vf
Axqn.KDnL7a8JXkXJG8x4iMNs4G08fBfGn07sQHCVPw4RPHVTli1r8CyLL1w
cNhlcFWAXOxPXN9UIMUbgJmY24hcJWfVgSmovgR2yPRImLuRZqJNpkNTLDRP
RjUTh1LdvIHnwoej6BVdN6krb1bTtDWTx1OlPOMu.QkILtF+DF8voKXoVjZ1
A2cxYbRFQQd4XZlbYcZfoAA9wSBf9.XrhTkjjmEsrZ6h1ACfoxYyzkDESdNf
76JjJw1lSgEIQE.H4X0ps.QQ014p8ltpdUonjsmptJvq6NJglvk.nwGwuOQM
8OyYFhP21yDmsANmMEZO5xHzFpD52vC5VN5VWFvdSG5fqJRWyTF1i5DPSlxf
HaaD0MSMX4JqJli487X+8yTF7+xE8hJfW+9J4XUYyTmBRJgxjskUWvnRA4OF
3.B2k3xHmpnQyp+NmniL5XAWudzzUr8VGAV+HeaKGQex0bKY4a15H1PkKmsh
QRvJlx4aBIFk6.tpL460Vene+4y3Zuv6+ZvmnjmG.GvdzjSCe4YRTG70v8SG
uRnWUBSWga7ACmtOwd6wY6VdZeHP+iHP6RMWx63ubhY+0SbDsJXU7jFastvs
ydXHU0ZkpmslFxdr8qkr+asjjlhOniM2ThPWQI8C5R4JiKuuv3BLn3Jx6R.V
3vePFcQDFbvw0wTwoAl9KFMvmjls7CAV7fSXvKAVQCeDI.dwGjCLv.eQc8uH
b84.Kvk.q9GOVWwDUVtByE0Z1hHUGGOw35miFaeVcc.daaQtb7JRyRBrhPbU
QdopBeE2V3dcX80hLeIENUcEy5FeLXP8y+f2eGnC
-----------end_max5_patcher-----------
</code></pre>
view raw gistfile1.txt hosted with ❤ by GitHub

VOCODDER PATCH

<pre><code>
----------begin_max5_patcher----------
601.3ocyV1saaBCEG+ZpTeGr3xIVDlOS2c6InO.sSSNfSwUfMx1zlnpkm84O
.FJKcAXojdSb7w1G96emisOuc6MNtaX6vBWv2.O.bbdSYwwXSawoyfiaEZWV
IRXlnaFqpBSktdsCJw6jlAtmVtGTWfDX.gtkwqPRBiBXaAxBLPfyXzbff7DE
UBHBPsxg37Go8NpjPUyogZ7VXmURtw4rMO+UXX+boMUDZIVZjDryZMRlUPnO
8SNNSZ2UgvvU9dff0PcCL1W2DsdkO3GcqRH2WhMejgtm0H67uuw5ut8Fcqpw
azrhheUI7+FU0rRIKCwOzOj8yI2Wis510BJWu9+8GAODIvSijf+ARBfICPRh
gHAAShHAylHua1y2qpKIxlbrNgYCSVzlpHFjgLbi6OibgXyVEFaSERM87uxo
Be474.mLxud5A9TantMhe2p3IG2gW7s+1sRk+O.fmJHmN6j6vv05l3nYjbe4
iwpS5Rl5L++8w8jY.jn.a5dzU3z9GNPhmNPRR97wC0o.B8.HXB33LfIZ5WO1
loXukHJcFfI7iBLvKGXlQMD1LlKHWrK0TvywEeY975ANhVBVCOqaO2d+OXfF
xwBEoLUbMXR5xCFNqBRdN1LA+9ERDnMk37yby2n0UxXzkV7vEWVvQgqkUWwi
EWKaTLZLxJ4pHK3Xj0xFDCGCshWbZENFZEu3z53KkNstRWbbc7o+2WWymWs2
7ipqeAyEsd1JI0ChOy359od19DpsusZFWN9ER2RhrlPb0aUR0CUMb6CP6RZe
32shki4zFRWY6FMn942.jSyg5C
-----------end_max5_patcher-----------
</code></pre>
view raw gistfile1.txt hosted with ❤ by GitHub

SYNTH VOICE PATCH

<pre><code>
----------begin_max5_patcher----------
638.3ocyWtsiZCCDF95rR66PjurJkhcbHPuqOGUUUFhA7pfcTrYA5ptO60GR
nQ6ltjSMgKHCdh8je9X73Iu73Cdf0hyTIv+q9e22y6EsGOqOiGuRGdfCjyaR
IR6DAb5Iw5m.AE2SQOqr92d00VAWIY+hZbCWLadU+bxAqev2xYjzqKQbTkRU
pKYTmX.aSEDcb+Q4DXI1UoexeN55p3GOv350YEFpzaFQsYOiu6m4zMJW3hPZ
U3GhWZLX3rn.eT7r4+M7R0kTmtpFbmprQGZ896GevX0lfdyKZxN5qCJyVS36
.AE1ZQGtdzA+.zsLxvLTL1XhJFzJzgFbzo1yjYhzKCK9XbkgdFSsvKr8vCUj
wECMFGCmb5oC9q9v9ftJPA0dnfWYSkBW04Lp4CNSX79Qj2kLUeJDr8zxU5Ba
ScBWzAXM7UtjjSC6NOIaGWe+5QFt8k6WL2RqUViaK3jCsCJw1wHCqCUob3BF
4vE5t.WeZDyvPcHCyVPGWXv2EMTPRj4+WnVP0uY+TOG+GU2h9.NBiskzfqrG
CrrK4d3AGjewGp0vX0N6x1m8Aiic6XsoetqS+oBmHYiZ+Xwc8fgdbtva6Fys
TPJi+tWix93M23MvTJNluo72XQBfeEMjPkJFmnXBdkIY1bUcV6YIIT6Dtx1D
ljrNklbiNjZrthahtVNIxBdSbEN55JpQ+MhGccgahthFcYAajtLmMO1BKro.
CNt5B0DcMA7B1jMj3oQW2jWgSitP2o5pYaHG4D+lnq3dwqhiwIYYOSykEQ1o
HcyOOIxMiiCbiYb2XWiFfb5yrxkfctH45FOT5tNNl65l37hh2hEbPjPy4GYk
8fY0f9xe.HSPwlA
-----------end_max5_patcher-----------
</code></pre>
view raw gistfile1.txt hosted with ❤ by GitHub

SOURCES CITED

I had a lot of issues with the polyphony aspect, and I got a lot of help from https://cycling74.com/2011/05/05/polyphonic-synthesizer-video-tutorial/