// Process a RIFF list element (list sub elements)
        public static void ProcessList(RiffParser rp, int FourCC, int length)
        {
            string type = RiffParser.FromFourCC(FourCC);

            Console.WriteLine("Found list element of type \"" + type + "\" and length " + length.ToString());

            // Define the processing delegates
            RiffParser.ProcessChunkElement pc = new RiffParser.ProcessChunkElement(ProcessChunk);
            RiffParser.ProcessListElement  pl = new RiffParser.ProcessListElement(ProcessList);

            // Read all the elements in the current list
            try {
                while (length > 0)
                {
                    // Prefix each line with the type of the current list
                    Console.Write(type + " (" + length.ToString() + "): ");
                    // Get the next element (if there is one)
                    if (false == rp.ReadElement(ref length, pc, pl))
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Problem: " + ex.ToString());
            }
        }
        // Process a RIFF chunk element (skip the data)
        public static void ProcessChunk(RiffParser rp, int FourCC, int length, int paddedLength)
        {
            string type = RiffParser.FromFourCC(FourCC);

            Console.WriteLine("Found chunk element of type \"" + type + "\" and length " + length.ToString());

            // Skip data and update bytesleft
            rp.SkipData(paddedLength);
        }
        // Parse a RIFF file
        static void Main(string[] args)
        {
            // Create a parser instance
            RiffParser rp = new RiffParser();

            try
            {
                string filename = @"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Graphics\videos\BLUR24.avi";
                //string filename = @"C:\WINNT\Media\Chimes.wav"
                if (0 != args.Length)
                {
                    filename = args[0];
                }

                // Specify a file to open
                rp.OpenFile(filename);

                // If we got here - the file is valid. Output information about the file
                Console.WriteLine("File " + rp.ShortName + " is a \"" + RiffParser.FromFourCC(rp.FileRIFF)
                                  + "\" with a specific type of \"" + RiffParser.FromFourCC(rp.FileType) + "\"");

                // Store the size to loop on the elements
                int size = rp.DataSize;

                // Define the processing delegates
                RiffParser.ProcessChunkElement pc = new RiffParser.ProcessChunkElement(ProcessChunk);
                RiffParser.ProcessListElement  pl = new RiffParser.ProcessListElement(ProcessList);

                // Read all top level elements and chunks
                while (size > 0)
                {
                    // Prefix the line with the current top level type
                    Console.Write(RiffParser.FromFourCC(rp.FileType) + " (" + size.ToString() + "): ");
                    // Get the next element (if there is one)
                    if (false == rp.ReadElement(ref size, pc, pl))
                    {
                        break;
                    }
                }
                // Close the stream
                rp.CloseFile();
                Console.WriteLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("-----------------");
                Console.WriteLine("Problem: " + ex.ToString());
            }
            Console.WriteLine("\n\rDone. Press 'Enter' to exit.");
            Console.ReadLine();
        }
        static void Main(string[] args)
        {
            try
            {
                var    allPrograms = new List <Program>();
                string path        = @"D:\Matt - AMG\Kick Ass Brass for Steve\All Programs\";
                string filename;
                var    files = Directory.EnumerateFiles(path);

                foreach (string currentFile in files)
                {
                    Program program = new Program();
                    filename     = currentFile.Substring(path.Length);
                    program.Name = filename.Replace(".akp", "");
                    string     filePath = $"{path}\\{filename}";
                    RiffParser rp       = new RiffParser(program);

                    rp.OpenFile(filePath);

                    // If we got here - the file is valid. Output information about the file
                    Console.WriteLine("File " + rp.ShortName + " is a \"" + rp.FromFourCc(rp.FileRiff)
                                      + "\" with a specific type of \"" + rp.FromFourCc(rp.FileType) + "\"");

                    // Store the size to loop on the elements
                    long size = rp.FileSize - 8;

                    // Read all top level elements and chunks
                    while (size > 0)
                    {
                        // Prefix the line with the current top level type
                        //Console.Write(rp.FromFourCc(rp.FileType) + " (" + size.ToString() + "): ");

                        if (false == rp.ReadElement(ref size))
                        {
                            break;
                        }
                    }
                    rp.CloseFile();
                    allPrograms.Add(program);
                }

                var data = JsonConvert.SerializeObject(allPrograms);
                Console.WriteLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Problem: " + ex.ToString());
            }
            Console.WriteLine("\n\rDone. Press 'Enter' to exit.");
            Console.ReadLine();
        }