Hi, Timo again filling up the Dev Diary!
So, 1.6 took a lot longer than we’d hoped. The main reason for this is that while it’s easy enough to do a sequencer, it turns out that if you want the sequencer to be any good, then the details will be filled with all kinds of devils.
So, we had a somewhat usable sequencer implementation by mid-January (thanks to Antti Huovilainen again for the voice side implementation!), and then we started just adding the remaining little details. For example, since we weren’t going to support the internal keyboard for sequencer entry since it uses the same mod buttons that are also used for sequencer step selection, we wanted to implement chord entry from the knobs so that the sequencers polyphony would be usable without an external keyboard. Simple enough, just write up some kind of a quick “chord generator” that generates all the chords and their inversions based on a few parameters. Immediately three weeks later we had come to the conclusion that such a generator is either very limited, or the chords it generates will mostly be very exotic, with the by far most used triad majors, minors, sus’s etc spread far and wide between wild jazz chord escapades. Fortunately Janne, who’s our domesticated professional musician, kept us code nerds in check, and in the end convinced us to rewrite the whole thing using hand generated lists, and one more parameter. So there was a chord entry rewrite.
Now that little extra parameter forced us to change the structuring such that instead of a single page per step, there’s now two pages, one showing an overview of the step and the other showing the details of the chord generation. That latter page also became the step entry interface, which actually cleared up many things in the UI, including giving room for chord entry using the internal keyboard, removing the original justification for the chord entry from lists. Of course, since we’d now implemented it, there was no reason to remove it. So that was a sequencer UI rewrite.
On the voice side, the original implementation for synchronizing the six sequencers (one for each part) between each others and potentially an external clock, was to just keep a common “wall clock” such that beat 1.1 would always be considered to be the point where, virtually, all sequencers were started. In other words, even when the sequencers are started from or synchronized to another song position, we compute the step number as if they we’re actually started at 1.1, and then adjust the play head to the desired sync position. This is logically nice and consistent in that it means that the position of a sequencers play head does not depend on its history, just on the current “wall clock time”. However, our resident live sequencer user Jussi pointed out that that’s unusable for live tweaking of a sequencer, since changing either the step length, or the sequence length, causes the sequencer to jump to the position where it would be if it had been started at beat 1.1 with the new settings. So we changed the sequencer implementation to keep it’s current relative time without jumping even when the lengths are changed. However, that makes it possible to get the six sequencers out of synchronization, and also out of sync with an external DAW, so we had to come up with a whole slew of workarounds to limit that off-syncness to musical divisions, and also to resynchronize just when you’d expect it to so that it “just works” most of the time. So that was a significant partial rewrite of the sequencer.
And then there were the macros. Which we had actually done first, and turns out they were easy and didn’t require much finessing, so at least something went smoothly!
Anyway, firmware 1.6 is out now!
We’ve already gotten started on firmware 1.7, and as you read this, 1.7 beta 2 with 9 Math engines (and no “Coming Soon” screens!) has been out for a while for the brave hearted!
