2009-08-30 8 views
4

Je dois être capable de jouer certains sons dans une application C#. Je m'en fous si elle les génère à la volée ou si elle les joue à partir d'un fichier, mais j'ai juste besoin de QUELQUE façon de générer des sons qui ont non seulement le volume et la fréquence variable, mais le timbre variable. Il serait particulièrement utile que tout ce que j'ai utilisé pour générer ces sons ait de nombreux pré-réglages de timbre, et ce serait encore plus génial si ces timbres ne sonnaient pas tous midi-ish (ce qui signifie que certains d'entre eux sonnaient comme enregistrements d'instruments réels).Logiciel de génération audio ou bibliothèque .NET

Des suggestions?

Répondre

0

Pour que vos sons générés ne sonnent pas ' midi-ish ', vous devrez utiliser des samples de la vie réelle et les lire. Essayez de trouver une bonne banque d'échantillons d'instruments réels, comme http://www.sampleswap.org/filebrowser-new.php?d=INSTRUMENTS+single+samples%2F

Ensuite, lorsque vous voulez composer une mélodie à partir d'eux, il suffit d'alterner la fréquence de lecture par rapport à la fréquence d'échantillonnage d'origine.

Veuillez me laisser un message si vous trouvez cette réponse utile.

1

Cet article m'a aidé à quelque chose de similaire: http://social.msdn.microsoft.com/Forums/vstudio/en-US/18fe83f0-5658-4bcf-bafc-2e02e187eb80/beep-beep

La partie en particulier est le Beep Classe:

public class Beep 
{ 
    public static void BeepBeep(int Amplitude, int Frequency, int Duration) 
    { 
    double A = ((Amplitude * (System.Math.Pow(2, 15)))/1000) - 1; 
    double DeltaFT = 2 * Math.PI * Frequency/44100.0; 

    int Samples = 441 * Duration/10; 
    int Bytes = Samples * 4; 
    int[] Hdr = {0X46464952, 36 + Bytes, 0X45564157, 0X20746D66, 16, 0X20001, 44100, 176400, 0X100004, 0X61746164, Bytes}; 
    using (MemoryStream MS = new MemoryStream(44 + Bytes)) 
    { 
     using (BinaryWriter BW = new BinaryWriter(MS)) 
     { 
     for (int I = 0; I < Hdr.Length; I++) 
     { 
      BW.Write(Hdr[I]); 
     } 
     for (int T = 0; T < Samples; T++) 
     { 
      short Sample = System.Convert.ToInt16(A * Math.Sin(DeltaFT * T)); 
      BW.Write(Sample); 
      BW.Write(Sample); 
     } 
     BW.Flush(); 
     MS.Seek(0, SeekOrigin.Begin); 
     using (SoundPlayer SP = new SoundPlayer(MS)) 
     { 
      SP.PlaySync(); 
     } 
     } 
    } 
    } 
} 

Il peut être utilisé comme suit

Beep.BeepBeep(100, 1000, 1000); /* 10% volume */ 
Questions connexes