changeset 0:b54ee0a0be67

Import MATLAB Chroma Toolbox
author Chris Cannam
date Wed, 05 Aug 2015 21:08:56 +0100
parents
children d5cb00143cf5
files matlab/MATLAB-Chroma-Toolbox_2.0/MIDI_FB_ellip_pitch_60_96_22050_Q25.mat matlab/MATLAB-Chroma-Toolbox_2.0/MIDI_FB_ellip_pitch_60_96_22050_Q25_minusHalf.mat matlab/MATLAB-Chroma-Toolbox_2.0/MIDI_FB_ellip_pitch_60_96_22050_Q25_minusQuarter.mat matlab/MATLAB-Chroma-Toolbox_2.0/MIDI_FB_ellip_pitch_60_96_22050_Q25_minusThird.mat matlab/MATLAB-Chroma-Toolbox_2.0/MIDI_FB_ellip_pitch_60_96_22050_Q25_minusThreeQuarters.mat matlab/MATLAB-Chroma-Toolbox_2.0/MIDI_FB_ellip_pitch_60_96_22050_Q25_minusTwoThird.mat matlab/MATLAB-Chroma-Toolbox_2.0/audio_to_pitch_via_FB.m matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Bach_BWV988-Aria-Measures1-4_Meinard_fast.wav matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Burgmueller_Op100-02-FirstPart_Meinard_SE.wav matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Systematic_Cadence-C-Major_Meinard_portato.wav matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Systematic_Cadence-C-Major_Meinard_staccato.wav matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Systematic_Chord-C-Major_Eight-Instruments.wav matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Systematic_Scale-C-Major_Meinard_fast.wav matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Systematic_Scale-C-Major_Meinard_middle.wav matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Bach_BWV988-Aria-Measures1-4_Meinard_fast_pitch_4410.mat matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Burgmueller_Op100-02-FirstPart_Meinard_SE_pitch_4410.mat matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Cadence-C-Major_Meinard_portato_pitch_4410.mat matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Cadence-C-Major_Meinard_staccato_pitch_4410.mat matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Chord-C-Major_Eight-Instruments_CRP_1_1.mat matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Chord-C-Major_Eight-Instruments_CRP_21_5.mat matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Chord-C-Major_Eight-Instruments_pitch_4410.mat matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Scale-C-Major_Meinard_fast_pitch_4410.mat matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Scale-C-Major_Meinard_middle_pitch_4410.mat matlab/MATLAB-Chroma-Toolbox_2.0/demoChromaToolbox.m matlab/MATLAB-Chroma-Toolbox_2.0/estimateTuning.m matlab/MATLAB-Chroma-Toolbox_2.0/generateMultiratePitchFilterbank.m matlab/MATLAB-Chroma-Toolbox_2.0/normalizeFeature.m matlab/MATLAB-Chroma-Toolbox_2.0/pitch_to_CENS.m matlab/MATLAB-Chroma-Toolbox_2.0/pitch_to_CRP.m matlab/MATLAB-Chroma-Toolbox_2.0/pitch_to_chroma.m matlab/MATLAB-Chroma-Toolbox_2.0/smoothDownsampleFeature.m matlab/MATLAB-Chroma-Toolbox_2.0/test_convert_audio_to_pitch.m matlab/MATLAB-Chroma-Toolbox_2.0/test_convert_pitch_to_CENS.m matlab/MATLAB-Chroma-Toolbox_2.0/test_convert_pitch_to_CRP.m matlab/MATLAB-Chroma-Toolbox_2.0/test_convert_pitch_to_chroma.m matlab/MATLAB-Chroma-Toolbox_2.0/visualizeCRP.m matlab/MATLAB-Chroma-Toolbox_2.0/visualizeChroma.m matlab/MATLAB-Chroma-Toolbox_2.0/visualizePitch.m matlab/MATLAB-Chroma-Toolbox_2.0/wav_to_audio.m
diffstat 39 files changed, 2294 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/MIDI_FB_ellip_pitch_60_96_22050_Q25.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/MIDI_FB_ellip_pitch_60_96_22050_Q25_minusHalf.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/MIDI_FB_ellip_pitch_60_96_22050_Q25_minusQuarter.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/MIDI_FB_ellip_pitch_60_96_22050_Q25_minusThird.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/MIDI_FB_ellip_pitch_60_96_22050_Q25_minusThreeQuarters.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/MIDI_FB_ellip_pitch_60_96_22050_Q25_minusTwoThird.mat has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/audio_to_pitch_via_FB.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,249 @@
+function [f_pitch,sideinfo] = audio_to_pitch_via_FB(f_audio,parameter,sideinfo)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: audio_to_pitch_via_FB
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description:
+% Computing and saving of pitch features via a pre-designed filterbank. 
+% features. For each window length specified via parameter.winLenSTMSP 
+% the following is computed:
+% - STMSP (short-time mean-square power) for each MIDI pitch between
+%   parameter.midiMin and parameter.midiMax
+% - STMSP subbands are stored in f_pitch, where f_pitch(p,:) contains
+%   STMSP of subband of pitch p
+% - sideinfo contains information of original pcm, which is saved along
+%   with f_pitch into a single mat-file
+% - Information f_pitch and sideinfo is stored in mat-file:
+%   save(strcat(parameter.saveDir,parameter.saveFilename),'f_pitch','sideinfo');
+%
+% Input:
+%        f_audio
+%        parameter.winLenSTMSP = 4410;
+%        parameter.shiftFB = 0;
+%        parameter.midiMin = 21;
+%        parameter.midiMax = 108;
+%        parameter.save = 0;
+%           parameter.saveDir = '';
+%           parameter.saveFilename = '';
+%           parameter.saveAsTuned = 0;
+%        parameter.fs = 22050;
+%        parameter.visualize = 0;
+%
+% Required files:
+%        'MIDI_FB_ellip_pitch_60_96_22050_Q25.mat'
+%        'MIDI_FB_ellip_pitch_60_96_22050_Q25_minusHalf.mat'
+%        'MIDI_FB_ellip_pitch_60_96_22050_Q25_minusQuarter.mat'
+%        'MIDI_FB_ellip_pitch_60_96_22050_Q25_minusThird.mat'
+%        'MIDI_FB_ellip_pitch_60_96_22050_Q25_minusThreeQuarters.mat'
+%        'MIDI_FB_ellip_pitch_60_96_22050_Q25_minusTwoThird.mat'
+%
+% Output:
+%        f_pitch
+%        sideinfo
+%
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Check parameters
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if nargin<3
+    sideinfo=[];
+end
+
+if nargin<2
+    parameter=[];
+end
+if isfield(parameter,'visualize')==0
+    parameter.visualize = 0;
+end
+if isfield(parameter,'save')==0
+    parameter.save = 0;
+end
+if isfield(parameter,'saveDir')==0
+    parameter.saveDir = '';
+end
+if isfield(parameter,'saveFilename')==0
+    parameter.saveFilename = '';
+end
+if isfield(parameter,'saveAsTuned')==0
+    parameter.saveAsTuned = 0;
+end
+if isfield(parameter,'fs')==0
+    parameter.fs = 22050;
+else
+    if parameter.fs ~= 22050
+        error('audio_to_pitch_via_FB not implemented yet for sample rates other than 22050.');
+    end
+end
+if isfield(parameter,'midiMin')==0
+    parameter.midiMin = 21;
+end
+if isfield(parameter,'midiMax')==0
+    parameter.midiMax = 108;
+end
+if isfield(parameter,'winLenSTMSP')==0
+    parameter.winLenSTMSP = 4410;
+    %parameter.winLenSTMSP = [882 4410];
+end
+if isfield(parameter,'shiftFB')==0
+    parameter.shiftFB = 0;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Main program
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if parameter.shiftFB == 0
+    load MIDI_FB_ellip_pitch_60_96_22050_Q25.mat
+elseif parameter.shiftFB == 1
+    load MIDI_FB_ellip_pitch_60_96_22050_Q25_minusQuarter.mat
+elseif parameter.shiftFB == 2
+    load MIDI_FB_ellip_pitch_60_96_22050_Q25_minusThird.mat
+elseif parameter.shiftFB == 3
+    load MIDI_FB_ellip_pitch_60_96_22050_Q25_minusHalf.mat
+elseif parameter.shiftFB == 4
+    load MIDI_FB_ellip_pitch_60_96_22050_Q25_minusTwoThird.mat
+elseif parameter.shiftFB == 5
+    load MIDI_FB_ellip_pitch_60_96_22050_Q25_minusThreeQuarters.mat
+else
+    error('Wrong shift parameter!')
+end
+
+fs_pitch = zeros(1,128);
+fs_index = zeros(1,128);
+
+fs_pitch(21:59) = 882;
+fs_pitch(60:95) = 4410;
+fs_pitch(96:120) = 22050;
+
+fs_index(21:59) = 3;
+fs_index(60:95) = 2;
+fs_index(96:120) = 1;
+
+pcm_ds = cell(3,1);
+pcm_ds{1} = f_audio;
+pcm_ds{2} = resample(pcm_ds{1},1,5,100);
+pcm_ds{3} = resample(pcm_ds{2},1,5,100);
+
+fprintf('Computing subbands and STMSP for all pitches: (%i-%i): %4i',parameter.midiMin,parameter.midiMax,0);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Compute features for all pitches
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+winLenSTMSP =  parameter.winLenSTMSP;
+winOvSTMSP  =  round(winLenSTMSP/2);
+featureRate =  parameter.fs./(winLenSTMSP-winOvSTMSP);  %formerly win_res
+wav_size = size(f_audio,1);
+
+num_window = length(winLenSTMSP);
+f_pitch_energy = cell(num_window,1);
+seg_pcm_num = cell(num_window,1);
+seg_pcm_start = cell(num_window,1);
+seg_pcm_stop = cell(num_window,1);
+for w=1:num_window;
+    step_size = winLenSTMSP(w)-winOvSTMSP(w);
+    group_delay = round(winLenSTMSP(w)/2);
+    seg_pcm_start{w} = [1 1:step_size:wav_size]';   %group delay is adjusted
+    seg_pcm_stop{w} = min(seg_pcm_start{w}+winLenSTMSP(w),wav_size);
+    seg_pcm_stop{w}(1) = min(group_delay,wav_size);
+    seg_pcm_num{w} = size(seg_pcm_start{w},1);
+    f_pitch_energy{w} = zeros(120,seg_pcm_num{w});
+end
+
+
+for p=parameter.midiMin:parameter.midiMax
+    fprintf('\b\b\b\b');fprintf('%4i',p);
+    index = fs_index(p);
+    f_filtfilt = filtfilt(h(p).b, h(p).a, pcm_ds{index});
+    f_square = f_filtfilt.^2;
+
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    % f_pitch_energy
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    for w=1:length(winLenSTMSP)
+        factor = (parameter.fs/fs_pitch(p));      %adjustment for sampling rate
+        for k=1:seg_pcm_num{w}
+            start = ceil((seg_pcm_start{w}(k)/parameter.fs)*fs_pitch(p));
+            stop = floor((seg_pcm_stop{w}(k)/parameter.fs)*fs_pitch(p));
+            f_pitch_energy{w}(p,k)=sum(f_square(start:stop))*factor;
+        end
+    end
+end
+fprintf('\n');
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Save f_pitch_energy for each window size separately as f_pitch
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+sideinfo.pitch.version = 1;
+sideinfo.pitch.midiMin = parameter.midiMin;
+sideinfo.pitch.midiMax = parameter.midiMax;
+if parameter.save == 1
+    for w=1:num_window;
+        f_pitch = f_pitch_energy{w};
+        sideinfo.pitch.winLenSTMSP = winLenSTMSP(w);
+        sideinfo.pitch.winOvSTMSP = winOvSTMSP(w);
+        sideinfo.pitch.featureRate = featureRate(w);
+        sideinfo.pitch.shiftFB = parameter.shiftFB;
+        sideinfo.pitch.featuresAreTuned = 0;
+        if parameter.saveAsTuned
+            sideinfo.pitch.featuresAreTuned = 1;
+            filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w)));
+        else
+            switch(parameter.shiftFB)
+                case 0
+                    filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w)));
+                case 1
+                    filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w)),'_minusQuarter');
+                case 2
+                    filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w)),'_minusThird');
+                case 3
+                    filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w)),'_minusHalf');
+                case 4
+                    filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w)),'_minusTwoThird');
+                case 5
+                    filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w)),'_minusThreeQuarter');
+            end
+        end
+        save(strcat(parameter.saveDir,filename),'f_pitch','sideinfo');
+    end
+else
+    f_pitch = f_pitch_energy{num_window};
+    sideinfo.pitch.winLenSTMSP = winLenSTMSP(num_window);
+    sideinfo.pitch.winOvSTMSP = winOvSTMSP(num_window);
+    sideinfo.pitch.featureRate = featureRate(num_window);
+    sideinfo.pitch.shiftFB = parameter.shiftFB;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Visualization
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if parameter.visualize == 1
+    for w=1:num_window;
+        parameterVis.featureRate = featureRate(w);
+        visualizePitch(f_pitch_energy{w},parameterVis);
+    end
+end
+
+end
+
+
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Bach_BWV988-Aria-Measures1-4_Meinard_fast.wav has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Burgmueller_Op100-02-FirstPart_Meinard_SE.wav has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Systematic_Cadence-C-Major_Meinard_portato.wav has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Systematic_Cadence-C-Major_Meinard_staccato.wav has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Systematic_Chord-C-Major_Eight-Instruments.wav has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Systematic_Scale-C-Major_Meinard_fast.wav has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_WAV/Systematic_Scale-C-Major_Meinard_middle.wav has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Bach_BWV988-Aria-Measures1-4_Meinard_fast_pitch_4410.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Burgmueller_Op100-02-FirstPart_Meinard_SE_pitch_4410.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Cadence-C-Major_Meinard_portato_pitch_4410.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Cadence-C-Major_Meinard_staccato_pitch_4410.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Chord-C-Major_Eight-Instruments_CRP_1_1.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Chord-C-Major_Eight-Instruments_CRP_21_5.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Chord-C-Major_Eight-Instruments_pitch_4410.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Scale-C-Major_Meinard_fast_pitch_4410.mat has changed
Binary file matlab/MATLAB-Chroma-Toolbox_2.0/data_feature/Systematic_Scale-C-Major_Meinard_middle_pitch_4410.mat has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/demoChromaToolbox.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,85 @@
+clear
+close all
+
+filename = 'Systematic_Chord-C-Major_Eight-Instruments.wav';
+[f_audio,sideinfo] = wav_to_audio('', 'data_WAV/', filename);
+shiftFB = estimateTuning(f_audio);
+
+paramPitch.winLenSTMSP = 4410;
+paramPitch.shiftFB = shiftFB;
+paramPitch.visualize = 1;
+[f_pitch,sideinfo] = ...
+    audio_to_pitch_via_FB(f_audio,paramPitch,sideinfo);
+
+paramCP.applyLogCompr = 0;
+paramCP.visualize = 1;
+paramCP.inputFeatureRate = sideinfo.pitch.featureRate;
+[f_CP,sideinfo] = pitch_to_chroma(f_pitch,paramCP,sideinfo);
+
+paramCLP.applyLogCompr = 1;
+paramCLP.factorLogCompr = 100;
+paramCLP.visualize = 1;
+paramCLP.inputFeatureRate = sideinfo.pitch.featureRate;
+[f_CLP,sideinfo] = pitch_to_chroma(f_pitch,paramCLP,sideinfo);
+
+paramCENS.winLenSmooth = 21;
+paramCENS.downsampSmooth = 5;
+paramCENS.visualize = 1;
+paramCENS.inputFeatureRate = sideinfo.pitch.featureRate;
+[f_CENS,sideinfo] = pitch_to_CENS(f_pitch,paramCENS,sideinfo);
+
+paramCRP.coeffsToKeep = [55:120];
+paramCRP.visualize = 1;
+paramCRP.inputFeatureRate = sideinfo.pitch.featureRate;
+[f_CRP,sideinfo] = pitch_to_CRP(f_pitch,paramCRP,sideinfo);
+
+paramSmooth.winLenSmooth = 21;
+paramSmooth.downsampSmooth = 5;
+paramSmooth.inputFeatureRate = sideinfo.CRP.featureRate;
+[f_CRPSmoothed, featureRateSmoothed] = ...
+    smoothDownsampleFeature(f_CRP,paramSmooth);
+parameterVis.featureRate = featureRateSmoothed;
+visualizeCRP(f_CRPSmoothed,parameterVis);
+
+
+% filename = 'Systematic_Chord-C-Major_Eight-Instruments.wav';
+% [f_audio,sideinfo] = wav_to_audio('', 'data_WAV/', filename);
+% shiftFB = estimateTuning(f_audio);
+%
+% paramPitch.win_len = 4410;
+% paramPitch.shiftFB = shiftFB;
+% paramPitch.visualize = 1;
+% [f_pitch,sideinfo] = ...
+%     audio_to_pitch_via_FB(f_audio,paramPitch,sideinfo);
+%
+% paramCP.applyLogCompr = 0;
+% paramCP.visualize = 1;
+% paramCP.inputFeatureRate = sideinfo.pitch.featureRate;
+% [f_CP,sideinfo] = pitch_to_chroma(f_pitch,paramCP,sideinfo);
+%
+% paramCLP.applyLogCompr = 1;
+% paramCLP.logParamMult = 100;
+% paramCLP.visualize = 1;
+% paramCLP.inputFeatureRate = sideinfo.pitch.featureRate;
+% [f_CLP,sideinfo] = pitch_to_chroma(f_pitch,paramCLP,sideinfo);
+%
+% paramCENS.stat_window_length = 21;
+% paramCENS.stat_downsample = 5;
+% paramCENS.visualize = 1;
+% paramCENS.inputFeatureRate = sideinfo.pitch.featureRate;
+% [f_CENS,sideinfo] = pitch_to_CENS(f_pitch,paramCENS,sideinfo);
+%
+% paramCRP.coeffsToKeep = [55:120];
+% paramCRP.visualize = 1;
+% paramCRP.inputFeatureRate = sideinfo.pitch.featureRate;
+% [f_CRP,sideinfo] = pitch_to_CRP(f_pitch,paramCRP,sideinfo);
+%
+% paramSmooth.stat_window_length = 21;
+% paramSmooth.stat_downsample = 5;
+% paramSmooth.inputFeatureRate = sideinfo.CRP.featureRate;
+% [f_CRPSmoothed, featureRateSmoothed] = ...
+%     smoothDownsampleFeature(f_CRP,paramSmooth);
+% parameterVis.featureRate = featureRateSmoothed;
+% visualize_CRP(f_CRPSmoothed,parameterVis);
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/estimateTuning.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,230 @@
+function [shiftFB,centerA4,tuningSemitones,sideinfo] = estimateTuning(f_input,parameter,sideinfo)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: estimateTuning
+% Date of Revision: 2011-03
+% Programmer: Sebastian Ewert
+%
+% Description:
+% - input is either a mono audio signal or a real valued spectrogram (magnitude or power)
+% - if input is a spectrogram you have to set parameter.timeinfo and
+% parameter.freqinfo (vectors defining the time and freq centers for each spectrogram bin)
+% - if input is an audio signal, a sampling freq of 22050 Hz is assumed
+% - guesses the tuning according to a simple energy maximizing criterion
+% - output is either: what shiftFB is best to use (shiftFB \in [0:5]).
+%   Alternatively, the center freq for A4 is given which can be used to
+%   specify a filterbank on your own. The second option is more fine
+%   grained.
+%   Alternatively, it gives a tuning in semitones, which can
+%   easily be shifted cyclicly. For example: a tuning of -19/20 is more likely to be
+%   +1/20 Tuning difference.
+% - parameter.numAdditionalTunings: how many tunings besides the fixed shiftFB ones
+% to test. For example: If set to 3, than three additional tuning settings are
+% tested for, located at 1/4, 2/4 and 3/4 semitones below the reference
+% tuning. If set to 5, then at 1/6, 2/6,..., 5/6 semitones.
+% - parameter.pitchRange specifies which pitches are considered for the
+% tuning estimation. 
+% - parameter.pitchWeights: each pitch is considered according to a weight
+% - Middle pitches are considered as being more important per default because
+% here the frequency resolution is high enough. Additionally the piano has
+% a consistent tuning only for middle pitches.
+%
+% Input:
+%        f_input
+%        parameter.numAdditionalTunings = 0;
+%        parameter.pitchRange = [21:108];
+%        parameter.pitchWeights = gausswin(length(parameter.pitchRange)).^2;  
+%        parameter.fftWindowLength = 8192;
+%        parameter.windowFunction = @hanning;
+%        sideinfo
+%
+% Output:
+%        shiftFB
+%        centerA4
+%        tuningSemitones
+%        sideinfo
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Check parameters
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if nargin<2
+    parameter=[];
+end
+if nargin<1
+    error('Please specify input data');
+end
+
+if isfield(parameter,'numAdditionalTunings')==0
+    parameter.numAdditionalTunings = 0;
+end
+if isfield(parameter,'pitchRange')==0
+    % Which pitches to consider during the estimation
+    parameter.pitchRange = [21:108];
+end
+if isfield(parameter,'pitchWeights')==0
+    % assign a weight to each pitch specified in parameter.pitchRange to
+    % specify it's importance
+    parameter.pitchWeights = gausswin(length(parameter.pitchRange)).^2;  
+end
+
+% the following parameters are only for audio signal input
+if isfield(parameter,'fftWindowLength')==0
+    parameter.fftWindowLength = 8192;
+end
+if isfield(parameter,'windowFunction')==0
+    parameter.windowFunction = @hanning;  % only tested with hanning. 
+end
+
+if min(size(f_input)) == 1
+    inputIsAudioSignal = 1;
+else
+    inputIsAudioSignal = 0;
+end
+
+if ~inputIsAudioSignal
+    if isfield(parameter,'freqinfo')==0
+        error('When using a spectrogram input you have to set parameter.freqinfo');
+    end
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Main program
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+numTunings = 6 + parameter.numAdditionalTunings;
+referenceFreqsA4 = zeros(numTunings,1);
+tunings = zeros(numTunings,1);
+
+tunings(1) = 0;
+tunings(2) = -1/4;
+tunings(3) = -1/3;
+tunings(4) = -1/2;
+tunings(5) = -2/3;
+tunings(6) = -3/4;
+for k=1:parameter.numAdditionalTunings
+    tunings(k+6) = -k/(parameter.numAdditionalTunings+1);
+end
+referenceFreqsA4 = 2.^((69-69+tunings)/12) * 440;
+
+if inputIsAudioSignal
+    [s,f,t] = spectrogram(f_input, parameter.windowFunction(parameter.fftWindowLength), parameter.fftWindowLength/2, parameter.fftWindowLength, 22050);
+else
+    s = f_input;
+    f = parameter.freqinfo;
+end
+s = abs(s);
+
+directFreqBinSearch = 0;
+if all( (f(2:end)-f(1:end-1)) - (f(2)-f(1)) < eps )
+    directFreqBinSearch = 1;
+end
+
+averagedPowerSpectrogram = sum(s.^2,2);
+totalPitchEnergyViaSpec = zeros(numTunings,1);
+for tu=1:numTunings
+    centerfreqs = 2.^((parameter.pitchRange-69)/12) * referenceFreqsA4(tu);
+    upperborderfreqs = 2.^((parameter.pitchRange-68.5)/12) * referenceFreqsA4(tu);
+    lowerborderfreqs = 2.^((parameter.pitchRange-69.5)/12) * referenceFreqsA4(tu);
+    
+    % build triangular filterbank for magnitude spectrogram
+    spectrogramFilter = zeros(length(f),1);
+    for k=1:length(parameter.pitchRange)        
+        c = getCorrespondingBin(f,centerfreqs(k),directFreqBinSearch);
+        u = getCorrespondingBin(f,upperborderfreqs(k),directFreqBinSearch);
+        l = getCorrespondingBin(f,lowerborderfreqs(k),directFreqBinSearch);
+        
+        % order is important here. If third parameter is < 2, then linspace
+        % returns the second parameter
+        spectrogramFilter(c:u) = parameter.pitchWeights(k) * linspace(1,0,u-c+1);
+        spectrogramFilter(l:c) = parameter.pitchWeights(k) * linspace(0,1,c-l+1);
+    end
+
+    totalPitchEnergyViaSpec(tu) = sum(spectrogramFilter.^2 .* averagedPowerSpectrogram);    
+end
+
+[ignoreMe, maxIndex] = max(totalPitchEnergyViaSpec(1:6));
+shiftFB = maxIndex-1;
+
+[ignoreMe, maxIndex] = max(totalPitchEnergyViaSpec);
+centerA4 = referenceFreqsA4(maxIndex);
+tuningSemitones = tunings(maxIndex);
+
+sideinfo.tuning.shiftFB = shiftFB;
+sideinfo.tuning.centerA4 = centerA4;
+sideinfo.tuning.tuningSemitones = tuningSemitones;
+sideinfo.tuning.method = 'estimateTuningV1';
+sideinfo.tuning.numAdditionalTunings = parameter.numAdditionalTunings;
+sideinfo.tuning.pitchRange = parameter.pitchRange;
+sideinfo.tuning.pitchWeights = parameter.pitchWeights;
+sideinfo.tuning.fftWindowLength = parameter.fftWindowLength;
+sideinfo.tuning.windowFunction = parameter.windowFunction;
+sideinfo.tuning.inputWasAudioSignal = inputIsAudioSignal;
+
+end
+
+function index = getCorrespondingBin(x,sval,directSearch)
+% - Finds the entry in x with the smallest absolute distance to sval.
+% - x is assumed to be sorted (ascending)
+% - 'directSearch' means that all values in x are equally spaced
+% - x is assumed to be at least of length 2.
+% - If directSearch==0 then we use binary seach to find the entry
+%
+% You can test the correctness of this procedure by comparing it against
+% the result of:  [ignoreMe index] = min(abs(x-sval))
+%
+% Author: Sebastian Ewert
+
+if sval >= x(end)
+    index = length(x);
+    return;
+elseif sval <= x(1)
+    index = 1;
+    return;
+end
+
+
+if directSearch
+    index = round( (sval-x(1)) / (x(2)-x(1))) + 1;
+else
+    from=1;
+    to=length(x);
+    
+    while from<=to
+        mid = round((from + to)/2);
+        diff = x(mid)-sval;
+        if diff<0   % x(mid) < sval
+            from=mid;
+        else              % x(mid) => sval
+            to=mid;
+        end
+        
+        if to-from==1
+            break;
+        end
+    end
+    if abs(x(from)-sval) < abs(x(to)-sval)
+        index = from;
+    else
+        index = to;
+    end
+end
+
+end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/generateMultiratePitchFilterbank.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,134 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Generating filter bank of filters corresponding MIDI pitches
+%
+% Pitches 21-59, fs = 882
+% Pitches 60-95, fs = 4410
+% Pitches 96-120, fs =22050
+%
+% Q                  (center frequency) / bandwidt, Q > 30 separates notes
+% stop:              pass_rel = 1/(2*Q); stop_rel = stop*pass_rel;
+% Rp                 loses no more than Rp dB in the passband
+% Rs                 attenuation in the stopband in dB
+%
+% For details to filter desgin use MATLAB help function
+%                    e.g., "help ellipord" and "help ellip"
+%
+% Attention: Construction of [b,a] may fail if the
+%                   filter specification are too restrictive
+%
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+clear;
+
+semitoneOffsets = [0, -0.25, -1/3, -0.5, -2/3, -0.75];
+nameSuffixes = {''; '_minusQuarter'; '_minusThird'; '_minusHalf'; '_minusTwoThird'; '_minusThreeQuarters'};
+
+for k=1:length(semitoneOffsets)
+    
+    
+    midi = (1:128);                     % midi notes
+    midi_freq = 2.^((midi-69+semitoneOffsets(k))/12)*440;  % computing frequencies of midi notes
+    nameSuffix = nameSuffixes{k};
+    h(120)=struct('a',[],'b',[]);
+    
+    disp(['Generating Filterbank: ',nameSuffix]);
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    % fs = 22005, pitches 96-120
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    fs = 22050;
+    nyq = fs/2;
+    midi_min = 96;
+    midi_max = 120;
+    Q = 25; stop = 2; Rp = 1; Rs = 50;
+    pass_rel = 1/(2*Q);
+    stop_rel = pass_rel*stop;
+    
+    for k = midi_min:midi_max;
+        pitch = midi_freq(k);
+        Wp = [pitch-pass_rel*pitch pitch+pass_rel*pitch]/nyq;
+        Ws = [pitch-stop_rel*pitch pitch+stop_rel*pitch]/nyq;
+        [n Wn]=ellipord(Wp,Ws,Rp,Rs);
+        [h(k).b,h(k).a]=ellip(n,Rp,Rs,Wn);
+    end
+    num = midi_max-midi_min+1;
+    h_fvtool = cell(2*num,1);
+    for i = 1:num
+        h_fvtool{2*i-1}=h(midi_min+i-1).b;
+        h_fvtool{2*i}=h(midi_min+i-1).a;
+    end
+    fvtool(h_fvtool{:});
+    
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    % fs = 4410, pitches 60-95
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    fs = 4410;
+    nyq = fs/2;
+    midi_min = 60;
+    midi_max = 95;
+    Q = 25; stop = 2; Rp = 1; Rs = 50;
+    pass_rel = 1/(2*Q);
+    stop_rel = pass_rel*stop;
+    
+    for k = midi_min:midi_max;
+        pitch = midi_freq(k);
+        Wp = [pitch-pass_rel*pitch pitch+pass_rel*pitch]/nyq;
+        Ws = [pitch-stop_rel*pitch pitch+stop_rel*pitch]/nyq;
+        [n Wn]=ellipord(Wp,Ws,Rp,Rs);
+        [h(k).b,h(k).a]=ellip(n,Rp,Rs,Wn);
+    end
+    num = midi_max-midi_min+1;
+    h_fvtool = cell(2*num,1);
+    for i = 1:num
+        h_fvtool{2*i-1}=h(midi_min+i-1).b;
+        h_fvtool{2*i}=h(midi_min+i-1).a;
+    end
+    fvtool(h_fvtool{:});
+    
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    % fs = 882, pitches 21-59
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    fs = 882;
+    nyq = fs/2;
+    midi_min = 21;
+    midi_max = 59;
+    Q = 25; stop = 2; Rp = 1; Rs = 50;
+    pass_rel = 1/(2*Q);
+    stop_rel = pass_rel*stop;
+    
+    for k = midi_min:midi_max;
+        pitch = midi_freq(k);
+        Wp = [pitch-pass_rel*pitch pitch+pass_rel*pitch]/nyq;
+        Ws = [pitch-stop_rel*pitch pitch+stop_rel*pitch]/nyq;
+        [n Wn]=ellipord(Wp,Ws,Rp,Rs);
+        [h(k).b,h(k).a]=ellip(n,Rp,Rs,Wn);
+    end
+    num = midi_max-midi_min+1;
+    h_fvtool = cell(2*num,1);
+    for i = 1:num
+        h_fvtool{2*i-1}=h(midi_min+i-1).b;
+        h_fvtool{2*i}=h(midi_min+i-1).a;
+    end
+    fvtool(h_fvtool{:});
+    
+    
+    save(['MIDI_FB_ellip_pitch_60_96_22050_Q25',nameSuffix],'h','-V6');
+    
+end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/normalizeFeature.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,52 @@
+function f_featureNorm = normalizeFeature(f_feature,normP, threshold)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: normalizeFeature
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description:
+% - Normalizes a feature sequence according to the l^p norm
+% - If the norm falls below threshold for a feature vector, then the
+% normalized feature vector is set to be the unit vector.
+%
+% Input:
+%         f_feature
+%         normP
+%         threshold
+%
+% Output:
+%         f_featureNorm
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+f_featureNorm = zeros(size(f_feature));
+
+% normalise the vectors according to the l^p norm
+unit_vec = ones(1,12);
+unit_vec = unit_vec/norm(unit_vec,normP);
+for k=1:size(f_feature,2);
+    n = norm(f_feature(:,k),normP);
+    if n < threshold
+        f_featureNorm(:,k) = unit_vec;
+    else
+        f_featureNorm(:,k) = f_feature(:,k)/n;
+    end
+end
+
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/pitch_to_CENS.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,176 @@
+function [f_CENS,sideinfo] = pitch_to_CENS(f_pitch,parameter,sideinfo)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: pitch_to_CENS
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description:
+% Normalized statistical chroma-based energy distribution feature (CENS).
+% The following is computed:
+% * energy for each chroma band
+% * normalisation of the chroma vectors
+% * local statistics:
+%   - component-wise quantisation of the normalized chroma vectors
+%   - upfirdn filters and downsamples each column of f_stat_help
+%   - normalize each vector with its l^2 norm
+%
+% Remark:
+% * parameter.inputFeatureRate specifies the feature rate of f_pitch. The value
+% is used to derive the output feature rate given via sideinfo.
+%
+% Input:
+%         f_pitch
+%         parameter.quantSteps = [40 20 10 5] / 100;
+%         parameter.quantWeights = [ 1 1 1 1]/4;
+%         parameter.normThresh = 0.001;
+%         parameter.winLenSmooth = 41;
+%         parameter.downsampSmooth = 10;
+%         parameter.midiMin = 21;
+%         parameter.midiMax = 108;
+%         parameter.inputFeatureRate = 0;
+%         parameter.save = 0;
+%         parameter.saveDir = '';
+%         parameter.saveFilename = '';
+%         parameter.visualize = 0;
+%         sideinfo
+%
+% Output:
+%         f_CENS
+%         sideinfo
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Check parameters
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if nargin<3
+    sideinfo=[];
+end
+if nargin<2
+    parameter=[];
+end
+if nargin<1
+    error('Please specify input data f_pitch');
+end
+
+if isfield(parameter,'quantSteps')==0
+    parameter.quantSteps = [40 20 10 5] / 100;
+end
+if isfield(parameter,'quantWeights')==0
+    parameter.quantWeights = [ 1 1 1 1]/4;
+end
+if isfield(parameter,'normThresh')==0
+    parameter.normThresh = 0.001;
+end
+if isfield(parameter,'winLenSmooth')==0
+    parameter.winLenSmooth = 41;
+end
+if isfield(parameter,'downsampSmooth')==0
+    parameter.downsampSmooth = 10;
+end
+if isfield(parameter,'midiMin')==0
+    parameter.midiMin = 21;
+end
+if isfield(parameter,'midiMax')==0
+    parameter.midiMax = 108;
+end
+if isfield(parameter,'inputFeatureRate')==0
+    parameter.inputFeatureRate = 0;
+end
+if isfield(parameter,'save')==0
+    parameter.save = 0;
+end
+if isfield(parameter,'saveDir')==0
+    parameter.saveDir = '';
+end
+if isfield(parameter,'saveFilename')==0
+    parameter.saveFilename = '';
+end
+if isfield(parameter,'visualize')==0
+    parameter.visualize = 0;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Main program
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+seg_num = size(f_pitch,2);
+
+% calculate energy for each chroma band
+f_chroma_energy = zeros(12,seg_num);
+for p=parameter.midiMin:parameter.midiMax
+    chroma = mod(p,12)+1;
+    f_chroma_energy(chroma,:) = f_chroma_energy(chroma,:)+f_pitch(p,:);
+end
+
+% normalize the chroma vectors
+f_chroma_energy_distr = zeros(12,seg_num);
+for k=1:seg_num
+    if sum(f_chroma_energy(:,k)>parameter.normThresh)>0
+        seg_energy_square = sum(f_chroma_energy(:,k));
+        f_chroma_energy_distr(:,k) = ((f_chroma_energy(:,k))/seg_energy_square);
+    end
+end
+
+% calculate a CENS feature
+
+% component-wise quantisation of the normalized chroma vectors
+f_stat_help = zeros(12,seg_num);
+for n=1:length(parameter.quantSteps)
+    f_stat_help = f_stat_help + (f_chroma_energy_distr>parameter.quantSteps(n))*parameter.quantWeights(n);
+end
+
+% Temporal smoothing and downsampling
+[f_chroma_energy_stat,CENSfeatureRate] = smoothDownsampleFeature(f_stat_help,parameter);
+
+% last step: normalize each vector with its l^2 norm
+f_CENS = normalizeFeature(f_chroma_energy_stat,2, parameter.normThresh);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Update sideinfo
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+sideinfo.CENS.version = 1;
+sideinfo.CENS.midiMin = parameter.midiMin;
+sideinfo.CENS.midiMax = parameter.midiMax;
+sideinfo.CENS.featureRate = CENSfeatureRate;
+sideinfo.CENS.quantSteps = parameter.quantSteps;
+sideinfo.CENS.quantWeights = parameter.quantWeights;
+sideinfo.CENS.normThresh = parameter.normThresh;
+sideinfo.CENS.winLenSmooth = parameter.winLenSmooth;
+sideinfo.CENS.downsampSmooth = parameter.downsampSmooth;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Saving to file
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if parameter.save
+    filename = strcat(parameter.saveFilename,'_CENS_',num2str(parameter.winLenSmooth),'_',num2str(parameter.downsampSmooth));
+    save(strcat(parameter.saveDir,filename),'f_CENS','sideinfo');
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Visualization
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if parameter.visualize
+    parameterVis.featureRate = CENSfeatureRate;
+    parameterVis.title = 'CENS chromagram';
+    visualizeChroma(f_CENS,parameterVis)
+end
+
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/pitch_to_CRP.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,194 @@
+function [f_CRP,sideinfo] = pitch_to_CRP(f_pitch,parameter,sideinfo)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: pitch_to_CRP
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description:
+% - Calculates CRP (Chroma DCT-reduced Log Pitch) Features
+% (see "Towards Timbre-Invariant Audio Features for Harmony-Based Music" by
+%  Meinard Mueller and Sebastian Ewert)
+%
+% Remark:
+% - parameter.inputFeatureRate specifies the input feature rate. This value is
+% used to derive the output feature rate.
+%
+% Input:
+%         f_pitch
+%         parameter.coeffsToKeep = [55:120];
+%         parameter.applyLogCompr = 1;
+%         parameter.factorLogCompr = 1000;
+%         parameter.addTermLogCompr = 1;
+%         parameter.normP = 2;
+%         parameter.winLenSmooth = 1;
+%         parameter.downsampSmooth = 1;
+%         parameter.normThresh = 10^-6;
+%         parameter.inputFeatureRate = 0;
+%         parameter.save = 0;
+%           parameter.saveDir = '';
+%           parameter.saveFilename = '';
+%         parameter.visualize = 0;
+%         sideinfo
+%
+% Output:
+%         f_CRP
+%         sideinfo
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Check parameters
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if nargin<3
+    sideinfo=[];
+end
+if nargin<2
+    parameter=[];
+end
+if nargin<1
+    error('Please specify input data f_pitch');
+end
+
+if isfield(parameter,'coeffsToKeep')==0
+    parameter.coeffsToKeep = [55:120];
+end
+if isfield(parameter,'applyLogCompr')==0
+    parameter.applyLogCompr = 1;
+end
+if isfield(parameter,'factorLogCompr')==0
+    parameter.factorLogCompr = 1000;
+end
+if isfield(parameter,'addTermLogCompr')==0
+    parameter.addTermLogCompr = 1;
+end
+if isfield(parameter,'normP')==0
+    parameter.normP = 2;
+end
+if isfield(parameter,'winLenSmooth')==0
+    parameter.winLenSmooth = 1;
+end
+if isfield(parameter,'downsampSmooth')==0
+    parameter.downsampSmooth = 1;
+end
+if isfield(parameter,'normThresh')==0
+    parameter.normThresh = 10^-6;
+end
+if isfield(parameter,'inputFeatureRate')==0
+    parameter.inputFeatureRate = 0;
+end
+if isfield(parameter,'save')==0
+    parameter.save = 0;
+end
+if isfield(parameter,'saveDir')==0
+    parameter.saveDir = '';
+end
+if isfield(parameter,'saveFilename')==0
+    parameter.saveFilename = '';
+end
+if isfield(parameter,'visualize')==0
+    parameter.visualize = 0;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Main program
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+seg_num = size(f_pitch,2);
+
+% log compression
+if parameter.applyLogCompr
+    f_pitch_log = log10(parameter.addTermLogCompr+f_pitch*parameter.factorLogCompr);
+else
+    f_pitch_log = f_pitch;
+end
+
+% DCT based reduction
+DCT = internal_DCT(size(f_pitch_log,1));
+DCTcut = DCT;
+DCTcut(setdiff([1:120],parameter.coeffsToKeep),:) = 0;
+DCT_filter = DCT'*DCTcut;
+f_pitch_log_DCT = DCT_filter*f_pitch_log;
+
+% calculate energy for each chroma band
+f_CRP = zeros(12,seg_num);
+for p=1:120
+    chroma = mod(p,12)+1;
+    f_CRP(chroma,:) = f_CRP(chroma,:)+f_pitch_log_DCT(p,:);
+end
+
+% normalize the vectors according to the norm l^p
+f_CRP = normalizeFeature(f_CRP,parameter.normP, parameter.normThresh);
+
+if (parameter.winLenSmooth ~= 1) || (parameter.downsampSmooth ~= 1)
+    % Temporal smoothing and downsampling
+    [f_CRP,CrpFeatureRate] = smoothDownsampleFeature(f_CRP,parameter);
+    
+    % re-normalize the vectors according to the norm l^p
+    f_CRP = normalizeFeature(f_CRP,parameter.normP, parameter.normThresh);
+else
+    CrpFeatureRate = parameter.inputFeatureRate;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Update sideinfo
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+sideinfo.CRP.coeffsToKeep = parameter.coeffsToKeep;
+sideinfo.CRP.applyLogCompr = parameter.applyLogCompr;
+sideinfo.CRP.factorLogCompr = parameter.factorLogCompr;
+sideinfo.CRP.addTermLogCompr = parameter.addTermLogCompr;
+sideinfo.CRP.normP = parameter.normP;
+sideinfo.CRP.winLenSmooth = parameter.winLenSmooth;
+sideinfo.CRP.downsampSmooth = parameter.downsampSmooth;
+sideinfo.CRP.normThresh = parameter.normThresh;
+sideinfo.CRP.featureRate = CrpFeatureRate;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Saving to file
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if parameter.save
+    filename = strcat(parameter.saveFilename,'_CRP_',num2str(parameter.winLenSmooth),'_',num2str(parameter.downsampSmooth));
+    save(strcat(parameter.saveDir,filename),'f_CRP','sideinfo');
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Visualization
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if parameter.visualize
+    parameterVis.title = 'CRP chromagram';
+    parameterVis.featureRate = CrpFeatureRate;
+    visualizeCRP(f_CRP,parameterVis);
+end
+
+end
+
+function matrix = internal_DCT(l)
+
+matrix = zeros(l,l);
+
+for m = 0:l-1
+    for n = 0:l-1
+        matrix(m+1,n+1) = sqrt(2/l)*cos((m*(n+0.5)*pi)/l);
+    end
+end
+
+matrix(1,:) = matrix(1,:)/sqrt(2);
+
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/pitch_to_chroma.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,179 @@
+function [f_chroma_norm,sideinfo] = pitch_to_chroma(f_pitch,parameter,sideinfo)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: pitch_to_chroma 
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description:
+% Computes normalized chroma vectors from pitch features
+%
+% Input:  
+%         f_pitch
+%         parameter.applyLogCompr = 0;
+%         parameter.factorLogCompr = 100;
+%         parameter.addTermLogCompr = 1;
+%         parameter.winLenSmooth = 1;
+%         parameter.downsampSmooth = 1;
+%         parameter.applyNormalization = 1;
+%         parameter.normP = 2;
+%         parameter.normThresh = 0.001;
+%         parameter.midiMin = 1;
+%         parameter.midiMax = 120;
+%         parameter.inputFeatureRate = 0;
+%         parameter.save = 0;
+%            parameter.save_dir = '';
+%            parameter.save_filename = '';
+%         parameter.visualize = 0;
+%         sideinfo
+%
+% Output: 
+%         f_chroma_norm
+%         sideinfo
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Check parameters
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if nargin<3
+   sideinfo=[]; 
+end
+if nargin<2
+   parameter=[]; 
+end
+if nargin<1
+    error('Please specify input data f_pitch');
+end
+
+if isfield(parameter,'applyLogCompr')==0
+    parameter.applyLogCompr = 0;
+end
+if isfield(parameter,'factorLogCompr')==0
+    parameter.factorLogCompr = 100;
+end
+if isfield(parameter,'addTermLogCompr')==0
+    parameter.addTermLogCompr = 1;
+end
+if isfield(parameter,'winLenSmooth')==0
+    parameter.winLenSmooth = 1;
+end
+if isfield(parameter,'downsampSmooth')==0
+    parameter.downsampSmooth = 1;
+end
+if isfield(parameter,'applyNormalization')==0
+    parameter.applyNormalization = 1;
+end
+if isfield(parameter,'normP')==0
+    parameter.normP = 2;
+end
+if isfield(parameter,'normThresh')==0
+    parameter.normThresh = 0.001;
+end
+if isfield(parameter,'midiMin')==0
+    parameter.midiMin = 1;
+end
+if isfield(parameter,'midiMax')==0
+    parameter.midiMax = 120;
+end
+if isfield(parameter,'inputFeatureRate')==0
+    parameter.inputFeatureRate = 0;
+end
+if isfield(parameter,'save')==0
+    parameter.save = 0;
+end
+if isfield(parameter,'save_dir')==0
+    parameter.save_dir = '';
+end
+if isfield(parameter,'save_filename')==0
+    parameter.save_filename = '';
+end
+if isfield(parameter,'visualize')==0
+    parameter.visualize = 0;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Main program
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+seg_num = size(f_pitch,2);
+
+if parameter.applyLogCompr
+    f_pitch = log10(parameter.addTermLogCompr+f_pitch*parameter.factorLogCompr);
+end
+
+% calculate energy for each chroma band
+f_chroma =  zeros(12,seg_num);
+for p=parameter.midiMin:parameter.midiMax
+    chroma = mod(p,12)+1;
+    f_chroma(chroma,:) = f_chroma(chroma,:)+f_pitch(p,:);
+end
+
+% Temporal smoothing and downsampling
+[f_chroma,chromaFeatureRate] = smoothDownsampleFeature(f_chroma,parameter);
+
+if parameter.applyNormalization
+    % normalise the chroma vectors according the norm l^p
+    f_chroma_norm = normalizeFeature(f_chroma,parameter.normP, parameter.normThresh);
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Update sideinfo
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+sideinfo.chroma.applyLogCompr = parameter.applyLogCompr;
+sideinfo.chroma.factorLogCompr = parameter.factorLogCompr;
+sideinfo.chroma.addTermLogCompr = parameter.addTermLogCompr;
+sideinfo.chroma.winLenSmooth = parameter.winLenSmooth;
+sideinfo.chroma.downsampSmooth = parameter.downsampSmooth;
+sideinfo.chroma.applyNormalization = parameter.applyNormalization;
+sideinfo.chroma.normP = parameter.normP;
+sideinfo.chroma.normThresh = parameter.normThresh;
+sideinfo.chroma.midiMin = parameter.midiMin;
+sideinfo.chroma.midiMax = parameter.midiMax;
+sideinfo.chroma.chromaFeatureRate = chromaFeatureRate;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Saving to file
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if parameter.save == 1   
+    filename = strcat(parameter.save_filename,'_chroma');
+    save(strcat(parameter.save_dir,filename),'f_chroma_norm','f_chroma','sideinfo');
+end
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Visualization
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if parameter.visualize
+    titleString = 'Chromagram';
+    imagerange = [0 1];
+    if parameter.applyLogCompr
+        titleString = ['Log ', titleString];
+    end
+    if parameter.applyNormalization
+        imagerange = 0;
+        titleString = ['Normalized ', titleString];
+    end
+    parameterVis.imagerange = imagerange;
+    parameterVis.featureRate = chromaFeatureRate;
+    parameterVis.title = titleString;
+    visualizeChroma(f_chroma_norm,parameterVis)
+end
+
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/smoothDownsampleFeature.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,87 @@
+function [f_feature_stat,newFeatureRate] = smoothDownsampleFeature(f_feature,parameter)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: smoothDownsampleFeature
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description:
+% - Temporal smoothing and downsampling of a feature sequence
+%
+% Remark:
+% - parameter.featureRate specifies the input feature rate. This value is
+% used to derive the output feature rate.
+%
+% Input:
+%         f_feature
+%         parameter.winLenSmooth = 1;
+%         parameter.downsampSmooth = 1;
+%         parameter.inputFeatureRate = 0;
+%
+% Output:
+%         f_feature
+%         newFeatureRate
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Check parameters
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if nargin<2
+    parameter=[];
+end
+if nargin<1
+    error('Please specify input data');
+end
+if isfield(parameter,'winLenSmooth')==0
+    parameter.winLenSmooth = 1;
+end
+if isfield(parameter,'downsampSmooth')==0
+    parameter.downsampSmooth = 1;
+end
+if isfield(parameter,'inputFeatureRate')==0
+    parameter.inputFeatureRate = 0;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Main program
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Temporal Smoothing
+if (parameter.winLenSmooth ~= 1) || (parameter.downsampSmooth ~= 1)
+    winLenSmooth = parameter.winLenSmooth;
+    downsampSmooth = parameter.downsampSmooth;
+    stat_window = hanning(winLenSmooth);
+    stat_window = stat_window/sum(stat_window);
+    
+    % upfirdn filters and downsamples each column of f_stat_help
+    f_feature_stat = zeros(size(f_feature));
+    f_feature_stat = (upfirdn(f_feature',stat_window,1,downsampSmooth))';
+    seg_num = size(f_feature,2);
+    stat_num = ceil(seg_num/downsampSmooth);
+    cut = floor((winLenSmooth-1)/(2*downsampSmooth));
+    f_feature_stat = f_feature_stat(:,(1+cut:stat_num+cut));            %adjust group delay
+else
+    f_feature_stat = f_feature;
+end
+
+newFeatureRate = parameter.inputFeatureRate / parameter.downsampSmooth;
+
+end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/test_convert_audio_to_pitch.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,104 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: test_convert_audio_to_pitchSTMSP.m
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description: 
+% * Computes pitch subband decomposition of WAV file
+%   (default: MIDI pitches 21 to 108) 
+% * each pitch subband contains short time mean-square power (STMSP) 
+% * Features are computed in a batch modus
+% * Features are stored in folder 'data_feature/'
+%
+% Reference: 
+% Details on the feature computation can be found in the following book:
+%
+% Meinard Mueller: Information Retrieval for Music and Motion,
+%                  Springer 2007
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+clear;
+close all hidden;
+
+dirFileNames = {
+    'data_WAV/','Bach_BWV988-Aria-Measures1-4_Meinard_fast.wav';
+    'data_WAV/','Burgmueller_Op100-02-FirstPart_Meinard_SE.wav';
+    'data_WAV/','Systematic_Cadence-C-Major_Meinard_portato.wav';
+    'data_WAV/','Systematic_Cadence-C-Major_Meinard_staccato.wav';
+    'data_WAV/','Systematic_Scale-C-Major_Meinard_fast.wav';
+    'data_WAV/','Systematic_Scale-C-Major_Meinard_middle.wav';
+    'data_WAV/','Systematic_Chord-C-Major_Eight-Instruments.wav';
+    };
+
+for n=1:size(dirFileNames,1)
+    clear parameter;
+    parameter.message = 1;
+    
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    % Convert WAV to expected audio format (mono, 22050 Hz)
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    
+    [f_audio,sideinfo] = wav_to_audio('', dirFileNames{n,1}, dirFileNames{n,2},parameter);
+        
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    % Estimation of the global tuning of the recording and selection of
+    % an appropriate filterbank for use in the next step
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    clear parameter
+    shiftFB = estimateTuning(f_audio);
+    fprintf('Using filterbank number: %d\n',shiftFB);
+
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    % Compute pitch features
+    % 
+    % Input: audio file of format: mono, 22050 Hz
+    %
+    % Output: sequence of pitch vectors 
+    %         (specified by N x 120 matrix f_pitch)
+    %         Only subband for MIDI pitches 21 to 108 are computed, the
+    %         other subbands are set to zero.
+    %
+    % Parameter: parameter.win_len specifies window length (in samples)
+    %            with window overlap of half size  
+    %            Example: audio sampling rate: 22050 Hz
+    %                     parameter.win_len = 4410
+    %                     Resulting feature rate: 10 Hz
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+    clear parameter
+    parameter.winLenSTMSP = 4410;
+    parameter.fs = sideinfo.wav.fs;
+    parameter.save = 1;
+    parameter.saveDir = 'data_feature/';
+    parameter.saveFilename = dirFileNames{n,2}(1:end-4);
+    parameter.shiftFB = shiftFB;
+    parameter.saveAsTuned = 1;
+    [f_pitch,sideinfo] = audio_to_pitch_via_FB(f_audio,parameter,sideinfo);
+    
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    % Visualization of pitch decomposition (f_pitch)
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    
+    parameter.usePitchNameLabels = 1;
+    parameter.title = 'Logarithmic compression of amplitude';
+    parameter.featureRate = sideinfo.pitch.featureRate;
+    parameter.xlabel = 'Time [Seconds]';
+    parameter.ylabel = 'Pitch';
+    visualizePitch(log(5*f_pitch+1),parameter);
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/test_convert_pitch_to_CENS.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,75 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: test_convert_pitch_to_CENS.m
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description: 
+% * Computes CENS features (f_CENS) from pitch features (f_pitch) 
+% * CENS is a chroma-like feature 
+%   (Chroma Energy Normalized Statistics)
+%
+% Reference: 
+% Details on the feature computation can be found in the following book:
+%
+% Meinard Mueller: Information Retrieval for Music and Motion,
+%                  Springer 2007
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+clear;
+%close all hidden;
+
+directory = 'data_feature/';
+
+
+%filename = 'Bach_BWV988-Aria-Measures1-4_Meinard_fast.wav';
+%filename = 'Burgmueller_Op100-02-FirstPart_Meinard_SE.wav';
+%filename = 'Systematic_Cadence-C-Major_Meinard_portato.wav';
+%filename = 'Systematic_Cadence-C-Major_Meinard_staccato.wav';
+%filename = 'Systematic_Scale-C-Major_Meinard_fast.wav';
+%filename = 'Systematic_Scale-C-Major_Meinard_middle.wav';
+filename = 'Systematic_Chord-C-Major_Eight-Instruments.wav';
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Loads pitch features (f_pitch) and computes CENS features (f_CENS)
+%
+% Note: feature filename is specified by WAV filename
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+win_len = 4410;
+filename_pitch = strcat(filename(1:end-4),'_pitch_',num2str(win_len));
+load(strcat(directory,filename_pitch)); % load f_pitch and sideinfo;
+
+parameter.winLenSmooth = 21;
+parameter.downsampSmooth = 5;
+parameter.featureRate = sideinfo.pitch.featureRate;
+[f_CENS,sideinfo] = pitch_to_CENS(f_pitch,parameter,sideinfo);
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Visualization of chromagrams (f_CENS,f_chroma)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parameter.featureRate = sideinfo.CENS.featureRate;
+parameter.xlabel = 'Time [Seconds]';
+parameter.title = sprintf('CENS %d %d chromagram',parameter.winLenSmooth,parameter.downsampSmooth);
+visualizeChroma(f_CENS,parameter);
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/test_convert_pitch_to_CRP.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,79 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: test_convert_pitch_to_CRP.m
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description: 
+% * Computes CRP features (f_crp) from pitch features (f_pitch) 
+% * CRP is a chroma-like feature tuned for timbre-invariance
+%
+% Reference: 
+% Details on the feature computation can be found in the following articles:
+%
+% Meinard Mueller, Sebastian Ewert, and Sebastian Kreuzer
+% Making chroma features more robust to timbre changes.
+% Proceedings of IEEE International Conference on Acoustics, Speech, and
+% Signal Processing (ICASSP), Taipei, Taiwan, pp. 1869-1872, 2009.
+%
+% Meinard Mueller, and Sebastian Ewert
+% Towards Timbre-Invariant Audio Features for Harmony-Based Music.
+% IEEE Transactions on Audio, Speach, and Language Processing.
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+clear;
+close all hidden;
+
+directory = 'data_feature/';
+
+
+%filename = 'Bach_BWV988-Aria-Measures1-4_Meinard_fast.wav';
+%filename = 'Burgmueller_Op100-02-FirstPart_Meinard_SE.wav';
+%filename = 'Systematic_Cadence-C-Major_Meinard_portato.wav';
+%filename = 'Systematic_Cadence-C-Major_Meinard_staccato.wav';
+%filename = 'Systematic_Scale-C-Major_Meinard_fast.wav';
+%filename = 'Systematic_Scale-C-Major_Meinard_middle.wav';
+filename = 'Systematic_Chord-C-Major_Eight-Instruments.wav';
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Loads pitch features (f_pitch) and computes CRP features (f_crp)
+%
+% Note: feature filename is specified by WAV filename
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+win_len = 4410;
+filename_pitch = strcat(filename(1:end-4),'_pitch_',num2str(win_len));
+load(strcat(directory,filename_pitch)); % load f_pitch and sideinfo;
+
+parameter.coeffsToKeep = [55:120];
+parameter.applyLogCompr = 1;
+parameter.factorLogCompr = 1000;
+parameter.featureRate = sideinfo.pitch.featureRate;
+[f_crp,sideinfo] = pitch_to_CRP(f_pitch,parameter,sideinfo);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Visualization of CRP chromagram 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parameter.featureRate = sideinfo.CRP.featureRate;
+parameter.xlabel = 'Time [Seconds]';
+parameter.title = 'CRP chromagram';
+visualizeCRP(f_crp,parameter);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/test_convert_pitch_to_chroma.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,85 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: test_convert_pitch_to_chroma.m
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description: 
+% * Computes chroma features (f_chroma) from pitch features (f_pitch) 
+%
+% Reference: 
+% Details on the feature computation can be found in the following book:
+%
+% Meinard Mueller: Information Retrieval for Music and Motion,
+%                  Springer 2007
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+clear;
+close all hidden;
+
+directory = 'data_feature/';
+
+
+%filename = 'Bach_BWV988-Aria-Measures1-4_Meinard_fast.wav';
+%filename = 'Burgmueller_Op100-02-FirstPart_Meinard_SE.wav';
+%filename = 'Systematic_Cadence-C-Major_Meinard_portato.wav';
+%filename = 'Systematic_Cadence-C-Major_Meinard_staccato.wav';
+%filename = 'Systematic_Scale-C-Major_Meinard_fast.wav';
+%filename = 'Systematic_Scale-C-Major_Meinard_middle.wav';
+filename = 'Systematic_Chord-C-Major_Eight-Instruments.wav';
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Loads pitch features (f_pitch) and computes chroma features (f_chroma)
+%
+% Note: feature filename is specified by WAV filename
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+win_len = 4410;
+filename_pitch = strcat(filename(1:end-4),'_pitch_',num2str(win_len));
+load(strcat(directory,filename_pitch)); % load f_pitch and sideinfo;
+
+parameter.vis = 0;
+%parameter.save = 1;
+%parameter.save_dir = 'data_feature/';
+%parameter.save_filename = strcat(sideinfo.wav.filename(1:length(sideinfo.wav.filename)-4));
+[f_chroma_norm,sideinfo] = pitch_to_chroma(f_pitch,parameter,sideinfo);
+
+parameter.applyLogCompr = 1;
+parameter.factorLogCompr = 100;
+f_logchroma_norm = pitch_to_chroma(f_pitch,parameter,sideinfo);
+
+parameter.winLenSmooth = 21;
+parameter.downsampSmooth = 5;
+f_logchroma_normSmoothed = pitch_to_chroma(f_pitch,parameter,sideinfo);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Visualization of chromagrams (f_chroma_norm,f_chroma)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parameter.featureRate = sideinfo.pitch.featureRate;
+parameter.xlabel = 'Time [Seconds]';
+parameter.title = 'Normalized chromagram';
+visualizeChroma(f_chroma_norm,parameter);
+
+parameter.title = 'Normalized log-compressed chromagram';
+visualizeChroma(f_logchroma_norm,parameter);
+
+parameter.title = 'Normalized log-compressed smoothed chromagram';
+visualizeChroma(f_logchroma_normSmoothed,parameter);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/visualizeCRP.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,42 @@
+function visualizeCRP(f_crp,parameter)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: visualizeCRP
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description:
+% Visualization of CRP features (wrapper around visualize_chroma)
+%
+% Input: 
+%        f_CRP
+%        parameter: is forwarded to  visualizeChroma
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if isfield(parameter,'imagerange')==0
+   parameter.imagerange = [-1 1];
+end
+if isfield(parameter,'colormap')==0
+    blueSepia = gray(64).^0.8;
+    blueSepia(:,1:2) = blueSepia(:,1:2) * 0.5;
+    parameter.colormap = [flipud(blueSepia) ; hot(64)];
+end
+
+visualizeChroma(f_crp,parameter);
+
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/visualizeChroma.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,141 @@
+function visualizeChroma(f_chroma,parameter)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: visualizeChroma
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description:
+% Visualization of f_chroma
+%
+% Input:
+%        f_chroma
+%        parameter.featureRate = 0;  % 0 means unknown
+%        parameter.colorbar = 1;
+%        parameter.colormap = 'hot';
+%        parameter.print = 0;
+%        parameter.printFile = 'figure.eps';
+%        parameter.printDir = '';
+%        parameter.title = '';
+%        parameter.xlabel = '';
+%        parameter.imagerange = [0 1];   % 0 means automatic
+%        parameter.fontSize = 0;   % 0 means automatic
+%        parameter.printPaperPosition = [1   10   26  15]; %[left, bottom, width, height]
+%        parameter.createAxisLabel = 1;
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+%
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+%
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+%
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if nargin<2
+    parameter=[];
+end
+
+if isfield(parameter,'featureRate')==0
+    parameter.featureRate = 0;
+end
+if isfield(parameter,'colorbar')==0
+    parameter.colorbar = 1;
+end
+if isfield(parameter,'colormap')==0
+    parameter.colormap = 'hot';
+end
+if isfield(parameter,'print')==0
+    parameter.print = 0;
+end
+if isfield(parameter,'printFile')==0
+    parameter.printFile = 'figure.eps';
+end
+if isfield(parameter,'printDir')==0
+    parameter.printDir = '';
+end
+if isfield(parameter,'title')==0
+    parameter.title = '';
+end
+if isfield(parameter,'xlabel')==0
+    parameter.xlabel = '';
+end
+if isfield(parameter,'imagerange')==0
+    parameter.imagerange = [0 1];
+end
+if isfield(parameter,'fontSize')==0
+    % 0 means automatic
+    parameter.fontSize = 0;
+end
+if isfield(parameter,'printPaperPosition')==0
+    parameter.printPaperPosition = [1   10   26  15]; %[left, bottom, width, height]
+end
+if isfield(parameter,'createAxisLabel')==0
+    parameter.createAxisLabel = 1;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Visualization
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+seg_num = size(f_chroma,2);
+
+chroma_names                 = ['C ';'C#';'D ';'D#';'E ';'F ';'F#';'G ';'G#';'A ';'A#';'B '];
+figure;
+set(gcf,'renderer','painters');
+
+if parameter.featureRate == 0
+    t = (1:seg_num);
+else
+    t = (0:seg_num-1)/parameter.featureRate;
+end
+
+if all(parameter.imagerange == 0)
+    imagesc(t,[1:12],f_chroma);
+else
+    imagesc(t,[1:12],f_chroma,parameter.imagerange);
+end
+set(gca,'YTick',[1:12]);
+set(gca,'YTickLabel',chroma_names);
+set(gca,'YDir','normal');
+if t(end)>t(1)
+    set(gca,'XLim',[t(1),t(end)]);
+end
+
+title(parameter.title);
+xlabel(parameter.xlabel);
+
+if ~parameter.createAxisLabel
+    set(gca, 'XTick', [], 'YTick', [])
+end
+
+colormap(parameter.colormap);
+
+if parameter.fontSize
+    set(gca,'FontSize',parameter.fontSize)
+end
+
+if parameter.colorbar == 1
+    hColorbar = colorbar;
+    if parameter.fontSize
+        set(hColorbar,'FontSize',parameter.fontSize)
+    end
+end
+drawnow;
+
+if parameter.print == 1
+    set(gcf,'PaperPosition',parameter.printPaperPosition);
+    print('-depsc2',strcat(parameter.printDir,parameter.printFile));
+end
+
+end
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/visualizePitch.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,181 @@
+function visualizePitch(f_pitch,parameter)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: visualizePitch
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description:
+% Visualization of f_pitch
+%
+% Input:
+%        f_pitch
+%        parameter.midiMin = 21;
+%        parameter.midiMax = 108;
+%        parameter.featureRate = 0;
+%        parameter.colorbar = 1;
+%        parameter.colormap = hot2;
+%        parameter.print = 0;
+%        parameter.printFile = 'figure.eps';
+%        parameter.printDir = '';
+%        parameter.title = '';
+%        parameter.xlabel = '';
+%        parameter.ylabel = '';
+%        parameter.imagerange = 0; %[0 1];    % 0 means automatic
+%        parameter.usePitchNameLabels = 0;
+%        parameter.PitchNameLabels = ...
+%        parameter.Ytick = [1 10 20 30 40 50 60 70 80 90 100 110 120]; % not used when usePitchNameLabels==1
+%        parameter.printPaperPosition = [1   10   26  15]; %[left, bottom, width, height]
+%        parameter.fontSize = 0;  % 0 means automatic
+%        parameter.createAxisLabel = 1;
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+%
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+%
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+%
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if nargin<2
+    parameter=[];
+end
+
+if isfield(parameter,'midiMin')==0
+    parameter.midiMin = 21;
+end
+if isfield(parameter,'midiMax')==0
+    parameter.midiMax = 108;
+end
+if isfield(parameter,'featureRate')==0
+    parameter.featureRate = 0;
+end
+if isfield(parameter,'colorbar')==0
+    parameter.colorbar = 1;
+end
+if (isfield(parameter,'colormap')==0) || (isstr(parameter.colormap) && strcmpi(parameter.colormap,'hot2'))
+    hot2 = hot(64);
+    hot2 = [hot2; hot2(32:64,:); hot2(32:64,:)];
+    hot2 = sort(hot2);
+    parameter.colormap = hot2;
+end
+if isfield(parameter,'print')==0
+    parameter.print = 0;
+end
+if isfield(parameter,'printFile')==0
+    parameter.printFile = 'figure.eps';
+end
+if isfield(parameter,'printDir')==0
+    parameter.printDir = '';
+end
+if isfield(parameter,'title')==0
+    parameter.title = '';
+end
+if isfield(parameter,'xlabel')==0
+    parameter.xlabel = '';
+end
+if isfield(parameter,'ylabel')==0
+    parameter.ylabel = '';
+end
+if isfield(parameter,'imagerange')==0
+    parameter.imagerange = 0; %[0 1];
+end
+if isfield(parameter,'usePitchNameLabels')==0
+    parameter.usePitchNameLabels = 0;
+end
+if isfield(parameter,'PitchNameLabels')==0
+    parameter.PitchNameLabels = ...
+        ['   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';...
+        'C0 ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';...
+        'C1 ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';...
+        'C2 ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';...
+        'C3 ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';...
+        'C4 ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';...
+        'C5 ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';...
+        'C6 ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';...
+        'C7 ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';...
+        'C8 ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';'   ';...
+        'C9 '];
+end
+if isfield(parameter,'Ytick')==0
+    parameter.Ytick = [1 10 20 30 40 50 60 70 80 90 100 110 120]; % not used when usePitchNameLabels==1
+end
+if isfield(parameter,'printPaperPosition')==0
+    parameter.printPaperPosition = [1   10   26  15]; %[left, bottom, width, height]
+end
+if isfield(parameter,'fontSize')==0
+    % 0 means automatic
+    parameter.fontSize = 0;
+end
+if isfield(parameter,'createAxisLabel')==0
+    parameter.createAxisLabel = 1;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Visualization
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+figure;
+
+if parameter.featureRate == 0
+    t_axis = (1:size(f_pitch,2));
+else
+    t_axis = (0:size(f_pitch,2)-1)/parameter.featureRate;
+end
+
+p_axis = (parameter.midiMin:parameter.midiMax);
+f_image = f_pitch(p_axis,:);
+
+if parameter.imagerange == 0
+    imagesc(t_axis,p_axis,f_image);
+else
+    imagesc(t_axis,p_axis,f_image,parameter.imagerange);
+end
+
+set(gca,'YTick',parameter.Ytick);
+set(gca,'YDir','normal');
+
+if parameter.usePitchNameLabels
+    set(gca,'YTick',[parameter.midiMin:parameter.midiMax]);
+    set(gca,'YTickLabel',parameter.PitchNameLabels(parameter.midiMin:parameter.midiMax,:));
+end
+
+title(parameter.title);
+xlabel(parameter.xlabel);
+ylabel(parameter.ylabel);
+
+if ~parameter.createAxisLabel
+    set(gca, 'XTick', [], 'YTick', [])
+end
+
+colormap(parameter.colormap);
+
+if parameter.fontSize
+    set(gca,'FontSize',parameter.fontSize)
+end
+
+if parameter.colorbar == 1
+    hColorbar = colorbar;
+    if parameter.fontSize
+        set(hColorbar,'FontSize',parameter.fontSize)
+    end
+end
+
+drawnow;
+
+if parameter.print == 1
+    set(gcf,'PaperPosition',parameter.printPaperPosition);
+    print('-depsc2',strcat(parameter.printDir,parameter.printFile));
+end
+
+end
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/MATLAB-Chroma-Toolbox_2.0/wav_to_audio.m	Wed Aug 05 21:08:56 2015 +0100
@@ -0,0 +1,201 @@
+function [f_audio,sideinfo] = wav_to_audio(dirAbs,dirRel,wavfilename,parameter)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: wav_to_audio
+% Date of Revision: 2011-03
+% Programmer: Meinard Mueller, Sebastian Ewert
+%
+% Description:
+% Loads a Wav file and fills a sideinfo variable according to AGtoolbox
+% specifications. Resampling and single channel conversion is default, but
+% optional.
+%
+% Input:
+%        dirAbs
+%        dirRel
+%        wavfilename
+%        parameter.useResampling = 1;
+%        parameter.destSamplerate = 22050;
+%        parameter.convertToMono = 1;
+%        parameter.monoConvertMode = 'downmix';
+%        parameter.message = 0;
+%        parameter.vis = 0;
+%        parameter.save = 0;
+%        parameter.saveDir = [dirAbs,dirRel];
+%        parameter.saveFilename = wavfilename;
+%
+% Output:
+%        f_audio
+%        sideinfo.wav.version
+%        sideinfo.wav.filename
+%        sideinfo.wav.dirRel
+%        sideinfo.wav.size
+%        sideinfo.wav.duration
+%        sideinfo.wav.energy
+%        sideinfo.wav.fs
+%        sideinfo.wav.nbits
+%        sideinfo.wav.channels
+%        sideinfo.wav.resampled
+%        sideinfo.wav.monoConverted
+%        sideinfo.wav.monoConvertMode
+%
+%
+% License:
+%     This file is part of 'Chroma Toolbox'.
+% 
+%     'Chroma Toolbox' is free software: you can redistribute it and/or modify
+%     it under the terms of the GNU General Public License as published by
+%     the Free Software Foundation, either version 2 of the License, or
+%     (at your option) any later version.
+% 
+%     'Chroma Toolbox' is distributed in the hope that it will be useful,
+%     but WITHOUT ANY WARRANTY; without even the implied warranty of
+%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%     GNU General Public License for more details.
+% 
+%     You should have received a copy of the GNU General Public License
+%     along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Check parameters
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if nargin<4
+    parameter=[];
+end
+if nargin<3
+    error('Please specify at least the path and filename of the wav file')
+end
+
+if isfield(parameter,'useResampling')==0
+    parameter.useResampling = 1;
+end
+if isfield(parameter,'destSamplerate')==0
+    parameter.destSamplerate = 22050;
+end
+if isfield(parameter,'convertToMono')==0
+    parameter.convertToMono = 1;
+end
+if isfield(parameter,'monoConvertMode')==0
+    parameter.monoConvertMode = 'downmix';
+end
+if isfield(parameter,'message')==0
+    parameter.message = 0;
+end
+if isfield(parameter,'vis')==0
+    parameter.vis = 0;
+end
+if isfield(parameter,'save')==0
+    parameter.save = 0;
+end
+if isfield(parameter,'saveDir')==0
+    parameter.saveDir = [dirAbs,dirRel];
+end
+if isfield(parameter,'saveFilename')==0
+    parameter.saveFilename = wavfilename;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Main program
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if parameter.message == 1
+    fprintf('wav_to_audio: processing %s, ',wavfilename);
+end
+
+[pathstr,name,ext] = fileparts(wavfilename);
+if strcmp(ext,'.wav')
+    [f_audio,fs,nbits] = wavread(strcat(dirAbs,dirRel,wavfilename));
+else
+    error(['Unknown file format ' ext]);
+end
+    
+
+bConverted_to_mono = 0;
+if parameter.convertToMono
+    if size(f_audio,2)>1
+        bConverted_to_mono = 1;
+        if parameter.message == 1
+            fprintf('converting to mono, ');
+        end
+        switch parameter.monoConvertMode
+            case 'leftmost_channel'
+                f_audio= f_audio(:,1);
+            case 'rightmost_channel'
+                f_audio= f_audio(:,size(f_audio,2));
+            case 'downmix'
+                % pay attention to energy loss due to differences in phase
+                % when using this method. This is often the case for bad
+                % stereo mixes
+                nChannels = size(f_audio,2);
+                
+                f_audio = sum(f_audio,2);
+                f_audio = f_audio / nChannels;
+            otherwise
+                disp('wav_to_audio: monoConvertMode : Unknown method')
+        end
+    end
+end
+
+bResampled = 0;
+if parameter.useResampling
+    if (fs ~= parameter.destSamplerate)
+        bResampled = 1;
+        if parameter.message == 1
+            fprintf('Resampling to %d, ', parameter.destSamplerate);
+        end
+        f_audio = resample (f_audio,parameter.destSamplerate,fs,100);
+        fs = parameter.destSamplerate;
+    end
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Update sideinfo
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+sideinfo.wav.version    = 1;
+sideinfo.wav.filename   = wavfilename;
+sideinfo.wav.dirRel    = dirRel;
+sideinfo.wav.size       = size(f_audio,1);
+sideinfo.wav.duration   = (sideinfo.wav.size-1)/fs;
+sideinfo.wav.energy     = sum(f_audio.^2);
+sideinfo.wav.fs         = fs;
+sideinfo.wav.nbits      = nbits;
+sideinfo.wav.channels   = size(f_audio,2);
+sideinfo.wav.resampled  = bResampled;
+sideinfo.wav.monoConverted = bConverted_to_mono;
+if bConverted_to_mono
+    sideinfo.wav.monoConvertMode = parameter.monoConvertMode;
+else
+    sideinfo.wav.monoConvertMode = 'none';
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Saving data
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if parameter.save == 1
+    if parameter.message == 1
+        fprintf('Saving to file, ');
+    end
+    filename = strcat(parameter.saveFilename,'_audio');
+    save(strcat(parameter.saveDir,filename),'f_audio','sideinfo');
+end
+
+if parameter.message == 1
+    fprintf('Done\n');
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Visualization
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if parameter.vis
+    figure;
+    for k=1:sideinfo.wav.channels
+        if sideinfo.wav.channels > 1
+            subplot(sideinfo.wav.channels,1,k);
+        end
+        plot( [0:sideinfo.wav.size-1] / sideinfo.wav.fs , f_audio(:,k));
+        axis tight;
+    end
+end
+
+end
\ No newline at end of file