#!/usr/bin/octave

function wtm()

%Se ha utilizado que el valor no válido -5 para una nota midi quiere decir silencio
%(el rango de notas válidas es desde 0 hasta 127)
%previo=zeros(p,1);	%Las p muestras anteriores al segmento

ilegal=-5;

config=leer;



%header
cabecera=[77 84 104 100 0 0 0 6 0 0 0 1];
ticks(1,2)=rem(config.ticks_negra,256);
ticks(1,1)=floor(config.ticks_negra/256);
cabecera=[cabecera ticks 77 84 114 107];
t_track_midi=[0 255 3 length(config.track_title) toascii(config.track_title)];
comment_midi=[0 255 2 length(config.comment) toascii(config.comment)];
compas_midi=[0 255 88 4 config.time_signature];
clave_midi=[0 255 89 2 0 0]; %En clave de sol sin sostenidos ni bemoles	%En compas se almacena 3 ó 4 3/4 -- 4/4
tempo_midi=[0 255 81 3 set_tempo(config.tempo)];	%el tempo se mide en microsegundos/negra
metaeventos=[t_track_midi comment_midi compas_midi clave_midi tempo_midi];

instrumento_midi=[0 12*16+config.channel config.instrument];	%12-cambio de programa
eventos=instrumento_midi;

[y,Fs,BITS]=wavread(config.file_input);
energia_media=sum(y.*y)/length(y);

l=0;	%el indice que recorrerá el segmento
dt=config.advance*config.ticks_negra/Fs;	%dt=delta_ticks - numero de ticks que
						%hay en cada avance
ticks=0;	%ticks indica el tiempo que ha pasado desde el ultimo evento
nota_vieja=ilegal;   	%-5 es el valor que he predeterminado
                        %para indicar que viene de silencio	(todavía no ha sonados nada)
prim_even=1;		%Para saber que es el primer evento
segmento.previo=zeros(1,config.num_lpc);
longitud=length(y);

%bucle principal:
while l*config.advance+config.segment_size<=longitud
	%todo esto mientras no es el ultimo segmento
	%a_imprimir=(l*dm+ts)*100/longitud; %lo tengo comentado, realmente sirve para imprimir el % que lleva
	segmento.actual=y(l*config.advance+1:l*config.advance+config.segment_size);	%tomo segmentos
   if (config.analysis_method==7)&(l~=0)	%no lo hago (por ahorrar)
      %cuando el metodo escogido no es SIFT
      %ni (por seguridad) cuando sea el primer segmento
      segmento.previo=y(l*config.advance+1-config.num_lpc:l*config.advance);
   end
   nota_nueva=seg_a_midi(segmento,Fs,config,energia_media);
   %nota_nueva=seg_a_midi(segmento,previo,Fs,config.method,config.freq_max,freq_min,config.num_lpc,energia_media,config.precen_silen,config.center_clip_perncen,x);
   if nota_nueva==nota_vieja
      %o silencio-silencio o la misma nota sigue
      ticks=ticks+dt;
   elseif (nota_nueva~=ilegal)&(nota_vieja==ilegal)
      %El segmento es sonoro, pero el anterio es sordo
      delta=set_delta(ticks);
      if prim_even==1
         %Es el primer evento
         eventos=[eventos delta 9*16+config.channel nota_nueva 100];	%ON nueva
         prim_even=0;	%para que no vuelva a pasar
      else
         %No es el primer evento
         eventos=[eventos delta nota_nueva 100];	%ON nueva (no digo que canal)
      end
      nota_vieja=nota_nueva;
      ticks=dt;
   elseif (nota_nueva==ilegal)&(nota_vieja~=ilegal)
      %Es silencio pero el segmento anterior era sonoro
      delta=set_delta(ticks);
      eventos=[eventos delta nota_vieja 0];	%OFF vieja
      ticks=dt;
      nota_vieja=ilegal;
   elseif (nota_nueva~=ilegal)&(nota_vieja~=ilegal)
      %Tanto el actual como el segmento anterior son notas válidas
      %Pero estoy seguro de que son distintos porque está en un elseif
      delta=set_delta(ticks);
      eventos=[eventos delta nota_vieja 0 0 nota_nueva 100];	%OFF vieja ON nueva
      ticks=dt;
      nota_vieja=nota_nueva;
   end
   l=l+1;
end		%del while principal


%esto lo hace en el ultimo segmenento

if nota_vieja~=ilegal
   %el ultimo segmento era sonoro
   delta=set_delta(ticks);
   eventos=[eventos delta nota_vieja 0];	%apago lo que está sonando si no es silencio
end	%no se pone un else porque no es necesario

eventos=[metaeventos eventos 0 255 47 0];	%fin del track
long_track=set_long(length(eventos));
aescribir=[cabecera long_track eventos];
fid=fopen(config.file_output,'wb');
esc=fwrite(fid, aescribir);
fclose(fid);

