示例#1
0
        private static string FormatChunk(HeaderChunk chunk)
        {
            var chunkDivision = "";
            var div           = chunk.TickDivision;

            switch ((div & 0x8000) >> 15)
            {
            case 0:
                chunkDivision += (div & 0x7FFF) + " ticks per quarter note\n\n";
                break;

            case 1:
                chunkDivision += (div & 0x7F00) +
                                 " frames per second, " + (div & 0xFF) +
                                 " ticks per frame\n\n";
                break;

            default:
                chunkDivision += "";
                break;
            }
            return("Header Chunk. There are " +
                   chunk.TrackCount + "Track Chunks\n" +
                   chunkDivision);
        }
示例#2
0
        public static MidiData Parse(FileStream inputFileStream)
        {
            var inputBinaryReader = new BinaryReader(inputFileStream);


            // Order of ReadBytes() ist critical!
            var headerChunkId   = StringEncoder.GetString(inputBinaryReader.ReadBytes(4));
            var headerChunkSize = BitConverter.ToInt32(inputBinaryReader.ReadBytes(4).Reverse().ToArray(), 0);
            var headerChunkData = inputBinaryReader.ReadBytes(headerChunkSize);

            var formatType     = BitConverter.ToUInt16(headerChunkData.Take(2).Reverse().ToArray(), 0);
            var numberOfTracks = BitConverter.ToUInt16(headerChunkData.Skip(2).Take(2).Reverse().ToArray(), 0);
            var timeDivision   = BitConverter.ToUInt16(headerChunkData.Skip(4).Take(2).Reverse().ToArray(), 0);

            var headerChunk = new HeaderChunk(formatType, timeDivision)
            {
                ChunkId = headerChunkId
            };

            var tracks =
                Enumerable.Range(0, numberOfTracks).Select(trackNumber =>
            {
                // ReSharper disable once UnusedVariable
                var trackChunkId   = StringEncoder.GetString(inputBinaryReader.ReadBytes(4));
                var trackChunkSize = BitConverter.ToInt32(inputBinaryReader.ReadBytes(4).Reverse().ToArray(), 0);
                var trackChunkData = inputBinaryReader.ReadBytes(trackChunkSize);

                return(Tuple.Create(trackChunkSize, trackChunkData));
            }).ToList()
                .Select(rawTrack => new TrackChunk(ParseEvents(rawTrack.Item2.ToList(), rawTrack.Item1))).ToList();

            return(new MidiData(headerChunk, tracks));
        }
示例#3
0
        //        private int width;
        //        private int height;

        public void Write(int width1, int height1, Stream outputStream, Color[] colors)
        {
            width  = width1;
            height = height1;

            colorData = colors;

            //        switch (texture2D.Format)
            //        {
            //          case SurfaceFormat.Color:
            //        texture2D.GetData(colorData);
            //
            //        GetColorData(texture2D);


            outputStream.Write(HeaderChunk.PngSignature, 0, HeaderChunk.PngSignature.Length);
            var buffer1 = new HeaderChunk
            {
                Width             = (uint)width1,
                Height            = (uint)height1,
                BitDepth          = 8,
                ColorType         = colorType,
                CompressionMethod = 0,
                FilterMethod      = 0,
                InterlaceMethod   = 0
            }.Encode();

            outputStream.Write(buffer1, 0, buffer1.Length);
            var buffer2      = EncodePixelData();
            var memoryStream = new MemoryStream();

            try
            {
                using (var zlibStream = new ZlibStream(new MemoryStream(buffer2), CompressionMode.Compress))
                {
                    zlibStream.CopyTo(memoryStream);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("An error occurred during DEFLATE compression.", ex);
            }

            var dataChunk = new DataChunk
            {
                Data = memoryStream.ToArray()
            };
            var buffer3 = dataChunk.Encode();

            outputStream.Write(buffer3, 0, buffer3.Length);
            var buffer4 = new EndChunk().Encode();

            outputStream.Write(buffer4, 0, buffer4.Length);
        }
        public void ValidMIDIHeaderParsed()
        {
            uint   chunkId      = 0x4D_54_68_64;
            uint   chunkSize    = 0x00_00_00_06;
            ushort formatType   = 0x00_00;
            ushort trackCount   = 0x00_01;
            ushort timeDivision = 0x00_80;

            byte[] headerBytes = ToMidiHeaderBytes(chunkId, chunkSize, formatType, trackCount, timeDivision);
            (ReportMessage report, HeaderChunk parsed) = HeaderChunk.FromBytes(headerBytes);

            Assert.IsFalse(report.IsError, "Header chunk parsing error: '{0}'", report.Message);
            Assert.AreEqual(new HeaderChunk(0, 1, 128), parsed);
        }
示例#5
0
        private void ProcessChunk(byte[] chunkBytes)
        {
            var chunkTypeString = PngChunk.GetChunkTypeString(chunkBytes.Skip(4).Take(4).ToArray());

            if (!(chunkTypeString == "IHDR"))
            {
                if (!(chunkTypeString == "PLTE"))
                {
                    if (!(chunkTypeString == "tRNS"))
                    {
                        if (!(chunkTypeString == "IDAT"))
                        {
                            return;
                        }

                        var dataChunk = new DataChunk();
                        dataChunk.Decode(chunkBytes);
                        dataChunks.Add(dataChunk);
                    }
                    else
                    {
                        var transparencyChunk = new TransparencyChunk();
                        transparencyChunk.Decode(chunkBytes);
                        palette.AddAlphaToColors(transparencyChunk.PaletteTransparencies);
                    }
                }
                else
                {
                    var paletteChunk = new PaletteChunk();
                    paletteChunk.Decode(chunkBytes);
                    palette = paletteChunk.Palette;
                    chunks.Add(paletteChunk);
                }
            }
            else
            {
                var headerChunk = new HeaderChunk();
                headerChunk.Decode(chunkBytes);
                width  = (int)headerChunk.Width;
                height = (int)headerChunk.Height;

                bitsPerSample = headerChunk.BitDepth;
                colorType     = headerChunk.ColorType;
                chunks.Add(headerChunk);
            }
        }
示例#6
0
 public MidiData(HeaderChunk header, List <TrackChunk> tracks)
 {
     Header = header;
     Tracks = tracks;
 }