// --------------------------------------------------------------------------- // リズム音を読みこむ // 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); }
// --------------------------------------------------------------------------- // リズム音を読みこむ // 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); }