stevenh@37: package org.qmul.eecs.c4dm.sia.midi; stevenh@37: stevenh@37: import java.io.File; stevenh@37: import java.io.FileNotFoundException; stevenh@37: import java.io.FileOutputStream; stevenh@37: import java.io.IOException; stevenh@37: import java.util.ArrayList; stevenh@37: import java.util.HashMap; stevenh@37: import java.util.List; stevenh@37: import java.util.Vector; stevenh@37: stevenh@37: import javax.sound.midi.InvalidMidiDataException; stevenh@37: import javax.sound.midi.MetaMessage; stevenh@37: import javax.sound.midi.MidiEvent; stevenh@37: import javax.sound.midi.MidiMessage; stevenh@37: import javax.sound.midi.MidiSystem; stevenh@37: import javax.sound.midi.Sequence; stevenh@37: import javax.sound.midi.ShortMessage; stevenh@37: import javax.sound.midi.SysexMessage; stevenh@37: import javax.sound.midi.Track; stevenh@37: stevenh@46: import org.qmul.eecs.c4dm.sia.SiaMain; stevenh@37: import org.qmul.eecs.c4dm.sia.model.Datapoint; stevenh@37: import org.qmul.eecs.c4dm.sia.model.DimensionValue; stevenh@71: import org.qmul.eecs.c4dm.sia.model.MemberOfDataset; stevenh@71: import org.qmul.eecs.c4dm.sia.model.SiaDataset; stevenh@71: import org.qmul.eecs.c4dm.sia.model.SiaVector; stevenh@37: import org.qmul.eecs.c4dm.sia.rdf.Namespaces; stevenh@37: stevenh@71: import com.hp.hpl.jena.datatypes.xsd.XSDDatatype; stevenh@71: import com.hp.hpl.jena.graph.Node; stevenh@71: import com.hp.hpl.jena.graph.Triple; stevenh@37: import com.hp.hpl.jena.ontology.OntClass; stevenh@37: import com.hp.hpl.jena.ontology.OntModel; stevenh@46: import com.hp.hpl.jena.query.Dataset; stevenh@71: import com.hp.hpl.jena.query.Query; stevenh@71: import com.hp.hpl.jena.query.QueryExecution; stevenh@71: import com.hp.hpl.jena.query.QueryExecutionFactory; stevenh@71: import com.hp.hpl.jena.query.QueryFactory; stevenh@71: import com.hp.hpl.jena.query.QuerySolution; stevenh@46: import com.hp.hpl.jena.query.ReadWrite; stevenh@71: import com.hp.hpl.jena.query.ResultSet; stevenh@37: import com.hp.hpl.jena.rdf.model.AnonId; stevenh@37: import com.hp.hpl.jena.rdf.model.ModelFactory; stevenh@37: import com.hp.hpl.jena.rdf.model.Property; stevenh@37: import com.hp.hpl.jena.rdf.model.Resource; stevenh@37: import com.hp.hpl.jena.rdf.model.Statement; stevenh@37: import com.hp.hpl.jena.rdf.model.StmtIterator; stevenh@71: import com.hp.hpl.jena.sparql.core.Var; stevenh@71: import com.hp.hpl.jena.sparql.syntax.ElementGroup; stevenh@71: import com.hp.hpl.jena.sparql.syntax.ElementTriplesBlock; stevenh@46: import com.hp.hpl.jena.tdb.TDBFactory; stevenh@37: import com.hp.hpl.jena.vocabulary.RDF; stevenh@37: import com.sun.media.sound.MidiUtils; stevenh@37: stevenh@37: public class MidiParser { stevenh@37: stevenh@37: public static final int TIME_DIMENSION = 1; stevenh@37: public static final int PITCH_DIMENSION = 2; stevenh@37: public static final int CHANNEL_DIMENSION = 3; stevenh@37: stevenh@71: private static Property siaDimValProperty; stevenh@71: private static Property siaDimensionProperty; stevenh@71: private static Property siaValueProperty; stevenh@71: private static Property siaMemberOfDatasetProperty; stevenh@71: private static OntClass datapointClass; stevenh@71: private static OntClass datasetClass; stevenh@71: private static OntClass siaVectorClass; stevenh@71: private static Property siaVectorProperty; stevenh@71: stevenh@37: // The ontology loaded as dataset stevenh@37: private static final String ontology = "file:src/rdf/siaDatapointOntology.n3"; stevenh@37: stevenh@37: // The final output file stevenh@37: private static final String finalModelFileName = "src/rdf/midiModel"; stevenh@37: stevenh@46: // The input midi file stevenh@46: private static final String midiFileName = "/Volumes/USB_DISK/portable/ewerts/Cantata_16_no_5-mids/score.mid"; stevenh@46: stevenh@37: public static void main(String[] args) stevenh@37: { stevenh@83: MidiParser midiParser = new MidiParser(); stevenh@83: midiParser.midiToRdf(6, midiFileName); stevenh@83: } stevenh@83: stevenh@83: public void midiToRdf(int maxDatapoints, String midiFileName) stevenh@83: { stevenh@83: int numDatapoints = 0; stevenh@83: stevenh@37: // First create a Jena ontology model stevenh@71: OntModel model = ModelFactory stevenh@37: .createOntologyModel(); // OntModelSpec.OWL_MEM stevenh@37: stevenh@37: // Then read the data from the file into the ontology model stevenh@71: model.read(ontology, "N3"); stevenh@37: stevenh@71: datapointClass = model.getOntClass(Datapoint.RESOURCE_URI); stevenh@71: datasetClass = model.getOntClass(SiaDataset.RESOURCE_URI); stevenh@71: siaVectorClass = model.getOntClass(SiaVector.RESOURCE_URI); stevenh@71: Resource datapointResource = model.getOntResource(datapointClass); stevenh@71: Resource datasetResource = model.getOntResource(datasetClass); stevenh@71: siaDimValProperty = model.createProperty(DimensionValue.PROPERTY_URI); stevenh@71: siaDimensionProperty = model.createProperty(DimensionValue.DIMENSION_URI); stevenh@71: siaValueProperty = model.createProperty(DimensionValue.VALUE_URI); stevenh@71: siaMemberOfDatasetProperty = model.createProperty(MemberOfDataset.PROPERTY_URI); stevenh@71: siaVectorProperty = model.createProperty(SiaVector.PROPERTY_URI); stevenh@71: stevenh@37: File midiFile1 = new File(midiFileName); stevenh@37: stevenh@37: Sequence sequence = null; stevenh@37: try { stevenh@37: sequence = MidiSystem.getSequence(midiFile1); stevenh@37: } catch (InvalidMidiDataException e) { stevenh@37: e.printStackTrace(); stevenh@37: System.exit(1); stevenh@37: } catch (IOException e) { stevenh@37: e.printStackTrace(); stevenh@37: System.exit(1); stevenh@37: } stevenh@37: stevenh@37: MidiUtils.TempoCache tempoCache = new MidiUtils.TempoCache(sequence); stevenh@37: stevenh@37: Track[] tracks = sequence.getTracks(); stevenh@37: int numTracks = tracks.length; stevenh@37: float divisionType = sequence.getDivisionType(); stevenh@37: List datapoints = new ArrayList(); stevenh@37: stevenh@37: HashMap trackDimensionMap = getTrackToDimensionIndexMap(sequence); stevenh@37: stevenh@37: if (trackDimensionMap.isEmpty()) stevenh@37: { stevenh@37: try { stevenh@37: throw new Exception("Couldn't find any track to dimension mappings"); stevenh@37: } catch (Exception e) { stevenh@37: e.printStackTrace(); stevenh@37: System.exit(1); stevenh@37: } stevenh@37: } stevenh@37: stevenh@71: // Add a dataset, represented by a blank node, to the model stevenh@71: Resource datasetBnode = model.createResource(AnonId.create()); stevenh@71: model.add(datasetBnode, RDF.type, datasetResource); stevenh@71: stevenh@37: long maxTick = 0; stevenh@37: stevenh@37: for (int trackIdx = 0; trackIdx < numTracks; trackIdx++) stevenh@37: { stevenh@37: System.out.println("Track " + trackIdx + ":"); stevenh@37: int numEvents = tracks[trackIdx].size(); stevenh@37: for (int eventIdx = 0; eventIdx < numEvents; eventIdx++) stevenh@37: { stevenh@37: MidiEvent event = tracks[trackIdx].get(eventIdx); stevenh@37: long tick = event.getTick(); stevenh@37: MidiMessage midiMessage = event.getMessage(); stevenh@37: stevenh@37: int midiMessageLength = midiMessage.getLength(); stevenh@37: byte[] messageBytes = midiMessage.getMessage(); stevenh@37: int status = midiMessage.getStatus(); stevenh@37: System.out.println("tick = " + tick + " midiMessageLength = " + midiMessageLength + " status byte = " + status); stevenh@37: stevenh@37: int s = status & 0x80; stevenh@37: if (s == 0x80) stevenh@37: { stevenh@37: System.out.println("STATUS MESSAGE (s = " + s + ")"); stevenh@37: } stevenh@37: else stevenh@37: { stevenh@37: System.out.println("not a status message (s = " + s + ")"); stevenh@37: } stevenh@37: stevenh@37: // Determine the type of this message (short, sysex or meta) stevenh@37: if (midiMessage instanceof ShortMessage) stevenh@37: { stevenh@37: System.out.print("ShortMessage "); stevenh@37: stevenh@37: // Determine which command is being issued stevenh@37: ShortMessage shortMessage = (ShortMessage)midiMessage; stevenh@37: int messageCommand = shortMessage.getCommand(); stevenh@37: int channel = shortMessage.getChannel(); stevenh@37: int data1 = shortMessage.getData1(); stevenh@37: int data2 = shortMessage.getData2(); stevenh@37: stevenh@37: if (messageCommand == ShortMessage.ACTIVE_SENSING) stevenh@37: { stevenh@37: System.out.print("ignoring ACTIVE_SENSING"); stevenh@37: } stevenh@37: else if (messageCommand == ShortMessage.CHANNEL_PRESSURE) stevenh@37: { stevenh@37: System.out.print("ignoring CHANNEL_PRESSURE"); stevenh@37: } stevenh@37: else if (messageCommand == ShortMessage.CONTINUE) stevenh@37: { stevenh@37: System.out.print("ignoring CONTINUE"); stevenh@37: } stevenh@37: else if (messageCommand == ShortMessage.CONTROL_CHANGE) stevenh@37: { stevenh@37: System.out.print("ignoring CONTROL_CHANGE"); stevenh@37: } stevenh@37: else if (messageCommand == ShortMessage.END_OF_EXCLUSIVE) stevenh@37: { stevenh@37: System.out.print("ignoring END_OF_EXCLUSIVE"); stevenh@37: } stevenh@37: else if (messageCommand == ShortMessage.MIDI_TIME_CODE) stevenh@37: { stevenh@37: System.out.print("ignoring MIDI_TIME_CODE"); stevenh@37: } stevenh@37: else if (messageCommand == ShortMessage.NOTE_OFF) stevenh@37: { stevenh@37: System.out.println("NOTE_OFF"); stevenh@37: long microsecs = MidiUtils.tick2microsecond(sequence, tick, tempoCache); stevenh@37: System.out.println(" microsecs = " + microsecs); stevenh@37: } stevenh@37: else if (messageCommand == ShortMessage.NOTE_ON) stevenh@37: { stevenh@37: if (tick > maxTick) stevenh@37: { stevenh@37: maxTick = tick; stevenh@37: } stevenh@37: System.out.println("NOTE_ON"); stevenh@46: double microsecs = MidiUtils.tick2microsecond(sequence, tick, tempoCache); stevenh@46: double secs = microsecs/1000000; stevenh@46: System.out.println(" microsecs = " + secs); stevenh@37: stevenh@37: DimensionValue timeDimVal = new DimensionValue(); stevenh@37: timeDimVal.setDimension(TIME_DIMENSION); stevenh@46: timeDimVal.setValue(secs); stevenh@37: stevenh@46: DimensionValue pitchDimVal = new DimensionValue(); stevenh@46: pitchDimVal.setDimension(PITCH_DIMENSION); stevenh@46: pitchDimVal.setValue(data1); stevenh@37: stevenh@46: DimensionValue channelDimVal = new DimensionValue(); stevenh@46: channelDimVal.setDimension(CHANNEL_DIMENSION); stevenh@46: channelDimVal.setValue(trackDimensionMap.get(trackIdx)); stevenh@46: stevenh@37: Datapoint datapoint = new Datapoint(); stevenh@37: Vector dimVals = new Vector(); stevenh@37: dimVals.add(timeDimVal); stevenh@46: dimVals.add(pitchDimVal); stevenh@46: dimVals.add(channelDimVal); stevenh@37: stevenh@37: datapoint.setDimensionValues(dimVals); stevenh@37: stevenh@83: if (numDatapoints < maxDatapoints) stevenh@83: { stevenh@83: datapoints.add(datapoint); stevenh@83: numDatapoints++; stevenh@71: stevenh@83: // RDF stevenh@83: Resource datapointBnode = model.createResource(AnonId.create()); stevenh@83: model.add(datapointBnode, RDF.type, datapointResource); stevenh@83: stevenh@83: // Find or create a DimVal for the TIME dimension stevenh@83: Resource timeDimValBnode = findOrCreateDimValBNode(model, TIME_DIMENSION, secs); stevenh@83: stevenh@83: // Find or create a DimVal for the PITCH dimension stevenh@83: Resource pitchDimValBnode = findOrCreateDimValBNode(model, PITCH_DIMENSION, data1); stevenh@83: stevenh@83: // Find or create a DimVal for the CHANNEL dimension stevenh@83: Resource channelDimValBnode = findOrCreateDimValBNode(model, CHANNEL_DIMENSION, trackDimensionMap.get(trackIdx)); stevenh@83: stevenh@83: // Find or create a Vector for these three DimVals stevenh@83: Resource vectorBnode = findOrCreateVectorBNode(model, timeDimValBnode, secs, stevenh@83: pitchDimValBnode, data1, channelDimValBnode, trackDimensionMap.get(trackIdx)); stevenh@83: stevenh@83: model.add(datapointBnode, siaVectorProperty, vectorBnode); stevenh@83: model.add(datapointBnode, siaMemberOfDatasetProperty, datasetBnode); stevenh@83: } stevenh@46: stevenh@37: } stevenh@37: else if (messageCommand == ShortMessage.PITCH_BEND) stevenh@37: { stevenh@37: System.out.print("ignoring PITCH_BEND"); stevenh@37: } stevenh@37: else if (messageCommand == ShortMessage.POLY_PRESSURE) stevenh@37: { stevenh@37: System.out.print("ignoring POLY_PRESSURE"); stevenh@37: } stevenh@37: else if (messageCommand == ShortMessage.PROGRAM_CHANGE) stevenh@37: { stevenh@37: System.out.print("ignoring PROGRAM_CHANGE"); stevenh@37: } stevenh@37: else if (messageCommand == ShortMessage.SONG_POSITION_POINTER) stevenh@37: { stevenh@37: System.out.print("ignoring SONG_POSITION_POINTER"); stevenh@37: } stevenh@37: else stevenh@37: { stevenh@37: System.out.print("unrecognised midi message command (" + messageCommand + ")"); stevenh@37: } stevenh@37: System.out.print(", channel " + channel + ", data1 = [" + data1 + "], data2 = [" + data2 + "]"); stevenh@37: System.out.println(); stevenh@37: } stevenh@37: else if (midiMessage instanceof MetaMessage) stevenh@37: { stevenh@37: System.out.println("MetaMessage"); stevenh@37: stevenh@37: MetaMessage metaMessage = (MetaMessage)midiMessage; stevenh@37: byte[] metaMessageData = metaMessage.getData(); stevenh@37: int metaMessageLength = metaMessage.getLength(); stevenh@37: int metaMessageType = metaMessage.getType(); stevenh@37: System.out.println("metaMessageType = " + metaMessageType + ", metaMessageLength = " + metaMessageLength); stevenh@37: stevenh@37: // Determine message type stevenh@37: if (metaMessageType == 81) stevenh@37: { stevenh@37: if (divisionType == Sequence.PPQ) stevenh@37: { stevenh@37: // Do nothing - we've dealt with PPQ tempo data elsewhere stevenh@37: } stevenh@37: else stevenh@37: { stevenh@37: try { stevenh@37: throw new Exception("Not yet implemented SMPTE tempo metadata"); stevenh@37: } catch (Exception e) { stevenh@37: e.printStackTrace(); stevenh@37: System.exit(1); stevenh@37: } stevenh@37: } stevenh@37: } stevenh@37: stevenh@37: for (int dataIdx = 0; dataIdx < metaMessageData.length; dataIdx++) stevenh@37: { stevenh@37: System.out.println("\tmetaMessageData[" + dataIdx + "] = " + (metaMessageType == 81 ? metaMessageData[dataIdx] : (char)metaMessageData[dataIdx])); stevenh@37: } stevenh@37: stevenh@37: } stevenh@37: else if (midiMessage instanceof SysexMessage) stevenh@37: { stevenh@37: // We can safely ignore these messages stevenh@37: System.out.println("ignoring SysexMessage"); stevenh@37: } stevenh@37: else stevenh@37: { stevenh@37: System.out.println("Unknown MidiMessage type (" + midiMessage.getClass().toString() + ")"); stevenh@37: } stevenh@37: stevenh@37: for (int byteIdx = 0; byteIdx < midiMessageLength; byteIdx++) stevenh@37: { stevenh@37: byte messageByte = messageBytes[byteIdx]; stevenh@37: System.out.println("\tbyte[" + byteIdx + "] = " + messageByte); stevenh@37: } stevenh@37: } stevenh@37: } stevenh@37: stevenh@37: System.out.println("done"); stevenh@37: stevenh@37: // Print out what we've got now stevenh@37: System.out.println("------------------"); stevenh@71: StmtIterator stmtIterator = model.listStatements(); stevenh@37: printStmts(stmtIterator); stevenh@37: stevenh@46: // TODO write rdf to file stevenh@37: File outFileRdf = new File(finalModelFileName + ".rdf"); stevenh@37: File outFileN3 = new File(finalModelFileName + ".n3"); stevenh@37: FileOutputStream outFileOutputStreamRdf = null; stevenh@37: FileOutputStream outFileOutputStreamN3 = null; stevenh@37: stevenh@37: // RDF/XML version stevenh@37: try { stevenh@37: outFileOutputStreamRdf = new FileOutputStream(outFileRdf); stevenh@71: model.writeAll(outFileOutputStreamRdf, "RDF/XML", null); stevenh@37: } catch (FileNotFoundException e) { stevenh@37: System.out.println("Unable to write to file: " stevenh@37: + outFileRdf.getAbsolutePath()); stevenh@37: e.printStackTrace(); stevenh@37: System.exit(1); stevenh@37: } stevenh@37: stevenh@37: try { stevenh@37: outFileOutputStreamRdf.close(); stevenh@37: } catch (IOException e1) { stevenh@37: e1.printStackTrace(); stevenh@37: System.exit(1); stevenh@37: } stevenh@37: stevenh@37: // N3 version stevenh@37: try { stevenh@37: outFileOutputStreamN3 = new FileOutputStream(outFileN3); stevenh@71: model.writeAll(outFileOutputStreamN3, "N3", null); stevenh@37: } catch (FileNotFoundException e) { stevenh@37: System.out.println("Unable to write to file: " stevenh@37: + outFileN3.getAbsolutePath()); stevenh@37: e.printStackTrace(); stevenh@37: System.exit(1); stevenh@37: } stevenh@37: stevenh@37: try { stevenh@37: outFileOutputStreamN3.close(); stevenh@37: } catch (IOException e1) { stevenh@37: e1.printStackTrace(); stevenh@37: System.exit(1); stevenh@37: } stevenh@37: stevenh@37: System.out.println("Model written to files: " stevenh@37: + outFileRdf.getAbsolutePath() + " and " + outFileN3.getAbsolutePath()); stevenh@37: stevenh@46: // Obtain a dataset context stevenh@46: Dataset dataset = TDBFactory.assembleDataset(SiaMain.assemblerFile); stevenh@46: dataset.begin(ReadWrite.WRITE) ; stevenh@46: try { stevenh@71: dataset.replaceNamedModel(SiaMain.graph, model); stevenh@46: dataset.commit(); stevenh@46: System.out.println("dataset.commit() done"); stevenh@46: } finally { stevenh@46: dataset.end(); stevenh@46: System.out.println("dataset.end() done"); stevenh@46: } stevenh@46: dataset.close(); stevenh@46: System.out.println("dataset.close() done"); stevenh@46: stevenh@46: System.out.println("max tick: " + maxTick); stevenh@46: System.out.println("Number of Datapoints (n) = " + datapoints.size()); stevenh@37: stevenh@37: } stevenh@37: stevenh@71: private static Resource findOrCreateVectorBNode(OntModel model, Resource timeDimValBnode, stevenh@71: double timeVal, Resource pitchDimValBnode, double pitchVal, Resource channelDimValBnode, stevenh@71: double channelVal) { stevenh@71: stevenh@71: Resource bnode; stevenh@71: stevenh@71: String vectorVarStr = "vector"; stevenh@71: String dimVal1VarStr = "dimVal1"; stevenh@71: String dimVal2VarStr = "dimVal2"; stevenh@71: String dimVal3VarStr = "dimVal3"; stevenh@71: stevenh@71: Var vectorVar = Var.alloc(vectorVarStr); stevenh@71: Var dimVal1Var = Var.alloc(dimVal1VarStr); stevenh@71: Var dimVal2Var = Var.alloc(dimVal2VarStr); stevenh@71: Var dimVal3Var = Var.alloc(dimVal3VarStr); stevenh@71: stevenh@71: Node timeDimensionLiteralNode = Node.createUncachedLiteral(TIME_DIMENSION, XSDDatatype.XSDinteger); stevenh@71: Node timeValueLiteralNode = Node.createUncachedLiteral(timeVal, XSDDatatype.XSDdouble); stevenh@71: Node pitchDimensionLiteralNode = Node.createUncachedLiteral(PITCH_DIMENSION, XSDDatatype.XSDinteger); stevenh@71: Node pitchValueLiteralNode = Node.createUncachedLiteral(pitchVal, XSDDatatype.XSDdouble); stevenh@71: Node channelDimensionLiteralNode = Node.createUncachedLiteral(CHANNEL_DIMENSION, XSDDatatype.XSDinteger); stevenh@71: Node channelValueLiteralNode = Node.createUncachedLiteral(channelVal, XSDDatatype.XSDdouble); stevenh@71: stevenh@71: Query query = QueryFactory.make(); stevenh@71: query.setPrefix("sia", Namespaces.SIA_NS_URI); stevenh@71: query.setQuerySelectType(); stevenh@71: query.setDistinct(true); stevenh@71: query.addResultVar(vectorVar); stevenh@71: stevenh@71: ElementTriplesBlock etp = new ElementTriplesBlock(); stevenh@71: stevenh@71: Triple vectorTriple = new Triple(vectorVar, RDF.type.asNode(), siaVectorClass.asNode()); stevenh@71: Triple dimVal1Triple = new Triple(vectorVar, siaDimValProperty.asNode(), dimVal1Var); stevenh@71: stevenh@71: Triple dimVal1DimTriple = new Triple(dimVal1Var, siaDimensionProperty.asNode(), timeDimensionLiteralNode); stevenh@71: Triple dimVal1ValTriple = new Triple(dimVal1Var, siaValueProperty.asNode(), timeValueLiteralNode); stevenh@71: Triple dimVal2Triple = new Triple(vectorVar, siaDimValProperty.asNode(), dimVal2Var); stevenh@71: Triple dimVal2DimTriple = new Triple(dimVal2Var, siaDimensionProperty.asNode(), pitchDimensionLiteralNode); stevenh@71: Triple dimVal2ValTriple = new Triple(dimVal2Var, siaValueProperty.asNode(), pitchValueLiteralNode); stevenh@71: Triple dimVal3Triple = new Triple(vectorVar, siaDimValProperty.asNode(), dimVal3Var); stevenh@71: Triple dimVal3DimTriple = new Triple(dimVal3Var, siaDimensionProperty.asNode(), channelDimensionLiteralNode); stevenh@71: Triple dimVal3ValTriple = new Triple(dimVal3Var, siaValueProperty.asNode(), channelValueLiteralNode); stevenh@71: stevenh@71: etp.addTriple(vectorTriple); stevenh@71: etp.addTriple(dimVal1Triple); stevenh@71: etp.addTriple(dimVal1DimTriple); stevenh@71: etp.addTriple(dimVal1ValTriple); stevenh@71: etp.addTriple(dimVal2Triple); stevenh@71: etp.addTriple(dimVal2DimTriple); stevenh@71: etp.addTriple(dimVal2ValTriple); stevenh@71: etp.addTriple(dimVal3Triple); stevenh@71: etp.addTriple(dimVal3DimTriple); stevenh@71: etp.addTriple(dimVal3ValTriple); stevenh@71: stevenh@71: ElementGroup body = new ElementGroup(); stevenh@71: body.addElement(etp); stevenh@71: query.setQueryPattern(body); stevenh@71: stevenh@71: QueryExecution qe = QueryExecutionFactory.create(query, model); stevenh@71: ResultSet rs = qe.execSelect(); stevenh@71: stevenh@71: if (rs.hasNext()) stevenh@71: { stevenh@71: QuerySolution querySolution = rs.next(); stevenh@71: bnode = querySolution.get(vectorVarStr).asResource(); stevenh@71: } stevenh@71: else stevenh@71: { stevenh@71: bnode = model.createResource(AnonId.create()); stevenh@71: model.add(bnode, RDF.type, siaVectorClass); stevenh@71: model.add(bnode, siaDimValProperty, timeDimValBnode); stevenh@71: model.add(bnode, siaDimValProperty, pitchDimValBnode); stevenh@71: model.add(bnode, siaDimValProperty, channelDimValBnode); stevenh@71: } stevenh@71: return bnode; stevenh@71: } stevenh@71: stevenh@71: private static Resource findOrCreateDimValBNode(OntModel model, int dimension, double value) { stevenh@71: Resource bnode; stevenh@71: stevenh@71: String dimValVarStr = "dimVal"; stevenh@71: Var dimValVar = Var.alloc(dimValVarStr); stevenh@71: Query query = QueryFactory.make(); stevenh@71: query.setPrefix("sia", Namespaces.SIA_NS_URI); stevenh@71: query.setQuerySelectType(); stevenh@71: query.setDistinct(true); stevenh@71: query.addResultVar(dimValVar); stevenh@71: ElementTriplesBlock etp = new ElementTriplesBlock(); stevenh@71: Node dimensionLiteralNode = Node.createUncachedLiteral(dimension, XSDDatatype.XSDinteger); stevenh@71: Node valueLiteralNode = Node.createUncachedLiteral(value, XSDDatatype.XSDdouble); stevenh@71: stevenh@71: Triple dimensionTriple = new Triple(dimValVar, siaDimensionProperty.asNode(), dimensionLiteralNode); stevenh@71: Triple valueTriple = new Triple(dimValVar, siaValueProperty.asNode(), valueLiteralNode); stevenh@71: etp.addTriple(dimensionTriple); stevenh@71: etp.addTriple(valueTriple); stevenh@71: query.setQueryPattern(etp); stevenh@71: stevenh@71: QueryExecution qe = QueryExecutionFactory.create(query, model); stevenh@71: ResultSet rs = qe.execSelect(); stevenh@71: stevenh@71: if (rs.hasNext()) stevenh@71: { stevenh@71: QuerySolution querySolution = rs.next(); stevenh@71: bnode = querySolution.get(dimValVarStr).asResource(); stevenh@71: } stevenh@71: else stevenh@71: { stevenh@71: bnode = model.createResource(AnonId.create()); stevenh@71: model.addLiteral(bnode, siaDimensionProperty, dimension); stevenh@71: model.addLiteral(bnode, siaValueProperty, value); stevenh@71: } stevenh@71: return bnode; stevenh@71: } stevenh@71: stevenh@37: private static HashMap getTrackToDimensionIndexMap(Sequence sequence) { stevenh@37: stevenh@37: int numTracks = sequence.getTracks().length; stevenh@37: int siaDatapointDimension = 2; // Dimension 1 is reserved for time stevenh@37: stevenh@37: HashMap trackDimensionMap = new HashMap(); stevenh@37: Track[] tracks = sequence.getTracks(); stevenh@37: stevenh@37: for (int trackIdx = 0; trackIdx < numTracks; trackIdx++) stevenh@37: { stevenh@37: boolean trackIsAudible = false; stevenh@37: int numEvents = tracks[trackIdx].size(); stevenh@37: stevenh@37: for (int eventIdx = 0; eventIdx < numEvents; eventIdx++) stevenh@37: { stevenh@37: MidiEvent event = tracks[trackIdx].get(eventIdx); stevenh@37: MidiMessage midiMessage = event.getMessage(); stevenh@37: stevenh@37: // Determine the type of this message (short, sysex or meta) stevenh@37: if (midiMessage instanceof ShortMessage) stevenh@37: { stevenh@37: // Determine which command is being issued stevenh@37: ShortMessage shortMessage = (ShortMessage)midiMessage; stevenh@37: int messageCommand = shortMessage.getCommand(); stevenh@37: stevenh@37: if (messageCommand == ShortMessage.NOTE_ON) stevenh@37: { stevenh@37: trackIsAudible = true; stevenh@37: break; stevenh@37: } stevenh@37: } stevenh@37: } stevenh@37: stevenh@37: if (trackIsAudible) stevenh@37: { stevenh@37: trackDimensionMap.put(trackIdx, siaDatapointDimension); stevenh@37: siaDatapointDimension++; stevenh@37: } stevenh@37: } stevenh@37: stevenh@37: return trackDimensionMap; stevenh@37: } stevenh@37: stevenh@37: private static void printStmts(StmtIterator iter) { stevenh@37: Statement statement; stevenh@37: stevenh@37: while (iter.hasNext()) { stevenh@37: statement = iter.nextStatement(); stevenh@37: System.out.println(" | <" + statement.getSubject() + "> | <" stevenh@37: + statement.getPredicate() + "> | <" stevenh@37: + statement.getObject() + "> | "); stevenh@37: } stevenh@37: stevenh@37: // And an empty line to make it pretty stevenh@37: System.out.println(); stevenh@37: } stevenh@37: }