Kria: How to create "longer" sounds and faster gates

Couldn’t really find an existing topic for Ansible relates questions, so figured I create a new topic.

Been playing around with my Ansible for the last 2 weeks, really liking it so far, yet I have some questions I hope someone with more experience with it can answer:

  • How do you create longer running sounds like for example pads?
    The duration range doesn’t seem to go high enough to use the gates directly with a holding envelope. Or is there a trick to make this work?
  • How do you create faster gates? When I start with the default settings the time/clock divider is already at the leftmost/fastest division, which means when I inevitable want something faster I have no means of doing so within Kria. A clock multiplier would work of course, but if I can do it within Kria I’d prefer that.
    Or does everyone just change the default time/clock divider to something else than the leftmost/fastest division and then crank up the timing before starting?
  • Is there a way to tie the note and trigger time/clock divider settings together? If I switch the clock divider for the trigger for a synth voice it’s no longer in sync with the clock divider of the pitch for that same synth voice.
    Sometimes I want that and some other times I don’t. Is there a way to make them change together?
1 Like

I’ve been adding some new features to the Ansible firmware, specifically for Kria, that address some of the issues that you bring up.

ansible.hex (238.4 KB)

I changed it so that the duration lengths are relative to the clock speed. I set it up so that when you use the longest possible duration, the gate’s pulse width will be the same as the duration between clocks so that the gate won’t retrigger on a following note, giving you the possibility to have “tied notes”.

Two things I’ve added that relate to this. One, I’ve added a ratcheting parameter that lets you create repeats/rolls: (kria) ratcheting + alt note + glide. You can get to it by pressing the trigger screen button a second time. Two, if you’ve got a Teletype, I added an OP that let’s you clock individual Kria tracks independent of the master clock: Individual clock for each ansible / kria track via TT?

Don’t have a firmware solution for this one, but you could just send a gate to the reset input on the module and note and trigger sequences will line up again.

6 Likes

I think that depends on what you’re using it with. For example, if you’re sequencing the root note of a qubit chord or music thing chord organ, you can use the trigger in on your envelope generator to control the length. Or something like Mutable Plaits has built in control over that.

Another option is to use a slower clock division on your Kria track vs your other tracks.

can’t seem to get tied notes working. firmware 1.6.1
note duration at max

1 Like

Directly gating a VCA, the notes tie for me when adjacent note durations and the master duration multiplier are maxed. Using an LPG or an envelope with some release I’m able to get away with a slightly lower master duration multiplier without hearing them as multiple notes.

Did this ever get fixed? I don’t have my rack right in front of me, but I remember having trouble with it in the past, too.

No, it hasn’t been fixed. It’s been almost a year since the last kria release. This is the problem with open source. Writing code is relatively cheap but testing it and maintaining it can be very time consuming.

I don’t blame the author of the patch. They are a person with a job and family obligations. To be honest, the entire situation has a left a bad taste in mouth. Kria has many of the elements of fantastic sequencer but lacking note tie in 2019 is ridiculous.

I get that it’s more fun(and perhaps more profitable) to go off and develop new products like norms. I’m certainly not expecting anyone to maintain any device in perpetuity constantly adding features to the end of time. That said, this is just a focus/discipline issue at this point. Note ties have been advertised for an entire year and don’t work. It’s not a good look.

3 Likes

I’ve been waiting on this one also, but that’s kind of the beauty of open-source: if it’s important enough you can learn to fix it yourself, which I haven’t made the time to do either.

this looks like a promising function to tweak if duration / clock scaling is not to your liking (?)

i don’t have euro stuff so can’t easily verify, but seems to me if the dur is simply set long enough, then the next stage will cancel the gate-release timer before it fires, here:

[ https://github.com/monome/ansible/blob/master/src/ansible_grid.c#L579 ]

which i believe is what is meant by “note-tie”?

2 Likes

Sorry to anyone who has been waiting for a fix on this. Last year, my MacBook Pro that I was using to work on Ansible died and I was without a laptop for a while, which coincided with the timing for this issue that came up.

Since getting a new computer I still haven’t set up my toolchain for Ansible development, but @zebra’s exactly correct about that line of code in ansible_grid.c. Changing the number 384.0 to something a bit smaller should do it. Not too much smaller though, otherwise several of the last settings along the top row will act as tied notes.

5 Likes

i can make the change. will post a new build tonight or later in the week.

7 Likes
4 Likes

380 was the magic number. tested this with oscilloscope trigger detection. 381 still produced gaps. here is the new version:

edit: see updated build here: Kria: How to create "longer" sounds and faster gates

this includes everything from the latest 1.6.1 release plus @slowwild’s fix for config mode. this also includes an experimental fix for usb connect timing lag - that’s when connecting grid sometime introduces a lag. this might affect how grids/arcs are recognized, and i can’t test with all the different editions, so help with testing will be much appreciated.

version that includes earthsea posted here: Ansible Earthsea

17 Likes

FYI you can build firmware for any of the monome euro modules without any toolchain setup using the commands described here (just requires Docker.)

4 Likes

@scanner_darkly & @freqout : a huge shoutout to you and everyone else in this community who contributes so much of their time and their expertise to this endeavor, y’all are making something special, it’s a whole new world over here!

1 Like

Thanks for taking care of this. It is very much appreciated. :slight_smile:

What’s the significance of the magick number? Will it work regardless of the speed of the incoming clock?

good question - i don’t have the bandwidth to test but will be happy to provide another build if the number is still too high (it’s used in calculating step duration, and as @freqout said making it too low might cause tied notes even with lower duration values).

It’s just a scalar value that I adjusted until (i thought) i had it creating tied notes at the highest setting.

On the same line of code you’ll also see clock_deltas[trackNum] which is the amount of time (in ms) between clocks for that particular track so it does also factor in clock speed.

So it should work at any arbitrary clock speed. Tbh, it might be best to err on the safe side to ensure you can always get a tied note even if it eats into the 15th column, but let’s see how it tests out in the field.

1 Like

i’m not totally convinced this is right… hang on one sec…

… yeah ok. @freqout @scanner_darkly so again i don’t have euro stuff and this is just theorycrafting. so take w/ grain of salt. (*) but i don’t see how the arbitrary scaling factor can work consistently for all settings of clock mul and duration.

the scaled gate duration is the red surface. the clock duration is the blue plane. when the surface is above the plane, we got “note tie.” the scaling factor changes the steepness of the surface, but i don’t see how it can prevent them from crossing at some point.

(i’m assuming gate duration multiplier is ==1 btw.)

matlab:

n = 100;
c = linspace(50, 1000, n);  % clock duration un ticks
a = 380;                    % clock scaling factor
d = linspace(50, 1000, n);  % duration

g = zeros(n, n);             % scaled gate duration

for i=1:n
   for j=1:n
       g(i,j) = c(i) / a * d(j);
   end
end

surf(c, d, g, 'FaceColor','r', 'FaceAlpha',0.4, 'EdgeColor','r', 'EdgeAlpha', 0.7)
dplane = zeros(n, n);
for i=1:n
    dplane(i,:) = d;
end
hold on;
surf(c, d, dplane, 'FaceColor','b', 'FaceAlpha',0.4, 'EdgeColor','b', 'EdgeAlpha', 0.7)
hold off;

xlabel('clock duration')
ylabel('step duration')
zlabel('scaled gate duration')

i guess i would implement “note tie” feature differently, with brute force. when user sets gate duration to max, just don’t set the gate-off timer.


(*) i am also frankly kind of slow and hungover today, and could be easily be making some very stupid error or assumption. like about how stage durations even work.

1 Like

yeah, i think that the easiest solution is simply not adding a timer for kria_off if the setting for the note is at the maximum.

can’t tell though what’s the right condition to check (or how to calculate the delay properly) without getting deep into the code which is frankly what i’m trying to avoid - too many other projects on the go to get deep into another one… i’ll be happy to rebuild the firmware if @freqout could tell me what would be the right condition to check.

track->dur_mul == 16 && track->dur[pos[trackNum][mDur]] == 5?

this works, will post new version in a bit.