tomwalters@0
|
1 % tool
|
tomwalters@0
|
2 %
|
tomwalters@0
|
3 % INPUT VALUES:
|
tomwalters@0
|
4 %
|
tomwalters@0
|
5 % RETURN VALUE:
|
tomwalters@0
|
6 %
|
tomwalters@0
|
7 %
|
bleeck@3
|
8 % (c) 2011, University of Southampton
|
bleeck@3
|
9 % Maintained by Stefan Bleeck (bleeck@gmail.com)
|
bleeck@3
|
10 % download of current version is on the soundsoftware site:
|
bleeck@3
|
11 % http://code.soundsoftware.ac.uk/projects/aimmat
|
bleeck@3
|
12 % documentation and everything is on http://www.acousticscale.org
|
bleeck@3
|
13
|
tomwalters@0
|
14
|
tomwalters@0
|
15 %%%%%%%%%%%%%%%%%%%%%%%%%%%
|
tomwalters@0
|
16 %
|
tomwalters@0
|
17 % File: GetAIFFinfo.m
|
tomwalters@0
|
18 % by stefan@bleeck.de
|
tomwalters@0
|
19 %%%%%%%%%%%%%%%%%%%%%%%%%%%
|
tomwalters@0
|
20
|
tomwalters@0
|
21 function ret = GetAIFFinfo(fname)
|
tomwalters@0
|
22
|
tomwalters@0
|
23 [fid, msg] = fopen(fname);
|
tomwalters@0
|
24 if fid == -1
|
tomwalters@0
|
25 error('File open error. Please check that the file name is correctly spelled.')
|
tomwalters@0
|
26 end
|
tomwalters@0
|
27 littleEndian = 0;
|
tomwalters@0
|
28 aiff_form = ReadBytes(fid, 4, littleEndian);
|
tomwalters@0
|
29 if aiff_form' == double('FORM')
|
tomwalters@0
|
30 % disp('big-endian');
|
tomwalters@0
|
31 else
|
tomwalters@0
|
32 % disp('little-endian');
|
tomwalters@0
|
33 littleEndian = 1;
|
tomwalters@0
|
34 end;
|
tomwalters@0
|
35
|
tomwalters@0
|
36 chunkSize = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
37
|
tomwalters@0
|
38 aiff_aiff = ReadBytes(fid, 4, littleEndian);
|
tomwalters@0
|
39 if aiff_aiff' ~= double('AIFF')
|
tomwalters@0
|
40 aiff_aiff
|
tomwalters@0
|
41 disp('Not a valid AIFF file.');
|
tomwalters@0
|
42 return
|
tomwalters@0
|
43 end;
|
tomwalters@0
|
44 chunkSize = chunkSize - 16;
|
tomwalters@0
|
45
|
tomwalters@0
|
46 while chunkSize - 4 > 0;
|
tomwalters@0
|
47 chunkName = ReadBytes(fid, 4, littleEndian);
|
tomwalters@0
|
48 chunkSize = chunkSize - 4;
|
tomwalters@0
|
49 if chunkName' == double('COMM');
|
tomwalters@0
|
50 % disp('step COMM');
|
tomwalters@0
|
51 subSize = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
52 chunkSize = chunkSize-subSize;
|
tomwalters@0
|
53 numChannels = Read16Bits(fid, littleEndian);
|
tomwalters@0
|
54 subSize = subSize - 2;
|
tomwalters@0
|
55 numSampleFrames = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
56 subSize = subSize - 4;
|
tomwalters@0
|
57 sampleSize = Read16Bits(fid, littleEndian);
|
tomwalters@0
|
58 subSize = subSize - 2;
|
tomwalters@0
|
59 sampleRate = ReadIEEE2(fid, littleEndian);
|
tomwalters@0
|
60 subSize = subSize - 10;
|
tomwalters@0
|
61 fread(fid, subSize, 'char');
|
tomwalters@0
|
62 elseif chunkName' == double('SSND');
|
tomwalters@0
|
63 % disp('step SSND');
|
tomwalters@0
|
64 subSize = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
65 chunkSize = chunkSize - subSize;
|
tomwalters@0
|
66 offset = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
67 subSize = subSize - 4;
|
tomwalters@0
|
68 blockSize = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
69 subSize = subSize - 4;
|
tomwalters@0
|
70 soundPosition = ftell(fid) + offset;
|
tomwalters@0
|
71 fread(fid, subSize, 'char');
|
tomwalters@0
|
72 elseif chunkName' == double('LUT2');
|
tomwalters@0
|
73 % disp('step LUT2');
|
tomwalters@0
|
74 subSize = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
75 chunkSize = chunkSize - subSize;
|
tomwalters@0
|
76 interleaveLevel = Read16Bits(fid, littleEndian);
|
tomwalters@0
|
77 subSize = subSize - 2;
|
tomwalters@0
|
78 numWindowFrames = Read16Bits(fid, littleEndian);
|
tomwalters@0
|
79 subSize = subSize - 2;
|
tomwalters@0
|
80 staticTimeFlag = Read16Bits(fid, littleEndian);
|
tomwalters@0
|
81 subSize = subSize - 2;
|
tomwalters@0
|
82 outputTimeOffset = ReadIEEE2(fid, littleEndian);
|
tomwalters@0
|
83 subSize = subSize - 10;
|
tomwalters@0
|
84 absoluteNormalise = ReadIEEE2(fid, littleEndian);
|
tomwalters@0
|
85
|
tomwalters@0
|
86 subSize = subSize - 10;
|
tomwalters@0
|
87 fread(fid, subSize, 'char');
|
tomwalters@0
|
88
|
tomwalters@0
|
89 else;
|
tomwalters@0
|
90 subSize = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
91 chunkSize = chunkSize - subSize;
|
tomwalters@0
|
92 fread(fid, subSize, 'char');
|
tomwalters@0
|
93
|
tomwalters@0
|
94 end;
|
tomwalters@0
|
95 end;
|
tomwalters@0
|
96 fclose(fid);
|
tomwalters@0
|
97
|
tomwalters@0
|
98 wordSize = floor((sampleSize + 7 ) / 8);
|
tomwalters@0
|
99 normalise = (2^16 - 1) / 2^(17 - wordSize * 8) / absoluteNormalise;
|
tomwalters@0
|
100 switch wordSize
|
tomwalters@0
|
101 case 1, scale = normalise / 127.0;
|
tomwalters@0
|
102 case 2, scale = normalise / 32768.0;
|
tomwalters@0
|
103 case 4, scale = normalise / 32768.0 / 65536;
|
tomwalters@0
|
104 end
|
tomwalters@0
|
105 frameLength = numSampleFrames / numWindowFrames;
|
tomwalters@0
|
106
|
tomwalters@0
|
107 ret.totalframetime=frameLength/sampleRate;
|
tomwalters@0
|
108 ret.numWindowFrames=numWindowFrames;
|
tomwalters@0
|
109 ret.scale=scale;
|
tomwalters@0
|
110 ret.wordSize=wordSize;
|
tomwalters@0
|
111 ret.soundPosition=soundPosition;
|
tomwalters@0
|
112 ret.littleEndian=littleEndian;
|
tomwalters@0
|
113 ret.frameLength=frameLength;
|
tomwalters@0
|
114 ret.numChannels=numChannels;
|
tomwalters@0
|
115 ret.numSampleFrames=numSampleFrames;
|
tomwalters@0
|
116 ret.sampleSize=sampleSize;
|
tomwalters@0
|
117 ret.sampleRate=sampleRate;
|
tomwalters@0
|
118 ret.interleaveLevel=interleaveLevel;
|
tomwalters@0
|
119 ret.numWindowFrames=numWindowFrames;
|
tomwalters@0
|
120 ret.staticTimeFlag=staticTimeFlag;
|
tomwalters@0
|
121 ret.outputTimeOffset=outputTimeOffset;
|
tomwalters@0
|
122 ret.absoluteNormalise=absoluteNormalise;
|