Re: An idea for an entirely new effect -- warning, long post
Steve Fiddle <[email protected]> Mon, 17 May 2021 10:36:53 +0100
| Newsgroups | gmane.comp.audio.audacity.devel |
|---|---|
| Message-ID | <CABp83eA-pA9y4fc_ihrwfXX8GQtpU_fU73iqRKG2tWnVoLwTpQ@mail.gmail.com> |
Interesting stuff. The final line of Robert's "squaring two signals and adding them together" assumes that the selected audio is a mono track. For a two channel track it needs to be: (sum (s-square (h1 (aref *track* 0))) (s-square (h2 (aref *track* 1)))) Steve On Mon, 17 May 2021 at 09:10, Robert Hänggi <[email protected]> wrote: > > Here is the plug-in: > > https://www.dropbox.com/t/AK66Xx2uxpvatEOH > It works only on stereo tracks. > The idea is to rotate the right channel by 90° at each application. > So, at the second time, you have basically inverted the right track > and at the forth, it will be back to the original state (although it > won't be exactly the original due to the nature of the IIR/HT with the > needed one sample delay). > In other words, the left and right channels represent the real and > imaginary part of the signal, especially if the track is dual-mono > (same content in both channels). > Let's look at the last line: > (vector (h1 (aref *track* 0)) (h2 (aref *track* 1))) > The signal that comes from the track is always *track*. > If it is mono, you can work with it as it is. > If it is stereo however, it is represented as an array with two > elements. Aref references the left (=0) and right (=1) channel. > The function h1 creates the original signal, the real part. Of course, > this would normally not be necessary but we need to adapt it for the > delay introduced through the IIR (ideally, the delay would be only > half a sample for h2). > the function vector creates again an array from the two sounds. > OK, let's assume that we work only with a mono track. > We could for instance use the Hilbert transform to return the > amplitude envelope of the signal. > This is done by squaring the two signals and adding them together. > First, create a mono track with e.g. a chirp or some other signal or file. > > Copy all the text from the plug-in into the Nyquist prompt. > replace the line with '(vector...' with the following: > > (defun s-square (sig) > (mult sig sig)) > (sum (s-square (h1 *track*)) (s-square (h2 *track*))) > > (you can save this as a preset if you go to the manage button) > > Apply the effect. You should (almost) hear nothing because the track > represents now the amplitude instead of the signal, in other words, > just plenty of DC offset. > > HTH > Robert > > > > On 17/05/2021, Federico Miyara <[email protected]> wrote: > > > > Petr, > > > > There is a free program called SPEAR that you can download here: > > > > http://www.klingbeil.com/spear/downloads/ > > <http://www.klingbeil.com/spear/downloads/> > > > > It models a signal by detecting partials and representing their time > > evolution by sine waves > > > > I'm not sure it is sufficiently accessible, but it allows several types > > of edits such as the partial displacemente you mention. > > > > Regards, > > > > Federico Miyara > > > > > > > > On 16/05/2021 02:34, Petr Pařízek via audacity-devel wrote: > >> Hello to all of you, > >> > >> to introduce myself a bit, I'm a piano player and a music composer and > >> a music theorist who is very interested in things regarding digital > >> audio effects. Many years ago, I wrote a lot of small programs for the > >> old QBasic for DOS and currently I'm planning to start learning > >> Nyquist in some near future. > >> FYI, I'm blind and that's why, when manipulating with the contents of > >> a sound file, I often combine listening to the sound and converting > >> the sample values to text, if I want to know more about some tiny > >> details (where most people would probably zoom in the waveform). > >> > >> I'm thinking of a possible new effect which might one day be > >> implemented in Audacity. Currently, I'm absolutely unsure whether this > >> kind of effect could be coded in Nyquist at all or whether the only > >> way is to write such complex stuff in C or whether there's yet another > >> way of doing it which I don't happen to know about. But I'd be > >> super-happy if I were told that this thing could indeed be coded in > >> Nyquist. > >> Therefore, I'll do my best to describe the effect, as some say, "in > >> prose", and hope my description is understandable for you all. In case > >> it isn't, I'm definitely open to clarification. I'll be very happy to > >> know your opinions about what might be the best way to code this. > >> I'd like to stress that I'm not intending this effect for real-time > >> performance at all, even though the description of the effect itself > >> might make you think I am. I'm not even suggesting something like a > >> "Preview" facility because I don't want the processing speed to be of > >> any importance here. In every case, I'm willing to sacrifice speed > >> over precision, even if the algorithm eventually turned out to be > >> super-slow. > >> Although I'd love to have such a thing working one day, I'm even ready > >> for the possibility that this effect might never be implemented, if I > >> realize it would be too difficult for me to code (honestly, I've never > >> coded in anything other than QBasic or briefly in Turbo Pascal, which > >> would probably require me to learn C all from scratch if C turned out > >> to be inevitable). > >> > >> - The core part of the algorithm is a frequency shifter [1]. Unlike a > >> pitch shifter, whose aim is to alter all the frequencies by a constant > >> ratio, a frequency shifter alters all the frequencies by a constant > >> difference. > >> - The corresponding dialog box would offer the following parameters: > >> 1) the amount by which the frequencies should be shifted, given in Hz, > >> which could be either positive or negative; > >> 2) two volume settings, namely for "dry" and "wet"; > >> 3) the amount by which the wet signal is fed back into the input, > >> given as a value that is less than 100% and more than -100%. > >> 4) the amount by which the feedback is to be delayed, probably given > >> in ms, which should always be given as a positive number; this > >> parameter has no effect if feedback is set to 0. > >> > >> [1] The actual realization would go like this: > >> - A) We store two intermediate copies of our original signal, label > >> them "IP" and "Q", and modify them as described in [2], > >> - B) Each of the modified intermediate signals is separately > >> amplitude-modulated: > >> IP is multiplied by a cosine wave of the given frequency, > >> Q is multiplied by a sine wave of the same frequency, > >> - C) we sum the two products to get the frequency-shifted signal, > >> - D) this signal, multiplied by the "Wet" coefficient, is sent to the > >> output, together with the original signal multiplied by the "Dry" > >> coefficient, > >> - E) the same frequency-shifted signal, this time multiplied by the > >> "Feedback" coefficient and delayed by "Delay" ms, is sent back to the > >> input. > >> > >> [2] We make a filter that works like an inverted Hilbert transform, > >> for which reason I'll call it the IHT. The length of the filter will > >> probably be hard-coded and unknown to the user. The longer the filter, > >> the closer the approximation gets to a proper IHT. > >> - For a positive integer l, the filter length should be either l*4 or > >> l*4-1 samples. Practically, the two make no difference because every > >> other coefficient is equal to zero. > >> - Even though the filter is l*4 samples long, our sample position > >> indexes, instead of going from 0 to l*4-1, should go from -2*l to > >> +2*l-1. Let's call them k. Similarly, for a filter of length 4*l-1, > >> the sample position indexes k would go from -(2*n-1) to +2*n-1, i.e. > >> from -2*n + 1 to 2*n - 1. > >> The actual values of the filter coefficients meet the following rule: > >> - For all even numbers k, the coefficient c(k) is equal to zero. > >> - For all odd numbers k, the coefficient c(k) is equal to -2/)k*π). > >> - Next, we convolve our original signal with this filter and store the > >> result into an intermediate buffer, which may be called Q (as in > >> "quadrature"). > >> - Then, depending on whether our filter length is even or odd, we > >> delay our original signal either by 2*n or by 2*n-1 samples and store > >> this delayed copy into another intermediate buffer, which we may call > >> IP (meaning "in phase"). > >> > >> You may be wondering why I insist on using an IHT instead of a proper > >> HT or on multiplying IP by a cosine wave rather than a sine wave. The > >> answers are: > >> - If I choose the amount of frequency shifting to be zero and do it > >> the way I've described, the supposed frequency-shifted signal will > >> only be delayed by "Delay" ms but in all other aspects it will be > >> identical to the original sound -- i.e. there won't be any additional > >> phase shifts or delays. In contrast, if IP were multiplied by a sine > >> wave and Q were multiplied by a cosine wave, then the supposed > >> frequency-shifted signal (with a zero frequency shift) would > >> correspond to the original signal not just delayed but also > >> Hilbert-transformed. This doesn't seem like an issue if the feedback > >> is set to zero. However, once I set the feedback to a non-zero value, > >> this thing starts to matter significantly. > >> - When I use an IHT, then I can get the desired frequency shift by > >> adding the two amplitude-modulated signals. In contrast, if I used a > >> proper HT, adding them would give me the opposite frequency shift and > >> to get the desired one, I would have to subtract them. > >> > >> Okay, that's it. Sorry for such a long post but I didn't want to miss > >> any important details. > >> > >> Thanks for your comments or suggestions. > >> > >> Petr > >> > >> > >> > > > > > > > > -- > > El software de antivirus Avast ha analizado este correo electrónico en busca > > de virus. > > https://www.avast.com/antivirus > > > > > _______________________________________________ > audacity-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/audacity-devel _______________________________________________ audacity-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/audacity-devel