tomwalters@0
|
1 % support file for 'aim-mat'
|
tomwalters@0
|
2 %
|
tomwalters@0
|
3 % This external file is included as part of the 'aim-mat' distribution package
|
bleeck@3
|
4 % (c) 2011, University of Southampton
|
bleeck@3
|
5 % Maintained by Stefan Bleeck (bleeck@gmail.com)
|
bleeck@3
|
6 % download of current version is on the soundsoftware site:
|
bleeck@3
|
7 % http://code.soundsoftware.ac.uk/projects/aimmat
|
bleeck@3
|
8 % documentation and everything is on http://www.acousticscale.org
|
tomwalters@0
|
9
|
tomwalters@0
|
10 %%%%%%%%%%%%%%%%%%%%%%%%%%%
|
tomwalters@0
|
11 %
|
tomwalters@0
|
12 % File: ReadAIFF.m
|
tomwalters@0
|
13 % Purpose: Reads an AIFF format file.
|
tomwalters@0
|
14 % Comments: The default binary format is big-endian, if this does not
|
tomwalters@0
|
15 % work, then little-endian format is tried.
|
tomwalters@0
|
16 % Author: L. P. O'Mard
|
tomwalters@0
|
17 % Revised by: M.Tsuzaki
|
tomwalters@0
|
18 % Created:
|
tomwalters@0
|
19 % Updated: 31,Oct.2001
|
tomwalters@0
|
20 % Copyright: (c) 2000, University of Essex
|
tomwalters@0
|
21 %
|
tomwalters@0
|
22 %%%%%%%%%%%%%%%%%%%%%%%%%%%
|
tomwalters@0
|
23 function signal = myReadAIFF(fname,frameId)
|
tomwalters@0
|
24 if nargin < 2
|
tomwalters@0
|
25 frameId=1:10000; %default: read to end
|
tomwalters@0
|
26 end
|
tomwalters@0
|
27 absoluteNormalise = 1.0;
|
tomwalters@0
|
28 [fid, msg] = fopen(fname);
|
tomwalters@0
|
29 if fid == -1
|
tomwalters@0
|
30 error('File open error. Please check that the file name is correctly spelled.')
|
tomwalters@0
|
31 end
|
tomwalters@0
|
32 littleEndian = 0;
|
tomwalters@0
|
33 aiff_form = ReadBytes(fid, 4, littleEndian);
|
tomwalters@0
|
34 if aiff_form' == double('FORM')
|
tomwalters@0
|
35 % disp('big-endian');
|
tomwalters@0
|
36 else
|
tomwalters@0
|
37 % disp('little-endian');
|
tomwalters@0
|
38 littleEndian = 1;
|
tomwalters@0
|
39 end;
|
tomwalters@0
|
40 chunkSize = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
41 aiff_aiff = ReadBytes(fid, 4, littleEndian);
|
tomwalters@0
|
42 if aiff_aiff' ~= double('AIFF')
|
tomwalters@0
|
43 aiff_aiff
|
tomwalters@0
|
44 disp('Not a valid AIFF file.');
|
tomwalters@0
|
45 return
|
tomwalters@0
|
46 end;
|
tomwalters@0
|
47 chunkSize = chunkSize - 16;
|
tomwalters@0
|
48 while chunkSize - 4 > 0;
|
tomwalters@0
|
49 chunkName = ReadBytes(fid, 4, littleEndian);
|
tomwalters@0
|
50 chunkSize = chunkSize - 4;
|
tomwalters@0
|
51 if chunkName' == double('COMM');
|
tomwalters@0
|
52 % disp('step COMM');
|
tomwalters@0
|
53 subSize = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
54 chunkSize = chunkSize-subSize;
|
tomwalters@0
|
55 numChannels = Read16Bits(fid, littleEndian);
|
tomwalters@0
|
56 subSize = subSize - 2;
|
tomwalters@0
|
57 numSampleFrames = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
58 subSize = subSize - 4;
|
tomwalters@0
|
59 sampleSize = Read16Bits(fid, littleEndian);
|
tomwalters@0
|
60 subSize = subSize - 2;
|
tomwalters@0
|
61 sampleRate = ReadIEEE(fid, littleEndian);
|
tomwalters@0
|
62 subSize = subSize - 10;
|
tomwalters@0
|
63 fread(fid, subSize, 'char');
|
tomwalters@0
|
64 elseif chunkName' == double('SSND');
|
tomwalters@0
|
65 % disp('step SSND');
|
tomwalters@0
|
66 subSize = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
67 chunkSize = chunkSize - subSize;
|
tomwalters@0
|
68 offset = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
69 subSize = subSize - 4;
|
tomwalters@0
|
70 blockSize = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
71 subSize = subSize - 4;
|
tomwalters@0
|
72 soundPosition = ftell(fid) + offset;
|
tomwalters@0
|
73 fread(fid, subSize, 'char');
|
tomwalters@0
|
74 elseif chunkName' == double('LUT2');
|
tomwalters@0
|
75 % disp('step LUT2');
|
tomwalters@0
|
76 subSize = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
77 chunkSize = chunkSize - subSize;
|
tomwalters@0
|
78 interleaveLevel = Read16Bits(fid, littleEndian);
|
tomwalters@0
|
79 subSize = subSize - 2;
|
tomwalters@0
|
80 numWindowFrames = Read16Bits(fid, littleEndian);
|
tomwalters@0
|
81 subSize = subSize - 2;
|
tomwalters@0
|
82 staticTimeFlag = Read16Bits(fid, littleEndian);
|
tomwalters@0
|
83 subSize = subSize - 2;
|
tomwalters@0
|
84 outputTimeOffset = ReadIEEE(fid, littleEndian);
|
tomwalters@0
|
85 subSize = subSize - 10;
|
tomwalters@0
|
86 absoluteNormalise = ReadIEEE(fid, littleEndian);
|
tomwalters@0
|
87 subSize = subSize - 10;
|
tomwalters@0
|
88 fread(fid, subSize, 'char');
|
tomwalters@0
|
89
|
tomwalters@0
|
90 else;
|
tomwalters@0
|
91 subSize = Read32Bits(fid, littleEndian);
|
tomwalters@0
|
92 chunkSize = chunkSize - subSize;
|
tomwalters@0
|
93 fread(fid, subSize, 'char');
|
tomwalters@0
|
94
|
tomwalters@0
|
95 end;
|
tomwalters@0
|
96 end;
|
tomwalters@0
|
97 wordSize = floor((sampleSize + 7 ) / 8);
|
tomwalters@0
|
98 normalise = (2^16 - 1) / 2^(17 - wordSize * 8) / absoluteNormalise;
|
tomwalters@0
|
99 switch wordSize
|
tomwalters@0
|
100 case 1, scale = normalise / 127.0;
|
tomwalters@0
|
101 case 2, scale = normalise / 32768.0;
|
tomwalters@0
|
102 case 4, scale = normalise / 32768.0 / 65536;
|
tomwalters@0
|
103 end
|
tomwalters@0
|
104 frameLength = numSampleFrames / numWindowFrames;
|
tomwalters@0
|
105 % signal = zeros(numChannels,frameLength, numWindowFrames);
|
tomwalters@0
|
106 fclose(fid);
|
tomwalters@0
|
107 if littleEndian
|
tomwalters@0
|
108 fopen(fname,'r','l');
|
tomwalters@0
|
109 % disp('open as little endian')
|
tomwalters@0
|
110 else
|
tomwalters@0
|
111 fopen(fname,'r','b');
|
tomwalters@0
|
112 % disp('open as big endian')
|
tomwalters@0
|
113 end
|
tomwalters@0
|
114 status = fseek(fid, soundPosition, 'bof');
|
tomwalters@0
|
115 % disp( [frameId numWindowFrames numChannels frameLength wordSize])
|
tomwalters@0
|
116 signal = ReadWinFrame2(fid, frameId, numWindowFrames, numChannels,frameLength, wordSize);
|
tomwalters@0
|
117 signal = signal .* scale;
|
tomwalters@0
|
118 status = fclose(fid);
|