PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Wave-form (signal) Generator


Wave-form (signal) Generator

Сообщений 1 страница 2 из 2

1

Делаю генератор синусоидального, прямоугольного, треугольного формата сигнала и шума. Но вот издаются щелчки звуковые. В чём проблема может быть?  ^^  :glasses:  :hobo:

Код:
#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

:suspicious:  :tired:  :tomato:

0

2

Что то  с буфером не то или переключение или данные в нём не те?
На осциллографе щелчок типа не перерывом идёт а прыгает по напряжению.
Специиально припёр из гаража осцилл помониторить всякие мобильные генераторы и много что уввидел по несоответствию.
вот сдесьь в теме про миди есть пример самый первый что выложил egons,в принципе хоть по коду может и  не идеален но синусоида чистая при переключении буферов.

Отредактировано Sergeihik (29.10.2021 16:51:02)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Wave-form (signal) Generator