    001
    002    package ibxm;
    003
    004    public class Pattern {
    005        public int num_rows;
    006
    007        private int data_offset, note_index;
    008        private byte[] pattern_data;
    009
    010        public Pattern() {
    011            num_rows = 1;
    012            set_pattern_data( new byte[ 0 ] );
    013        }
    014
    015        public void set_pattern_data( byte[] data ) {
    016            if( data != null ) {
    017                pattern_data = data;
    018            }
    019            data_offset = 0;
    020            note_index = 0;
    021        }
    022
    023        public void get_note( int[] note, int index ) {
    024            if( index < note_index ) {
    025                note_index = 0;
    026                data_offset = 0;
    027            }
    028            while( note_index <= index ) {
    029                data_offset = next_note( data_offset, note );
    030                note_index += 1;
    031            }
    032        }
    033
    034        public int next_note( int data_offset, int[] note ) {
    035            int bitmask, field;
    036            if( data_offset < 0 ) {
    037                data_offset = pattern_data.length;
    038            }
    039            bitmask = 0x80;
    040            if( data_offset < pattern_data.length ) {
    041                bitmask = pattern_data[ data_offset ] & 0xFF;
    042            }
    043            if( ( bitmask & 0x80 ) == 0x80 ) {
    044                data_offset += 1;
    045            } else {
    046                bitmask = 0x1F;
    047            }
    048            for( field = 0; field < 5; field++ ) {
    049                note[ field ] = 0;
    050                if( ( bitmask & 0x01 ) == 0x01 ) {
    051                    if( data_offset < pattern_data.length ) {
    052                        note[ field ] = pattern_data[ data_offset ] & 0xFF;
    053                        data_offset += 1;
    054                    }
    055                }
    056                bitmask = bitmask >> 1;
    057            }
    058            return data_offset;
    059        }
    060    }
    061