JDK-4851018 : MidiMessage.getLength and .getData return wrong values
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.sound
  • Affected Version: 1.4.2
  • Priority: P4
  • Status: Resolved
  • Resolution: Fixed
  • OS: generic,windows_2000
  • CPU: generic,x86
  • Submitted: 2003-04-18
  • Updated: 2003-08-02
  • Resolved: 2003-08-02
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
Other
5.0 tigerFixed
Related Reports
Duplicate :  
Relates :  
Description

Name: rmT116609			Date: 04/18/2003


FULL PRODUCT VERSION :
java version "1.4.2-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-beta-b19)
Java HotSpot(TM) Client VM (build 1.4.2-beta-b19, mixed mode)

FULL OS VERSION :
Microsoft Windows 2000 [Version 5.00.2195]
(german, SP2)

EXTRA RELEVANT SYSTEM CONFIGURATION :
SoundBlaster Live with kxAudio drivers.

A DESCRIPTION OF THE PROBLEM :
For the class javax.sound.midi.MidiMessage, the methods .getLength() and getData()
return wrong values:
The return value for getLength() is always one too small
(e.g. for ActiveSensing 0, for ProgramChange 1, for NoteOn 2)
and the array returned by getData is one byte too short,
for an ActiveSensing it is actually a zero byte length array.

As I noticed by a cross check, JDK1.4.1 is suffering the same bug,
but the other ShortMessage-Bug prevented me from investigating it......

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the attached test program,
attach a keyboard to a MIDI-In port and play a little bit.


EXPECTED VERSUS ACTUAL BEHAVIOR :
Correct length and arrays as return values.

Something like this (faked output from test program):

Got message, length 1, data [ -2 ]
Is a Short Message, Status: 254 Data1: 0 Data2: 0
ACTIVE_SENSING

Got message, length 3, data [ -112 60 63 ]
Is a Short Message, Status: 144 Data1: 60 Data2: 63
NOTE_ON

Got message, length 2, data [ -64 8 ]
Is a Short Message, Status: 192 Data1: 8 Data2: 0
PROGRAM_CHANGE


This is the result of a test run:

Number of Devices :10
Inspecting device:Java Sound Synthesizer
...Adding to list.
Inspecting device:Java Sound Sequencer
...Adding to list.
Inspecting device:Microsoft MIDI-Mapper
Inspecting device:kX Control CT4832 10k1 [e400]
Inspecting device:kX Synth CT4832 10k1 [e400]
Inspecting device:kX Synth2 CT4832 10k1 [e400]
Inspecting device:kX Uart CT4832 10k1 [e400]
Inspecting device:Microsoft GS Wavetable SW Synth
Inspecting device:kX Control CT4832 10k1 [e400]
...Adding to list.
Inspecting device:kX Uart CT4832 10k1 [e400]
...Adding to list.
Got message, length 0, data [ ]
Is a Short Message, Status: 254 Data1: 0 Data2: 0
ACTIVE_SENSING

Got message, length 2, data [ -112 60 ]
Is a Short Message, Status: 144 Data1: 60 Data2: 63
NOTE_ON

Got message, length 2, data [ -112 59 ]
Is a Short Message, Status: 144 Data1: 59 Data2: 56
NOTE_ON

Got message, length 2, data [ -128 60 ]
Is a Short Message, Status: 128 Data1: 60 Data2: 21
NOTE_OFF

Got message, length 2, data [ -112 57 ]
Is a Short Message, Status: 144 Data1: 57 Data2: 66
NOTE_ON

Got message, length 2, data [ -128 59 ]
Is a Short Message, Status: 128 Data1: 59 Data2: 24
NOTE_OFF

Got message, length 2, data [ -112 55 ]
Is a Short Message, Status: 144 Data1: 55 Data2: 73
NOTE_ON

Got message, length 2, data [ -128 57 ]
Is a Short Message, Status: 128 Data1: 57 Data2: 1
NOTE_OFF

Got message, length 2, data [ -112 57 ]
Is a Short Message, Status: 144 Data1: 57 Data2: 70
NOTE_ON

Got message, length 2, data [ -128 55 ]
Is a Short Message, Status: 128 Data1: 55 Data2: 31
NOTE_OFF

Got message, length 2, data [ -80 123 ]
Is a Short Message, Status: 176 Data1: 123 Data2: 0

Got message, length 0, data [ ]
Is a Short Message, Status: 254 Data1: 0 Data2: 0
ACTIVE_SENSING

Got message, length 0, data [ ]
Is a Short Message, Status: 254 Data1: 0 Data2: 0
ACTIVE_SENSING

Got message, length 0, data [ ]
Is a Short Message, Status: 254 Data1: 0 Data2: 0
ACTIVE_SENSING

Got message, length 1, data [ -64 ]
Is a Short Message, Status: 192 Data1: 0 Data2: 0
PROGRAM_CHANGE

Got message, length 0, data [ ]
Is a Short Message, Status: 254 Data1: 0 Data2: 0
ACTIVE_SENSING

Got message, length 0, data [ ]
Is a Short Message, Status: 254 Data1: 0 Data2: 0
ACTIVE_SENSING

Got message, length 1, data [ -64 ]
Is a Short Message, Status: 192 Data1: 8 Data2: 0
PROGRAM_CHANGE

Got message, length 0, data [ ]
Is a Short Message, Status: 254 Data1: 0 Data2: 0
ACTIVE_SENSING


REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------

/*
 * MidiMessageTest.java
 *
 * Created on 9. April 2003, 08:44
 */
import javax.sound.midi.*;
import java.io.*;
/**
 *
 * @author  Gerrit Gehnen
 */
public class MidiMessageTest {
    
    class PrintReceiver implements Receiver {
        
        public void close() {
            // Do nothing
        }
        
        public void send(javax.sound.midi.MidiMessage midiMessage, long param) {
            System.out.print("Got message, length "+midiMessage.getLength()+", data [");
            for (int i=0;i<midiMessage.getMessage().length;i++) {
                System.out.print(" "+midiMessage.getMessage()[i]);
            }
            System.out.println(" ]");
            // Compare to the values of the ShortMessage-class
            if (midiMessage instanceof ShortMessage) {
                
                System.out.println("Is a Short Message, Status: "+((ShortMessage)midiMessage).getStatus()+
                                   " Data1: "+((ShortMessage)midiMessage).getData1()+
                                   " Data2: "+((ShortMessage)midiMessage).getData2());
                switch (((ShortMessage)midiMessage).getStatus())
                {
                    case ShortMessage.ACTIVE_SENSING: System.out.println("ACTIVE_SENSING");
                    break;
                    case ShortMessage.NOTE_ON:System.out.println("NOTE_ON");
                    break;
                    case ShortMessage.NOTE_OFF:System.out.println("NOTE_OFF");
                    break;
                    case ShortMessage.PROGRAM_CHANGE:System.out.println("PROGRAM_CHANGE");
                        
                }
            }
            System.out.println();
        }
        
    }
    
    /** Creates a new instance of MidiMessageTest */
    public MidiMessageTest() {
        MidiDevice devi;
        MidiDevice.Info[] info;
        int i;
        System.out.println("Number of Devices :"+MidiSystem.getMidiDeviceInfo().length);
        info=MidiSystem.getMidiDeviceInfo();
        for (i=0;i<info.length;i++) {
            try{
                System.out.println("Inspecting device:"+info[i].getName());
                devi=MidiSystem.getMidiDevice(info[i]);
                if (devi.getMaxTransmitters()!=0) {
                    try {
                        System.out.println("...Adding to list.");
                        devi.open();
                        devi.getTransmitter().setReceiver(new PrintReceiver());
                    }
                    catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            
        }
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        MidiMessageTest t=new MidiMessageTest();
    }
}


---------- END SOURCE ----------


(Review ID: 183820) 
======================================================================

Comments
CONVERTED DATA BugTraq+ Release Management Values COMMIT TO FIX: tiger FIXED IN: tiger INTEGRATED IN: tiger tiger-b14
14-06-2004

SUGGESTED FIX FastShortMessage.getLength() needs to return 1 higher value.
11-06-2004

PUBLIC COMMENTS MidiMessage.getLength and .getData return wrong values
10-06-2004

WORK AROUND ###@###.### 2003-04-21 Use ShortMessage's methods to access the data. The test program demonstrates how that works.
21-04-2003

EVALUATION ###@###.### 2003-04-21 Commit to tiger. ###@###.### 2003-07-21 See also 4890405: Reading MidiMessage byte array fails in 1.4.2.
21-04-2003