Chris@0: function [f_chroma_norm,sideinfo] = pitch_to_chroma(f_pitch,parameter,sideinfo) Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Name: pitch_to_chroma Chris@0: % Date of Revision: 2011-03 Chris@0: % Programmer: Meinard Mueller, Sebastian Ewert Chris@0: % Chris@0: % Description: Chris@0: % Computes normalized chroma vectors from pitch features Chris@0: % Chris@0: % Input: Chris@0: % f_pitch Chris@0: % parameter.applyLogCompr = 0; Chris@0: % parameter.factorLogCompr = 100; Chris@0: % parameter.addTermLogCompr = 1; Chris@0: % parameter.winLenSmooth = 1; Chris@0: % parameter.downsampSmooth = 1; Chris@0: % parameter.applyNormalization = 1; Chris@0: % parameter.normP = 2; Chris@0: % parameter.normThresh = 0.001; Chris@0: % parameter.midiMin = 1; Chris@0: % parameter.midiMax = 120; Chris@0: % parameter.inputFeatureRate = 0; Chris@0: % parameter.save = 0; Chris@0: % parameter.save_dir = ''; Chris@0: % parameter.save_filename = ''; Chris@0: % parameter.visualize = 0; Chris@0: % sideinfo Chris@0: % Chris@0: % Output: Chris@0: % f_chroma_norm Chris@0: % sideinfo Chris@0: % Chris@0: % License: Chris@0: % This file is part of 'Chroma Toolbox'. Chris@0: % Chris@0: % 'Chroma Toolbox' is free software: you can redistribute it and/or modify Chris@0: % it under the terms of the GNU General Public License as published by Chris@0: % the Free Software Foundation, either version 2 of the License, or Chris@0: % (at your option) any later version. Chris@0: % Chris@0: % 'Chroma Toolbox' is distributed in the hope that it will be useful, Chris@0: % but WITHOUT ANY WARRANTY; without even the implied warranty of Chris@0: % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Chris@0: % GNU General Public License for more details. Chris@0: % Chris@0: % You should have received a copy of the GNU General Public License Chris@0: % along with 'Chroma Toolbox'. If not, see . Chris@0: % Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Check parameters Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: Chris@0: if nargin<3 Chris@0: sideinfo=[]; Chris@0: end Chris@0: if nargin<2 Chris@0: parameter=[]; Chris@0: end Chris@0: if nargin<1 Chris@0: error('Please specify input data f_pitch'); Chris@0: end Chris@0: Chris@0: if isfield(parameter,'applyLogCompr')==0 Chris@0: parameter.applyLogCompr = 0; Chris@0: end Chris@0: if isfield(parameter,'factorLogCompr')==0 Chris@0: parameter.factorLogCompr = 100; Chris@0: end Chris@0: if isfield(parameter,'addTermLogCompr')==0 Chris@0: parameter.addTermLogCompr = 1; Chris@0: end Chris@0: if isfield(parameter,'winLenSmooth')==0 Chris@0: parameter.winLenSmooth = 1; Chris@0: end Chris@0: if isfield(parameter,'downsampSmooth')==0 Chris@0: parameter.downsampSmooth = 1; Chris@0: end Chris@0: if isfield(parameter,'applyNormalization')==0 Chris@0: parameter.applyNormalization = 1; Chris@0: end Chris@0: if isfield(parameter,'normP')==0 Chris@0: parameter.normP = 2; Chris@0: end Chris@0: if isfield(parameter,'normThresh')==0 Chris@0: parameter.normThresh = 0.001; Chris@0: end Chris@0: if isfield(parameter,'midiMin')==0 Chris@0: parameter.midiMin = 1; Chris@0: end Chris@0: if isfield(parameter,'midiMax')==0 Chris@0: parameter.midiMax = 120; Chris@0: end Chris@0: if isfield(parameter,'inputFeatureRate')==0 Chris@0: parameter.inputFeatureRate = 0; Chris@0: end Chris@0: if isfield(parameter,'save')==0 Chris@0: parameter.save = 0; Chris@0: end Chris@0: if isfield(parameter,'save_dir')==0 Chris@0: parameter.save_dir = ''; Chris@0: end Chris@0: if isfield(parameter,'save_filename')==0 Chris@0: parameter.save_filename = ''; Chris@0: end Chris@0: if isfield(parameter,'visualize')==0 Chris@0: parameter.visualize = 0; Chris@0: end Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Main program Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: Chris@0: seg_num = size(f_pitch,2); Chris@0: Chris@0: if parameter.applyLogCompr Chris@0: f_pitch = log10(parameter.addTermLogCompr+f_pitch*parameter.factorLogCompr); Chris@0: end Chris@0: Chris@0: % calculate energy for each chroma band Chris@0: f_chroma = zeros(12,seg_num); Chris@0: for p=parameter.midiMin:parameter.midiMax Chris@0: chroma = mod(p,12)+1; Chris@0: f_chroma(chroma,:) = f_chroma(chroma,:)+f_pitch(p,:); Chris@0: end Chris@0: Chris@0: % Temporal smoothing and downsampling Chris@0: [f_chroma,chromaFeatureRate] = smoothDownsampleFeature(f_chroma,parameter); Chris@0: Chris@0: if parameter.applyNormalization Chris@0: % normalise the chroma vectors according the norm l^p Chris@0: f_chroma_norm = normalizeFeature(f_chroma,parameter.normP, parameter.normThresh); Chris@0: end Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Update sideinfo Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: sideinfo.chroma.applyLogCompr = parameter.applyLogCompr; Chris@0: sideinfo.chroma.factorLogCompr = parameter.factorLogCompr; Chris@0: sideinfo.chroma.addTermLogCompr = parameter.addTermLogCompr; Chris@0: sideinfo.chroma.winLenSmooth = parameter.winLenSmooth; Chris@0: sideinfo.chroma.downsampSmooth = parameter.downsampSmooth; Chris@0: sideinfo.chroma.applyNormalization = parameter.applyNormalization; Chris@0: sideinfo.chroma.normP = parameter.normP; Chris@0: sideinfo.chroma.normThresh = parameter.normThresh; Chris@0: sideinfo.chroma.midiMin = parameter.midiMin; Chris@0: sideinfo.chroma.midiMax = parameter.midiMax; Chris@0: sideinfo.chroma.chromaFeatureRate = chromaFeatureRate; Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Saving to file Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: if parameter.save == 1 Chris@0: filename = strcat(parameter.save_filename,'_chroma'); Chris@0: save(strcat(parameter.save_dir,filename),'f_chroma_norm','f_chroma','sideinfo'); Chris@0: end Chris@0: Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Visualization Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: if parameter.visualize Chris@0: titleString = 'Chromagram'; Chris@0: imagerange = [0 1]; Chris@0: if parameter.applyLogCompr Chris@0: titleString = ['Log ', titleString]; Chris@0: end Chris@0: if parameter.applyNormalization Chris@0: imagerange = 0; Chris@0: titleString = ['Normalized ', titleString]; Chris@0: end Chris@0: parameterVis.imagerange = imagerange; Chris@0: parameterVis.featureRate = chromaFeatureRate; Chris@0: parameterVis.title = titleString; Chris@0: visualizeChroma(f_chroma_norm,parameterVis) Chris@0: end Chris@0: Chris@0: end