diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/@mirtonalcentroid/mirtonalcentroid.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/MIRtoolbox1.3.2/MIRToolbox/@mirtonalcentroid/mirtonalcentroid.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,81 @@
+function varargout = mirtonalcentroid(orig,varargin)
+%   c = mirtonalcentroid(x) calculates the 6-dimensional tonal centroid
+%       vector from the chromagram. 
+%   It corresponds to a projection of the chords along circles of fifths, 
+%       of minor thirds, and of major thirds.
+%   [c ch] = mirtonalcentroid(x) also returns the intermediate chromagram.
+%
+% C. A. Harte and M. B. Sandler, Detecting harmonic change in musical
+%   audio, in Proceedings of Audio and Music Computing for Multimedia
+%   Workshop, Santa Barbara, CA, 2006. 
+
+        frame.key = 'Frame';
+        frame.type = 'Integer';
+        frame.number = 2;
+        frame.default = [0 0];
+        frame.keydefault = [.743 .1];
+    option.frame = frame;
+
+specif.option = option;
+
+varargout = mirfunction(@mirtonalcentroid,orig,varargin,nargout,specif,@init,@main);
+
+
+function [c type] = init(orig,option)
+if option.frame.length.val
+    c = mirchromagram(orig,'Frame',option.frame.length.val,...
+                                   option.frame.length.unit,...
+                                   option.frame.hop.val,...
+                                   option.frame.hop.unit);
+else
+    c = mirchromagram(orig);
+end
+type = 'mirtonalcentroid';
+
+
+function tc = main(ch,option,postoption)
+if iscell(ch)
+    ch = ch{1};
+end
+if isa(ch,'mirtonalcentroid')
+    tc = orig;
+    ch = [];
+else
+    x1 = sin(pi*7*(0:11)/6)';
+    y1 = cos(pi*7*(0:11)/6)';
+    % minor thirds circle
+    x2 = sin(pi*3*(0:11)/2)';
+    y2 = cos(pi*3*(0:11)/2)';
+    % major thirds circle
+    x3 = 0.5 * sin(pi*2*(0:11)/3)';
+    y3 = 0.5 * cos(pi*2*(0:11)/3)';
+    c = [x1 y1 x2 y2 x3 y3];
+    c = c';
+    tc = class(struct,'mirtonalcentroid',mirdata(ch));
+    tc = purgedata(tc);
+    tc = set(tc,'Title','Tonal centroid','Abs','dimensions','Ord','position');
+    m = get(ch,'Magnitude');
+    %disp('Computing tonal centroid...')
+    n = cell(1,length(m));  % The final structured list of magnitudes.
+    d = cell(1,length(m));  % The final structured list of centroid dimensions.
+    for i = 1:length(m)
+        mi = m{i};
+        if not(iscell(mi))
+            mi = {mi};
+        end
+        ni = cell(1,length(mi));    % The list of magnitudes.
+        di = cell(1,length(mi));    % The list of centroid dimensions.
+        for j = 1:length(mi)
+            mj = mi{j};
+            ni{j} = zeros(6,size(mj,2),size(mi,3));
+            for k = 1:size(mj,3)
+                ni{j}(:,:,k) = c * mj(:,:,k);
+            end
+            di{j} = repmat((1:6)',[1,size(mj,2),size(mi,3)]);
+        end
+        n{i} = ni;
+        d{i} = di;
+    end
+    tc = set(tc,'Positions',n,'Dimensions',d);
+end
+tc = {tc,ch};
\ No newline at end of file