louismhowe's Recent Posts

Yeah, the physical analogy only goes so far ... there are definitely things you can't do with, e.g., Bazille. They don't have full MPE support, but you can get this "one string per channel" sound if you put it in legato or "mono" mode, and then just send it multichannel MIDI.

Hi, I'm trying to figure out how to get Aalto's/Kaivo's voicing to work naturally in the Linnstrument's 'channel-per-row' mode, which maps each controller row to a separate MIDI channel. I would like each row to be capable of legato gestures, and for each row to be totally independent of the others.

For example, this mode could naturally fit a 4-stringed instrument, where each string is capable of sudden pitch changes or strikes without triggering a new polyphonic voice.

I've tried to distill what I'm looking for with a test MIDI file and patch.

test patch

test MIDI file (should play on MIDI channel 2).

If I put Aalto 1.8.5 in MPE + unison mode with 1 voice, then this sounds right to me. But unison mode with 4 voices instead of 1 will cause all of them to be heard for the duration of the envelope. And disabling unison also disables legato.

I could do this with a separate Aalto instance for each Linnstrument row, but it'd be so much nicer not to. Perhaps a "MIDI MPE Legato" mode could accomplish this and disable the unison toggle. Or maybe there's some other way to do this I haven't considered!

cf. https://madronalabs.com/topics/5334-kaivo-aalto-voice-stealing-legato

Thanks for the response and such great instruments.

I was thinking about your question from a few years ago in the other thread I referenced, about "what legato would mean without unison on, in other words, what is a poly legato note triggering mode?"

So one answer could be: a mode where each voice is thought of as a vibrating object, rather than a finger.

I've discovered that the newer u-he synths can be played this way, just by switching them to legato. (In their implementation, "unison" would be an inner stack of voices that all follow the same channel.)

Hi,

I've noticed what seems like a new bug in one of the recent Aalto releases. Sorry in advance that I don't have clear reproduction steps.

When I leave the transport running and flip through presets using the left/right buttons, occasionally parts of Aalto will get stuck. For example, I'll select a new preset and then the LFO "freq" oscilloknob will not be tracking the selected position, and the LFO output LED will stop changing, as will the LFO value itself. The rest of the synth will keep running. It's easy to miss unless a patch doesn't sound like it's supposed to.

I'm not sure if just one knob is affected or if it's always an entire section. I also have no idea if flipping through presets is really what causes the problem, but I have never observed a free-running patch just get wedged by itself.

Some peculiarities of my setup: 96 KHz sampling rate, and often Aalto's sequencer is running and locked to the host transport at some ratio, with all 4 voices active and "unison" turned on. But there is no one patch which seems to cause any problems.

Aalto 1.8.2
Ableton Live 9.7.1
Windows 10 64-bit

One more observation ... it definitely seems related to the sample rate. I was able to get one instance "unstuck" by switching to 48 KHz and fiddling around with the timbre attenuator.

OK! It just happened again. And I will paste the preset which seems to cause the problem, but not completely reproducibly

(1) Opened up Ableton Live to the default Ableton blank live set
(2) Created an Aalto instance on track 1
(3) Selected a preset from the menu
(4) Observe that the plugin seems to operate normally briefly, and then the LFO and OSC timbre (which is modulated by the LFO) get stuck.

Here is what is happening:

  • LFO is wired up to modulate OSC timbre
  • LFO noise, level, and freq dials can be changed and both the shaded portion and oscilloscope line respond; if I add a modulator to the LFO noise/level, the dial oscilloscopes show the modulation
  • LFO output LED is stuck "off" or close to it
  • OSC timbre (modulated by LFO) is stuck, too, but in a slightly different way: the shaded portion of the timbre dial follows the selected value, but the oscilloscope line does not track the shaded portion.
  • The OSC is running, but the timbre is stuck visibly and audibly at 0
  • OSC noise, offset, ratio, mod index, shape, and pitch are responsive (visually and audibly), as is every other dial on the lower half
  • ENV 1 and ENV 2 appear to be working fine as modulators
  • Sequencer is free-running and also appears to be working normally
  • Disconnecting the LFO from the OSC timbre causes the timbre to get unstuck (visibly and audibly); now the timbre is responsive to other modulators if I wire them up
  • Connecting the LFO to the OSC shape immediately causes the entire synth to go completely silent; the shape dial now behaves the same as the timbre dial did with LFO connected (shaded portion responsive, oscilloscope line not responsive).
  • Waveguide/delay and filter sections are visibly responsive and the dials show the effects of modulation by one of the envelopes as expected
  • In the output section, the reverb and pan dials appear to be responsive to manual change and envelope modulation, but the main oscilloscope display is frozen
  • There appears to be no way to get Aalto to start making sound again, short of just creating a new Aalto instance
  • If I drag the LFO output around the various modulation targets, each one gets stuck and unstuck as I pass the cable over it

In the Ableton instance that I have open now, I can reproduce the LFO/timbre stuckness:

  • transport is running or not running at 96 bpm
  • create a new MIDI track and solo it
  • plop down another Aalto in track 2
  • paste the preset below from the clipboard
  • observe the timbre start to increase, but then get stuck at the maximum value

Now if I close Ableton, reopen a new instance, and paste in the preset on a new Aalto in track 1, the issue may or may not be reproduced. It worked fine a couple of times and got stuck in other cases. When it gets stuck, changing the timbre attenuverter seems to cause the timbre to flip/flop between 0 and the max setting.

If it's not Live, I wonder if this is like a floating point problem, like a denormal or something? Anyways, hope this helps.

{
"delay_input": 0.590000,
"demo": 0,
"licensor": "",
"seq_trig": 1,
"key_voices": 4,
"key_mod": 1,
"key_bend": 0,
"key_unison": 1,
"key_glide": 0,
"seq_wave": 0,
"seq_local": 1,
"seq_host": 1,
"seq_loop": 1,
"seq_rate": 0.372000,
"seq_ratio": 1,
"seq_rate_p": -0.320000,
"seq_steps": 16,
"seq_steps_p": 0,
"seq_offset": 0,
"seq_offset_p": 3,
"seq_range": 29,
"seq_quantize": 1,
"seq_glide": 0,
"seq_pw": 45.026634,
"seq_value_delay": 0,
"seq_pulse_delay": 0,
"seq_value0": 0,
"seq_value1": 0.520548,
"seq_value2": 0,
"seq_value3": 0,
"seq_value4": 0,
"seq_value5": 0.150685,
"seq_value6": 0,
"seq_value7": 0,
"seq_value8": 0,
"seq_value9": 0.191781,
"seq_value10": 0.191781,
"seq_value11": 0,
"seq_value12": 0,
"seq_value13": 0,
"seq_value14": 0,
"seq_value15": 0.315068,
"seq_pulse0": 0,
"seq_pulse1": 1,
"seq_pulse2": 0,
"seq_pulse3": 1,
"seq_pulse4": 0,
"seq_pulse5": 1,
"seq_pulse6": 0,
"seq_pulse7": 1,
"seq_pulse8": 0,
"seq_pulse9": 1,
"seq_pulse10": 1,
"seq_pulse11": 0,
"seq_pulse12": 0,
"seq_pulse13": 0,
"seq_pulse14": 0,
"seq_pulse15": 1,
"lfo_freq": 0.048726,
"lfo_noise": 0.433754,
"lfo_level": 0.864200,
"lfo_level_p": 0,
"lfo_freq_p": 0,
"env1_attack": 0.489530,
"env1_decay": 0.259383,
"env1_sustain": 1,
"env1_release": 0.577505,
"env1_level": 0.703105,
"env1_xvel": 1,
"env1_trig_select": 2,
"env1_attack_p": 0,
"env1_decay_p": 0,
"env1_release_p": 0,
"env2_repeat": 0,
"env2_delay": 0,
"env2_attack": 0.001000,
"env2_sustain": 0,
"env2_release": 0.015269,
"env2_xvel": 0,
"env2_trig_select": 2,
"env2_xenv1": 1,
"env2_delay_p": 0,
"env2_attack_p": 0,
"env2_repeat_p": 1,
"osc_noise": 0,
"osc_ratio": 3.753382,
"osc_offset": -32.666718,
"osc_index": 0.388662,
"osc_timbre": 0.170178,
"osc_pitch": 110,
"osc_waveshape": 0,
"osc_noise_p": 0.360000,
"osc_ratio_p": 0.880000,
"osc_offset_p": -49,
"osc_index_p": 0.230030,
"osc_timbre_p": 0.480000,
"osc_pitch_exp_p": -1.880000,
"osc_pitch_lin_p": 500,
"osc_waveshape_p": 0.120000,
"osc_carrier_out": 0.290000,
"osc_mod_out": 0,
"gate_level": 0,
"gate_mode": 0,
"gate_decay": 1.224234,
"gate_level_p": 0.430000,
"delay_peakfreq": 3682,
"delay_drive": 0.712199,
"delay_peakres": -1.310000,
"delay_feedback": 0.492997,
"delay_freq": 9.227439,
"delay_input_p": 0.500000,
"delay_peakfreq_p": 1,
"delay_drive_p": 0,
"delay_peakres_p": 4,
"delay_feedback_p": 0.260000,
"delay_freq_p": 1.049977,
"delay_output_wet": 1.680000,
"delay_output_dry": 0.710000,
"filter_cutoff": 100.529083,
"filter_q": 0.802383,
"filter_mix": -0.055891,
"filter_cutoff_p": 0.760001,
"filter_q_p": 0,
"filter_mix_p": 0,
"output_input_gain": 1.210000,
"output_reverb": 0.118067,
"output_pan": -0.535774,
"output_reverb_p": 0.080000,
"output_pan_p": 0.320000,
"patcher_matrix": {
"type": "signal",
"width": 14,
"height": 31,
"depth": 1,
"data": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
},
"key_scale": "European/bagpipe3",
"preset": "louis/sequences/ctseq[6]h[1]",
"maker_name": "Madrona Labs",
"app_name": "Aalto",
"app_version": 67585
}

It's an Intel Core i7-4710HQ. This is a weird one. It might happen once every few hours. I'm wondering if it's just this PC. It does not seem to be related to the audio driver (ASIO4ALL or DirectX in my case). I can attempt to generate a process memory dump if that'd help.

So in the LFO example, it seems like the LFO just stopped updating, i.e., not just stuck oscillating at some frequency, but not oscillating at all. If memory serves me right, it would have been stuck at some constant value and this would be consistent with what you hear.

I'll post any more occurrences here with details, and I'll try to distinguish more clearly between, e.g., the LFO frequency dial behavior, the LFO frequency, what the LFO is doing, and the effect on anything modulated by the LFO.

I can't reproduce this just by banging on the UI a lot more than I usually would, or by upping the sample rate further and causing buffer underruns.

I also saw one case where it seems like the "OUTPUT" section froze - the oscilloscope display stopped updating and there was actually no sound output at all. I don't know if that is an instance of what I'm describing or something else.

Virta works great in Renoise. For the audio path, just drop it in as a track DSP effect. To route MIDI to it, create a VST FX alias instrument and then use the new instrument number for notes. For MIDI CC's and other messages, I think you can use Renoise's *Instrument MIDI Control Meta device.

I was curious enough to try measuring this, in case there is some issue with my setup.

span-aalto-sampleratetest

White - 48 KHz sampling rate upsampled to 96 KHz by Ableton Live ("HiQ" mode)
Blue - 96 KHz sampling rate

Anyways, this was just an experiment and I thought I'd share what I found.

Hi there,

I've found that certain combinations of Aalto's timbre and mod index seem to result in a sound that depends strongly on my host's sample rate.

For example, this test patch sounds very different to me at 48 KHz and 96 KHz sampling rates. Is this just the oscillator anti-aliasing doing its thing, as designed?

I'm using Aalto 1.7.0, Windows 64-bit.

{
"delay_input": 0.910000,
"seq_trig": 0,
"key_voices": 1,
"key_mod": 1,
"key_bend": 7,
"key_unison": 0,
"key_glide": 0,
"seq_wave": 0,
"seq_local": 1,
"seq_host": 0,
"seq_loop": 1,
"seq_rate": 0.250000,
"seq_ratio": 1,
"seq_rate_p": 0,
"seq_steps": 16,
"seq_steps_p": 0,
"seq_offset": 0,
"seq_offset_p": 0,
"seq_range": 12,
"seq_quantize": 0,
"seq_glide": 0,
"seq_pw": 50,
"seq_value_delay": 0,
"seq_pulse_delay": 0,
"seq_value0": 0,
"seq_value1": 0,
"seq_value2": 0,
"seq_value3": 0,
"seq_value4": 0,
"seq_value5": 0,
"seq_value6": 0,
"seq_value7": 0,
"seq_value8": 0,
"seq_value9": 0,
"seq_value10": 0,
"seq_value11": 0,
"seq_value12": 0,
"seq_value13": 0,
"seq_value14": 0,
"seq_value15": 0,
"seq_pulse0": 0,
"seq_pulse1": 0,
"seq_pulse2": 0,
"seq_pulse3": 0,
"seq_pulse4": 0,
"seq_pulse5": 0,
"seq_pulse6": 0,
"seq_pulse7": 0,
"seq_pulse8": 0,
"seq_pulse9": 0,
"seq_pulse10": 0,
"seq_pulse11": 0,
"seq_pulse12": 0,
"seq_pulse13": 0,
"seq_pulse14": 0,
"seq_pulse15": 0,
"lfo_freq": 1,
"lfo_noise": 0,
"lfo_level": 0,
"lfo_level_p": 0,
"lfo_freq_p": 0,
"env1_attack": 0.001000,
"env1_decay": 2.890000,
"env1_sustain": 1,
"env1_release": 2.720000,
"env1_level": 1,
"env1_xvel": 1,
"env1_trig_select": 1,
"env1_attack_p": 0,
"env1_decay_p": 0,
"env1_release_p": 0,
"env2_repeat": 0.429688,
"env2_delay": 0,
"env2_attack": 0.001000,
"env2_sustain": 0,
"env2_release": 0.990000,
"env2_xvel": 0,
"env2_trig_select": 1,
"env2_xenv1": 1,
"env2_delay_p": 0,
"env2_attack_p": 0,
"env2_repeat_p": 1,
"osc_noise": 0,
"osc_ratio": 3,
"osc_offset": 0.000003,
"osc_index": 1.980000,
"osc_timbre": 0.630000,
"osc_pitch": 110,
"osc_waveshape": 3.725290e-009,
"osc_noise_p": 0,
"osc_ratio_p": 0,
"osc_offset_p": 0,
"osc_index_p": 3,
"osc_timbre_p": 0,
"osc_pitch_exp_p": 1,
"osc_pitch_lin_p": 4,
"osc_waveshape_p": 0,
"osc_carrier_out": 0.500000,
"osc_mod_out": 0,
"gate_level": 0,
"gate_mode": 0,
"gate_decay": 0,
"gate_level_p": 0.480000,
"delay_peakfreq": 1000,
"delay_drive": 1,
"delay_peakres": 0,
"delay_feedback": 0,
"delay_freq": 110,
"delay_input_p": 0.500000,
"delay_peakfreq_p": 1,
"delay_drive_p": 0,
"delay_peakres_p": 0,
"delay_feedback_p": 0,
"delay_freq_p": 1,
"delay_output_wet": 0,
"delay_output_dry": 1,
"filter_cutoff": 20000,
"filter_q": 0,
"filter_mix": -1,
"filter_cutoff_p": 1,
"filter_q_p": 0,
"filter_mix_p": 0,
"output_input_gain": 1,
"output_reverb": 0,
"output_pan": 0,
"output_reverb_p": 0,
"output_pan_p": 0,
"patcher_matrix": {
"type": "signal",
"width": 14,
"height": 31,
"depth": 1,
"data": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
},
"key_scale": "12-equal",
"preset": "sampleratetest",
"maker_name": "Madrona Labs",
"app_name": "Aalto",
"app_version": 67328
}