Teletype CV calibration?

I have recently noticed that the CV outputs are quite out of tune. CV3 is fine but the other 3 are off by differing amounts. CV 2 is not in tune for even one octave whereas CV 1 starts to drift around the third octave. I tried using CV.OFF to tune each output and it works to some degree but on the channels that are really bad the CV.OFF value only works for an octave or so then it is flat again and it needs a larger CV.OFF value. For example, CV 2 needed CV.OFF 30 for the first octave and CV.OFF 100 for the third. I saw a thread that mentioned this a while back but no mention of a fix that I saw. So, any help getting this sorted would be awesome!

1 Like

Bumping this, not too big a deal but it’d be nice to know if this is possible.

bumping this also, seems a bit ridiculous having to put a quantiser after CV outputs in order to get correct note voltages…

made a git issue for it.

I found that my teletype with one txo expander is way off in pitch. I calibrated the txo according to instructions in the manual, but it seems the same method doesn’t work on the “build-in” CV outs on the teletype. Please tell me it’s possible to calibrate the build.in CVs as well, and how :expressionless:

I have found myself calibrating alot of voltage sources in the past and an additional “scew” parameter (or measuring two voltages) would be even better than a simple offset, since often a CV out is not the same amount of flat/sharp in all octaves…

This is the procedure I followed for the internal CV:

Blockquote
To calibrate your TXo outputs, follow these steps. Before you start, let your expander warm up for a few minutes. It won’t take long - but you want to make sure that it is calibrated at a more representative temperature.
Then, first adjust your offset (CV.OFF) until the output is at zero volts (0). For example:
CV.OFF 1 8
Once that output measures at zero volts, you want to lock it in as the calibration by calling the following
operator:
CV.CALIB 1
You will find that the offset is now zero, but the output is at the value that you targeted during your prior adjustment. To reset to normal (and forget this calibration offset), use the TO.CV.RESET command.

Seems the issue is closed on github. Does this mean it will be in a coming release of the firmware?

The issue looks open when I view it.

i’ll be working on this issue shortly, along with a calibration method for ansible. thanks for bringing this issue back up— best to prioritize according to requests

5 Likes

That’ll be amazing! Hope it makes it into a firmware soon-ish! I’m like 30 cents flat on one output :confused:

EDIT: And if possible, note that a simple offset might not be enough, scaling might also be needed. Two point calibration as is very common in digital eurorack modules seems like a good compromise between something the user can easily perform and is relatively straightforward to implement.

After a long hiatus I decided to pick up Teletype again, but found that the CV output values are quite off, sometimes up to almost a semitone. Here are some measurements I did:
image

@tehn, @csboling: Is there a way to correct/scale each of TT’s CV outputs individually? From looking at the measurements it seems an offset will not fix it. Happy to do testing for it! Thanks much in advance.

1 Like

Yea my teletype seems to be badly in need of calibration:

CV 1 (at successive 1v intervals):
1.027
2.045
3.061
4.078
5.096
6.112
7.129
8.145
9.163
10.177

Oof it’s off by more than a semitone once you get to 5v :frowning:

CV 2 is just as bad and CV 3 and CV 4 are less so, but still not great.

Is there any way to fix this?

Just got my Teletype, and am seeing similar results-- more than a semitone off right out of the box.

[Edit] Wait a minute, jury’s still out on this one-- was feeding it into a Pico Voice and it looks like that isn’t exactly a reliable test… Need to take some measurements…

Ok, things are fine. I found a reliable source-- voltmeter on my Beat Step pro shows that it’s right on to 3 significant digits from 0.00 to 6.00 (which is its entire range).

I then found that the first octave, from 0-1V on the Pico Voice is out of whack. And regardless of where the frequency knob is set. After that though, it’s pretty close. I have several other oscillators but the Pico Voice looks like I can use it to check accuracy above 1V.

And the Teletype seems pretty good. Voltmeter shows spot on until 5.01V and 6.01V Also, the different CVs seem to be tracking alike, so I’m not seeing any significant variation between them.

So for me, it looks like everythings good…

Is there any way of calibrating the CV output as yet?

I’m looking at the code, and it looks like it’s probably a no as the V and VV lookup tables appear to be very static.

I notice the CV.OFF op and the cv_off state kicking around, but can’t seem to see where it’s actually used.

The thing that makes this feature somewhat complex to implement is that as you’ve found there are a few different pitch tables that would need to be updated by a calibration procedure. The V, VV, and N ops (possibly others?) use lookup tables like this – in the case of N, the table_n table is #define'd to the ET table – the default table for equal temperament tuning on a 14 bit 0-10V DAC.

I think this would need

  • this data to be stored in the module’s flash storage (along with the existing presets like saved scenes that are preserved on power-off).
  • an op or set of ops enabling a procedure for users to program their desired lookup table by comparing module outputs to an external reference voltage or a voltmeter. Note that deviation may involve both a constant offset as well as a scale factor, or it could even be made possible to reprogram each cell of the lookup table individually to let the user program every volt / centivolt / semitone / hz value. Probably you only want to make the user do the calibration one time and then derive the other tables from that set of measurements, if this can be done without too much loss in accuracy. Flash space is always at a premium, so it might be nice to derive all the tables at startup, if this doesn’t take too long. Ansible’s code for calculating linear fits between pairs of int16_t values is here.
  • perhaps a way to restore defaults without reflashing the module.
  • another problem: currently Teletype’s saving and loading presets in flash memory to USB storage is all-or-nothing. You insert a USB disk, all scenes and pattern data are saved or loaded. This poses some difficulty for storing calibration data because all of flash memory is erased when the module firmware is updated. If this data is lost, the user will need to re-calibrate outputs after any time the firmware is reflashed. If this data is saved and then automatically reloaded from USB disks, it could wipe out / miscalibrate the tuning on a second Teletype module when a USB is inserted to copy scenes. Possibly this latter situation is a niche enough use case that it is not a big deal. It might be solvable by, for instance, storing the calibration tables in a separate file on the disk, and prompting the user to confirm (without keyboard) whether or not they want to load the tuning from disk.

This is assigned to aout[i].off here, which is then used to adjust the DAC output here.

3 Likes

It does look like a non-trivial job to code up a calibration process for teletype, but I also think it would be a fantastic contribution if there was anyone able to take it on! Teletype is the heart of a lot of people’s CV setup and for some people it would be a wonderful place to explore micro tuning and alternative scales, but given the inevitable variation in hardware, I think this really calls for the possibility of having a calibration process. The fact that TT is a platform with an interactive prompt and flash memory really makes this feel (to the user at least) like an obvious gap in its capabilities.

Is some huge calibration data set really needed? I suspect the output is close enough to linear that a 3-point calibration would hypothetically suffice.

Honestly the biggest issues are the low CV resolution (12 bits, about 3 cents) and the lack of hardware trimming procedure. I think the best case outcome is that your Teletype knows its offsets after calibration and maps CV appropriately, despite the possible inaccessible ends of the range.

Is anyone’s calibration much worse than 3 cents in the middle of the range now?

:thinking:I might have a mess around on the weekend with hacking it in for each output on mine directly in the source (eg. hardcoded) to see how that may look. I’ll refresh my memory by looking at the way it’s transformed in Marbles and writing some tests or something to get my head around how it should work.

Folks above were suggesting that it was off by a semitone or more.

EDIT 1:

I was taking a look back at the calibration steps for Marbles by @forestcaver, and the basic approach is measure to 1v & 3v on each output with a good DMM, then plug it into the spreadsheet to get scale & offset values. The basic formula is along the lines of: (pseudo-code)

# from the V lookup table in src/table.c
dac_code_1v = 1638
dac_code_3v = 4915
# measure voltage with a good DMM
measurement_1v = 1.002f
measurement_3v = 3.001f

scale = (dac_code_3v - dac_code_1v) / (measurement_3v - measurement_1v)
offset = dac_code_1v - (measurement_1v * scale)

The offset value can then be added to the input value in tele_cv. I don’t think the scale is needed in that function as the input to that function is already the DAC value as compared to marbles which uses a float value of Voltage. That said, you could probably get it to track a bit better across the range by applying some scaling factor per-input, but I’ll need to have a think on how that would work whilst keeping the lookup tables the same.

EDIT 2:

So I had a crack at hardcoding in calibration and flashing it to my unit, and it does seem to track voltage a bit more closely now, or at least as close as you can on a 12 bit DAC.

I basically lifted the marbles approach from @forestcaver and made a little spreadsheet to calculate the scaling + offset from two points.

And did a very “tactical” hack in of the code. Did the trick!

4 Likes

How would one use this to calibrate their Teletype?

That branch was more of a proof of concept than anything polished at all.

Basically you use a digital multimeter to figure out the DAC codes for 1V and 3V (the V lookup table should be pretty close), plug it into the spreadsheet to get the scale and offset values, then put that in the hardcoded spot in the code, flash the module with that firmware and then you’re in tune.

Not great UX, but I am enjoying my Teletype being in better tune!

Just adding another request here (is this the best place to do this?) for CV output calibration - my TT has some noticeable note change across the 4 outputs with the same CV assigned.

EDIT: seems like I have both offset and scaling issues that differ for each output. Ex: one output is about 2.975 volts for CV x V 3 which is quite a bit more than 3 cents I believe. FWIW I have both Ansible and Crow and both of those have good scaling (Crow is quite precise).