📄 sopen.m
字号:
tmp = setstr(fread(HDR.FILE.FID,[1,4],'char'));
if ~strcmpi(tmp,'FORM') & ~strcmpi(tmp,'RIFF'),
fprintf(2,'Warning SOPEN AIF/WAV-format: file %s might be corrupted 1\n',HDR.FileName);
end;
tagsize = fread(HDR.FILE.FID,1,'uint32'); % which size
tagsize0 = tagsize + rem(tagsize,2);
tmp = setstr(fread(HDR.FILE.FID,[1,4],'char'));
if ~strncmpi(tmp,'AIF',3) & ~strncmpi(tmp,'WAVE',4) & ~strncmpi(tmp,'AVI ',4), % not (AIFF or AIFC or WAVE)
fprintf(2,'Warning SOPEN AIF/WAF-format: file %s might be corrupted 2\n',HDR.FileName);
end;
[tmp,c] = fread(HDR.FILE.FID,[1,4],'char');
while ~feof(HDR.FILE.FID),
tag = setstr(tmp);
tagsize = fread(HDR.FILE.FID,1,'uint32'); % which size
tagsize0= tagsize + rem(tagsize,2);
filepos = ftell(HDR.FILE.FID);
%%%% AIF - section %%%%%
if strcmpi(tag,'COMM')
if tagsize<18,
fprintf(2,'Error SOPEN AIF: incorrect tag size\n');
return;
end;
HDR.NS = fread(HDR.FILE.FID,1,'uint16');
HDR.SPR = fread(HDR.FILE.FID,1,'uint32');
HDR.AS.endpos = HDR.SPR;
HDR.bits = fread(HDR.FILE.FID,1,'uint16');
HDR.GDFTYP = ceil(HDR.bits/8)*2-1; % unsigned integer of approbriate size;
HDR.Cal = 2^(1-HDR.bits);
HDR.Off = 0;
HDR.AS.bpb = ceil(HDR.bits/8)*HDR.NS;
% HDR.SampleRate; % construct Extended 80bit IEEE 754 format
tmp = fread(HDR.FILE.FID,1,'int16');
sgn = sign(tmp);
if tmp(1)>= 2^15; tmp(1)=tmp(1)-2^15; end;
e = tmp - 2^14 + 1;
tmp = fread(HDR.FILE.FID,2,'uint32');
HDR.SampleRate = sgn * (tmp(1)*(2^(e-31))+tmp(2)*2^(e-63));
HDR.Dur = HDR.SPR/HDR.SampleRate;
HDR.FILE.TYPE = 0;
if tagsize>18,
[tmp,c] = fread(HDR.FILE.FID,[1,4],'char');
HDR.AIF.CompressionType = setstr(tmp);
[tmp,c] = fread(HDR.FILE.FID,[1,tagsize-18-c],'char');
HDR.AIF.CompressionName = tmp;
if strcmpi(HDR.AIF.CompressionType,'NONE');
elseif strcmpi(HDR.AIF.CompressionType,'fl32');
HDR.GDFTYP = 16;
HDR.Cal = 1;
elseif strcmpi(HDR.AIF.CompressionType,'fl64');
HDR.GDFTYP = 17;
HDR.Cal = 1;
elseif strcmpi(HDR.AIF.CompressionType,'alaw');
HDR.GDFTYP = 2;
HDR.AS.bpb = HDR.NS;
%HDR.FILE.TYPE = 1;
fprintf(2,'Warning SOPEN AIFC-format: data not scaled because of CompressionType ALAW\n');
HDR.FLAG.UCAL = 1;
elseif strcmpi(HDR.AIF.CompressionType,'ulaw');
HDR.GDFTYP = 2;
HDR.AS.bpb = HDR.NS;
HDR.FILE.TYPE = 1;
%%%% other compression types - currently not supported, probably obsolete
%elseif strcmpi(HDR.AIF.CompressionType,'DWVW');
%elseif strcmpi(HDR.AIF.CompressionType,'GSM');
%elseif strcmpi(HDR.AIF.CompressionType,'ACE2');
%elseif strcmpi(HDR.AIF.CompressionType,'ACE8');
%elseif strcmpi(HDR.AIF.CompressionType,'ima4');
%elseif strcmpi(HDR.AIF.CompressionType,'MAC3');
%elseif strcmpi(HDR.AIF.CompressionType,'MAC6');
%elseif strcmpi(HDR.AIF.CompressionType,'Qclp');
%elseif strcmpi(HDR.AIF.CompressionType,'QDMC');
%elseif strcmpi(HDR.AIF.CompressionType,'rt24');
%elseif strcmpi(HDR.AIF.CompressionType,'rt29');
else
fprintf(2,'Warning SOPEN AIFC-format: CompressionType %s is not supported\n', HDR.AIF.CompressionType);
end;
end;
elseif strcmpi(tag,'SSND');
HDR.AIF.offset = fread(HDR.FILE.FID,1,'int32');
HDR.AIF.blocksize= fread(HDR.FILE.FID,1,'int32');
%tmp = (tagsize-8)/HDR.AS.bpb;
if 0,tmp~=HDR.SPR,
fprintf(2,'Warning SOPEN AIF: Number of samples do not fit %i vs %i\n',tmp,HDR.SPR);
end;
HDR.HeadLen = filepos+8;
%HDR.AIF.sounddata= fread(HDR.FILE.FID,tagsize-8,'uint8');
elseif strcmpi(tag,'FVER');
if tagsize<4,
fprintf(2,'Error SOPEN WAV: incorrect tag size\n');
return;
end;
HDR.AIF.TimeStamp = fread(HDR.FILE.FID,1,'uint32');
elseif strcmp(tag,'DATA') & strcmp(HDR.TYPE,'AIF') ; % AIF uses upper case, there is a potential conflict with WAV using lower case data
HDR.AIF.DATA = fread(HDR.FILE.FID,[1,tagsize],'uchar');
elseif strcmpi(tag,'INST'); % not sure if this is ok !
%HDR.AIF.INST = fread(HDR.FILE.FID,[1,tagsize],'uchar');
%HDR.AIF.INST.notes = fread(HDR.FILE.FID,[1,6],'char');
HDR.AIF.INST.baseNote = fread(HDR.FILE.FID,1,'char');
HDR.AIF.INST.detune = fread(HDR.FILE.FID,1,'char');
HDR.AIF.INST.lowNote = fread(HDR.FILE.FID,1,'char');
HDR.AIF.INST.highNote = fread(HDR.FILE.FID,1,'char');
HDR.AIF.INST.lowvelocity = fread(HDR.FILE.FID,1,'char');
HDR.AIF.INST.highvelocity = fread(HDR.FILE.FID,1,'char');
HDR.AIF.INST.gain = fread(HDR.FILE.FID,1,'int16');
HDR.AIF.INST.sustainLoop_PlayMode = fread(HDR.FILE.FID,1,'char');
HDR.AIF.INST.sustainLoop = fread(HDR.FILE.FID,2,'uint16');
HDR.AIF.INST.releaseLoop_PlayMode = fread(HDR.FILE.FID,1,'char');
HDR.AIF.INST.releaseLoop = fread(HDR.FILE.FID,2,'uint16');
elseif strcmpi(tag,'MIDI');
HDR.AIF.MIDI = fread(HDR.FILE.FID,[1,tagsize],'uchar');
elseif strcmpi(tag,'AESD');
HDR.AIF.AESD = fread(HDR.FILE.FID,[1,tagsize],'uchar');
elseif strcmpi(tag,'APPL');
HDR.AIF.APPL = fread(HDR.FILE.FID,[1,tagsize],'uchar');
elseif strcmpi(tag,'COMT');
HDR.AIF.COMT = fread(HDR.FILE.FID,[1,tagsize],'uchar');
elseif strcmpi(tag,'ANNO');
HDR.AIF.ANNO = setstr(fread(HDR.FILE.FID,[1,tagsize],'uchar'));
elseif strcmpi(tag,'(c) ');
[tmp,c] = fread(HDR.FILE.FID,[1,tagsize],'uchar');
HDR.Copyright = setstr(tmp);
%%%% WAV - section %%%%%
elseif strcmpi(tag,'fmt ')
if tagsize<14,
fprintf(2,'Error SOPEN WAV: incorrect tag size\n');
return;
end;
HDR.WAV.Format = fread(HDR.FILE.FID,1,'uint16');
HDR.NS = fread(HDR.FILE.FID,1,'uint16');
HDR.SampleRate = fread(HDR.FILE.FID,1,'uint32');
HDR.WAV.AvgBytesPerSec = fread(HDR.FILE.FID,1,'uint32');
HDR.WAV.BlockAlign = fread(HDR.FILE.FID,1,'uint16');
if HDR.WAV.Format==1, % PCM format
HDR.bits = fread(HDR.FILE.FID,1,'uint16');
HDR.Off = 0;
HDR.Cal = 2^(1-8*ceil(HDR.bits/8));
if HDR.bits<=8,
HDR.GDFTYP = 0;
HDR.Off = 1;
%HDR.Cal = HDR.Cal*2;
elseif HDR.bits<=16,
HDR.GDFTYP = 3;
elseif HDR.bits<=24,
HDR.GDFTYP = 255+24;
elseif HDR.bits<=32,
HDR.GDFTYP = 5;
end;
else
fprintf(2,'Error SOPEN WAV: format type %i not supported\n',HDR.WAV.Format);
end;
if tagsize>16,
HDR.WAV.cbSize = fread(HDR.FILE.FID,1,'uint16');
end;
elseif strcmp(tag,'data') & strcmp(HDR.TYPE,'WAV') ; % AIF uses upper case, there is a potential conflict with WAV using lower case data
HDR.HeadLen = filepos;
if HDR.WAV.Format == 1,
HDR.AS.bpb = HDR.NS * ceil(HDR.bits/8);
HDR.SPR = tagsize/HDR.AS.bpb;
HDR.Dur = HDR.SPR/HDR.SampleRate;
HDR.AS.endpos = HDR.SPR;
else
fprintf(2,'Error SOPEN WAV: format type %i not supported\n',HDR.WAV.Format);
end;
elseif strcmpi(tag,'fact');
if tagsize<4,
fprintf(2,'Error SOPEN WAV: incorrect tag size\n');
return;
end;
[tmp,c] = fread(HDR.FILE.FID,[1,tagsize],'uchar');
HDR.RIFF.FACT = setstr(tmp);
elseif strcmpi(tag,'disp');
if tagsize<8,
fprintf(2,'Error SOPEN WAV: incorrect tag size\n');
return;
end;
[tmp,c] = fread(HDR.FILE.FID,[1,tagsize],'uchar');
HDR.RIFF.DISP = setstr(tmp);
if ~all(tmp(1:8)==[0,1,0,0,0,0,1,1])
HDR.RIFF.DISPTEXT = setstr(tmp(5:length(tmp)));
end;
elseif strcmpi(tag,'list');
if tagsize<4,
fprintf(2,'Error SOPEN WAV: incorrect tag size\n');
return;
end;
[tmp,c] = fread(HDR.FILE.FID,[1,tagsize],'char');
%HDR.RIFF.list = setstr(tmp);
if ~isfield(HDR,'RIFF');
HDR.RIFF.N1 = 1;
elseif ~isfield(HDR.RIFF,'N');
HDR.RIFF.N1 = 1;
else
HDR.RIFF.N1 = HDR.RIFF.N1+1;
end;
tag = setstr(tmp(1:4));
val = setstr(tmp(5:length(tmp)));
if strcmp(tag,'INFO'),
HDR.RIFF.INFO=val;
elseif strcmp(tag,'movi'),
HDR.RIFF.movi = val;
elseif strcmp(tag,'hdrl'),
HDR.RIFF.hdr1 = val;
elseif 0,strcmp(tag,'mdat'),
%HDR.RIFF.mdat = val;
else
fprintf(HDR.FILE.stderr,'Warning SOPEN Type=RIFF: unknown Tag %s.\n',tag);
end;
% AVI audio video interleave format
elseif strcmpi(tag,'movi');
if tagsize<4,
fprintf(2,'Error SOPEN AVI: incorrect tag size\n');
return;
end;
[tmp,c] = fread(HDR.FILE.FID,[1,tagsize],'uchar');
HDR.RIFF.movi = setstr(tmp);
elseif strcmp(tag,'idx1');
if tagsize<4,
fprintf(2,'Error SOPEN AVI: incorrect tag size\n');
return;
end;
[tmp,c] = fread(HDR.FILE.FID,[1,tagsize],'uchar');
HDR.RIFF.idx1 = setstr(tmp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -