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