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