Beispiel #1
0
        public uint[] GetSamples(uint instrument)
        {
            reader.BaseStream.Position = ListOffset + 4 + 4 * instrument;
            reader.BaseStream.Position = Endianness.Swap(reader.ReadUInt32());
            switch (Endianness.Swap(reader.ReadUInt32()))
            {
            case 1231975284u:
            {
                reader.BaseStream.Position += 12L;
                uint num5 = Endianness.Swap(reader.ReadUInt32());
                if (num5 == 0)
                {
                    num5 = Endianness.Swap(reader.ReadUInt32());
                }
                uint        num6  = (uint)reader.BaseStream.Position;
                List <uint> list2 = new List <uint>();
                for (int i = 0; i < num5; i++)
                {
                    reader.BaseStream.Position  = num6 + 24 * i;
                    reader.BaseStream.Position += 12L;
                    list2.Add(Endianness.Swap(reader.ReadUInt32()));
                }
                return(list2.ToArray());
            }

            case 1348825699u:
            {
                uint        num  = Endianness.Swap(reader.ReadUInt32());
                uint        num2 = (uint)reader.BaseStream.Position;
                List <uint> list = new List <uint>();
                for (uint num3 = 0u; num3 < num; num3++)
                {
                    reader.BaseStream.Position = num2 + num3 * 4;
                    uint num4 = Endianness.Swap(reader.ReadUInt32());
                    if (num4 != 0)
                    {
                        reader.BaseStream.Position = num4;
                        if (Endianness.Swap(reader.ReadUInt32()) != 1349345648)
                        {
                            throw new Exception("\"Pmap\" expected.");
                        }
                        reader.BaseStream.Position += 24L;
                        list.Add(Endianness.Swap(reader.ReadUInt32()));
                    }
                }
                return(list.ToArray());
            }

            default:
                throw new FileFormatException("Neither an instrument nor percussion data was found. The file might be corrupted, truncated or in an unexpected format.");
            }
        }
Beispiel #2
0
 public Sample this[short sample]
 {
     get
     {
         if (!Samples.ContainsKey(sample))
         {
             throw new SampleNotFoundException($"Sample {sample:x4} not found.");
         }
         reader.BaseStream.Position = WinfChunkOffset + 8 + 4 * Samples[sample].Wsys;
         reader.BaseStream.Position = Endianness.Swap(reader.ReadUInt32()) + 116 + 4 * Samples[sample].Index;
         reader.BaseStream.Position = Endianness.Swap(reader.ReadUInt32()) + 2;
         byte rootKey = reader.ReadByte();
         reader.BaseStream.Position += 2L;
         Endianness.Swap(reader.ReadInt16());
         reader.BaseStream.Position++;
         Endianness.Swap(reader.ReadInt32());
         Endianness.Swap(reader.ReadInt32());
         bool     flag      = (reader.ReadUInt32() == uint.MaxValue) ? true : false;
         int      loopStart = Endianness.Swap(reader.ReadInt32());
         int      num       = Endianness.Swap(reader.ReadInt32());
         string   path      = string.Format(Z2Sound.SoundPath + "\\Waves\\{0}_{1:x8}.wav", SoundFiles[Samples[sample].Wsys], Samples[sample].Index);
         WaveFile waveFile  = new WaveFile(File.OpenRead(path));
         byte[]   array;
         if (flag)
         {
             int num2 = num * ((int)waveFile.Format.BitsPerSample / 8) * waveFile.Format.Channels;
             array = new byte[num2];
             Array.Copy(waveFile.GetAudioData(), array, num2);
         }
         else
         {
             array = waveFile.GetAudioData();
         }
         Sample result = default(Sample);
         result.BitsPerSample    = 16;
         result.Channels         = 1;
         result.IsLooping        = flag;
         result.LoopStart        = loopStart;
         result.RootKey          = rootKey;
         result.SamplesPerSecond = (int)waveFile.Format.SamplesPerSecond;
         result.Data             = array;
         return(result);
     }
 }
Beispiel #3
0
        private uint GetChunkPosition(uint chunkID)
        {
            uint num2;

            for (uint num = 32u; num < reader.BaseStream.Length - 4; num += num2 + 8)
            {
                reader.BaseStream.Position = num;
                if (Endianness.Swap(reader.ReadInt32()) == chunkID)
                {
                    return(num + 8);
                }
                num2 = Endianness.Swap(reader.ReadUInt32());
                if (num2 % 4u != 0)
                {
                    num2 += num2 % 4u;
                }
            }
            return(0u);
        }
Beispiel #4
0
 public InstrumentBank(Stream stream, int wsys)
 {
     try
     {
         Wsys   = wsys;
         reader = new BinaryReader(stream);
         if (Endianness.Swap(reader.ReadUInt32()) != 1229082187)
         {
             throw new FileFormatException("Unrecognized file type. The file might be corrupted, truncated or in an unexpected format.");
         }
         uint chunkPosition = GetChunkPosition(1279873876u);
         if (chunkPosition == 0)
         {
             throw new FileFormatException("The instrument list could not be found. The file might be corrupted, truncated or in an unexpected format.");
         }
         ListOffset = chunkPosition;
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
Beispiel #5
0
        public Instrument this[int instrument]
        {
            get
            {
                reader.BaseStream.Position = ListOffset;
                if (instrument >= Endianness.Swap(reader.ReadInt32()))
                {
                    throw new ArgumentOutOfRangeException("instrument", "The instrument number must be less than the total amount of instruments.");
                }
                reader.BaseStream.Position += 4 * instrument;
                reader.BaseStream.Position  = Endianness.Swap(reader.ReadUInt32());
                switch (Endianness.Swap(reader.ReadUInt32()))
                {
                case 1231975284u:
                {
                    Instrument instrument3 = new Instrument();
                    reader.BaseStream.Position += 12L;
                    int num3 = Endianness.Swap(reader.ReadInt32());
                    if (num3 == 0)
                    {
                        num3 = Endianness.Swap(reader.ReadInt32());
                    }
                    long position2 = reader.BaseStream.Position;
                    for (int j = 0; j < num3; j++)
                    {
                        reader.BaseStream.Position = position2 + 24 * j;
                        SampleEntry item2 = default(SampleEntry);
                        item2.KeyRangeLimit         = reader.ReadByte();
                        reader.BaseStream.Position += 11L;
                        item2.Id = Endianness.Swap(reader.ReadInt32());
                        reader.BaseStream.Position += 4L;
                        item2.FrequenyMultiplier    = Endianness.Swap(reader.ReadSingle());
                        instrument3.Samples.Add(item2);
                    }
                    reader.BaseStream.Position      = position2 + num3 * 24 + 4;
                    instrument3.FrequencyMultiplier = Endianness.Swap(reader.ReadSingle());
                    return(instrument3);
                }

                case 1348825699u:
                {
                    Instrument instrument2 = new Instrument(isPercussion: true);
                    int        num         = Endianness.Swap(reader.ReadInt32());
                    long       position    = reader.BaseStream.Position;
                    for (int i = 0; i < num; i++)
                    {
                        reader.BaseStream.Position = position + 4 * i;
                        int num2 = Endianness.Swap(reader.ReadInt32());
                        if (num2 != 0)
                        {
                            reader.BaseStream.Position = num2;
                            if (Endianness.Swap(reader.ReadUInt32()) != 1349345648)
                            {
                                throw new Exception("A percussion entry was ecpected.");
                            }
                            reader.BaseStream.Position += 4L;
                            SampleEntry item = default(SampleEntry);
                            item.FrequenyMultiplier = Endianness.Swap(reader.ReadSingle());
                            item.Pan = reader.ReadByte();
                            reader.BaseStream.Position += 15L;
                            item.Id            = Endianness.Swap(reader.ReadInt32());
                            item.KeyRangeLimit = (byte)i;
                            instrument2.Samples.Add(item);
                        }
                    }
                    return(instrument2);
                }

                default:
                    throw new FileFormatException("Neither an instrument nor percussion data was found. The file might be corrupted, truncated or in an unexpected format.");
                }
            }
        }
Beispiel #6
0
        public Z2Sound(Stream stream)
        {
            try
            {
                reader = new BinaryReader(stream);
                if (Endianness.Swap(reader.ReadUInt32()) != 1094803260)
                {
                    throw new FileFormatException();
                }
                SampleBanks     = new Dictionary <int, SampleBank>();
                InstrumentBanks = new Dictionary <int, InstrumentBank>();
                bool flag = false;
                while (!flag)
                {
                    switch (Endianness.Swap(reader.ReadUInt32()))
                    {
                    case 1651729184u:
                    case 1651733536u:
                    case 1651733614u:
                        reader.BaseStream.Position += 8L;
                        break;

                    case 2004033568u:
                    {
                        long position2 = reader.BaseStream.Position + 12;
                        int  key2      = Endianness.Swap(reader.ReadInt32());
                        long num2      = Endianness.Swap(reader.ReadInt32());
                        reader.BaseStream.Position = num2 + 4;
                        long size2 = Endianness.Swap(reader.ReadInt32());
                        reader.BaseStream.Position = position2;
                        VirtualStream stream2 = new VirtualStream(reader.BaseStream, num2, size2);
                        SampleBanks.Add(key2, new SampleBank(stream2));
                        break;
                    }

                    case 1651403552u:
                    {
                        long position = reader.BaseStream.Position + 8;
                        int  wsys     = Endianness.Swap(reader.ReadInt32());
                        long num      = Endianness.Swap(reader.ReadInt32());
                        reader.BaseStream.Position = num + 4;
                        long size = Endianness.Swap(reader.ReadInt32());
                        int  key  = Endianness.Swap(reader.ReadInt32());
                        reader.BaseStream.Position = position;
                        InstrumentBanks.Add(key, new InstrumentBank(new VirtualStream(reader.BaseStream, num, size), wsys));
                        break;
                    }

                    case 1650877281u:
                        reader.BaseStream.Position += 4L;
                        break;

                    default:
                        flag = true;
                        break;
                    }
                }
            }
            catch (EndOfStreamException)
            {
                throw new FileFormatException();
            }
            catch (Exception ex2)
            {
                throw ex2;
            }
        }
Beispiel #7
0
 public SampleBank(Stream stream)
 {
     try
     {
         reader = new BinaryReader(stream);
         if (Endianness.Swap(reader.ReadUInt32()) != 1465080147)
         {
             throw new FileFormatException("Unrecognized file type. The file might be corrupted truncated or in an unexpected format.");
         }
         reader.BaseStream.Position += 12L;
         WinfChunkOffset             = Endianness.Swap(reader.ReadUInt32());
         WbctChunkOffset             = Endianness.Swap(reader.ReadUInt32());
         reader.BaseStream.Position  = WinfChunkOffset;
         if (Endianness.Swap(reader.ReadUInt32()) != 1464421958)
         {
             throw FormatExc;
         }
         int num = Endianness.Swap(reader.ReadInt32());
         SoundFiles = new List <string>(num);
         for (int i = 0; i < num; i++)
         {
             reader.BaseStream.Position = WinfChunkOffset + 8 + 4 * i;
             reader.BaseStream.Position = Endianness.Swap(reader.ReadUInt32());
             List <byte> list = new List <byte>();
             while (true)
             {
                 byte b = reader.ReadByte();
                 if (b == 0)
                 {
                     break;
                 }
                 list.Add(b);
             }
             SoundFiles.Add(Encoding.ASCII.GetString(list.ToArray()));
         }
         Samples = new Dictionary <short, SampleLocation>();
         reader.BaseStream.Position = WbctChunkOffset;
         if (Endianness.Swap(reader.ReadUInt32()) != 1463960404)
         {
             throw FormatExc;
         }
         reader.BaseStream.Position += 4L;
         if (Endianness.Swap(reader.ReadUInt32()) != SoundFiles.Count)
         {
             throw FormatExc;
         }
         uint num2 = 0u;
         while (true)
         {
             if (num2 >= (uint)SoundFiles.Count)
             {
                 return;
             }
             reader.BaseStream.Position = WbctChunkOffset + 12 + 4 * num2;
             reader.BaseStream.Position = Endianness.Swap(reader.ReadUInt32());
             if (Endianness.Swap(reader.ReadUInt32()) != 1396919877)
             {
                 throw FormatExc;
             }
             reader.BaseStream.Position += 8L;
             reader.BaseStream.Position  = Endianness.Swap(reader.ReadUInt32());
             if (Endianness.Swap(reader.ReadUInt32()) != 1127040070)
             {
                 break;
             }
             uint num3 = Endianness.Swap(reader.ReadUInt32());
             uint num4 = (uint)reader.BaseStream.Position;
             for (int j = 0; j < num3; j++)
             {
                 reader.BaseStream.Position = num4 + 4 * j;
                 reader.BaseStream.Position = Endianness.Swap(reader.ReadUInt32());
                 int   wsys = Endianness.Swap(reader.ReadInt16());
                 short key  = Endianness.Swap(reader.ReadInt16());
                 if (!Samples.ContainsKey(key))
                 {
                     Samples.Add(key, new SampleLocation
                     {
                         Index = j,
                         Wsys  = wsys
                     });
                 }
             }
             num2++;
         }
         throw FormatExc;
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
Beispiel #8
0
        public Bms(Stream stream)
        {
            try
            {
                reader = new BinaryReader(stream);
                int        num  = 0;
                List <int> list = new List <int>();
                MetaTrack = new List <Event>();
                byte b = byte.MaxValue;
                do
                {
                    b = reader.ReadByte();
                    switch (b)
                    {
                    case 193:
                        if (num == 0)
                        {
                            num = Endianness.Swap(reader.ReadInt32());
                        }
                        else
                        {
                            reader.BaseStream.Position += 4L;
                        }
                        break;

                    case 216:
                    {
                        byte b2 = reader.ReadByte();
                        if (b2 == 98)
                        {
                            MetaTrack.Add(new TimeResolutionEvent(Endianness.Swap(reader.ReadInt16())));
                        }
                        else
                        {
                            reader.BaseStream.Position += 2L;
                        }
                        break;
                    }

                    case 224:
                        MetaTrack.Add(new TempoEvent(Endianness.Swap(reader.ReadInt16())));
                        break;

                    case 240:
                    {
                        int num4 = 1;
                        while (reader.ReadByte() >= 128)
                        {
                            num4++;
                        }
                        reader.BaseStream.Position -= num4;
                        byte[] data = reader.ReadBytes(num4);
                        MetaTrack.Add(new DelayEvent(GetLength(data)));
                        break;
                    }

                    case 199:
                    {
                        byte[] array3 = new List <byte>(4)
                        {
                            0,
                            reader.ReadByte(),
                            reader.ReadByte(),
                            reader.ReadByte()
                        }.ToArray();
                        Array.Reverse(array3);
                        BitConverter.ToInt32(array3, 0);
                        break;
                    }

                    case 253:
                    {
                        List <byte> list2 = new List <byte>();
                        while (true)
                        {
                            byte b3 = reader.ReadByte();
                            if (b3 == 0)
                            {
                                break;
                            }
                            list2.Add(b3);
                        }
                        new ASCIIEncoding();
                        break;
                    }

                    case 195:
                    {
                        byte[] array2 = new List <byte>(4)
                        {
                            0,
                            reader.ReadByte(),
                            reader.ReadByte(),
                            reader.ReadByte()
                        }.ToArray();
                        Array.Reverse(array2);
                        int num3 = BitConverter.ToInt32(array2, 0);
                        list.Add((int)reader.BaseStream.Position);
                        reader.BaseStream.Position = num3;
                        break;
                    }

                    case 196:
                    {
                        reader.ReadByte();
                        byte[] array = new List <byte>(4)
                        {
                            0,
                            reader.ReadByte(),
                            reader.ReadByte(),
                            reader.ReadByte()
                        }.ToArray();
                        Array.Reverse(array);
                        int num2 = BitConverter.ToInt32(array, 0);
                        list.Add((int)reader.BaseStream.Position);
                        reader.BaseStream.Position = num2;
                        break;
                    }

                    case 197:
                        if (list.Count > 0)
                        {
                            reader.BaseStream.Position = list[list.Count - 1];
                            list.RemoveAt(list.Count - 1);
                        }
                        break;

                    case byte.MaxValue:
                        MetaTrack.Add(new TerminateEvent());
                        break;

                    case 194:
                        reader.BaseStream.Position++;
                        break;

                    case 184:
                    case 208:
                    case 209:
                    case 213:
                    case 249:
                        reader.BaseStream.Position += 2L;
                        break;

                    case 217:
                        reader.BaseStream.Position += 3L;
                        break;

                    case 200:
                    case 218:
                        reader.BaseStream.Position += 4L;
                        break;
                    }
                }while (b != byte.MaxValue);
                reader.BaseStream.Position = num;
                TrackList = new List <Event>();
                Tracks    = new List <Track>();
                b         = byte.MaxValue;
                do
                {
                    b = reader.ReadByte();
                    switch (b)
                    {
                    case 193:
                    {
                        byte   trackNumber = reader.ReadByte();
                        byte[] array5      = new List <byte>(4)
                        {
                            0,
                            reader.ReadByte(),
                            reader.ReadByte(),
                            reader.ReadByte()
                        }.ToArray();
                        Array.Reverse(array5);
                        int offset2 = BitConverter.ToInt32(array5, 0);
                        Tracks.Add(new Track(trackNumber, offset2));
                        break;
                    }

                    case 240:
                    {
                        int num5 = 1;
                        while (reader.ReadByte() >= 128)
                        {
                            num5++;
                        }
                        reader.BaseStream.Position -= num5;
                        byte[] data2 = reader.ReadBytes(num5);
                        TrackList.Add(new DelayEvent(GetLength(data2)));
                        break;
                    }

                    case 199:
                    {
                        byte[] array4 = new List <byte>(4)
                        {
                            0,
                            reader.ReadByte(),
                            reader.ReadByte(),
                            reader.ReadByte()
                        }.ToArray();
                        Array.Reverse(array4);
                        int offset = BitConverter.ToInt32(array4, 0);
                        TrackList.Add(new LoopEvent(offset));
                        break;
                    }
                    }
                }while (b != byte.MaxValue);
                foreach (Track track in Tracks)
                {
                    reader.BaseStream.Position = track.Offset;
                    b = byte.MaxValue;
                    do
                    {
                        b = reader.ReadByte();
                        if (b <= 128)
                        {
                            track.Data.Add(new NoteOnEvent(b, reader.ReadByte(), reader.ReadByte()));
                        }
                        else if (b > 128 && b <= 143)
                        {
                            track.Data.Add(new NoteOffEvent((byte)(b & 0xF)));
                        }
                        else
                        {
                            switch (b)
                            {
                            case 240:
                            {
                                int num7 = 1;
                                while (reader.ReadByte() >= 128)
                                {
                                    num7++;
                                }
                                reader.BaseStream.Position -= num7;
                                byte[] data3 = reader.ReadBytes(num7);
                                track.Data.Add(new DelayEvent(GetLength(data3)));
                                break;
                            }

                            case 226:
                                track.Data.Add(new BankSelectEvent(reader.ReadByte()));
                                break;

                            case 227:
                                track.Data.Add(new InstrumentChangeEvent(reader.ReadByte()));
                                break;

                            case 184:
                                switch (reader.ReadByte())
                                {
                                case 0:
                                    track.Data.Add(new VolumeEvent(reader.ReadByte()));
                                    break;

                                case 2:
                                    track.Data.Add(new ReverbEvent(reader.ReadByte()));
                                    break;

                                case 3:
                                    track.Data.Add(new PanEvent(reader.ReadByte()));
                                    break;

                                default:
                                    reader.BaseStream.Position++;
                                    break;
                                }
                                break;

                            case 195:
                            {
                                byte[] array6 = new List <byte>(4)
                                {
                                    0,
                                    reader.ReadByte(),
                                    reader.ReadByte(),
                                    reader.ReadByte()
                                }.ToArray();
                                Array.Reverse(array6);
                                int num6 = BitConverter.ToInt32(array6, 0);
                                list.Add((int)reader.BaseStream.Position);
                                reader.BaseStream.Position = num6;
                                break;
                            }

                            case 196:
                            {
                                reader.ReadByte();
                                byte[] array8 = new List <byte>(4)
                                {
                                    0,
                                    reader.ReadByte(),
                                    reader.ReadByte(),
                                    reader.ReadByte()
                                }.ToArray();
                                Array.Reverse(array8);
                                int num8 = BitConverter.ToInt32(array8, 0);
                                list.Add((int)reader.BaseStream.Position);
                                reader.BaseStream.Position = num8;
                                break;
                            }

                            case 199:
                            {
                                byte[] array7 = new List <byte>(4)
                                {
                                    0,
                                    reader.ReadByte(),
                                    reader.ReadByte(),
                                    reader.ReadByte()
                                }.ToArray();
                                Array.Reverse(array7);
                                BitConverter.ToInt32(array7, 0);
                                break;
                            }

                            case 197:
                                if (list.Count > 0)
                                {
                                    reader.BaseStream.Position = list[list.Count - 1];
                                    list.RemoveAt(list.Count - 1);
                                }
                                break;

                            case 185:
                            {
                                byte b5 = reader.ReadByte();
                                if (b5 == 1)
                                {
                                    track.Data.Add(new PitchEvent(Endianness.Swap(reader.ReadInt16())));
                                }
                                else
                                {
                                    reader.BaseStream.Position += 2L;
                                }
                                break;
                            }

                            case 216:
                            {
                                byte b4 = reader.ReadByte();
                                if (b4 == 110)
                                {
                                    track.Data.Add(new VibratoEvent(Endianness.Swap(reader.ReadUInt16())));
                                }
                                else
                                {
                                    reader.BaseStream.Position += 2L;
                                }
                                break;
                            }

                            case byte.MaxValue:
                                track.Data.Add(new TerminateEvent());
                                break;

                            case 249:
                                reader.BaseStream.Position += 2L;
                                break;
                            }
                        }
                    }while (b != byte.MaxValue);
                }
                reader.BaseStream.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                stream.Close();
            }
        }