Hello Yoshimi-devs,

First things first: a happy new year to everybody!
<sarcasm>
 Some people around the world are engaged with determination to make this new
 year a big mess.... so let's hope matters go south in mostly unexpected ways!
</sarcasm>

After we've somehow managed to close out the last round of internal changes
(seemingly without major problems up to now...), I was wondering if it's the
time to pick up on one topic which I have on my mind since quite some time.

On 31.12.24 19:44, Will Godfrey wrote:
I'd like to be able to make another minor point release in February,
so it would be good to have a significant development to hang it on.
Ideas, most welcome!


My most important wish is to let us proceed in a considerate way.
The time and capacity I'm able to put in *is limited*, for sure, because I have
to focus on my main project (Lumiera). So, while I'm proposing something bold,
I'd like to ask to break it down into several small increments, and -- above all
-- to avoid those "*big bang*" changes. I mean, if that's possible at all, since
we've all made the experience that often matters can escalate to a much wider
scope in the Yoshimi code base, than was initially expected. :-/


In a nutshell: I'd like to pick up that topic of *balancing the presence* of an
instrument or the closely related global parameter links like *crossfades*.

See the threads "Note-Weight-Adjustment" and "Crossfade" from last summer.


My proposal is to proceed in several steps:

(1) have a up-front discussion about *what* we want to achieve;
    take the necessary time to define the scope of where we're headed.

(2) do a technical prototype to bring in the foundational changes into the
    engine. Make performance measurements to see if our guesses were right.
    Recall from the mentioned discussion that we assume that it should be
    possible to bring the base extension into the engine without a measurable
    impact on performance (at least in disabled state)

(3) then merge that change into mainline, test it and bring it into widespread
    use in some minor release, so that we have to option to back out or search
    for a better approach before anyone starts to use the new feature in
    creative ways.

(4) only then build the GUI part and gradually make the feature visible for
    the users. Consider how it relates to existing features like Crossfade
    and Velocity sensing. Mark it as "experimental" first and try to get
    feedback from the users.



Following this outline, we'd be currently engaged into (1), and we'd be able
to change course and reshape the direction up into point (3), in case it
turns out to be to much for us to handle....


To make the first step: here is how I see this possible bold new feature:

* The point of operation is in the "note on" code. In each Part, right now
  there is basically a similar piece of code, which takes the raw parameters,
  does some fusion on them and computes the parameter values effective for this
  note, i.e. the effective frequency, gain, filter cut-off or vowel position.

* the core idea is to allow for a /very small number/ of additional control
  parameters to be transported into this code. Right now it is only driven
  by the note (midi) value, the velocity and the volume. So the idea is
  to extend that and allow -- say maybe two or three additional controller
  values as input. Which ones these are would be a matter of instrument?
  patch? or global instance? (do be discussed!) setup. The prominent example
  would be a channel pressure, or a per-key aftertouch. This immediately shows
  that we'd have to re-evaluate this piece of code while playing a note under
  some circumstances; and we should carefully plan how to do that.

* and then, at the heart of the feature would be *optional cross-links*
  between those parameters. For performance reasons, these would obviously
  be implemented as Look-up-Table (LUT), with a suitable interpolation.
  These would implement a *function* of the input parameter and produce
  a *factor* applied to some output parameter. Lots of fine points to
  consider here, but overall doable and within our abilities and close
  to what the existing code already does right now.
  - Volume could be adjusted as function of MIDI note (my primary use case!)
  - Volume could be adjusted as function of channel pressure
  - Frequency could be adjusted as function of velocity
  - Cut-off could be adjusted as function of aftertouch
  ...

* Needless to say: this is a very advanced feature and will just confuse
  most users. Yet people familiar with the fine points of sound design will
  understand it intuitively, because, in a way, its obvious you want to do that.

* So there would be a full-control GUI in each Part. It's hidden behind a button
  and will bring up a matrix of knobs or graph widgets. For example, the input
  could be in the columns (note, volume, velocity, ctrl-1, ctrl-2). And in
  the rows, there would be the target parameters (frequency, gain, filter-freq,
  filter-q, what else...?). Each "point" in that correlation matrix would either
  be disabled, or a simple knob similar to velocity-sensing, or a graph widget
  with a bezier-curve, similar to the gamma or colour channels in Gimp.
  (Yes, I know, its messy to build such a beast, but it is well doable)

* we have already some controls which effectively so something similar. They
  can be seamlessly translated into the new machinery. Notably, the velocity-
  sensing is already a function of volume based on velocity or filter gain
  based on velocity. I'd leave the familiar controls in place and just map
  them down into the new feature.
  Likewise, all existing cross-fades can seamlessly be translated into such
  a cross-correlation of parameters. Because they are just a function of
  velocity (or volume!) based on MIDI note value. But then an advanced
  user could go in and adjust and tweak the transition curve. Yikes!!

What I'm proposing is bold, for sure. But IMHO it is not too bold: it is a
generalisation of what we're doing already in some aspects; it would make
handling those cases more symmetric. And what's more important, I expect
that such a feature will unleash a lot of further possibilities present
in Yoshimi's system of layered parts, because it's a generic component
we'll build once and can then integrate into each part.

Its also a lot of work, but -- as I've said in the introduction -- the
proposal would be to proceed in small steps. Moreover, such a feature is
certainly a bold bet that the zombie apocalypse would not happen right now
and we'll all might have some further time left to build interesting stuff.

-- Hermann





_______________________________________________
Yoshimi-devel mailing list
Yoshimi-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/yoshimi-devel

Reply via email to