public static HydraPhdr Load(IReadable reader)
        {
            HydraPhdr phdr = new HydraPhdr();

            phdr.PresetName   = reader.Read8BitStringLength(20);
            phdr.Preset       = reader.ReadUInt16LE();
            phdr.Bank         = reader.ReadUInt16LE();
            phdr.PresetBagNdx = reader.ReadUInt16LE();
            phdr.Library      = reader.ReadUInt32LE();
            phdr.Genre        = reader.ReadUInt32LE();
            phdr.Morphology   = reader.ReadUInt32LE();

            return(phdr);
        }
        public static HydraShdr Load(IReadable reader)
        {
            var shdr = new HydraShdr();

            shdr.SampleName      = reader.Read8BitStringLength(20);
            shdr.Start           = reader.ReadUInt32LE();
            shdr.End             = reader.ReadUInt32LE();
            shdr.StartLoop       = reader.ReadUInt32LE();
            shdr.EndLoop         = reader.ReadUInt32LE();
            shdr.SampleRate      = reader.ReadUInt32LE();
            shdr.OriginalPitch   = (byte)reader.ReadByte();
            shdr.PitchCorrection = reader.ReadSignedByte();
            shdr.SampleLink      = reader.ReadUInt16LE();
            shdr.SampleType      = reader.ReadUInt16LE();
            return(shdr);
        }
        public static bool Load(RiffChunk parent, RiffChunk chunk, IReadable stream)
        {
            if (parent != null && RiffChunk.HeaderSize > parent.Size)
            {
                return(false);
            }

            if (stream.Position + HeaderSize >= stream.Length)
            {
                return(false);
            }

            chunk.Id = stream.Read8BitStringLength(4);
            if (chunk.Id[0] <= ' ' || chunk.Id[0] >= 'z')
            {
                return(false);
            }
            chunk.Size = stream.ReadUInt32LE();

            if (parent != null && HeaderSize + chunk.Size > parent.Size)
            {
                return(false);
            }

            if (parent != null)
            {
                parent.Size -= HeaderSize + chunk.Size;
            }

            var isRiff = chunk.Id == "RIFF";
            var isList = chunk.Id == "LIST";

            if (isRiff && parent != null)
            {
                // not allowed
                return(false);
            }

            if (!isRiff && !isList)
            {
                // custom type without sub type
                return(true);
            }

            // for lists unwrap the list type
            chunk.Id = stream.Read8BitStringLength(4);
            if (chunk.Id[0] <= ' ' || chunk.Id[0] >= 'z')
            {
                return(false);
            }
            chunk.Size -= 4;

            return(true);
        }