Exemplo n.º 1
0
        // ---------------------------------------------------------------------------
        //	リズム音を読みこむ
        //
        public bool LoadRhythmSample(Func <string, Stream> appendFileReaderCallback)
        {
            string[] rhythmname = new string[6]
            {
                "BD", "SD", "TOP", "HH", "TOM", "RIM",
            };

            int i;

            for (i = 0; i < 6; i++)
            {
                rhythm[i].pos = ~(uint)0;
            }

            for (i = 0; i < 6; i++)
            {
                byte[] buf     = null;
                int    filePtr = 0;

                uint   fsize;
                string fileName = string.Format("2608_{0}.WAV", rhythmname[i]);

                using (Stream st = appendFileReaderCallback?.Invoke(fileName))
                {
                    buf = ReadAllBytes(st);
                }

                if (buf == null)
                {
                    if (i != 5)
                    {
                        break;
                    }
                    string fileNameRym = "2608_RYM.WAV";
                    using (Stream st = appendFileReaderCallback?.Invoke(fileNameRym))
                    {
                        buf = ReadAllBytes(st);
                    }
                }

                whdr whdr = new whdr();

                filePtr = 0x10;
                byte[] bufWhdr = new byte[4 + 2 + 2 + 4 + 4 + 2 + 2 + 2];
                for (int ind = 0; ind < bufWhdr.Length; ind++)
                {
                    bufWhdr[ind] = buf[filePtr + ind];
                }

                whdr.chunksize = (uint)(bufWhdr[0] + bufWhdr[1] * 0x100 + bufWhdr[2] * 0x10000 + bufWhdr[3] * 0x10000);
                whdr.tag       = (uint)(bufWhdr[4] + bufWhdr[5] * 0x100);
                whdr.nch       = (uint)(bufWhdr[6] + bufWhdr[7] * 0x100);
                whdr.rate      = (uint)(bufWhdr[8] + bufWhdr[9] * 0x100 + bufWhdr[10] * 0x10000 + bufWhdr[11] * 0x10000);
                whdr.avgbytes  = (uint)(bufWhdr[12] + bufWhdr[13] * 0x100 + bufWhdr[14] * 0x10000 + bufWhdr[15] * 0x10000);
                whdr.align     = (uint)(bufWhdr[16] + bufWhdr[17] * 0x100);
                whdr.bps       = (uint)(bufWhdr[18] + bufWhdr[19] * 0x100);
                whdr.size      = (uint)(bufWhdr[20] + bufWhdr[21] * 0x100);

                byte[] subchunkname = new byte[4];
                fsize = 4 + whdr.chunksize;
                do
                {
                    filePtr += (int)fsize;
                    for (int ind = 0; ind < 4; ind++)
                    {
                        subchunkname[ind] = buf[filePtr++];
                    }
                    for (int ind = 0; ind < 4; ind++)
                    {
                        bufWhdr[ind] = buf[filePtr++];
                    }
                    fsize = (uint)(bufWhdr[0] + bufWhdr[1] * 0x100 + bufWhdr[2] * 0x10000 + bufWhdr[3] * 0x10000);
                } while ('d' != subchunkname[0] && 'a' != subchunkname[1] && 't' != subchunkname[2] && 'a' != subchunkname[3]);

                fsize /= 2;
                if (fsize >= 0x100000 || whdr.tag != 1 || whdr.nch != 1)
                {
                    break;
                }
                fsize = (uint)Math.Max(fsize, (1 << 31) / 1024);

                rhythm[i].sample = null;
                rhythm[i].sample = new int[fsize];
                if (rhythm[i].sample == null)
                {
                    break;
                }
                byte[] bufSample = new byte[fsize * 2];
                for (int ind = 0; ind < (fsize * 2); ind++)
                {
                    bufSample[ind] = buf[filePtr++];
                }
                for (int si = 0; si < fsize; si++)
                {
                    rhythm[i].sample[si] = (short)(bufSample[si * 2] + bufSample[si * 2 + 1] * 0x100);
                }

                rhythm[i].rate = whdr.rate;
                rhythm[i].step = rhythm[i].rate * 1024 / rate;
                rhythm[i].pos  = rhythm[i].size = fsize * 1024;
            }
            if (i != 6)
            {
                for (i = 0; i < 6; i++)
                {
                    rhythm[i].sample = null;
                }
                return(false);
            }
            return(true);
        }
Exemplo n.º 2
0
        // ---------------------------------------------------------------------------
        //	リズム音を読みこむ
        //
        public bool LoadRhythmSample(string path)
        {
            string[] rhythmname = new string[6]
            {
                "BD", "SD", "TOP", "HH", "TOM", "RIM",
            };

            int i;

            for (i = 0; i < 6; i++)
            {
                rhythm[i].pos = ~(uint)0;
            }

            for (i = 0; i < 6; i++)
            {
                byte[] buf     = null;
                int    filePtr = 0;
                uint   fsize;
                string fileName = "";
                if (path != null && path != "")
                {
                    fileName = path;
                }
                fileName = fileName + "2608_";
                fileName = fileName + rhythmname[i];
                fileName = fileName + ".WAV";

                try
                {
                    buf = System.IO.File.ReadAllBytes(fileName);
                }
                catch
                {
                    buf = null;
                }

                if (buf == null)
                {
                    if (i != 5)
                    {
                        break;
                    }
                    if (path != null && path != "")
                    {
                        fileName = path;
                    }
                    fileName = fileName + "2608_RYM.WAV";
                    try
                    {
                        buf = System.IO.File.ReadAllBytes(fileName);
                    }
                    catch
                    {
                        break;
                    }
                }

                whdr whdr = new whdr();

                filePtr = 0x10;
                byte[] bufWhdr = new byte[4 + 2 + 2 + 4 + 4 + 2 + 2 + 2];
                for (int ind = 0; ind < bufWhdr.Length; ind++)
                {
                    bufWhdr[ind] = buf[filePtr + ind];
                }

                whdr.chunksize = (uint)(bufWhdr[0] + bufWhdr[1] * 0x100 + bufWhdr[2] * 0x10000 + bufWhdr[3] * 0x10000);
                whdr.tag       = (uint)(bufWhdr[4] + bufWhdr[5] * 0x100);
                whdr.nch       = (uint)(bufWhdr[6] + bufWhdr[7] * 0x100);
                whdr.rate      = (uint)(bufWhdr[8] + bufWhdr[9] * 0x100 + bufWhdr[10] * 0x10000 + bufWhdr[11] * 0x10000);
                whdr.avgbytes  = (uint)(bufWhdr[12] + bufWhdr[13] * 0x100 + bufWhdr[14] * 0x10000 + bufWhdr[15] * 0x10000);
                whdr.align     = (uint)(bufWhdr[16] + bufWhdr[17] * 0x100);
                whdr.bps       = (uint)(bufWhdr[18] + bufWhdr[19] * 0x100);
                whdr.size      = (uint)(bufWhdr[20] + bufWhdr[21] * 0x100);

                byte[] subchunkname = new byte[4];
                fsize = 4 + whdr.chunksize;
                do
                {
                    filePtr += (int)fsize;
                    for (int ind = 0; ind < 4; ind++)
                    {
                        subchunkname[ind] = buf[filePtr++];
                    }
                    for (int ind = 0; ind < 4; ind++)
                    {
                        bufWhdr[ind] = buf[filePtr++];
                    }
                    fsize = (uint)(bufWhdr[0] + bufWhdr[1] * 0x100 + bufWhdr[2] * 0x10000 + bufWhdr[3] * 0x10000);
                } while ('d' != subchunkname[0] && 'a' != subchunkname[1] && 't' != subchunkname[2] && 'a' != subchunkname[3]);

                fsize /= 2;
                if (fsize >= 0x100000 || whdr.tag != 1 || whdr.nch != 1)
                {
                    break;
                }
                fsize = (uint)Math.Max(fsize, (1 << 31) / 1024);

                rhythm[i].sample = null;
                rhythm[i].sample = new int[fsize];
                if (rhythm[i].sample == null)
                {
                    break;
                }
                byte[] bufSample = new byte[fsize * 2];
                for (int ind = 0; ind < (fsize * 2); ind++)
                {
                    bufSample[ind] = buf[filePtr++];
                }
                for (int si = 0; si < fsize; si++)
                {
                    rhythm[i].sample[si] = (short)(bufSample[si * 2] + bufSample[si * 2 + 1] * 0x100);
                }

                rhythm[i].rate = whdr.rate;
                rhythm[i].step = rhythm[i].rate * 1024 / rate;
                rhythm[i].pos  = rhythm[i].size = fsize * 1024;
            }
            if (i != 6)
            {
                for (i = 0; i < 6; i++)
                {
                    rhythm[i].sample = null;
                }
                return(false);
            }
            return(true);
        }