diff src/org/qmul/eecs/c4dm/sia/midi/MidiParser.java @ 46:fa9030705e93

organised imports now uses three dimensions - one for time, one for pitch, one for channel number removed the Data integrity code section - no longer necessary stores the final model in an external TDB database, as well as writing to N3 and RDF/XML files
author stevenh
date Tue, 02 Apr 2013 22:47:21 +0100
parents cb7f70e10a0c
children 39106212a3c6
line wrap: on
line diff
--- a/src/org/qmul/eecs/c4dm/sia/midi/MidiParser.java	Tue Apr 02 22:25:26 2013 +0100
+++ b/src/org/qmul/eecs/c4dm/sia/midi/MidiParser.java	Tue Apr 02 22:47:21 2013 +0100
@@ -21,6 +21,7 @@
 import javax.sound.midi.SysexMessage;
 import javax.sound.midi.Track;
 
+import org.qmul.eecs.c4dm.sia.SiaMain;
 import org.qmul.eecs.c4dm.sia.model.Datapoint;
 import org.qmul.eecs.c4dm.sia.model.DimensionValue;
 import org.qmul.eecs.c4dm.sia.rdf.Namespaces;
@@ -28,6 +29,8 @@
 import com.hp.hpl.jena.ontology.OntClass;
 import com.hp.hpl.jena.ontology.OntModel;
 import com.hp.hpl.jena.ontology.OntResource;
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.query.ReadWrite;
 import com.hp.hpl.jena.rdf.model.AnonId;
 import com.hp.hpl.jena.rdf.model.ModelFactory;
 import com.hp.hpl.jena.rdf.model.NodeIterator;
@@ -36,6 +39,7 @@
 import com.hp.hpl.jena.rdf.model.Resource;
 import com.hp.hpl.jena.rdf.model.Statement;
 import com.hp.hpl.jena.rdf.model.StmtIterator;
+import com.hp.hpl.jena.tdb.TDBFactory;
 import com.hp.hpl.jena.util.iterator.ExtendedIterator;
 import com.hp.hpl.jena.vocabulary.RDF;
 import com.sun.media.sound.MidiUtils;
@@ -52,6 +56,9 @@
 	// The final output file
 	private static final String finalModelFileName = "src/rdf/midiModel";
 
+	// The input midi file
+	private static final String midiFileName = "/Volumes/USB_DISK/portable/ewerts/Cantata_16_no_5-mids/score.mid";
+
 	public static void main(String[] args)
 	{
 		// First create a Jena ontology model
@@ -61,17 +68,12 @@
 		// Then read the data from the file into the ontology model
 		ontModel.read(ontology, "N3");
 		
-		// Set the value of SIA_NS_URI as the namespace for 'sia' found in
-		// the ontology. This must be done before we use any of the sia.model classes.
-		Namespaces.SIA_NS_URI = ontModel.getNsPrefixURI("sia");
 		OntClass datapointClass = ontModel.getOntClass(Datapoint.RESOURCE_URI);
 		Resource datapointResource = ontModel.getOntResource(datapointClass);
 		Property siaDimValProperty = ontModel.createProperty(DimensionValue.PROPERTY_URI);
 		Property siaDimensionProperty = ontModel.createProperty(DimensionValue.DIMENSION_URI);
 		Property siaValueProperty = ontModel.createProperty(DimensionValue.VALUE_URI);
 
-		String midiFileName = "/Volumes/USB DISK/portable/ewerts/Cantata_16_no_5-mids/score.mid";
-
 		File midiFile1 = new File(midiFileName);
 	
 		Sequence sequence = null;
@@ -180,21 +182,27 @@
 							maxTick = tick;
 						}
 						System.out.println("NOTE_ON");
-						long microsecs = MidiUtils.tick2microsecond(sequence, tick, tempoCache);
-						System.out.println(" microsecs = " + microsecs);
+						double microsecs = MidiUtils.tick2microsecond(sequence, tick, tempoCache);
+						double secs = microsecs/1000000;
+						System.out.println(" microsecs = " + secs);
 						
 						DimensionValue timeDimVal = new DimensionValue();
 						timeDimVal.setDimension(TIME_DIMENSION);
-						timeDimVal.setValue(tick);
+						timeDimVal.setValue(secs);
 						
-						DimensionValue dimVal = new DimensionValue();
-						dimVal.setDimension(trackDimensionMap.get(trackIdx));
-						dimVal.setValue(data1);
+						DimensionValue pitchDimVal = new DimensionValue();
+						pitchDimVal.setDimension(PITCH_DIMENSION);
+						pitchDimVal.setValue(data1);
 						
+						DimensionValue channelDimVal = new DimensionValue();
+						channelDimVal.setDimension(CHANNEL_DIMENSION);
+						channelDimVal.setValue(trackDimensionMap.get(trackIdx));
+
 						Datapoint datapoint = new Datapoint();
 						Vector<DimensionValue> dimVals = new Vector<DimensionValue>();
 						dimVals.add(timeDimVal);
-						dimVals.add(dimVal);
+						dimVals.add(pitchDimVal);
+						dimVals.add(channelDimVal);
 						
 						datapoint.setDimensionValues(dimVals);
 						datapoints.add(datapoint);
@@ -205,14 +213,20 @@
 
 						Resource timeDimValBnode = ontModel.createResource(AnonId.create());
 						Resource pitchDimValBnode = ontModel.createResource(AnonId.create());
+						Resource channelDimValBnode = ontModel.createResource(AnonId.create());
 
 						ontModel.add(datapointBnode, siaDimValProperty, timeDimValBnode);
 						ontModel.addLiteral(timeDimValBnode, siaDimensionProperty, TIME_DIMENSION);
-						ontModel.addLiteral(timeDimValBnode, siaValueProperty, tick);
+						ontModel.addLiteral(timeDimValBnode, siaValueProperty, secs);
 
 						ontModel.add(datapointBnode, siaDimValProperty, pitchDimValBnode);
-						ontModel.addLiteral(pitchDimValBnode, siaDimensionProperty, trackDimensionMap.get(trackIdx).intValue());
+						ontModel.addLiteral(pitchDimValBnode, siaDimensionProperty, PITCH_DIMENSION);
 						ontModel.addLiteral(pitchDimValBnode, siaValueProperty, data1);
+
+						ontModel.add(datapointBnode, siaDimValProperty, channelDimValBnode);
+						ontModel.addLiteral(channelDimValBnode, siaDimensionProperty, CHANNEL_DIMENSION);
+						ontModel.addLiteral(channelDimValBnode, siaValueProperty, trackDimensionMap.get(trackIdx).intValue());
+
 					}
 					else if (messageCommand == ShortMessage.PITCH_BEND)
 					{
@@ -289,64 +303,6 @@
 			}
 		}
 
-		// Data integrity start - set any 'missing' dimensions to zero value
-		// Note the highest dimension for later use
-		Collection<Integer> values = trackDimensionMap.values();
-		Iterator<Integer> valuesIter = values.iterator();
-		int maxDimension = 0;
-		while (valuesIter.hasNext())
-		{
-			Integer value = valuesIter.next();
-			if (value > maxDimension)
-			{
-				maxDimension = value;
-			}
-		}
-
-		// Iterate over all datapoints
-		ExtendedIterator<? extends OntResource> datapointIter = datapointClass.listInstances();
-		OntResource datapointIndividual;
-		OntModel ontModelTemp = ModelFactory
-				.createOntologyModel(); // OntModelSpec.OWL_MEM
-
-		while (datapointIter.hasNext())
-		{
-			datapointIndividual = datapointIter.next();
-		
-			// Find all Dimension Values for this datapoint
-			NodeIterator dimValIter = datapointIndividual.listPropertyValues(siaDimValProperty);
-			
-			// Create a hashmap of dimensions for this datapoint
-			HashMap<Integer, Boolean> dimensions = new HashMap<>();
-			while (dimValIter.hasNext())
-			{
-				RDFNode dimVal = dimValIter.next();
-				NodeIterator dims = ontModel.listObjectsOfProperty(dimVal.asResource(), siaDimensionProperty);
-				while (dims.hasNext())
-				{
-					int dim = dims.next().asLiteral().getInt();
-					dimensions.put(dim, true);
-					System.out.println(dim);
-				}
-			}
-			
-			for (int i = 2; i <= maxDimension; i++)
-			{
-				if (!dimensions.containsKey(i))
-				{
-					Resource zeroValDimValBnode = ontModel.createResource(AnonId.create());
-
-					Resource dpResource = datapointIndividual.asResource();
-					ontModelTemp.add(dpResource, siaDimValProperty, zeroValDimValBnode);
-					ontModelTemp.addLiteral(zeroValDimValBnode, siaDimensionProperty, i);
-					ontModelTemp.addLiteral(zeroValDimValBnode, siaValueProperty, 0);					
-				}
-			}
-			
-		}
-		ontModel.add(ontModelTemp);
-		// Data integrity end
-
 		System.out.println("done");
 	    	    
 		// Print out what we've got now
@@ -354,7 +310,7 @@
 		StmtIterator stmtIterator = ontModel.listStatements();
 		printStmts(stmtIterator);
 
-		// Write rdf to file
+		// TODO write rdf to file
 		File outFileRdf = new File(finalModelFileName + ".rdf");
 		File outFileN3 = new File(finalModelFileName + ".n3");
 		FileOutputStream outFileOutputStreamRdf = null;
@@ -399,7 +355,22 @@
 		System.out.println("Model written to files: "
 				+ outFileRdf.getAbsolutePath() + " and " + outFileN3.getAbsolutePath());
 		
-		System.out.println("max tick: " + maxTick);
+		// Obtain a dataset context
+		Dataset dataset = TDBFactory.assembleDataset(SiaMain.assemblerFile);
+        dataset.begin(ReadWrite.WRITE) ;
+        try {
+        	dataset.replaceNamedModel(SiaMain.graph, ontModel);
+        	dataset.commit();
+        	System.out.println("dataset.commit() done");
+        } finally {
+        	dataset.end();
+        	System.out.println("dataset.end() done");
+        }
+		dataset.close();
+    	System.out.println("dataset.close() done");
+
+    	System.out.println("max tick: " + maxTick);
+		System.out.println("Number of Datapoints (n) = " + datapoints.size());
 		
 	}