Mercurial > hg > semantic-sia
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()); }