Делаю генератор синусоидального, прямоугольного, треугольного формата сигнала и шума. Но вот издаются щелчки звуковые. В чём проблема может быть?  
  
  
 
#WAVE_BUFFER_SIZE = 44100 * 4
#WAVE_TICK_PRECS  = 0.0000000000000000001
Define  WaveIn, WaveOut
Define  WaveNoizeBoolean            = 1
Define  WaveNoizeVolumeLevel.d      = 0.00001
Define  WaveNoizeMergeLevel.d       = 0.4986750000000000001
Define  WaveNoizeSeparation.d       = 1 - WaveNoizeMergeLevel
Define  WaveNoizeShapeModulation    = 1
Define  WaveNoizePanopticum         = 1
Define  WaveSinusBoolean            = 1
Define  WaveSinusVolumeLevel.d      = 0.5
Define  WaveSinusTempoPrevious.d
Define  WaveSinusFrequency.d        = 20
Define  WaveSquareBoolean           = 1
Define  WaveSquareVolumeLevel.d     = 0.001965
Define  WaveSquareTempoPrevious.d
Define  WaveSquareFrequency         = 20
Define  WaveTriangleBoolean         = 1
Define  WaveTriangleVolumeLevel.d   = 0.6
Define  WaveTriangleTempoPrevious.d
Define  WaveTriangleFrequency.d     = 20
Define  WaveSawBoolean              = 0
Define  WaveSawVolumeLevel.d        = 0.5
Define  WaveSawFrequency            = 20
Define  WaveSawDeformation.d        = 0.5
Define  WaveLineInBoolean           = 0
Define  WaveLineInVolumeLevel.d     = 0.70
Define  MasterHarmonicsLevel.d      = 0.0025
Define  MasterVolumeLevel.d         = 0.9896605
Define  CurrentOutBuffer            = 1
Define  CurrentInMemoryBlock        = 1
Structure WAVETICKSTEREO
  First.u
  Second.u
EndStructure
WaveFormatEx.WAVEFORMATEX
With  WaveFormatEx
  \wFormatTag       = #WAVE_FORMAT_PCM
  \nChannels        = 2
  \nSamplesPerSec   = 44100
  \nAvgBytesPerSec  = \nSamplesPerSec * \nChannels  * SizeOf(Word)
  \nBlockAlign      = \nChannels  * SizeOf(Word)
  \wBitsPerSample   = 16
  \cbSize           = SizeOf(WAVEFORMATEX)
EndWith
Define  WaveHdr1.WAVEHDR    : WaveHdr2.WAVEHDR    : WaveHdr3.WAVEHDR
Define  WaveRecHdr1.WAVEHDR : WaveRecHdr2.WAVEHDR : WaveRecHdr3.WAVEHDR
With  WaveHdr1
  \lpData         = AllocateMemory(#WAVE_BUFFER_SIZE)
  \dwBufferLength = #WAVE_BUFFER_SIZE
  \dwLoops        = 1
EndWith
With  WaveHdr2
  \lpData         = AllocateMemory(#WAVE_BUFFER_SIZE)
  \dwBufferLength = #WAVE_BUFFER_SIZE
  \dwLoops        = 1
EndWith
With  WaveHdr3
  \lpData         = AllocateMemory(#WAVE_BUFFER_SIZE)
  \dwBufferLength = #WAVE_BUFFER_SIZE
  \dwLoops        = 1
EndWith
With  WaveRecHdr1
  \lpData         = AllocateMemory(#WAVE_BUFFER_SIZE)
  \dwBufferLength = #WAVE_BUFFER_SIZE        
EndWith
With  WaveRecHdr2
  \lpData         = AllocateMemory(#WAVE_BUFFER_SIZE)
  \dwBufferLength = #WAVE_BUFFER_SIZE
EndWith
With  WaveRecHdr3
  \lpData         = AllocateMemory(#WAVE_BUFFER_SIZE)
  \dwBufferLength = #WAVE_BUFFER_SIZE
EndWith
Define  *CurrentInPointer.WAVETICKSTEREO  = WaveRecHdr1\lpData
Global  Dim *CurrentInBuffer(3)
*CurrentInBuffer(1)  = WaveRecHdr1\lpData  + #WAVE_BUFFER_SIZE
*CurrentInBuffer(2)  = WaveRecHdr2\lpData  + #WAVE_BUFFER_SIZE
*CurrentInBuffer(3)  = WaveRecHdr1\lpData  + #WAVE_BUFFER_SIZE
Procedure GenerateWaveLine(*Buffer)
  Shared  WaveNoizeShapeModulation, WaveNoizePanopticum
  Shared  WaveNoizeBoolean, WaveSinusBoolean, WaveSquareBoolean,  WaveTriangleBoolean, WaveSawBoolean,  WaveLineInBoolean
  Shared  WaveNoizeVolumeLevel,     WaveNoizeMergeLevel,    WaveNoizeSeparation
  Shared  WaveSinusVolumeLevel,     WaveSinusFrequency,     WaveSinusTempoPrevious
  Shared  WaveSquareVolumeLevel,    WaveSquareFrequency,    WaveSquareTempoPrevious
  Shared  WaveTriangleVolumeLevel,  WaveTriangleFrequency,  WaveTriangleTempoPrevious
  Shared  WaveSawVolumeLevel,       WaveSawFrequency,       WaveSawDeformation
  Shared  *CurrentInPointer, CurrentInMemoryBlock, WaveLineInVolumeLevel
  Shared  MasterVolumeLevel,  MasterHarmonicsLevel
  wSin.d      = 2 * #PI * WaveSinusFrequency
  wSquare.d   = 2 * #PI * WaveSquareFrequency
  wTriangle.d = 2 * #PI * WaveTriangleFrequency
  *u16CurrentTick.WAVETICKSTEREO  = *Buffer
  *Overflow                       = *u16CurrentTick + #WAVE_BUFFER_SIZE
  While (*u16CurrentTick  < *Overflow)
    If  (WaveNoizeBoolean = 1)
      If  (WaveNoizePanopticum = 1)
        FirstChannelPanMeter.d  = 1
        SecondChannelPanMeter.d = 0.99
        WaveNoizePanopticum     = 2
      Else
        FirstChannelPanMeter  = 0.99
        SecondChannelPanMeter = 1
        WaveNoizePanopticum   = 1
      EndIf
      NoizeTickValueFirst.d = (Random(65535) - WaveNoizeShapeModulation) * WaveNoizeVolumeLevel  * FirstChannelPanMeter
      If  (NoizeTickValueFirst  <= 0)
        NoizeTickValueFirst = #WAVE_TICK_PRECS
      EndIf
      NoizeTickValueSecond.d = (Random(65535) - WaveNoizeShapeModulation) * WaveNoizeVolumeLevel  * FirstChannelPanMeter
      If  (NoizeTickValueSecond  <= 0)
        NoizeTickValueSecond = #WAVE_TICK_PRECS
      EndIf
      NoizeAverage.d          = 0.5 *  (NoizeTickValueFirst  + NoizeTickValueSecond)
      NoizeTickValueFirst   = (NoizeTickValueFirst  * WaveNoizeSeparation)  + (NoizeAverage  * WaveNoizeMergeLevel)
      NoizeTickValueSecond  = (NoizeTickValueSecond * WaveNoizeSeparation)  + (NoizeAverage  * WaveNoizeMergeLevel)
    Else
      NoizeTickValueFirst   = 0.5 * 65536
      NoizeTickValueSecond  = 0.5 * 65536
    EndIf
    
    If  (WaveSinusBoolean = 1)
      tSin.d          = GeneratorCounter / 44100 + WaveSinusTempoPrevious
      SinusTickValue.d  = ((0.5 *(Sin(wSin * tSin)  + 1))  * 65535  * WaveSinusVolumeLevel)
    EndIf
    
    If  (WaveSquareBoolean  = 1)
      tSquare.d = GeneratorCounter  / 44100 + WaveSquareTempoPrevious
      SinWT.d   = Sin(wSquare * tSquare)
      If  (SinWT  >=  0)
        SquareTickValueSigned.d =   (32767 * WaveSquareVolumeLevel)
      Else
        SquareTickValueSigned = - (32768 * WaveSquareVolumeLevel)
      EndIf
      SquareTickValue.d = SquareTickValueSigned + 32767.5
    EndIf
    
    If  (WaveTriangleBoolean  = 1)
      tTriangle = 44100 / WaveTriangleFrequency
      xTriangle = (((GeneratorCounter - tTriangle / 4)  % tTriangle)  + tTriangle)  % tTriangle - (0.5 * tTriangle)
      TriangleTickValue.d = 4 * 32768 / tTriangle * Abs(xTriangle) - 32768
      TriangleTickValue + 32767.5
      TriangleTickValue * WaveTriangleVolumeLevel
    EndIf
    
    If  (WaveSawBoolean = 1)
      tSaw          = 44100 / WaveSawFrequency
      SawTickValue  = 2  * (32768  * WaveSawVolumeLevel)
      SawTickValue  * ((GeneratorCounter  + tSaw) % tSaw) / tSaw - (32768 * WaveSawVolumeLevel)
      If  (SawPhase = 0)
        SawTickValue  + Random(Abs(SawTickValue  * WaveSawDeformation))
        SawPhase      = 1
      Else
        SawTickValue  - Random(Abs(SawTickValue * WaveSawDeformation))
        SawPhase      = 0
      EndIf
    EndIf
    
    BusCount  = WaveNoizeBoolean  + WaveSinusBoolean  + WaveSquareBoolean + WaveTriangleBoolean + WaveSawBoolean  + WaveLineInBoolean
    If (BusCount  = 0)
      BusCount  = 1
    EndIf
    FirstChannelTickValue.d   = (NoizeTickValueFirst  + SinusTickValue  + SquareTickValue + TriangleTickValue + SawTickValue  + *CurrentInPointer\First)  / BusCount  * MasterVolumeLevel
    SecondChannelTickValue.d  = (NoizeTickValueSecond + SinusTickValue  + SquareTickValue + TriangleTickValue + SawTickValue  + *CurrentInPointer\Second) / BusCount  * MasterVolumeLevel
    
    If  (FirstChannelTickValue  <  0)
      FirstChannelTickValue = 0
    EndIf
    If  (SecondChannelTickValue <  0)
      SecondChannelTickValue  = 0
    EndIf
    
    If  (MasterHarmonicsPhase = 0)
      FirstChannelTickValue   + (Random(FirstChannelTickValue)  * MasterHarmonicsLevel)
      SecondChannelTickValue  + (Random(SecondChannelTickValue) * MasterHarmonicsLevel)
      MasterHarmonicsPhase  = 1
    Else
      FirstChannelTickValue   - (Random(FirstChannelTickValue)  * MasterHarmonicsLevel)
      SecondChannelTickValue  - (Random(SecondChannelTickValue) * MasterHarmonicsLevel)
      MasterHarmonicsPhase  = 0
    EndIf
    
    DeformationOperationId  = Random(2)
    If  (DeformationOperationId = 0)
      *u16CurrentTick\First   = Int(Round(FirstChannelTickValue,  #PB_Round_Nearest))
      *u16CurrentTick\Second  = Int(Round(SecondChannelTickValue, #PB_Round_Nearest))
    ElseIf  (DeformationOperationId = 1)
      *u16CurrentTick\First   = Int(Round(FirstChannelTickValue,  #PB_Round_Up))
      *u16CurrentTick\Second  = Int(Round(SecondChannelTickValue, #PB_Round_Up))
    Else
      *u16CurrentTick\First   = Int(Round(FirstChannelTickValue,  #PB_Round_Down))
      *u16CurrentTick\Second  = Int(Round(SecondChannelTickValue, #PB_Round_Down))
    EndIf
    
    If  (WaveNoizeShapeModulation = 1)
      WaveNoizeShapeModulation  = 0
    EndIf
    
    *CurrentInPointer       + SizeOf(WAVETICKSTEREO)
    *CurrentInPointerBuffer = *CurrentInBuffer(CurrentInMemoryBlock)
    *CurrentInOverflow      = *CurrentInPointerBuffer + #WAVE_BUFFER_SIZE
    While (*CurrentInPointer  >= *CurrentInOverflow)
      *CurrentInPointer = *CurrentInPointerBuffer
    Wend
    
    GeneratorCounter + 1
    
    *u16CurrentTick   + SizeOf(WAVETICKSTEREO)
  Wend
  *u16CurrentTick.WAVETICKSTEREO  = *Buffer
      
  WaveSinusTempoPrevious    = tSin
  WaveSquareTempoPrevious   = tSquare
EndProcedure
Procedure WaveOutOpenCallback(hwo,  Message,  Instance.l, Param1.l, Param2.l)
  Shared  WaveOut
  Shared  CurrentOutBuffer
  Shared  WaveHdr1, WaveHdr2, WaveHdr3
  If  (Message  = #WOM_DONE)
    If  (CurrentOutBuffer  = 1)
      GenerateWaveLine(WaveHdr2\lpData)
      waveOutWrite_   (WaveOut,  @WaveHdr2,  SizeOf(WAVEHDR))
      CurrentOutBuffer = 2 ;Next
    ElseIf  (CurrentOutBuffer  = 2)
      GenerateWaveLine(WaveHdr3\lpData)
      waveOutWrite_   (WaveOut,  @WaveHdr3,  SizeOf(WAVEHDR))
      CurrentOutBuffer = 3 ;Next
    Else
      GenerateWaveLine(WaveHdr1\lpData)
      waveOutWrite_   (WaveOut,  @WaveHdr1,  SizeOf(WAVEHDR))
      CurrentOutBuffer = 1 ;Next
    EndIf
  EndIf
EndProcedure
Procedure WaveInCallback(hwi, Message,  Instance.l, Param1.l, Param2.l)
  Shared  WaveRecHdr1,  WaveRecHdr2,  WaveRecHdr3,  CurrentInMemoryBlock, *CurrentInPointer
  If  (Message  = #WIM_DATA)
    CurrentInMemoryBlock  + 1
    If  (CurrentInMemoryBlock = 1)
      *CurrentInPointer = WaveRecHdr1\lpData
    ElseIf  (CurrentInMemoryBlock = 2)
      *CurrentInPointer = WaveRecHdr2\lpData
    ElseIf  (CurrentInMemoryBlock = 3)
      *CurrentInPointer = WaveRecHdr3\lpData
    ElseIf  (CurrentInMemoryBlock > 3)
      CurrentInMemoryBlock  = 1
    EndIf
  EndIf
EndProcedure
Procedure SetSliderPosition(SliderObj,  FloatValue.d)
  SetGadgetState(SliderObj, FloatValue  * 580)
EndProcedure
Macro SetEditValue(EditorObj, FloatValue)
  SetGadgetText(EditorObj, StrD(FloatValue))
EndMacro
Procedure.d GetSliderValue(SliderObj)
  ProcedureReturn GetGadgetState(SliderObj) / 580
EndProcedure
Procedure IsValidStrFloat(LpStrValue$)
  If  (StrD(ValD(LpStrValue$)) = LpStrValue$)
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure
Procedure.d GetEditValue(EditorGadget)
  LpStrValue$ = RemoveString  (GetGadgetText(EditorGadget),  " ")
  If  (LpStrValue$ = "")
    LpStrValue$ = "0"
  EndIf
  LpStrValue$ = ReplaceString (LpStrValue$, ",",  ".")
  If  (Right(LpStrValue$, 1)  = ".")
    LpStrValue$ + StrD(#WAVE_TICK_PRECS)
  EndIf
  If  (IsValidStrFloat(LpStrValue$))
    ProcedureReturn ValD(LpStrValue$)
  EndIf
  ProcedureReturn 0
EndProcedure
Procedure GenerateWaveInSilence()
  For i = 1 To  3
    FillMemory(*CurrentInBuffer(i), #WAVE_BUFFER_SIZE,  0,  #PB_Word)
  Next
EndProcedure
waveOutOpen_(@WaveOut,  #WAVE_MAPPER, @WaveFormatEx,  @WaveOutOpenCallback(), 0,  #CALLBACK_FUNCTION | #WAVE_ALLOWSYNC)
waveInOpen_ (@WaveIn,   #WAVE_MAPPER, @WaveFormatEx,  @WaveOutOpenCallback(), 0,  #CALLBACK_FUNCTION)
GenerateWaveLine(WaveHdr1\lpData)
GenerateWaveLine(WaveHdr2\lpData)
GenerateWaveLine(WaveHdr3\lpData)
waveOutPrepareHeader_(WaveOut,  @WaveHdr1,  SizeOf(WAVEHDR))
waveOutPrepareHeader_(WaveOut,  @WaveHdr2,  SizeOf(WAVEHDR))
waveOutPrepareHeader_(WaveOut,  @WaveHdr3,  SizeOf(WAVEHDR))
waveInPrepareHeader_(WaveIn,  @WaveRecHdr1, SizeOf(WAVEHDR))
waveInPrepareHeader_(WaveIn,  @WaveRecHdr2, SizeOf(WAVEHDR))
waveInPrepareHeader_(WaveIn,  @WaveRecHdr3, SizeOf(WAVEHDR))
WndMain = OpenWindow(#PB_Any, 0,  0,  720,  350,  "Noize Generator Frequency Modulationable", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Panel = PanelGadget(#PB_Any,  1,  1,  720,  500)
  AddGadgetItem(Panel,  -1, "Noize")
    TextGadget(#PB_Any, 5,  5,  150,  25, "Level:")
    cSliderNoizeVolume  = TrackBarGadget(#PB_Any, 5,  30,   580,  25, 1,  580)
    cEditNoizeVolume    = StringGadget  (#PB_Any, 585,  30,  125, 25, "")
    TextGadget(#PB_Any, 5,  70, 150,  25, "Merge Channels:")
    cSliderNoizeMerge   = TrackBarGadget(#PB_Any, 5,  95,  580,  25, 1,  580)
    cEditNoizeMerge     = StringGadget  (#PB_Any, 585,  95, 125,  25, "")
    cCheckNoize         = CheckBoxGadget(#PB_Any, 5,  120,  75, 25, "ON")
    If  (WaveNoizeBoolean)
      SetGadgetState(cCheckNoize, #PB_Checkbox_Checked)
    EndIf
    SetSliderPosition (cSliderNoizeVolume, WaveNoizeVolumeLevel)
    SetSliderPosition (cSliderNoizeMerge,  WaveNoizeMergeLevel)
    SetEditValue      (cEditNoizeVolume,   WaveNoizeVolumeLevel)
    SetEditValue      (cEditNoizeMerge,    WaveNoizeMergeLevel)
  AddGadgetItem(Panel,  -1, "Sinus")
    TextGadget(#PB_Any, 5,  5,  150,  25, "Frequency:")
    cSliderSineFreq = TrackBarGadget(#PB_Any, 5,  30, 580,  25, 1,  580)
    cEditSineFreq   = StringGadget  (#PB_Any, 585,  30,  125, 25, "")
    TextGadget(#PB_Any, 5,  70, 150,  25, "Level:")
    cSliderSineVolume = TrackBarGadget(#PB_Any, 5,  95,  580,  25, 1,  580)
    cEditSineVolume   = StringGadget  (#PB_Any, 585,  95, 125,  25, "")
    cCheckSine        = CheckBoxGadget(#PB_Any, 5,  120,  75, 25, "ON")
    If  (WaveSinusBoolean)
      SetGadgetState(cCheckSine,  #PB_Checkbox_Checked)
    EndIf
    SetSliderPosition (cSliderSineFreq,   WaveSinusFrequency  / 44100 / 2)
    SetSliderPosition (cSliderSineVolume, WaveSinusVolumeLevel)
    SetEditValue      (cEditSineFreq,     WaveSinusFrequency)
    SetEditValue      (cEditSineVolume,   WaveSinusVolumeLevel)
  AddGadgetItem(Panel,  -1, "Square")
    TextGadget(#PB_Any, 5,  5,  150,  25, "Frequency:")
    cSliderSquareFreq = TrackBarGadget(#PB_Any, 5,  30, 580,  25, 1,  580)
    cEditSquareFreq   = StringGadget  (#PB_Any, 585,  30,  125, 25, "")
    TextGadget(#PB_Any, 5,  70, 150,  25, "Level:")
    cSliderSquareVolume = TrackBarGadget(#PB_Any, 5,  95,  580,  25, 1,  580)
    cEditSquareVolume   = StringGadget  (#PB_Any, 585,  95, 125,  25, "")
    cCheckSquare        = CheckBoxGadget(#PB_Any, 5,  120,  75, 25, "ON")
    If  (WaveSquareBoolean)
      SetGadgetState(cCheckSquare,  #PB_Checkbox_Checked)
    EndIf
    SetSliderPosition (cSliderSquareFreq,   WaveSquareFrequency / 44100 / 2)
    SetSliderPosition (cSliderSquareVolume, WaveSquareVolumeLevel)
    SetEditValue      (cEditSquareFreq,     WaveSquareFrequency)
    SetEditValue      (cEditSquareVolume,   WaveSquareVolumeLevel)
  AddGadgetItem(Panel,  -1, "Triangle")
    TextGadget(#PB_Any, 5,  5,  150,  25, "Frequency:")
    cSliderTriangleFreq = TrackBarGadget(#PB_Any, 5,  30, 580,  25, 1,  580)
    cEditTriangleFreq   = StringGadget  (#PB_Any, 585,  30,  125, 25, "")
    TextGadget(#PB_Any, 5,  70, 150,  25, "Level:")
    cSliderTriangleVolume = TrackBarGadget(#PB_Any, 5,  95,  580,  25, 1,  580)
    cEditTriangleVolume   = StringGadget  (#PB_Any, 585,  95, 125,  25, "")
    cCheckTriangle        = CheckBoxGadget(#PB_Any, 5,  120,  75, 25, "ON")
    If  (WaveTriangleBoolean)
      SetGadgetState(cCheckTriangle,  #PB_Checkbox_Checked)
    EndIf
    SetSliderPosition (cSliderTriangleFreq,   WaveTriangleFrequency / 44100 / 2)
    SetSliderPosition (cSliderTriangleVolume, WaveTriangleVolumeLevel)
    SetEditValue      (cEditTriangleFreq,     WaveTriangleFrequency)
    SetEditValue      (cEditTriangleVolume,   WaveTriangleVolumeLevel)
  AddGadgetItem(Panel,  -1, "Saw")
    TextGadget(#PB_Any, 5,  5,  150,  25, "Frequency:")
    cSliderSawFreq  = TrackBarGadget(#PB_Any, 5,  30, 580,  25, 1,  580)
    cEditSawFreq    = StringGadget  (#PB_Any, 585,  30,  125, 25, "")
    TextGadget(#PB_Any, 5,  70, 150,  25, "Level:")
    cSliderSawVolume  = TrackBarGadget(#PB_Any, 5,  95,  580,  25, 1,  580)
    cEditSawVolume    = StringGadget  (#PB_Any, 585,  95, 125,  25, "")
    cCheckSaw         = CheckBoxGadget(#PB_Any, 5,  120,  75, 25, "ON")
    If  (WaveSawBoolean)
      SetGadgetState(cCheckSaw, #PB_Checkbox_Checked)
    EndIf
    SetSliderPosition (cSliderSawFreq,    WaveSawFrequency  / 44100 / 2)
    SetSliderPosition (cSliderSawVolume,  WaveSawVolumeLevel)
    SetEditValue      (cEditSawFreq,      WaveSawFrequency)
    SetEditValue      (cEditSawVolume,    WaveSawVolumeLevel)
  AddGadgetItem(Panel,  -1, "Line In")
    TextGadget(#PB_Any, 5,  5, 150,  25, "Level:")
    cSliderLineInVolume = TrackBarGadget(#PB_Any, 5,  30, 580,  25, 1,  580)
    cEditLineInVolume   = StringGadget(#PB_Any, 585,  30,  125, 25, "")
    cCheckLineIn        = CheckBoxGadget(#PB_Any, 5,  70,  75, 25, "ON")
    If  (WaveLineInBoolean)
      SetGadgetState(cCheckLineIn,  #PB_Checkbox_Checked)
      waveInStart_  (WaveIn)
    EndIf
    SetSliderPosition(cSliderLineInVolume,  WaveLineInVolumeLevel)
    SetEditValue(cEditLineInVolume, WaveLineInVolumeLevel)
  AddGadgetItem(Panel,  -1, "Mixer")
  TextGadget(#PB_Any, 5,  5, 150,  25, "Harmonics:")
  cSliderMixerHarms   = TrackBarGadget(#PB_Any, 5,  30, 580,  25, 1,  580)
  cEditMixerHarms     = StringGadget(#PB_Any, 585,  30,  125, 25, "")
  TextGadget(#PB_Any, 5,  70, 150,  25, "Level:")
  cSliderMixerVolume  = TrackBarGadget(#PB_Any, 5,  95,  580,  25, 1,  580)
  cEditMixerVolume    = StringGadget  (#PB_Any, 585,  95, 125,  25, "")
  SetSliderPosition (cSliderMixerHarms,  MasterHarmonicsLevel)
  SetSliderPosition (cSliderMixerVolume, MasterVolumeLevel)
  SetEditValue      (cEditMixerHarms,    MasterHarmonicsLevel)
  SetEditValue      (cEditMixerVolume,   MasterVolumeLevel)
  
  waveOutWrite_(WaveOut,  @WaveHdr1,  SizeOf(WAVEHDR))
  
While #True
  WndEvent = WaitWindowEvent()   
  Select  WndEvent
    Case  #PB_Event_CloseWindow
      End
    Case  #PB_Event_Gadget
      Select  EventGadget()
        Case  cSliderNoizeVolume
          WaveNoizeVolumeLevel  = GetSliderValue(cSliderNoizeVolume)
          SetEditValue(cEditNoizeVolume,  WaveNoizeVolumeLevel)
        Case  cEditNoizeVolume
          WaveNoizeVolumeLevel  = GetEditValue(cEditNoizeVolume)
          SetSliderPosition(cSliderNoizeVolume, WaveNoizeVolumeLevel)
        Case  cSliderNoizeMerge
          WaveNoizeMergeLevel   = GetSliderValue(cSliderNoizeMerge)
          SetEditValue(cEditNoizeMerge,  WaveNoizeMergeLevel)
        Case  cEditNoizeMerge
          WaveNoizeMergeLevel = GetEditValue(cEditNoizeMerge)
          SetSliderPosition(cSliderNoizeMerge,  WaveNoizeMergeLevel)
        Case  cCheckNoize
          If  (GetGadgetState(cCheckNoize)  = #PB_Checkbox_Checked)
            WaveNoizeBoolean  = 1
          Else
            WaveNoizeBoolean  = 0
          EndIf
        
        Case  cSliderSineFreq
          WaveSinusFrequency  = 44100 / 2 * GetSliderValue(cSliderSineFreq)
          SetEditValue(cEditSineFreq, WaveSinusFrequency)
        Case  cEditSineFreq
          WaveSinusFrequency  = GetEditValue(cEditSineFreq)
          SetSliderPosition(cSliderSineFreq,  WaveSinusFrequency  / (44100 / 2))
        Case  cSliderSineVolume
          WaveSinusVolumeLevel  = GetSliderValue(cSliderSineVolume)
          SetEditValue(cEditSineVolume, WaveSinusVolumeLevel)
        Case  cEditSineVolume
          WaveSinusVolumeLevel  = GetEditValue(cEditSineVolume)
          SetSliderPosition(cSliderSineVolume,  WaveSinusVolumeLevel)
        Case  cCheckSine
          If  (GetGadgetState(cCheckSine) = #PB_Checkbox_Checked)
            WaveSinusBoolean  = 1
          Else
            WaveSinusBoolean  = 0
          EndIf
        
        Case  cSliderSquareFreq
          WaveSquareFrequency = 44100 / 2 * GetSliderValue(cSliderSquareFreq)
          SetEditValue(cEditSquareFreq, WaveSquareFrequency)
        Case  cEditSquareFreq
          WaveSquareFrequency = GetEditValue(cEditSquareFreq)
          SetSliderPosition(cEditSquareFreq, WaveSquareFrequency  / (44100 / 2))
        Case  cSliderSquareVolume
          WaveSquareVolumeLevel = GetSliderValue(cSliderSquareVolume)
          SetEditValue(cEditSquareVolume, WaveSquareVolumeLevel)
        Case  cEditSquareVolume
          WaveSquareVolumeLevel = GetEditValue(cEditSquareVolume)
          SetSliderPosition(cSliderSquareVolume,  WaveSquareVolumeLevel)
        Case  cCheckSquare
          If  (GetGadgetState(cCheckSquare) = #PB_Checkbox_Checked)
            WaveSquareBoolean = 1
          Else
            WaveSquareBoolean = 0
          EndIf
        
        Case  cSliderTriangleFreq
          WaveTriangleFrequency = 44100 / 2 * GetSliderValue(cSliderTriangleFreq)
          SetEditValue(cEditTriangleFreq, WaveTriangleFrequency)
        Case  cEditTriangleFreq
          WaveTriangleFrequency = GetEditValue(cEditTriangleFreq)
          SetSliderPosition(cSliderTriangleFreq,  WaveTriangleFrequency / (44100 / 2))
        Case  cSliderTriangleVolume
          WaveTriangleVolumeLevel = GetSliderValue(cSliderTriangleVolume)
          SetEditValue(cEditTriangleVolume, WaveTriangleVolumeLevel)
        Case  cEditTriangleVolume
          WaveTriangleVolumeLevel = GetEditValue(cEditTriangleVolume)
          SetSliderPosition(cSliderTriangleVolume,  cEditTriangleVolume)
        Case  cCheckTriangle
          If  (GetGadgetState(cCheckTriangleeck)  = #PB_Checkbox_Checked)
            WaveTriangleBoolean = 1
          Else
            WaveTriangleBoolean = 0
          EndIf
          
        Case  cSliderSawFreq
          WaveSawFrequency  = 44100 / 2 * GetSliderValue(cSliderSawFreq)
          SetEditValue(cEditSawFreq,  WaveSawFrequency)
        Case  cEditSawFreq
          WaveSawFrequency  = GetEditValue(cEditSawFreq)
          SetSliderPosition(cSliderSawFreq, WaveSawFrequency  / (44100  / 2))
        Case  cSliderSawVolume
          WaveSawVolumeLevel  = GetSliderValue(cSliderSawVolume)
          SetEditValue(cEditSawVolume,  WaveSawVolumeLevel)
        Case  cEditSawVolume
          WaveSawVolumeLevel  = GetEditValue(cEditSawVolume)
          SetSliderPosition(cSliderSawVolume, WaveSawVolumeLevel)
        Case  cCheckSaw
          If  (GetGadgetState(cCheckSaw)  = #PB_Checkbox_Checked)
            WaveSawBoolean  = 1
          Else
            WaveSawBoolean  = 0
          EndIf
        
        Case  cSliderLineInVolume
          WaveLineInVolumeLevel = GetSliderValue(cSliderLineInVolume)
          SetEditValue(cEditLineInVolume, WaveLineInVolumeLevel)
        Case  cEditLineInVolume
          WaveLineInVolumeLevel = GetEditValue(cEditLineInVolume)
          SetSliderPosition(cSliderLineInVolume,  WaveLineInVolumeLevel)
        Case  cCheckLineIn
          If  (GetGadgetState(cCheckLineIn) = #PB_Checkbox_Checked)
            WaveLineInBoolean = 1
            waveInStart_(WaveIn)
          Else
            WaveLineInBoolean = 0
            waveInStop_(WaveIn)
            GenerateWaveInSilence()
          EndIf
          
        Case  cSliderMixerHarms
          MasterHarmonicsLevel  = GetSliderValue(cSliderMixerHarms)
          SetEditValue(cEditMixerHarms, MasterHarmonicsLevel)
        Case  cEditMixerHarms
          MasterHarmonicsLevel  = GetEditValue(cEditMixerHarms)
          SetSliderPosition(cSliderMixerHarms,  MasterHarmonicsLevel)
        Case  cSliderMixerVolume
          MasterVolumeLevel = GetSliderValue(cSliderMixerVolume)
          SetEditValue(cEditMixerVolume,  MasterVolumeLevel)
        Case  cEditMixerVolume
          MasterVolumeLevel = GetEditValue(cEditMixerVolume)
          SetSliderPosition(cSliderMixerVolume, MasterVolumeLevel)
      EndSelect
  EndSelect
  ;waveOutWrite_   (WaveOut,  @WaveHdr1,  SizeOf(WAVEHDR))
  If  (WaveLineInBoolean)
    waveInAddBuffer_(WaveIn,  @WaveRecHdr1, SizeOf(WAVEHDR))
  EndIf
  ;Delay(5)
  ;waveOutWrite_   (WaveOut,  @WaveHdr2,  SizeOf(WAVEHDR))
  If  (WaveLineInBoolean)
    waveInAddBuffer_(WaveIn,  @WaveRecHdr2, SizeOf(WAVEHDR))
  EndIf
  ;Delay(5)
  ;waveOutWrite_   (WaveOut,  @WaveHdr3,  SizeOf(WAVEHDR))
  If  (WaveLineInBoolean)
    waveInAddBuffer_(WaveIn,  @WaveRecHdr3, SizeOf(WAVEHDR))
  EndIf
  ;Delay(5)
Wend
waveInStop_(WaveIn)
waveOutUnprepareHeader_(WaveOut,  @WaveHdr1,  SizeOf(WAVEHDR))
waveOutUnprepareHeader_(WaveOut,  @WaveHdr2,  SizeOf(WAVEHDR))
waveOutUnprepareHeader_(WaveOut,  @WaveHdr3,  SizeOf(WAVEHDR))
waveInUnprepareHeader_(WaveIn,  @WaveRecHdr1, SizeOf(WAVEHDR))
waveInUnprepareHeader_(WaveIn,  @WaveRecHdr2, SizeOf(WAVEHDR))
waveInUnprepareHeader_(WaveIn,  @WaveRecHdr3, SizeOf(WAVEHDR))
waveInClose_  (WaveIn)
waveOutClose_ (WaveOut)
; IDE Options = PureBasic 5.72 (Windows - x64)
; CursorPosition = 238
; FirstLine = 225
; Folding = --
; EnableThread 
  
  