Код:
;АудиоДеформатор в2.0
;©2023 Федин Максим Александрович
Structure WAVEHEADER
RIFF.l
FileSize.l
RIFFType.l
FmtChunkId.l
FmtChunkSize.l
FormatTag.w
Channels.w
SampleRate.l
BytesPerSecond.l
BlockAlign.w
BitsPerSample.w
DataChunkId.l
DataSize.l
EndStructure
WaveHeader.WAVEHEADER
InputFile$ = OpenFileRequester("Выберите PCM Wave 44100Гц 16-бит стерео файл без дополнительной информации.", "", "Microsoft PCM Wave (*.wav)|*.wav|", 0)
If FileSize(inputFile$) < SizeOf(WAVEHEADER)
End
EndIf
If ReadFile(0, InputFile$) = 0
MessageRequester("Деформатор.", "Невозможно открыть файл для чтения.", #PB_MessageRequester_Error)
End
EndIf
ReadData(0, @WaveHeader, SizeOf(WAVEHEADER))
With WaveHeader
If \BitsPerSample <> 16 And \Channels <> 2 And \SampleRate <> 44100
MessageRequester("Деформатор", "Неподдерживаемый формат файла.", #PB_MessageRequester_Error)
CloseFile(0)
End
EndIf
EndWith
*Buffer = AllocateMemory(WaveHeader\DataSize)
If *Buffer = 0
MessageRequester("Деформатор", "Невозможно выделить память для данных.", #PB_MessageRequester_Error)
CloseFile(0)
End
EndIf
*Byte.Ascii = *Buffer
*Overflow = *Buffer + WaveHeader\DataSize
While *Byte < *Overflow
*Byte\a = ReadAsciiCharacter(0)
*Byte + SizeOf(Ascii)
Wend
If CreateFile(1, InputFile$+" (деформатор).wav") = 0
MessageRequester("Деформатор", "Невозможно создать обработанный файл.", #PB_MessageRequester_Error)
FreeMemory(*Buffer)
CloseFile(0)
End
EndIf
WriteData(1, @WaveHeader, SizeOf(WAVEHEADER))
*Short.Word = *Buffer
While *Short < *Overflow
Select Random(2)
Case 1
*Short\w + Random(Random(3,2),1)
If *Short\w > 32767
Select Random(1)
Case 0
*Short\w = 32767
Case 1
*Short\w = 32766
EndSelect
EndIf
Case 2
Case 1
*Short\w - Random(Random(3,2),1)
If *Short\w < -32769
Select Random(1)
Case 0
*Short\w = -32768
Case 1
*Short\w = -32767
EndSelect
EndIf
EndSelect
WriteWord(1, *Short\w)
*Short + SizeOf(Word)
Wend
FreeMemory(*Buffer)
MessageRequester("Деформатор", "Готово.", #PB_MessageRequester_Info)
а этот почему то делает тишину вместо звука.
Код:
;©2024 Федин Максим Александрович
;Смазыватель
Structure WAVEHEADER
RIFF.l
FileSize.l
RIFFType.l
FmtChunkId.l
FmtChunkSize.l
FormatTag.w
Channels.w
SampleRate.l
BytesPerSecond.l
BlockAlign.w
BitsPerSample.w
DataChunkId.l
DataSize.l
EndStructure
WaveHeader.WAVEHEADER
InputFile$ = OpenFileRequester("Выберите PCM Wave 44100Гц 16-бит стерео файл без дополнительной информации.", "", "Microsoft PCM Wave (*.wav)|*.wav|", 0)
If FileSize(inputFile$) < SizeOf(WAVEHEADER)
End
EndIf
If ReadFile(0, InputFile$) = 0
MessageRequester("Смазыватель", "Невозможно открыть файл для чтения.", #PB_MessageRequester_Error)
End
EndIf
ReadData(0, @WaveHeader, SizeOf(WAVEHEADER))
With WaveHeader
If \BitsPerSample <> 16 And \Channels <> 2 And \SampleRate <> 44100
MessageRequester("Смазыватель", "Неподдерживаемый формат файла.", #PB_MessageRequester_Error)
CloseFile(0)
End
EndIf
EndWith
*Buffer = AllocateMemory(WaveHeader\DataSize)
If *Buffer = 0
MessageRequester("Смазыватель", "Невозможно выделить память для данных.", #PB_MessageRequester_Error)
CloseFile(0)
End
EndIf
*Byte.Ascii = *Buffer
*Overflow = *Buffer + WaveHeader\DataSize
While *Byte < *Overflow
*Byte\a = ReadAsciiCharacter(0)
*Byte + SizeOf(Ascii)
Wend
If CreateFile(1, InputFile$+" (смазыватель).wav") = 0
MessageRequester("Смазыватель", "Невозможно создать обработанный файл.", #PB_MessageRequester_Error)
FreeMemory(*Buffer)
CloseFile(0)
End
EndIf
WriteData(1, @WaveHeader, SizeOf(WAVEHEADER))
*Short.Word = *Buffer
While *Short < *Overflow
If (*Short < (*Overflow - SizeOf(Word)))
*Short2.Word = *Short + SizeOf(Word)
*Short2\w = PeekW(*Short+SizeOf(Word))
Else
*Short2\w = *Short\w
EndIf
Select Random(1,0)
Case 0
Select Random(3,0)
Case 0
*Short\w = Int((*Short\w + *Short2\w)*0.5)
Case 1
*Short\w = Int(Round((*Short\w + *Short2\w)*0.5, #PB_Round_Nearest))
Case 2
*Short\w = Int(Round((*Short\w + *Short2\w)*0.5, #PB_Round_Down))
Case 3
*Short\w = Int(Round((*Short\w + *Short2\w)*0.5, #PB_Round_Up))
EndSelect
Case 1
If (*Short < (*Overflow - SizeOf(Word) - SizeOf(Word)))
*Short3.Word = *Short2 + SizeOf(Word)
*Short3\w = PeekW(*Short2 + SizeOf(Word))
Else
*Short3\w = *Short2\w
EndIf
Select Random(3,0)
Case 0
*Short\w = Int((*Short\w + *Short2\w + *Short3\w) / 3)
Case 1
*Short\w = Int(Round((*Short\w + *Short2\w + *Short3\w) / 3, #PB_Round_Nearest))
Case 2
*Short\w = Int(Round((*Short\w + *Short2\w + *Short3\w) / 3, #PB_Round_Down))
Case 3
*Short\w = Int(Round((*Short\w + *Short2\w + *Short3\w) / 3, #PB_Round_Up))
EndSelect
EndSelect
WriteWord(1, *Short\w)
*Short + SizeOf(Word)
Wend
FreeMemory(*Buffer)
MessageRequester("Смазыватель", "Готово.", #PB_MessageRequester_Info)
У кого какие предложения?
Ещё напишу ревербератор и линию задержки. Но сейчас никак не могу понять почему не работает второй код.