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

Posted: 7/2/2022 7:49:11 PM

From: Northern NJ, USA

Joined: 2/17/2012

Very interesting suggestions Vincent!

MIDI:bend[1 to 127]
No change with current design. Send all MIDI pitch bend messages according to PB range. 

Send Picth bend message = 8192 (center) along with note ON and then no other pitch bend message (quantized pitch stable)

I looked at the code and believe this is a fairly trivial edit.  I think it would be more consistent with the expected behavior of bend[0] too.

MIDI:bend[-1 to -127]

Send initial Pich Bend message corresponding to pitch bend range and then no other message (exact played pitch stable).

This would be much more involved, as the bend knob is actually an inverse, so it would require monkeying with the type system.  I guess it's like the old bend[0] but able to match whatever the synth bend range is currently set to rather than a fixed +/-2 note range.  Do you think it has much value?

Posted: 7/3/2022 6:13:13 PM

From: Occitanie

Joined: 3/4/2012

"MIDI:bend[-1 to -127]  [...] Do you think it has much value?"

I think I'll never use this case personnally. Not so much value, I think.
If I have a fixed picth that I can't correct, I want it in the scale most of the time.

Posted: 7/4/2022 1:50:51 AM

From: Northern NJ, USA

Joined: 2/17/2012

Thank you for the excellent suggestions and feedback Vincent!  The new bend[0] behavior was an easy edit, and seems more consistent.  While I was under the hood I noticed that the MIDI pitch was following the oscillator oct[-7:7] knob, so I switched this to the bank[-3:3] knob, which works better for transposition.

Posted: 7/7/2022 10:07:06 PM

From: Northern NJ, USA

Joined: 2/17/2012

Into Dust

I was inspired by Marla Goodman to do a bit of Mazzy Star type accompaniment on my classical guitar, and noodle along with the Trixie D-Lev preset:


Posted: 7/11/2022 10:29:50 AM

From: Northern NJ, USA

Joined: 2/17/2012

D-Lev Volume Field Shaping Video

A discussion of the volume field non-linear shaping controls.

You want fields that are sized, located, and shaped in order to minimize hand / arm motion, but that aren't so sensitive that they're difficult to control. The D-Lev can be configured to play like just about any Theremin, but I feel that most analog Theremins have overly tight pitch fields, and volume fields that are too loose.


Posted: 7/14/2022 10:16:34 AM

From: Northern NJ, USA

Joined: 2/17/2012

Chain Chain Chain

So it's not just me:


Misery loves company I guess.

Posted: 7/18/2022 2:36:51 PM

From: Northern NJ, USA

Joined: 2/17/2012

Artificial Sweetener

I thought it might be fun to have a sort of contest (FOR ENTERTAINMENT PURPOSES ONLY) to see how folks perceive D-Lev pitch correction, so I recorded the basso_reso #24 preset (tweaked to be up out of the bass range) both without pitch correction, and with fairly aggressive pitch correction.


The actual order is pitch corrected, followed by no pitch correction.  Of those that responded to the survey on Facebook: 5 folks guessed the order wrong, 1 guessed right, and 2 couldn't tell.  I didn't consciously try to fool or push folks into picking the wrong order, though I did list them in opposite order in the description, which could have subconsciously influenced perceptions. The final few note transitions were a bit faster in the non-pitch corrected version, which could have led to the belief that pitch correction was doing the fast pulling, when in fact it was just me playing them a bit more steppy (though I didn't do that on purpose).  This wasn't a scientific test by any means, but the results are interesting nonetheless.

I set the correction rate and center modulation so that small step gliss didn't overly reveal it, and the bi-modal filter is there to pave over correction associated with larger step gliss. Strength was set to 75% so that 25% pitch variation was allowed through. Vibrato wasn't significantly negatively impacted by these fairly aggressive settings.

This exercise made me take a harder look at pitch correction.  It can be a little more dangerous to play with aggressive correction though, and it can be configured to correct more quickly when the volume is very low, so if you're off the note you've just started to play it may be be way off, and it can take a bit to "drag" it to the note you meant to play.  Anyway, I've modified the algorithm a bit so that the correction rate modulation dictated by the volume hand level isn't a hard nominal/max switch, but more of a gradual vmod type thing.  A signed knob allows faster or slower pitch correction during silence, and the modulation strength sets the modulation transition zone via saturation.  I don't relish making controls behave more vaguely, particularly on top of an already vague process, but it seemed to be the right thing to do.

I think the main thing that makes the two samples fairly indistinguishable is the fact that I play by watching the tuner like a hawk, so visual-based pitch correction is always happening.  It's my very strong belief that the eye is quicker than the ear here, so I think of pitch correction as more of a sugar coating on my playing style, as opposed to integral to it.

Posted: 7/21/2022 1:03:33 PM

From: Northern NJ, USA

Joined: 2/17/2012

Foul Language

So I'm attempting to try out a few of the more modern languages to re-write the librarian in.  The C++ libraries are a minefield of exception throwing, and cross compilation is a nightmare.

My needs:
1. Simple to run anywhere by non-technical folks.
2. Simple to cross compile to other targets (without virtual machines / other OS's installed).
3. Access to single character keyboard activity.
4. Simple serial port listing, reading, and writing.
5. Simple file system access.
6. Solid basic library support.

My wants:
1. Easy GUI design built-in.

Things I shy away from:
1. Virtual machines / interpreters running on the target.
2. OOP (Object Oriented Programming).
3. Pointers.
4. Manual memory management.
5. Weak / implicit typing.
6. Exception throwing / panic crashing.
7. Functional programming (lambdas, etc.).
8. Arrow type syntax.

Python can be compiled and has incredible ecosystem and low-level support, but the GUI elements of the interpreter aren't installed by default on all machines, and noobs might have trouble running scripts.

Java is everywhere and has C/C++ syntax.  It's very mature but also very old and creaky, and has the trappings of things that were in vogue at the time of its birth, like everything is an object, compiling to a virtual machine, blea.

Rust looked really promising, but I think it tries too hard to be a kitchen sink of current programming paradigms, which makes for a complex syntax.  Cross compilation seems buggy / problematic.  Memory management is very nitpicky / micro managing due to the lack of a garbage collector.

Go is very C/C++ like with all the OOP junk removed but retaining pointers, unfortunately.  The compiler seems quite snappy.  But cross compilation of some code has C compiler dependencies.  Functions can be in any order (like god intended).  Too many library functions seem to do the same thing, making it difficult to pick which one to use.

With Rust and Go the compilers seem highly integrated into the package system, to the point where they can fetch code from the web, which makes me feel like some essential control is lost to convenience.

Pointers can be avoided to some degree in any language, but if they're there they'll get used in the standard library, then you'll end up having to use them too.

In the past it seemed most of the cross compile issues were between Win & Linux, but OSX seems to be more of the fly in the ointment lately.

I was never more aware of how much console programming relies on implementation specifics of the console running the app, and there are billions of consoles out there.  And doing anything in the console is a noob stumbling block.

The more paradigms that get accommodated / stuffed into a language, the more cryptic the syntax gets.  I'd rather not spend my time deciphering what the heck the code is actually doing.  KISS, languages exist to solve problems, not to cause them.

Posted: 7/22/2022 6:01:29 AM

From: Portland, Oregon

Joined: 2/22/2018

Have you thought about the possibility of having a simple web server (maybe using node.js or the like) to make api calls to the theremin and build the UI with HTML/JavaScript? It would be very portable that way.

Posted: 7/22/2022 9:31:26 PM

From: Northern NJ, USA

Joined: 2/17/2012

"Have you thought about the possibility of having a simple web server (maybe using node.js or the like) to make api calls to the theremin and build the UI with HTML/JavaScript? It would be very portable that way."  - bendra

Thanks!  This is uncharted territory for me.  node.js seems to require the V8 JIT compiler - is that assumed to be installed on every platform?

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