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