/** Print all MIDI tracks and MIDI events */ public void print() { Enumeration<Track> en = trackList.elements(); while (en.hasMoreElements()) { Track track = en.nextElement(); track.print(); } }
/** Convert a SMF into the jMusic data type */ @SuppressWarnings("rawtypes") public static void SMFToScore(Score score, SMFTools smf) { Enumeration<Track> en = smf.getTrackList().elements(); // Go through tracks while (en.hasMoreElements()) { Part part = new Part(); Track smfTrack = en.nextElement(); Vector evtList = smfTrack.getEvtList(); Vector phrVct = new Vector(); sortEvents(evtList, phrVct, smf, part); for (int i = 0; i < phrVct.size(); i++) { part.addPhrase((Phrase) phrVct.elementAt(i)); } score.addPart(part); score.clean(); } }
/** * Write the Track Chunk * * @param DataOutputStream dos * @param Track track - track to write * @exception IOException */ @SuppressWarnings("rawtypes") private void writeTrackChunk(DataOutputStream odos, Track track) throws IOException { // Write to temporary stream to buffer disk writes and // calculate the number of bytes written to the stream ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); int header = 0x4D54726B; Enumeration en = track.getEvtList().elements(); en = track.getEvtList().elements(); // At this stage Except that all events are NoteOn events while (en.hasMoreElements()) { Event evt = (Event) en.nextElement(); evt.write(dos); if (DEBUG) evt.print(); } // Write to the real stream odos.writeInt(header); odos.writeInt(baos.size()); odos.write(baos.toByteArray(), 0, baos.size()); }
/** * Reads a MIDI track chunk * * @param DataInputStream dis - the input stream to read from * @exception IOException */ private void readTrackChunk(DataInputStream dis) throws IOException { // local variables for Track class Track track = new Track(); // Insert new Track into a list of tracks this.trackList.addElement(track); int deltaTime = 0; // Read track header if (dis.readInt() != 0x4D54726B) { // If MTrk read is wrong throw new IOException("Track started in wrong place!!!! ABORTING"); } else { // If MTrk read ok get bytesRemaining dis.readInt(); } // loop variables int status, oldStatus = 0, eventLength = 0; // Start gathering event data Event event = null; while (true) { try { // get variable length timestamp deltaTime = MidiUtil.readVarLength(dis); // mark stream so we can return if we need running status dis.mark(2); status = dis.readUnsignedByte(); // decide on running status if (status < 0x80) { // set running status status = oldStatus; // return stream to before status read dis.reset(); } // create default event of correct type if (status >= 0xFF) { // Meta Event int type = dis.readUnsignedByte(); eventLength = MidiUtil.readVarLength(dis); event = jm.midi.MidiUtil.createMetaEvent(type); } else if (status >= 0xF0) { // System Exclusive --- NOT // SUPPORTED eventLength = MidiUtil.readVarLength(dis); } else if (status >= 0x80) { // MIDI voice event short selection = (short) (status / 0x10); short midiChannel = (short) (status - (selection * 0x10)); VoiceEvt evt = (VoiceEvt) MidiUtil.createVoiceEvent(selection); if (evt == null) { throw new IOException("MIDI file read error: invalid voice event type!"); } evt.setMidiChannel(midiChannel); event = evt; } oldStatus = status; } catch (EOFException ex) { logger.warn("EOFException (" + ex.getMessage() + ") encountered in SMFTools"); } catch (Exception e) { throw new IllegalStateException(e); } if (event != null) { // read data into the new event and // add the new event to the Track object event.setTime(deltaTime); event.read(dis); track.addEvent(event); // event.print(); if (event instanceof EndTrack) break; } else { // skip the stream ahead to next valid event dis.skipBytes(eventLength); } } }