From 601e05c84eee76060b0d64390a7334590acf095b Mon Sep 17 00:00:00 2001 From: yamat0jp Date: Sat, 19 May 2018 16:44:58 +0900 Subject: [PATCH] =?utf8?q?=E7=A2=BA=E4=BF=A1=E3=81=AB=E4=BD=BF=E3=81=A5?= =?utf8?q?=E3=81=84=E3=81=A6=E3=81=8D=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 今日は行楽日和ですけどやってます --- effect.pas | 103 ++++++++++++++++++++++++++++++++++++++------------- wav_proj.dproj.local | 20 +++++----- 2 files changed, 87 insertions(+), 36 deletions(-) diff --git a/effect.pas b/effect.pas index 350e544..2518760 100644 --- a/effect.pas +++ b/effect.pas @@ -6,6 +6,7 @@ uses System.Classes, System.SysUtils, Math, spWav; function effect8BitWav(const sp: SpParam): integer; function effect16BitWav(const sp: SpParam): integer; +function sinc(x: Single): Single; procedure usage; function effectwav(const sp: SpParam): integer; @@ -13,33 +14,75 @@ implementation function effect8BitWav(const sp: SpParam): integer; const - depth = 1.0; - rate = 170.0; + j = 24; var - i, delayStart: integer; - k, m: Single; - pMem, pCpy: array of Byte; + i, a, b, pmin, pmax, temp_size, offset0, offset1, p, q: integer; + k, m, ma, pitch, rate: Single; + pMem, pCpy: array of SmallInt; + r: array of Single; s: TMemoryStream; begin result := 0; + s := TMemoryStream.Create; try - s := TMemoryStream.Create; + SetLength(pCpy, sp.sizeOfData); s.Write(sp.pWav^, sp.sizeOfData); s.Position := 0; s.Read(Pointer(pCpy)^, sp.sizeOfData); pMem := sp.pWav; i := sp.posOfData; k := 8 * sp.sizeOfData / sp.bitsPerSample; - while i < k do + temp_size := trunc(sp.samplePerSec * sp.bitsPerSample * sp.channels * 0.01); + pmin := trunc(sp.samplePerSec * sp.bitsPerSample * sp.channels * 0.005); + pmax := trunc(sp.samplePerSec * sp.bitsPerSample * sp.channels * 0.02); + SetLength(r, pmax - pmin); + offset0 := sp.posOfData; + offset1 := sp.posOfData; + rate := 0.66; + while offset0 + pmax * 2 < sp.sizeOfData do + begin + ma := 0.0; + p := pmin; + for b := 0 to pmax - pmin - 1 do + begin + r[b] := 0.0; + for a := sp.posOfData to sp.posOfData + temp_size do + r[b] := r[b] + pCpy[a] * pCpy[a + b]; + if r[b] > ma then + begin + ma := r[b]; + p := b; + end; + end; + for i := 0 to p - 1 do + begin + pMem[offset1 + i] := pCpy[offset0 + i]; + pMem[offset1 + i + p] := trunc(pCpy[offset0 + p + i] * (p - i) / p + + pCpy[offset0 + i] * i / p); + end; + q := trunc(rate * p / Abs(1.0 - rate) + 0.5); + for i := p to q - 1 do + begin + if offset0 + i >= sp.sizeOfData then + break; + pMem[offset1 + p + i] := pCpy[offset0 + i]; + end; + inc(offset0, q); + inc(offset1, p + q); + end; + pitch := 1.5; + for i := sp.posOfData to sp.sizeOfData do begin - m := depth * sin(2 * pi * rate / sp.samplePerSec); - pMem[i + 0] := trunc(m * pMem[i + 0]) + 128; - pMem[i + 1] := trunc(m * pMem[i + 1]) + 128; - inc(i, 2); + m := pitch * i; + q := trunc(m); + for a := q - j div 2 to q + j div 2 do + if (m >= sp.posOfData) and (m < sp.sizeOfData) then + pMem[a] := trunc(pMem[a + 0] + pCpy[a + 0] * sinc(pi * (m - a))); end; except result := -1; end; + Finalize(r); s.Free; Finalize(pCpy); end; @@ -49,7 +92,7 @@ const j = 24; var i, a, b, pmin, pmax, temp_size, offset0, offset1, p, q: integer; - k, m, max, pitch, rate: Single; + k, m, ma, pitch, rate: Single; pMem, pCpy: array of SmallInt; r: array of Single; s: TMemoryStream; @@ -64,35 +107,35 @@ begin pMem := sp.pWav; i := sp.posOfData; k := 8 * sp.sizeOfData / sp.bitsPerSample; - temp_size := trunc(sp.samplePerSec * 0.01); - pmin := trunc(sp.samplePerSec * sp.bitsPerSample * 0.005); - pmax := trunc(sp.samplePerSec * sp.bitsPerSample * 0.02); + temp_size := trunc(sp.samplePerSec * sp.bitsPerSample * sp.channels * 0.01); + pmin := trunc(sp.samplePerSec * sp.bitsPerSample * sp.channels * 0.005); + pmax := trunc(sp.samplePerSec * sp.bitsPerSample * sp.channels * 0.02); SetLength(r, pmax - pmin); offset0 := sp.posOfData; offset1 := sp.posOfData; rate := 0.66; - while offset0 + pmax * 2 < sp.sizeOfData do + while offset1 + i + p < sp.sizeOfData do begin - max := 0.0; + ma := 0.0; p := pmin; - for b := pmin to pmax do + for b := 0 to pmax - pmin - 1 do begin r[b] := 0.0; for a := sp.posOfData to sp.posOfData + temp_size do - r[b] := r[b] + pMem[a] * pCpy[a + b]; - if r[b] > max then + r[b] := r[b] + pCpy[a] * pCpy[a + b]; + if r[b] > ma then begin - max := r[b]; + ma := r[b]; p := b; end; end; for i := 0 to p - 1 do begin - pMem[offset1 + i] := trunc(pCpy[offset0 + i]); + pMem[offset1 + i] := pCpy[offset0 + i]; pMem[offset1 + i + p] := trunc(pCpy[offset0 + p + i] * (p - i) / p + pCpy[offset0 + i] * i / p); end; - q := trunc(rate * p / (1.0 - rate) + 0.5); + q := trunc(rate * p / Abs(1.0 - rate) + 0.5); for i := p to q - 1 do begin if offset0 + i >= sp.sizeOfData then @@ -102,14 +145,14 @@ begin inc(offset0, q); inc(offset1, p + q); end; - pitch := 0.66; + pitch := 1.5; for i := sp.posOfData to sp.sizeOfData do begin m := pitch * i; q := trunc(m); for a := q - j div 2 to q + j div 2 do - if (m >= sp.posOfData) and (m < sp.sizeOfData) then - pMem[a] := trunc(pMem[a + 0] + pCpy[a + 0] * ArcSin(pi * (m - a))); + if (a >= sp.posOfData) and (a < sp.sizeOfData) then + pMem[i] := pMem[i] + pCpy[a] * trunc(sinc(pi * (m - a))); end; except result := -1; @@ -119,6 +162,14 @@ begin Finalize(pCpy); end; +function sinc(x: Single): Single; +begin + if x = 0 then + result := 1 + else + result := sin(x) / x; +end; + procedure usage; begin Writeln('‚Ì‚±‚¬‚è”g'); diff --git a/wav_proj.dproj.local b/wav_proj.dproj.local index 04ed60a..1291feb 100644 --- a/wav_proj.dproj.local +++ b/wav_proj.dproj.local @@ -9,19 +9,19 @@ 2017/10/19 20:48:10.000.837,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/10/19 20:48:11.000.893,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas 2017/10/19 20:49:15.000.988,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas - 2017/10/19 20:49:16.000.218,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas 2017/10/19 20:49:16.000.125,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas + 2017/10/19 20:49:16.000.218,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas 2017/10/19 20:49:45.000.913,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas 2017/10/19 20:49:45.000.816,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/10/19 20:50:18.000.999,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/10/19 20:50:19.000.049,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas 2017/10/19 21:37:00.000.271,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas - 2017/10/19 21:37:00.000.652,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas 2017/10/19 21:37:00.000.365,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas + 2017/10/19 21:37:00.000.652,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas 2017/10/28 22:58:31.000.296,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2017/10/29 14:44:00.000.024,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas - 2017/10/29 16:13:37.000.037,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2017/10/29 16:13:37.000.174,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas + 2017/10/29 16:13:37.000.037,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2017/10/29 16:13:37.000.809,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas 2017/10/29 16:55:16.000.109,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2017/10/29 16:55:16.000.343,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas @@ -34,26 +34,26 @@ 2017/11/01 18:12:24.000.771,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas 2017/11/01 18:21:25.000.947,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/11/01 18:21:26.000.254,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas - 2017/11/01 18:23:22.000.344,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/11/01 18:23:22.000.193,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\FormUnit1.pas + 2017/11/01 18:23:22.000.344,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/11/01 18:23:22.000.440,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas - 2017/11/01 18:33:21.000.133,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas 2017/11/01 18:33:21.000.032,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas + 2017/11/01 18:33:21.000.133,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas 2017/11/01 18:33:39.000.795,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas 2017/11/01 19:08:03.000.193,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas 2017/11/30 19:11:41.000.772,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2018/01/01 12:40:34.000.125,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2018/01/01 12:40:55.000.044,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2018/05/07 18:00:45.000.726,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas - 2018/05/07 18:01:10.000.795,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\wav.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas - 2018/05/07 18:01:39.000.274,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\wav_proj.dproj=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Project1.dproj + 2018/05/07 18:01:10.000.795,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\wav.pas + 2018/05/07 18:01:39.000.274,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Project1.dproj=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\wav_proj.dproj 2018/05/07 21:20:21.000.796,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas - 2018/05/07 21:20:27.000.646,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\spWave.pas + 2018/05/07 21:20:27.000.646,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\spWave.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas 2018/05/09 21:56:39.000.226,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas - 2018/05/09 21:56:54.000.027,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\WriteHeader.pas + 2018/05/09 21:56:54.000.027,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\WriteHeader.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas 2018/05/13 12:45:57.000.431,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\spWav.pas 2018/05/13 21:58:37.000.377,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas - 2018/05/13 21:58:48.000.578,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\effect.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas + 2018/05/13 21:58:48.000.578,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\effect.pas 2018/05/13 22:29:03.000.282,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\WriteHeader.pas 2018/05/13 22:46:16.000.228,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\wav.pas 2018/05/14 20:20:05.000.202,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\selectFile.pas -- 2.11.0