with Text_Io;                           use Text_Io;

package body Libsens.Rhetorica is



   function Initialize (Filename : in String;
			Form : Form_Type;
			Category : Category_Type) return arche_access is

      Arche : arche_access;
   begin
      case Form is
	 when ACID =>
	    case Category is
	       when Null_Cat =>
		  null;
	       when BASS =>
		  Arche := new  ACID_BASS_Type;
	       when LEAD =>
		  Arche := new  ACID_LEAD_Type;
	       when SYNTH_HARD =>
		  Arche := new  ACID_SYNTH_HARD_Type;
	       when SYNTH_SOFT =>
		  Arche := new  ACID_SYNTH_SOFT_Type;
	       when MOTION =>
		  Arche := new  ACID_MOTION_Type;
	       when STRINGS_N_PADS =>
		  Arche := new  ACID_STRINGS_N_PADS_Type;
	       when KEYBOARD =>
		  Arche := new  ACID_KEYBOARD_Type;
	       when GUITARE_N_PLUCK =>
		  Arche := new  ACID_GUITARE_N_PLUCK_Type;
	       when BELL_N_DECAY =>
		  Arche := new  ACID_BELL_N_DECAY_Type;
	       when HIT_N_DRUM =>
		  Arche := new  ACID_HIT_N_DRUM_Type;
	       when S_E =>
		  Arche := new  ACID_S_E_Type;
	       when ARP_SEQ =>
		  Arche := new  ACID_ARP_SEQ_Type;
	       when SPLIT =>
		  Arche := new  ACID_SPLIT_Type;
		  when AUDIO_IN =>
		     Arche := new  ACID_AUDIO_IN_Type;
		  when VOCODER =>
		     Arche := new  ACID_VOCODER_Type;
		  when USER =>
		     Arche := new  ACID_USER_Type;
	       when DRUMS_KIT =>
		  Arche := new  ACID_DRUMS_KIT_Type;

	    end case;
	 when TECHNO =>
	    case Category is
	       when Null_Cat =>
		  null;
	       when BASS =>
		  Arche := new  TECHNO_BASS_Type;
	       when LEAD =>
		  Arche := new  TECHNO_LEAD_Type;
	       when SYNTH_HARD =>
		  Arche := new  TECHNO_SYNTH_HARD_Type;
	       when SYNTH_SOFT =>
		  Arche := new  TECHNO_SYNTH_SOFT_Type;
	       when MOTION =>
		  Arche := new  TECHNO_MOTION_Type;
	       when STRINGS_N_PADS =>
		  Arche := new  TECHNO_STRINGS_N_PADS_Type;
	       when KEYBOARD =>
		  Arche := new  TECHNO_KEYBOARD_Type;
	       when GUITARE_N_PLUCK =>
		  Arche := new  TECHNO_GUITARE_N_PLUCK_Type;
	       when BELL_N_DECAY =>
		  Arche := new  TECHNO_BELL_N_DECAY_Type;
	       when HIT_N_DRUM =>
		  Arche := new  TECHNO_HIT_N_DRUM_Type;
	       when S_E =>
		  Arche := new  TECHNO_S_E_Type;
	       when ARP_SEQ =>
		  Arche := new  TECHNO_ARP_SEQ_Type;
	       when SPLIT =>
		  Arche := new  TECHNO_SPLIT_Type;
		  when AUDIO_IN =>
		     Arche := new  TECHNO_AUDIO_IN_Type;
		  when VOCODER =>
		     Arche := new  TECHNO_VOCODER_Type;
		  when USER =>
		     Arche := new  TECHNO_USER_Type;
	       when DRUMS_KIT =>
		  Arche := new  TECHNO_DRUMS_KIT_Type;

	    end case;
	 when TRIBE =>
	    case Category is
	       when Null_Cat =>
		  null;
	       when BASS =>
		  Arche := new  TRIBE_BASS_Type;
	       when LEAD =>
		  Arche := new  TRIBE_LEAD_Type;
	       when SYNTH_HARD =>
		  Arche := new  TRIBE_SYNTH_HARD_Type;
	       when SYNTH_SOFT =>
		  Arche := new  TRIBE_SYNTH_SOFT_Type;
	       when MOTION =>
		  Arche := new  TRIBE_MOTION_Type;
	       when STRINGS_N_PADS =>
		  Arche := new  TRIBE_STRINGS_N_PADS_Type;
	       when KEYBOARD =>
		  Arche := new  TRIBE_KEYBOARD_Type;
	       when GUITARE_N_PLUCK =>
		  Arche := new  TRIBE_GUITARE_N_PLUCK_Type;
	       when BELL_N_DECAY =>
		  Arche := new  TRIBE_BELL_N_DECAY_Type;
	       when HIT_N_DRUM =>
		  Arche := new  TRIBE_HIT_N_DRUM_Type;
	       when S_E =>
		  Arche := new  TRIBE_S_E_Type;
	       when ARP_SEQ =>
		  Arche := new  TRIBE_ARP_SEQ_Type;
	       when SPLIT =>
		  Arche := new  TRIBE_SPLIT_Type;
		  when AUDIO_IN =>
		     Arche := new  TRIBE_AUDIO_IN_Type;
		  when VOCODER =>
		     Arche := new  TRIBE_VOCODER_Type;
		  when USER =>
		     Arche := new  TRIBE_USER_Type;
	       when DRUMS_KIT =>
		  Arche := new  TRIBE_DRUMS_KIT_Type;


	    end case;
	 when HARDTECH =>
	    case Category is
	       when Null_Cat =>
		  null;
	       when BASS =>
		  Arche := new  HARDTECH_BASS_Type;
	       when LEAD =>
		  Arche := new  HARDTECH_LEAD_Type;
	       when SYNTH_HARD =>
		  Arche := new  HARDTECH_SYNTH_HARD_Type;
	       when SYNTH_SOFT =>
		  Arche := new  HARDTECH_SYNTH_SOFT_Type;
	       when MOTION =>
		  Arche := new  HARDTECH_MOTION_Type;
	       when STRINGS_N_PADS =>
		  Arche := new  HARDTECH_STRINGS_N_PADS_Type;
	       when KEYBOARD =>
		  Arche := new  HARDTECH_KEYBOARD_Type;
	       when GUITARE_N_PLUCK =>
		  Arche := new  HARDTECH_GUITARE_N_PLUCK_Type;
	       when BELL_N_DECAY =>
		  Arche := new  HARDTECH_BELL_N_DECAY_Type;
	       when HIT_N_DRUM =>
		  Arche := new  HARDTECH_HIT_N_DRUM_Type;
	       when S_E =>
		  Arche := new  HARDTECH_S_E_Type;
	       when ARP_SEQ =>
		  Arche := new  HARDTECH_ARP_SEQ_Type;
	       when SPLIT =>
		  Arche := new  HARDTECH_SPLIT_Type;
		  when AUDIO_IN =>
		     Arche := new  HARDTECH_AUDIO_IN_Type;
		  when VOCODER =>
		     Arche := new  HARDTECH_VOCODER_Type;
		  when USER =>
		     Arche := new  HARDTECH_USER_Type;
	       when DRUMS_KIT =>
		  Arche := new  HARDTECH_DRUMS_KIT_Type;

	    end case;
	 when HARDCORE =>
	    case Category is
	       when Null_Cat =>
		  null;
	       when BASS =>
		  Arche := new  HARDCORE_BASS_Type;
	       when LEAD =>
		  Arche := new  HARDCORE_LEAD_Type;
	       when SYNTH_HARD =>
		  Arche := new  HARDCORE_SYNTH_HARD_Type;
	       when SYNTH_SOFT =>
		  Arche := new  HARDCORE_SYNTH_SOFT_Type;
	       when MOTION =>
		  Arche := new  HARDCORE_MOTION_Type;
	       when STRINGS_N_PADS =>
		  Arche := new  HARDCORE_STRINGS_N_PADS_Type;
	       when KEYBOARD =>
		  Arche := new  HARDCORE_KEYBOARD_Type;
	       when GUITARE_N_PLUCK =>
		  Arche := new  HARDCORE_GUITARE_N_PLUCK_Type;
	       when BELL_N_DECAY =>
		  Arche := new  HARDCORE_BELL_N_DECAY_Type;
	       when HIT_N_DRUM =>
		  Arche := new  HARDCORE_HIT_N_DRUM_Type;
	       when S_E =>
		  Arche := new  HARDCORE_S_E_Type;
	       when ARP_SEQ =>
		  Arche := new  HARDCORE_ARP_SEQ_Type;
	       when SPLIT =>
		  Arche := new  HARDCORE_SPLIT_Type;
		  when AUDIO_IN =>
		     Arche := new  HARDCORE_AUDIO_IN_Type;
		  when VOCODER =>
		     Arche := new  HARDCORE_VOCODER_Type;
		  when USER =>
		     Arche := new  HARDCORE_USER_Type;
	       when DRUMS_KIT =>
		  Arche := new  HARDCORE_DRUMS_KIT_Type;

	    end case;
	 when TRANCE =>
	    case Category is
	       when Null_Cat =>
		  null;
	       when BASS =>
		  Arche := new  TRANCE_BASS_Type;
	       when LEAD =>
		  Arche := new  TRANCE_LEAD_Type;
	       when SYNTH_HARD =>
		  Arche := new  TRANCE_SYNTH_HARD_Type;
	       when SYNTH_SOFT =>
		  Arche := new  TRANCE_SYNTH_SOFT_Type;
	       when MOTION =>
		  Arche := new  TRANCE_MOTION_Type;
	       when STRINGS_N_PADS =>
		  Arche := new  TRANCE_STRINGS_N_PADS_Type;
	       when KEYBOARD =>
		  Arche := new  TRANCE_KEYBOARD_Type;
	       when GUITARE_N_PLUCK =>
		  Arche := new  TRANCE_GUITARE_N_PLUCK_Type;
	       when BELL_N_DECAY =>
		  Arche := new  TRANCE_BELL_N_DECAY_Type;
	       when HIT_N_DRUM =>
		  Arche := new  TRANCE_HIT_N_DRUM_Type;
	       when S_E =>
		  Arche := new  TRANCE_S_E_Type;
	       when ARP_SEQ =>
		  Arche := new  TRANCE_ARP_SEQ_Type;
	       when SPLIT =>
		  Arche := new  TRANCE_SPLIT_Type;
		  when AUDIO_IN =>
		     Arche := new  TRANCE_AUDIO_IN_Type;
		  when VOCODER =>
		     Arche := new  TRANCE_VOCODER_Type;
		  when USER =>
		     Arche := new  TRANCE_USER_Type;
	       when DRUMS_KIT =>
		  Arche := new  TRANCE_DRUMS_KIT_Type;

	    end case;
	 when MINIMAL =>
	    case Category is
	       when Null_Cat =>
		  null;
	       when BASS =>
		  Arche := new  MINIMAL_BASS_Type;
	       when LEAD =>
		  Arche := new  MINIMAL_LEAD_Type;
	       when SYNTH_HARD =>
		  Arche := new  MINIMAL_SYNTH_HARD_Type;
	       when SYNTH_SOFT =>
		  Arche := new  MINIMAL_SYNTH_SOFT_Type;
	       when MOTION =>
		  Arche := new  MINIMAL_MOTION_Type;
	       when STRINGS_N_PADS =>
		  Arche := new  MINIMAL_STRINGS_N_PADS_Type;
	       when KEYBOARD =>
		  Arche := new  MINIMAL_KEYBOARD_Type;
	       when GUITARE_N_PLUCK =>
		  Arche := new  MINIMAL_GUITARE_N_PLUCK_Type;
	       when BELL_N_DECAY =>
		  Arche := new  MINIMAL_BELL_N_DECAY_Type;
	       when HIT_N_DRUM =>
		  Arche := new  MINIMAL_HIT_N_DRUM_Type;
	       when S_E =>
		  Arche := new  MINIMAL_S_E_Type;
	       when ARP_SEQ =>
		  Arche := new  MINIMAL_ARP_SEQ_Type;
	       when SPLIT =>
		  Arche := new  MINIMAL_SPLIT_Type;
	       when AUDIO_IN =>
		  Arche := new  MINIMAL_AUDIO_IN_Type;
	       when VOCODER =>
		  Arche := new  MINIMAL_VOCODER_Type;
	       when USER =>
		  Arche := new  MINIMAL_USER_Type;
	       when DRUMS_KIT =>
		  Arche := new  MINIMAL_DRUMS_KIT_Type;
		  
	    end case;
	 when DNB =>
	    case Category is
	       when Null_Cat =>
		  null;
	       when BASS =>
		  Arche := new  DNB_BASS_Type;
	       when LEAD =>
		  Arche := new  DNB_LEAD_Type;
	       when SYNTH_HARD =>
		  Arche := new  DNB_SYNTH_HARD_Type;
	       when SYNTH_SOFT =>
		  Arche := new  DNB_SYNTH_SOFT_Type;
	       when MOTION =>
		  Arche := new  DNB_MOTION_Type;
	       when STRINGS_N_PADS =>
		  Arche := new  DNB_STRINGS_N_PADS_Type;
	       when KEYBOARD =>
		  Arche := new  DNB_KEYBOARD_Type;
	       when GUITARE_N_PLUCK =>
		  Arche := new  DNB_GUITARE_N_PLUCK_Type;
	       when BELL_N_DECAY =>
		  Arche := new  DNB_BELL_N_DECAY_Type;
	       when HIT_N_DRUM =>
		  Arche := new  DNB_HIT_N_DRUM_Type;
	       when S_E =>
		  Arche := new  DNB_S_E_Type;
	       when ARP_SEQ =>
		  Arche := new  DNB_ARP_SEQ_Type;
	       when SPLIT =>
		  Arche := new  DNB_SPLIT_Type;
		  when AUDIO_IN =>
		     Arche := new  DNB_AUDIO_IN_Type;
		  when VOCODER =>
		     Arche := new  DNB_VOCODER_Type;
		  when USER =>
		     Arche := new  DNB_USER_Type;
	       when DRUMS_KIT =>
		  Arche := new  DNB_DRUMS_KIT_Type;

	    end case;
      end case;
      
      Arche.Filename := new String ' (Filename);
      
      return Arche;
   end Initialize;

   
   
   task body Compositor_Type is



      End_Of_Task : Boolean := False;
      
      --Filename : access String := new String ' ("");
      

   begin
      
      while not End_Of_Task loop
	 loop
	    select


	       accept Initialize(Filename : in String) do
		  New_Line(2);
		  --Put_Line("Initialize Arch filename : " & Filename);
		  Composer.Arche := Initialize(Filename, Composer.Form, Composer.Cat);
		  --Put_Line("Initialize Arch filename : " & Filename & " done.");

	       end Initialize;
	       exit;
	    or

	       accept Halt do

		  End_Of_Task := True;
	       end Halt;
	       exit;
	    end select;
	 end loop;
	 while not End_Of_Task loop
	    select
	       accept Halt do

		  End_Of_Task := True;
	       end Halt;
	       exit;
	    or
	       accept Respond(Filename : in String; Channel : in Channel_Type; sequence : out Seq_Vectors.vector) do

		  
		  --Text_Io.Put_line("Composer: " & Form_Type'Image(Composer.Arche.Form) & "-" & Valid_Category_Type'Image(Composer.Arche.Category) & "- " & Channel_Type'Image(Channel) & " respond...");
		  

		  
		  
		  --Text_Io.Put_Line("Natural language compose ....");
		  case Composer.Arche.Form is
		     when ACID =>
			--Text_Io.Put_Line("Natural language compose Acid...");
			case Composer.Arche.Category is
			   when Null_Cat =>
			      null;
			   when BASS =>
			      Sequence := ACID_BASS_Type(Composer.Arche.all).Compose(Channel);
			      --Text_Io.Put_Line("Natural language compose Acid bass...");
			   when LEAD =>
			      Sequence := ACID_LEAD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_HARD =>
			      Sequence := ACID_SYNTH_HARD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_SOFT =>
			      Sequence := ACID_SYNTH_SOFT_Type(Composer.Arche.all).Compose(Channel);
			   when MOTION =>
			      Sequence := ACID_MOTION_Type(Composer.Arche.all).Compose(Channel);
			   when STRINGS_N_PADS =>
			      Sequence := ACID_STRINGS_N_PADS_Type(Composer.Arche.all).Compose(Channel);
			   when KEYBOARD =>
			      Sequence := ACID_KEYBOARD_Type(Composer.Arche.all).Compose(Channel);
			   when GUITARE_N_PLUCK =>
			      Sequence := ACID_GUITARE_N_PLUCK_Type(Composer.Arche.all).Compose(Channel);
			   when BELL_N_DECAY =>
			      Sequence := ACID_BELL_N_DECAY_Type(Composer.Arche.all).Compose(Channel);
			   when HIT_N_DRUM =>
			      Sequence := ACID_HIT_N_DRUM_Type(Composer.Arche.all).Compose(Channel);
			   when S_E =>
			      Sequence := ACID_S_E_Type(Composer.Arche.all).Compose(Channel);
			   when ARP_SEQ =>
			      Sequence := ACID_ARP_SEQ_Type(Composer.Arche.all).Compose(Channel);
			   when SPLIT =>
			      Sequence := ACID_SPLIT_Type(Composer.Arche.all).Compose(Channel);
			   when AUDIO_IN =>
			      Sequence := ACID_AUDIO_IN_Type(Composer.Arche.all).Compose(Channel);
			   when VOCODER =>
			      Sequence := ACID_VOCODER_Type(Composer.Arche.all).Compose(Channel);
			   when USER =>
			      Sequence := ACID_USER_Type(Composer.Arche.all).Compose(Channel);
			   when DRUMS_KIT =>
			      Sequence := ACID_DRUMS_KIT_Type(Composer.Arche.all).Compose(Channel);
			end case;

		     when TECHNO =>
			case Composer.Arche.Category is
			   when Null_Cat =>
			      null;
			   when BASS =>
			      Sequence := TECHNO_BASS_Type(Composer.Arche.all).Compose(Channel);
			   when LEAD =>
			      Sequence := TECHNO_LEAD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_HARD =>
			      Sequence := TECHNO_SYNTH_HARD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_SOFT =>
			      Sequence := TECHNO_SYNTH_SOFT_Type(Composer.Arche.all).Compose(Channel);
			   when MOTION =>
			      Sequence := TECHNO_MOTION_Type(Composer.Arche.all).Compose(Channel);
			   when STRINGS_N_PADS =>
			      Sequence := TECHNO_STRINGS_N_PADS_Type(Composer.Arche.all).Compose(Channel);
			   when KEYBOARD =>
			      Sequence := TECHNO_KEYBOARD_Type(Composer.Arche.all).Compose(Channel);
			   when GUITARE_N_PLUCK =>
			      Sequence := TECHNO_GUITARE_N_PLUCK_Type(Composer.Arche.all).Compose(Channel);
			   when BELL_N_DECAY =>
			      Sequence := TECHNO_BELL_N_DECAY_Type(Composer.Arche.all).Compose(Channel);
			   when HIT_N_DRUM =>
			      Sequence := TECHNO_HIT_N_DRUM_Type(Composer.Arche.all).Compose(Channel);
			   when S_E =>
			      Sequence := TECHNO_S_E_Type(Composer.Arche.all).Compose(Channel);
			   when ARP_SEQ =>
			      Sequence := TECHNO_ARP_SEQ_Type(Composer.Arche.all).Compose(Channel);
			   when SPLIT =>
			      Sequence := TECHNO_SPLIT_Type(Composer.Arche.all).Compose(Channel);
			   when AUDIO_IN =>
			      Sequence := TECHNO_AUDIO_IN_Type(Composer.Arche.all).Compose(Channel);
			   when VOCODER =>
			      Sequence := TECHNO_VOCODER_Type(Composer.Arche.all).Compose(Channel);
			   when USER =>
			      Sequence := TECHNO_USER_Type(Composer.Arche.all).Compose(Channel);
			   when DRUMS_KIT =>
			      Sequence := TECHNO_DRUMS_KIT_Type(Composer.Arche.all).Compose(Channel);
			end case;

		     when TRIBE =>
			case Composer.Arche.Category is
			   when Null_Cat =>
			      null;
			   when BASS =>
			      Sequence := TRIBE_BASS_Type(Composer.Arche.all).Compose(Channel);
			   when LEAD =>
			      Sequence := TRIBE_LEAD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_HARD =>
			      Sequence := TRIBE_SYNTH_HARD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_SOFT =>
			      Sequence := TRIBE_SYNTH_SOFT_Type(Composer.Arche.all).Compose(Channel);
			   when MOTION =>
			      Sequence := TRIBE_MOTION_Type(Composer.Arche.all).Compose(Channel);
			   when STRINGS_N_PADS =>
			      Sequence := TRIBE_STRINGS_N_PADS_Type(Composer.Arche.all).Compose(Channel);
			   when KEYBOARD =>
			      Sequence := TRIBE_KEYBOARD_Type(Composer.Arche.all).Compose(Channel);
			   when GUITARE_N_PLUCK =>
			      Sequence := TRIBE_GUITARE_N_PLUCK_Type(Composer.Arche.all).Compose(Channel);
			   when BELL_N_DECAY =>
			      Sequence := TRIBE_BELL_N_DECAY_Type(Composer.Arche.all).Compose(Channel);
			   when HIT_N_DRUM =>
			      Sequence := TRIBE_HIT_N_DRUM_Type(Composer.Arche.all).Compose(Channel);
			   when S_E =>
			      Sequence := TRIBE_S_E_Type(Composer.Arche.all).Compose(Channel);
			   when ARP_SEQ =>
			      Sequence := TRIBE_ARP_SEQ_Type(Composer.Arche.all).Compose(Channel);
			   when SPLIT =>
			      Sequence := TRIBE_SPLIT_Type(Composer.Arche.all).Compose(Channel);
			   when AUDIO_IN =>
			      Sequence := TRIBE_AUDIO_IN_Type(Composer.Arche.all).Compose(Channel);
			   when VOCODER =>
			      Sequence := TRIBE_VOCODER_Type(Composer.Arche.all).Compose(Channel);
			   when USER =>
			      Sequence := TRIBE_USER_Type(Composer.Arche.all).Compose(Channel);
			   when DRUMS_KIT =>
			      Sequence := TRIBE_DRUMS_KIT_Type(Composer.Arche.all).Compose(Channel);
			end case;

		     when HARDTECH =>
			case Composer.Arche.Category is
			   when Null_Cat =>
			      null;
			   when BASS =>
			      Sequence := HARDTECH_BASS_Type(Composer.Arche.all).Compose(Channel);
			   when LEAD =>
			      Sequence := HARDTECH_LEAD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_HARD =>
			      Sequence := HARDTECH_SYNTH_HARD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_SOFT =>
			      Sequence := HARDTECH_SYNTH_SOFT_Type(Composer.Arche.all).Compose(Channel);
			   when MOTION =>
			      Sequence := HARDTECH_MOTION_Type(Composer.Arche.all).Compose(Channel);
			   when STRINGS_N_PADS =>
			      Sequence := HARDTECH_STRINGS_N_PADS_Type(Composer.Arche.all).Compose(Channel);
			   when KEYBOARD =>
			      Sequence := HARDTECH_KEYBOARD_Type(Composer.Arche.all).Compose(Channel);
			   when GUITARE_N_PLUCK =>
			      Sequence := HARDTECH_GUITARE_N_PLUCK_Type(Composer.Arche.all).Compose(Channel);
			   when BELL_N_DECAY =>
			      Sequence := HARDTECH_BELL_N_DECAY_Type(Composer.Arche.all).Compose(Channel);
			   when HIT_N_DRUM =>
			      Sequence := HARDTECH_HIT_N_DRUM_Type(Composer.Arche.all).Compose(Channel);
			   when S_E =>
			      Sequence := HARDTECH_S_E_Type(Composer.Arche.all).Compose(Channel);
			   when ARP_SEQ =>
			      Sequence := HARDTECH_ARP_SEQ_Type(Composer.Arche.all).Compose(Channel);
			   when SPLIT =>
			      Sequence := HARDTECH_SPLIT_Type(Composer.Arche.all).Compose(Channel);
			   when AUDIO_IN =>
			      Sequence := HARDTECH_AUDIO_IN_Type(Composer.Arche.all).Compose(Channel);
			   when VOCODER =>
			      Sequence := HARDTECH_VOCODER_Type(Composer.Arche.all).Compose(Channel);
			   when USER =>
			      Sequence := HARDTECH_USER_Type(Composer.Arche.all).Compose(Channel);
			   when DRUMS_KIT =>
			      Sequence := HARDTECH_DRUMS_KIT_Type(Composer.Arche.all).Compose(Channel);
			end case;

		     when HARDCORE =>
			case Composer.Arche.Category is
			   when Null_Cat =>
			      null;
			   when BASS =>
			      Sequence := HARDCORE_BASS_Type(Composer.Arche.all).Compose(Channel);
			   when LEAD =>
			      Sequence := HARDCORE_LEAD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_HARD =>
			      Sequence := HARDCORE_SYNTH_HARD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_SOFT =>
			      Sequence := HARDCORE_SYNTH_SOFT_Type(Composer.Arche.all).Compose(Channel);
			   when MOTION =>
			      Sequence := HARDCORE_MOTION_Type(Composer.Arche.all).Compose(Channel);
			   when STRINGS_N_PADS =>
			      Sequence := HARDCORE_STRINGS_N_PADS_Type(Composer.Arche.all).Compose(Channel);
			   when KEYBOARD =>
			      Sequence := HARDCORE_KEYBOARD_Type(Composer.Arche.all).Compose(Channel);
			   when GUITARE_N_PLUCK =>
			      Sequence := HARDCORE_GUITARE_N_PLUCK_Type(Composer.Arche.all).Compose(Channel);
			   when BELL_N_DECAY =>
			      Sequence := HARDCORE_BELL_N_DECAY_Type(Composer.Arche.all).Compose(Channel);
			   when HIT_N_DRUM =>
			      Sequence := HARDCORE_HIT_N_DRUM_Type(Composer.Arche.all).Compose(Channel);
			   when S_E =>
			      Sequence := HARDCORE_S_E_Type(Composer.Arche.all).Compose(Channel);
			   when ARP_SEQ =>
			      Sequence := HARDCORE_ARP_SEQ_Type(Composer.Arche.all).Compose(Channel);
			   when SPLIT =>
			      Sequence := HARDCORE_SPLIT_Type(Composer.Arche.all).Compose(Channel);
			   when AUDIO_IN =>
			      Sequence := HARDCORE_AUDIO_IN_Type(Composer.Arche.all).Compose(Channel);
			   when VOCODER =>
			      Sequence := HARDCORE_VOCODER_Type(Composer.Arche.all).Compose(Channel);
			   when USER =>
			      Sequence := HARDCORE_USER_Type(Composer.Arche.all).Compose(Channel);
			   when DRUMS_KIT =>
			      Sequence := HARDCORE_DRUMS_KIT_Type(Composer.Arche.all).Compose(Channel);
			end case;

		     when TRANCE =>
			case Composer.Arche.Category is
			   when Null_Cat =>
			      null;
			   when BASS =>
			      Sequence := TRANCE_BASS_Type(Composer.Arche.all).Compose(Channel);
			   when LEAD =>
			      Sequence := TRANCE_LEAD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_HARD =>
			      Sequence := TRANCE_SYNTH_HARD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_SOFT =>
			      Sequence := TRANCE_SYNTH_SOFT_Type(Composer.Arche.all).Compose(Channel);
			   when MOTION =>
			      Sequence := TRANCE_MOTION_Type(Composer.Arche.all).Compose(Channel);
			   when STRINGS_N_PADS =>
			      Sequence := TRANCE_STRINGS_N_PADS_Type(Composer.Arche.all).Compose(Channel);
			   when KEYBOARD =>
			      Sequence := TRANCE_KEYBOARD_Type(Composer.Arche.all).Compose(Channel);
			   when GUITARE_N_PLUCK =>
			      Sequence := TRANCE_GUITARE_N_PLUCK_Type(Composer.Arche.all).Compose(Channel);
			   when BELL_N_DECAY =>
			      Sequence := TRANCE_BELL_N_DECAY_Type(Composer.Arche.all).Compose(Channel);
			   when HIT_N_DRUM =>
			      Sequence := TRANCE_HIT_N_DRUM_Type(Composer.Arche.all).Compose(Channel);
			   when S_E =>
			      Sequence := TRANCE_S_E_Type(Composer.Arche.all).Compose(Channel);
			   when ARP_SEQ =>
			      Sequence := TRANCE_ARP_SEQ_Type(Composer.Arche.all).Compose(Channel);
			   when SPLIT =>
			      Sequence := TRANCE_SPLIT_Type(Composer.Arche.all).Compose(Channel);
			   when AUDIO_IN =>
			      Sequence := TRANCE_AUDIO_IN_Type(Composer.Arche.all).Compose(Channel);
			   when VOCODER =>
			      Sequence := TRANCE_VOCODER_Type(Composer.Arche.all).Compose(Channel);
			   when USER =>
			      Sequence := TRANCE_USER_Type(Composer.Arche.all).Compose(Channel);
			   when DRUMS_KIT =>
			      Sequence := TRANCE_DRUMS_KIT_Type(Composer.Arche.all).Compose(Channel);
			end case;

		     when MINIMAL =>
			case Composer.Arche.Category is
			   when Null_Cat =>
			      null;
			   when BASS =>
			      Sequence := MINIMAL_BASS_Type(Composer.Arche.all).Compose(Channel);
			   when LEAD =>
			      Sequence := MINIMAL_LEAD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_HARD =>
			      Sequence := MINIMAL_SYNTH_HARD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_SOFT =>
			      Sequence := MINIMAL_SYNTH_SOFT_Type(Composer.Arche.all).Compose(Channel);
			   when MOTION =>
			      Sequence := MINIMAL_MOTION_Type(Composer.Arche.all).Compose(Channel);
			   when STRINGS_N_PADS =>
			      Sequence := MINIMAL_STRINGS_N_PADS_Type(Composer.Arche.all).Compose(Channel);
			   when KEYBOARD =>
			      Sequence := MINIMAL_KEYBOARD_Type(Composer.Arche.all).Compose(Channel);
			   when GUITARE_N_PLUCK =>
			      Sequence := MINIMAL_GUITARE_N_PLUCK_Type(Composer.Arche.all).Compose(Channel);
			   when BELL_N_DECAY =>
			      Sequence := MINIMAL_BELL_N_DECAY_Type(Composer.Arche.all).Compose(Channel);
			   when HIT_N_DRUM =>
			      Sequence := MINIMAL_HIT_N_DRUM_Type(Composer.Arche.all).Compose(Channel);
			   when S_E =>
			      Sequence := MINIMAL_S_E_Type(Composer.Arche.all).Compose(Channel);
			   when ARP_SEQ =>
			      Sequence := MINIMAL_ARP_SEQ_Type(Composer.Arche.all).Compose(Channel);
			   when SPLIT =>
			      Sequence := MINIMAL_SPLIT_Type(Composer.Arche.all).Compose(Channel);
			   when AUDIO_IN =>
			      Sequence := MINIMAL_AUDIO_IN_Type(Composer.Arche.all).Compose(Channel);
			   when VOCODER =>
			      Sequence := MINIMAL_VOCODER_Type(Composer.Arche.all).Compose(Channel);
			   when USER =>
			      Sequence := MINIMAL_USER_Type(Composer.Arche.all).Compose(Channel);
			   when DRUMS_KIT =>
			      Sequence := MINIMAL_DRUMS_KIT_Type(Composer.Arche.all).Compose(Channel);
			end case;

		     when DNB =>
			case Composer.Arche.Category is
			   when Null_Cat =>
			      null;
			   when BASS =>
			      Sequence := DNB_BASS_Type(Composer.Arche.all).Compose(Channel);
			   when LEAD =>
			      Sequence := DNB_LEAD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_HARD =>
			      Sequence := DNB_SYNTH_HARD_Type(Composer.Arche.all).Compose(Channel);
			   when SYNTH_SOFT =>
			      Sequence := DNB_SYNTH_SOFT_Type(Composer.Arche.all).Compose(Channel);
			   when MOTION =>
			      Sequence := DNB_MOTION_Type(Composer.Arche.all).Compose(Channel);
			   when STRINGS_N_PADS =>
			      Sequence := DNB_STRINGS_N_PADS_Type(Composer.Arche.all).Compose(Channel);
			   when KEYBOARD =>
			      Sequence := DNB_KEYBOARD_Type(Composer.Arche.all).Compose(Channel);
			   when GUITARE_N_PLUCK =>
			      Sequence := DNB_GUITARE_N_PLUCK_Type(Composer.Arche.all).Compose(Channel);
			   when BELL_N_DECAY =>
			      Sequence := DNB_BELL_N_DECAY_Type(Composer.Arche.all).Compose(Channel);
			   when HIT_N_DRUM =>
			      Sequence := DNB_HIT_N_DRUM_Type(Composer.Arche.all).Compose(Channel);
			   when S_E =>
			      Sequence := DNB_S_E_Type(Composer.Arche.all).Compose(Channel);
			   when ARP_SEQ =>
			      Sequence := DNB_ARP_SEQ_Type(Composer.Arche.all).Compose(Channel);
			   when SPLIT =>
			      Sequence := DNB_SPLIT_Type(Composer.Arche.all).Compose(Channel);
			   when AUDIO_IN =>
			      Sequence := DNB_AUDIO_IN_Type(Composer.Arche.all).Compose(Channel);
			   when VOCODER =>
			      Sequence := DNB_VOCODER_Type(Composer.Arche.all).Compose(Channel);
			   when USER =>
			      Sequence := DNB_USER_Type(Composer.Arche.all).Compose(Channel);
			   when DRUMS_KIT =>
			      Sequence := DNB_DRUMS_KIT_Type(Composer.Arche.all).Compose(Channel);
			end case;

		  end case;


		  --Text_Io.Put_line("Composer: " & Form_Type'Image(Composer.Arche.Form) & "-" & Valid_Category_Type'Image(Composer.Arche.Category) & "- " & Channel_Type'Image(Channel) & " responded.");
	       end Respond;

	    end select;
	 end loop;
      end loop;
      Text_Io.Put_Line("Composer: " & Form_Type'Image(Composer.Arche.Form) & "-" & Valid_Category_Type'Image(Composer.Arche.Category) & " halted.");
   end Compositor_Type;


end Libsens.Rhetorica;