Text moved from wiki:
Status: There is some framework done i.e. passing the whammy value (the value itself needs some love/interpolating/AnimValue) to audio engine and a dummy function in which to implement the algorithm.
Here is the opinion of Vincent Verfaille (Doctor in Music Technology) when I asked for real time pitch shifter.
Bonjour Vincent,
Le plus simple et efficace me semble être une interpolation de la forme d'onde.
Par exemple, en augmentant le nombre de nouveaux échantillons M générés à partir de N < M échantillons d'origine,
on simule bien la pression sur la whammy bar lorsque le pitch descend; on simule en même temps les changements
de timbres liés au fait que la corde se détend, mais pas ceux des résonances de la caisse qui normalement ne bougent pas.
Cela dit, pour une guitare électrique, on se permet de les oublier.
Donc, l'algorithme le + simple est aussi le plus efficace!
Une interpolation cubique (voir des B-splines cubiques) est adaptée pour cela, elle permet de produire des
variations de phases cubiques et donc des variations de fréquence quadratique, ce qui évite les sauts de fréquence
aux extrémités de l'intervalle.
Il faut cependant filtre passe-bas le signal avant de le ré-échantillonner, pour éviter le repliement du spectre;
la fréquence de coupure de ce passe bas est donc N/M * Fn (Fn: demi-fréquence d'échantillonnage du signal original).
Tout ceci peut se faire en temps réel, avec une latence de quelques échantillons (le nombre d'échantillons pour
une interpolation cubique étant 4).
Après, reste le problème de la longueur du signal puisque sinon, le signal généré est plus long que le
signal de départ. Deux solutions:
- ajout-superposition (overlap-add = OLA): ré-échantillonnage + passe bas -> OLA, et le tour est joué.
Par contre, cela peut générer des problèmes de phase lors de l'OLA, d'où l'utilisation de méthodes
pitch-synchrones (PSOLA). Ça peut rester du temps-réel, mais avec plus de latence... et d'artefacts potentiels.
- sinon, considérer que la "whammy bar" ne va que vers la caisse de la guitare (et le pitch uniquement
vers le bas); dans ce cas, utiliser le signal d'entrée pour générer le signal de sortie comme expliqué
précédemment, puis le moduler en amplitude en fonction du signal d'entrée. Autrement dit, la hauteur
et le timbre sont obtenus par un signal de plus en plus désynchronisé, mais l'amplitude par le signal
réel. C'est une autre bidouille efficace, surtout lorsque le signal s'éteint vite. Dès que le whammy
bar est relâchée, on revient en mode normal.
Voilà, j'espère que ça aidera!
Vous trouverez les codes Matlab de la transposition (pitch-shifting) par ré-échantillonnage et de la
transposition pitch-synchrone dans des livres comme celui d'Udo Zoelzer (Dagitial Audio Effects; les
codes existent en ligne), il fait exactement ce qu'il vous faut.
Bonne chance,
Vincent Verfaille
Will translate this as soon as I have time ([[User:Yoda|Yoda]] 23:34, 25 January 2010 (UTC))
=== Translation from Google translate ===
Hello Vincent,
The simplest and most effective seems to be an interpolation of the waveform.
For example, increasing the number of new samples generated from M N <M samples of origin
well it simulates the pressure on the whammy bar when the pitch goes down, it simulates the same time changes
stamps related to the fact that the rope is relaxed, but not those of the resonances of the body that normally do not move.
However, for an electric guitar, we allow ourselves to forget.
So, the algorithm is the + single most effective!
Cubic interpolation (see B-splines) is adapted to this, it can produce
cubic phase variations and hence quadratic frequency variations, which avoids the frequency hopping
the ends of the interval.
It must, however, low-pass filter the signal before re-sampled to avoid aliasing;
cutoff of this lowpass is N / M * Fn (Fn: half-sampling frequency of original signal).
All this can be done in real time, with a latency of few samples (the number of samples for
cubic interpolation being 4).
Then there remains the problem of the length of the signal because otherwise the signal generated is longer than the
starting signal. Two solutions:
- Add-overlay (overlap-add = OLA): resampling + lowpass -> OLA, and voila.
By cons, it can cause phase problems at the OLA, hence the use of methods
pitch-synchronous (PSOLA). It can stay on the real-time, but with more lag ... and potential artifacts.
- Otherwise, consider that the "whammy bar" is only going to fund the guitar (and the only pitch
down), in which case, use the input signal to generate the output signal as explained
above, then the amplitude modulated as a function of input signal. In other words, the height
and tone are achieved by a signal increasingly out of sync, but the amplitude of the signal
real. This is another hack effective, especially when the signal goes off quickly. Once the whammy
bar is released, it returns to normal.
Well, I hope it helps!
You will find the Matlab code transposition (pitch-shifting) by re-sampling and
transposition pitch-synchronous in books like Udo Zoelzer (Dagitial Audio Effects; the
codes are available online), it does exactly what you need.
Good luck
Vincent Verfaille
=== Links ===
- V. Verfaille, DRIVING PITCH-SHIFTING AND TIME-SCALING ALGORITHMS WITH ADAPTIVE AND GESTURAL TECHNIQUES: [http://www.elec.qmul.ac.uk/dafx03/proceedings/pdfs/dafx20.pdf]