view evaluationtools/comparechords.m @ 1:8973548174c1 tip

adding tools to repo
author christopherh
date Mon, 06 May 2013 14:43:47 +0100
parents
children
line wrap: on
line source

%COMPARECHORDS
%
% [match,success,errormessage] = comparechords(chord1, chord2, comparison,
% cardinality, inversion,verbose)
%
%
% COMPARISON OPTIONS:
%
% CHORDS
% s = string comparison
% ov = ordered pnset comparison
% op = ordered pcset comparison
% uv = ordered pnset comparison
% up = ordered pcset comparison
% 
% mx08 = compare using MIREX08 chord mapping
% mx09 = compare using MIREX09 chord mapping
%
% CHORDTYPES (root-blind)
% q = quality
% oi = ordered relative interval comparison
% or = ordered relative pitchclass set comparison
% ui = unordered relative interval comparison
% ur = unordered relative pitchclass set comparison


function [match,success,errormessage] = comparechords2(chord1, chord2, comparison, cardinality, inversion,verbose)

errormessage = '';
success = 1;
match = 0;

% remember these just in case there is an error to report
c1 = chord1;
c2 = chord2;

% initialise things if not specified...
if  nargin<3
    comparison = 's';
end

if  nargin<4
    cardinality = 6; % maximum cardinality in beatles collection
end

if  nargin<5
    inversion = 1;  % assume people want to keep inversion information
end

if  nargin<6
    verbose = 0;  
end



% if inversion is 0, strip bass intervals off the chords if they have them
if inversion==0
   chord1 = stripinversion(chord1); 
   chord2 = stripinversion(chord2);   
end
   
mx=0;
% strip roots from chords and replace with C if this is a chordtype comparison
switch lower(comparison)

    case  {'mx08','mx09'}
        mx=1;
        
    case {'q','oi','or','ui','ur'}
        chord1 = striproot(chord1,1);
        chord2 = striproot(chord2,1);
        
    case {'s','ov','op','uv','up'}
        % do nothing in this case...
        
    otherwise
        % not a recognised option so exit with errormessage
        errormessage = 'Error in comparechords: unrecognised comparison type';
        success = 0;
        
end


if (success)
    if mx
        
        % use a mirex 08/09 comparison
        
        year = str2num(comparison(3:4));
        
        if isempty(year)
            success = 0;
        else

           [val1,success] = mxmap(chord1, year);
           if success
                [val2,success] = mxmap(chord2, year);
            
                if success
                   if abs(val1-val2)==0
                       match = 1;              
                   end
                end
            end
        end
        
    else
        
       
        if length(comparison)==2
            % if the comparison is 2 chars then it is a set-matching option
            switch comparison
                case {'oi','ov','uv','ui'}
                    [set1x,bn,success,errormessage] = chord2notes(chord1,1);
                    if success
                        [set2x,bn,success,errormessage] = chord2notes(chord2,1);
                        % cludge to get the sets the right way round, fix
                        % later...
                        if success
                            set1 = set1x';
                            set2 = set2x';
                        end
                    end
                case {'ur','or','op','up'}
                    [set1, bc1, success,errormessage] = chord2pitchclasses(chord1);
                    if success
                        [set2, bc2,success,errormessage] = chord2pitchclasses(chord2);
                    end
                otherwise
                    %by this stage there shouldn't be an otherwise...
                    success = 0;
            end


            if success
                switch comparison
                    case {'ui','ur','uv','up'}
                      % do an unordered match 
                        [match,success,errormessage] = compareunorderedsets(set1,set2,cardinality);    

                    case {'ov','op','oi','or'}
                      % do an ordered match
                        [match,success,errormessage] = compareorderedsets(set1,set2,cardinality);    

                    otherwise
                        %by this stage there shouldn't be an otherwise...
                        success = 0;
                end
            end

        else
            % otherwise must be a string match
            [match,success,errormessage] = compareorderedsets(chord1,chord2);    
        end
    end
end


if success==0
    errormessage = [errormessage sprintf(['Error in comparechords: Couldn''t compare chords "' c1 '" and "' c2 '"\n'])];
    if verbose ==1
       fprintf(1,errormessage);
    end
end