public static List<Properties> ReadSampleBlock(Stream source) { BinaryReader sourceReader = new BinaryReader(source); byte[] sourceData = sourceReader.ReadBytes(0x2000); int count = 256; List<Properties> result = new List<Properties>(); // load sample block using (MemoryStream tempMem = new MemoryStream(sourceData)) { BinaryReaderEx dataReader = new BinaryReaderEx(tempMem); for (int i = 0; i < count; i++) { Properties props = new Properties(); props.Channel = dataReader.ReadByte(); props.Flag01 = dataReader.ReadByte(); props.Frequency = dataReader.ReadUInt16S(); props.Volume = dataReader.ReadByte(); props.Panning = dataReader.ReadByte(); props.SampleOffset = dataReader.ReadInt24S() * 2; props.SampleLength = ((dataReader.ReadInt24S() * 2) - props.SampleOffset); props.Value0C = dataReader.ReadInt16S(); props.Flag0E = dataReader.ReadByte(); props.Flag0F = dataReader.ReadByte(); props.SizeInBlocks = dataReader.ReadInt16S(); result.Add(props); } } return result; }
public static Chart Read(Stream source) { BinaryReaderEx reader = new BinaryReaderEx(source); Chart result = new Chart(); result.TickRate = new Fraction(1, 58); int[] lastSample = new int[16]; int eventParameter = 0; int eventValue = 0; int eventType = 0; int eventOffset = 0; bool notecountMode = true; bool defaultBPMSet = false; while (true) { eventOffset = reader.ReadUInt16(); eventType = reader.ReadByte(); eventParameter = (eventType >> 4); eventType &= 0xF; eventValue = reader.ReadByte(); // end of chart? if (eventOffset == 0x7FFF) break; // ignore events in note count mode if (notecountMode) { if (eventType != 0 || eventOffset > 0) notecountMode = false; } // process events if (!notecountMode) { Entry entry = new Entry(); entry.LinearOffset = new Fraction(eventOffset, 1); switch (eventType) { case 0x0: // marker switch (eventParameter) { case 0x0: entry.Type = EntryType.Marker; entry.Player = 1; entry.Column = 0; entry.Value = new Fraction(lastSample[0x0], 1); break; //key0 case 0x1: entry.Type = EntryType.Marker; entry.Player = 2; entry.Column = 0; entry.Value = new Fraction(lastSample[0x1], 1); break; case 0x2: entry.Type = EntryType.Marker; entry.Player = 1; entry.Column = 1; entry.Value = new Fraction(lastSample[0x2], 1); break; //key1 case 0x3: entry.Type = EntryType.Marker; entry.Player = 2; entry.Column = 1; entry.Value = new Fraction(lastSample[0x3], 1); break; case 0x4: entry.Type = EntryType.Marker; entry.Player = 1; entry.Column = 2; entry.Value = new Fraction(lastSample[0x4], 1); break; //key2 case 0x5: entry.Type = EntryType.Marker; entry.Player = 2; entry.Column = 2; entry.Value = new Fraction(lastSample[0x5], 1); break; case 0x6: entry.Type = EntryType.Marker; entry.Player = 1; entry.Column = 3; entry.Value = new Fraction(lastSample[0x6], 1); break; //key3 case 0x7: entry.Type = EntryType.Marker; entry.Player = 2; entry.Column = 3; entry.Value = new Fraction(lastSample[0x7], 1); break; case 0x8: entry.Type = EntryType.Marker; entry.Player = 1; entry.Column = 4; entry.Value = new Fraction(lastSample[0x8], 1); break; //key4 case 0x9: entry.Type = EntryType.Marker; entry.Player = 2; entry.Column = 4; entry.Value = new Fraction(lastSample[0x9], 1); break; case 0xA: entry.Type = EntryType.Marker; entry.Player = 1; entry.Column = 7; entry.Value = new Fraction(lastSample[0xA], 1); break; //scratch case 0xB: entry.Type = EntryType.Marker; entry.Player = 2; entry.Column = 7; entry.Value = new Fraction(lastSample[0xB], 1); break; case 0xC: entry.Type = EntryType.Measure; entry.Player = 1; break; case 0xD: entry.Type = EntryType.Measure; entry.Player = 2; break; case 0xE: entry.Type = EntryType.Marker; entry.Player = 1; entry.Column = 8; entry.Value = new Fraction(lastSample[0xA], 1); break; //freescratch case 0xF: entry.Type = EntryType.Marker; entry.Player = 2; entry.Column = 8; entry.Value = new Fraction(lastSample[0xB], 1); break; } break; case 0x1: // sample switch (eventParameter) { case 0x0: entry.Type = EntryType.Sample; entry.Player = 1; entry.Column = 0; lastSample[0x0] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0x1: entry.Type = EntryType.Sample; entry.Player = 2; entry.Column = 0; lastSample[0x1] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0x2: entry.Type = EntryType.Sample; entry.Player = 1; entry.Column = 1; lastSample[0x2] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0x3: entry.Type = EntryType.Sample; entry.Player = 2; entry.Column = 1; lastSample[0x3] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0x4: entry.Type = EntryType.Sample; entry.Player = 1; entry.Column = 2; lastSample[0x4] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0x5: entry.Type = EntryType.Sample; entry.Player = 2; entry.Column = 2; lastSample[0x5] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0x6: entry.Type = EntryType.Sample; entry.Player = 1; entry.Column = 3; lastSample[0x6] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0x7: entry.Type = EntryType.Sample; entry.Player = 2; entry.Column = 3; lastSample[0x7] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0x8: entry.Type = EntryType.Sample; entry.Player = 1; entry.Column = 4; lastSample[0x8] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0x9: entry.Type = EntryType.Sample; entry.Player = 2; entry.Column = 4; lastSample[0x9] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0xA: entry.Type = EntryType.Sample; entry.Player = 1; entry.Column = 7; lastSample[0xA] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0xB: entry.Type = EntryType.Sample; entry.Player = 2; entry.Column = 7; lastSample[0xB] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0xE: entry.Type = EntryType.Sample; entry.Player = 1; entry.Column = 8; lastSample[0xA] = eventValue; entry.Value = new Fraction(eventValue, 1); break; case 0xF: entry.Type = EntryType.Sample; entry.Player = 2; entry.Column = 8; lastSample[0xB] = eventValue; entry.Value = new Fraction(eventValue, 1); break; } break; case 0x2: // tempo entry.Type = EntryType.Tempo; entry.Value = new Fraction((eventParameter * 256) + eventValue, 1); if (!defaultBPMSet) { defaultBPMSet = true; result.DefaultBPM = entry.Value; } break; case 0x4: // end of song entry.Type = EntryType.EndOfSong; break; case 0x5: // bgm entry.Type = EntryType.Marker; entry.Player = 0; entry.Value = new Fraction(eventValue, 1); break; case 0x6: // judgement entry.Type = EntryType.Judgement; entry.Value = new Fraction(eventValue, 1); entry.Parameter = eventParameter; break; } if (entry.Type != EntryType.Invalid) result.Entries.Add(entry); } } if (result.Entries.Count > 0) { result.Entries.Sort(); result.CalculateMetricOffsets(); } else { result = null; } return result; }
public static void Decompress(Stream source, Stream target, int length, int decompLength, BemaniLZSS2Properties props) { byte[] ring = new byte[props.ringBufferSize]; int ring_pos = props.ringBufferOffset; int chunk_offset; int chunk_length; int control_word = 1; int controlBitsLeft = 0; int controlBitMask = 0x1; byte cmd1; byte cmd2; byte data; if (decompLength <= 0) decompLength = int.MaxValue; BinaryReaderEx sourceReader = new BinaryReaderEx(source); BinaryWriterEx writer = new BinaryWriterEx(target); using (MemoryStream mem = new MemoryStream(sourceReader.ReadBytes(length))) { BinaryReaderEx reader = new BinaryReaderEx(mem); while (decompLength > 0 && length > 0) { if (controlBitsLeft == 0) { /* Read a control byte */ control_word = reader.ReadByte(); length--; controlBitsLeft = 8; } /* Decode a byte according to the current control byte bit */ if ((control_word & controlBitMask) != 0) { /* Straight copy, store into history ring */ data = reader.ReadByte(); length--; writer.Write(data); ring[ring_pos] = data; ring_pos = (ring_pos + 1) % props.ringBufferSize; decompLength--; } else { /* Reference to data in ring buffer */ switch (props.type) { case BemaniLZSS2Type.Firebeat: cmd1 = reader.ReadByte(); cmd2 = reader.ReadByte(); length -= 2; chunk_length = (cmd1 & 0x0F) + 3; chunk_offset = (((int)cmd1 & 0xF0) << 4) + (int)cmd2; chunk_offset = ring_pos - chunk_offset; while (chunk_offset < 0) chunk_offset += props.ringBufferSize; break; case BemaniLZSS2Type.GCZ: cmd1 = reader.ReadByte(); cmd2 = reader.ReadByte(); length -= 2; chunk_length = (cmd2 & 0x0F) + 3; chunk_offset = (((int)cmd2 & 0xF0) << 4) | cmd1; break; default: return; } for ( ; chunk_length > 0 && length > 0 ; chunk_length--) { /* Copy historical data to output AND current ring pos */ writer.Write(ring[chunk_offset]); ring[ring_pos] = ring[chunk_offset]; /* Update counters */ chunk_offset = (chunk_offset + 1) % props.ringBufferSize; ring_pos = (ring_pos + 1) % props.ringBufferSize; decompLength--; } } /* Get next control bit */ control_word >>= 1; controlBitsLeft--; } } }
/* public static bool operator ==(Properties a, Properties b) { return (a.Channel == b.Channel && a.Flags == b.Flags && a.Frequency == b.Frequency && a.Offset == b.Offset && a.Panning == b.Panning && a.ReverbVolume == b.ReverbVolume && a.SampleType == b.SampleType && a.Volume == b.Volume ); } public static bool operator !=(Properties a, Properties b) { return (a.Channel != b.Channel || a.Flags != b.Flags || a.Frequency != b.Frequency || a.Offset != b.Offset || a.Panning != b.Panning || a.ReverbVolume != b.ReverbVolume || a.SampleType != b.SampleType || a.Volume != b.Volume ); } */ public static Properties Read(Stream source) { BinaryReaderEx reader = new BinaryReaderEx(source); Properties result = new Properties(); result.Channel = reader.ReadByte(); result.Frequency = reader.ReadUInt16(); result.ReverbVolume = reader.ReadByte(); result.Volume = reader.ReadByte(); result.Panning = reader.ReadByte(); result.Offset = reader.ReadUInt24(); result.SampleType = reader.ReadByte(); result.Flags = reader.ReadByte(); return result; }
public static BemaniIFS Read(Stream source) { BemaniIFS result = new BemaniIFS(); // read header Header header = Header.Read(source); byte[] propertyPageData = new byte[header.BodyStart - Header.Size]; source.Read(propertyPageData, 0, propertyPageData.Length); // read property page #if (false) List<byte[]> dataList = new List<byte[]>(); BinaryReaderEx reader = new BinaryReaderEx(source); BemaniIFS result = new BemaniIFS(); // header length is 0x28 bytes reader.ReadInt32S(); // identifier Int16 headerMetaLength = reader.ReadInt16S(); // header meta amount? reader.ReadInt16S(); // bitwise xor 0xFFFF of previously read value reader.ReadInt32S(); reader.ReadInt32S(); Int32 headerLength = reader.ReadInt32S(); reader.ReadInt32S(); for (int i = 1; i < headerMetaLength; i++) { reader.ReadInt32S(); reader.ReadInt32S(); } Console.WriteLine("Header length: " + headerLength.ToString()); // read table A Int32 tableALength = reader.ReadInt32S(); Console.WriteLine("Table A length: " + tableALength.ToString()); MemoryStream tableAMem = new MemoryStream(reader.ReadBytes(tableALength)); // read table B Int32 tableBLength = reader.ReadInt32S(); Console.WriteLine("Table B length: " + tableBLength.ToString()); MemoryStream tableBMem = new MemoryStream(reader.ReadBytes(tableBLength)); // read padding int headerPadding = headerLength - (0x10 + (headerMetaLength * 8) + 4 + tableALength + 4 + tableBLength); if (headerPadding > 0) reader.ReadBytes(headerPadding); // a bit of a hack to get the info we need (it's probably not accurate) BinaryReaderEx tableAReader = new BinaryReaderEx(tableAMem); BinaryReaderEx tableBReader = new BinaryReaderEx(tableBMem); tableAReader.BaseStream.Position = 0x18; tableBReader.BaseStream.Position = 0x14; int dataLength = tableBReader.ReadInt32S(); MemoryStream dataChunk = new MemoryStream(reader.ReadBytes(dataLength)); BinaryReaderEx dataReader = new BinaryReaderEx(dataChunk); // process tables int chunkIndex = 0; bool processTable = true; while (processTable) { Console.Write("A:" + Util.ConvertToHexString((int)tableAReader.BaseStream.Position, 8) + " B:" + Util.ConvertToHexString((int)tableBReader.BaseStream.Position, 8) + " "); byte chunkType = tableAReader.ReadByte(); Console.Write("Op:" + Util.ConvertToHexString(chunkType, 2) + " "); switch (chunkType) { case 0x06: // directory { byte subType = tableAReader.ReadByte(); switch (subType) { case 0x03: tableAReader.ReadBytes(3); break; case 0x06: break; default: break; } Int32 fileModified = tableBReader.ReadInt32S(); // modified date? Console.WriteLine("*" + Util.ConvertToHexString(fileModified, 8)); } continue; case 0x1E: // file tableAReader.ReadByte(); { Int32 fileOffset = tableBReader.ReadInt32S(); // offset Int32 fileLength = tableBReader.ReadInt32S(); // length Int32 fileModified = tableBReader.ReadInt32S(); // modified date? Console.WriteLine(Util.ConvertToHexString(fileOffset, 8) + ":" + Util.ConvertToHexString(fileLength, 8) + ", *" + Util.ConvertToHexString(fileModified, 8)); dataReader.BaseStream.Position = fileOffset; dataList.Add(dataReader.ReadBytes(fileLength)); } break; case 0x94: // filename Console.WriteLine("FileID: " + Util.ConvertToHexString(tableAReader.ReadInt32S(), 8)); continue; case 0xFE: // end of entry Console.WriteLine("End of entry."); break; case 0xFF: // end of list processTable = false; Console.WriteLine("End of list."); continue; default: // for types we don't know, skip the whole line for now Console.WriteLine("UNKNOWN."); break; } while (chunkType != 0xFE) { chunkType = tableAReader.ReadByte(); } chunkIndex++; } result.files = dataList; #endif return result; }
private void ReadRows(BinaryReaderEx r, DataTable table) { object[] values = new object[columns.Count]; for (uint i = 0; i < this.RecordCount; i++) { uint RowLength = r.ReadUInt16(); for (int j = 0; j < columns.Count; j++) { switch (this.columns[j].Type) { case 1: values[j] = r.ReadByte(); break; case 2: values[j] = r.ReadUInt16(); break; case 3: values[j] = r.ReadUInt32(); break; case 5: values[j] = r.ReadSingle(); break; case 9: values[j] = r.ReadString(this.ColumnLengths[j]); break; case 11: values[j] = r.ReadUInt32(); break; case 12: values[j] = r.ReadByte(); break; case 13: values[j] = r.ReadInt16(); break; case 0x10: values[j] = r.ReadByte(); break; case 0x12: values[j] = r.ReadUInt32(); break; case 20: values[j] = r.ReadSByte(); break; case 0x15: values[j] = r.ReadInt16(); break; case 0x16: values[j] = r.ReadInt32(); break; case 0x18: values[j] = r.ReadString(this.ColumnLengths[j]); break; case 0x1a: //unk lenght values[j] = r.ReadString(); break; case 0x1b: values[j] = r.ReadUInt32(); break; } } table.Rows.Add(values); } }