Mercurial > hg > camir-aes2014
diff core/magnatagatune/AudioFeatureRAW.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/magnatagatune/AudioFeatureRAW.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,158 @@ +% -- +% This class loads and hanles the aufdio features included with the MTT +% Library +% --- + + +classdef AudioFeatureRAW < MTTAudioFeature & handle + + + properties(Constant = true) + + end + + properties + % --- + % Set default parameters + % --- + my_params = struct([]); + + end + % --- + % member functions + % --- + methods + + % --- + % constructor: pointer to feature in database + % --- + function feature = AudioFeatureRAW(varargin) + + feature = feature@MTTAudioFeature(varargin{:}); + + end + + function [a1, a2, a3] = visualise(feature) + % --- + % plots the different data types collected in this feature + % --- + for i = 1:numel(feature) + clip = feature(i).data.info.owner; + + % --- + % labels for chroma data + % --- + chroma_labels = {'c', 'c#', 'd','d#', 'e', 'f','f#', 'g','g#', 'a','a#', 'b'}; + mode_labels = {'minor', 'major'}; + + % hange labels to reflect detected mode + chroma_labels{feature(i).data.key + 1} = ... + sprintf('(%s) %s',mode_labels{feature(i).data.mode + 1}, chroma_labels{feature(i).data.key + 1}); + + + secs = [feature(i).data.sections_start; feature(i).data.sections_duration]; + + h = figure; + + % number of subplots + n = 3; + + % --- + % chroma feature display + % --- + subplot(n,1,1); + + % get segment times and fix for same lengths for all plots + % --- + % NOTE: Last segment will appear longer + % --- + segments = [feature(i).data.segments_start]; + segments(end) = feature(i).data.duration; + + % display chroma vectors + uimagesc(segments, 0:11, [feature(i).data.segments_pitches]); + + set(gca,'YTick',[0:11], 'YTickLabel', chroma_labels); + + axis xy + colormap(hot) + %colorbar; + ylabel('chroma class'); + title(sprintf('clip %d: %s by %s, chromagram', ... + clip.id, clip.title(),clip.artist())); + + % added sections + axis([0 feature(i).data.duration -1 11.5]); + hl = line([secs(1,:); sum(secs,1)],ones(2, size(secs,2)) * -0.8); + set(hl,'LineWidth',6); + + a1 = gca; + + % --- + % mfcc feature display + % + % NOTE: the first position of timbre is reduced in energy, + % as this seems to introduce some corruption in lots of data + % --- + timbre = feature(i).data.segments_timbre(:,1); + timbre = timbre/ max(max(abs(timbre))) * ... + mean( mean( abs( feature(i).data.segments_timbre(:,2:min(end,5))))); + + subplot(n,1,2); + uimagesc(segments, 0:11, [timbre feature(i).data.segments_timbre(:,2:end)]); + + axis xy + %colorbar; + xlabel('time[s]'); + ylabel('mfcc coeff'); + title(sprintf('mfcc timbre features')); + + a2 = gca; + + % --- + % beats and sections + % --- + + subplot(n,1,3); + axis([0 feature(i).data.duration -0.6 1.2]); + + hl = line([0 feature(i).data.duration],[0 0]); + set(hl, 'Color','g'); + + a3 = gca; + + if ~isfield(feature.data,'bars'); + return; + end + + beats = feature.data.beats; + bars = feature.data.bars; + tatums = feature.data.tatums; + % tatums + hl = line([tatums(1,:); tatums(1,:)],[ones(1, size(tatums,2)) * -0.2; max(-0.1,tatums(2,:))]); + set(hl,'LineWidth',1); + set(hl, 'Color','k'); + + % beats + hl = line([beats(1,:); beats(1,:)],[ones(1, size(beats,2)) * -0.4; max(-0.1,beats(2,:))]); + set(hl,'LineWidth',2); + set(hl, 'Color','b'); + + % bars + hl = line([bars(1,:); bars(1,:)],[ones(1, size(bars,2)) * -0.5; max(-0.1,bars(2,:))]); + set(hl,'LineWidth',4); + set(hl, 'Color','r'); + + % sections + hl = line([secs(1,:); sum(secs,1)],ones(2, size(secs,2)) * -0.5); + set(hl,'LineWidth',6); + + ylabel('confidence'); + title(sprintf('rhythmic features @%3.1f BPM, %d/4 meter',... + feature(i).data.tempo, feature(i).data.timeSignature)); + + end + end + end + +end \ No newline at end of file