Mehrere Töne gleichzeitig abspielen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 57 Antworten in diesem Thema. Der letzte Beitrag () ist von tron25.

    Mehrere Töne gleichzeitig abspielen

    Hallo,

    ich möchte ein Programm schreiben, welches mehrere Buttons hat. Jedes davon soll einen Ton in einer bestimmten Frequenz abspielen. Am Ende soll ein Programm herauskommen, mit dem die Frequenzen eines Tinnitus herausgefunden werden sollen. Die Balance muß verstellbar sein, damit mehrere Töne unabhängig von einander für beide Ohren erzeugt werden können.

    Ein Ton kann mittlerweile ausgegeben werden, aber während dieser ertönt, hängt das Programm. Daher habe ich versucht, das mit "Async" und "Await" zu verbessern.

    Bisher habe ich es so verstanden, das mit "Async" angekündigt wird, dass die kommende Methode asynchron ausgeführt werden soll, sodas ich beispielsweise einen Button und dann einen weiteren drücken kann, damit beide Töne gleichzeitig abgespielt werden.

    Leider funktioniert es nicht.

    Hier mal der Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Declare Function Beep Lib "kernel32.dll" (ByVal dwFreq As Int32, ByVal dwDuration As Int32) As Int32
    3. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Tonausgabe(300, 3000)
    5. Await Task.Delay(3000)
    6. End Sub
    7. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    8. End
    9. End Sub
    10. Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    11. Tonausgabe(500, 3000)
    12. Await Task.Delay(3000)
    13. End Sub
    14. Public Sub Tonausgabe(Frequenz As Integer, Dauer As Integer)
    15. Beep(Frequenz, Dauer)
    16. End Sub
    17. End Class


    Selbst, wenn ich bei "Task.Delay()" einen sehr niedrigen Wert eintrage, kann ich nichts machen, bis der erste Ton wieder aus ist.

    Wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht. Aber, da ich blind bin, sollte ich sagen: Wahrscheinlich höre ich die Autobahn vor lauter Autos nicht ;-).

    Hat Jemand eine Idee, wo der Hund begraben ist?

    Danke

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    tron25 schrieb:

    Die Balance muß verstellbar sein, damit mehrere Töne unabhängig von einander für beide Ohren erzeugt werden können.


    Unter Balance verstehe ich was anderes. Bei Stereo-Audio die Lautstärke der beiden Kanäle regeln. Sehr einfach geht das was vor hast mit der Bass.dll, da hast du die volle Kontrolle, kannst für jeden Kanal das ausgeben was du willst. Einen Tongenerator zu machen ist leicht, ich wette hier im Forum gibt es was dazu. Da kannste dann "live" die Frequenz deiner Audiosignale regeln, wie auch die Lautstärke. Ein wenig Mathe, ein Byte-Array mit dem Audiosignal erzeugen und das abspielen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    DTF schrieb:

    ich wette hier im Forum gibt es was dazu.
    Da würde ich fast dagegen wetten.
    Sicher gibts Threads zur Bass.dll, aber ob die für einen Anfänger brauchbar sind möchte ich stark bezweifeln.

    Minimal-Anforderung an "brauchbar" wäre, dass eine lauffähige Sample-Solution dabei ist, die überhaupt irgendwas mit der bass.dll macht.

    Kannst du da einen Vorschlag machen?

    (Aber grundsätzlich gebe ich dir recht: die Beep-Funktion ist wohl nicht geeignet, um einen Stereo-Tongenerator zu basteln.
    Hingegen mit bass.dll wirds wohl gehen - soll ja enorm mächtig sein)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @tron25 Oder ganz anders, erstelle eine Wave-Datei und spiele die ab.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    Kannst du da einen Vorschlag machen?


    In den Ferien hab ich ein wenig Zeit, da kann ich mal in den Tips&Tricks eine Anleitung machen, da zeige ich dann wie man ein Projekt vorbereitet(Für Windows, Linux und Android) und die BASS nutzt. Und ja die BASS ist wirklich sehr mächtig, aber ich finde auch für einsteiger geeignet. Weil viel Code zu finden ist und alles sehr gut Dokumentiert ist. Klar muss man sich damit beschäftigen, aber einen Verweis hinzufügen und eine DLL kopieren ist nicht schwer, viele kopieren Code, den finden die auch reichlich.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    @tron25 Ich würde Dir genau das gleiche wie @RodFromGermany vorschlagen. Eine, bzw mehrere Waves mit unterschiedlichen Frequenzen im Speicher zu erzeugen ist ja kein Hexenwerk. Alternativ nimmst halt fertige Wave-Dateien. Zum Abspielen der Waves gibt es diverse Möglichkeiten. z.B. per API PlaySound mit entsprechenden Flags z.B. das die Wave Asynchron, aus dem Speicher oder Ressource kommen usw. DirectSound und die MediaFoundation wären hier aber meine ersten Anlaufstellen. Beide Technologien ermöglichen es mehrere Waves gleichzeitig, Asynchron im Loop abzuspielen und während dessen kann auch noch die Balance zwischen rechts und links verändert werden. Du könntest Dir z.b. SharpDX anschauen -> github.com/sharpdx/SharpDX-Sam…ound/PlaySound/Program.cs
    Mfg -Franky-

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()

    Ich hab mal überlegt wie es am einfachsten mit der Bass ist, war mit wenigen Zeilen machbar. Um das zum laufen zu bekommen hier:
    un4seen.com/bass.html

    die Bass.dll(Win32) und auch die Bass.net runterladen. Die ZIPs entpacken, neues Projekt anlegen und einen Verweis auf die Bass24.Net\full\Bass.Net.dll aus dem BassNet Archiv machen. Im Bass24 archiv finden man die bass.dll, die muss noch in den Debug und Release Ordner kopiert werden. Achtet auf die Achitektur, die 64 Bit DLL ist im Archiv im Ordner x64.

    Der Code ist jetzt nicht Dokumentiert,
    EDIT: habs ein wenig dokumentiert.

    aber die Funktionen der bass einfach ergooglen oder die mitgelieferten CHM(Hilfe) Dateien nutzen. Sollte jedenfalls klar sein was passiert. Ein "leerer" Stream läuft, diesen geben wir Daten in Form eine Sinusförmigen Signals. So kannst du nun für links und rechts verschiedene Frequenzen und auch Lautstärke einstellen. Lautstärke ist gedacht in der Range von 0 bis 1.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Runtime.InteropServices
    3. Imports Un4seen.Bass
    4. Public Class Form1
    5. 'handle für den audio stream
    6. Private streamHandle As Integer = 0
    7. 'STREAMPROC delegate, "zeigt" dann auf die angegebene Funktion die dann regelmäig gecallt wird
    8. Private streamProc As STREAMPROC
    9. Private Sub ButtonStopGeneration_Click(sender As Object, e As EventArgs) Handles ButtonStopGeneration.Click
    10. Bass.BASS_ChannelStop(streamHandle)
    11. streamProc = Nothing
    12. Bass.BASS_StreamFree(streamHandle)
    13. End Sub
    14. Private Sub ButtonStartGeneration_Click(sender As Object, e As EventArgs) Handles ButtonStartGeneration.Click
    15. 'neues STREAMPROC, "zeigt" auf die Sub StreamProcCallback
    16. streamProc = New STREAMPROC(AddressOf StreamProcCallback)
    17. 'das handle für den Stream erstellen
    18. streamHandle = Bass.BASS_StreamCreate(44100, 2, BASSFlag.BASS_SAMPLE_FLOAT, streamProc, IntPtr.Zero)
    19. 'den stream starten
    20. Bass.BASS_ChannelPlay(streamHandle, False)
    21. End Sub
    22. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    23. If Not Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, IntPtr.Zero) Then
    24. MessageBox.Show($"BASS Initialisierungsfehler: { Bass.BASS_ErrorGetCode() }")
    25. Application.Exit()
    26. End If
    27. End Sub
    28. ' http://bass.radio42.com/help/html/c3034602-9916-2a02-f21a-63ec100a8959.htm
    29. Private Function StreamProcCallback(handle As Integer, buffer As IntPtr, length As Integer, user As IntPtr) As Integer
    30. 'einen puffer anlegen um Daten aus und in den Speicher zu kopieren
    31. Dim buff As Byte() = New Byte(length) {}
    32. 'die Daten aus dem Speicher in unseren Puffer kopieren, die Daten sind "stumm" weil nichts im Stream zum abspielen da ist
    33. Marshal.Copy(buffer, buff, 0, length)
    34. Dim samplerate As Double = 44100D
    35. Dim waveFrequencyLeft As Double = 500D 'frequenz in Hz linker Kanal
    36. Dim waveFrequencyRight As Double = 1000D 'frequenz in Hz rechter Kanal
    37. Dim gainLeft As Double = 1D 'lautstärke linker Kanal
    38. Dim gainRight As Double = 1D 'lautstärke rechter Kanal
    39. 'die einzelnen Samples erstellen, jedes Sample besteht aus 8 Bytes, je 2 Singles(2x 4 Bytes), je einmal für links und einmal für rechts
    40. For i As Integer = 0 To buff.Length - 9 Step 8
    41. Dim left As Single = CSng(Math.Sin(i / 8D * 2D * Math.PI * waveFrequencyLeft / samplerate) * gainLeft)
    42. Dim right As Single = CSng(Math.Sin(i / 8D * 2D * Math.PI * waveFrequencyRight / samplerate) * gainRight)
    43. 'die bytes für den Puffer
    44. Dim bytesLeft As Byte() = BitConverter.GetBytes(left)
    45. Dim bytesRight As Byte() = BitConverter.GetBytes(right)
    46. 'die bytes in unseren Puffer kopieren
    47. Array.Copy(bytesLeft, 0, buff, i, 4)
    48. Array.Copy(bytesRight, 0, buff, i + 4, 4)
    49. Next
    50. 'die Daten aus unseren Puffer in den Speicher kopieren, damit sie nun abgespielt werden können.
    51. Marshal.Copy(buff, 0, buffer, length)
    52. Return length
    53. End Function
    54. End Class



    tron25 schrieb:

    Declare Function Beep Lib "kernel32.dll" (ByVal dwFreq As Int32, ByVal dwDuration As Int32) As Int32
    Public Sub Tonausgabe(Frequenz As Integer, Dauer As Integer)
    Beep(Frequenz, Dauer)
    End Sub


    Aus dem Code, mach einfach folgendes. Gibst du den Entrypoint an, kannst du die Funktionen benennen wie du willst "Beep" wird dann gecallt, so sparste dir die "Wrapper-Funktion".

    VB.NET-Quellcode

    1. <DllImport("kernel32.dll", EntryPoint:="Beep")>
    2. Private Shared Function TonAusgabe(dwFreq As Integer, ByVal dwDuration As Integer) As Boolean
    3. End Function


    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von „DTF“ ()

    @tron25 Beschreib mal, was genau Du erreichen willst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Auf der Form sollen 5 Slider für links und 5 für rechts sein. Jeder Slider zeigt die Frequenz eines Tones. Zu Beginn stehen alle auf 0. Dann beginnt man mit dem ersten Slider für das linke Ohr und schiebt ihn soweit, bis der erste Ton die Komplementärfrequenz des lautesten Tinnituston auf dem linken Ohr erreicht. Das Gleiche macht man, bis alle Töne im linken Ohr neutralisiert sind. Das Gleiche macht man dann mit der rechten Seite. Im besten Fall hat man am Ende den ganzen Tinnitus abgeschaltet. Ich habe mal gelesen, dass man dadurch eventuell bei mehrfacher Anwendung seinen Tinnitus abschwächen oder gar wegbekommen kann.
    So, jetzt habe ich die Zips heruntergeladen, die Dateien in den Debug-Ordner kopier, die entsprechenden Verweise gemacht und den Quellcode eingefügt.

    Es funktioniert und ich bin dabei, immer mehr durchzublicken.

    Jetzt möchte ich, dass beispielsweise mehere Töne auf der linken Seite abgespielt werden. Kann ich für rechts und links beliebig viele Frequenzen einfügen?

    Danke
    Was meinst du mit "mehreren Tönen"? Gleichzeitig oder nacheinander?



    "Frequenzen einfügen" ist der falsche Denk-Ansatz.
    In der Methode StreamProcCallback() wird ein Buffer mit Sample-Daten befüllt.
    Dieser Buffer wird der Bass.dll übergeben.
    Die Sample-Rate ist 44100, also pro Sekunde will die Bass.dll 44100 Werte haben. Diese Werte bilden die Schwingung ab.
    Also jeder Wert ist ein kleines bischen grösser (oder kleiner) als der vorherige, und wenn man die alle auf ein Diagramm auftragen würde, könnte man von weitem erkennen, dass sie zusammen eine Sinus-Schwingung darstellen.

    Anders gesagt: Im buffer wird der momentane Schalldruck auf die 400-tausendstel Sekunde genau dargestellt. Dadurch hast du volle Kontrolle und kannst theoretisch jedes nur denkbare Geräusch abbilden: Jede Frequenz (bis ca. 20.000 Hertz), auch Überlagerungen, auch andere Schwingungs-Arten, wie Rechteck- oder Sägezahn-Signale.

    Das Problem wird sein, den Buffer-Inhalt richtig zu berechnen.

    Ich hab übrigens eine kleine Klasse gebastelt, die für eine Sinus-Schwingung die Samples-Werte einen nach dem anderen ausgibt:

    VB.NET-Quellcode

    1. Public Class SinusSample
    2. Public Const Samplerate As Integer = 44100
    3. Public Frequency As Integer = 500
    4. Public Gain As Double = 1.0 'Amplitude (lautstärke )
    5. Private _Step As Integer = Frequency
    6. Public Function GetNextValue() As Single
    7. _Step += 1
    8. If _Step = Frequency Then _Step = 0
    9. Return CSng(Math.Sin(_Step * 2.0 * Math.PI * Frequency / Samplerate) * Gain)
    10. End Function
    11. End Class

    Davon erstelle ich zwei Objekte, bei denen je eine andere Frequenz eingestellt ist.
    So kann ich auf dem linken Kanal eine Schwingung ausgeben, und rechts eine andere:

    VB.NET-Quellcode

    1. Private buff(15) As Single
    2. Private _Smpls As SinusSample() = {New SinusSample With {.Frequency = 350}, New SinusSample With {.Frequency = 500}} 'left, right
    3. Private Function StreamProcCallback(handle As Integer, ptrBuf As IntPtr, length As Integer, user As IntPtr) As Integer
    4. Dim len = length \ 4
    5. If buff.Length < len Then ReDim buff(len - 1)
    6. For i As Integer = 0 To len - 2 Step 2
    7. buff(i) = _Smpls(0).GetNextValue
    8. buff(i + 1) = _Smpls(1).GetNextValue
    9. Next
    10. Marshal.Copy(buff, 0, ptrBuf, len)
    11. Return length
    12. End Function

    Ich könnte die beiden SinusSample-Ausgaben auch zusammen-addieren, und auf einem Kanal ausgeben.
    Ich könnte auch noch mehr SinusSample-Objekte erstellen, und links und rechts, eine oder mehrere Schwingungen ausführen.
    Dateien
    • BassTester00.zip

      (218,57 kB, 41 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @tron25 Um den Code vom ErfinderDesRades, zu nutzen, müsste der Stream angepasst werden. Ich habe den mit 32 Bit erstellt,
    streamHandle = Bass.BASS_StreamCreate(44100, 2, BASSFlag.BASS_SAMPLE_FLOAT, streamProc, IntPtr.Zero)

    Wenn BASS_SAMPLE_8BITS verwendet wird hat man 8 Bit, keine Angabe dazu 16 Bit und BASS_SAMPLE_FLOAT ist dann 32 Bit. EDRs Code ist auf 16 Bit ausgelegt, dann den Stream so erzeugen:
    streamHandle = Bass.BASS_StreamCreate(44100, 2, BASSFlag.BASS_DEFAULT, streamProc, IntPtr.Zero)
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Ein Tinnitus kann auf jedem Ohr aus mehreren Tönen bestehen. Ich höre links beispielsweise mindestens zwei Töne. Der eine ist lauter und höher, als der andere. Auf dem rechten Ohr ist es derzeit nur einer. Der laute Ton ist etwa bei 2000 hz und die Anderen bei ca. 1200 hz.

    Es leuchtet mir nicht richtig ein, das zwei Töne durch Addition dargestellt werden können. Ich höre deutlich einen Unterschied zwischen den Tönen.

    Wenn ich beispielsweise 8 Byte für beide Kanäle habe, wie kann ich dann mehrere Töne ausgeben lassen, wenn ein Ton für eine Seite schon die Hälfte belegt? Irgendwie schaue ich da doch nicht so gut durch, wie ich anfangs dachte.

    tron25 schrieb:

    Wenn ich beispielsweise 8 Byte für beide Kanäle habe


    Bei 8 Bytes pro Sample mit 2 Kanälen also 4 Byte pro Kanal hast du mehr als ausreichend Range. Schon bei 8 Bit also einen Byte pro Kanal. Du darfst nicht vergessen, das bei einer Samplerate(Abtastrate) von 44100hz halt pro Sekunde 44100 solcher Samples anfallen, 44100 x 8 = 352800 Bytes pro Sekunde. Bei jeden neuen Sample geht die Sinuskurve rauf oder runter, je höher die Bitbreite umso höher die Auflösung. Wie oft ein Zyklus pro Sekunde durchläuft, ist die Frequenz in Hertz. 20 Hz heist also, das pro Sekunde 20 mal die Kurve komplett ansteigt und auch abfällt. Das spiegeln wir in den Samples wieder.

    Nutze einfach mehrere Streams!

    VB.NET-Quellcode

    1. Private Function StreamProcCallback(handle As Integer, buffer As IntPtr, length As Integer, user As IntPtr) As Integer
    2. 'die parameter handle verrät um welchen Stream es sich Handelt.

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „DTF“ ()

    tron25 schrieb:

    Es leuchtet mir nicht richtig ein, das zwei Töne durch Addition dargestellt werden können.

    Das sind aber die physikalischen Grundlagen des Hörens.
    Beim Hören werden kleine Druckschwankungen der Luft wahrgenommen, welche durch schwingende Körper erzeugt wurden.
    Befinden sich mehrere schwingende Körper im Hörweite, so ergeben sich die am Trommelfell auftreffenden Druckschwankungen als Addition der Druckschwankungen, die durch die mehreren schwingenden Körper erzeugt wurden.
    Der Aufbau des Innenohrs, und die Verdrahtung des Nervensystems sind imstande, diese "überlagerten" Schwingungen zu analysieren und wieder auseinanderdividieren, sodass im Gehirn der Hör-Eindruck mehrerer Töne entsteht.

    Eine Lautsprecherbox, oder ein KopfHörer, kann derlei überlagerte Schwingungen auch direkt erzeugen (quasi als ein Körper mit vielen Schwingungen).
    Und diese "nachgemachten" Schwingungs-Überlagerungen sind schon ziemlich perfekt.
    Aber als Nachbildung bleiben sie natürlich immer hinter dem "Live"-Erlebnis zurück, etwa dem eines Orgelkonzertes.

    Wie dem auch sei.
    Wenn die bass.dll einen buffer bekommt mit den elektrischen Äquivalenten der Druckschwankungen, wie sie durch Überlagerung mehrerer Schwingungen entstehen - dann erklingt aus dem Lautsprecher ein Akkord mehrerer Töne.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich vergaß noch zu erwähnen, du kannst auch ein Stream mit nur einen Kanal erzeugen, diesen Stream in den Soundkartenausgang deiner Wahl leiten. Das geht mit einer MixerMatrix, dazu brauchst du dann aber eine weitere DLL(BassMix), kannst du auch bei Un4seen runterladen. Brauchst du wie die bass.dll dann nur in den Debug/Release-Ordner kopieren.
    bass.radio42.com/help/html/f28…ce3-9470-39b6f2a110d0.htm

    Damit hab ich z.B. ein Stereo zu bis zu 7.1 Upmix realisiert.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    tron25 schrieb:

    Es leuchtet mir nicht richtig ein, das zwei Töne durch Addition dargestellt werden können.
    Symboische Formel:

    Quellcode

    1. Auslenkung(Zeitpunkt) = Faktor1 * Sin(Frequenz1 * Zeitpunkt) + Faktor2 * Sin(Frequenz2 * Zeitpunkt) + Faktor3 * Sin(Frequenz3 * Zeitpunkt) + ...
    Die Faktoren sind die Amplitudenverhältnisse der Frequenzen zueinander.
    Um einen Wave zu erzeugen, musst Du die Formel für alle gewünschten Zeitpunkte ausrechnen und die Summenwerte noch für die entsprechende Wave-Auflösung normieren.
    Die Phasenlage der Frequenzen zueinander spielt akustisch KEINE Rolle.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Die Phasenlage der Frequenzen zueinander spielt akustisch KEINE Rolle
    Das ist ja komisch, denn Sin(x) = -Sin(x+pi)
    Also hab ich nu zwei Formeln, die sich nur in der Phase unterscheiden und ganz unterschiedliche Ergebnisse liefern:

    Quellcode

    1. Faktor1 * Sin(Frequenz1 * Zeitpunkt) + Faktor1 * Sin(Frequenz1 * Zeitpunkt) = 2*Faktor1*Sin(Frequenz1 * Zeitpunkt)
    2. Faktor1 * Sin(Frequenz1 * Zeitpunkt + PI) + Faktor1 * Sin(Frequenz1 * Zeitpunkt) = 0

    Haudruferzappeltnoch schrieb:

    und ganz unterschiedliche Ergebnisse liefern:
    Klar.
    Dann lies mal meinen Post aufmerksam durch:

    RodFromGermany schrieb:

    Die Phasenlage der Frequenzen zueinander spielt akustisch KEINE Rolle.
    Das bedeutet, dass der akustische Eindruck im Ohr / Kopf unabhängig von der Phase ist, das wurde uns im Studium experimentell vermittelt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Tja, wenn die Formel sagt 0, dann hör ich nix, da bin ich sicher das wird auch experimentell nachvollziehbar sein.
    Und wenn die Formel sagt nicht 0, dann hör ich was, auch das sollte experimentell nachvollziehbar sein.
    Also was verstehst du unter "akustisch eine Rolle spielen"?

    Dass ich eine einzelne Welle höre egal in welcher Phase diese ist, das kann ich nachvollziehen. Aber bei mehreren Wellen kann es nun mal zu Auslöschung und Verstärkung kommen.
    Vielleicht ging es da im Studium um einen Spezialfall.
    Die Verschiebung der Phase von interferierenden Lichtwellen wird zum detektieren von Gravitationswellen ausgenutzt. In dem Moment, wo sich die Phase verschiebt, kann man eine Veränderung des Interferenzmusters beobachten. Sicherlich komplexer als mein Beispiel, aber dafür ein realer Anwendungsfall dieses Sachverhalts

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()