To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / _song / song_syncchroma_special.m
History | View | Annotate | Download (3.43 KB)
| 1 |
function song = song_syncchroma_special(song, param) |
|---|---|
| 2 |
|
| 3 |
[song.syncchroma.treble, treblenrm, beats] = syncchroma(song.chroma.treble, song.beattimes, song.t); |
| 4 |
[song.syncchroma.bass, bassnrm] = syncchroma(song.chroma.bass, song.beattimes, song.t(:)); |
| 5 |
|
| 6 |
song.syncchroma.bass(isnan(sum(song.syncchroma.bass,2)),:) = 1; |
| 7 |
song.syncchroma.treble(isnan(sum(song.syncchroma.treble,2)),:) = 1; |
| 8 |
|
| 9 |
song.syncchroma.bass(sum(song.syncchroma.bass,2)<.01,:) = 1; |
| 10 |
song.syncchroma.treble(sum(song.syncchroma.treble,2)<.01,:) = 1; |
| 11 |
|
| 12 |
bcnrm = qnorm(song.syncchroma.bass,1,2); |
| 13 |
if param.dsp.bassbin13 % if the model requires a thirteenth bass bin |
| 14 |
bc = qnormalise(song.syncchroma.bass,1,2); |
| 15 |
bc13 = (12 * max(bc,[],2)).^(-2) .* bcnrm; |
| 16 |
bc13(isnan(bc13)) = 1; |
| 17 |
song.syncchroma.bass = [song.syncchroma.bass, bc13]; |
| 18 |
end |
| 19 |
|
| 20 |
switch param.dsp.norm |
| 21 |
case 'max' |
| 22 |
song.syncchroma.bass = qnormalise(song.syncchroma.bass,inf,2); |
| 23 |
song.syncchroma.treble = qnormalise(song.syncchroma.treble,inf,2); |
| 24 |
case 'L1' |
| 25 |
song.syncchroma.bass = qnormalise(song.syncchroma.bass,1,2); |
| 26 |
song.syncchroma.treble = qnormalise(song.syncchroma.treble,1,2); |
| 27 |
case 'L2' |
| 28 |
song.syncchroma.bass = qnormalise(song.syncchroma.bass,2,2); |
| 29 |
song.syncchroma.treble = qnormalise(song.syncchroma.treble,2,2); |
| 30 |
case 'standardize' |
| 31 |
song.syncchroma.bass = standardize(song.syncchroma.bass); |
| 32 |
song.syncchroma.treble = standardize(song.syncchroma.treble); |
| 33 |
case 'meta' |
| 34 |
song.syncchroma.bass = qnormalise(song.syncchroma.bass,inf,2); |
| 35 |
disp('no standardization for treble chroma; max normalisation for bass')
|
| 36 |
otherwise |
| 37 |
'blub' |
| 38 |
end |
| 39 |
|
| 40 |
% make all NaNs to 1 |
| 41 |
song.syncchroma.bass(isnan(sum(song.syncchroma.bass,2)),:) = 1; |
| 42 |
song.syncchroma.treble(isnan(sum(song.syncchroma.treble,2)),:) = 1; |
| 43 |
% aah, what does this do??? |
| 44 |
% song.syncchroma.bass(sum(song.syncchroma.bass,2) < 1,:) = 1; |
| 45 |
% song.syncchroma.treble(sum(song.syncchroma.treble,2) < 1,:) = 1; |
| 46 |
|
| 47 |
|
| 48 |
|
| 49 |
|
| 50 |
% below "wide" chroma processing, that's neglected ... |
| 51 |
try |
| 52 |
[song.syncchroma.wide, widenrm] = syncchroma(song.chroma.wide, song.beattimes, song.t); |
| 53 |
for iBeat = 1:song.nBeat |
| 54 |
song.syncchroma.wide(iBeat,:) = song.syncchroma.wide(iBeat,:) / widenrm(iBeat); |
| 55 |
end |
| 56 |
catch |
| 57 |
warning('could not find wide chroma');
|
| 58 |
end |
| 59 |
|
| 60 |
|
| 61 |
|
| 62 |
function [bc, nrm, beats] = syncchroma(chromag,beats,frame_t) |
| 63 |
% assigning beats to frames |
| 64 |
nBeat = size(beats,1); |
| 65 |
nFrame = length(frame_t); |
| 66 |
|
| 67 |
bc = ones(nBeat,size(chromag,1)); |
| 68 |
chromag(:,isnan(sum(chromag))) = 1; |
| 69 |
% first beat |
| 70 |
currind = find(frame_t >= beats(1,1) & frame_t < beats(1,2)); |
| 71 |
bc(1,:) = median(chromag(:,currind),2)'; |
| 72 |
for iBeat = 2:nBeat |
| 73 |
% prestarttimes = [beats(iBeat - 1,1), beats(iBeat,1), beats(iBeat,2)]; |
| 74 |
% starttimes = (prestarttimes + beats(iBeat,1))/2; |
| 75 |
starttimes = beats(iBeat,1) + [-.1 -.05 0 .05 .1]; |
| 76 |
entro = 0; |
| 77 |
for iST = 1:5 |
| 78 |
currind1 = find(frame_t >= beats(iBeat - 1,1) & frame_t < starttimes(iST)); |
| 79 |
currind2 = find(frame_t >= starttimes(iST) & frame_t < beats(iBeat,2)); |
| 80 |
vec = [ mean(chromag(:,currind2),2)']; |
| 81 |
vec = vec/sum(vec); |
| 82 |
vec = vec(vec>0); |
| 83 |
ent = -vec * log2(vec'); |
| 84 |
if ent > entro |
| 85 |
entro = ent; |
| 86 |
beats(iBeat - 1, 2) = starttimes(iST); |
| 87 |
beats(iBeat, 1) = starttimes(iST); |
| 88 |
end |
| 89 |
end |
| 90 |
currind = find(frame_t >= beats(iBeat,1) & frame_t < beats(iBeat,2)); |
| 91 |
bc(iBeat,:) = median(chromag(:,currind),2)'; |
| 92 |
end |
| 93 |
|
| 94 |
nrm = qnorm(bc,inf,2); |
| 95 |
% bc = qnormalise(bc,inf,2); |