private SidTuneBase getFromBuffer(byte[] buffer, UInt32 bufferLen)
        {
            if (buffer == null || bufferLen == 0)
            {
                throw new loadError(ERR_EMPTY);
            }

            if (bufferLen > MAX_FILELEN)
            {
                throw new loadError(ERR_FILE_TOO_LONG);
            }

            byte[] buf1 = buffer;//, buffer +bufferLen);

            // Here test for the possible single file formats.
            SidTuneBase s = PSID.load(ref buf1);

            if (s == null)
            {
                s = (new MUS()).load(buf1.ToArray(), true);
            }
            if (s == null)
            {
                throw new loadError(ERR_UNRECOGNIZED_FORMAT);
            }

            List <byte> lstBuf1 = new List <byte>(buf1);

            s.acceptSidTune("-", "-", ref lstBuf1, false);
            return(s);
        }
        // Initializing the object based upon what we find in the specified file.

        private SidTuneBase getFromFiles(string fileName, string[] fileNameExtensions, bool separatorIsSlash)
        {
            List <byte> fileBuf1 = new List <byte>();

            loadFile(fileName, ref fileBuf1);

            // File loaded. Now check if it is in a valid single-file-format.
            byte[]      aryFileBuf1 = fileBuf1.ToArray();
            SidTuneBase s           = PSID.load(ref aryFileBuf1);

            fileBuf1 = new List <byte>(aryFileBuf1);
            if (s == null)
            {
                // Try some native C64 file formats
                s = (new MUS()).load(fileBuf1.ToArray(), true);
                if (s != null)
                {
                    // Try to find second file.
                    string fileName2;
                    int    n = 0;
                    while (fileNameExtensions[n] != null)
                    {
                        createNewFileName(out fileName2, Encoding.ASCII.GetBytes(fileName), Encoding.ASCII.GetBytes(fileNameExtensions[n]));
                        // 1st data file was loaded into "fileBuf1",
                        // so we load the 2nd one into "fileBuf2".
                        // Do not load the first file again if names are equal.
                        if (fileName.Substring(0, fileName2.Length) != fileName2.Substring(0, fileName2.Length))
                        {
                            try
                            {
                                List <byte> fileBuf2 = new List <byte>();

                                loadFile(fileName2, ref fileBuf2);
                                // Check if tunes in wrong order and therefore swap them here
                                if (fileNameExtensions[n] == ".mus")
                                {
                                    SidTuneBase s2 = (new MUS()).load(fileBuf2.ToArray(), fileBuf1.ToArray(), 0, true);
                                    if (s2 != null)
                                    {
                                        s2.acceptSidTune(fileName2, fileName, ref fileBuf2, separatorIsSlash);
                                        return(s2);
                                    }
                                }
                                else
                                {
                                    SidTuneBase s2 = (new MUS()).load(fileBuf1.ToArray(), true);
                                    if (s2 != null)
                                    {
                                        s2.acceptSidTune(fileName, fileName2, ref fileBuf1, separatorIsSlash);
                                        return(s2);
                                    }
                                }
                                // The first tune loaded ok, so ignore errors on the
                                // second tune, may find an ok one later
                            }
                            catch (loadError)
                            {
                            }
                        }
                        n++;
                    }
                }
            }
            if (s == null)
            {
                s = p00.load(fileName, aryFileBuf1);
            }
            if (s == null)
            {
                s = prg.load(fileName, aryFileBuf1);
            }
            if (s == null)
            {
                throw new loadError(ERR_UNRECOGNIZED_FORMAT);
            }

            s.acceptSidTune(fileName, null, ref fileBuf1, separatorIsSlash);
            return(s);
        }
 private SidTuneBase opeEquel(ref SidTuneBase a)
 {
     return(null);
 }
        //protected SidTuneBase() { }

        /**
         * Does not affect status of object, and therefore can be used
         * to load files. Error string is put into info.statusString, though.
         *
         * @param fileName
         * @param bufferRef
         * @throw loadError
         */
        //protected void loadFile(string fileName, ref List<byte> bufferRef) { }

        /**
         * Convert 32-bit PSID-style speed word to internal tables.
         *
         * @param speed
         * @param clock
         */
        //protected void convertOldStyleSpeedToTables(UInt32 speed, Int64 clock = CLOCK_PAL) { }

        /**
         * Check if compatibility constraints are fulfilled.
         */
        //protected bool checkCompatibility() { return false; }

        /**
         * Check for valid relocation information.
         */
        //protected bool checkRelocInfo() { return false; }

        /**
         * Common address resolution procedure.
         *
         * @param c64data
         */
        //protected void resolveAddrs(byte[] c64data) { }

        /**
         * Cache the data of a single-file or two-file sidtune and its
         * corresponding file names.
         *
         * @param dataFileName
         * @param infoFileName
         * @param buf
         * @param isSlashedFileName If your opendir() and readdir()->d_name return path names
         * that contain the forward slash (/) as file separator, but
         * your operating system uses a different character, there are
         * extra functions that can deal with this special case. Set
         * separatorIsSlash to true if you like path names to be split
         * correctly.
         * You do not need these extra functions if your systems file
         * separator is the forward slash.
         * @throw loadError
         */
        //protected virtual void acceptSidTune(string dataFileName, string infoFileName, ref List<byte> buf, bool isSlashedFileName) { }

        /**
         * Petscii to Ascii converter.
         */
        //protected string petsciiToAscii(ref SmartPtr_sidtt<byte> spPet) { return null; }

        // ---------------------------------------------------------------

        //#if !defined(SIDTUNE_NO_STDIN_LOADER)
        //private SidTuneBase getFromStdIn() { return null; }
        //#endif
        //private SidTuneBase getFromFiles(string name, string[] fileNameExtensions, bool separatorIsSlash) { return null; }

        /**
         * Try to retrieve single-file sidtune from specified buffer.
         */
        //private SidTuneBase getFromBuffer(byte[] buffer, UInt32 bufferLen) { return null; }

        /**
         * Get new file name with specified extension.
         *
         * @param destString destinaton string
         * @param sourceName original file name
         * @param sourceExt new extension
         */
        //private void createNewFileName(ref string destString, byte[] sourceName, byte[] sourceExt) { }

        // prevent copying
        public SidTuneBase(SidTuneBase a)
        {
        }