package com.moseph.mra.experiments; import jade.tools.logging.ontology.GetAllLoggers; import java.io.*; import java.util.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.*; import com.sun.org.apache.xml.internal.serialize.*; public class ExperimentGenerator { static final String PVP = "PVP"; static final String PVC = "PVC"; static final String MIRROR = "MIRROR"; static final String MIDI = "STRAIGHT"; static final String RECORDING = "RECORD"; static final String REASON = "REASON"; static final int M_DEV = 0; static final int M_NUM = 1; static final int H_DEV = 2; static final int H_NUM = 3; static final String[] PC_OTHER_DEV = { "AMT", "1" }; static final String[] MAC_OTHER_DEV = { "E-MU XMidi2X2 Midi In 2 ", "0" }; static final String[] PC_PVP_DEVS = { "AMT", "0", "AMT", "0" }; static final String[] PC_PVC_DEVS = { "SD", "0", "AMT", "0" }; static final String RECORD_FILE_LH = "lh.mid"; static final String RECORD_FILE_RH = "rh.mid"; static final String LEFT_HAND = "LH"; static final String RIGHT_HAND = "RH"; //static final String[] MAC_PVP_DEVS = { "Port 4", "0", "Port 1", "0" }; //The first dev here is unconnected, so no metronome get sent! static final String[] MAC_PVP_DEVS = { "asdlfkj", "0", "E-MU XMidi2X2 Midi In 1 ", "0" }; //static final String[] MAC_PVC_DEVS = { "Port 1", "0", "Port 1", "0" }; static final String[] MAC_PVC_DEVS = { "E-MU XMidi2X2 Midi Out 1 ", "0", "E-MU XMidi2X2 Midi In 1 ", "0" }; static final String[][] MAC_PVC_PATCHES = { //{"Port 1", "0", "Port 1", "0" }, {"E-MU XMidi2X2 Midi In 1 ", "0", "E-MU XMidi2X2 Midi Out 1 ", "0" }, }; static final String[][] MAC_PVP_PATCHES = { //{"Port 1", "0", "Port 1", "0" }, {"E-MU XMidi2X2 Midi In 1 ", "0", "E-MU XMidi2X2 Midi Out 1 ", "0" }, //{"Port 1", "0", "Port 2", "0" }, {"E-MU XMidi2X2 Midi In 1 ", "0", "E-MU XMidi2X2 Midi Out 2 ", "0" }, //{"Port 2", "0", "Port 1", "0" }, {"E-MU XMidi2X2 Midi In 2 ", "0", "E-MU XMidi2X2 Midi Out 1 ", "0" }, }; static final String[][] PC_PVC_PATCHES = { {"AMT", "0", "SD", "0" }, {"AMT", "1", "AMT", "0" }, {"AMT", "0", "AMT", "1" }, }; static final String[][] PC_PVP_PATCHES = { {"AMT", "6", "SD", "0" }, {"AMT", "6", "AMT", "1" }, {"AMT", "0", "AMT", "1" }, {"AMT", "0", "SD", "0" }, {"AMT", "1", "SD", "0" } }; static final String MAC = "MAC"; static final String PC = "PC"; /* * End constants */ int playerIndex = 0; ExperimentSetup setup; Document document; Element experimentRoot; public static void main( String[] args ) { if( args.length < 7 ) { System.err.println( "Need arguments: filename condition side part prefix id subid"); System.err.println( "Example: experiment.xml MIRROR PC LH 1-9 102312 3"); System.exit(1); } String filename = args[0]; String condition = args[1].toUpperCase(); String side = args[2].toUpperCase(); String part = args[3].toUpperCase(); String prefix = args[4]; String id = args[5]; String subId = args[6]; //ExperimentGenerator e = new ExperimentGenerator( "MIRROR", "PC", "LH", "1-9"); System.out.println( "Running generator!"); ExperimentGenerator e = new ExperimentGenerator( filename, condition, side, part, prefix, id, subId ); e.generateExperiment(); e.writeExperiment( filename ); } public ExperimentGenerator( String filename, String condition, String side, String partname, String prefix, String id, String subId ) { setup = new ExperimentSetup( condition, side, partname, prefix ); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { System.out.println( "For some reason Java can't make an XML document: " + e ); e.printStackTrace(); } document = builder.newDocument(); experimentRoot = document.createElement( "experiment" ); experimentRoot.setAttribute( "id", id ); experimentRoot.setAttribute( "subid", subId ); document.appendChild( experimentRoot ); } public void writeExperiment( String filename ) { OutputFormat format = new OutputFormat( document ); format.setIndenting( true ); format.setIndent( 2 ); File f = new File( filename ); try { Writer output = new OutputStreamWriter( System.out ); if( filename != null ) output = new FileWriter( f ); XMLSerializer serializer = new XMLSerializer( output, format ); serializer.serialize( document ); } catch (IOException e) { System.out.println( "Coulddn't serialise document: " + e ); e.printStackTrace(); } } public void generateExperiment() { experimentRoot.appendChild( getConductor() ); setupDefaultArguments(); setupScoreParams(); setupMainDevice(); addHuman(); addOther(); addPatches( setup.patches ); } public void addOther() { Element other = null; if( setup.condition.equals( PVP )) other = getPlayer( setup.partnerDevName, setup.partnerDevNumber, setup.otherPartname ); else if( setup.condition.equals( MIDI )) other = getScoreAgent( setup.otherPartname, "Straight" ); else if( setup.condition.equals( MIRROR )) other = getScoreAgent( setup.otherPartname, "Value" ); else if( setup.condition.equals( REASON )) other = getScoreAgent( setup.otherPartname, "SEQUENCE", "SequenceFile=main.seq" ); else if( setup.condition.equals( RECORDING )) { if( setup.otherPartname == LEFT_HAND ) other = getAgent( "PlaybackAgent", setup.otherPartname, "SEQUENCE", "PlaybackFile="+RECORD_FILE_LH, "TrackNumber=1" ); else other = getAgent( "PlaybackAgent", setup.otherPartname, "SEQUENCE", "PlaybackFile="+RECORD_FILE_RH, "TrackNumber=1" ); } else System.err.println( "Unknown condition: "+ setup.condition ); if( other != null ) experimentRoot.appendChild( other ); } public void setupScoreParams() { String prefix = setup.prefix; experimentRoot.setAttribute( "prefix", prefix ); experimentRoot.setAttribute( "runTime", getRunTime( prefix ) ); } String getRunTime( String prefix ) { if( prefix.equals( "1-9" )) return "136"; if( prefix.equals( "69")) return "134"; if( prefix.equals( "88" )) return "152"; return "0"; } void setupDefaultArguments() { experimentRoot.setAttribute( "fragSize", "1.0" ); experimentRoot.setAttribute( "showSpace", "false" ); experimentRoot.setAttribute( "countIn", "4.0" ); } void setupMainDevice() { experimentRoot.setAttribute( "deviceName", setup.mainDevName ); experimentRoot.setAttribute( "deviceNumber", setup.mainDevNumber ); } void addHuman() { experimentRoot.appendChild( getPlayer( setup.humanDevName, setup.humanDevNumber, setup.partname ) ); } public Element getConductor() { Element conductor = document.createElement( "conductor" ); addArg( "OutputDir=experiments/output", conductor ); return conductor; } class ExperimentSetup { int mainNumber; int subNumber; String prefix; String condition; String side; String[][] patches; String partname; String otherPartname; String mainDevName; String mainDevNumber; String humanDevName; String humanDevNumber; String[] partnerDevs; String partnerDevName; String partnerDevNumber; public ExperimentSetup( String condition, String side, String partname, String prefix ) { this.condition = condition; this.side = side; this.partname = partname; this.prefix = prefix; setPatches(); setupDevices(); setupParts(); } void setupParts() { if( partname.equals( LEFT_HAND )) otherPartname = RIGHT_HAND; else otherPartname = LEFT_HAND; } void setupDevices() { String[] devs; if( condition.equals( PVP ) ) if( side.equals( PC ) ) { devs = PC_PVP_DEVS; partnerDevs = PC_OTHER_DEV; } else { devs = MAC_PVP_DEVS; partnerDevs = MAC_OTHER_DEV; } else if( side.equals( PC ) ) devs = PC_PVC_DEVS; else devs = MAC_PVC_DEVS; mainDevName = devs[ M_DEV ]; mainDevNumber = devs[ M_NUM ]; humanDevName = devs[ H_DEV ]; humanDevNumber = devs[ H_NUM ]; if( partnerDevs != null ) { partnerDevName = partnerDevs[0]; partnerDevNumber = partnerDevs[1]; } } void setPatches() { if( condition.equals( PVP ) ) if( side.equals( PC ) ) patches = PC_PVP_PATCHES; else patches = MAC_PVP_PATCHES; else if( side.equals( PC ) ) patches = PC_PVC_PATCHES; else patches = MAC_PVC_PATCHES; } } void addPatches( String[][] patches ) { for( String[] patch : patches ) { Element elem = getPatch( patch[0], patch[1], patch[2], patch[3] ); experimentRoot.appendChild( elem ); } } Element getPatch( String iName, String iNum, String oName, String oNum ) { Element patch = document.createElement( "patch" ); patch.setAttribute( "iName", iName ); patch.setAttribute( "iNum", iNum ); patch.setAttribute( "oName", oName ); patch.setAttribute( "oNum", oNum ); return patch; } Element getPlaybackAgent( String partName, String file ) { Element agent = document.createElement( "agent" ); agent.setAttribute( "name", "bob" ); addArg( "x=0", agent ); addArg( "y=10", agent ); addArg( "Instrument=AcousticPiano", agent ); addArg( "Partname=" + partName, agent ); //addArg( "Reasoner=" + reasoner, agent ); return agent; } Element getAgent( String agentClass, String partName, String reasoner, String...strings ) { Element agent = document.createElement( "agent" ); agent.setAttribute( "name", "bob" ); agent.setAttribute( "class", agentClass ); addArg( "x=0", agent ); addArg( "y=0", agent ); addArg( "Instrument=AcousticPiano", agent ); addArg( "Partname=" + partName, agent ); if( strings != null && strings.length > 0 ) { for( String s : strings ) addArg( s, agent ); } return agent; } Element getScoreAgent( String partName, String reasoner, String...strings ) { Element agent = getAgent( "ScoreAgent", partName, reasoner, strings ); agent.setAttribute( "name", "bob" ); addArg( "Reasoner=" + reasoner, agent ); return agent; } Element getPlayer( String devName, String devNum, String partName ) { Element player = document.createElement( "human" ); player.setAttribute( "name", "Human" + playerIndex++ ); player.setAttribute( "deviceName", devName ); player.setAttribute( "deviceNumber", devNum ); player.setAttribute( "channel", "-1" ); addArg( "x=0", player ); addArg( "y=10", player ); addArg( "Instrument=AcousticPiano", player ); addArg( "Partname=" + partName, player ); return player; } void addArg( String arg, Element target ) { Element argElem = document.createElement( "arg" ); argElem.setTextContent( arg ); target.appendChild( argElem ); } }