diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/@mirmidi/mirmidi.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/toolboxes/MIRtoolbox1.3.2/MIRToolbox/@mirmidi/mirmidi.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,81 @@
+function varargout = mirmidi(orig,varargin)
+%   m = mirmidi(x) converts into a MIDI sequence.
+%   Option associated to mirpitch function can be specified:
+%       'Contrast' with default value c = .3
+
+    thr.key = 'Contrast';
+    thr.type = 'Integer';
+    thr.default = .3;
+option.thr = thr;
+
+    mono.key = 'Mono';
+    mono.type = 'Boolean';
+    mono.default = 1;
+option.mono = mono;
+
+    release.key = {'Release','Releases'};
+    release.type = 'String';
+    release.choice = {'Olivier','Valeri',0,'no','off'};
+    release.default = 'Valeri';
+option.release = release;
+
+specif.option = option;
+
+varargout = mirfunction(@mirmidi,orig,varargin,nargout,specif,@init,@main);
+
+
+function [x type] = init(x,option)
+try
+    hz2midi(440);
+catch
+    mirerror('MIRMIDI','MIDItoolbox does not seem to be installed.');
+end
+if not(isamir(x,'mirmidi')) && not(isamir(x,'mirpitch'))
+    if isa(x,'mirdesign') && not(option.mono)
+        x = set(x,'SeparateChannels',1);
+    end
+    o = mironsets(x,'Attacks','Releases',option.release);
+    x = {o x};
+end
+type = 'mirmidi';
+    
+
+function m = main(x,option,postoption)
+if iscell(x) %not(isamir(x,'mirmidi'))
+    o = x{1};
+    a = x{2};
+    s = mirsegment(a,o);
+    x = mirpitch(s,'Contrast',option.thr,'Sum',0);
+    do = get(o,'PeakVal');
+    da = get(o,'AttackPos');
+    dr = get(o,'ReleasePos');
+    df = get(o,'FramePos');
+else
+    do = NaN;
+end
+dp = get(x,'Data');
+%fp = get(x,'FramePos');
+nmat = cell(1,length(dp));
+for i = 1:length(dp)
+    nmat{i} = [];
+    for j = 2:length(dp{i})
+        tij = mean(df{i}{1}(:,da{i}{1}{1}(j-1)));
+        dij = mean(df{i}{1}(:,dr{i}{1}{1}(j-1))) - tij;
+        if not(iscell(do))
+            vij = 120;
+        else
+            vij = round(do{i}{1}{1}(j-1)/max(do{i}{1}{1})*120);
+        end
+        for k = 1:size(dp{i}{j},3)
+            for l = 1:size(dp{i}{j},2)
+                for n = 1:length(dp{i}{j}{1,l,k})
+                    f = dp{i}{j}{1,l,k}(n);
+                    p = round(hz2midi(f));
+                    nmat{i} = [nmat{i}; tij dij 1 p vij tij dij];
+                end
+            end
+        end
+    end
+end
+m = class(struct,'mirmidi',mirdata(x));
+m = set(m,'Data',nmat);
\ No newline at end of file