Search in sources :

Example 1 with MidiFileFormat

use of javax.sound.midi.MidiFileFormat in project jdk8u_jdk by JetBrains.

the class SMFParser method getMidiFileFormatFromStream.

// $$fb 2002-04-17: part of fix for 4635286: MidiSystem.getMidiFileFormat()
// returns format having invalid length
private MidiFileFormat getMidiFileFormatFromStream(InputStream stream, int fileLength, SMFParser smfParser) throws InvalidMidiDataException, IOException {
    int maxReadLength = 16;
    int duration = MidiFileFormat.UNKNOWN_LENGTH;
    DataInputStream dis;
    if (stream instanceof DataInputStream) {
        dis = (DataInputStream) stream;
    } else {
        dis = new DataInputStream(stream);
    }
    if (smfParser == null) {
        dis.mark(maxReadLength);
    } else {
        smfParser.stream = dis;
    }
    int type;
    int numtracks;
    float divisionType;
    int resolution;
    try {
        int magic = dis.readInt();
        if (!(magic == MThd_MAGIC)) {
            // not MIDI
            throw new InvalidMidiDataException("not a valid MIDI file");
        }
        // read header length
        int bytesRemaining = dis.readInt() - 6;
        type = dis.readShort();
        numtracks = dis.readShort();
        int timing = dis.readShort();
        // decipher the timing code
        if (timing > 0) {
            // tempo based timing.  value is ticks per beat.
            divisionType = Sequence.PPQ;
            resolution = timing;
        } else {
            // SMPTE based timing.  first decipher the frame code.
            int frameCode = -1 * (timing >> 8);
            switch(frameCode) {
                case 24:
                    divisionType = Sequence.SMPTE_24;
                    break;
                case 25:
                    divisionType = Sequence.SMPTE_25;
                    break;
                case 29:
                    divisionType = Sequence.SMPTE_30DROP;
                    break;
                case 30:
                    divisionType = Sequence.SMPTE_30;
                    break;
                default:
                    throw new InvalidMidiDataException("Unknown frame code: " + frameCode);
            }
            // now determine the timing resolution in ticks per frame.
            resolution = timing & 0xFF;
        }
        if (smfParser != null) {
            // remainder of this chunk
            dis.skip(bytesRemaining);
            smfParser.tracks = numtracks;
        }
    } finally {
        // if only reading the file format, reset the stream
        if (smfParser == null) {
            dis.reset();
        }
    }
    MidiFileFormat format = new MidiFileFormat(type, divisionType, resolution, fileLength, duration);
    return format;
}
Also used : MidiFileFormat(javax.sound.midi.MidiFileFormat) InvalidMidiDataException(javax.sound.midi.InvalidMidiDataException) DataInputStream(java.io.DataInputStream)

Example 2 with MidiFileFormat

use of javax.sound.midi.MidiFileFormat in project jdk8u_jdk by JetBrains.

the class SMFParser method getSequence.

public Sequence getSequence(InputStream stream) throws InvalidMidiDataException, IOException {
    SMFParser smfParser = new SMFParser();
    MidiFileFormat format = getMidiFileFormatFromStream(stream, MidiFileFormat.UNKNOWN_LENGTH, smfParser);
    // must be MIDI Type 0 or Type 1
    if ((format.getType() != 0) && (format.getType() != 1)) {
        throw new InvalidMidiDataException("Invalid or unsupported file type: " + format.getType());
    }
    // construct the sequence object
    Sequence sequence = new Sequence(format.getDivisionType(), format.getResolution());
    // for each track, go to the beginning and read the track events
    for (int i = 0; i < smfParser.tracks; i++) {
        if (smfParser.nextTrack()) {
            smfParser.readTrack(sequence.createTrack());
        } else {
            break;
        }
    }
    return sequence;
}
Also used : MidiFileFormat(javax.sound.midi.MidiFileFormat) InvalidMidiDataException(javax.sound.midi.InvalidMidiDataException) Sequence(javax.sound.midi.Sequence)

Example 3 with MidiFileFormat

use of javax.sound.midi.MidiFileFormat in project jdk8u_jdk by JetBrains.

the class SMFParser method getMidiFileFormat.

public MidiFileFormat getMidiFileFormat(URL url) throws InvalidMidiDataException, IOException {
    // throws IOException
    InputStream urlStream = url.openStream();
    BufferedInputStream bis = new BufferedInputStream(urlStream, bisBufferSize);
    MidiFileFormat fileFormat = null;
    try {
        // throws InvalidMidiDataException
        fileFormat = getMidiFileFormat(bis);
    } finally {
        bis.close();
    }
    return fileFormat;
}
Also used : MidiFileFormat(javax.sound.midi.MidiFileFormat) BufferedInputStream(java.io.BufferedInputStream) DataInputStream(java.io.DataInputStream) BufferedInputStream(java.io.BufferedInputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream)

Example 4 with MidiFileFormat

use of javax.sound.midi.MidiFileFormat in project jdk8u_jdk by JetBrains.

the class SMFParser method getMidiFileFormat.

public MidiFileFormat getMidiFileFormat(File file) throws InvalidMidiDataException, IOException {
    // throws IOException
    FileInputStream fis = new FileInputStream(file);
    BufferedInputStream bis = new BufferedInputStream(fis, bisBufferSize);
    // $$fb 2002-04-17: part of fix for 4635286: MidiSystem.getMidiFileFormat() returns format having invalid length
    long length = file.length();
    if (length > Integer.MAX_VALUE) {
        length = MidiFileFormat.UNKNOWN_LENGTH;
    }
    MidiFileFormat fileFormat = null;
    try {
        fileFormat = getMidiFileFormatFromStream(bis, (int) length, null);
    } finally {
        bis.close();
    }
    return fileFormat;
}
Also used : MidiFileFormat(javax.sound.midi.MidiFileFormat) BufferedInputStream(java.io.BufferedInputStream) FileInputStream(java.io.FileInputStream)

Aggregations

MidiFileFormat (javax.sound.midi.MidiFileFormat)4 BufferedInputStream (java.io.BufferedInputStream)2 DataInputStream (java.io.DataInputStream)2 FileInputStream (java.io.FileInputStream)2 InvalidMidiDataException (javax.sound.midi.InvalidMidiDataException)2 InputStream (java.io.InputStream)1 Sequence (javax.sound.midi.Sequence)1