function C = en_beatchroma(Segs, Tsegs, Tbeats) % C = en_beatchroma(Segs,Tsegs,Tbeats) or C = en_beatchrom(ENAstruct) % Return beat-synchronous chroma features derived from % the Echo Nest analyze features. Segs is the 12xN % array of chroma features from EN Analyze, and Tsegs % is the vector of segment times. Tbeats is a vector % of beat times; the segments overlapping each beat % interval are averaged and returned in C. % Alternatively, pass in the entire EN Analyze structure as % returned by en_analyze.m to read the data from there. % 2010-04-08 Dan Ellis dpwe@ee.columbia.edu nchr = 12; if isstruct(Segs) ENAstruct = Segs; % read chroma out of structure; apply per-segment loudness Segs = ENAstruct.pitches .* repmat(10.^(ENAstruct.segmentloudness/20),nchr,1); % read times too Tsegs = ENAstruct.segment; Tbeats = ENAstruct.beat; end %%%% Old way % Tres = 0.01; % % We do this the quick and dirty way by upsampling to Tres % % resolution, then averaging down again % % % Set duration as one segment beyond the last beat time % duration = 2*Tbeats(end) - Tbeats(end-1); % % % Y = samplemx(D.pitches*diag(idB(D.segmentloudness)./sqrt(sum(D.pitches))),D.segmentstart, [0:0.01:D.duration]); % SegsUpsamp = samplemx(Segs, Tsegs, 0:Tres:duration); % % % then downsample down again % C = beatavg(SegsUpsamp, Tbeats/Tres); % Now properly figure time overlaps & weight C = resample_mx(Segs, Tsegs, Tbeats); % and renormalize columns n = max(C); C = C.*repmat(1./n,size(C,1),1);