diff nonExposed/getEvent.m @ 14:b1901e8d8f5f

initial commit
author Mathieu Lagrange <mathieu.lagrange@cnrs.fr>
date Tue, 17 Mar 2015 09:34:13 +0100
parents
children 92f73423eb37
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nonExposed/getEvent.m	Tue Mar 17 09:34:13 2015 +0100
@@ -0,0 +1,111 @@
+function [sceneSchedule,sceneObjects]=getEvent(sceneSchedule,sceneObjects,inputPath,score,timeMode,ebrMode,randomFlag)
+
+% This program was written by Mathias Rossignol & Grégoire Lafay
+% is Copyright (C) 2015 IRCAM <http://www.ircam.fr>
+%
+% This program 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 3 of the License, or (at your option)
+% any later version.
+%
+% This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+
+settings.randomFlag = randomFlag;
+settings.schedPos = length(sceneSchedule)+1;
+
+for ii=1:length(score.events)
+    settings.classId =ii+length(score.backgrounds);
+    settings.ebrMode=ebrMode;
+    settings.timeMode=timeMode;
+    settings.label=score.events{ii}{1};
+    
+    settings.ebr_mean = score.events{ii}{3};
+    settings.ebr_std = score.events{ii}{4};
+    
+    sceneObjects(settings.classId) = getSampleInfo(score.events{ii}{1}, score.events{ii}{2},'event',inputPath,score.events{ii}{8});
+    settings.duration_mean = mean(sceneObjects(settings.classId).endTimes-sceneObjects(settings.classId).startTimes);
+    settings.duration_std =  std(sceneObjects(settings.classId).endTimes-sceneObjects(settings.classId).startTimes);
+    settings.mean_time_between_instances = score.events{ii}{5};
+    settings.time_between_instances_std = score.events{ii}{6};
+    settings.start_time = score.events{ii}{7};
+    settings.end_time = score.events{ii}{8};
+    settings.fade_in_time = score.events{ii}{9};
+    settings.fade_out_time = score.events{ii}{10};
+    
+    if ~strcmp(settings.timeMode,'generate') || ~strcmp(settings.ebrMode,'generate')
+        settings.start_times = score.events{ii}{11};
+        settings.end_times  = score.events{ii}{12};
+        settings.ebrs = score.events{ii}{13};
+        settings.template_duration_mean=mean(settings.end_times-settings.start_times);
+        settings.template_duration_std=std(settings.end_times-settings.start_times);
+    end
+    
+    if (settings.start_time > score.sceneDuration)
+        settings.start_time = score.sceneDuration;
+        warning(['Sart time of event class ' score.events{ii}{1} ' is superior to the scene Duration; start time has been set to the scene duration.'])
+    end
+    
+    if (settings.end_time > score.sceneDuration)
+        settings.end_time = score.sceneDuration;
+        warning(['End time of event class ' score.events{ii}{1} ' is superior to the scene Duration; end time has been set to the scene duration.'])
+    end
+    
+    
+    
+    %% generate sceneSchedule
+    switch timeMode
+        
+        case {'generate','abstract'}
+            
+            if (settings.mean_time_between_instances == 0) % Looping: only for generate timeMode
+                if strcmp(timeMode,'abstract')
+                    error('simScene cannot loop event in abstract time Mode')
+                end
+                time = settings.start_time;
+                while time<settings.end_time
+                    if time+sceneSchedule(settings.schedPos).duration > settings.end_time
+                        break;
+                    end
+                    [sceneSchedule] = getSceneSchedule(sceneSchedule,sceneObjects,settings,time);
+                    time = time+sceneSchedule(settings.schedPos).duration;
+                    settings.schedPos = settings.schedPos+1;
+                end
+                
+            elseif (settings.mean_time_between_instances < 0) % Just once: abstract and generate
+                [sceneSchedule] = getSceneSchedule(sceneSchedule,sceneObjects,settings,settings.start_time);
+                settings.schedPos = settings.schedPos+1;
+                
+            else % General case: abstract and generate
+                t = settings.start_time;
+                time = t;
+                while t<settings.end_time
+                    if (time<0)
+                        time=0;
+                    end
+                    if time > settings.end_time
+                        break;
+                    end
+                    [sceneSchedule] = getSceneSchedule(sceneSchedule,sceneObjects,settings,time);
+                    t = t+settings.mean_time_between_instances;
+                    time=t+settings.time_between_instances_std*randn;
+                    settings.schedPos = settings.schedPos+1;
+                end
+            end
+            
+        case 'replicate'
+            
+            for jj=1:length(settings.start_times)              
+                if settings.start_times(jj) <= settings.end_time && settings.start_times(jj) >= settings.start_time
+                    [sceneSchedule] = getSceneSchedule(sceneSchedule,sceneObjects,settings,settings.start_times(jj),jj);
+                    settings.schedPos = settings.schedPos+1;
+                end
+            end
+    end
+end
+end
\ No newline at end of file