1.6.1 is the previous/existing release. It does not contain the changes described in this thread, which is for prerelease betas. To try those you want the ansible.hex file uploaded as an attachment to the first post in this thread – it sounds like maybe you’re working with the 1.6.1 zip file from the Github releases page? I’ve only uploaded hex files so far. update-firmware.command should probably also be included but currently is not – once you have ansible.hex the commands you want are:
dfu-programmer at32uc3b0512 erase
dfu-programmer at32uc3b0512 flash ansible.hex --suppress-bootloader-mem
dfu-programmer at32uc3b0512 start
which is the same as what’s in update-firmware.command. (Or it should be – I think older update-firmware files might contain at32uc3b0256, which might work fine or might give an error now that the code uses more memory.)
The default firmware assumes 16-step varibrightness, and the only way to change this is from the JSON file, so this change will need to be made in order to be saved into Ansible’s flash. After that, this setting can be treated like part of your presets: insert a USB disk and do the disk save procedure before you flash a new firmware, then load your presets off the disk after updating. This sounds annoying / easy to forget, I’ll find a spot to add this setting to the grid interface somewhere.
From earlier in the thread it sounds like you are already on a beta firmware, so you don’t need to run the Python script to create an ansible-preset.json file unless you just want to – you can just do the USB disk save procedure, then edit the file on the USB disk with your computer, then load the preset back up on Ansible. In fact if you are working with an ansible.hex backed up from any of the betas I’ve posted, rather than from the official 1.6.1 release, this could be why the Python script is encountering an error (most typically this manifests as something along the lines of “expected bool but value 5 was found” or something, but other errors are possible).
I have posted a new build (afb85ec) which contains a prototype grid interface for arbitrary reassignment of Ansible’s tuning table. This is not very polished but I wanted to post it to get some feedback, especially because it sounded like @tehn was about to start working on this. So first some caveats/questions/observations:
- I apologize that I have not tested this with 4 brightness levels. I agree that having to re-initialize the varibrightness setting via the JSON file is pretty annoying, I think the next thing I’m going to do is make this programmable somewhere on the grid interface. This should have the side effect of making it much easier to check out different varibrightnesses while developing a UI.
- If you calibrate your CV outputs, since
KR.CV reads the current DAC value, you will read different KR.CV values from Teletype for two different outputs even though the voltages they output are equal. This suggests maybe a need for a KR.N op to get the calculated pitch in “semitones” that Kria is using, (i.e. octave + octave shift + scale note + scale note shift + alt note… am I missing any offsets?), so that you can differentiate the programmed pitch from the actual output voltage. Note that such an op would not be able to read the exact pitch value while an Ansible CV is slewing.
- How should interpolation between octaves work? Should we fit a line to ensure that the entire output range is mapped linearly, or is it useful to be able to correct for nonlinearities? The fit I’m using is just a dumb piecewise linear interpolation between octaves. This has the downside of being nonlinear, so it’s possible to have weird pitch tracking behavior depending on how you program the octaves. It has the upside of being nonlinear! This lets you do some fun stuff like have a tuning table which gets lower in pitch in the middle and higher at either end, or use one or more tracks of Kria as a really flexible if mind-bending CV sequencer, or whatever. Possibly multiple interpolation methods are needed? It seems like maybe this interface could be made to even support arbitrary interpolation waypoints, where octaves would be the default, using a long-press or something.
- Completely by accident, if you have a Kria sequence running when you switch to tuning mode, Kria is still running, and you can re-tune a running track on the fly, or play the tuning interface to accompany your sequence microtonally. Frickin’ rad. You can quick mute some tracks if you want to tune them without the sequence running. You can also switch back to Kria or to other apps to experiment with the tuning you have programmed, but tuning tables are not saved until you explicitly save them, so if you like what you’ve got make sure you go back to the tuning page to long-press the save button before powering off.
- This is maybe kind of a complicated interface! There’s a lot of data it’s possible to manipulate. I’ve attempted to keep it so that routine tasks are fairly accessible but in-depth tweaking is still available. I’m planning to follow up with a step-by-step guide for calibrating Ansible using this UI. I think it may also be possible to devise a Teletype scene that partially or completely automates this procedure using the
ANS.G ops…
Which brings us to the (other) fun part:
Tuning interface
Enter Kria. Hold Key 2 (config). The Scale page key from Kria remains highlighted with Key 2 held. Press it to enter tuning mode. You can let go of Key 2 now to exit tuning mode, and tap Key 2 again at any time to go back to Kria.
The top four rows, as in Kria’s trigger page, correspond to tracks, with only the center 12 keys highlighted to represent the 12 steps in the tuning table between two “octaves”. All tracks and therefore all triggers are on by default. The playing note in each track is highlighted, and the currently tuning row is highlighted slightly brighter than the other rows. By default all notes being tuned are the same (Ansible’s lowest note slot, 0V by default). You can change which note slot is selected and playing from each track by touching the corresponding key in the top 4 rows. If you touch a different track than the currently tuning track, that track becomes selected for tuning. If you touch the active note in the track that is currently tuning, the corresponding trigger output goes low, so you can mute one or more voices if you are tuning by ear and patching the trigger outputs to your VCAs. Note that a note slot may be currently selected for tuning even though the corresponding trigger output is off – probably this should still be highlighted somehow but currently is not.
The bottom row provides keys for increasing (keys on the right) or decreasing (keys on the left) the value that will be sent to the DAC to play the currently selected note slot. From the center out these are +/- 1, 2, 4, 8, … +/- 128 on the outermost keys. Some of these should probably be un-highlighted when you can’t step that far because you’d hit the minimum/maximum DAC value.
The row above the bottom row is a quick reference for the DAC value the currently selected note slot is set to. As the DAC value increases, the leftmost key will get brighter, then it will turn off and the next key over will get brighter, etc, mapping the full CV range over 16*varibrightness steps. You can touch a key on this row to jump to a DAC value, note that this will result in the key to the left of the key you pressed at maximum brightness, because otherwise all the LEDs in this row would be off and it might be tough to see where you’d switched to.
The left side of the row above this selects which “octave” you have selected, just meaning a group of 12 note slots.
The right side of this row (third from the bottom) is for load/save functionality.
- The key to the left which is separate from the other two is the panic key – press it to restore your saved tuning table from flash, long-press it to go back to the factory default equal temperament tuning table. This long press does not save anything, so you can quick press the key again to go back to the tuning table you have saved, if that’s different from the factory default.
- The first key on the right is for interpolating the tuning table between octave values. Quick press it to do a piecewise-linear fit between the values programmed for each octave. Long press it to fit between octaves and then save.
- The key furthest to the right can be long-pressed to save all note slots with their tunings exactly as currently programmed.