Optimising pitch~ for theremin use (Midi Smooth)
I’ve been using my theremin to trigger midi notes, and send those to a vst. I’m mostly interested in using this with kontakt, but other vsts could be useful as well. Anyway, the results are somewhat unsatisfying so far. Basically its the fact that midi output only allows 127 notes, which is hardly enough information for nice vibrato or anything, all I hear is lots of staggering.
I’ve tried a few different approaches to solve this, for instance, I truncated the decimal values that pitch~ produces and sent those as a pitch bend (with the maximum bend value being the next note) to try and fill in the missing values. It ended up sounding too wonky. I also tried a few portamento patches on a couple different vsts, but while that smooths it out, it makes the triggers somewhat unresponsive.
I know I could just set up another control surface and use that for modulation/portamento, but that kind of takes the fun out of playing a theremin. So does anyone have some ideas on how to send more detailed midi information, or something of that nature?
p.s., the main goal I’m trying to achieve is to be able play the theremin and trigger some wine glass samples I have for kontakt 3.
p.s.s. while this is for the same purpose its very different question. I was wondering if maybe using a phase vocoder, or some other technique to imprint the original theremins signal onto the vst generated signal could help me get the sound I’m after.
any help would be greatly appreciated.
Why do you need to convert the theremin tones to midi if all you want to do is trigger samples from it? Maybe I don’t understand how you’re triggering the wine glass samples. Is it just a simple trigger, like:
When the theremin hits middle C, trigger wine glass sample.
If that’s the case, then pitch~ is already giving you all the information you need. Keep all of your processing in the MSP audio world, and use thresholds (i.e. < ~ and >~) to determine when the theremin has passed a particular note, and then use change~ to generate a bang accordingly.
Converting theremin tones to MIDI pitches seems like a bad idea. A theremin is inherently continuous (with respect to frequency changes), whereas MIDI is inherently non-continuous, like a piano. Unless you have a compelling reason to work in MIDI-land for this project, I’d stay away from it at all costs.
swieser1: the reason for using midi, is the large number of variations I can make to the sound, as opposed to just the original theremin tone. I don’t know if the fact that theremin is triggering notes constantly is entirely a bad thing, since it eliminates the need for an envelope follower, as midi note On is always true, unless of course the note changes, then a single note off is sent.
That part isn’t the issue though. Its really the fidelity thats troubling me, I mean, I can see that pitch~ clearly is interpreting more data than midi allows me to send. I want the note 50.487 instead of simply just 50.
Oh, and its the continuous quality of the theremin is the reason I’m interested in this project, as I’d like to use samples in a legato/portamento way. Konkakt 3 has a nice built in portamento script that allows me to crossfade samples while bending them and such, so I think its a promising start.
It sounds like you’re trying to recreate your theremin performance with the samples rather than using certain MIDI notes to trigger/process/manipulate the samples in other ways. Or am I misinterpreting what you are trying to achieve?
well.. recreating the performance using samples is the idea, yes, but I was thinking of bending the samples and crossfading between them in such a way as to result in a smooth sound. Instead of it being like a took my finger and ran it down the length of a midi keyboard.
its worth mentioning that the sound I’m after is not wildly different from the theremin sound, so the samples could be fused together with the original signal, that might give the certain smoothness I’m looking for.
I’ll try and clarify a little more; see, if I were play a note in vibrato on the theremin, the sound would fluctuate (lets use note 57 for this example) would fluctuate between 57.000 and 57.999, then this would cause the sampler to trigger only one note, and THATS where I’d like to have more detail. Some method involving pitch bend to send this extra data into a sampler seems reasonable, but I’m open to other suggestions.
Ok, well I don’t have the file here, but I could explain it to you. what I have it pretty simple so far. I’ve only just started working with MaxMSP, and I really only started testing my pitch bend theory.
basically, I take the float pitch data out of pitch~, ignoring the amplitude, as it is set to always on. I send a midiout function with the integer value 80 for the amplitude.
then I have a box where I store the current pitch in integer form, and I subtract the integer from the float to get the decimal value. (like 32.333 becomes 0.333) then I multiply the decimal value by 20 and send it through a bendout.
I tried multiplying it by more than 20, and when I raise the pitch of the theremin it kind of sounded like an engine revving up.
anyway, I also have a few gates here and there, one for if the integer pitch is great or less than the stored value, with the eventual plan to send a noteoff if thats the case. But its not functional yet.
well, thats it.
Ok, heres my code so far.
#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P comment 595 321 140 9109513 note:;
#P number 598 365 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P comment 721 286 140 9109513 bend:;
#P comment 608 98 140 9109513 float pitch (insert):;
#P comment 667 128 140 9109513 int pitch:;
#P comment 738 150 140 9109513 store pitch:;
#P flonum 700 358 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 739 334 33 9109513 * 90.;
#P newex 654 218 27 9109513 – 0.;
#P flonum 717 307 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 610 115 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 616 240 27 9109513 gate;
#P newex 617 214 27 9109513 ==;
#P number 741 175 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 696 244 27 9109513 gate;
#P newex 700 208 27 9109513 >;
#P number 670 148 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 730 409 49 9109513 bendout 1;
#P number 721 382 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P number 587 340 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 575 391 55 9109513 noteout k 1;
#P connect 10 0 1 0;
#P connect 10 0 12 0;
#P connect 10 0 4 0;
#P connect 7 0 8 1;
#P connect 7 0 5 1;
#P connect 4 0 8 0;
#P connect 4 0 12 1;
#P connect 4 0 5 0;
#P connect 4 0 6 1;
#P connect 1 0 0 0;
#P connect 19 0 0 1;
#P connect 8 0 9 0;
#P connect 12 0 9 1;
#P connect 5 0 6 0;
#P connect 13 0 14 0;
#P connect 9 0 11 0;
#P connect 14 0 2 0;
#P connect 2 0 3 0;
#P connect 11 0 13 0;
#P connect 6 0 7 0;
#P window clipboard copycount 21;
I forgot to mention, in my current version, it only works when the pitch is on its way up, the current pitch has to be higher than or equal to the note being stored.
Using MIDI pitch bend messages is completely unnecessary if all you’re trying to do is detect the pitch of a theremin and trigger samples off of it. If you know the pitch of the sample, you can manipulate it by playing it faster or slower. I still don’t understand why you need to go through the intermediate step of converting everything to MIDI.
I’ve written a little patch that mimics an audio signal with MIDI note and pitch bend changes. Have a look and see if it can help you. Everything going in to the [cycle~] object is my theremin emulation so you can just hook your [adc~] straight into [pitch~] if you want to use your actual theremin. If you want me to explain what’s going on then just ask but you should be able to figure it out if you poke around a bit.
The vibrato sounds smooth when the bend does not cross over to the next MIDI note. Similarly, the portamento sounds better the less notes you pass through although I imagine you can fix these sounds if you apply crossfading, like you mentioned in your earlier post.
Oh and ignore the [lh.keys] abstraction. Its like [notein] but using a laptop keyboard rather than plugging in a MIDI controller keyboard.
----------begin_max5_patcher---------- 3359.3oc2cs0iaaiE94I+JDL5tHIcxrh5t1GVfYxs1saZBxLncAZWDPKSayN xjtRTYxjh1e6KknjEksrMGaJF29PzXQRQcNemK7PxCU9sGc1nwzOgxGY8Os9 IqyN62dzYmUUTYAmUe+YiV.+TRJLupYixSwSPYiNWTEsfkhXr6WhD8wnQV+u 5pVBYIywjYeHCkvD055Yeg84V.fe0eD24vut5gHEKvDdOV8t.sEJdOcJEOoh dni+kmE5Oprre+QOp7x4lfSBipXgf.MyIdGBmjPWr.QXMrBC8oJxbzUW98u1 5Muz5Ue66u9llZmRILBbQEaN5xLLLcz14S+PfPhI3SaO03yx2QN9yUuCfC+Y 5i8s6g8c0I6yJxHVzoSsfooVu4aew2ZQnLt19g.DffvRV20UfGN9CLP.zIPT w6XRNKqPt9GD.DDKrcCqTAhGX9OHVm7+GwiyfLp0DzR17Ch6ciExcuJtOxdf 49fgf64WPGFy6UIsicKuFDOv7tV8.tjlwfk0PsX3EGF663Hz7cpTAhiFX929 P3eB5N9CuA6i25naXNXshAdXdBCEiEDToTvu5uK3v4g.G8LfnuNgCl0TqwaE RllRgbMHqQigjYGJ33GK7STYq3tGv4Aoq3rI3.NHuj7tcbabObxAunXgr1Xu JKafK79r4AA111GlkkqDZ4qSup8gVQGBZMtfwnjspzzES5abSag4harH9glq GYfhdQZ0tHLd.7Tzv5hPFDQNoIwaeHBPiHxWaAFN.wATMFhqyv55z8fbcVFg Xwn83In5eJfAXFZQ8rKGcYBsHmgSJe1WmAISJ+w6vPBs7GmWd4pL7r4Uu.4F 2sMuLkCmY6ra9FJ416e1M7q69wapArqJcV0qvrk43j4zrIq5smmB+HlfXsEf RQ4L3p6ecJM4VDIeIFktpv2TjKdGWwkDME9CkQosbNkfZaGLCuXbam8euOk1 sE2TLtHElU0Wnzz7UU7hhzDd7NYsEjAuarnkuMaFjrph2gxRJxyweDsYcumS 7aV5ymWjkLumViPS1rzKSR3HFl1VBGHWPI3jVF6FtSTZ+M9647LYcMhWWfYv Vd6ZFRft6nM+a3m+7dZxySQB5tiJV217lBlfI2Qad6GQYSx3.JomJeANmwiI slEWqx1aavnbIbrkvupzXsohWw8wfx1jp5zn2g4pg6tIuJCwM1EEzohqSgKk JDrkxWYnb88D17def0pvoU2mlhIijuEJaRk1Z+9btulL3XY56lLzBpnIWy4L xLY19yelqnw5sx2x0h4FqYvzFy61tDuXIjfkzvJezJ3ijiVLNE0gu5q1Mgi1 2OXG04zZlQwU5BWBm2Rz+.EmHrToRktpeVUcWNrhAwLIHqXwRj78zEiWywBb Sk90eLtJCQ3I3anYDI230hmq4pZxFysJ.YaU0HacsI5xrZG3WCacWdYJaixt AQnYqW3UbmnrZVSt72Nl1xtujLKEm2CmvIFpDCv82m0weO2tJgJod9pzBFRx iXo6LIuvuS3foaqtJkdGQLb.ik1V90yg2VLGxChXUQ+3bt6Col71jR5oURc8 uV.yj5A3cLJU.rB5GllhoKQR9xwSmJcGLCJzjOeSsoWgmxjz4Z7Q72Ku7ePv 1QE+dzcUhnYsO6Ox8m0hBzz6yaD3c00E8L8NTau8FDqjpSjF+PBvu9NDp0t8 8PI2HWSKHS3J+hwvDumr64iN2NR7krEz7kyQRXlHFDBRxAyqoi4tmZu+k7f. PRFeI3m8JIeEcboeEj7KTYQ5BbNpkF+NJqs1uCl1Y79qfyD5XKkEBSlzUGg. wR9sH2JpsLbfV1bFcFcygKeA2btkM9QJcx3TpDZcCDeKsogRxiT5Dg33F5hM ss6z32i3CFlWQQO+dNuk1yXckC7To1Pw4xxADTzgcK+ZDLmGClTCwh.xtgqI H4QiGH1pXkdOVRo9aPbkI5RljY4kKWlBKjdIutfveIRg4WFBbcfrpLYuX4kH QSS4wsmH7i03TdVNq7sM5XlWSfS0732yD8bNxUHyy93W0C0VhiCBDD6EzfuX F5bcwd5eXAtXqPSNdFgy4G0Bh4.pwCaMpaz2bdC0oEgU8RmOLPSytgFUsZ.9 gCLxDzgT3lBB7nFP3cLNsxYcY.ascwYij1LvJ5MVrZNAh0vvyokf4v7rp46N Qxx8rQSPSeH8AO7DRa6qZdmKcaIlrLCwGQkAY0Dt76EVjx9P+HV25mBSPa8g 6Uhd1nYY3ITRIQz4IKKt40Up+WIi8ko6pVPfK64g4gqkxml9Gw43xoQHKG3p v7ojr.xPU6jQoJg8pmiOekrp0kRpuVvCbZBjA6Nr0Za4ujFPGyjNkuKyk0V2 LIOIJYxrayls5qULvZ8ZptwNxrUqmcXAscqn0sjbF0TbkaFwONW+XI5SKyrd 7R5cO14he9mO+wO9weEF7O.NgW7z.2KhBbAtAOyK5B2P9OCdxyBhu3I7pu3I O4IO0i6aQtS4wuxmKRgPCwaWxGsHYDaVNvoZDw.mcIY.ZTx.r80orQ7BUSUL PDzieyU0X3di0YC8sXYRnYmNKqUmLaEANRcMi91NG6JwdjipPwC2zK7OIPgP qnNsfFDjv2DHw97NsxgDmQ8GMftUpUs.1hsW0VAW95zwhiV84OMkRJmi7Nfq 92K5iwkLvcKouflPNms3RN5OwHWiVm.5BCMLz4aHS4mZzf1.BLM.X1n1pyUh gGMKC05OTAM0qNZnHyBBFHTca5nfPcBqKP44vYndw0uBv4KSLFieER5IR3uH ioepWOk6PAM49jT0zP0x3NhTE0y2vl6.veMs2qQ0uTl61+kwbuFH+BYsa26v QsKRSoV0VVjlJdor99Q3bZQVRCFUG754Vc4qInbFlrZIy9oUAbrdCmimLo6R TIxYvIKoXBa0NhnjNwCltCUjt6gA+hR2pR1wmTjMHVU59zhriTU619DCuApp eWIY.mPDN3gP3mPHtspp3kiycZoqXqLkCNwnbksO6wd3KJk6qLgGcholqLke ZQ3NJS215LRk5B4bfX+QygeDM4C72COTwO.YrL73BlHXL48Kceau3rT5XXZ8 lstJxzU6d3N1XwiciI684VmLeTKJnmcKu7rUhI6KAKj9yAlPA1Uauf3bo5EL rIXiuyWhiLR8Tlc8q1kbwwsp75wdjQzY1BkLmyEHK6sm1HZQZ644HjyU6jRf 6vJt87z5gpAWdvn1wANqqIwQj5QthUtxCHNGUCLJ4nyTOpzqwgl1YMrsP4Xe rs6Ql1Y.clZQiQjIGJaWaS3K1cceugMa6.9ZjsmlVjOWE6giyNPjQHtAZDY5 KE7bNIyCwF0Cw2pggOOD04wtKqLksU3KxwAMFhHuD7F3igH2k+IoZQssQ8Gx fgVsH1W6wZLrAZz.OhOuAZEd5YHzXWMBOh7D6qlBdpqyS95.ugx9Q3UEXaOr FPw15Fa3Pyy1Q9MebvRsAUPzvhJQZ8yBwzRL4eYeguEaNhTdiEJMGYwoAmx6 1os1QhWBKLPX7v5AJ7flsSmDLYf9DQHl.q3HhLz9gCiNQQgFmJhOrTwACKLD 3dpGjRy3OdglHHkfnSxXTpOrHlwzHvQyeYYlteCFwONNMDmU6a8f9skwWmS2 8usqyWzQu5P0FMt9C6Inw26D0WZilgXfknng0tw0+3gA4O5PWX+.wF4O7PWb Pe2gpgnHybR8Bz6I0y9B2g47nIxHyZsHufg0XBbPFSnOOAl7G6mGbhay4LO+ 8wC6eMvzY3CEjkvja4hwcs345bDiZ87vANFKfNWHH4jpS4Dp6v9TsEEZhEKT mNAVvnS0c7mMng3ibnq2vF+oNWcnz4WbK59bE2kkiCdp20wnAdanz4ZmUkru 7HkrG1y2sqiJqBxwNpgNCYeIlyLbjwNNvxG3XEAhcrFmx8Mu.RBssrsJy.UK 6cuOtmW5qJmI+2iwkcCb5K.RsNOPud7YKimUuhtIdp.dWOONpA4MxeivNYkw VxcixygtTi1HsM5OkM1PjqLM4oJMALFM4Eo.M4ALJN4Zq.M0MKzFdZJVEYmY oIfJxNeaipO0M+P2EMYNbxWE8o.yCSpPRFDkTwnK1njzZ9c1hQmYoIeUbhGZ VZBnhBtmgcXFnhrKznVctgJPSNFElTFkLGI4nhi.uGFIA3QiWtDw0oQn8paL AsZVApqBjTrYsEiUx+fmg8YoVTdlU5EpTHUOPce.nTcG.p+uomnU2crhUkT0 7MK.pRfMQ1lml1WLoqY2tWZJPHUqyyUO+16NRpMRonUcMaPOpLvYPj4oo8NS Cy5TyUkfn8M6v4AN52k1wFWuJZSlMNLfRS0vrvDHP0HwL3DWUQ1AbeXzjHdv 5rIHNX0MFiVMnLs76I99HIfgiDSEcefg08UJx9PySS.UnIyYOFnR.qwlUGOV kQAcLaLfNJMaCGySS.UnIfYoIGMiSt9UN38DYEkKHX0cGafDwCfT0w1aXnVe mAHtm5YWJ9ODw5IWFe7yBwSowNsOFiX9M+9i9+Tc7V+E -----------end_max5_patcher-----------
ben romvari schrieb:
> Basically its the fact that midi output only allows 127 notes, which
> is hardly enough information for nice vibrato or anything, all I hear
> is lots of staggering.
If you are serious about your instrument, its maybe time to ditch Midi
based synths. I don’t know of OSC based plug-ins which could maybe get
around that problem, but why not do all in Max. As fiddle~ or pitch~
pull out the whole continuum, it would be a waste to map it to a
keyboard oriented technology…
Building a monophonic synth isn’t too hard, and probably needs less time
than figuring out how to trick Kontakt. Samplers aren’t a problem
either. You have to think about and design the trigger points of your
sounds but within Max anything is possible…
ben romvari schrieb:
> Ok, heres my code so far.
Here is my way to get the fractional part of a float, I’d use +/-
----------begin_max5_patcher---------- 1192.3oc6Zs0iiZCE94jeEr7ZyhrM1foOzeF8kUUibBNYnk.Qfyzoc09euFa HwNAx3bmcTmQhj3K3uy24hsO578oS7mW9Nu126W89l2jIee5jIplZZXR6um3 ul89hbVsZX9E7+tb9e5OS2kf+tP07FuprBQWyKKKDEr0bUW+NuJkUv55qX65 rhbtP85PsMtgIV7ZVwpWp3KDZ3fgAfYdPDo4iHTySDH.38GFqQc1+pVCXyX2 85K2JN78qaR7Oa35WtuBrd9KyKYx0q6clkpPrT.+JJx2Da7pVNokTjqeVN+M dUcVYgBByZaeuD.A.kHfwJQ.q9ElZHDRxdUd4h+hqVWPWio7km2aobCuX+LT iv5g8HyJ1Twq4EBlnE7lqLaat3k9IW69WxVvGbxCn8m3upJKsrnAFVyso4tE TJyJkdyy8HWMhB1ldlrnrLeNq5sr5r44bKsgzXlUjslI3hLMhPfcyKa8FkUq 46ZMWvRYBlFHFJJSGEC6.KGFq1OvwQYz2QCG4H.L5nGmAHNQq1UtAjtm6f2w V9PidNx522ZhFV8PS.tnb8Ztld786Z9GSm18kYWHSXEBwNLxuHsVM63TlRCE LYXNjFDSRBSRjlVwffnPLjPl4EFcXrkSDe4bYZ6.LGR2geBnUZRPHjDSoGvp zmFqF8fX0u706o0ZLLHjDFFK4UDLI.lPfHokKN7owqP3ChXa3UxCILPRX.EB RhwO0v.PzChXEdKa9+hoV3YPsHb.hBvzX4gVHWG0F9wT6ri9xfj8iJn6ucOi NHozHJFAvMmLLJ.ShCQPoQL4NZDqNpzPrJ9yPrAy8xLCM771KCR9bDZvjYMh LPhGSQFh9LDY.PCPXPD.NVhLD+fX0Zdt2bVwp6kILQeOb80wIWYHAzonSsTb pqoQePb59b5bOi0Zd913jmjcJ5ldHrq519Dvs7x9JqoAk5vGwM90X5J16ngB jePbjO.CHr3wuv1buuajzRNGoceltxyJFJSWJ71ze+zPc41pEclcsm0VhdKn mxqEYE6x7321c0RYnUqA9ZVZpcd9TLcV5lRoabcW94bRwcQ3F5BtkVTdfwEt ANf6vwErcD0vQFrotZkDMtvcji783B1thZ4UlFUrMwQbKO.xny59dhahdGNH IfR04LNgJuxc2QB6Z9d5D3jya73RsDeFNuimcTcciI3HyI.cNNAiG5F4Jtgv wEeiOiCv.GW6n9S34bQN6VRGUlINadiFYmO20S5htkmgosQo.nKnkZ1a7zWj Ki7RmuvDhpr4aE5q7YUfKmpLNbqVOxKmyxaqelcix20hMo2hL4rpLko6YB0S sNzkxbZYdo7R1tTOSu1jrrEk4kUcUeCMFPZNCSeeCZTASyWYOsH4ewy58alS SpupWvz04BHHouxpBNbYUQw5RqQkXAcwDcCKqpcYZ2JoS1UXxEnMjq9bd0mP sQaQtcmzFsE41f5B7knKjwJDxXUmqYWb.HAj.Qy7nvNw7.gs2bZ9A4yzTbH9 +ui9glVZx9I3mGapLTCvNwhZcygaf1pgNZiSqsCGZOSqDDb79k8uW4QlKtBo 3wGjNX45GS3GOjfe.jfWAjj+3GS+Ot4iGEB -----------end_max5_patcher-----------
Thank you for all the replies! Those last to programs should probably get me on my way.
Some of you seem pretty adamant about me using purely max as my sampler. While I find this idea interesting, considering my current skill level in max, and this being my first project (I’m doing this for my own purposes, I’m not a student or anything.) it seems like it would be imprudent for me to take on the task of building a sampler, especially one capable of portamento, several velocity layers, and unique samples depending on pitch. Still, its not totally out of the question, so if anyone has advice about it, I’m all ears.
I would advise you to do whatever achieves the results you want. If you are more comfortable with kontakt then there’s no reason not to use it. I think the point people are trying to express is that the possibilities of using max are almost limitless. I’m not familiar with kontakt but I assume you can achieve everything it is capable of with max and you can add to it and tweak it to your heart’s content. If you are just starting out with max then go through the tutorials and examples and have a route through the list, there’s no better way of learning than giving it a go. People here will be all to pleased (usually!) to share their knowledge and help you out if you run in to problems. If you do decide to delve a little deeper into max programming I think you will find it rewarding, if a little frustrating at first, good luck.