diff core/magnatagatune/Clip.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/Clip.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,312 @@
+% ---
+% This is the class for magnatagatune clips
+% ---
+
+classdef Clip < handle
+    
+    % ---
+    % here come the internal clip properties.
+    % the database is stored as a global variable
+    % ---
+    properties (SetAccess = private)
+
+       % magnatagatune clip id
+       my_id;
+    end
+    
+    % do not save whole db into mat file
+    properties (Hidden, Transient)
+        
+        my_db;
+    end
+    
+    properties (Hidden)
+
+        my_dbpos;
+    end
+    
+    % ---
+    % here come the clip functions.
+    % ---
+    methods
+        
+        % ---
+        % simple constructor
+        % ---
+        function clip = Clip(varargin)
+            
+            % usual or empty constructor ?
+            if (nargin > 0) && isnumeric(varargin{1})
+                id = varargin{1};
+                db_type = varargin{2};
+                
+                % ---
+                % check for magnatagatunedatabase 
+                % and load it if not present
+                % ---
+                evalc(sprintf('global %s;',db_type));
+                evalc(sprintf('thisdb = %s;',db_type));
+                
+                if ~isempty(thisdb)% exist('clip_info_proper')
+                    clip.my_db = thisdb;
+                else
+
+                    error 'db not found';
+                    % dbload;
+                end
+ 
+                % ---
+                % recursive call for creating multiple clips
+                % ---
+                if numel(id) > 1
+                    
+                    % multi-id case
+                    
+                    % ---
+                    % @todo: use class names as db names
+                    % ---
+                    if strcmp(db_type,'db_MTTClip')
+                        clip = MTTClip();
+                        for i = 1:numel(id)
+                            clip(i) = MTTClip(id(i));
+                        end
+                    elseif strcmp(db_type,'db_MSDClip')
+                        clip = MSDClip();
+                        for i = 1:numel(id)
+                            clip(i) = MSDClip(id(i));
+                        end
+                    elseif strcmp(db_type,'db_CASIMIRClip')
+                        clip = CASIMIRClip();
+                        for i = 1:numel(id)
+                            clip(i) = CASIMIRClip(id(i));
+                        end
+                    end
+                    
+                    
+                elseif ~isempty(id)
+                    % ---
+                    % actual constructor
+                    % ---
+                    clip.my_id = id;
+                    clip.my_dbpos = clip.dbpos();
+
+                    if isempty(clip.my_dbpos)
+                        error ('Clip %d not found in DB', full(id))
+                    end
+                end
+            else
+                
+                % ---
+                % TODO: deal with empty constructor
+                % ---
+            end
+        end
+        
+        % ---
+        % member functions
+        % ---
+        
+        % returns the id (function neccessary for 
+        % multi-clip environments)
+        function out = id(this)
+            
+            out = [this.my_id];
+        end
+        
+        function out = comparison_id(this)
+            
+            out = [this(1).my_db.comparison_ids(this)];
+        end
+        
+        function out = title(this)
+        % returns name strings for given genre position ids
+
+            out = this.my_db.clip_info_proper{this.my_dbpos,3};
+        end
+        
+        function out = album(this)
+        % returns name strings for given genre position ids
+        
+            out = this.my_db.clip_info_proper{this.my_dbpos,5};
+        end
+        
+        function out = artist(this)
+        % returns name strings for given genre position ids
+
+            out = this(1).my_db.artistdb.annots(this.id);
+            out = out{1};
+        end
+        
+        function out = artist_id(this)
+        % returns name strings for given genre position ids
+
+            out = this(1).my_db.artistdb.annotids_for_owner(this.id);
+        end
+        
+        function my_tag_ids = tag_ids(this)
+        % returns clip tag posids for given clip id 
+                
+            my_tag_ids = this.my_db.tagdb.annotids_for_owner(this.id);
+        end
+        
+        function out = tags(this)
+        % returns name strings for given genre position ids
+
+            out = this.my_db.tagdb.annots(this.id);
+        end
+        
+        
+        % this is for ocompability with 
+        function out = raw_annots(this)
+            
+            out  = this.my_db.clip_info_proper(this.my_dbpos,:);
+        end
+        
+        function [out] = isrc(this)
+        % returns name strings for given genre position ids
+            out = this(1).my_db.clip_info_proper{this.my_dbpos,11};
+        end  
+        
+        function [out] = artist_mbid(this)
+        % returns name strings for given genre position ids
+            out = this(1).my_db.clip_info_proper{this.my_dbpos,12};
+        end  
+        
+        function [out] = mbtags(this)
+        % returns nmusicbrainz tags for the artist related to this clip
+        
+        [out, score] = this(1).my_db.mbtagdb.annots(this(1).artist_id());
+        end  
+        
+         % @todo: generalise mg tags
+        function [out, score] = mbtag_ids(this)
+            
+            [out, score] = this(1).my_db.mbtagdb.annotids_for_owner(this(1).artist_id());
+        end
+
+
+        function len = play(clips, plen)
+        % len = play(clips)
+        %
+        % plays magnatune clip given by clip id, and
+        % returns full playback length
+        
+        if nargin <2 
+            plen = 0; %seconds play
+        end
+        
+        len = 0;
+            for i = 1:numel(clips)
+                
+                % get sample rate
+                [null,sr] = mp3read(clips(i).mp3file_full(),0);
+                
+                if plen > 0
+                    
+                    % read mp3 file
+                    [src,sr,NBITS,OPTS] = mp3read(clips(i).mp3file_full(), plen*sr);
+                else
+                    % read full mp3 file
+                    [src,sr,NBITS,OPTS] = mp3read(clips(i).mp3file_full());
+                end
+                
+                % ---
+                % NOTE: sound() seems to pause the  system when trying to
+                % play a clip while still playing another one
+                % ---
+                sound(src,sr);
+                
+                fprintf('\n--- now playing ---\n');
+                clips(i).print();
+                
+                % add clip lengths
+                len = len + length(src) / sr;
+            end
+        end
+        
+        function skip(clips)
+        % skips through given clips
+            
+            clips.play(5);
+        end
+        
+        function out = dbpos(this)
+            % returns matrix position for given clip id
+
+            out = find(this.my_db.annots_ids == this.id, 1 ,'first');
+        end
+          
+        % ---
+        % Generic Features
+        % ---
+        function feature = features(clip, type, varargin)
+        % feature = features(clip, type, varargin)
+        %
+        % returns the features of type "type" for given clips and
+        % parameters
+        % e.g.    feature = clip.features('MTTAudioFeatureRAW')
+        
+            db_name = MTTAudioFeatureDBgen.db_name(type);
+            
+            % global database
+            eval( sprintf( 'global %s;', db_name));
+            
+            % create database if neccesary
+            if eval(sprintf('isempty(%s);', db_name));
+                
+                eval(sprintf('%s = MTTAudioFeatureDBgen(''%s'');', db_name, type));
+            end
+            
+            % retrieve features from db
+            feature = eval(sprintf('%s.get_features(clip, varargin{:});', db_name));
+        end
+        
+        % ---
+        % Audio Features Section
+        % ---
+        function features = audio_features_raw(clip)
+            % get the features from the global database
+            
+            features = clip.features('MTTAudioFeatureRAW');
+        end
+        
+        function features = audio_features_basicsm(clip, varargin)
+            % get the features from the global database
+
+            features = clip.features('MTTAudioFeatureBasicSm', varargin{:});
+        end
+        
+        function features = genre_features_basic(clip, varargin)
+            % get the features from the global database
+            
+            features = clip.features('MTTTagFeatureGenreBasic', varargin{:});
+               
+        end
+        
+        function features = mixed_features_genrebasicsm(clip, varargin)
+            % get the features from the global database
+            
+            features = clip.features('MTTMixedFeatureGenreBasicSm', varargin{:});
+        end
+        
+         function features = mixed_features_genrebasicsm_pca(clip, varargin)
+            % get the features from the global database
+            
+            features = clip.features('MTTMixedFeatureGenreBasicSmPCA', varargin{:});
+        end
+        
+        function features = random_features(clip, varargin)
+            % get the features from the global database
+
+            features = clip.features('MTTRandomFeature', varargin{:});
+        end
+        
+    end
+    
+    % ---
+    % static methods
+    % ---
+    methods(Static = true)
+        
+    end
+end
\ No newline at end of file