For the past week or so I’ve been working on a midi device microtuner patch. The idea is to use pitch bend messages to move individual notes off the normal tuning. There’s already a free plugin that does this, but it doesn’t work in Live because Live doesn’t recognize midi channels internally. So currently I’m trying to do it using an instrument rack’s chain selector to switch to a different device for each voice. The patch works by switching to the device with the chain selector, sending 14 bit pitch bend midi message, and then sending the note on or off message.
And this works great for scales, but not for chords. When I play two notes simultaneously, the chain selector switch doesn’t work and the notes get sent to the same device, which screws everything up. It appears to me that the chain selector controls and the midi messages are on separate threads within Live.
Anyways, I’m still going to fiddle with it some, and I might have a more specific question eventually, but for now I was just curious if anyone has any ideas about what could be going on here? I’m new to M4L coding and so I feel like I might be missing some key piece of the puzzle. Thanks.
Okay, I suppose that was too vague so I’ve created a test case. It requires some setup in Live so I’ve attached a zip file containing the project folder with the live set and a M4L patch demonstrating my roadblock. The patch contains buttons so you can play two notes separately and switch the chain, but playing one right after the other causes the last chain selection to affect both notes and they both get sent to the same chain.
Attached is the aforementioned patch.
----------begin_max5_patcher---------- 3423.3oc6c01aiabD9yN.4+.gPAxWzsX2Yeueq85K3.ZABZR+TtBCZIZalPQ JPQe24Dz+6clk5Ua8BsEoH80Dfy1gjZ4rO6LyNyvmg5291u4pQ2T7kjEih9i Q+TzUW8a3QtJbL5HWs5.WMZV7WljEuHbgilTLaVRd0nwKOYUxWpBm38YIwkQ 2lVtnJZx8wo4r0WysE4UKR+0D55DbFe0wyeXVZdVRUXjEqNZ5zv3UbyO+Nmb 8XLuLYAdeiqRKxutLYRUsXKbVlCbFvONB+SgFzb03HgltM3YY7n+y1hQd7rf XL5OUlFmE8mKxlNZKwo3gpUxyZobdb0j6Syuaq6pV4XJs2JriijdKSozJu4. 21sk7vDMb7+629MzuweMtsv9EISJxm1dfObJvWhSWg.LVw3HO9mZq0Z5bvWZ 8LkP5wkYk1xzZtw24P+MOTUgiQyAO9IAOGfSCO.nPKDLgWociifvrf94lYwt Py56V8wpdbdR8.N5l376Fs0j+4PmBuQVfqP7RYcLsypHXbe2z1C5lkrXQ7cI OWqUCuLkTXO3rwM50ogcXX73PnToXBNHrxwQZsi4sN.U+k.SiKjFBBaejh2B .k+RCTNzGI3sjxl1HXfDDA+ksARkm7YbR8bfJunJAkyWFbI2CbY4i5.OWFNC 2fxYIHwidwTROOXKtw0UqCIKhd26d2hjp2eebddR14uufUzAPiRIXdkUEfFx rxvANpm3js.zbP6Jw4aWYgKrcEt0GC.oPfNt0nYjPKAsuisqZekHYGnDo8Rl UH4BIYSgFUFiyn5ZknVv4rUcgUhzFzDS3MjCYE59QBbGuy2FS4ZAnReogJtf 4rNIfQ1hQKwjFcXy+A+N9VykFoTFF5z1IDDRYXFgm6ZIf5kF+s0dp3uAtmwk dGJrBtgokbEsD2sAfqMdlwxcdDWTHj3.oBzccD3cezRttvatDM7.sAnHskn2 bmxI65nklGsnJtr5eO+72hS66.Pw3DLoy6031ZdASyAiB8gqU6I4W5SmTtDE VACnvjlk7ojxEqTqFu5Dwymu0wuZ6ODgd+bQXrzi2brz75iI1brxjOktZH7K OJsxr5lrYpDT4C+vnB+R41V+GWBuKqXxujLcaL4pQSSt8ELFEySx22ku5GO4 RSyepU2N233GxptdGEBfs+K313IIG9ieDcgqFcWY5zhbRZ1c.niu599SQBcX EWuyTHbI4wy22GupnH6l3RZ04lrjcW4Qik37zYwUIUo0RFv27ISmMuLMuZ2g KIOFGl6WLorHKa2Qq9TeZemZJpcLI4yoSqtOLbagd6TKxcz811Xd2Sb75isq k8eOoJZdbId9npx3I+BamK6.V4G1R+oV6vlZU1DS9iX1eHSe..lwaCoEI30U 6Z6hds9Suze3JKuWMbtqOx8jPPMb9iDZ1xfoP00fI4G05LTPuXxTLLmSOkQk yzS.ZV5mRXnfdeT08oKtt1PIZRbdQd5j3rqqw51ElElyDkkaepmGs33k+aiG pCpZyYf2hAPhXuUwrNWHwMgW1gKGmzcQZ9hpxGnqIpS7Xz0J4FEyCBtCFGh1 0fY7o5cmFa.0+U662PJ5XHU.RlAv7AQfT5TLmVpzAGxpdBT+0rnEYjuB4qCK gCgkf6LwR3zdGNomAghdJInOAJiaUn7ojNrF5Pz9IIkuKbeG5Wn147h1FuOW uwhii2mDqq8K.FNC89ZnmFkoNHSyEWotrUBufePnV2yPsPV+rpAKE9ANGbfw g+sS0mgefmkjvVVsV02XMJ2NsQaHr1qvsA0FgidBLOKm4vPrH9SISutFKtNt ppL8lGppSM4pmCwWM554TRyKpRxqS4Sr4jasx0ZqhAHezKVmW6d0P7tk0pIw vUmKNnW8yc+vqh6hDsQG.e1Jo1rz7ClXXPNnK3.H2hhGJmrZdrJj2Hwtxyzj EUo4qy3+m1JGjnmH52mNc5SRrttPHSmWfoHuTLeI1tu3YPv40SkqCLEnsTFj SAUymBtA5Tv0XEIJnzA4Tvz7UguBrETOeAa.LEztlNCDsuw7pSro.smZ2ueq YE6rQ0H8nUA8jUa8z0QMq3l3rkUAe8UNZmAXsjuFGZex488Y3MIJN+okSHpL 8t6qhhusJoLTzmnnfvhWG9+lTWkxuaQzpRAEn02Gy+X9eKMKKbEgQ4yoTMi9 bwVC+B7tMMZAloBdUokQnblN6gYQepHLPEOP0.sHRDFMT7dLJIFuuziCB+TX X2wUIYOxh9w6SxilD3VHMfUkOt7tQRWwc2kkDFgODk7k4n5RxT5LyngdNMn3 kjfGnbbDpBEDuj3vk732Uh2npG1pjJgc4CRVXgVd9O8ESG7zWDJGyZ3RQHie lV3TbKUxpkEi+7dFmGSC5wn+5N5KuuEH3o9jD7DLJlx.VOwuDESa3JJJ5Nlf mflXWKlVTn1r.yysZCzerqcI7Wj21LrUeRRhtEgMwrDcboW14vuwwjFuQQDC 0ZYfTKLtdF8eOg9sK2x2hLJGha4bT2C0BIJ5JQSaiTHbcO2xERly6AOow6zL sUY0xNG+q8m2bBVnNI07AulAF7+nmeuiY3fldT0mCAKBOExiwuBvhNnkVK4t .L38WfVPh9heE2g6id973QItzL2kWWmUhZpf2y3fLri2Rh73tnD4ANIQdT35 r24UJAQcTF9atw10D4QXrLKtuO8LCkneBCHMf8MMU5gKMIDQUKgUpMDuCcR7 u4ZSmSrNipEPpKMGDEJISyEAN+Jw8DTfRY7uU3ROzIghKvsF8VfL0UzCkSZj zF0us3ROzEzfV3QLP3b0ZKxvCZPaeCvkd3RykdLvVFf6bX80OcQoB8FAu03R OzE8phli4zpsNJLzPBYREFP0a.tzKtzM5DQ4PLQ4PCfB.FnqyAb3s.W5Epdp 2UTDkmsZLTc.Su4svV9hKda9ro0Vorv8NixI5IxzKNYcJDRIyycXvbgmqJtC j9PMVZK1MqNAtOm1Zojx8NF0tAGhB+sXxdOL6ljxSpQgPJUy0cbytrNr0kx1 17dI9zYZi4q47hfUE9mRCQdtyuLEvQSDebSVijTef3UBGFXO5mT5wbyb6W15 97wmGkULAyI+8TIj9gjLTJKJeY9F36qLdW59rAkNqAzTjJZAyx8bp9PByaud .PFhlnt74FSXBfgp9R6BfFLJ+de.7+Q8AvQIvGuk42j1027ahHLsvEJXrTG3 2jyru3OuXbjTz1PbeyLRA2xbn+VJKZoFnZL5oPc5TH9Xz0qpXwiytoHqkoO8 lxH1W.MPskgxKCkd1vbJkBpqqa+vKxsKgeKoMq78MOewXDERQfB6VCS4jNmc Ok2+h0V.gHwh93HBFhBAmEsJ5rONpkUwUcKq1CQD2LlsCJlzwoDAPnWigFqT 1tt6LNI01CXQKqua6cu2XhGBgkdJ1.BuX9QVpmMV1zrluhHasp2I1txRM3tW GpaAmoUNCUsm2njstQMdSaGtiRN.Z7FikANNHBrPPwv0UHj3Nzes4zckEOLO BZazFF.nsqlbOZ8pN0C3Az10m6EPDAbVREZv0xPtzMH5zIpnkbsM7J3yAe0s WfT1ynryga6ZCJxD0Hk3VAgd26qusBJaqFa8fcrlr2yLSIYBij6Lad6Cv6xt ytVFG8hivWJjmQ+8tUtQJL9vU4FMDakoPhjMq0ABXxPr+MH05F1+FxAZi.oZ dKnngg4Tn48fxd04FDqBMucrzCTEIs4qiUgFZKLPaMQcy8HoFpdjfWlhj3s8 TvNPWErMeJne6qHoGnJRxFuufZft6rT17UggZXdMeeA4WAQpJacageuQcu.M p6Ojrr6xhV7p3Fz9aeE+oXukmAJthdSL6XTGk369u+RjZ85apDN9cs6okU44 PHZ9da3fK8q9XoWy3FNmdrGZhNFJsvfKnhtjrzTCd+o3rGRh9CsA46MWbJtx Al1JEqeELq0BpSGM1mTK11TYaO0a8bZDnKNYyoWJxVEpdQ0uVSuXi1eIUa79 CGnLpmiG1tuihd0eqKb7uCJpaBs.48EgdPGnuZiZkVJ5f657O+ve4CzqLg+A pXtejQrAYts7taVQgQIQbQoh9I469Ibr9Dudz2QNlTjUygySLrG.pi9PUbV5 jW0WXCLHzc+3MRYXzWeTDUVs00U12g.9skEytrPtYf.4x0PNTi3T+Q6bs.he HydLH2zWrY+dClpCL5shMpffcMfzosQHAHo4mOdz9MF9Iav9sfK0VnEuCQqv N1z6GmZRC2Bu1MruRbSd7lUY759h3jvnw5YNC2SuhSHFIo8.8FN05OHNVOb6 9DjVhqOMY1Un6yRhk9RoaqbXOP9q1cyzcOotdfzV26hdiENqtQBmqeDNSiEN wkW3rMR3T8CxoZjvYFxBmtWDNiuQBGuWz4LtFKb8vxJzDg6o36vR3bCYCB4. F4rhdQ3zMxIrtez4ThlHbP+rwunQ5bgovk2OWnThmV55Gq0F4CNTWu9vfnQB m12SKqPyEudvdU1XShKuvAMC55m8HDMJnInehKArCX2vMbYUMjEt9IPcP0L+ v8ivoarvIFnVqB0.1UhnmBZpQkxQzOaeIZl0ZHddw.MdSnmJCVyhT+rEM5.3 u9e.Pq1E0 -----------end_max5_patcher-----------
you could set up the device so that on all 16 channels the same
patch is present, then split your chords across channels, each note
with its individual pitchbend setting.
I’m not sure what you mean exactly by channels. Do you mean midi channels or voices? (I tried putting the midi messages for each voice on separate midi channels, but that didn’t work within Live.)
Sharing state between multiple patch instances would work great though! Is that what you’re getting at? For some reason I never thought that would be useful so I’ve been automatically putting — in front of everything. Thanks for the wakeup call! :)
I think I’d have to use two patches; one to send out the voice and note info (via a send object without the — prefix), and the other in front of each instrument device to receive this info and either use it or not depending on some local parameter. Is that about what you were thinking or did you have something else in mind?
If this works I suppose I don’t care so much about the chain select issue. Still would be nice to know why that’s not working.
Thanks for the help.
I figure that you’re seeing this because even though it may appear that the rack selector is making the change, the internal routing changes in Live are not in place before you change the selector. I modified the patch a bit and was able to see that this starts to happen at around a 30 msec pause between notes, which I guess is the lower limit for the time it takes Live to reroute MIDI to a rack.
Not sure how you could do this in MFL as it is. If your instrument is a VST plugin, then you could do it all inside the MFL device.
Oh ok. I suppose I could poll the chain selector to make sure it’s set before continuing, but I think the delay might be too much. I’ll try multiple patch instances with shared data next and see how far that gets me. Thanks a lot!
The thing about the API to remember in general is that it runs in the Live UI thread. As such it is asynchronous, you cannot rely on API events to happen in the same way as you can max events, with a defined order of operation.
It wouldn’t surprise me if Live could actually switch channels faster than this, but this is all you get through the MFL API.
It’s likely that a polling solution would not work, or be pretty slow. I just used a delay to arrive at my number.
i meant midi channels, sure. pitchbend works per channel, not per running note, which is why you see this.
normally should give another answer … i.e. dont try that pitchbend stuff – get hardware which
supports tuning table. :) but i know that there are many which dont.