2016-01-08 1 views
0

J'exécution de ce programme ton générateur et il fonctionne très bien:Pourquoi écrire deux fois dans BinaryWriter?

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c2b953b6-3c85-4eda-a478-080bae781319/beep-beep?forum=vbgeneral

Ce que je ne peux pas comprendre, est la raison pour laquelle les deux lignes de code suivantes:

BW.Write(Sample) 
BW.Write(Sample) 

One "écrire" a du sens, mais pourquoi le second "écrire"?

+0

Vous pouvez répondre vous-même: commenter l'un d'eux et l'exécuter et voir ce que le résultat est – Plutonix

+0

J'ai essayé cela et j'ai obtenu des résultats étranges. Si je commente le premier, j'obtiens une erreur sur la commande SP.Play(). Si je commente le second, j'ai le son, mais une octave plus haut. Impossible d'expliquer ces résultats ... – swabygw

+0

Il est possible que la seconde écriture ne fasse que balayer la première écriture –

Répondre

1

L'exemple est un peu énigmatique mais le fichier wave est configuré pour être à 2 canaux donc les deux écritures envoient simplement les mêmes données audio aux deux canaux.

L'en-tête d'onde est ce bit hardcoded:

Dim Hdr() As Integer = {&H46464952, 36 + Bytes, &H45564157, _ 
         &H20746D66, 16, &H20001, 44100, _ 
         176400, &H100004, &H61746164, Bytes} 

Quels sont les moyens décodée:

 
    H46464952 = 'RIFF' (little endian) 
    36+Bytes = Length of header + length of data 
    H45564157 = 'WAVE' (little endian) 
    H20746D66 = 'fmt ' (little endian) 
    16  = length of fmt chunk (always 16) 
    H20001 = 0x0001: PCM, 
       0x0002: 2 channels 
    44100  = sampleRate 
    176400 = sampleRate*numChannels*bytesPerSample = 44100*2*2 
    H100004 = 0x0004: numChannels*bytesPerSample, 
       0x0010: bitsPerSample (16) 
    H61746164 = 'data' 
    Bytes  = size of data chunk 
+0

Bonne explication. Où puis-je trouver de la documentation sur ces valeurs? Oh, et que voulait dire "endian"? Était-ce censé être "médian" ou autre chose ... – swabygw

+0

http://soundfile.sapp.org/doc/WaveFormat/. Endian se réfère à l'ordre des octets - big endian 0x1234 est little endian 0x3412. Si vous regardez les codes ascii pour les chaînes, vous verrez qu'ils les épellent à l'envers. – jaket

+0

Génial - merci. J'ai trouvé de la documentation en ligne. – swabygw