tomwalters@0: % support file for 'aim-mat' tomwalters@0: % tomwalters@0: % This external file is included as part of the 'aim-mat' distribution package bleeck@3: % (c) 2011, University of Southampton bleeck@3: % Maintained by Stefan Bleeck (bleeck@gmail.com) bleeck@3: % download of current version is on the soundsoftware site: bleeck@3: % http://code.soundsoftware.ac.uk/projects/aimmat bleeck@3: % documentation and everything is on http://www.acousticscale.org tomwalters@0: tomwalters@0: %%%%%%%%%%%%%%%%%%%%%%%%%%% tomwalters@0: % tomwalters@0: % File: ReadAIFF.m tomwalters@0: % Purpose: Reads an AIFF format file. tomwalters@0: % Comments: The default binary format is big-endian, if this does not tomwalters@0: % work, then little-endian format is tried. tomwalters@0: % Author: L. P. O'Mard tomwalters@0: % Revised by: M.Tsuzaki tomwalters@0: % Created: tomwalters@0: % Updated: 31,Oct.2001 tomwalters@0: % Copyright: (c) 2000, University of Essex tomwalters@0: % tomwalters@0: %%%%%%%%%%%%%%%%%%%%%%%%%%% tomwalters@0: function signal = myReadAIFF(fname,frameId) tomwalters@0: if nargin < 2 tomwalters@0: frameId=1:10000; %default: read to end tomwalters@0: end tomwalters@0: absoluteNormalise = 1.0; tomwalters@0: [fid, msg] = fopen(fname); tomwalters@0: if fid == -1 tomwalters@0: error('File open error. Please check that the file name is correctly spelled.') tomwalters@0: end tomwalters@0: littleEndian = 0; tomwalters@0: aiff_form = ReadBytes(fid, 4, littleEndian); tomwalters@0: if aiff_form' == double('FORM') tomwalters@0: % disp('big-endian'); tomwalters@0: else tomwalters@0: % disp('little-endian'); tomwalters@0: littleEndian = 1; tomwalters@0: end; tomwalters@0: chunkSize = Read32Bits(fid, littleEndian); tomwalters@0: aiff_aiff = ReadBytes(fid, 4, littleEndian); tomwalters@0: if aiff_aiff' ~= double('AIFF') tomwalters@0: aiff_aiff tomwalters@0: disp('Not a valid AIFF file.'); tomwalters@0: return tomwalters@0: end; tomwalters@0: chunkSize = chunkSize - 16; tomwalters@0: while chunkSize - 4 > 0; tomwalters@0: chunkName = ReadBytes(fid, 4, littleEndian); tomwalters@0: chunkSize = chunkSize - 4; tomwalters@0: if chunkName' == double('COMM'); tomwalters@0: % disp('step COMM'); tomwalters@0: subSize = Read32Bits(fid, littleEndian); tomwalters@0: chunkSize = chunkSize-subSize; tomwalters@0: numChannels = Read16Bits(fid, littleEndian); tomwalters@0: subSize = subSize - 2; tomwalters@0: numSampleFrames = Read32Bits(fid, littleEndian); tomwalters@0: subSize = subSize - 4; tomwalters@0: sampleSize = Read16Bits(fid, littleEndian); tomwalters@0: subSize = subSize - 2; tomwalters@0: sampleRate = ReadIEEE(fid, littleEndian); tomwalters@0: subSize = subSize - 10; tomwalters@0: fread(fid, subSize, 'char'); tomwalters@0: elseif chunkName' == double('SSND'); tomwalters@0: % disp('step SSND'); tomwalters@0: subSize = Read32Bits(fid, littleEndian); tomwalters@0: chunkSize = chunkSize - subSize; tomwalters@0: offset = Read32Bits(fid, littleEndian); tomwalters@0: subSize = subSize - 4; tomwalters@0: blockSize = Read32Bits(fid, littleEndian); tomwalters@0: subSize = subSize - 4; tomwalters@0: soundPosition = ftell(fid) + offset; tomwalters@0: fread(fid, subSize, 'char'); tomwalters@0: elseif chunkName' == double('LUT2'); tomwalters@0: % disp('step LUT2'); tomwalters@0: subSize = Read32Bits(fid, littleEndian); tomwalters@0: chunkSize = chunkSize - subSize; tomwalters@0: interleaveLevel = Read16Bits(fid, littleEndian); tomwalters@0: subSize = subSize - 2; tomwalters@0: numWindowFrames = Read16Bits(fid, littleEndian); tomwalters@0: subSize = subSize - 2; tomwalters@0: staticTimeFlag = Read16Bits(fid, littleEndian); tomwalters@0: subSize = subSize - 2; tomwalters@0: outputTimeOffset = ReadIEEE(fid, littleEndian); tomwalters@0: subSize = subSize - 10; tomwalters@0: absoluteNormalise = ReadIEEE(fid, littleEndian); tomwalters@0: subSize = subSize - 10; tomwalters@0: fread(fid, subSize, 'char'); tomwalters@0: tomwalters@0: else; tomwalters@0: subSize = Read32Bits(fid, littleEndian); tomwalters@0: chunkSize = chunkSize - subSize; tomwalters@0: fread(fid, subSize, 'char'); tomwalters@0: tomwalters@0: end; tomwalters@0: end; tomwalters@0: wordSize = floor((sampleSize + 7 ) / 8); tomwalters@0: normalise = (2^16 - 1) / 2^(17 - wordSize * 8) / absoluteNormalise; tomwalters@0: switch wordSize tomwalters@0: case 1, scale = normalise / 127.0; tomwalters@0: case 2, scale = normalise / 32768.0; tomwalters@0: case 4, scale = normalise / 32768.0 / 65536; tomwalters@0: end tomwalters@0: frameLength = numSampleFrames / numWindowFrames; tomwalters@0: % signal = zeros(numChannels,frameLength, numWindowFrames); tomwalters@0: fclose(fid); tomwalters@0: if littleEndian tomwalters@0: fopen(fname,'r','l'); tomwalters@0: % disp('open as little endian') tomwalters@0: else tomwalters@0: fopen(fname,'r','b'); tomwalters@0: % disp('open as big endian') tomwalters@0: end tomwalters@0: status = fseek(fid, soundPosition, 'bof'); tomwalters@0: % disp( [frameId numWindowFrames numChannels frameLength wordSize]) tomwalters@0: signal = ReadWinFrame2(fid, frameId, numWindowFrames, numChannels,frameLength, wordSize); tomwalters@0: signal = signal .* scale; tomwalters@0: status = fclose(fid);