2 votes

UWP AudioGraph AudioFileInputNode changer de tonalité

Comment changer la hauteur du son dans le nœud de AudioGraph dans une application UWP ?

J'essaie de porter l'application de WP7 à uwp (Windows 10, Mobile). Dans mon application WP7, j'utilise le code :

SoundEffect soundEffect = //...(load sound effect).
SoundEffectInstance soundInstance = soundEffect.CreateInstance();
soundInstance.Pitch = pitch;

Comment le faire dans UWP avec AudioGraph ?

0voto

andymule Points 353

Vous devriez partager un peu plus de votre code jusqu'à présent, mais vous voulez utiliser la propriété PlaybackSpeedFactor, qui est incluse sur l'AudioFileInputNode :

https://msdn.microsoft.com/en-us/library/Windows/apps/Windows.media.audio.audiofileinputnode.playbackspeedfactor

Actuellement, le GitHub de Microsoft présente les meilleurs exemples d'utilisation d'AudioGraph : https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/AudioCreation/cs/AudioCreation

Dans le scénario FilePlayback de ce dernier lien, il vous suffit d'ajouter cette ligne pour doubler le pitch de votre fichier audio :

 fileInput.PlaybackSpeedFactor = 2;

Vous pouvez effectuer ce changement en temps réel depuis n'importe quel endroit du programme (par exemple, avoir un curseur qui contrôle la vitesse de lecture). Ce ne sera pas du tout un problème pour AudioGraph. Vous pouvez probablement vous pouvez aussi jouer à l'envers en mettant cette valeur en négatif !

0voto

Avishai Dernis Points 359

Vous devrez peut-être prendre les données de l'AudioFrame, les soumettre à une transformation de Fourier, multiplier les hauteurs par un facteur quelconque, puis les soumettre à nouveau à la transformation de Fourier.

Voici du code pour obtenir le cadre

Où vous définissez votre graphique graph.QuantumStarted += Graph_QuantumStarted;

[ComImport]
[Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

unsafe interface IMemoryBufferByteAccess
{
    void GetBuffer(out byte* buffer, out uint capacity);
}

private static void Graph_QuantumStarted(AudioGraph sender, object args)
{
    AudioFrame frame = frameOutputNode.GetFrame();
    using (AudioBuffer buffer = frame.LockBuffer(AudioBufferAccessMode.Write))
    using (IMemoryBufferReference reference = buffer.CreateReference())
    {
        //Run Fourier and Adjust here
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X