Would cv control of the Elements' input attenuverter be possible?


I just recently got the Elements and Korg’s SQ-1. I’ve gotten good results by patching the SQ-1’s A sequence’s v/oct > Elements’ v/oct and the B sequence’s v/oct> Elements’ FM input. I’ve been able to dial in various chordal arpeggios by sweeping and finding “sweet spots” with the Element’s FM input attenuverter. It’s kind of like playing slide guitar in an open tuning (but being able to target specific strings instead of barring over the entire fret)…very cool!

I’d love to be able to automate between two of these “sweet spots” I’ve found with the FM input attenuverter…which one of the cv input attenuverters that allow control of most of the other knobs on the module would be perfect for in my head.

My tl;dr ask is: Would it be possible to dive into the source code and figure out a way to “wire” the cv attenuverter of one of the parameters I don’t often use (say, blow timbre) to the FM input attenuator instead? Would be awesome to know if this is an exercise in futility (ie: the attenuator is a fixed analog circuit with the parameter it is controlling) or not before I start down the daunting path of trying to grok what the module is doing under the hood.

Yes. Everything is done in software.

  • To remove the existing binding between a synthesis parameter and a CV input / attenuverter / pot combo, remove the corresponding BIND( ) line in cv_scaler.cc
  • You’ll then have to update the synthesis parameter with the value of the panel pot (Basically - manually expand BIND and remove anything reading the CV or attenuverter).
  • You can read a cv value with cv_.float_value(CV_ADC_XXXX);
  • You can read an attenuverter value with pot_lp_[POT_XXXX_ATTENUVERTER];

awesome, thank you! that’s easy enough to follow. Will try out and (hopefully) report back with a working commit :slight_smile:

I’d be interested in this if you care to post the amended code. Cheers.

Does this mean that, let’s say, the level controls for the individual exciters could potentially be put under CV control as well utilizing some of the pre-existing cv inputs/attenuators? Or is there any reason why they couldn’t/shouldn’t?

> Does this mean that, let’s say, the level controls for the individual exciters could potentially be put under CV control as well utilizing some of the pre-existing cv inputs/attenuators?


That’s great news. Might have to reach out to one of the resident firmware manipulators about this.

Thanks, Olivier.

Very enlightening discussion! I hadn’t thought about or examined the Elements design because I don’t have one, but now I am much more interested in, um, acquiring one.

I’ve got a pull request open to my fork that’s making the change using the steps you described (thanks so much for that) It’s here.

I had two questions that I was curious about based on making the change (they’re also included as comments in the PR if you want to see it in context of the code, but felt like they might be more helpful for other people interested in hacking Elements if posted here)

1. you didn’t mention utilizing the calibration cv offset, but since every other use of cv includes it, I decided to use it as well.

I followed calibration_settings_.offset until the main function’s ui.DoEvents() call. It seems that Element’s takes in the calibration CVs every time the “switch” is pressed (which I assume is the button you press which starts the excitation.) I’m not really understanding what that is doing in the context of the subtraction of the read cv value.

2. I did not include any sort of scale coefficient like your BIND macro did…I’m assuming I could do this to change the CV’s effect amount on the FM input attenuation, but I believe it’s probably okay that I didn’t? I’m curious if there’s a way to know how much you’d want to scale…mathematically figuring it out or some sort of running of tests?

1. Yes, you need to remove the calibrated offset from cv_.float_value(CV_ADC_XXXX)

2. Since your value will ultimately be fed in the expression computing the modulation variable, the scaling will happen there, and the low-pass filtering is done just a line below.

restlessboyREVIVER, I can confirm that the code here works for letting you control a parameter of the synth using a different parameter’s cv input (blow meta cv -> fm input attenuverter in this case). I was able to compile the code and update my element’s using the wav firmware upgrade method successfully.

Note: I need to fix the constrain to allow for the FM input attenuverter to do negative modulation again (the knob only changes the sound from 12 o’clock on). I’ll be looking at that sometime in the near future…but if anyone wants to contribute, I’ll happily accept PRs. Here’s the issue in github