OSDN Git Service

確信に使づいてきました
authoryamat0jp <yamat0jp@yahoo.co.jp>
Sat, 19 May 2018 07:44:58 +0000 (16:44 +0900)
committeryamat0jp <yamat0jp@yahoo.co.jp>
Sat, 19 May 2018 07:44:58 +0000 (16:44 +0900)
今日は行楽日和ですけどやってます

effect.pas
wav_proj.dproj.local

index 350e544..2518760 100644 (file)
@@ -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('\82Ì\82±\82¬\82è\94g');
index 04ed60a..1291feb 100644 (file)
@@ -9,19 +9,19 @@
     <Transaction>2017/10/19 20:48:10.000.837,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/10/19 20:48:11.000.893,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/10/19 20:49:15.000.988,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
-    <Transaction>2017/10/19 20:49:16.000.218,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/10/19 20:49:16.000.125,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
+    <Transaction>2017/10/19 20:49:16.000.218,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/10/19 20:49:45.000.913,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/10/19 20:49:45.000.816,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/10/19 20:50:18.000.999,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/10/19 20:50:19.000.049,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/10/19 21:37:00.000.271,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
-    <Transaction>2017/10/19 21:37:00.000.652,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/10/19 21:37:00.000.365,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
+    <Transaction>2017/10/19 21:37:00.000.652,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/10/28 22:58:31.000.296,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2017/10/29 14:44:00.000.024,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
-    <Transaction>2017/10/29 16:13:37.000.037,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2017/10/29 16:13:37.000.174,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
+    <Transaction>2017/10/29 16:13:37.000.037,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2017/10/29 16:13:37.000.809,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/10/29 16:55:16.000.109,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2017/10/29 16:55:16.000.343,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:12:24.000.771,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:21:25.000.947,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:21:26.000.254,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
-    <Transaction>2017/11/01 18:23:22.000.344,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:23:22.000.193,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\FormUnit1.pas</Transaction>
+    <Transaction>2017/11/01 18:23:22.000.344,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:23:22.000.440,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
-    <Transaction>2017/11/01 18:33:21.000.133,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:33:21.000.032,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
+    <Transaction>2017/11/01 18:33:21.000.133,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:33:39.000.795,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
     <Transaction>2017/11/01 19:08:03.000.193,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
     <Transaction>2017/11/30 19:11:41.000.772,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2018/01/01 12:40:34.000.125,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2018/01/01 12:40:55.000.044,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2018/05/07 18:00:45.000.726,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
-    <Transaction>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</Transaction>
-    <Transaction>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</Transaction>
+    <Transaction>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</Transaction>
+    <Transaction>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</Transaction>
     <Transaction>2018/05/07 21:20:21.000.796,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas</Transaction>
-    <Transaction>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</Transaction>
+    <Transaction>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</Transaction>
     <Transaction>2018/05/09 21:56:39.000.226,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas</Transaction>
-    <Transaction>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</Transaction>
+    <Transaction>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</Transaction>
     <Transaction>2018/05/13 12:45:57.000.431,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\spWav.pas</Transaction>
     <Transaction>2018/05/13 21:58:37.000.377,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas</Transaction>
-    <Transaction>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</Transaction>
+    <Transaction>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</Transaction>
     <Transaction>2018/05/13 22:29:03.000.282,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\WriteHeader.pas</Transaction>
     <Transaction>2018/05/13 22:46:16.000.228,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\wav.pas</Transaction>
     <Transaction>2018/05/14 20:20:05.000.202,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\selectFile.pas</Transaction>