To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Revision:

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);