public Conductor(int port, boolean loopbackMode){
    improvisers = new ArrayList<Improviser>();
    // fire up the server for receiving messages
    server = new ConductorServer(port, this, loopbackMode);
    serverThread = new Thread(server);
    serverThread.start();
    // stores the message sending objects
    messengers = new HashMap<String,ConductorMessager>();
    // stores the 'messages per cycle' data for different messages,
    // used to block OSC noise agents.
    thresholds = new HashMap<String,Integer>();
    // read the config file
    try {
      Scanner scan = new Scanner(new File("mcp.config"));
      String line;
      String[] parts;
      String message;
      int interval;
      int memLength;
      int sendLength;
      String sendMode;

      // skip the first line..
      scan.nextLine();
      while (scan.hasNextLine()) {
	line = scan.nextLine();
	parts = line.split(",");
	message = parts[0];
	interval = new Integer(parts[1]).intValue();
	memLength = new Integer(parts[2]).intValue();
	sendLength = new Integer(parts[3]).intValue();
	sendMode = parts[4];
	// set up the threshold hash
	thresholds.put("/"+message, new Integer(parts[5]));
	
	System.out.println("Conductor - read message '"+message+"' from config file. Memory length: "+memLength+" interval "+interval+" Send length "+sendLength+" send mode "+sendMode+" allowed messages per cycle "+parts[5]);
	if (memLength > 0) {
	  messengers.put("/"+message, new ConductorMessagerMemory(interval, "/"+message, memLength, sendLength, sendMode, new Object[]{new Integer(0)}, this));
	}
	else {
	  messengers.put("/"+message, new ConductorMessager(interval, "/"+message, new Object[]{new Integer(interval)}, this));
	}
      }
    } catch (Exception e) {
      System.out.println("Conductor - an error occurred reading the config file mcp.config - does it exist?");
      e.printStackTrace();
    }

  }