Let's Design and Build a (mostly) Digital Theremin!

Posted: 11/6/2018 4:32:16 AM

From: Northern NJ, USA

Joined: 2/17/2012

"I probably could have saved you some writing time if I had phrased that final question "Your technical thoughts on this?"  I was mainly asking if you had any thoughts about RFI/EMI or signal integrity issues. I have my own, but I wanted to hear yours."  - Roger

Do you mean: are there any issues with the LED tuner interfering with the playing fields?  The answer to that is yes, and that's one minor reason I was working on the PLL dither (and some on the LED PWM waveform).  In the very far field, where the mathematical subtraction from the null constant produces a number that is quite small and has poor SNR, you can obviously see some interaction going on in the way of LF oscillations on the tuner.  You can see the interaction too if you pipe the highpassed pitch number directly to SPDIF.  But you shouldn't see or hear this when playing normally.  The tuner can be completely turned off via the UI.

Ideally the tuner would be located smack dab in the middle of the pitch plate, but that would probably be a much worse SNR scenario.

[EDIT] As far as signal integrity for the tuner interconnect, I believe the prescale counter divides the 180MHz core clock by 16, so the clock going to the tuner board is 11.25MHz and the data is at most 1/2 this.  There are programmable FPGA resources to control output edge rate and drive strength, I've got them all set to the mildest settings.  The tuner, like the LCD, is a write-only interface for the FPGA (no reading of data going on).

"But what I won't be doing is using plastic containers and Dupont jumper wiring, because I don't have to and I don't want to build it that way.  I think time is best spent putting forth some effort making a few incremental changes that put the design a step or two closer to something that I like and would possibly appeal to more traditional thereminists as well.  The antenna plates won't be in boxes because they don't need to be, and some things will be arranged differently physically."

Oh dear, I should have made myself clearer, I wasn't expecting you to duplicate the prototype to the level of plastic boxes and jumpers.  They're fine for an alpha lab pass (and are incredibly freeing for development) but beyond that PWBs and sturdier cabinetry are called for.  I was just hoping you wouldn't steer too far from the basic ergonomics, and it seems that you aren't planning on that.

"I am cautious enough to know that if I end up going that route it is better to do it from the position of having a working prototype, with plates, as a starting point.  I have every intention of giving plates a fair test and I will spend some time with them to do that, but as you know I have legitimate concerns.  Those concerns come from observations of the way my hand intercepts the constant pitch "surfaces" that surround the pitch rod.  I have learned to work off those prolate-spheroid shapes both horizontally and vertically, and Electromagnetic Fields 101 tells me that the constant capacitance  constant pitch surface contours for plates are going to be significantly different."

I don't have your deeper feel for analog rod Theremins, but I imagine that playing a rod or plate in the mid to far field probably feels similar. In the near field the rod is a smaller target so "aiming" the pitch hand horizontally is somewhat more critical.  Every so often, usually when I'm playing tired, I notice that the near field sensitivity is low, and it's because I'm way off of the horizontal re. the antenna.  Plates seem to be fairly forgiving targets.  Maybe you'll end up hating them, but I'm glad you're going to give them a fair shot. 

"Having configurable pitch linearity in software is a great thing.  But linearity is very much in the arm (and hand, and body, and stance) of the beholder, and I think that plates may have a different feel at close ranges.  If your pitch field is large enough that normal playing distances avoid flat plate distortions, that is good.  But then I start thinking about the effects of z-axis arm movements in the more spherical far-field (I mean distant field, not the antenna terminology)"

The far field linearity is of course contingent on adjusting the null for my body distance, though when adjusted (it only takes a few seconds) I can open and close my hand right at my body and get the same response as with my hand closer to the plate.  But I find that I play best (on pitch) in the mid and near fields.  I sometimes touch the plate box going for a high note and there is no "feel change" (that I can detect anyway) indicating that I'm that close.

"Were you talking about doing the pitch preview in the FPGA?"

Yes,  I would very much like work on this with you.

"What is your total current, approximately?"

I think around 330mA with the LEDs on the lowest setting.  If you USB power via UART you get a ground too if the PC is grounded.

Posted: 11/7/2018 5:02:18 AM

From: Northern NJ, USA

Joined: 2/17/2012

Parameter Type System Overhaul

Panel knobs control numerical inputs to the various algorithms.  Any conditioning of the input numbers, as well as formatting them for display, sucks up real-time.  Conditioning and formatting need only be done in "knob twist time" so it behooves us to unload as much of these calculations to non-real-time thread 7, where they are updated at the (comparatively) glacially slow LCD refresh rate.  To facilitate conditioning and display formatting of these values and to set the various limits of them I devised a parameter typing system.  Each parameter starts with 4 bytes of "use" data (algorithm input), followed by the knob position byte, followed by the type byte, followed by the 4 byte text label to be displayed.  So 10 bytes for each parameter.  Since the type is a byte, we have up to 256 variations that we can encode.  My first stab at this about a year ago was obviously in need of updating, so that's what I've been doing for the last few days, and the overhaul is now done.

In the old system I devoted fully 1/2 the space to the set of ranges: [0:1] , [0:2], [0:3], ..., [0:126], [0:127] but a recent type inventory revealed this group was only used a few times!  Once the range gets above [0:31] or so you're at the point where powers of 2 (actually (2^n)-1) make more sense as the upper limit.  The old system also had a bunch of overlap between groups which was inefficient.  And there wasn't enough conditioning going on.  So here is my latest type system, which only consumes 1/2 the byte space and is much more useful:

TYPE    ENC          USE                            DISP
----    ---          ---                            ----
00      null         0                              "  "
----    ---          ---                            ----
uint range
01      [0:1]        ENC                            ENC
02      [0:2], etc.
1f      [0:31]
----    ---          ---                            ----
int range
20      [-1:0]       ENC                            ENC
21      [-2:1], etc.
2f      [-16:15]
----    ---          ---                            ----
equal +/- range
31      [-1:1]       ENC                            ENC
32      [-2:2], etc.
3f      [-15:15]
----    ---          ---                            ----
uint 2^n range
40      [0:31]       ENC                            ENC
41      [0:63]
42      [0:127]
43      [0:255]
----    ---          ---                            ----
equal +/- 2^n range
44      [-15:15]     ENC                            ENC
45      [-31:31]
46      [-63:63]
47      [-127:127]
----    ---          ---                            ----
uint 2^n range, full scale
48      [0:31]       ENC<<27                        ENC
49      [0:63]       ENC<<26
4A      [0:127]      ENC<<25
4B      [0:255]      ENC<<24
----    ---          ---                            ----
equal +/- 2^n range, full scale
4C      [-15:15]     ENC<<27                        ENC
4D      [-31:31]     ENC<<26
4E      [-63:63]     ENC<<25
4F      [-127:127]   ENC<<24
----    ---          ---                            ----
uint 2^n range, full scale, flipped, squared (for Q and such)
50      [0:31]       (~(ENC<<27))^2                 ENC
51      [0:63]       (~(ENC<<26))^2
52      [0:127]      (~(ENC<<25))^2
53      [0:255]      (~(ENC<<24))^2
----    ---          ---                            ----
equal +/- 2^n range, full scale, flipped, squared
54      [-15:15]     (~(ENC<<27))^2                 ENC
55      [-31:31]     (~(ENC<<26))^2
56      [-63:63]     (~(ENC<<25))^2
57      [-127:127]   (~(ENC<<24))^2
----    ---          ---                            ----
uint 2^n range, full scale, flipped, squared, flipped (for Q and such)
58      [0:31]       ~((~(ENC<<27))^2)              ENC
59      [0:63]       ~((~(ENC<<26))^2)
5A      [0:127]      ~((~(ENC<<25))^2)
5B      [0:255]      ~((~(ENC<<24))^2)
----    ---          ---                            ----
5C      [-15:15]     ~((~(ENC<<27))^2)              ENC
5D      [-31:31]     ~((~(ENC<<26))^2)
5E      [-63:63]     ~((~(ENC<<25))^2)
5F      [-127:127]   ~((~(ENC<<24))^2)

----    ---          ---                            ----
uint 2^n range, mul, offs, exp2 (96dB)
60      [0:31]       exp2((ENC*mul)+offs)           ENC
61      [0:63]       exp2((ENC*mul)+offs)
62      [0:127]      exp2((ENC*mul)+offs)
63      [0:255]      exp2((ENC*mul)+offs)
----    ---          ---                            ----
uint 2^n range, mul, offs, exp2 (72dB)
64      [0:31]       exp2((ENC*mul)+offs)           ENC
65      [0:63]       exp2((ENC*mul)+offs)
66      [0:127]      exp2((ENC*mul)+offs)
67      [0:255]      exp2((ENC*mul)+offs)
----    ---          ---                            ----
uint 2^n range, mul, offs, exp2 (48dB)
68      [0:31]       exp2((ENC*mul)+offs)           ENC
69      [0:63]       exp2((ENC*mul)+offs)
6a      [0:127]      exp2((ENC*mul)+offs)
6b      [0:255]      exp2((ENC*mul)+offs)
----    ---          ---                            ----
uint 2^n range, mul, offs, exp2 (36dB)
6c      [0:31]       exp2((ENC*mul)+offs)            ENC
6d      [0:63]       exp2((ENC*mul)+offs)
6e      [0:127]      exp2((ENC*mul)+offs)
6f      [0:255]      exp2((ENC*mul)+offs)
----    ---          ---                            ----
uint 2^n range, full scale, sq
70      [0:31]       (ENC<<27)^2                     ENC
71      [0:63]       (ENC<<26)^2
72      [0:127]      (ENC<<25)^2
73      [0:255]      (ENC<<24)^2
----    ---          ---                             ----
uint 2^n range, full scale, sq, poly, freq disp
74      [0:31]       svf_poly((ENC<<27)^2)          ((ENC<<27)^2)*4186
75      [0:63]       svf_poly((ENC<<26)^2)          ((ENC<<26)^2)*4186
76      [0:127]      svf_poly((ENC<<25)^2)          ((ENC<<25)^2)*4186
77      [0:255]      svf_poly((ENC<<24)^2)          ((ENC<<24)^2)*4186
----    ---          ---                            ----
uint 2^n range, mul, offs, exp2, poly, freq disp (48dB)
78      [0:31]       svf_poly(exp2((ENC*mul)+offs)) exp2((ENC*mul)+offs)*4186
79      [0:63]       svf_poly(exp2((ENC*mul)+offs))
7a      [0:127]      svf_poly(exp2((ENC*mul)+offs))
7b      [0:255]      svf_poly(exp2((ENC*mul)+offs))
----    ---          ---                            ----
uint 2^n range, mul, offs, freq disp (48dB)
7c      [0:31]       (ENC*mul)+offs                 exp2(USE)*4186
7d      [0:63]       (ENC*mul)+offs
7e      [0:127]      (ENC*mul)+offs
7f      [0:255]      (ENC*mul)+offs
----    ---          ---                            ----
uns, mul, offs, freq disp (48dB) (for mod svf freq)
80      [0:192]      (ENC*mul)+offs                 exp2(USE)*4186

I put more options in there than I'm currently using, but that "orthogonality" can help when exploring various ways to scale and offset the parameters - "tuning" the parameters is often a quite time consuming task.  These new parameter types have considerably cleaned up the main real-time code.

The user never sees this undergirding / scaffolding stuff, but can be so critical to the success and quality of a project.

Hive memory use is now at ~80%, with the code / data utilization weirdly almost exactly 50/50.

[EDIT] Note that I almost completely shun decimal based ranges here (for better or for worse).

Posted: 11/7/2018 1:19:25 PM

From: Northern NJ, USA

Joined: 2/17/2012

500K Page Views!

Have a slice of Theremin cake!

Thanks for the interest everyone!  Happy Theremining!

[EDIT] Here's me noodling around with the inharmonic resonator only: [MP3] - there are no format filters engaged at all.  It can do almost passable male and female voices (though with some delay artifacts), as well as bells, gongs, and drums.  It's amazingly versatile.

Posted: 11/9/2018 9:34:14 PM

From: Northern NJ, USA

Joined: 2/17/2012


The parameter type encode has morphed a bit more, all of the signed and unsigned powers of 2 types are now grouped together rather than interleaved to facilitate decode.  I added an encoder reversed exponentiated group and am currently using it for the envelope generator.  This reverses the knob sense so that higher knob values give longer attack / decay times, something that was always getting me when I'd pick a blank preset slot (why isn't the volume side responding? Ah yes, attack is set to minimum).  Speaking of blank slots, I took this opportunity to zero out the preset storage area on the EEPROM, which goes from byte address 0x100 to 0x10000, and wish I'd done this long ago.  The EEPROM has built-in commands to erase pages, sectors, and the whole thing, but erasing sets all the bits, which maxes out all the parameters, leading to mayhem when selecting a blank user slot.  So I had to write a program that spit out a TTL script and ran that.  I also rearranged the SW parameter table to make it more consistent and to eliminate any "place holders" that I couldn't delete without throwing the following table entries out of sync.  Was careful to write down the various knob values for my favorites before clearing it.

Been going back and forth on how many articulated, or modulated, formants are really needed.  Minus the input parameter values retrieval and data store address setup cycles, a modulated formant takes 75 cycles , whereas a non-modulated formant only requires 19 cycles, so I could actually just barely fit 16 non-modulated formants in a single thread PCM cycle if I wanted to.  But some mix of them seems called for.  UI optimality pressures dictate 2 screens per 3 modulated formants, and one screen per 3 non-modulated formants, and this is if the 3 share a common Q control.  I like seeing 3 frequencies + 3 amplitudes + Q all at once on the screen as this helps when spacing them out from each other.  But 3 isn't a power of 2, which for some reason gives me brain freeze when contemplating the relative ratios.  I had 6 articulated formants in there, and I've now reduced this to 3, and added 9 non-articulated formants.  Not sure at this point if a total of 12 are really all that necessary with the inharmonic resonator there "filling in" the resonance top end, but it's something that I felt needed some test driving.

Posted: 11/11/2018 3:17:32 AM

From: Northern NJ, USA

Joined: 2/17/2012

Po' Boy Reverb

Coded up a switchable series connection for the inharmonic resonator so it can do crappy reverb: [MP3].  Not sure I'll keep this option, but it's certainly inexpensive.  Wish I had a bunch more memory handy.

The Secret o' Thereminin'

I often think about the original RCA marketing hype "anyone can play it!"  Of course it's not very true of the model they were selling, but I've been playing this thing for almost a year now and if they could have somehow managed to reduce the pitch sensitivity to ~3 octaves and given it a decent volume knee, then I think that claim could have been much truer.  Those two changes change everything, and bring it into the realm of the casual player (which I am certainly).  Add a responsive tuner and pitch correction and you're cooking with gas.

Double Quantization

Pitch correction as implemented on the D-Lev (wonder when using the new name will stop feeling weird?) is slow motion quantization.  The algorithm drags the output pitch, with variable rate time constant, to the exact center of whatever note the input pitch is closest to.  Speed up the time constant and you get stepped pitch, slow it down and you get something subjectively quite different feeling.  The pitch display is also quantized because each of the 12 LEDs corresponds to the exact center of each of the 12 notes in the chromatic scale.  Because PWM is used to proportionally light the transitions, if only one LED is currently lit you're bang on the note.  

Obviously, these two quantizations must (and do) track together, and they also must (and do) match the pitch standard of A440 (or some desired cent offset of it to play along with difficult to tune instruments e.g. piano).  So, what is one without the other?  I've found the pitch display to be quite useful on it's own (or ~equivalently with a very slow pitch correction rate).  But, lacking some kind of audible pitch reference such as accompaniment or a drone, pitch correction alone, particularly with a slow time constant, would probably just get in the way by fighting any player who doesn't have some sort of robust perfect pitch working full time in their heads.  

TLDR: pitch display alone = useful; pitch correction alone = not so useful.

[EDIT] I should also mention that the tuner input pickoff point - either pre or post pitch correction - is currently switchable, and I keep it on pre so it responds more quickly and shows me where my hand is rather than where the audio pitch is.  And the tuner has a separate settable brightness response curve (a non-linear modification to the linear PWM response) that IMO improves readability.

Posted: 11/11/2018 7:31:21 PM

From: Minnesota USA

Joined: 11/27/2015

I don't remember if we touched on the subject of pitch correction in the past, but I wanted to make some comments here since you brought it up.  I'm not aware of any subjects where you haven't done your homework, so please don't be offended if I'm trying to explain things that you already know. 

If I had your FPGA savvy I would probably be concentrating any extra hardware and time resources toward enhancing the pitch correction feature in the digital domain where it belongs rather than trying to incorporate a modest reverb, which is well suited as an outboard effect. I do have mixed feelings about using pitch correction with a theremin, but I think that having it effectively implemented in the core theremin design as you are doing could be a huge asset provided it has a sufficient array of adjustable parameters to make its effect virtually transparent.

Personally, I don't like the idea of using any pitch correction, certainly not for practicing, which is probably all I'll ever do.  It's more of a hindrance for practice anyway - a heavily quantized theremin that sucks the life out of pitch nuances is just a limited-voice tone generator with an extremely imprecise input interface.  You may as well be playing a keyboard with a volume loop.  But few of us will ever have the pitch control of Katica Illényi, and I do think anything that makes the theremin more musical and capable of playing nicely alongside other instruments (without having to explain to the listeners that the theremin sounds like it does because it is really difficult to play) could be an asset for those that do perform live under these circumstances.

After trying several different types of hardware and software for real-time pitch correction, I found that just about everything seemed to miss the mark for theremin use.  One piece of hardware that I tried, the TC Helicon Voicelive, came close to being useful. But one of the parameters had insufficient range to be useful for very slow music.  And since it was an external effect there were other problems as well with unstable pitch capture and limited pitch range.

It sounds from your description as if you have incorporated a pitch correction parameter that is similar to the ATTACK function used by TC Helicon with their Voicelive line of products (see below).  This has the effect of morphing (over a period of time) a spatially continuous linear (approximately) pitch field into one that has steps that provide "landings" or flat regions in the linear response that are centered at each of the scale notes. 

ATTACK is the setting that I found to have insufficient range on the Voicelive.  The delay time could not be set long enough for very slow transitions - the note would get audibly captured and corrected before it should.

I don't know if you have incorporated other features as well, but the WINDOW and AMOUNT settings in the description below are also very important, and I suspect that you have at least one of these.  WINDOW is a parameter that sets the capture range, in cents, and consequently also sets the spacial width of these steps as you move toward and away form the pitch antenna.  Typically there can be transition regions between notes where you are immune from any correction, but once you get within the window range, you are subject to correction set by the AMOUNT parameter. 

AMOUNT has the effect of changing the slope of these steps, so that once you enter the pitch correction capture range (as determined by the WINDOW parameter and the delay induced by the ATTACK setting), you will be corrected, but proportionally based on your error.

Can you elaborate on what pitch corrections parameters you have, or could you point to a previous discussion of it so you don't have to answer the question again? 

Excerpted from the Voicelive manual:

EDIT 1 knob: WINDOW (cents).
When VoiceLive tries to determine which target note you are closest
to, it uses this parameter. For example, if the set of correction notes includes
“C, D, E, F, G, A, B” (C-major), and you are singing a very sharp D (80 cents
sharp), the window dictates whether you should be corrected to D, or not at all. If
the window was set to 80 or more cents, the D# would be corrected to the D
because it falls within the window. If the window was less than 80 cents, no correction
would take place. Your input pitch must fall within the window around one of
the supplied correction notes if it is to be corrected at all. This allows you to naturally
inflect your vocals and slide between notes while cleaning up the pitches as
you get fairly close to them. A setting of 100 cents or larger will cause correction to
be on continuously when using the scale C-Major, as 200 cents is the largest interval
between any two notes.
EDIT 2 knob: ATTACK.
Once the target correction pitch has been identified by VoiceLive, it begins
to shift the pitch of your vocal at a rate determined by this parameter. A setting of
99 gives the fastest setting which instantaneously pulls your vocal in-tune, an effect
that can be useful for some types of music. Settings between 16 and 40 give the
most natural results.
EDIT 3 knob: AMOUNT.
Scales the amount of automatic correction applied to the input voice. The
range is 0% to 100%. However, 0% does not mean that the correction is turned off.
The amount of applied correction depends on how far out of tune the input note is.
This allows for a very musical way of correcting pitch. It corrects the large pitch
errors while preserving the natural micro variations around the target pitch. For
With the amount set to 100%, a 10 cent flat input will be corrected by 10 cents and
a 50 cent flat input will be corrected by 50 cents.
With the amount set to 80%, a 10 cent flat input will be corrected by approximately
5 cents and a 50 cent flat input will be corrected by approximately 40 cents.
With the amount set to 0%, a 10 cent flat input will not be corrected and a 50 cent
flat input will be corrected by approximately 10 cents.

Posted: 11/11/2018 11:14:50 PM

From: Northern NJ, USA

Joined: 2/17/2012

Hi Roger,

Here's the pitch correction data path, which ended up boiled down to almost nothing with one parameter:

Linear pitch is formatted as an unsigned 32 bit fixed point 5.27 value.  It is modulo multiplied by 348 to get the note fraction, and we can consider the result to be signed.  It's divided by 2 for a bit (literally!) of headroom and fed to a variable cutoff 4th order critically damped lowpass filter.  The result is multiplied by 2 to restore the headroom reduction, and also by (2^27)/12 to scale to note stepping, with the result subtracted from the input. So the lower path forms an error signal which is subtracted from the main signal in a feed forward way.

Not shown here is a bypass if the filter frequency is set to 0, and hard limiting at the final subtraction.  The graphs show a hand approaching the pitch antenna smoothly as input, the note fractions before and after filtering, and the combined result.

It used to have an amplitude adjustment at the output of the low pass filter to vary the quantization, but I didn't find it to be useful.  I tried slew limiting instead of filtering, also 1st and 2nd order filtering, but 4th order seems better at separating vibrato from slower note change hand movements.  I thought slew limiting was called for in the linear domain, but I believe filtering provides more of a constant time to error correct, no matter the size of the error itself.

Other features could be added to this.  I suppose I'm against anything other than chromatic note spacing as that requires note tables and keys and other stuff. I mean, it's kind of fun sweeping a scale out with your hand on the Theremini, but it seems kind of gimmicky to me - if I could easily set my guitar up to play a single scale I don't think I would.  Anyway, I'd be very interested in your take on it, particularly since you have experience with various external approaches.  I did a lot of web searching for how exactly to pitch correct but very little seems to be out there.  Being internal and having access to the exact instantaneous pitch number is probably a huge advantage to performance, as I imagine pitch estimation takes a significant fraction of a second (I assume they're doing auto-correlation to find it).

It seems to work OK, though vibrato throws it off some, as you'll see.  I can really crank it up for vocals without hearing it, but for some reason strings can't take a lot without hearing the pulling. You can turn it down so slow you can't tell it's doing anything, or turn it up so fast it just quantizes.  If you record multiple voices in unison with it turned up it pulls them too perfectly together and you get beating.

Posted: 11/12/2018 1:02:34 PM

From: Northern NJ, USA

Joined: 2/17/2012

Pitch Correction Brain Dump

Another observation re. non-chromatic scales: the tuner has made me much more aware of accidentals (as breaks from the major scale pattern), and I've noticed that the tunes I find the most interesting to play tend to have them.  I can't see myself ever using a feature that prevents me from playing them (except for maybe as a "gee whiz!" demo for noobs at NAMM).  And having the pitch pulled to equally spaced intervals is one thing, having it yanked around over uneven intervals is another.

Also, I know I tend to kvetch about parameters, their inclusion, their functional scaling, etc. and I suppose that's mainly because it's such a critical yet time consuming activity.  Reverse the sense, use squaring or other small polynomial instead of exp2, shift it a bit less or more, make the MSb = 1 so it only covers 1/2 the range, combine it with another that does something similar or that you find yourself adjusting along with it, figure out how to minimize interactions with another paramater, etc.  Play with it for several minutes, hours, or days and decide it's not quite right, repeat...  Developing the basic DSP functions themselves takes less time than the parameters feeding them.  I don't bring this up to crab anew, but to wonder how much time gets put into fine tuning any user parameters on anything one might encounter.  Tinkerers like the presence & appearance of lots of knobs, but when the whole useful range of adjustment can be boiled down to a small handful of parameters, then you've hit the jackpot and you're saving everyone downstream a lot of time and aggravation.  E.g. reverb: I want gorgeous sounding spaces tailored by two parameters, room size and reverb amount.  The other parameters are usually too subtle for me to hear much difference, so I want someone with "golden ears" to wrap it all up and give it to me as a present.  More knobs = bad if they're insufficiently curated.

But none of the above is me saying I've closed my mind at this point to useful changes in the pitch correction algorithm, quite the contrary.

Things to ponder: 
1. Is there a way to have it somehow use an input range of more than one note to center on the target?  This would relieve vibrato interference.  I don't believe there is but I could be wrong.
2. Separating vibrato from note changes via LPF cutoff frequency is inexact but is the best method I've found (general lack of literature).  With a 4th order LPF even hard quantized notes can be influenced a little by vibrato hand movements.
3. Note that with the current pitch corrector, if you're playing a note at say -10 cents hand position and the corrector has made this 0, then you quickly move to some other note at its -10 cents hand position, this will result in the corrector doing nothing (because it doesn't need to), as the slowly changing value in the filter is the same as that required previously.
4. Pitch correction design, as with anything containing feedback / feedforward, requires a bit of controls theory / engineering, but these things are often tossed over the wall at software types who often lack that.  So even commercial offerings are somewhat suspect.
5. One way around the "too perfect" pitch when recording multiple voices in unison would be to add a small amount of lowpass filtered noise to the pitch number (jitter/wander).  Vocals might benefit slightly in terms of realism from this as well.

Posted: 11/12/2018 4:26:10 PM

From: Minnesota USA

Joined: 11/27/2015

I dug up some old notes from a couple of years ago when I was playing with the TC Helicon Voicelive pitch correction.  I think these notes are consistent with my description above.  This is my interpretation based on the manual's description and my observations of its behavior when connected to a theremin.

Things to keep in mind: 

1)  The morphing from the left graph to the right graph below occurs after (or prolonged by) a time delay (ATTACK) set by the user, and only begins when dP(itch)/dt is near zero.  I can't recall if the morphing onset occurs after the ATTACK delay or if the morphing is just stretched out over a longer period.

2)  The ATTACK setting is very important, and should be infinitely variable, and probably not a delay determined by nth order filtering.  It is the parameter that permits slow note transitions and free vibrato without any audible pull-in.  The downside of this is that you need to be able to settle close to the correct pitches (through skill) and hold it for the steps for landings in the right graph to appear. 

3) The AMOUNT setting is important as well.  With 100% correction, you get no feedback as to where you are within the correction window.  You need to hear some percentage of your positional/pitch error so that you can stay centered. You (and the audience) just don't need to hear all of your error.

4)  If you are playing close to correct pitch and hold it, the landings in the pitch curve appear, reduce your positional sensitivity, and make your job of sustaining much easier.  With any sudden dP/dt (vibrato or transition to next note), the landings disappear and you have no pitch correction or grabbing until you settle again.

5)  The bottom line is that having access to all of the parameter settings shown here (and in note 5 below) you could get you to what you might call a pro-level pitch correction feature. It could be set to have no- to minimal- effect on the nuances that are characteristic of the theremin, but the requirement that you still must be a skilled player remains.  Of course having these settings also allows you to have any degree of pitch correction up to 100%.

In my opinion this would be close to the ideal type of pitch correction for real-time performance (short of some adaptive AI process).  The Voicelive unit showed promise to be something that could be "turned down" to have nearly zero interference with pitch subtleties, providing assistance only to help sweeten the blending of sustained notes when referenced against accompaniment.  It just couldn't be turned down enough, primarily on the ATTACK delay.
Old notes from 2016:

Posted: 11/12/2018 6:01:31 PM

From: 60 Miles North of San Diego, CA

Joined: 10/1/2014

It's the page roll over so let me say, not only has dew fallen into Dante's Inferno... now the devil has stepped forward.

You must be logged in to post a reply. Please log in or register for a new account.