tomwalters@0: % tool tomwalters@0: % tomwalters@0: % INPUT VALUES: tomwalters@0: % tomwalters@0: % RETURN VALUE: tomwalters@0: % tomwalters@0: % 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 bleeck@3: tomwalters@0: tomwalters@0: %%%%%%%%%%%%%%%%%%%%%%%%%%% tomwalters@0: % tomwalters@0: % File: GetAIFFinfo.m tomwalters@0: % by stefan@bleeck.de tomwalters@0: %%%%%%%%%%%%%%%%%%%%%%%%%%% tomwalters@0: tomwalters@0: function ret = GetAIFFinfo(fname) tomwalters@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: tomwalters@0: chunkSize = Read32Bits(fid, littleEndian); tomwalters@0: 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: 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 = ReadIEEE2(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 = ReadIEEE2(fid, littleEndian); tomwalters@0: subSize = subSize - 10; tomwalters@0: absoluteNormalise = ReadIEEE2(fid, littleEndian); tomwalters@0: 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: fclose(fid); tomwalters@0: 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: tomwalters@0: ret.totalframetime=frameLength/sampleRate; tomwalters@0: ret.numWindowFrames=numWindowFrames; tomwalters@0: ret.scale=scale; tomwalters@0: ret.wordSize=wordSize; tomwalters@0: ret.soundPosition=soundPosition; tomwalters@0: ret.littleEndian=littleEndian; tomwalters@0: ret.frameLength=frameLength; tomwalters@0: ret.numChannels=numChannels; tomwalters@0: ret.numSampleFrames=numSampleFrames; tomwalters@0: ret.sampleSize=sampleSize; tomwalters@0: ret.sampleRate=sampleRate; tomwalters@0: ret.interleaveLevel=interleaveLevel; tomwalters@0: ret.numWindowFrames=numWindowFrames; tomwalters@0: ret.staticTimeFlag=staticTimeFlag; tomwalters@0: ret.outputTimeOffset=outputTimeOffset; tomwalters@0: ret.absoluteNormalise=absoluteNormalise;