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 |