annotate aux/prepare2listen.m @ 15:24be5e9ce25b tip

Update README
author Brecht De Man <brecht.deman@bcu.ac.uk>
date Thu, 20 Sep 2018 12:23:20 +0200
parents 866c5da4d357
children
rev   line source
b@4 1 function prepare2listen(foldername)
b@4 2 % PREPARE2LISTEN batch processes all audio files in a folder to prepare for
b@4 3 % a listening test, by
b@4 4 % - making sure everything is at the same sampling rate and bit depth;
b@4 5 % - removing subsequent zeros at the start and the end;
b@4 6 % - ensuring none of the files are equal to each other;
b@4 7 % - clipping the desired region from the file;
b@4 8 % - adding a fade in and fade out; and
b@4 9 % - setting the loudness at a predefined value.
b@4 10 % It then saves the result in a folder within the audio folder.
b@0 11 %
b@0 12 % by Brecht De Man at Centre for Digital Music, 5 June 2013
b@0 13
b@4 14 % PARAMETERS
b@4 15 newfolder = 'fragments';
b@4 16 fs = 96000; % Hz
b@4 17 bitdepth = 24;
b@8 18 starttime = 76; % SR1 88; SR2 76 % seconds
b@8 19 endtime = 152; % SR1 142; SR2 152 % seconds
b@4 20 fadetime = 1; % seconds
b@6 21 format = 'wav';
b@4 22 slash = '/';
b@4 23
b@6 24 target_loudness = -23; % dBLU (https://tech.ebu.ch/loudness)
b@5 25
b@6 26 tic; % measure time
b@6 27 list = dir([foldername '/*.' format]); % get files
b@4 28
b@4 29 % remove hidden files from list, and copy to new folder
b@4 30 % see http://www.mathworks.co.uk/matlabcentral/newsreader/view_thread/258220
b@6 31 newfoldername = [foldername slash newfolder]; % within original folder
b@6 32 if ~exist(newfoldername, 'dir') % if it doesn't exist yet
b@6 33 mkdir(foldername, newfolder); % make newfolder within folder
b@6 34 end
b@4 35 for k = length(list):-1:1
b@4 36 fname = list(k).name;
b@4 37 if fname(1) == '.'
b@4 38 list(k) = [];
b@4 39 else
b@4 40 copyfile([foldername slash list(k).name], ...
b@4 41 [newfoldername slash list(k).name]);
b@4 42 end
b@4 43 end
b@4 44
b@4 45 % set at same sampling rate and bit depth
b@12 46 %disp(['-- Ensuring audio is at ' num2str(fs) 'Hz / ' ...
b@6 47 num2str(bitdepth) ' bit...']);
b@12 48 %batchresample(newfoldername, fs, bitdepth);
b@6 49 % NOTE: clipfade(...) also tests sampling rate, but does not resample
b@6 50
b@6 51 % find doubles
b@6 52 disp('-- Checking for doubles...');
b@6 53 finddouble(newfoldername);
b@4 54
b@4 55 % strip zeros off beginning and end
b@6 56 disp('-- Stripping off leading and trailing zeros...');
b@4 57 stripzeros(newfoldername);
b@4 58
b@6 59 % align all audio files
b@6 60 disp('-- Aligning audio files...');
b@6 61 autoalign(newfoldername);
b@4 62
b@4 63 % clip and fade desired fragments
b@6 64 startmin = floor(starttime/60);
b@6 65 startsec = mod(starttime, 60);
b@6 66 endmin = floor(endtime/60);
b@6 67 endsec = mod(endtime, 60);
b@6 68 disp(['-- Fading in (' num2str(fadetime) 's) at ' num2str(startmin) ...
b@6 69 ':' num2str(startsec) ', fading out (' num2str(fadetime) 's) at '...
b@6 70 num2str(endmin) ':' num2str(endsec) '...']);
b@5 71 clipfade(newfoldername, starttime, endtime, fadetime, fs, bitdepth);
b@0 72
b@5 73 % open files and calculate their loudness, then adjust
b@6 74 disp(['-- Setting each file at ' num2str(target_loudness) 'dBLU ...']);
b@4 75 for i = 1:length(list)
b@5 76 disp([newfoldername slash list(i).name]); % DEBUG
b@6 77 audio = audioread([newfoldername slash list(i).name]);
b@5 78 initial_loudness = getloudness( audio, fs, 'ITU', 0);
b@5 79
b@5 80 % calculate difference in loudness
b@5 81 difference_loudness = target_loudness - initial_loudness;
b@5 82
b@5 83 % write back with adjusted loudness
b@6 84 newaudio = 10^(difference_loudness/20) .* audio;
b@5 85 audiowrite([newfoldername slash list(i).name],...
b@6 86 newaudio, fs, 'BitsPerSample', bitdepth);
b@4 87 end
b@6 88
b@6 89 elapsed_time = toc;
b@6 90 disp(['prepare2listen took ' num2str(elapsed_time) ...
b@6 91 ' seconds on folder ' foldername]);
b@0 92 end