annotate aim-mat/tools/myReadAIFF.m @ 4:537f939baef0 tip

various bug fixes and changed copyright message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:37:17 +0100
parents 20ada0af3d7d
children
rev   line source
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);