Mercurial > hg > c4dm-chord-transcriptions
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/evaluationtools/comparechords.m Mon May 06 14:43:47 2013 +0100 @@ -0,0 +1,165 @@ + +%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