Mam taki problem - musze plik wav przekonwertować na dat najlepiej chyba zrobić to w Delphi ale jak ktoś wie jak niech da znać. (Chodzi o sygnały żeby później było można otworzyć to w Mad Cad-ie i wykreślić wykres . Prosze o pomoc w raźie pomyślnego działania proszę o kontakt gg: 3194579
Na wiki masz specyfikację (i to nie jedną) wava, poszukaj w necie specyfikacji tego formatu, na który chcesz przekonwertować, i połowa roboty za tobą ;)
chodziło mi opis calosci jak wykonać bo z tego akurat jestem noga
w rupieciach znalazłem coś takiego
type
c4=array[1..4] of char;
byte3=array[1..3] of byte;
twaveChunk=record
ID: c4; {RIFF}
size: cardinal;
rifftype: c4; {WAVE}
end;
tformatchunk=record
id: c4; {fmt }
size: cardinal;
format: smallint;
channels: word;
samplesps: cardinal; // samples per second
bytesps: cardinal; // bytes per second
align: smallint; // chanels * bytes per sample
bitsps: smallint; // bits per sample
// nic:array[25..128] of byte;
end;
tdatachunk=record
id: c4; {data}
size: cardinal;
end;
pdata = ^tData;
tdata = record
sps,
channels,
n,
start: cardinal;
case integer of
1:( x: array[0..25000000] of longint);
2:( a8: array[0..25000000] of byte);
3:(a16: array[0..25000000] of smallint);
4:(a24: array[0..25000000] of byte3);
end;
function jeden(n:string):pdata;
var
e,i:cardinal;
wc:twavechunk;
fc:tformatchunk;
dc:tdatachunk;
fi:file;
p:pdata;
begin
jeden:=nil;
assign(fi, n);
reset(fi, 1);
blockread(fi, wc, sizeof(wc), e);
if (e=sizeof(wc)) and (wc.id='RIFF') and (wc.rifftype='WAVE') then begin
blockread(fi, fc, 8, e);
if (e=8) and (fc.id='fmt ') then begin
blockread(fi, fc.format, fc.size, e);
if (e=fc.size) and ((fc.format=1) or (fc.format=6)) then begin
repeat
blockread(fi, dc, 8, e);
if (e=8) then
if dc.id='data' then break
else seek(fi, filepos(fi)+dc.size)
else break
until false;
if (e=8) and (dc.id='data') then begin
e:= dc.size div
((fc.bitsps+7) div 8);
getmem(p, 16+e*4);
p^.sps:=fc.samplesps;
p^.channels:=fc.channels;
p^.n:=e;
p^.start:=filepos(fi);
blockread(fi, p^.x, dc.size, e);
if e=dc.size then begin
jeden:=p;
e:=(fc.bitsps+7) div 8;
i:=p^.n;
repeat
dec(i); //write(#13, i:10);
if e=1 then p^.x[i]:=smallint(p^.a8[i])-128
else if e=2 then p^.x[i]:=p^.a16[i]
else if e=3 then
p^.x[i]:=(p^.a24[i,3] shl 8+p^.a24[i,2]) shl 8 + p^.a24[i,1]
else if e=4 then break
until i=0;
if e=1 then begin
for i:= 0 to p^.n-1 do
p^.x[i]:=round(10000*(1/(1+exp(-p^.x[i]/16))-0.5))
end;
//tu dekompresor a-law
end else begin
freemem(p, p^.n*4+16);
writeln('malo danych');
end
end else writeln('data')
end else writeln('format 6')
end else writeln('fmt')
end else writeln('riff');
close(fi);
end;
Dzięki wielkie sprawedze czy bedzie działać!!! Ale jeśli ktoś ma jeszcze jakiś sposób to proszę dać znać z góry dzięx
No sprawdziłem i niestety nie działa nie wiem czemu prosił bym o kontakt kogoś kto się na tym zna dokładniej
Być może plik nie jest w formacie WAVE_FORMAT_PCM lub WAVE_FORMAT_IEEE_FLOAT - wtedy blok "fmt " może mieć większy rozmiar. Dodatkowo czytanie 'na szywno' WAV'a to zły pomysł - między blokiem "fmt " a "data" mogą się znajdować inne bloki.
-0x666 umiesz to zrobić to daj znać na gg prośba jak wykonasz to [browar] gwarantowany
Umiem, nie zrobię, nie piszę w Delphi ;-P
prośba potrzebne mi to obojętne w czym tylko żeby było