[PD] tabread4~~

Mathieu Bouchard matju at artengine.ca
Fri Jan 4 20:54:10 CET 2008

On Sun, 23 Dec 2007, Charles Henry wrote:

> To split hairs, we want to constrain the total energy in mixing
> signals, which means we have to expand the inner product.

I mentioned convex spaces possibly because you can deform your space so 
that you don't have to do it with the inner product. If each of your 
dimensions' values is an energy level instead of an amplitude, then 
instead of forcing the inner product to be 1, you can force the simple sum 
of all components to be 1, and that's a linear equation instead of a 
quadratic equation. It changes the nature of how you cross-fade between 
components, but that doesn't mean that it changes it in a bad way.

> This ensures that we have a solid homotopy, where we're not 
> interpolating outside of our space (I stated this wrongly in the first 
> place!).
> so, |x|^2=|y|^2=1
> and |a*x+b*y|^2=a^2*|x|^2+b^2*|y|^2+a*b*<x,y>=1

What makes you think that? An inner product is only guaranteed to be 
sesquilinear; in other words, it's "conjugate-commutative": some kind of 
hybrid between commutative and anti-commutative.

You also forgot to multiply a*b*<x,y> by two because even in the 
commutative case you have to count it twice.

   |a*x+b*y|^2 = a^2*|x|^2 + b^2*|y|^2 + a*b*<x,y> + a*b*<y,x> = 1

If you don't use complex numbers you probably can say <x,y>=<y,x> and then 
you can write it like:

   |a*x+b*y|^2 = a^2*|x|^2 + b^2*|y|^2 + 2*a*b*<x,y> = 1

And then I don't know where you are getting to with your 
simplifications, but really, if you use flatten it into a convex space, 
it looks a lot friendlier for interpolation.

With a |x|=1 kind of space, the only nice stuff you can do on it is action 
by an orthogonal matrix space. I wouldn't enjoy to have to mess with 
square roots on that. OTOH it could be that the convex space thingie is 
unusable in practice because one would want to work with amplitudes 
instead, but I haven't really tried... It's not like I plan doing anything 
with those structures any time soon.

> I've always been fascinated (obsessed maybe? meh) with convolution 
> operators.  I have often said some wrong things about these, but later 
> worked out proofs of general properties that are essential. L1 norms and 
> L2 norms are the most important.  Convolution preserves L1 norms (proof 
> on request) in the following way (here | . | represents the L1 norm, |f| 
> = integral( -inf, inf, |f|dt)
>  and * is convolution
> |x*y| = |x| |y|

In that case it might be easier to write slightly more verbose formulas 
than having to explain the formula... e.g. L1(conv(x,y)) = L1(x)*L1(y), 
where * is the ordinary product.

> and in the L2 norm shown here with same notation
> |f| = sqrt( integral( -inf, inf, f^2dt) )
> |x*y| <= sqrt( |x| |y| )

BTW, note that the L2 norm in the spherical space is (isomorphic to) the 
L1 norm in the convex space. (BTW, from now on, I will only use x,y to 
talk about vectors in the spherical space, and will use different symbols 
to talk about the convex space, e.g. convex(x) and convex(y))

> To me, convolution makes a good operator for consideration in this
> type of space.  Maybe there's a modification to the definition we can
> make to be sure that |x*y|^2=1 ?

Well, you could define the normalised convolution product as being 
conv(x,y)/L2(conv(x,y)) ?

Let's say F(x),F(y) are Fourier transforms of the x,y vectors. Then the 
convolution of x,y is a componentwise product (representable by diagonal 
matrices if you prefer that, but i'll call it cp), according to the 
Convolution Theorem, and F is energy-preserving, according to Parseval's 
theorem. So F(conv(x,y)/L2(conv(x,y)) = F(cp(x,y))/L2(cp(x,y)). Does this 
get you further in any way?

>> Actually, note the difference with convex space: in an affine space, you
>> are not restricted to a>=0 and b>=0. I can only call the latter a convex
>> sum because energy is nonnegative. (Btw, are the values in the vector
>> supposed to be energy values or amplitude values?)
> The values in the vector should be amplitudes of orthogonal components, right?

In the convex space, no, you deal directly with energy... but I suspect 
that if you want to interpolate between timbres, it's better to linearly 
interpolate energies instead of amplitudes, as it keeps total energy 

> Then, dissonance arises between pairs of frequencies by a nonlinear
> function N(X) which takes the dissonance between each pair and creates
> a vector of all possibilities.
> diss(X)=N(X)*A*N(x)/2
> where A=
> [0       a1*a2 a1*a3 a1*a4 ....
> [a1*a2 0       a2*a3 a2*a4 .....
> [a1*a3 a2*a3 0       a3*a4 .....
> where you see a1*a2, etc... I mean for it to be sqrt(a1*a2)
> The elements are on the diagonal are zero because a single frequency
> makes no dissonance with itself.

I don't believe this function. I'd expect the diagonal elements to follow 
the same pattern as everything else. Then I'd expect the amplitudes to be 
the elements of X and I'd expect the frequencies to be the indices of X. 
I'm completely lost, but something like sqrt(a1*a2) definitely looks 
wrong. It needs to be a formula such that when you combine a1 with itself, 
a2 with itself, etc. it will give zero naturally, without having to make 
an exception.

> Plus, there's the added complication of non-linear critical band rate.
> So, the dissonance function is different for different registers
> (like the difference between a major third harmony in bass as opposed
> to treble).

It's not "Plus"... I already mentioned this. I called it the window size. 
You adjust it to match the boundary between tone and rhythm, and it is 
this boundary that causes bass harmony to be touchier.

> Attached is my resurrected/re-designed dissonance curves patch.  The 
> last thing I was doing with it was to look at dissonace relations with 
> odd-harmonic series.  Yes, it's very crudely coded--see for yourself--if 
> anyone wants to collaborate, I'm up for a fundamental overhaul.

Hmm... I haven't looked at it yet.

  _ _ __ ___ _____ ________ _____________ _____________________ ...
| Mathieu Bouchard - tél:+1.514.383.3801, Montréal QC Canada

More information about the Pd-list mailing list