package body Libsens.Common is
   function image(Signature : in Time_Signature_Type) return String is
      
   begin      
      
      return 
	Positive'Image(Signature.Number) & '/' &
	Positive'Image(signature.Unit);
   end Image;      
   
   
   function Image(Bar_Beat : in Bar_Beat_Type) return String is
      
   begin
      
      return Positive'Image(Bar_Beat.Bar) & '.' &
	Positive'Image(Bar_Beat.Time_Number) & '.' &
	Positive'Image(Bar_Beat.Time_unit);
   end Image;
   
   procedure Next(Bar_Beat    : in out Bar_Beat_Type;
		  Bar         : in Natural;
		  Number      : in Time_Number_Type;
		  Unit        : in Time_Unit_Type) is
      
   begin
      
      if Bar_Beat.Time_Unit + 1 > Unit then
	 Bar_Beat.Time_Unit := 1;
	 if Bar_Beat.Time_Number + 1 > Number then
	    Bar_Beat.Time_Number := 1;
	    if Bar_Beat.Bar < Bar then
	       Bar_Beat.Bar := Bar_Beat.Bar + 1;
	    else
	       Bar_Beat.Bar := 1;
	    end if;
	 else
	    Bar_Beat.Time_Number := Bar_Beat.Time_Number + 1;
	 end if;
      else
	 Bar_Beat.Time_Unit := Bar_Beat.Time_Unit + 1;
      end if;      
   end Next;
   
   function Bpm_To_Duration(Bpm : Tempo_Type;
                            figure : T_figure) return Duration is
   begin
      case figure is
         when Quadruple =>
            return duration(duration(60000.0/Bpm)/16.0)/1000.0;
         when Triple =>
            return duration(duration(60000.0/Bpm)/8.0)/1000.0;
         when Double =>
            return duration(duration(60000.0/Bpm)/4.0)/1000.0;
         when Simple =>
            return duration(duration(60000.0/Bpm)/2.0)/1000.0;
         when Noire =>
            return  duration(60000.0/Bpm)/1000.0;
         When Blanche =>
            return Duration(duration(60000.0/Bpm)*2.0)/1000.0;
         when Ronde =>
            return Duration(duration(60000.0/Bpm)*4.0)/1000.0;
      end case;
   end Bpm_To_Duration;

   function To_Figure(Value : in Value_Type) return T_Figure Is
   begin
      case Value is
         when 0..18 =>
            return Quadruple;
         when 19..36 =>
            return Triple;
         when 37..54 =>
            return Double;
         when 55..72 =>
            return Simple;
         when 73..91 =>
            return Noire;
         when 92..107 =>
            return Blanche;
         when 108..127 =>
            return Ronde;
      end case;
   end To_Figure;
end Libsens.Common;